umlimator 0.14.0 → 0.16.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.
- package/README.md +25 -7
- package/lib/umlimator-element.js +5 -2
- package/lib/umlimator-theme.css +6 -2
- package/lib/umlimator.d.ts +35 -4
- package/lib/umlimator.js +572 -134
- package/lib/umlimator.schema.json +73 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -22,6 +22,11 @@ drill-down, a data pipeline, an AI agent's skills, and host pages for embedding,
|
|
|
22
22
|
straight; orthogonal lines that never run through a card, room for every label, containers kept apart, and cards with
|
|
23
23
|
no lines in a row of their own, under the view or at the bottom of their box. The same model gives the same picture.
|
|
24
24
|
- **Reading**: animated flow, neighbours lit on selection, numbered steps, tours, minimap, light and dark themes.
|
|
25
|
+
- **Card shapes**: three notations. `box` (the default) draws every card as a rounded box, as before. `c4` draws people,
|
|
26
|
+
browser apps, phones, databases, queues and files as the C4 model's tools do. `uml` draws UML 2.5's actors, nodes,
|
|
27
|
+
artifacts, packages and data stores, with UML's component icon on a box. A card's own `shape` wins in any notation.
|
|
28
|
+
The notation comes from the model, a view, `render()`, the page's toggle or the link; switching it draws the cards
|
|
29
|
+
again and lays nothing out ([`examples/notations.html`](examples/notations.html)).
|
|
25
30
|
- **Exploring**: every path between two cards, or everything a card reaches, lit on the map; a view in plain sentences
|
|
26
31
|
(`describe()`); a tour along any path the host names.
|
|
27
32
|
- **Live data**: marks over the map without touching the model (`overlay()`): flow as fast as the traffic, errors that
|
|
@@ -60,7 +65,7 @@ drill-down, a data pipeline, an AI agent's skills, and host pages for embedding,
|
|
|
60
65
|
npm install umlimator
|
|
61
66
|
```
|
|
62
67
|
|
|
63
|
-
Or from GitHub, at a tag or any commit: `"umlimator": "github:zintaen/umlimator#v0.
|
|
68
|
+
Or from GitHub, at a tag or any commit: `"umlimator": "github:zintaen/umlimator#v0.16.0"`. npm 12 refuses git
|
|
64
69
|
dependencies unless the project opts in, so that also needs `allow-git=root` in the `.npmrc` next to `package.json`.
|
|
65
70
|
|
|
66
71
|
## Embed
|
|
@@ -95,7 +100,8 @@ function MapView({ model, onSelect }) {
|
|
|
95
100
|
- `map.expand(id)` unfolds a stacked card in place and `map.collapse(id)` folds it; `layout(model, view, { expand })`
|
|
96
101
|
draws the same in Node.
|
|
97
102
|
- Colours are `--um-*` CSS variables, fonts are the host's (`--um-sans`, `--um-mono`), text is measured in that font,
|
|
98
|
-
and nothing is fetched.
|
|
103
|
+
and nothing is fetched. `--um-tint` sets how deep the cards' and the boxes' tints are: 1 by default, 0 for none, 2 for
|
|
104
|
+
twice as deep (a tint stops at 18% of its colour, so text on it keeps 4.5:1).
|
|
99
105
|
- `layout(model, viewId)` returns a view's geometry without a DOM, in Node too; `check(model, viewId)` runs the layout
|
|
100
106
|
check on it, and `validate(model)` finds dangling or repeated ids before anything is drawn. `rules(model)` lists every
|
|
101
107
|
rule the model breaks, view by view.
|
|
@@ -104,6 +110,9 @@ function MapView({ model, onSelect }) {
|
|
|
104
110
|
- `map.lens(id)` puts one of the model's lenses on the map. `critical(model, view, { from, to, by })` finds the slowest
|
|
105
111
|
or costliest path, `whatIf(model, view, { remove })` what loses its way when cards go down, and
|
|
106
112
|
`sequenceFromTrace(model, spans, { view, match })` keeps a trace as a numbered view; all three in Node too.
|
|
113
|
+
- `shapes: 'box' | 'c4' | 'uml'` draws every view in that notation, over each view's own (and the model's).
|
|
114
|
+
`map.shapes` reads the notation shown and sets another (`null`: each view's own again); the cards are drawn again from
|
|
115
|
+
the geometry they have, with the camera, selection and marks kept, and nothing is laid out.
|
|
107
116
|
- `editable: true` turns on editing gestures ([docs/editing.md](docs/editing.md); `examples/edit.html` is a working host).
|
|
108
117
|
- `diff(before, after)` returns `after` with each card and line marked added, changed or removed, what changed in words,
|
|
109
118
|
and the views that show it; `drift(model, observed)` marks the lines traffic ran on that nobody drew, and the drawn ones
|
|
@@ -145,7 +154,8 @@ the map is drawn, and stay where scripts don't run ([`examples/element.html`](ex
|
|
|
145
154
|
- **Attributes**: `view`, `minimap`, `controls="false"`, `wheel="ctrl"` (the wheel zooms only with Ctrl or ⌘, and scrolls
|
|
146
155
|
the page otherwise, as a map in a document should), `height` (a number is pixels; 480 by default, or size it in CSS)
|
|
147
156
|
and `theme` (`light` or `dark`: theme.css's palette for that map, whatever the page's). Changing one draws the map
|
|
148
|
-
again, and removing the element destroys it.
|
|
157
|
+
again, and removing the element destroys it. `shapes` (`box`, `c4` or `uml`) is the notation; changing it draws the
|
|
158
|
+
cards again in the map drawn, with nothing loaded or laid out again.
|
|
149
159
|
- **Events**: `umlimator:select`, `umlimator:open` (cancel it to stay) and `umlimator:viewchange`, the map's event as
|
|
150
160
|
`detail`; `load` once it is drawn, `error` when it can't be. `el.map` is the `render()` handle.
|
|
151
161
|
- **Colours**: theme.css, as above, or your own `--um-*` variables. The element fetches nothing but its model.
|
|
@@ -190,9 +200,11 @@ kinds such as `public`, `lane`, `script`, `hook` and `board` work too). Fields b
|
|
|
190
200
|
| node | `noSub` | the name only; the description stays in the details panel |
|
|
191
201
|
| node | `opensView`, `opensCount` | the view the card opens, which may not be loaded yet, and the ⤢ number for it |
|
|
192
202
|
| node | `owner` | who owns the card (a team): rules and lenses pick by it, and a lens can ring cards by owner |
|
|
203
|
+
| node | `shape` | the card's own shape in every notation: `box`, `person`, `browser`, `mobile`, `cylinder`, `pipe`, `document`, `hexagon`, `robot`, `terminal`, `window`, `folder` or `node` |
|
|
193
204
|
| node, edge | `edited` | a marker on the card or line |
|
|
194
205
|
| edge | `kind` | what the line means, drawn as its colour: `calls` (default), `feeds`, `triggers`, `state`, `guard` |
|
|
195
206
|
| edge | `weight` | 1, 2 or 3: how much the line stands for, drawn as its width |
|
|
207
|
+
| edge | `step` | a number (2, or 2.1) or text of up to 3 characters (2a), in a circle on the line in any view (a pill for 2 or 3 characters): the order things happen, shown as written in the line's name and title. A numbered view numbers its lines in run order instead |
|
|
196
208
|
| edge | `sublabel` | a second, smaller line under the label |
|
|
197
209
|
| edge | `fromSide`, `toSide` | the card sides the line uses |
|
|
198
210
|
| edge | `from`, `to` | may name a container of the view: the line ends on its box |
|
|
@@ -204,7 +216,9 @@ kinds such as `public`, `lane`, `script`, `hook` and `board` work too). Fields b
|
|
|
204
216
|
| view | `repair: false` | no port repair |
|
|
205
217
|
| view | `subAndChips` | cards 80 px tall that show their sub-line, then their chips |
|
|
206
218
|
| view | `kindsFromLabels` | a line whose edges name no `kind` takes one guessed from its label |
|
|
219
|
+
| view, model | `shapes` | the notation the cards are drawn in: `box` (default), `c4` or `uml`; a view's wins over the model's ([what each draws](docs/module-api.md#card-shapes-box-c4-and-uml)) |
|
|
207
220
|
| container | `badges` | tabs on the box's border |
|
|
221
|
+
| container | `tone` | a palette name, as a badge's: the region behind the box tinted in it, its border dashed and its title in the tone (in `c4`, every box is dashed) |
|
|
208
222
|
| model | `rules` | what must hold: no line `from` some cards `to` others (picked by id, kind, box or owner), or `noCycles` between boxes |
|
|
209
223
|
| model | `stories` | walk-throughs: steps that each set the view, camera, selection, highlight, tour and caption |
|
|
210
224
|
| model | `lenses` | ways to look at the map: what `pick` picks (by id, kind, box, owner or `line` kind) lit, the rest dimmed; `color: "owner"` rings cards by owner |
|
|
@@ -239,7 +253,10 @@ views), C4-PlantUML (its element, relationship and boundary macros), Mermaid (`f
|
|
|
239
253
|
decides. Groups, boundaries, subgraphs, networks and namespaces become boxes; Structurizr's views stay views, a card
|
|
240
254
|
opening the view below it; `examples/clinic.json` is `examples/clinic.dsl`, imported. What each element becomes, and
|
|
241
255
|
what is left out: [docs/module-api.md § Import](docs/module-api.md#import-90). Whatever the file holds that `import`
|
|
242
|
-
doesn't read is listed on stderr with its line (in JSON, its path).
|
|
256
|
+
doesn't read is listed on stderr with its line (in JSON, its path). A Structurizr, C4-PlantUML or Mermaid C4 source is
|
|
257
|
+
drawn in the `c4` notation: its people as people (`person`, or `user` outside the system), its phone apps as phones. A
|
|
258
|
+
Structurizr workspace's `styles` give its elements their shapes (`shape Person`, `Cylinder`, `WebBrowser`, ...), in
|
|
259
|
+
Structurizr's own order; a shape the map has no counterpart for is listed in `notImported`.
|
|
243
260
|
|
|
244
261
|
`pdf` prints the map through Chrome's own print, as a document to hand in for a review
|
|
245
262
|
([bike-share's](https://zintaen.github.io/umlimator/examples/bike-share.pdf), as CI builds it). A cover has the title,
|
|
@@ -251,7 +268,8 @@ the title and "page N of M". It takes `--views` and `--theme`, as `stills` does,
|
|
|
251
268
|
default; both across).
|
|
252
269
|
|
|
253
270
|
The page has breadcrumbs, a details panel per card (with the slowest path from it and what-if), ⌘K search, deep links
|
|
254
|
-
(`#view=<id>&node=<id>`, `#story=<id>&step=<n>` for a story's step,
|
|
271
|
+
(`#view=<id>&node=<id>`, `#story=<id>&step=<n>` for a story's step, `#lens=<id>` and `#shapes=c4`), stories, lenses, a
|
|
272
|
+
card shapes toggle next to ◐ (box, c4, uml; the page keeps the reader's choice), and export. For
|
|
255
273
|
scripts and tests, it keeps its map's handle on `window.umlimatorMap`: the `Handle` that `render()` returns (`setView()`,
|
|
256
274
|
`highlight()`, `tour()`, `play()` ...).
|
|
257
275
|
`stills` skips a view whose inputs have not changed since its last export (`--all` exports every view), and exits 1,
|
|
@@ -281,7 +299,7 @@ jobs:
|
|
|
281
299
|
runs-on: ubuntu-latest
|
|
282
300
|
steps:
|
|
283
301
|
- uses: actions/checkout@v4
|
|
284
|
-
- uses: zintaen/umlimator@v0.
|
|
302
|
+
- uses: zintaen/umlimator@v0.16.0
|
|
285
303
|
with:
|
|
286
304
|
models: "docs/*.json" # optional: where the models are (default: every .json that is a map model)
|
|
287
305
|
```
|
|
@@ -376,7 +394,7 @@ umlimator_mcp.py the MCP server that `umlimator.py mcp` runs
|
|
|
376
394
|
action.yml the diff Action: what a pull request changes in its maps, posted on it
|
|
377
395
|
lib/ the module (umlimator.js), its types, the default theme, <umlimator-map> and the docs plugins
|
|
378
396
|
engine/ the page templates the CLI inlines the module into; the upstream renderer and schema
|
|
379
|
-
docs/ the module's API and the editing design
|
|
397
|
+
docs/ the module's API and the editing design; docs/diagrams/: the plan for 28 diagram types (not built yet)
|
|
380
398
|
tests/, bench/ tests, benchmark models and results
|
|
381
399
|
icons/ line icons and the logo manifest (sources and hashes only)
|
|
382
400
|
examples/ made-up systems: models, host pages and a Node script (live: zintaen.github.io/umlimator)
|
package/lib/umlimator-element.js
CHANGED
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
Events: the map's select, open and viewchange as umlimator:select, umlimator:open and umlimator:viewchange, the map's
|
|
16
16
|
event as `detail` (preventDefault() on umlimator:open keeps the view); load each time the map is drawn, error (an
|
|
17
17
|
ErrorEvent, whose message says why) when it can't be, a model with no view to draw too (its children show again).
|
|
18
|
+
shapes: "box", "c4" or "uml", the notation every view is drawn in (0.15.0; without it each view's own); changing it
|
|
19
|
+
draws the cards again in the map drawn, with nothing laid out again.
|
|
18
20
|
`el.map` is render()'s handle once drawn (toSVG(), highlight(), setView(), state ...), else null; `el.loading` is true
|
|
19
21
|
while a draw waits for its model, when el.map is still the map drawn last. An attribute set to the value it has draws
|
|
20
22
|
nothing again. */
|
|
@@ -23,7 +25,7 @@ import { render } from './umlimator.js';
|
|
|
23
25
|
const Base = globalThis.HTMLElement || class {}; // importable where there is no DOM (a docs site's server render)
|
|
24
26
|
|
|
25
27
|
export class UmlimatorMap extends Base {
|
|
26
|
-
static observedAttributes = ['src', 'view', 'minimap', 'controls', 'wheel', 'height'];
|
|
28
|
+
static observedAttributes = ['src', 'view', 'minimap', 'controls', 'wheel', 'height', 'shapes'];
|
|
27
29
|
map = null;
|
|
28
30
|
#drawn = 0; #due = false; #src = null; #model = null; #loading = false;
|
|
29
31
|
|
|
@@ -38,6 +40,7 @@ export class UmlimatorMap extends Base {
|
|
|
38
40
|
attributeChangedCallback(name, was, now) {
|
|
39
41
|
if (was === now) return; // set to the value it has: nothing to draw again (0.14.0)
|
|
40
42
|
if (name === 'height') this.style.height = now == null ? '' : /^\d+(\.\d+)?$/.test(now) ? now + 'px' : now;
|
|
43
|
+
else if (name === 'shapes' && this.map && !this.#loading) this.map.shapes = now || null; // the map drawn, in another notation: no new draw
|
|
41
44
|
else this.#soon();
|
|
42
45
|
}
|
|
43
46
|
#soon() { // attributes set together draw once
|
|
@@ -78,7 +81,7 @@ export class UmlimatorMap extends Base {
|
|
|
78
81
|
if (!this.dispatchEvent(new CustomEvent('umlimator:' + t, { detail: e, bubbles: true, composed: true, cancelable: t === 'open' }))) e.preventDefault();
|
|
79
82
|
}]));
|
|
80
83
|
try {
|
|
81
|
-
this.map = render(box, model, { view: get('view') || undefined, minimap: this.hasAttribute('minimap') && get('minimap') !== 'false', controls: get('controls') !== 'false', wheel: get('wheel') === 'ctrl' ? 'ctrl' : 'zoom', on });
|
|
84
|
+
this.map = render(box, model, { view: get('view') || undefined, minimap: this.hasAttribute('minimap') && get('minimap') !== 'false', controls: get('controls') !== 'false', wheel: get('wheel') === 'ctrl' ? 'ctrl' : 'zoom', shapes: get('shapes') || undefined, on });
|
|
82
85
|
} catch (err) { return this.#fail(err); }
|
|
83
86
|
if (this.map.view == null) return this.#fail(new Error(`${src || 'the inline model'}: the model has no view to draw`)); // drawn, with nothing to see: an error, not a load (0.14.0)
|
|
84
87
|
this.#loading = false;
|
package/lib/umlimator-theme.css
CHANGED
|
@@ -39,13 +39,17 @@
|
|
|
39
39
|
--um-sans: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
|
|
40
40
|
--um-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
41
41
|
}
|
|
42
|
+
/* How deep the map's tints are, in either theme: a card's kind colour, and a box's tone (containers[].tone). 1 is as
|
|
43
|
+
drawn here, 0 is none (plain panels), 2 twice as deep. The map stops a tint at 18% of its colour, where a card's
|
|
44
|
+
sub-line would fall below 4.5:1. Set it on the map or any ancestor; on :root only, so a map's own setting wins. */
|
|
45
|
+
:root { --um-tint: 1; }
|
|
42
46
|
@media (prefers-color-scheme: dark) {
|
|
43
47
|
:root:not([data-theme="light"]) {
|
|
44
48
|
--um-stage-bg: var(--um-bg-2); --um-edited: #d29922;
|
|
45
49
|
--um-bg: #0d1117; --um-bg-2: #010409; --um-panel: #0d1117; --um-panel-2: #151b23; --um-border: #262c36; --um-border-2: #3d444d;
|
|
46
50
|
--um-text: #f0f6fc; --um-muted: #9198a1; --um-dim: #656c76; --um-grid: rgba(240,246,252,.05); --um-mask: #0d1117; --um-arrow: #656c76;
|
|
47
51
|
--um-shadow: 0 10px 30px rgba(1,4,9,.55); --um-dot: #161b22; --um-gridline: transparent; --um-chrome: rgba(13,17,23,.92);
|
|
48
|
-
--um-accent: #4493f8; --um-accent-fg: #
|
|
52
|
+
--um-accent: #4493f8; --um-accent-fg: #0d1117; --um-lane: rgba(240,246,252,.025);
|
|
49
53
|
--um-cyan: #4493f8; --um-green: #3fb950; --um-violet: #ab7df8; --um-amber: #d29922; --um-rose: #f85149; --um-orange: #db6d28; --um-slate: #9198a1; --um-fuchsia: #db61a2;
|
|
50
54
|
--um-k-public: #4493f8; --um-k-lane: #2dd4bf; --um-k-ext: #ab7df8; --um-k-verb: #f778ba; --um-k-script: #9198a1; --um-k-hook: #f85149; --um-k-board: #d29922;
|
|
51
55
|
--um-w-calls: #b7bdc8; --um-w-feeds: #4493f8; --um-w-triggers: #ab7df8; --um-w-state: #59626e; --um-w-guard: #f85149;
|
|
@@ -59,7 +63,7 @@
|
|
|
59
63
|
--um-bg: #0d1117; --um-bg-2: #010409; --um-panel: #0d1117; --um-panel-2: #151b23; --um-border: #262c36; --um-border-2: #3d444d;
|
|
60
64
|
--um-text: #f0f6fc; --um-muted: #9198a1; --um-dim: #656c76; --um-grid: rgba(240,246,252,.05); --um-mask: #0d1117; --um-arrow: #656c76;
|
|
61
65
|
--um-shadow: 0 10px 30px rgba(1,4,9,.55); --um-dot: #161b22; --um-gridline: transparent; --um-chrome: rgba(13,17,23,.92);
|
|
62
|
-
--um-accent: #4493f8; --um-accent-fg: #
|
|
66
|
+
--um-accent: #4493f8; --um-accent-fg: #0d1117; --um-lane: rgba(240,246,252,.025);
|
|
63
67
|
--um-cyan: #4493f8; --um-green: #3fb950; --um-violet: #ab7df8; --um-amber: #d29922; --um-rose: #f85149; --um-orange: #db6d28; --um-slate: #9198a1; --um-fuchsia: #db61a2;
|
|
64
68
|
--um-k-public: #4493f8; --um-k-lane: #2dd4bf; --um-k-ext: #ab7df8; --um-k-verb: #f778ba; --um-k-script: #9198a1; --um-k-hook: #f85149; --um-k-board: #d29922;
|
|
65
69
|
--um-w-calls: #b7bdc8; --um-w-feeds: #4493f8; --um-w-triggers: #ab7df8; --um-w-state: #59626e; --um-w-guard: #f85149;
|
package/lib/umlimator.d.ts
CHANGED
|
@@ -15,8 +15,16 @@ export interface MapModel {
|
|
|
15
15
|
stories?: Story[];
|
|
16
16
|
/** Saved ways to look at the map (#94): handle.lens(id), the standalone page's Lenses menu and #lens=<id>. */
|
|
17
17
|
lenses?: Lens[];
|
|
18
|
+
/** The notation every view's cards are drawn in (0.15.0; a view's own `shapes` wins). Default 'box'. */
|
|
19
|
+
shapes?: Notation;
|
|
18
20
|
[key: string]: unknown;
|
|
19
21
|
}
|
|
22
|
+
/** How cards are drawn (0.15.0): box (every card a rounded box, the default), c4 (people, browser apps, phones, databases,
|
|
23
|
+
* queues and files as the C4 model's tools draw them) or uml (UML 2.5's actor, node, artifact, package and data store,
|
|
24
|
+
* and the component icon on a box). Each shape keeps to its card's box: the layout is the same in every notation. */
|
|
25
|
+
export type Notation = 'box' | 'c4' | 'uml';
|
|
26
|
+
/** A card's shape (0.15.0). */
|
|
27
|
+
export type Shape = 'box' | 'person' | 'browser' | 'mobile' | 'cylinder' | 'pipe' | 'document' | 'hexagon' | 'robot' | 'terminal' | 'window' | 'folder' | 'node';
|
|
20
28
|
/** A badge: its text, and optionally a palette name for its colour (green, amber, rose, accent, violet ... : --um-<tone>). */
|
|
21
29
|
export type Badge = string | { text: string; tone?: string };
|
|
22
30
|
export interface MapNode {
|
|
@@ -29,6 +37,8 @@ export interface MapNode {
|
|
|
29
37
|
opensCount?: number;
|
|
30
38
|
/** Who owns the card (a team, say): selectors pick by it, and a lens with color 'owner' rings the card in its owner's tone. */
|
|
31
39
|
owner?: string;
|
|
40
|
+
/** The card's own shape, in every notation (0.15.0); without it, the notation draws the card by its kind. */
|
|
41
|
+
shape?: Shape;
|
|
32
42
|
[key: string]: unknown;
|
|
33
43
|
}
|
|
34
44
|
/** What a line means, drawn as its colour: calls (the default), feeds (hands work on), triggers (suggests, offers, fires),
|
|
@@ -45,6 +55,13 @@ export interface MapEdge {
|
|
|
45
55
|
* hit line growing with it. The host picks the bucket (say under 10, under 100, 100 or more relations); anything else is 1.
|
|
46
56
|
* A line that stands for several edges takes the largest. */
|
|
47
57
|
weight?: 1 | 2 | 3;
|
|
58
|
+
/** Its place in the order things happen, drawn in a circle on the line before its label, as a numbered view draws its
|
|
59
|
+
* steps, in any view: 2, 2.1 for a step within step 2, or text of up to 3 characters such as "2a" (a pill for 2 or 3
|
|
60
|
+
* characters). The line's name and title say it as written ("Step 2a: …"); in order, 2 < 2a < 2b < 3. A numbered view
|
|
61
|
+
* (`render: 'sequence'`) numbers its lines in run order instead. A line that stands for several edges shows the first
|
|
62
|
+
* one's step (a view's `keepPairs` draws each edge as its own line). A step on a model edge shows in every view that
|
|
63
|
+
* draws the edge; a view's own edge numbers it in that view only. */
|
|
64
|
+
step?: number | string;
|
|
48
65
|
/** A second, smaller line under the label (a technology, say), placed with it and counted in the room left for labels.
|
|
49
66
|
* Shown only with a label. A line that stands for several edges shows each of their sublabels, joined by " / ". */
|
|
50
67
|
sublabel?: string;
|
|
@@ -71,7 +88,11 @@ export interface MapView {
|
|
|
71
88
|
/** Guess a line's kind from the words of its label ("reads" is state, "triggers" is triggers ...) when its edges name
|
|
72
89
|
* none. Off in render() and layout(), which draw no legend; the standalone page (mountPage) always guesses. */
|
|
73
90
|
kindsFromLabels?: boolean;
|
|
74
|
-
|
|
91
|
+
/** Boxes: badges are tabs on the box's border; tone, a palette name as a badge's (--um-<tone>), tints the region behind the
|
|
92
|
+
* box (as deep as --um-tint makes the cards), with its border dashed and its title in the tone. */
|
|
93
|
+
containers?: { id: string; label?: string; nodeIds?: string[]; parent?: string; badges?: Badge[]; tone?: string }[];
|
|
94
|
+
/** The notation this view's cards are drawn in (0.15.0): it wins over the model's. */
|
|
95
|
+
shapes?: Notation;
|
|
75
96
|
[key: string]: unknown;
|
|
76
97
|
}
|
|
77
98
|
|
|
@@ -114,11 +135,15 @@ export interface MapState {
|
|
|
114
135
|
expanded: string[]; // as `expanded`
|
|
115
136
|
lens: string | null;
|
|
116
137
|
overlays: string[]; // the layers on the map, in stack order ('lens', 'highlight', 'replay', 'story', 'tour', a host's)
|
|
117
|
-
story: { id: string; step: number; steps: number; playing: boolean } | null;
|
|
118
|
-
tour: boolean; // a tour's dot is riding
|
|
119
|
-
replay: { playing: boolean } | null; // a replay under way: playing, or paused
|
|
138
|
+
story: { id: string; step: number; steps: number; playing: boolean } | null; // playing: the player's own (it goes on by itself)
|
|
139
|
+
tour: boolean; // a tour's dot is on the map, riding or held (by paused, or by its story's pause); a path lit at rest: false
|
|
140
|
+
replay: { playing: boolean } | null; // a replay under way: playing, or paused by its own pause()
|
|
141
|
+
/** The standalone page's ❚❚ is on (0.15.0): it holds every clock (a tour's or a replay's dot, a story's step, the flow)
|
|
142
|
+
* and leaves each one's own state as it is, so story.playing or replay.playing true under it means "would play, held". */
|
|
143
|
+
paused: boolean;
|
|
120
144
|
camera: { x: number; y: number; zoom: number }; // the centre in map units, and the zoom (1: actual size); a state event's: at rest
|
|
121
145
|
flow: boolean;
|
|
146
|
+
shapes: Notation; // the notation the view shown is drawn in (0.15.0)
|
|
122
147
|
motion: 'full' | 'reduced' | 'instant';
|
|
123
148
|
gesture: 'idle' | 'dragging' | 'connecting' | 'naming'; // an edit in progress (editable maps)
|
|
124
149
|
destroyed: boolean;
|
|
@@ -147,6 +172,8 @@ export interface RenderOptions {
|
|
|
147
172
|
wheel?: 'zoom' | 'ctrl';
|
|
148
173
|
minimap?: boolean; // default false
|
|
149
174
|
flow?: boolean; // animated flow along lines (default: on unless prefers-reduced-motion)
|
|
175
|
+
/** The notation every view is drawn in (0.15.0), over each view's and the model's own. */
|
|
176
|
+
shapes?: Notation;
|
|
150
177
|
/** Text widths: default the host's font (--um-sans, measured on a canvas); false: a font-independent estimate. */
|
|
151
178
|
measure?: false | ((text: string, px: number) => number);
|
|
152
179
|
/** Edit gestures that emit `change` events: all of them, or only those set true. Off by default. */
|
|
@@ -219,6 +246,10 @@ export interface Handle {
|
|
|
219
246
|
readonly destroyed: boolean;
|
|
220
247
|
/** The animated flow along lines (the ≋ button and F), to read or set. */
|
|
221
248
|
flow: boolean;
|
|
249
|
+
/** The notation the view shown is drawn in (0.15.0). Set it to draw every view in one (null: each view's own): the
|
|
250
|
+
* cards are drawn again from the geometry they have, with the camera, selection, lens and marks; nothing is laid out. */
|
|
251
|
+
get shapes(): Notation;
|
|
252
|
+
set shapes(notation: Notation | null);
|
|
222
253
|
/** How this map moves: 'instant' (drawn without animation, as the page's #check, #still and #shot are), 'reduced' (the
|
|
223
254
|
* reader's setting), else 'full'. */
|
|
224
255
|
readonly motion: 'full' | 'reduced' | 'instant';
|