@kgdiff/viewer 0.5.0 → 0.6.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 +43 -16
- package/custom-elements.json +2347 -0
- package/dist/bind.d.ts +41 -0
- package/dist/bind.d.ts.map +1 -0
- package/dist/bind.js +47 -0
- package/dist/bind.js.map +1 -0
- package/dist/controller.d.ts +22 -74
- package/dist/controller.d.ts.map +1 -1
- package/dist/controller.js +35 -376
- package/dist/controller.js.map +1 -1
- package/dist/dom.d.ts +10 -0
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +29 -0
- package/dist/dom.js.map +1 -1
- package/dist/element.d.ts +52 -46
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +362 -403
- package/dist/element.js.map +1 -1
- package/dist/elements/actions.d.ts +27 -0
- package/dist/elements/actions.d.ts.map +1 -0
- package/dist/elements/actions.js +81 -0
- package/dist/elements/actions.js.map +1 -0
- package/dist/elements/bound.d.ts +63 -0
- package/dist/elements/bound.d.ts.map +1 -0
- package/dist/elements/bound.js +213 -0
- package/dist/elements/bound.js.map +1 -0
- package/dist/elements/change-detail.d.ts +25 -0
- package/dist/elements/change-detail.d.ts.map +1 -0
- package/dist/elements/change-detail.js +19 -0
- package/dist/elements/change-detail.js.map +1 -0
- package/dist/elements/change-list.d.ts +27 -0
- package/dist/elements/change-list.d.ts.map +1 -0
- package/dist/elements/change-list.js +29 -0
- package/dist/elements/change-list.js.map +1 -0
- package/dist/elements/filters.d.ts +25 -0
- package/dist/elements/filters.d.ts.map +1 -0
- package/dist/elements/filters.js +19 -0
- package/dist/elements/filters.js.map +1 -0
- package/dist/elements/legend.d.ts +40 -0
- package/dist/elements/legend.d.ts.map +1 -0
- package/dist/elements/legend.js +87 -0
- package/dist/elements/legend.js.map +1 -0
- package/dist/elements/minimap.d.ts +38 -0
- package/dist/elements/minimap.d.ts.map +1 -0
- package/dist/elements/minimap.js +59 -0
- package/dist/elements/minimap.js.map +1 -0
- package/dist/elements/root.d.ts +40 -0
- package/dist/elements/root.d.ts.map +1 -0
- package/dist/elements/root.js +67 -0
- package/dist/elements/root.js.map +1 -0
- package/dist/elements/search.d.ts +29 -0
- package/dist/elements/search.d.ts.map +1 -0
- package/dist/elements/search.js +23 -0
- package/dist/elements/search.js.map +1 -0
- package/dist/elements/stage-context.d.ts +31 -0
- package/dist/elements/stage-context.d.ts.map +1 -0
- package/dist/elements/stage-context.js +4 -0
- package/dist/elements/stage-context.js.map +1 -0
- package/dist/elements/stage.d.ts +65 -0
- package/dist/elements/stage.d.ts.map +1 -0
- package/dist/elements/stage.js +259 -0
- package/dist/elements/stage.js.map +1 -0
- package/dist/elements/title.d.ts +25 -0
- package/dist/elements/title.d.ts.map +1 -0
- package/dist/elements/title.js +19 -0
- package/dist/elements/title.js.map +1 -0
- package/dist/elements/transport.d.ts +29 -0
- package/dist/elements/transport.d.ts.map +1 -0
- package/dist/elements/transport.js +24 -0
- package/dist/elements/transport.js.map +1 -0
- package/dist/elements/view-bound.d.ts +39 -0
- package/dist/elements/view-bound.d.ts.map +1 -0
- package/dist/elements/view-bound.js +88 -0
- package/dist/elements/view-bound.js.map +1 -0
- package/dist/elements/view-dock.d.ts +28 -0
- package/dist/elements/view-dock.d.ts.map +1 -0
- package/dist/elements/view-dock.js +28 -0
- package/dist/elements/view-dock.js.map +1 -0
- package/dist/elements/zoom.d.ts +28 -0
- package/dist/elements/zoom.d.ts.map +1 -0
- package/dist/elements/zoom.js +22 -0
- package/dist/elements/zoom.js.map +1 -0
- package/dist/i18n.d.ts +10 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +20 -0
- package/dist/i18n.js.map +1 -1
- package/dist/icons.d.ts +1 -0
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +1 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.d.ts +328 -34
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/keyboard.d.ts +39 -2
- package/dist/keyboard.d.ts.map +1 -1
- package/dist/keyboard.js +145 -62
- package/dist/keyboard.js.map +1 -1
- package/dist/layout-store.d.ts +26 -0
- package/dist/layout-store.d.ts.map +1 -0
- package/dist/layout-store.js +46 -0
- package/dist/layout-store.js.map +1 -0
- package/dist/panel-levels.d.ts +18 -0
- package/dist/panel-levels.d.ts.map +1 -0
- package/dist/panel-levels.js +41 -0
- package/dist/panel-levels.js.map +1 -0
- package/dist/panels.d.ts +28 -0
- package/dist/panels.d.ts.map +1 -0
- package/dist/panels.js +73 -0
- package/dist/panels.js.map +1 -0
- package/dist/prefs.d.ts +5 -2
- package/dist/prefs.d.ts.map +1 -1
- package/dist/prefs.js +12 -3
- package/dist/prefs.js.map +1 -1
- package/dist/react.d.ts +460 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +2 -0
- package/dist/react.js.map +1 -0
- package/dist/root-element.d.ts +122 -0
- package/dist/root-element.d.ts.map +1 -0
- package/dist/root-element.js +541 -0
- package/dist/root-element.js.map +1 -0
- package/dist/root.d.ts +30 -30
- package/dist/root.d.ts.map +1 -1
- package/dist/root.js +65 -42
- package/dist/root.js.map +1 -1
- package/dist/session.d.ts +19 -3
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +15 -17
- package/dist/session.js.map +1 -1
- package/dist/standalone/kgdiff-viewer.js +4 -4
- package/dist/styles.d.ts +4 -0
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +224 -84
- package/dist/styles.js.map +1 -1
- package/dist/theme.d.ts +7 -0
- package/dist/theme.d.ts.map +1 -1
- package/dist/theme.js +10 -7
- package/dist/theme.js.map +1 -1
- package/dist/topics.d.ts +8 -0
- package/dist/topics.d.ts.map +1 -0
- package/dist/topics.js +18 -0
- package/dist/topics.js.map +1 -0
- package/dist/ui/change-list.d.ts.map +1 -1
- package/dist/ui/change-list.js +2 -2
- package/dist/ui/change-list.js.map +1 -1
- package/dist/ui/context.d.ts +20 -7
- package/dist/ui/context.d.ts.map +1 -1
- package/dist/ui/context.js.map +1 -1
- package/dist/ui/header.d.ts +41 -3
- package/dist/ui/header.d.ts.map +1 -1
- package/dist/ui/header.js +99 -34
- package/dist/ui/header.js.map +1 -1
- package/dist/ui/legend.d.ts +15 -0
- package/dist/ui/legend.d.ts.map +1 -0
- package/dist/ui/legend.js +68 -0
- package/dist/ui/legend.js.map +1 -0
- package/dist/ui/popovers.d.ts +3 -1
- package/dist/ui/popovers.d.ts.map +1 -1
- package/dist/ui/popovers.js +62 -23
- package/dist/ui/popovers.js.map +1 -1
- package/dist/ui/search.d.ts.map +1 -1
- package/dist/ui/search.js +3 -2
- package/dist/ui/search.js.map +1 -1
- package/dist/ui/sidebar.d.ts +26 -3
- package/dist/ui/sidebar.d.ts.map +1 -1
- package/dist/ui/sidebar.js +344 -12
- package/dist/ui/sidebar.js.map +1 -1
- package/dist/ui/stage.d.ts +56 -1
- package/dist/ui/stage.d.ts.map +1 -1
- package/dist/ui/stage.js +244 -256
- package/dist/ui/stage.js.map +1 -1
- package/dist/ui/transport.d.ts +12 -0
- package/dist/ui/transport.d.ts.map +1 -0
- package/dist/ui/transport.js +198 -0
- package/dist/ui/transport.js.map +1 -0
- package/dist/ui/zoom.d.ts +15 -0
- package/dist/ui/zoom.d.ts.map +1 -0
- package/dist/ui/zoom.js +30 -0
- package/dist/ui/zoom.js.map +1 -0
- package/dist/view.d.ts +94 -0
- package/dist/view.d.ts.map +1 -0
- package/dist/view.js +441 -0
- package/dist/view.js.map +1 -0
- package/package.json +95 -12
- package/src/bind.ts +80 -0
- package/src/controller.ts +51 -442
- package/src/dom.ts +30 -0
- package/src/element.ts +364 -406
- package/src/elements/actions.ts +94 -0
- package/src/elements/bound.ts +247 -0
- package/src/elements/change-detail.ts +34 -0
- package/src/elements/change-list.ts +51 -0
- package/src/elements/filters.ts +34 -0
- package/src/elements/legend.ts +103 -0
- package/src/elements/minimap.ts +75 -0
- package/src/elements/root.ts +86 -0
- package/src/elements/search.ts +38 -0
- package/src/elements/stage-context.ts +34 -0
- package/src/elements/stage.ts +285 -0
- package/src/elements/title.ts +34 -0
- package/src/elements/transport.ts +39 -0
- package/src/elements/view-bound.ts +118 -0
- package/src/elements/view-dock.ts +43 -0
- package/src/elements/zoom.ts +38 -0
- package/src/i18n.ts +20 -0
- package/src/icons.ts +1 -0
- package/src/index.ts +347 -34
- package/src/keyboard.ts +188 -61
- package/src/layout-store.ts +71 -0
- package/src/panel-levels.ts +53 -0
- package/src/panels.ts +81 -0
- package/src/prefs.ts +12 -4
- package/src/react.ts +459 -0
- package/src/root-element.ts +624 -0
- package/src/root.ts +92 -65
- package/src/session.ts +22 -33
- package/src/styles.ts +245 -84
- package/src/theme.ts +10 -7
- package/src/topics.ts +37 -0
- package/src/ui/change-list.ts +6 -2
- package/src/ui/context.ts +20 -7
- package/src/ui/header.ts +127 -56
- package/src/ui/legend.ts +112 -0
- package/src/ui/popovers.ts +68 -25
- package/src/ui/search.ts +10 -5
- package/src/ui/sidebar.ts +386 -23
- package/src/ui/stage.ts +267 -331
- package/src/ui/transport.ts +240 -0
- package/src/ui/zoom.ts +45 -0
- package/src/view.ts +516 -0
- package/vscode.html-custom-data.json +726 -0
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `<kgdiff-viewer>` (the default layout) and `<kgdiff-root>` share (RFC 0001 §2–§5): an
|
|
3
|
+
* element that is a root. It owns the session (`ViewerRoot`) and provides it to the regions and
|
|
4
|
+
* elements bound to it, and carries everything about the session the host sets or reads: the
|
|
5
|
+
* preferences as attributes and properties, the payload, the public methods, the events, the
|
|
6
|
+
* keyboard map and its scope, deep links and the hover hold of a looping replay.
|
|
7
|
+
*/
|
|
8
|
+
import { KgdiffError } from '@kgdiff/core';
|
|
9
|
+
import { formatHash, parseHash } from './hash-sync.js';
|
|
10
|
+
import { detectLocale, translate, translator } from './i18n.js';
|
|
11
|
+
import { toKeymap } from './keyboard.js';
|
|
12
|
+
import { assertPayload } from './payload.js';
|
|
13
|
+
import { DEFAULT_LOOP_DELAY, LEGACY_CHANGES_MODE, sanitizeView, toDelay, toLocale, toMode, toPalette, toScope, toTheme, } from './prefs.js';
|
|
14
|
+
import { isRoot, ViewerRoot, wasForwarded } from './root.js';
|
|
15
|
+
import { ALL_TOPICS, } from './session.js';
|
|
16
|
+
/** Attributes every root observes. */
|
|
17
|
+
export const ROOT_ATTRIBUTES = [
|
|
18
|
+
'mode',
|
|
19
|
+
'scope',
|
|
20
|
+
'theme',
|
|
21
|
+
'palette',
|
|
22
|
+
'locale',
|
|
23
|
+
'sync-hash',
|
|
24
|
+
'loop',
|
|
25
|
+
'loop-delay',
|
|
26
|
+
'pause-on-hover',
|
|
27
|
+
'shortcuts',
|
|
28
|
+
'keymap',
|
|
29
|
+
];
|
|
30
|
+
const SCOPES = ['scoped', 'global', 'none'];
|
|
31
|
+
/** Properties a page may set before the element is defined (they shadow the accessors). */
|
|
32
|
+
const UPGRADED = [
|
|
33
|
+
'mode',
|
|
34
|
+
'scope',
|
|
35
|
+
'theme',
|
|
36
|
+
'palette',
|
|
37
|
+
'locale',
|
|
38
|
+
'loop',
|
|
39
|
+
'loopDelay',
|
|
40
|
+
'pauseOnHover',
|
|
41
|
+
'payload',
|
|
42
|
+
'shortcuts',
|
|
43
|
+
'keymap',
|
|
44
|
+
];
|
|
45
|
+
/** Keys the page itself scrolls with: never taken at document level. */
|
|
46
|
+
const PAGE_KEYS = new Set([
|
|
47
|
+
'ArrowUp',
|
|
48
|
+
'ArrowDown',
|
|
49
|
+
'ArrowLeft',
|
|
50
|
+
'ArrowRight',
|
|
51
|
+
'Home',
|
|
52
|
+
'End',
|
|
53
|
+
'PageUp',
|
|
54
|
+
'PageDown',
|
|
55
|
+
' ',
|
|
56
|
+
'Spacebar',
|
|
57
|
+
]);
|
|
58
|
+
/** Connected roots, in connection order (`global-shortcuts` goes to the first opted-in one). */
|
|
59
|
+
const connected = [];
|
|
60
|
+
function deepFreeze(value) {
|
|
61
|
+
if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {
|
|
62
|
+
for (const v of Object.values(value))
|
|
63
|
+
deepFreeze(v);
|
|
64
|
+
Object.freeze(value);
|
|
65
|
+
}
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* @attr {boolean} sync-hash - Keep the selection, mode and scope in the page's URL hash
|
|
70
|
+
* (`#kgdiff=hunk:<id>;mode:<mode>;scope:<scope>`) and follow it: deep links.
|
|
71
|
+
* @attr {boolean} global-shortcuts - The same as `shortcuts="global"`.
|
|
72
|
+
*/
|
|
73
|
+
export class RootElement extends HTMLElement {
|
|
74
|
+
/** @internal */
|
|
75
|
+
controller;
|
|
76
|
+
/** @internal The root: session, keyboard map, live region, events, tokens. */
|
|
77
|
+
root;
|
|
78
|
+
shadow;
|
|
79
|
+
#currentPayload = null;
|
|
80
|
+
#reflecting = false;
|
|
81
|
+
#cleanup = [];
|
|
82
|
+
#lastHash = '';
|
|
83
|
+
#upgraded = false;
|
|
84
|
+
/** A mouse or pen rests on the graph (holds a looping replay with `pause-on-hover`). */
|
|
85
|
+
#pointerOver = false;
|
|
86
|
+
constructor() {
|
|
87
|
+
super();
|
|
88
|
+
this.shadow = this.attachShadow({ mode: 'open' });
|
|
89
|
+
this.root = new ViewerRoot(this, this.shadow, this.actions(), (type) => {
|
|
90
|
+
if (type === 'kgdiff-select' || type === 'kgdiff-mode')
|
|
91
|
+
this.#writeHash();
|
|
92
|
+
}, {
|
|
93
|
+
session: (host, deps) => this.createSession(host, deps),
|
|
94
|
+
sheets: (doc) => this.sheets(doc),
|
|
95
|
+
key: (e) => this.#key(e),
|
|
96
|
+
hover: (over) => this.pointerOver(over),
|
|
97
|
+
});
|
|
98
|
+
this.controller = this.root.controller;
|
|
99
|
+
this.controller.locale = toLocale(this.getAttribute('locale')) ?? detectLocale();
|
|
100
|
+
}
|
|
101
|
+
/** An observed attribute that is not a root attribute changed (from `_old`). */
|
|
102
|
+
attributeChanged(_name, _value, _old) { }
|
|
103
|
+
/** Properties of the subclass a page may set before the element is defined. */
|
|
104
|
+
upgradedProperties() {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
/** Whether keys do anything at all (`chrome="none"` turns them off in the default layout). */
|
|
108
|
+
keysEnabled() {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/** A key reached the root: return true when the layout took it (an open popover). */
|
|
112
|
+
interceptKey(_e) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
// ─── Lifecycle ────────────────────────────────────────────────────────────
|
|
116
|
+
connectedCallback() {
|
|
117
|
+
if (!this.#upgraded) {
|
|
118
|
+
this.#upgraded = true;
|
|
119
|
+
// Properties set before the element was defined shadow the accessors: re-apply them.
|
|
120
|
+
for (const prop of [...UPGRADED, ...this.upgradedProperties()]) {
|
|
121
|
+
if (Object.hasOwn(this, prop)) {
|
|
122
|
+
const value = this[prop];
|
|
123
|
+
delete this[prop];
|
|
124
|
+
this[prop] = value;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Provide the session (the regions bind to it) and follow the system's preferences.
|
|
129
|
+
this.#cleanup.push(this.root.connect());
|
|
130
|
+
this.connected();
|
|
131
|
+
connected.push(this);
|
|
132
|
+
const onKey = (e) => this.#onKeyDown(e);
|
|
133
|
+
document.addEventListener('keydown', onKey);
|
|
134
|
+
this.#cleanup.push(() => document.removeEventListener('keydown', onKey));
|
|
135
|
+
const onHash = () => this.#readHash();
|
|
136
|
+
window.addEventListener('hashchange', onHash);
|
|
137
|
+
this.#cleanup.push(() => window.removeEventListener('hashchange', onHash));
|
|
138
|
+
this.#readHash();
|
|
139
|
+
this.root.render(ALL_TOPICS);
|
|
140
|
+
}
|
|
141
|
+
disconnectedCallback() {
|
|
142
|
+
const i = connected.indexOf(this);
|
|
143
|
+
if (i >= 0)
|
|
144
|
+
connected.splice(i, 1);
|
|
145
|
+
for (const fn of this.#cleanup.splice(0))
|
|
146
|
+
fn();
|
|
147
|
+
this.disconnected();
|
|
148
|
+
// Moved while hovered: no pointerleave follows.
|
|
149
|
+
this.#pointerOver = false;
|
|
150
|
+
this.#applyHold();
|
|
151
|
+
}
|
|
152
|
+
attributeChangedCallback(name, old, value) {
|
|
153
|
+
if (this.#reflecting)
|
|
154
|
+
return;
|
|
155
|
+
switch (name) {
|
|
156
|
+
case 'mode':
|
|
157
|
+
case 'scope':
|
|
158
|
+
case 'theme':
|
|
159
|
+
case 'palette':
|
|
160
|
+
case 'locale':
|
|
161
|
+
this.applyPreference(name, value, false);
|
|
162
|
+
break;
|
|
163
|
+
case 'sync-hash':
|
|
164
|
+
if (value !== null)
|
|
165
|
+
this.#readHash();
|
|
166
|
+
break;
|
|
167
|
+
case 'loop':
|
|
168
|
+
case 'loop-delay':
|
|
169
|
+
this.controller.setLoop(this.loop ? this.loopDelay : null);
|
|
170
|
+
this.#applyHold();
|
|
171
|
+
break;
|
|
172
|
+
case 'pause-on-hover':
|
|
173
|
+
this.#applyHold();
|
|
174
|
+
break;
|
|
175
|
+
case 'shortcuts':
|
|
176
|
+
this.root.shortcutsOff = this.shortcuts === 'none';
|
|
177
|
+
break;
|
|
178
|
+
case 'keymap':
|
|
179
|
+
this.#setKeymap(value);
|
|
180
|
+
break;
|
|
181
|
+
default:
|
|
182
|
+
this.attributeChanged(name, value, old);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Apply a preference from an attribute or a property. Valid values are explicit (a report's
|
|
187
|
+
* `view` does not override them); invalid ones fall back to the default (`overlay`, `all`,
|
|
188
|
+
* `auto`, `default`, the browser's language). Properties reflect the normalized value; the
|
|
189
|
+
* legacy mode `changes` reflects as `overlay` + scope `changes`.
|
|
190
|
+
*/
|
|
191
|
+
applyPreference(name, raw, reflect) {
|
|
192
|
+
const c = this.controller;
|
|
193
|
+
// `mode="changes"` is rewritten to the attribute pair it stands for.
|
|
194
|
+
const legacy = name === 'mode' && raw === LEGACY_CHANGES_MODE;
|
|
195
|
+
let value;
|
|
196
|
+
switch (name) {
|
|
197
|
+
case 'mode': {
|
|
198
|
+
if (legacy) {
|
|
199
|
+
c.explicit.add('scope');
|
|
200
|
+
c.setView('overlay', 'changes');
|
|
201
|
+
value = 'overlay';
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
const v = toMode(raw);
|
|
205
|
+
c.setMode(v ?? 'overlay');
|
|
206
|
+
value = v;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case 'scope': {
|
|
210
|
+
const v = toScope(raw);
|
|
211
|
+
c.setScope(v ?? 'all');
|
|
212
|
+
// A locked scope stays `changes`: the attribute says what is shown.
|
|
213
|
+
value = v === null ? null : c.scope;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case 'theme': {
|
|
217
|
+
const v = toTheme(raw);
|
|
218
|
+
c.setThemePreference(v ?? 'auto');
|
|
219
|
+
value = v;
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case 'palette': {
|
|
223
|
+
const v = toPalette(raw);
|
|
224
|
+
c.setPalette(v ?? 'default');
|
|
225
|
+
value = v;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
case 'locale': {
|
|
229
|
+
const v = toLocale(raw);
|
|
230
|
+
c.setLocale(v ?? detectLocale());
|
|
231
|
+
value = v;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
default:
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (value === null)
|
|
238
|
+
c.explicit.delete(name);
|
|
239
|
+
else
|
|
240
|
+
c.explicit.add(name);
|
|
241
|
+
if (reflect || legacy)
|
|
242
|
+
this.reflect(name, value);
|
|
243
|
+
if (legacy)
|
|
244
|
+
this.reflect('scope', c.scope);
|
|
245
|
+
}
|
|
246
|
+
// ─── Properties ───────────────────────────────────────────────────────────
|
|
247
|
+
get mode() {
|
|
248
|
+
return this.controller.mode;
|
|
249
|
+
}
|
|
250
|
+
set mode(value) {
|
|
251
|
+
this.applyPreference('mode', value, true);
|
|
252
|
+
}
|
|
253
|
+
get scope() {
|
|
254
|
+
return this.controller.scope;
|
|
255
|
+
}
|
|
256
|
+
set scope(value) {
|
|
257
|
+
this.applyPreference('scope', value, true);
|
|
258
|
+
}
|
|
259
|
+
get theme() {
|
|
260
|
+
return this.controller.themePreference;
|
|
261
|
+
}
|
|
262
|
+
set theme(value) {
|
|
263
|
+
this.applyPreference('theme', value, true);
|
|
264
|
+
}
|
|
265
|
+
get palette() {
|
|
266
|
+
return this.controller.palette;
|
|
267
|
+
}
|
|
268
|
+
set palette(value) {
|
|
269
|
+
this.applyPreference('palette', value, true);
|
|
270
|
+
}
|
|
271
|
+
get locale() {
|
|
272
|
+
return this.controller.locale;
|
|
273
|
+
}
|
|
274
|
+
set locale(value) {
|
|
275
|
+
this.applyPreference('locale', value, true);
|
|
276
|
+
}
|
|
277
|
+
get loop() {
|
|
278
|
+
return this.hasAttribute('loop');
|
|
279
|
+
}
|
|
280
|
+
set loop(value) {
|
|
281
|
+
this.toggleAttribute('loop', Boolean(value));
|
|
282
|
+
}
|
|
283
|
+
get loopDelay() {
|
|
284
|
+
return toDelay(this.getAttribute('loop-delay')) ?? DEFAULT_LOOP_DELAY;
|
|
285
|
+
}
|
|
286
|
+
set loopDelay(value) {
|
|
287
|
+
const v = toDelay(value);
|
|
288
|
+
if (v === null)
|
|
289
|
+
this.removeAttribute('loop-delay');
|
|
290
|
+
else
|
|
291
|
+
this.setAttribute('loop-delay', String(v));
|
|
292
|
+
}
|
|
293
|
+
get pauseOnHover() {
|
|
294
|
+
return this.getAttribute('pause-on-hover') !== 'false';
|
|
295
|
+
}
|
|
296
|
+
set pauseOnHover(value) {
|
|
297
|
+
if (value)
|
|
298
|
+
this.removeAttribute('pause-on-hover');
|
|
299
|
+
else
|
|
300
|
+
this.setAttribute('pause-on-hover', 'false');
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Where the keyboard shortcuts apply. `scoped` (the default): while focus is inside the root
|
|
304
|
+
* (keys of elements bound with `for` are forwarded to it). `global`: also when nothing on the
|
|
305
|
+
* page has focus, for the first such root, except the keys pages scroll with; the boolean
|
|
306
|
+
* `global-shortcuts` attribute is an alias. `none`: no shortcuts (a focused change list keeps
|
|
307
|
+
* its arrow keys).
|
|
308
|
+
*/
|
|
309
|
+
get shortcuts() {
|
|
310
|
+
const v = this.getAttribute('shortcuts');
|
|
311
|
+
if (v !== null && SCOPES.includes(v))
|
|
312
|
+
return v;
|
|
313
|
+
return this.hasAttribute('global-shortcuts') ? 'global' : 'scoped';
|
|
314
|
+
}
|
|
315
|
+
set shortcuts(value) {
|
|
316
|
+
if (SCOPES.includes(value))
|
|
317
|
+
this.setAttribute('shortcuts', value);
|
|
318
|
+
else
|
|
319
|
+
this.removeAttribute('shortcuts');
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Keys bound to other shortcuts, or unbound with null: `{ x: null, r: 'review' }`, or as the
|
|
323
|
+
* `keymap` attribute `"x:none r:review"`. Keys not named keep the default map.
|
|
324
|
+
*/
|
|
325
|
+
get keymap() {
|
|
326
|
+
return this.root.keymap;
|
|
327
|
+
}
|
|
328
|
+
set keymap(value) {
|
|
329
|
+
this.#setKeymap(value);
|
|
330
|
+
}
|
|
331
|
+
#setKeymap(value) {
|
|
332
|
+
const { keymap, invalid } = toKeymap(value);
|
|
333
|
+
if (invalid.length > 0)
|
|
334
|
+
console.warn(`[kgdiff] ignoring invalid keymap: ${invalid.join(' ')}`);
|
|
335
|
+
this.root.keymap = keymap;
|
|
336
|
+
}
|
|
337
|
+
get payload() {
|
|
338
|
+
return this.#currentPayload;
|
|
339
|
+
}
|
|
340
|
+
set payload(value) {
|
|
341
|
+
this.#currentPayload = value;
|
|
342
|
+
if (value === null || value === undefined)
|
|
343
|
+
return;
|
|
344
|
+
let payload;
|
|
345
|
+
try {
|
|
346
|
+
payload = assertPayload(value);
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
this.controller.fail(error);
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
// The report's theme, palette and language apply at once (the loading steps show in
|
|
353
|
+
// them), unless the host or the user chose (validated, and warned about, when it loads).
|
|
354
|
+
const view = sanitizeView(payload.view, true);
|
|
355
|
+
const c = this.controller;
|
|
356
|
+
if (view?.theme && !c.explicit.has('theme'))
|
|
357
|
+
c.setThemePreference(view.theme);
|
|
358
|
+
if (view?.palette && !c.explicit.has('palette'))
|
|
359
|
+
c.setPalette(view.palette);
|
|
360
|
+
if (view?.locale && !c.explicit.has('locale'))
|
|
361
|
+
c.setLocale(view.locale);
|
|
362
|
+
this.payloadSet(payload);
|
|
363
|
+
this.controller.loadPayload(payload).catch(() => {
|
|
364
|
+
// Already surfaced: error state + `kgdiff-error`.
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
/** A valid payload was set, before it loads. */
|
|
368
|
+
payloadSet(_payload) { }
|
|
369
|
+
// ─── Methods ──────────────────────────────────────────────────────────────
|
|
370
|
+
load(options) {
|
|
371
|
+
this.#currentPayload = null;
|
|
372
|
+
return this.controller.load(options);
|
|
373
|
+
}
|
|
374
|
+
selectHunk(id) {
|
|
375
|
+
this.controller.selectHunkById(id, { fly: true });
|
|
376
|
+
}
|
|
377
|
+
next() {
|
|
378
|
+
this.controller.next();
|
|
379
|
+
}
|
|
380
|
+
prev() {
|
|
381
|
+
this.controller.prev();
|
|
382
|
+
}
|
|
383
|
+
play() {
|
|
384
|
+
this.controller.play();
|
|
385
|
+
}
|
|
386
|
+
pause() {
|
|
387
|
+
this.controller.pause();
|
|
388
|
+
}
|
|
389
|
+
fit(options) {
|
|
390
|
+
return this.controller.fit(options);
|
|
391
|
+
}
|
|
392
|
+
exportDelta() {
|
|
393
|
+
const diff = this.controller.diff;
|
|
394
|
+
if (!diff)
|
|
395
|
+
throw new KgdiffError('invalid-input', translate('en', 'error.notLoaded'));
|
|
396
|
+
// A copy: callers can never mutate the diff the viewer shows.
|
|
397
|
+
return deepFreeze(structuredClone(diff.delta));
|
|
398
|
+
}
|
|
399
|
+
reviewState() {
|
|
400
|
+
return this.controller.reviewState();
|
|
401
|
+
}
|
|
402
|
+
setReviewed(hunkId, reviewed) {
|
|
403
|
+
this.controller.setReviewed(hunkId, reviewed);
|
|
404
|
+
}
|
|
405
|
+
/** Show an error state (used for undecodable embedded payloads). */
|
|
406
|
+
showError(error) {
|
|
407
|
+
this.controller.fail(error);
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Draw the canvas with the `--kgdiff-*` tokens as computed now. Call it after changing tokens
|
|
411
|
+
* in a way the root cannot observe (a class on an ancestor, a stylesheet); theme, palette and
|
|
412
|
+
* system color scheme changes are followed by themselves.
|
|
413
|
+
*/
|
|
414
|
+
refreshTheme() {
|
|
415
|
+
this.controller.refreshTheme();
|
|
416
|
+
}
|
|
417
|
+
// ─── Internals ────────────────────────────────────────────────────────────
|
|
418
|
+
reflect(name, value) {
|
|
419
|
+
if (this.getAttribute(name) === value)
|
|
420
|
+
return;
|
|
421
|
+
this.#reflecting = true;
|
|
422
|
+
try {
|
|
423
|
+
if (value === null)
|
|
424
|
+
this.removeAttribute(name);
|
|
425
|
+
else
|
|
426
|
+
this.setAttribute(name, value);
|
|
427
|
+
}
|
|
428
|
+
finally {
|
|
429
|
+
this.#reflecting = false;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/** The actions every root has: preferences reflect as attributes. */
|
|
433
|
+
baseActions() {
|
|
434
|
+
return {
|
|
435
|
+
tr: () => translator(this.controller.locale),
|
|
436
|
+
setMode: (mode) => this.controller.setMode(mode),
|
|
437
|
+
toggleScope: () => this.controller.toggleScope(),
|
|
438
|
+
setThemePreference: (pref) => {
|
|
439
|
+
this.theme = pref;
|
|
440
|
+
},
|
|
441
|
+
setPalette: (p) => {
|
|
442
|
+
this.palette = p;
|
|
443
|
+
},
|
|
444
|
+
setLocale: (l) => {
|
|
445
|
+
this.locale = l;
|
|
446
|
+
},
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
/** The pointer entered or left the graph (holds a looping replay with `pause-on-hover`). */
|
|
450
|
+
pointerOver(over) {
|
|
451
|
+
this.#pointerOver = over;
|
|
452
|
+
this.#applyHold();
|
|
453
|
+
}
|
|
454
|
+
/** Hold a looping replay while the pointer is over the graph (`pause-on-hover`). */
|
|
455
|
+
#applyHold() {
|
|
456
|
+
this.controller.hold(this.#pointerOver && this.loop && this.pauseOnHover);
|
|
457
|
+
}
|
|
458
|
+
/** Reflect what the session changed (mode, scope, theme) back to the attributes. */
|
|
459
|
+
reflectSession(topics) {
|
|
460
|
+
const c = this.controller;
|
|
461
|
+
if (topics.has('mode')) {
|
|
462
|
+
this.reflect('mode', c.mode);
|
|
463
|
+
this.reflect('scope', c.scope);
|
|
464
|
+
}
|
|
465
|
+
if (topics.has('theme')) {
|
|
466
|
+
this.reflect('theme', c.themePreference === 'auto' && !this.hasAttribute('theme') ? null : c.themePreference);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
#onKeyDown(e) {
|
|
470
|
+
// A key an element forwarded to its own root is that root's, even when it did nothing.
|
|
471
|
+
if (wasForwarded(e))
|
|
472
|
+
return;
|
|
473
|
+
// The nearest root takes a key pressed inside it; an outer one leaves it alone.
|
|
474
|
+
const nearest = e.composedPath().find(isRoot);
|
|
475
|
+
if (nearest !== undefined && nearest !== this)
|
|
476
|
+
return;
|
|
477
|
+
if (nearest === undefined) {
|
|
478
|
+
// Outside every root only with `shortcuts="global"`, when nothing else has focus, for the
|
|
479
|
+
// first such root, and never the keys pages scroll with.
|
|
480
|
+
if (this.shortcuts !== 'global' || PAGE_KEYS.has(e.key))
|
|
481
|
+
return;
|
|
482
|
+
const active = document.activeElement;
|
|
483
|
+
if (active && active !== document.body && active !== document.documentElement)
|
|
484
|
+
return;
|
|
485
|
+
if (connected.find((v) => v.shortcuts === 'global') !== this)
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
this.#key(e);
|
|
489
|
+
}
|
|
490
|
+
/** A key for this root: pressed inside it, or forwarded by an element bound with `for`. */
|
|
491
|
+
#key(e) {
|
|
492
|
+
if (e.defaultPrevented || e.isComposing || !this.keysEnabled())
|
|
493
|
+
return;
|
|
494
|
+
if (this.interceptKey(e))
|
|
495
|
+
return;
|
|
496
|
+
this.root.handleKey(e);
|
|
497
|
+
}
|
|
498
|
+
// ─── Deep links ───────────────────────────────────────────────────────────
|
|
499
|
+
#readHash() {
|
|
500
|
+
if (!this.hasAttribute('sync-hash') || typeof location === 'undefined')
|
|
501
|
+
return;
|
|
502
|
+
if (location.hash === this.#lastHash)
|
|
503
|
+
return;
|
|
504
|
+
const state = parseHash(location.hash);
|
|
505
|
+
this.#lastHash = location.hash;
|
|
506
|
+
if (!state)
|
|
507
|
+
return;
|
|
508
|
+
if (state.mode || state.scope) {
|
|
509
|
+
// A deep link outranks the large-graph default and a report's preferred view.
|
|
510
|
+
const c = this.controller;
|
|
511
|
+
if (state.mode)
|
|
512
|
+
c.explicit.add('mode');
|
|
513
|
+
if (state.scope)
|
|
514
|
+
c.explicit.add('scope');
|
|
515
|
+
c.setView(state.mode ?? c.mode, state.scope ?? c.scope);
|
|
516
|
+
}
|
|
517
|
+
if (state.hunk)
|
|
518
|
+
this.controller.selectHunkById(state.hunk, { fly: true });
|
|
519
|
+
}
|
|
520
|
+
#writeHash() {
|
|
521
|
+
if (!this.hasAttribute('sync-hash') || typeof location === 'undefined')
|
|
522
|
+
return;
|
|
523
|
+
const c = this.controller;
|
|
524
|
+
const hunk = c.selectedHunk >= 0 ? c.scene?.hunks[c.selectedHunk]?.id : undefined;
|
|
525
|
+
const hash = formatHash({
|
|
526
|
+
...(hunk !== undefined ? { hunk } : {}),
|
|
527
|
+
mode: c.mode,
|
|
528
|
+
scope: c.scope,
|
|
529
|
+
});
|
|
530
|
+
if (hash === location.hash)
|
|
531
|
+
return;
|
|
532
|
+
this.#lastHash = hash;
|
|
533
|
+
try {
|
|
534
|
+
history.replaceState(history.state, '', hash);
|
|
535
|
+
}
|
|
536
|
+
catch {
|
|
537
|
+
location.hash = hash;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
//# sourceMappingURL=root-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-element.js","sourceRoot":"","sources":["../src/root-element.ts"],"names":[],"mappings":"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"}
|
package/dist/root.d.ts
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Region, ViewerContext } from './bind.js';
|
|
2
|
+
import { type Keymap } from './keyboard.js';
|
|
2
3
|
import type { Topic } from './session.js';
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
export
|
|
6
|
-
|
|
4
|
+
import { DiffSession, type SessionDeps, type SessionHost } from './session.js';
|
|
5
|
+
import type { FocusTarget, UiActions } from './ui/context.js';
|
|
6
|
+
export type { Region, ViewerContext } from './bind.js';
|
|
7
|
+
export { bindRegion, uiContext, viewerContext, wasForwarded } from './bind.js';
|
|
8
|
+
/** Whether `target` is the host of a root. */
|
|
9
|
+
export declare function isRoot(target: EventTarget): boolean;
|
|
10
|
+
/** What the element that owns a root adds to it. */
|
|
11
|
+
export interface RootOptions<S extends DiffSession = DiffSession> {
|
|
12
|
+
/** The session to make (default: a plain `DiffSession`, without a canvas of its own). */
|
|
13
|
+
readonly session?: (host: SessionHost, deps: SessionDeps) => S;
|
|
14
|
+
/** The sheets the root's shadow root adopts before its token set (default: the viewer's). */
|
|
15
|
+
readonly sheets?: (doc: Document) => readonly CSSStyleSheet[];
|
|
16
|
+
/** A key forwarded by an element bound with `for` (default: the keyboard map). */
|
|
17
|
+
readonly key?: (e: KeyboardEvent) => void;
|
|
18
|
+
/** The pointer entered or left the graph. */
|
|
19
|
+
readonly hover?: (over: boolean) => void;
|
|
7
20
|
}
|
|
8
|
-
|
|
9
|
-
export interface ViewerContext {
|
|
10
|
-
readonly controller: ViewerController;
|
|
11
|
-
readonly actions: UiActions;
|
|
12
|
-
/** The element the root's events are dispatched on and its tokens are set on. */
|
|
13
|
-
readonly host: HTMLElement;
|
|
14
|
-
/** Render `region` on every notification (in binding order); returns the detach. */
|
|
15
|
-
attach(region: Region): () => void;
|
|
16
|
-
target(name: FocusTarget, focus: () => void): () => void;
|
|
17
|
-
focus(name: FocusTarget): boolean;
|
|
18
|
-
/** The keyboard map, for a key event that reached the root. */
|
|
19
|
-
handleKey(e: KeyboardEvent): void;
|
|
20
|
-
}
|
|
21
|
-
export declare const viewerContext: import("./context.js").Context<ViewerContext>;
|
|
22
|
-
export declare class ViewerRoot implements ViewerContext {
|
|
21
|
+
export declare class ViewerRoot<S extends DiffSession = DiffSession> implements ViewerContext {
|
|
23
22
|
#private;
|
|
24
|
-
readonly controller:
|
|
23
|
+
readonly controller: S;
|
|
25
24
|
/** The single polite live region announcing navigation ("Change 3 of 12: …"). */
|
|
26
25
|
readonly live: HTMLDivElement;
|
|
27
26
|
readonly host: HTMLElement;
|
|
28
27
|
readonly actions: UiActions;
|
|
28
|
+
/** `keymap`: single keys bound to other shortcuts, or unbound. */
|
|
29
|
+
keymap: Keymap | null;
|
|
30
|
+
/** `shortcuts="none"`: no shortcuts, but a focused list keeps its own keys. */
|
|
31
|
+
shortcutsOff: boolean;
|
|
29
32
|
/**
|
|
30
33
|
* `host` dispatches the events and computes the tokens set on `shadow` (its shadow root);
|
|
31
34
|
* `emitted` runs after each event was dispatched.
|
|
32
35
|
*/
|
|
33
|
-
constructor(host: HTMLElement, shadow: ShadowRoot, actions: UiActions, emitted?: (type: string) => void);
|
|
36
|
+
constructor(host: HTMLElement, shadow: ShadowRoot, actions: UiActions, emitted?: (type: string) => void, options?: RootOptions<S>);
|
|
34
37
|
/**
|
|
35
38
|
* Provide the session to the regions and follow the system's color scheme and motion
|
|
36
39
|
* preference and other tabs' review progress; returns the function that stops it all.
|
|
37
40
|
*/
|
|
38
41
|
connect(): () => void;
|
|
39
42
|
attach(region: Region): () => void;
|
|
40
|
-
target(name: FocusTarget, focus: () => void): () => void;
|
|
43
|
+
target(name: FocusTarget, focus: () => void, available?: () => boolean): () => void;
|
|
44
|
+
/** Focus the `name` target registered last of those available (in an open region). */
|
|
41
45
|
focus(name: FocusTarget): boolean;
|
|
42
46
|
announce(text: string): void;
|
|
43
47
|
/** Render every region, never throwing: a failure shows the error state with safe defaults. */
|
|
44
48
|
render(topics: ReadonlySet<Topic>): void;
|
|
49
|
+
tokens(doc: Document): CSSStyleSheet;
|
|
50
|
+
forwardKey(e: KeyboardEvent): void;
|
|
51
|
+
hover(over: boolean): void;
|
|
45
52
|
handleKey(e: KeyboardEvent): void;
|
|
46
53
|
}
|
|
47
|
-
/** The UI context of a region placed in `root` (its shadow tree), bound to `ctx`. */
|
|
48
|
-
export declare function uiContext(ctx: ViewerContext, root: ShadowRoot): UiContext;
|
|
49
|
-
/**
|
|
50
|
-
* Bind a region to the root nearest `anchor` (an element where the region is placed): `make`
|
|
51
|
-
* builds it once the root answers, and the root renders it from then on.
|
|
52
|
-
*/
|
|
53
|
-
export declare function bindRegion<R extends Region>(anchor: Element, make: (ui: UiContext) => R): R;
|
|
54
54
|
//# sourceMappingURL=root.d.ts.map
|
package/dist/root.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAKvD,OAAO,EAAkB,KAAK,MAAM,EAAa,MAAM,eAAe,CAAC;AAIvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE9D,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAK/E,8CAA8C;AAC9C,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEnD;AAED,oDAAoD;AACpD,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC9D,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,KAAK,CAAC,CAAC;IAC/D,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,SAAS,aAAa,EAAE,CAAC;IAC9D,kFAAkF;IAClF,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAC1C;AAgBD,qBAAa,UAAU,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,YAAW,aAAa;;IACnF,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,IAAI,iBAAgF;IAC7F,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAQ5B,kEAAkE;IAClE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,+EAA+E;IAC/E,YAAY,UAAS;IAErB;;;OAGG;IACH,YACE,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,SAAS,EAClB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAChC,OAAO,GAAE,WAAW,CAAC,CAAC,CAAM,EAsC7B;IAED;;;OAGG;IACH,OAAO,IAAI,MAAM,IAAI,CAsBpB;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,CAMjC;IAED,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,OAAO,GAAG,MAAM,IAAI,CASlF;IAED,sFAAsF;IACtF,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAShC;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAO3B;IAED,+FAA+F;IAC/F,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,IAAI,CAcvC;IAaD,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,aAAa,CAInC;IAED,UAAU,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CAGjC;IAED,KAAK,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAEzB;IAED,SAAS,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,CA6FhC;CACF"}
|