@issuegraph/editor 0.22.1 → 0.24.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/dist/audit/findings.js +4 -4
- package/dist/audit/findings.js.map +1 -1
- package/dist/audit/surface.js +1 -1
- package/dist/audit/surface.js.map +1 -1
- package/dist/firstpass/render.d.ts.map +1 -1
- package/dist/firstpass/render.js +10 -9
- package/dist/firstpass/render.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/overlay/render.d.ts.map +1 -1
- package/dist/overlay/render.js +11 -2
- package/dist/overlay/render.js.map +1 -1
- package/dist/reevaluate/render.d.ts.map +1 -1
- package/dist/reevaluate/render.js +4 -0
- package/dist/reevaluate/render.js.map +1 -1
- package/dist/scale/ladder.d.ts.map +1 -1
- package/dist/scale/ladder.js +15 -18
- package/dist/scale/ladder.js.map +1 -1
- package/dist/scale/render.d.ts.map +1 -1
- package/dist/scale/render.js +31 -8
- package/dist/scale/render.js.map +1 -1
- package/dist/scale/styles.d.ts +1 -1
- package/dist/scale/styles.d.ts.map +1 -1
- package/dist/scale/styles.js +53 -1
- package/dist/scale/styles.js.map +1 -1
- package/dist/workspace/mount.d.ts.map +1 -1
- package/dist/workspace/mount.js +130 -15
- package/dist/workspace/mount.js.map +1 -1
- package/dist/workspace/rail.d.ts +42 -13
- package/dist/workspace/rail.d.ts.map +1 -1
- package/dist/workspace/rail.js +44 -15
- package/dist/workspace/rail.js.map +1 -1
- package/dist/workspace/render.d.ts +11 -0
- package/dist/workspace/render.d.ts.map +1 -1
- package/dist/workspace/render.js +54 -4
- package/dist/workspace/render.js.map +1 -1
- package/dist/workspace/skeleton.d.ts +33 -0
- package/dist/workspace/skeleton.d.ts.map +1 -0
- package/dist/workspace/skeleton.js +56 -0
- package/dist/workspace/skeleton.js.map +1 -0
- package/dist/workspace/styles.d.ts +1 -1
- package/dist/workspace/styles.d.ts.map +1 -1
- package/dist/workspace/styles.js +72 -10
- package/dist/workspace/styles.js.map +1 -1
- package/package.json +2 -2
package/dist/scale/render.js
CHANGED
|
@@ -56,7 +56,7 @@ function omittedSpec(omitted) {
|
|
|
56
56
|
? ` \u00b7 ${String(range.smallest)} ${range.smallest === 1 ? 'issue' : 'issues'} each`
|
|
57
57
|
: ` \u00b7 ${String(range.smallest)}\u2013${String(range.largest)} issues each`;
|
|
58
58
|
return element('p', { class: 'ig-refusal-omitted' }, [
|
|
59
|
-
`${String(omitted.count)}
|
|
59
|
+
`${String(omitted.count)} more ${omitted.count === 1 ? 'group is' : 'groups are'} not listed${span}.`,
|
|
60
60
|
]);
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
@@ -76,13 +76,13 @@ function omittedSpec(omitted) {
|
|
|
76
76
|
*/
|
|
77
77
|
function capsuleLabel(capsule) {
|
|
78
78
|
const blocking = capsule.reach.kind === 'cyclic'
|
|
79
|
-
? '
|
|
80
|
-
: `${String(capsule.blockedByEdges)}
|
|
79
|
+
? 'has a loop'
|
|
80
|
+
: `${String(capsule.blockedByEdges)} blocking`;
|
|
81
81
|
// THE ACCESSIBLE NAME SAYS "around" TOO, so what is heard and what is drawn
|
|
82
82
|
// make the same claim. It used to read "Focus <title> (<key>)", which names
|
|
83
83
|
// the component after one issue in the one channel that cannot show the
|
|
84
84
|
// layout making it an anchor.
|
|
85
|
-
return `
|
|
85
|
+
return `Draw the group around ${capsule.lead}, ${capsule.name}: ${String(capsule.size)} issues, ${blocking}, ${clusterReachLabel(capsule.reach)}`;
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
88
88
|
* One component, as frame `17f` draws it: a card whose whole surface enters it.
|
|
@@ -175,7 +175,7 @@ function refusalSpec(refusal, ladder) {
|
|
|
175
175
|
element('p', {}, [refusal.reason]),
|
|
176
176
|
ladder.capsules.length === 0
|
|
177
177
|
? null
|
|
178
|
-
: element('ol', { class: 'ig-list', 'aria-label': '
|
|
178
|
+
: element('ol', { class: 'ig-list', 'aria-label': 'groups of related issues' }, ladder.capsules.map((capsule) => capsuleSpec(capsule))),
|
|
179
179
|
omittedSpec(ladder.capsulesOmitted),
|
|
180
180
|
element('ul', { class: 'ig-ladder-routes', 'aria-label': 'what to do next' }, refusal.routes.map((route) => element('li', { class: 'ig-refusal-next', 'data-route': route.kind }, [route.label]))),
|
|
181
181
|
]);
|
|
@@ -188,7 +188,7 @@ function searchSpec(search) {
|
|
|
188
188
|
// resolve to whichever came first — so one of the two search boxes would
|
|
189
189
|
// silently lose its label.
|
|
190
190
|
element('label', {}, [
|
|
191
|
-
'Search
|
|
191
|
+
'Search for an issue',
|
|
192
192
|
element('input', {
|
|
193
193
|
type: 'search',
|
|
194
194
|
'data-ig-command': 'search',
|
|
@@ -199,7 +199,7 @@ function searchSpec(search) {
|
|
|
199
199
|
search.matches.length === 0
|
|
200
200
|
? null
|
|
201
201
|
: element('ol', { class: 'ig-list', 'aria-label': 'search matches' }, search.matches.map((match) => element('li', { class: 'ig-ladder-match' }, [
|
|
202
|
-
element('button', { type: 'button', 'data-ig-command': 'focus', 'data-ig-target': match.lead }, [`
|
|
202
|
+
element('button', { type: 'button', 'data-ig-command': 'focus', 'data-ig-target': match.lead }, [`Show ${match.key}`]),
|
|
203
203
|
element('span', { class: 'ig-title' }, [match.title]),
|
|
204
204
|
]))),
|
|
205
205
|
search.omitted > 0
|
|
@@ -234,6 +234,20 @@ function isolatedSpec(isolated, chip, listId) {
|
|
|
234
234
|
if (!chip && !isolated.open)
|
|
235
235
|
return null;
|
|
236
236
|
return element('div', { class: 'ig-ladder-isolated' }, [
|
|
237
|
+
// A CAPTION WHEN THE CONTROL IS SOMEWHERE ELSE, AND THE HOST'S OWN WORD FOR
|
|
238
|
+
// IT. With the chip drawn here the button says what the list is and a
|
|
239
|
+
// caption above it would say it twice. §17a moves the control to the rail
|
|
240
|
+
// footer, and what was left in this zone was an unlabelled column of issues
|
|
241
|
+
// in a canvas that had been drawing a graph a moment earlier — a reader who
|
|
242
|
+
// scrolled to it met a list with nothing saying what it was a list OF.
|
|
243
|
+
//
|
|
244
|
+
// NO NEW WORD IS INVENTED: this is `isolated.label`, the same string the
|
|
245
|
+
// chip would have carried, and exactly one of the two is ever drawn. That
|
|
246
|
+
// keeps the surface's rule — it renders words it was given — with no
|
|
247
|
+
// addition to the vocabulary a host has to supply.
|
|
248
|
+
chip || !isolated.open
|
|
249
|
+
? null
|
|
250
|
+
: element('p', { class: 'ig-isolated-caption' }, [isolated.label]),
|
|
237
251
|
!chip ? null : element('button', {
|
|
238
252
|
type: 'button',
|
|
239
253
|
class: 'ig-chip',
|
|
@@ -297,6 +311,15 @@ export function renderScaleLadder(input, options = {}) {
|
|
|
297
311
|
// drawing it. Two would mean two projection toggles disagreeing
|
|
298
312
|
// about which projection is current.
|
|
299
313
|
chrome: false,
|
|
314
|
+
// THE WORKSPACE RULES ITS OWN ZONES OFF, so the viewer draws no
|
|
315
|
+
// frame of its own here: the rail track carries `border-right`, the
|
|
316
|
+
// canvas toolbar carries `border-bottom`, and a second edge one
|
|
317
|
+
// pixel away reads as a doubled hairline. See `SceneOptions.frame`.
|
|
318
|
+
frame: false,
|
|
319
|
+
// §16b's KEY, KEPT IN VIEW. It explains every line and station on this
|
|
320
|
+
// zone, and below a scroll it was the one thing a reader had to leave the
|
|
321
|
+
// reading to reach. See `SceneOptions.dockLegend`.
|
|
322
|
+
dockLegend: true,
|
|
300
323
|
edgeMarks: edgeMarkRequests(requestedOverlays),
|
|
301
324
|
})
|
|
302
325
|
: null;
|
|
@@ -327,7 +350,7 @@ export function renderScaleLadder(input, options = {}) {
|
|
|
327
350
|
const chrome = element('section', { class: 'ig-ladder', 'data-tier': ladder.tier }, [
|
|
328
351
|
ladder.focus === null
|
|
329
352
|
? null
|
|
330
|
-
: element('button', { type: 'button', class: 'ig-chip', 'data-ig-command': 'clear-focus' }, ['
|
|
353
|
+
: element('button', { type: 'button', class: 'ig-chip', 'data-ig-command': 'clear-focus' }, ['Go back to all groups']),
|
|
331
354
|
ladder.refusal === null ? null : refusalSpec(ladder.refusal, ladder),
|
|
332
355
|
ladder.search === null ? null : searchSpec(ladder.search),
|
|
333
356
|
// THE CONTROL, UNLESS THE CALLER DREW IT — the LIST is drawn either way.
|
package/dist/scale/render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/scale/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EACL,eAAe,EAIf,iBAAiB,EACjB,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAmB,MAAM,eAAe,CAAC;AACrE,OAAO,EAOL,WAAW,GACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAkHpD;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,OAAiC;IACpD,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,IAAI,GACR,KAAK,KAAK,IAAI;QACZ,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,OAAO;YAChC,CAAC,CAAC,WAAW,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,OAAO;YACvF,CAAC,CAAC,WAAW,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;IACtF,OAAO,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE;QACnD,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/scale/render.ts"],"names":[],"mappings":"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"}
|
package/dist/scale/styles.d.ts
CHANGED
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
* imports CSS cannot be loaded by a bare Node runtime, and a string needs no
|
|
24
24
|
* bundler.
|
|
25
25
|
*/
|
|
26
|
-
export declare const scaleLadderStylesheet = "\n.ig-ladder {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n line-height: var(--ig-line-height);\n color: var(--ig-text-body);\n}\n\n.ig-ladder-routes {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n color: var(--ig-text-muted);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-ladder-search {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n}\n\n.ig-ladder-search input {\n background: var(--ig-surface);\n color: var(--ig-text);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n}\n\n.ig-ladder-search input:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-ladder-match {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-chip {\n align-self: flex-start;\n background: var(--ig-surface-2);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight) var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n cursor: pointer;\n}\n\n.ig-chip:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-chip[aria-expanded='true'] {\n border-color: var(--ig-accent);\n color: var(--ig-text);\n}\n\n/* THE LIST ITEM IS A GRID CELL AND NOTHING ELSE. It deliberately does not\n carry .ig-capsule: that is layer 1's own card, and a card inside a card put\n the stuck tint and the hover on the inner border only. */\n.ig-capsule-cell {\n display: flex;\n min-width: 0;\n}\n\n/* FOUR CARDS ACROSS A COLUMN, NOT FOUR ROWS DOWN IT. Frame 17f lays the\n capsules out as a board, which is what makes the counts comparable at a\n glance \u2014 the whole reason the count leads. minmax(0, 1fr) rather than a\n width, because this stylesheet declares no fixed length: a title is arbitrary\n and auto would let the longest one set every column. Scoped to the ladder's\n own refusal so \u00A716's single-column list, drawn from the same class in layer\n 1, is untouched. */\n.ig-ladder .ig-refusal .ig-list {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--ig-space);\n}\n\n/* THE WHOLE CAPSULE IS THE CONTROL, so the button carries the card and the\n list item carries nothing. A button wrapping a card needs its own alignment\n and wrapping reset: a user agent centres and nowraps button content, and both\n are wrong for a four-part card with a title in it. */\n.ig-capsule-enter {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: start;\n gap: var(--ig-space-tight) var(--ig-space);\n width: 100%;\n height: 100%;\n text-align: left;\n background: var(--ig-surface-2);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n cursor: pointer;\n}\n\n.ig-capsule-enter:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-capsule-enter:hover {\n border-color: var(--ig-accent);\n}\n\n/* THE WHOLE STUCK CARD IS TINTED, as frame 17f draws it \u2014 the badge alone puts\n the one finding that stops work outright at the size of every other chip on\n the board. Same hue as the badge inside it, which is blocked-by's, because\n that is the edge the cycle is made of. */\n.ig-capsule-enter[data-reach='cyclic'] {\n border-color: var(--ig-edge-blocked-by);\n}\n\n.ig-capsule-enter[data-reach='cyclic'] .ig-capsule-reach {\n color: var(--ig-edge-blocked-by);\n}\n\n/* THE COUNT LEADS, so it is the one part sized to be read down the board rather\n than within a card. The --ig-font-size-rank token is the one the theme defines\n for exactly this \u2014 \"the rank number itself\" \u2014 so a capsule's count and a rail\n rank are one size by declaration rather than by coincidence. */\n.ig-capsule-size {\n grid-column: 1;\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-rank);\n font-variant-numeric: tabular-nums;\n color: var(--ig-text);\n}\n\n/* END-ALIGNED AND CONTENT-WIDTH. A grid item stretches by default, which drew\n the cycle badge as a full-width bar across the top of the card. The pill is\n the frame's: the blocked count and the cycle sit in one slot, so they read as\n one kind of thing rather than as a bordered badge beside bare text. */\n.ig-capsule-load {\n grid-column: 2;\n justify-self: end;\n background: var(--ig-bg);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-micro) var(--ig-space-snug);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-small);\n font-variant-numeric: tabular-nums;\n color: var(--ig-text-muted);\n}\n\n/* THE NAME AND THE REACH SPAN BOTH COLUMNS, and the name is the one part\n allowed to wrap: a title is arbitrary length, and letting it size the grid\n would make every card on the board a different shape. */\n.ig-capsule-name {\n grid-column: 1 / -1;\n color: var(--ig-text);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.ig-capsule-reach {\n grid-column: 1 / -1;\n color: var(--ig-text-muted);\n font-size: var(--ig-font-size-small);\n font-variant-numeric: tabular-nums;\n}\n\n.ig-isolated
|
|
26
|
+
export declare const scaleLadderStylesheet = "\n.ig-ladder {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n line-height: var(--ig-line-height);\n color: var(--ig-text-body);\n}\n\n.ig-ladder-routes {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n color: var(--ig-text-muted);\n font-size: var(--ig-font-size-small);\n}\n\n.ig-ladder-search {\n display: flex;\n flex-direction: column;\n gap: var(--ig-space-tight);\n}\n\n.ig-ladder-search input {\n background: var(--ig-surface);\n color: var(--ig-text);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n}\n\n.ig-ladder-search input:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-ladder-match {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n}\n\n.ig-chip {\n align-self: flex-start;\n background: var(--ig-surface-2);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-tight) var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size-small);\n cursor: pointer;\n}\n\n.ig-chip:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-chip[aria-expanded='true'] {\n border-color: var(--ig-accent);\n color: var(--ig-text);\n}\n\n/* THE LIST ITEM IS A GRID CELL AND NOTHING ELSE. It deliberately does not\n carry .ig-capsule: that is layer 1's own card, and a card inside a card put\n the stuck tint and the hover on the inner border only. */\n.ig-capsule-cell {\n display: flex;\n min-width: 0;\n}\n\n/* FOUR CARDS ACROSS A COLUMN, NOT FOUR ROWS DOWN IT. Frame 17f lays the\n capsules out as a board, which is what makes the counts comparable at a\n glance \u2014 the whole reason the count leads. minmax(0, 1fr) rather than a\n width, because this stylesheet declares no fixed length: a title is arbitrary\n and auto would let the longest one set every column. Scoped to the ladder's\n own refusal so \u00A716's single-column list, drawn from the same class in layer\n 1, is untouched. */\n.ig-ladder .ig-refusal .ig-list {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--ig-space);\n}\n\n/* THE WHOLE CAPSULE IS THE CONTROL, so the button carries the card and the\n list item carries nothing. A button wrapping a card needs its own alignment\n and wrapping reset: a user agent centres and nowraps button content, and both\n are wrong for a four-part card with a title in it. */\n.ig-capsule-enter {\n display: grid;\n grid-template-columns: 1fr auto;\n align-items: start;\n gap: var(--ig-space-tight) var(--ig-space);\n width: 100%;\n height: 100%;\n text-align: left;\n background: var(--ig-surface-2);\n color: var(--ig-text-body);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space);\n font-family: var(--ig-font-ui);\n font-size: var(--ig-font-size);\n cursor: pointer;\n}\n\n.ig-capsule-enter:focus-visible {\n outline: var(--ig-focus-ring) solid var(--ig-focus);\n outline-offset: var(--ig-space-tight);\n}\n\n.ig-capsule-enter:hover {\n border-color: var(--ig-accent);\n}\n\n/* THE WHOLE STUCK CARD IS TINTED, as frame 17f draws it \u2014 the badge alone puts\n the one finding that stops work outright at the size of every other chip on\n the board. Same hue as the badge inside it, which is blocked-by's, because\n that is the edge the cycle is made of. */\n.ig-capsule-enter[data-reach='cyclic'] {\n border-color: var(--ig-edge-blocked-by);\n}\n\n.ig-capsule-enter[data-reach='cyclic'] .ig-capsule-reach {\n color: var(--ig-edge-blocked-by);\n}\n\n/* THE COUNT LEADS, so it is the one part sized to be read down the board rather\n than within a card. The --ig-font-size-rank token is the one the theme defines\n for exactly this \u2014 \"the rank number itself\" \u2014 so a capsule's count and a rail\n rank are one size by declaration rather than by coincidence. */\n.ig-capsule-size {\n grid-column: 1;\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-rank);\n font-variant-numeric: tabular-nums;\n color: var(--ig-text);\n}\n\n/* END-ALIGNED AND CONTENT-WIDTH. A grid item stretches by default, which drew\n the cycle badge as a full-width bar across the top of the card. The pill is\n the frame's: the blocked count and the cycle sit in one slot, so they read as\n one kind of thing rather than as a bordered badge beside bare text. */\n.ig-capsule-load {\n grid-column: 2;\n justify-self: end;\n background: var(--ig-bg);\n border: var(--ig-stroke) solid var(--ig-line);\n border-radius: var(--ig-radius);\n padding: var(--ig-space-micro) var(--ig-space-snug);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-small);\n font-variant-numeric: tabular-nums;\n color: var(--ig-text-muted);\n}\n\n/* THE NAME AND THE REACH SPAN BOTH COLUMNS, and the name is the one part\n allowed to wrap: a title is arbitrary length, and letting it size the grid\n would make every card on the board a different shape. */\n.ig-capsule-name {\n grid-column: 1 / -1;\n color: var(--ig-text);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n\n.ig-capsule-reach {\n grid-column: 1 / -1;\n color: var(--ig-text-muted);\n font-size: var(--ig-font-size-small);\n font-variant-numeric: tabular-nums;\n}\n\n/* A PANEL, NOT A LOOSE COLUMN OF TEXT. With the control moved to the rail\n footer (\u00A717a) this wrapper was left holding an unstyled ol at zero inset:\n it began hard against the zone's own rule, ran on from the graph above it\n with nothing between them, and read as content that had escaped a container\n rather than as the thing the reader had just asked to see.\n\n THE TOP RULE AND THE PADDING ARE THE CANVAS TOOLBAR'S, because this is the\n same kind of band one row lower \u2014 a full-bleed section of the canvas zone,\n not a card floating on it. --ig-bg for the same reason the toolbar takes\n it: the ground this zone already paints, so the two read as one surface. */\n.ig-ladder-isolated {\n border-top: var(--ig-stroke) solid var(--ig-line);\n padding: var(--ig-space) var(--ig-space-wide);\n}\n\n/* A SECTION HEAD IN THE READ-OUT VOICE the canvas caption and the rail footer\n count already use on this surface \u2014 mono, micro, muted, tracked \u2014 because it\n carries the same kind of fact and a heavier treatment would make a list of\n issues nobody has to act on the loudest thing in the zone. */\n.ig-isolated-caption {\n margin: 0 0 var(--ig-space-tight);\n color: var(--ig-text-muted);\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-micro);\n letter-spacing: var(--ig-tracking-group);\n text-transform: uppercase;\n}\n\n.ig-isolated-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n}\n\n/* A ROW PER ENTRY, WITH A GAP THE MARKUP DOES NOT SUPPLY. The element helper\n concatenates its children with no whitespace, so the key and the title\n rendered as one run of text \u2014 #492Audit log pagination. Latent until \u00A717a\n moved the CONTROL to the rail footer and made this list the thing a reader is\n sent to, rather than a chip's afterthought. */\n/* SEPARATED THE WAY EVERY OTHER LIST OF ISSUES ON THIS SURFACE IS, with a\n hairline between rows rather than a gap between them. A gap left five lines\n of text floating in a column; the rule is what makes them read as rows, and\n it is the treatment the viewer's own order rows already carry. Last row\n included would double the zone's next edge, so it stops one short. */\n.ig-isolated-list li {\n display: flex;\n gap: var(--ig-space-tight);\n align-items: baseline;\n min-width: 0;\n padding: var(--ig-space-tight) 0;\n}\n\n.ig-isolated-list li + li {\n border-top: var(--ig-stroke) solid var(--ig-line);\n}\n\n/* THE KEY IN ITS OWN COLUMN, so five titles start on one edge rather than\n wherever their number happened to end. tabular-nums and a measure in\n characters are what the capsule's own count line already uses for the same\n reason: a ragged left edge on a column of ids reads as a mistake. */\n.ig-isolated-list .ig-id {\n font-family: var(--ig-font-mono);\n font-size: var(--ig-font-size-small);\n font-variant-numeric: tabular-nums;\n color: var(--ig-text-muted);\n flex: none;\n min-inline-size: calc(var(--ig-char-width) * 5);\n}\n\n/* The title carries the row, so it takes the body colour and wraps rather than\n setting the row's width \u2014 the rule .ig-capsule-name states one file up. */\n.ig-isolated-list .ig-title {\n color: var(--ig-text);\n min-width: 0;\n overflow-wrap: anywhere;\n}\n";
|
|
27
27
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/scale/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/scale/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,eAAO,MAAM,qBAAqB,g5RAmQjC,CAAC"}
|
package/dist/scale/styles.js
CHANGED
|
@@ -204,13 +204,40 @@ export const scaleLadderStylesheet = `
|
|
|
204
204
|
font-variant-numeric: tabular-nums;
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
+
/* A PANEL, NOT A LOOSE COLUMN OF TEXT. With the control moved to the rail
|
|
208
|
+
footer (§17a) this wrapper was left holding an unstyled ol at zero inset:
|
|
209
|
+
it began hard against the zone's own rule, ran on from the graph above it
|
|
210
|
+
with nothing between them, and read as content that had escaped a container
|
|
211
|
+
rather than as the thing the reader had just asked to see.
|
|
212
|
+
|
|
213
|
+
THE TOP RULE AND THE PADDING ARE THE CANVAS TOOLBAR'S, because this is the
|
|
214
|
+
same kind of band one row lower — a full-bleed section of the canvas zone,
|
|
215
|
+
not a card floating on it. --ig-bg for the same reason the toolbar takes
|
|
216
|
+
it: the ground this zone already paints, so the two read as one surface. */
|
|
217
|
+
.ig-ladder-isolated {
|
|
218
|
+
border-top: var(--ig-stroke) solid var(--ig-line);
|
|
219
|
+
padding: var(--ig-space) var(--ig-space-wide);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* A SECTION HEAD IN THE READ-OUT VOICE the canvas caption and the rail footer
|
|
223
|
+
count already use on this surface — mono, micro, muted, tracked — because it
|
|
224
|
+
carries the same kind of fact and a heavier treatment would make a list of
|
|
225
|
+
issues nobody has to act on the loudest thing in the zone. */
|
|
226
|
+
.ig-isolated-caption {
|
|
227
|
+
margin: 0 0 var(--ig-space-tight);
|
|
228
|
+
color: var(--ig-text-muted);
|
|
229
|
+
font-family: var(--ig-font-mono);
|
|
230
|
+
font-size: var(--ig-font-size-micro);
|
|
231
|
+
letter-spacing: var(--ig-tracking-group);
|
|
232
|
+
text-transform: uppercase;
|
|
233
|
+
}
|
|
234
|
+
|
|
207
235
|
.ig-isolated-list {
|
|
208
236
|
list-style: none;
|
|
209
237
|
margin: 0;
|
|
210
238
|
padding: 0;
|
|
211
239
|
display: flex;
|
|
212
240
|
flex-direction: column;
|
|
213
|
-
gap: var(--ig-space-tight);
|
|
214
241
|
}
|
|
215
242
|
|
|
216
243
|
/* A ROW PER ENTRY, WITH A GAP THE MARKUP DOES NOT SUPPLY. The element helper
|
|
@@ -218,17 +245,42 @@ export const scaleLadderStylesheet = `
|
|
|
218
245
|
rendered as one run of text — #492Audit log pagination. Latent until §17a
|
|
219
246
|
moved the CONTROL to the rail footer and made this list the thing a reader is
|
|
220
247
|
sent to, rather than a chip's afterthought. */
|
|
248
|
+
/* SEPARATED THE WAY EVERY OTHER LIST OF ISSUES ON THIS SURFACE IS, with a
|
|
249
|
+
hairline between rows rather than a gap between them. A gap left five lines
|
|
250
|
+
of text floating in a column; the rule is what makes them read as rows, and
|
|
251
|
+
it is the treatment the viewer's own order rows already carry. Last row
|
|
252
|
+
included would double the zone's next edge, so it stops one short. */
|
|
221
253
|
.ig-isolated-list li {
|
|
222
254
|
display: flex;
|
|
223
255
|
gap: var(--ig-space-tight);
|
|
224
256
|
align-items: baseline;
|
|
225
257
|
min-width: 0;
|
|
258
|
+
padding: var(--ig-space-tight) 0;
|
|
226
259
|
}
|
|
227
260
|
|
|
261
|
+
.ig-isolated-list li + li {
|
|
262
|
+
border-top: var(--ig-stroke) solid var(--ig-line);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* THE KEY IN ITS OWN COLUMN, so five titles start on one edge rather than
|
|
266
|
+
wherever their number happened to end. tabular-nums and a measure in
|
|
267
|
+
characters are what the capsule's own count line already uses for the same
|
|
268
|
+
reason: a ragged left edge on a column of ids reads as a mistake. */
|
|
228
269
|
.ig-isolated-list .ig-id {
|
|
229
270
|
font-family: var(--ig-font-mono);
|
|
271
|
+
font-size: var(--ig-font-size-small);
|
|
272
|
+
font-variant-numeric: tabular-nums;
|
|
230
273
|
color: var(--ig-text-muted);
|
|
231
274
|
flex: none;
|
|
275
|
+
min-inline-size: calc(var(--ig-char-width) * 5);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* The title carries the row, so it takes the body colour and wraps rather than
|
|
279
|
+
setting the row's width — the rule .ig-capsule-name states one file up. */
|
|
280
|
+
.ig-isolated-list .ig-title {
|
|
281
|
+
color: var(--ig-text);
|
|
282
|
+
min-width: 0;
|
|
283
|
+
overflow-wrap: anywhere;
|
|
232
284
|
}
|
|
233
285
|
`;
|
|
234
286
|
//# sourceMappingURL=styles.js.map
|
package/dist/scale/styles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/scale/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/scale/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmQpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/workspace/mount.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAGH,OAAO,KAAK,EAA+C,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE3G,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,cAAc,EAIpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAIlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/workspace/mount.ts"],"names":[],"mappings":"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"}
|
package/dist/workspace/mount.js
CHANGED
|
@@ -61,6 +61,7 @@ import { renderPicker } from "../picker/render.js";
|
|
|
61
61
|
import { pickerStylesheet } from "../picker/styles.js";
|
|
62
62
|
import { scaleLadder } from "../scale/ladder.js";
|
|
63
63
|
import { mountStylesheet } from "./chrome.js";
|
|
64
|
+
import { renderWorkspaceSkeleton } from "./skeleton.js";
|
|
64
65
|
import { INITIAL_HOST_STATE, editCarrier, narrowOverlayOpen, railRowAt, railSlackFor, railWindowTarget, reconcileHost, reduceHost, targetMatches, } from "./host.js";
|
|
65
66
|
import { conflictDiff } from "./recovery.js";
|
|
66
67
|
import { renderWorkspace, } from "./render.js";
|
|
@@ -932,15 +933,27 @@ export function mountWorkspace(element, options) {
|
|
|
932
933
|
const sceneFor = (zoneName) => {
|
|
933
934
|
if (drawn === null)
|
|
934
935
|
return null;
|
|
936
|
+
// `frame: false` MIRRORS WHAT IS DRAWN. These rebuild a scene to answer a
|
|
937
|
+
// navigation question, and a scene built from different options than the
|
|
938
|
+
// markup is a second opinion about the surface. See `SceneOptions.frame`.
|
|
939
|
+
// `detachFooter` too, for the same reason: the rail DRAWS its footer group
|
|
940
|
+
// detached, after the extent. The traversal is the same either way, so this
|
|
941
|
+
// is agreement with the markup rather than a different answer.
|
|
935
942
|
if (zoneName === 'rail')
|
|
936
|
-
return renderViewer(drawn.rail.document, {
|
|
943
|
+
return renderViewer(drawn.rail.document, {
|
|
944
|
+
projection: 'linear',
|
|
945
|
+
theme: theme(),
|
|
946
|
+
frame: false,
|
|
947
|
+
dockLegend: true,
|
|
948
|
+
detachFooter: true,
|
|
949
|
+
}).scene;
|
|
937
950
|
if (zoneName !== 'canvas')
|
|
938
951
|
return null;
|
|
939
952
|
if (current.canvas === 'tree')
|
|
940
|
-
return renderViewer(withoutChrome(drawn.viewer), { projection: 'tree', theme: theme(), chrome: false }).scene;
|
|
953
|
+
return renderViewer(withoutChrome(drawn.viewer), { projection: 'tree', theme: theme(), chrome: false, frame: false, dockLegend: true }).scene;
|
|
941
954
|
const ladder = scaleLadder(drawn.viewer, state.scale);
|
|
942
955
|
return ladder.tier === 'direct'
|
|
943
|
-
? renderViewer(ladder.canvas, { projection: 'graph', theme: theme(), chrome: false }).scene
|
|
956
|
+
? renderViewer(ladder.canvas, { projection: 'graph', theme: theme(), chrome: false, frame: false, dockLegend: true }).scene
|
|
944
957
|
: null;
|
|
945
958
|
};
|
|
946
959
|
/** The row or node that owns keyboard focus, if focus is on one at all. */
|
|
@@ -985,6 +998,29 @@ export function mountWorkspace(element, options) {
|
|
|
985
998
|
if (destroyed)
|
|
986
999
|
return;
|
|
987
1000
|
const snapshot = store.getSnapshot();
|
|
1001
|
+
// THE FIRST READ IS IN FLIGHT, SO THERE IS NOTHING TO SAY YET. Drawn over
|
|
1002
|
+
// the store's empty document, the workspace announced an empty backlog —
|
|
1003
|
+
// "no relationships yet", no rows — about issues nobody had read. The
|
|
1004
|
+
// placeholder holds the three zones' shape instead, and the first render
|
|
1005
|
+
// after the load replaces it.
|
|
1006
|
+
//
|
|
1007
|
+
// `hydrating` ONLY, NEVER `idle`. A store nobody has asked to load is not
|
|
1008
|
+
// loading, and a host that fills its store another way (or a test that
|
|
1009
|
+
// never hydrates) must still get the document it has. A REHYDRATE is not
|
|
1010
|
+
// this state either: the store keeps its last good document and stays
|
|
1011
|
+
// `ready`, so a refresh never blanks the surface.
|
|
1012
|
+
if (snapshot.status === 'hydrating') {
|
|
1013
|
+
const skeleton = renderWorkspaceSkeleton({
|
|
1014
|
+
label: current.words.loading,
|
|
1015
|
+
theme: current.theme === undefined ? undefined : theme(),
|
|
1016
|
+
themeSelector: current.themeSelector,
|
|
1017
|
+
});
|
|
1018
|
+
const skeletonSheet = [skeleton.styles, mountStylesheet].join('\n');
|
|
1019
|
+
if (styles.textContent !== skeletonSheet)
|
|
1020
|
+
styles.textContent = skeletonSheet;
|
|
1021
|
+
surface.innerHTML = skeleton.markup;
|
|
1022
|
+
return;
|
|
1023
|
+
}
|
|
988
1024
|
const document_ = landed();
|
|
989
1025
|
// WHAT THE STORE IS NOT SHOWING, computed before the reconcile rather than
|
|
990
1026
|
// beside the edges below, because the reconcile is the first reader of it:
|
|
@@ -1395,6 +1431,15 @@ export function mountWorkspace(element, options) {
|
|
|
1395
1431
|
selected: selectedKey(state.selection),
|
|
1396
1432
|
// The rail beside this canvas draws the panel's one header.
|
|
1397
1433
|
chrome: false,
|
|
1434
|
+
// THE WORKSPACE RULES ITS OWN ZONES OFF, so the viewer draws no
|
|
1435
|
+
// frame of its own here: the rail track carries `border-right`, the
|
|
1436
|
+
// canvas toolbar carries `border-bottom`, and a second edge one
|
|
1437
|
+
// pixel away reads as a doubled hairline. See `SceneOptions.frame`.
|
|
1438
|
+
frame: false,
|
|
1439
|
+
// §16b's KEY, KEPT IN VIEW. It explains every line and station on this
|
|
1440
|
+
// zone, and below a scroll it was the one thing a reader had to leave the
|
|
1441
|
+
// reading to reach. See `SceneOptions.dockLegend`.
|
|
1442
|
+
dockLegend: true,
|
|
1398
1443
|
}).markup;
|
|
1399
1444
|
// Re-inserted rather than re-rendered: the row is already assembled,
|
|
1400
1445
|
// and rebuilding it here would be a second place that decides what it
|
|
@@ -1407,6 +1452,13 @@ export function mountWorkspace(element, options) {
|
|
|
1407
1452
|
// emptied husk here left a sticky padded band with a border and no
|
|
1408
1453
|
// content over the tree. Reading the element rather than re-deriving
|
|
1409
1454
|
// the condition keeps the rule in one place.
|
|
1455
|
+
// THE TREE ALWAYS DRAWS A KEY, WHATEVER THE GRAPH'S TIER SAID. render.ts
|
|
1456
|
+
// set `data-canvas-legend` from the scale ladder, which is a fact about
|
|
1457
|
+
// the GRAPH — and this branch has just replaced the graph with a
|
|
1458
|
+
// projection that has no budget and no refusal. Left as it was, a tree
|
|
1459
|
+
// over a backlog past the node budget reported no key in this zone and
|
|
1460
|
+
// the rail drew a second one beside the one on screen.
|
|
1461
|
+
surface.firstElementChild?.setAttribute('data-canvas-legend', 'drawn');
|
|
1410
1462
|
if (isolated !== null)
|
|
1411
1463
|
canvas.append(isolated);
|
|
1412
1464
|
if (toolbar !== null && toolbar.childElementCount > 0)
|
|
@@ -1438,6 +1490,8 @@ export function mountWorkspace(element, options) {
|
|
|
1438
1490
|
const rail = zone('rail');
|
|
1439
1491
|
if (rail !== null)
|
|
1440
1492
|
rail.scrollTop = scrollTop;
|
|
1493
|
+
// AFTER the subtree is in place, because it measures what was just drawn.
|
|
1494
|
+
dockRailLegend();
|
|
1441
1495
|
// RE-QUERIED, NEVER REUSED: `surface.innerHTML` above replaced the subtree,
|
|
1442
1496
|
// so the element captured from is gone. A region that shrank clamps this on
|
|
1443
1497
|
// assignment, and one the redraw removed — the audit going clean — is
|
|
@@ -1524,10 +1578,11 @@ export function mountWorkspace(element, options) {
|
|
|
1524
1578
|
const rows = result.view.rail.rows;
|
|
1525
1579
|
const wanted = pendingFocus.key;
|
|
1526
1580
|
const at = rows.findIndex((slot) => wanted !== null && slot.members.includes(wanted));
|
|
1527
|
-
// THE ENDS ARE THE VIEWER'S ENDS. The
|
|
1528
|
-
//
|
|
1529
|
-
//
|
|
1530
|
-
// what the rail actually drew rather
|
|
1581
|
+
// THE ENDS ARE THE VIEWER'S ENDS. The rail draws the footer group — held
|
|
1582
|
+
// slots and exclusions — after the window at every scroll position, so
|
|
1583
|
+
// the last focusable row of the last window is a footer row when the
|
|
1584
|
+
// document has any; read the ends off what the rail actually drew rather
|
|
1585
|
+
// than off the window's rows alone.
|
|
1531
1586
|
const drawnKeys = [...(rail?.querySelectorAll(`[${KEY_ATTRIBUTE}][tabindex]`) ?? [])].map((row) => row.getAttribute(KEY_ATTRIBUTE));
|
|
1532
1587
|
const target = pendingFocus.kind === 'first' ? (drawnKeys[0] ?? rows[0]?.lead)
|
|
1533
1588
|
: pendingFocus.kind === 'last' ? (drawnKeys[drawnKeys.length - 1] ?? rows[rows.length - 1]?.lead)
|
|
@@ -1876,6 +1931,49 @@ export function mountWorkspace(element, options) {
|
|
|
1876
1931
|
const onCompositionEnd = (event) => {
|
|
1877
1932
|
readInput(event);
|
|
1878
1933
|
};
|
|
1934
|
+
/**
|
|
1935
|
+
* Move the rail's docked legend clear of this zone's own footer.
|
|
1936
|
+
*
|
|
1937
|
+
* TWO THINGS ARE PINNED TO ONE EDGE, AND ONLY THIS PACKAGE KNOWS BOTH. The
|
|
1938
|
+
* viewer docks its legend against the bottom of whatever scrollport it was
|
|
1939
|
+
* given (`SceneOptions.dockLegend`), with `bottom: 0` as the default; this
|
|
1940
|
+
* zone already holds `.ig-rail-footer` there. Left at the default the two
|
|
1941
|
+
* stack in the same place, and the footer — later in the subtree and carrying
|
|
1942
|
+
* its own layer — paints over the bottom of the key. The viewer cannot fix
|
|
1943
|
+
* that: it has never been told the footer exists.
|
|
1944
|
+
*
|
|
1945
|
+
* MEASURED, NOT DERIVED FROM THE TOKENS. The footer is one line of type at a
|
|
1946
|
+
* known size inside known padding, so its height looks like something the
|
|
1947
|
+
* stylesheet could state — and then the rail narrows, `5 with no
|
|
1948
|
+
* relationships` and its control wrap to two lines, and the written-down
|
|
1949
|
+
* number is quietly wrong by a line. The same argument `onScroll` makes about
|
|
1950
|
+
* the header it measures rather than derives.
|
|
1951
|
+
*
|
|
1952
|
+
* ON EVERY REDRAW AND ON EVERY RESIZE, because the wrap depends on the width
|
|
1953
|
+
* and a resize alone redraws nothing. The observer is guarded on the
|
|
1954
|
+
* constructor rather than assumed: this module renders into whatever document
|
|
1955
|
+
* a host hands it, and a host rendering server-side or in a minimal DOM has
|
|
1956
|
+
* no need of the correction — the default is simply left in place.
|
|
1957
|
+
*/
|
|
1958
|
+
const dockRailLegend = () => {
|
|
1959
|
+
const rail = zone('rail');
|
|
1960
|
+
const legend = rail?.querySelector('.ig-viewer > .ig-legend');
|
|
1961
|
+
if (rail === null || legend == null)
|
|
1962
|
+
return;
|
|
1963
|
+
const footer = rail.querySelector('.ig-rail-footer');
|
|
1964
|
+
// RE-OBSERVED EVERY REDRAW, because `surface.innerHTML` replaced the zone and
|
|
1965
|
+
// the element the last call watched is gone. `disconnect` first so the
|
|
1966
|
+
// observer never accumulates dead targets.
|
|
1967
|
+
if (railResize !== null) {
|
|
1968
|
+
railResize.disconnect();
|
|
1969
|
+
railResize.observe(rail);
|
|
1970
|
+
}
|
|
1971
|
+
const clearance = footer === null ? 0 : Math.ceil(footer.getBoundingClientRect().height);
|
|
1972
|
+
// AN INLINE STYLE, because it is a measurement rather than a rule: it is
|
|
1973
|
+
// true of this rail at this width and of nothing else, which is exactly what
|
|
1974
|
+
// a stylesheet cannot say.
|
|
1975
|
+
legend.style.bottom = `${String(clearance)}px`;
|
|
1976
|
+
};
|
|
1879
1977
|
const onScroll = (event) => {
|
|
1880
1978
|
const rail = zone('rail');
|
|
1881
1979
|
if (rail === null || event.target !== rail)
|
|
@@ -1893,8 +1991,12 @@ export function mountWorkspace(element, options) {
|
|
|
1893
1991
|
// host running dozens of jobs does not scroll the window past ranks the
|
|
1894
1992
|
// reader has not reached. Measured, not derived from the theme: the header
|
|
1895
1993
|
// wraps, and a wrapped header is taller than any constant would say.
|
|
1896
|
-
|
|
1897
|
-
|
|
1994
|
+
// THE PANEL'S ROOT, NOT THE DETACHED FOOTER'S WRAPPER. Both carry
|
|
1995
|
+
// `.ig-viewer` — the group's styles hang off that class — and the wrapper
|
|
1996
|
+
// holds an `.ig-list` of its own; document order makes the root win today,
|
|
1997
|
+
// and the attribute makes it win on purpose. See `SceneOptions.detachFooter`.
|
|
1998
|
+
const rows = rail.querySelector('.ig-viewer:not([data-ig-detached]) .ig-list');
|
|
1999
|
+
const viewer = rail.querySelector('.ig-viewer:not([data-ig-detached])');
|
|
1898
2000
|
const chrome = rows === null || viewer === null
|
|
1899
2001
|
? 0
|
|
1900
2002
|
: rows.getBoundingClientRect().top - viewer.getBoundingClientRect().top;
|
|
@@ -2058,12 +2160,12 @@ export function mountWorkspace(element, options) {
|
|
|
2058
2160
|
/**
|
|
2059
2161
|
* The rail's window edge, decided BEFORE the viewer is asked.
|
|
2060
2162
|
*
|
|
2061
|
-
* The viewer draws the
|
|
2062
|
-
* focus order runs from the last drawn
|
|
2063
|
-
* ending there — from the viewer's side the window is
|
|
2064
|
-
* The window is the mount's, so the mount decides first:
|
|
2065
|
-
*
|
|
2066
|
-
*
|
|
2163
|
+
* The viewer draws the footer group — held slots and exclusions — after
|
|
2164
|
+
* every window, so its scene's focus order runs from the last drawn row into
|
|
2165
|
+
* the footer rather than ending there — from the viewer's side the window is
|
|
2166
|
+
* the whole document. The window is the mount's, so the mount decides first:
|
|
2167
|
+
* on the last drawn row, ArrowDown and End re-cut the window rather than
|
|
2168
|
+
* stepping into the footer; on the first, ArrowUp and Home re-cut it upward. Anything
|
|
2067
2169
|
* inside the window, and every other key, is the viewer's to answer.
|
|
2068
2170
|
*/
|
|
2069
2171
|
const advanceRail = (rail, key, pressedKey) => {
|
|
@@ -2629,10 +2731,23 @@ export function mountWorkspace(element, options) {
|
|
|
2629
2731
|
element.addEventListener('lostpointercapture', onPointerCancel);
|
|
2630
2732
|
doc.addEventListener('pointerup', onDocumentPointerUp);
|
|
2631
2733
|
doc.addEventListener('pointercancel', onDocumentPointerUp);
|
|
2734
|
+
/**
|
|
2735
|
+
* The rail's own width, watched only so the docked legend's clearance stays
|
|
2736
|
+
* true. See `dockRailLegend` for why a resize and not just a redraw.
|
|
2737
|
+
*
|
|
2738
|
+
* THE ELEMENT, NOT THE WINDOW. A package that reads the window cannot be
|
|
2739
|
+
* dropped into someone else's page — the same rule §17j states about the
|
|
2740
|
+
* density crossover and the workspace's own container query rests on. The
|
|
2741
|
+
* rail can narrow because the host resized, because a sibling grew, or
|
|
2742
|
+
* because a container query re-tracked the grid, and only the box itself sees
|
|
2743
|
+
* all three.
|
|
2744
|
+
*/
|
|
2745
|
+
const railResize = typeof ResizeObserver === 'function' ? new ResizeObserver(() => { dockRailLegend(); }) : null;
|
|
2632
2746
|
const unsubscribe = store.subscribe(schedule);
|
|
2633
2747
|
/** Every listener off and every node this mount built removed. Shared by `destroy` and a failed first render. */
|
|
2634
2748
|
const teardown = () => {
|
|
2635
2749
|
unsubscribe();
|
|
2750
|
+
railResize?.disconnect();
|
|
2636
2751
|
element.removeEventListener('click', onClick);
|
|
2637
2752
|
element.removeEventListener('input', onInput);
|
|
2638
2753
|
element.removeEventListener('compositionend', onCompositionEnd);
|