@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.
Files changed (232) hide show
  1. package/README.md +43 -16
  2. package/custom-elements.json +2347 -0
  3. package/dist/bind.d.ts +41 -0
  4. package/dist/bind.d.ts.map +1 -0
  5. package/dist/bind.js +47 -0
  6. package/dist/bind.js.map +1 -0
  7. package/dist/controller.d.ts +22 -74
  8. package/dist/controller.d.ts.map +1 -1
  9. package/dist/controller.js +35 -376
  10. package/dist/controller.js.map +1 -1
  11. package/dist/dom.d.ts +10 -0
  12. package/dist/dom.d.ts.map +1 -1
  13. package/dist/dom.js +29 -0
  14. package/dist/dom.js.map +1 -1
  15. package/dist/element.d.ts +52 -46
  16. package/dist/element.d.ts.map +1 -1
  17. package/dist/element.js +362 -403
  18. package/dist/element.js.map +1 -1
  19. package/dist/elements/actions.d.ts +27 -0
  20. package/dist/elements/actions.d.ts.map +1 -0
  21. package/dist/elements/actions.js +81 -0
  22. package/dist/elements/actions.js.map +1 -0
  23. package/dist/elements/bound.d.ts +63 -0
  24. package/dist/elements/bound.d.ts.map +1 -0
  25. package/dist/elements/bound.js +213 -0
  26. package/dist/elements/bound.js.map +1 -0
  27. package/dist/elements/change-detail.d.ts +25 -0
  28. package/dist/elements/change-detail.d.ts.map +1 -0
  29. package/dist/elements/change-detail.js +19 -0
  30. package/dist/elements/change-detail.js.map +1 -0
  31. package/dist/elements/change-list.d.ts +27 -0
  32. package/dist/elements/change-list.d.ts.map +1 -0
  33. package/dist/elements/change-list.js +29 -0
  34. package/dist/elements/change-list.js.map +1 -0
  35. package/dist/elements/filters.d.ts +25 -0
  36. package/dist/elements/filters.d.ts.map +1 -0
  37. package/dist/elements/filters.js +19 -0
  38. package/dist/elements/filters.js.map +1 -0
  39. package/dist/elements/legend.d.ts +40 -0
  40. package/dist/elements/legend.d.ts.map +1 -0
  41. package/dist/elements/legend.js +87 -0
  42. package/dist/elements/legend.js.map +1 -0
  43. package/dist/elements/minimap.d.ts +38 -0
  44. package/dist/elements/minimap.d.ts.map +1 -0
  45. package/dist/elements/minimap.js +59 -0
  46. package/dist/elements/minimap.js.map +1 -0
  47. package/dist/elements/root.d.ts +40 -0
  48. package/dist/elements/root.d.ts.map +1 -0
  49. package/dist/elements/root.js +67 -0
  50. package/dist/elements/root.js.map +1 -0
  51. package/dist/elements/search.d.ts +29 -0
  52. package/dist/elements/search.d.ts.map +1 -0
  53. package/dist/elements/search.js +23 -0
  54. package/dist/elements/search.js.map +1 -0
  55. package/dist/elements/stage-context.d.ts +31 -0
  56. package/dist/elements/stage-context.d.ts.map +1 -0
  57. package/dist/elements/stage-context.js +4 -0
  58. package/dist/elements/stage-context.js.map +1 -0
  59. package/dist/elements/stage.d.ts +65 -0
  60. package/dist/elements/stage.d.ts.map +1 -0
  61. package/dist/elements/stage.js +259 -0
  62. package/dist/elements/stage.js.map +1 -0
  63. package/dist/elements/title.d.ts +25 -0
  64. package/dist/elements/title.d.ts.map +1 -0
  65. package/dist/elements/title.js +19 -0
  66. package/dist/elements/title.js.map +1 -0
  67. package/dist/elements/transport.d.ts +29 -0
  68. package/dist/elements/transport.d.ts.map +1 -0
  69. package/dist/elements/transport.js +24 -0
  70. package/dist/elements/transport.js.map +1 -0
  71. package/dist/elements/view-bound.d.ts +39 -0
  72. package/dist/elements/view-bound.d.ts.map +1 -0
  73. package/dist/elements/view-bound.js +88 -0
  74. package/dist/elements/view-bound.js.map +1 -0
  75. package/dist/elements/view-dock.d.ts +28 -0
  76. package/dist/elements/view-dock.d.ts.map +1 -0
  77. package/dist/elements/view-dock.js +28 -0
  78. package/dist/elements/view-dock.js.map +1 -0
  79. package/dist/elements/zoom.d.ts +28 -0
  80. package/dist/elements/zoom.d.ts.map +1 -0
  81. package/dist/elements/zoom.js +22 -0
  82. package/dist/elements/zoom.js.map +1 -0
  83. package/dist/i18n.d.ts +10 -0
  84. package/dist/i18n.d.ts.map +1 -1
  85. package/dist/i18n.js +20 -0
  86. package/dist/i18n.js.map +1 -1
  87. package/dist/icons.d.ts +1 -0
  88. package/dist/icons.d.ts.map +1 -1
  89. package/dist/icons.js +1 -0
  90. package/dist/icons.js.map +1 -1
  91. package/dist/index.d.ts +328 -34
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +13 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/keyboard.d.ts +39 -2
  96. package/dist/keyboard.d.ts.map +1 -1
  97. package/dist/keyboard.js +145 -62
  98. package/dist/keyboard.js.map +1 -1
  99. package/dist/layout-store.d.ts +26 -0
  100. package/dist/layout-store.d.ts.map +1 -0
  101. package/dist/layout-store.js +46 -0
  102. package/dist/layout-store.js.map +1 -0
  103. package/dist/panel-levels.d.ts +18 -0
  104. package/dist/panel-levels.d.ts.map +1 -0
  105. package/dist/panel-levels.js +41 -0
  106. package/dist/panel-levels.js.map +1 -0
  107. package/dist/panels.d.ts +28 -0
  108. package/dist/panels.d.ts.map +1 -0
  109. package/dist/panels.js +73 -0
  110. package/dist/panels.js.map +1 -0
  111. package/dist/prefs.d.ts +5 -2
  112. package/dist/prefs.d.ts.map +1 -1
  113. package/dist/prefs.js +12 -3
  114. package/dist/prefs.js.map +1 -1
  115. package/dist/react.d.ts +460 -0
  116. package/dist/react.d.ts.map +1 -0
  117. package/dist/react.js +2 -0
  118. package/dist/react.js.map +1 -0
  119. package/dist/root-element.d.ts +122 -0
  120. package/dist/root-element.d.ts.map +1 -0
  121. package/dist/root-element.js +541 -0
  122. package/dist/root-element.js.map +1 -0
  123. package/dist/root.d.ts +30 -30
  124. package/dist/root.d.ts.map +1 -1
  125. package/dist/root.js +65 -42
  126. package/dist/root.js.map +1 -1
  127. package/dist/session.d.ts +19 -3
  128. package/dist/session.d.ts.map +1 -1
  129. package/dist/session.js +15 -17
  130. package/dist/session.js.map +1 -1
  131. package/dist/standalone/kgdiff-viewer.js +4 -4
  132. package/dist/styles.d.ts +4 -0
  133. package/dist/styles.d.ts.map +1 -1
  134. package/dist/styles.js +224 -84
  135. package/dist/styles.js.map +1 -1
  136. package/dist/theme.d.ts +7 -0
  137. package/dist/theme.d.ts.map +1 -1
  138. package/dist/theme.js +10 -7
  139. package/dist/theme.js.map +1 -1
  140. package/dist/topics.d.ts +8 -0
  141. package/dist/topics.d.ts.map +1 -0
  142. package/dist/topics.js +18 -0
  143. package/dist/topics.js.map +1 -0
  144. package/dist/ui/change-list.d.ts.map +1 -1
  145. package/dist/ui/change-list.js +2 -2
  146. package/dist/ui/change-list.js.map +1 -1
  147. package/dist/ui/context.d.ts +20 -7
  148. package/dist/ui/context.d.ts.map +1 -1
  149. package/dist/ui/context.js.map +1 -1
  150. package/dist/ui/header.d.ts +41 -3
  151. package/dist/ui/header.d.ts.map +1 -1
  152. package/dist/ui/header.js +99 -34
  153. package/dist/ui/header.js.map +1 -1
  154. package/dist/ui/legend.d.ts +15 -0
  155. package/dist/ui/legend.d.ts.map +1 -0
  156. package/dist/ui/legend.js +68 -0
  157. package/dist/ui/legend.js.map +1 -0
  158. package/dist/ui/popovers.d.ts +3 -1
  159. package/dist/ui/popovers.d.ts.map +1 -1
  160. package/dist/ui/popovers.js +62 -23
  161. package/dist/ui/popovers.js.map +1 -1
  162. package/dist/ui/search.d.ts.map +1 -1
  163. package/dist/ui/search.js +3 -2
  164. package/dist/ui/search.js.map +1 -1
  165. package/dist/ui/sidebar.d.ts +26 -3
  166. package/dist/ui/sidebar.d.ts.map +1 -1
  167. package/dist/ui/sidebar.js +344 -12
  168. package/dist/ui/sidebar.js.map +1 -1
  169. package/dist/ui/stage.d.ts +56 -1
  170. package/dist/ui/stage.d.ts.map +1 -1
  171. package/dist/ui/stage.js +244 -256
  172. package/dist/ui/stage.js.map +1 -1
  173. package/dist/ui/transport.d.ts +12 -0
  174. package/dist/ui/transport.d.ts.map +1 -0
  175. package/dist/ui/transport.js +198 -0
  176. package/dist/ui/transport.js.map +1 -0
  177. package/dist/ui/zoom.d.ts +15 -0
  178. package/dist/ui/zoom.d.ts.map +1 -0
  179. package/dist/ui/zoom.js +30 -0
  180. package/dist/ui/zoom.js.map +1 -0
  181. package/dist/view.d.ts +94 -0
  182. package/dist/view.d.ts.map +1 -0
  183. package/dist/view.js +441 -0
  184. package/dist/view.js.map +1 -0
  185. package/package.json +95 -12
  186. package/src/bind.ts +80 -0
  187. package/src/controller.ts +51 -442
  188. package/src/dom.ts +30 -0
  189. package/src/element.ts +364 -406
  190. package/src/elements/actions.ts +94 -0
  191. package/src/elements/bound.ts +247 -0
  192. package/src/elements/change-detail.ts +34 -0
  193. package/src/elements/change-list.ts +51 -0
  194. package/src/elements/filters.ts +34 -0
  195. package/src/elements/legend.ts +103 -0
  196. package/src/elements/minimap.ts +75 -0
  197. package/src/elements/root.ts +86 -0
  198. package/src/elements/search.ts +38 -0
  199. package/src/elements/stage-context.ts +34 -0
  200. package/src/elements/stage.ts +285 -0
  201. package/src/elements/title.ts +34 -0
  202. package/src/elements/transport.ts +39 -0
  203. package/src/elements/view-bound.ts +118 -0
  204. package/src/elements/view-dock.ts +43 -0
  205. package/src/elements/zoom.ts +38 -0
  206. package/src/i18n.ts +20 -0
  207. package/src/icons.ts +1 -0
  208. package/src/index.ts +347 -34
  209. package/src/keyboard.ts +188 -61
  210. package/src/layout-store.ts +71 -0
  211. package/src/panel-levels.ts +53 -0
  212. package/src/panels.ts +81 -0
  213. package/src/prefs.ts +12 -4
  214. package/src/react.ts +459 -0
  215. package/src/root-element.ts +624 -0
  216. package/src/root.ts +92 -65
  217. package/src/session.ts +22 -33
  218. package/src/styles.ts +245 -84
  219. package/src/theme.ts +10 -7
  220. package/src/topics.ts +37 -0
  221. package/src/ui/change-list.ts +6 -2
  222. package/src/ui/context.ts +20 -7
  223. package/src/ui/header.ts +127 -56
  224. package/src/ui/legend.ts +112 -0
  225. package/src/ui/popovers.ts +68 -25
  226. package/src/ui/search.ts +10 -5
  227. package/src/ui/sidebar.ts +386 -23
  228. package/src/ui/stage.ts +267 -331
  229. package/src/ui/transport.ts +240 -0
  230. package/src/ui/zoom.ts +45 -0
  231. package/src/view.ts +516 -0
  232. package/vscode.html-custom-data.json +726 -0
@@ -0,0 +1,259 @@
1
+ import { provideContext } from '../context.js';
2
+ import { DEFAULT_PANELS, formatPanels, toPanels } from '../panels.js';
3
+ import { Stage } from '../ui/stage.js';
4
+ import { StageView } from '../view.js';
5
+ import { BoundElement, define } from './bound.js';
6
+ import { stageContext } from './stage-context.js';
7
+ export { stageContext } from './stage-context.js';
8
+ /**
9
+ * The regions of the built-in chrome a stage has.
10
+ *
11
+ * @experimental Like the stage, in 0.6.
12
+ */
13
+ export const STAGE_REGIONS = [
14
+ 'dock',
15
+ 'transport',
16
+ 'legend',
17
+ 'zoom',
18
+ 'minimap',
19
+ ];
20
+ const VERSIONS = ['before', 'after'];
21
+ /** A version from an attribute or a property; anything else follows the mode, with a warning. */
22
+ function toVersion(value) {
23
+ if (value === null || value === undefined || value === '')
24
+ return null;
25
+ if (VERSIONS.includes(value))
26
+ return value;
27
+ console.warn(`[kgdiff] <kgdiff-stage> ignoring version ${JSON.stringify(value)} (before, after)`);
28
+ return null;
29
+ }
30
+ /** Panels from an attribute or a property, keeping the stage's regions (warning about the rest). */
31
+ function stagePanels(value) {
32
+ const { panels, invalid } = toPanels(value);
33
+ const out = {};
34
+ for (const [region, state] of Object.entries(panels)) {
35
+ if (STAGE_REGIONS.includes(region))
36
+ out[region] = state;
37
+ else
38
+ invalid.push(`${region}:${state}`);
39
+ }
40
+ if (invalid.length > 0) {
41
+ console.warn(`[kgdiff] <kgdiff-stage> ignoring invalid panels: ${invalid.join(' ')}`);
42
+ }
43
+ return out;
44
+ }
45
+ /**
46
+ * The canvas of the root it is bound to: the graph, the hover tooltip, the swipe divider, the
47
+ * replay caption and the canvas chrome (view dock, replay transport, legend, zoom buttons and
48
+ * minimap). Each stage is a view of its own: a root draws every stage bound to it, each with its
49
+ * own camera, sharing the selection, the hover, the filters and the search; `version` pins one
50
+ * to a version.
51
+ *
52
+ * Five named slots take the page's content over the canvas. The stage positions it (12–16 px
53
+ * from the edges, stacked further from the corner than the chrome there), and every slotted
54
+ * element is an obstacle: fits and flights frame the graph in the free part of the canvas. A
55
+ * chrome element slotted in replaces the built-in region of its kind; `panels` keeps applying
56
+ * to the rest. Content positioned some other way registers itself with `registerObstacle`, on
57
+ * the element or on the stage context (`kgdiff.stage/1`) it provides to its descendants.
58
+ *
59
+ * @tagname kgdiff-stage
60
+ * @slot top-start - The page's content in the top left corner, below the version chip.
61
+ * @slot top-end - The page's content in the top right corner.
62
+ * @slot bottom-start - The page's content in the bottom left corner, above the legend.
63
+ * @slot bottom-center - The page's content above the view dock and the transport.
64
+ * @slot bottom-end - The page's content in the bottom right corner, above the zoom buttons and the minimap.
65
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
66
+ */
67
+ export class KgdiffStage extends BoundElement {
68
+ static get observedAttributes() {
69
+ return ['for', 'panels', 'version'];
70
+ }
71
+ name = 'stage';
72
+ #stage = null;
73
+ /** The page's `panels`, and what the user changed since (the legend's head). */
74
+ #declared = {};
75
+ #runtime = {};
76
+ #reflecting = false;
77
+ #version = null;
78
+ #view = null;
79
+ #viewListeners = new Set();
80
+ /** Registered obstacles, kept across rebinding (the stage is rebuilt then). */
81
+ #obstacles = new Map();
82
+ get panels() {
83
+ return { ...this.#declared };
84
+ }
85
+ set panels(value) {
86
+ const panels = stagePanels(value);
87
+ this.#reflecting = true;
88
+ try {
89
+ const text = formatPanels(panels);
90
+ if (text)
91
+ this.setAttribute('panels', text);
92
+ else
93
+ this.removeAttribute('panels');
94
+ }
95
+ finally {
96
+ this.#reflecting = false;
97
+ }
98
+ this.#declare(panels);
99
+ }
100
+ /**
101
+ * The version this stage draws whatever the mode, reflected to the `version` attribute:
102
+ * `before` or `after` (side by side with another stage of the same root), or null to follow
103
+ * the root's mode (overlay, swipe, replay).
104
+ */
105
+ get version() {
106
+ return this.#version;
107
+ }
108
+ set version(value) {
109
+ const v = toVersion(value);
110
+ this.#reflecting = true;
111
+ try {
112
+ if (v)
113
+ this.setAttribute('version', v);
114
+ else
115
+ this.removeAttribute('version');
116
+ }
117
+ finally {
118
+ this.#reflecting = false;
119
+ }
120
+ this.#setVersion(v);
121
+ }
122
+ attributeChangedCallback(name, old, value) {
123
+ if (this.#reflecting)
124
+ return;
125
+ if (name === 'panels')
126
+ this.#declare(stagePanels(value ?? ''));
127
+ else if (name === 'version')
128
+ this.#setVersion(toVersion(value));
129
+ else
130
+ super.attributeChangedCallback(name, old, value);
131
+ }
132
+ upgradedProperties() {
133
+ return [...super.upgradedProperties(), 'panels', 'version'];
134
+ }
135
+ /** @internal This stage's view (its camera), for the dev harness and tests. */
136
+ get view() {
137
+ return this.#view;
138
+ }
139
+ #setVersion(version) {
140
+ if (version === this.#version)
141
+ return;
142
+ this.#version = version;
143
+ if (this.#view)
144
+ this.#view.version = version;
145
+ this.#stage?.setVersion(version);
146
+ }
147
+ #setView(view) {
148
+ this.#view = view;
149
+ for (const listener of this.#viewListeners)
150
+ listener(view);
151
+ }
152
+ /** A region the page declares another state for gives way; the same again changes nothing. */
153
+ #declare(panels) {
154
+ for (const r of STAGE_REGIONS)
155
+ if (panels[r] !== this.#declared[r])
156
+ delete this.#runtime[r];
157
+ this.#declared = panels;
158
+ this.#applyPanels();
159
+ }
160
+ #applyPanels() {
161
+ const states = { ...DEFAULT_PANELS, ...this.#declared, ...this.#runtime };
162
+ this.#stage?.setPanels(states);
163
+ }
164
+ registerObstacle(element) {
165
+ if (!this.#obstacles.has(element)) {
166
+ this.#obstacles.set(element, this.#stage?.registerObstacle(element) ?? (() => undefined));
167
+ }
168
+ return () => {
169
+ this.#obstacles.get(element)?.();
170
+ this.#obstacles.delete(element);
171
+ };
172
+ }
173
+ build(ui, ctx, release) {
174
+ release(provideContext(this, stageContext, () => {
175
+ const stage = this;
176
+ return {
177
+ stage,
178
+ get root() {
179
+ return stage.context;
180
+ },
181
+ registerObstacle: (el) => stage.registerObstacle(el),
182
+ get view() {
183
+ return stage.#view;
184
+ },
185
+ watchView: (listener) => {
186
+ stage.#viewListeners.add(listener);
187
+ listener(stage.#view);
188
+ return () => {
189
+ stage.#viewListeners.delete(listener);
190
+ };
191
+ },
192
+ };
193
+ }));
194
+ // The user opening or folding the legend holds until the page declares the legend again.
195
+ const stage = new Stage({
196
+ ...ui,
197
+ setPanel: (region, state) => {
198
+ if (STAGE_REGIONS.includes(region)) {
199
+ this.#runtime[region] = state;
200
+ }
201
+ },
202
+ }, true);
203
+ this.#stage = stage;
204
+ this.#applyPanels();
205
+ for (const el of this.#obstacles.keys())
206
+ this.#obstacles.set(el, stage.registerObstacle(el));
207
+ release(() => {
208
+ this.#stage = null;
209
+ });
210
+ stage.setChrome('full', true);
211
+ // One of the page's regions, not its main landmark.
212
+ stage.asRegion();
213
+ this.shadow.append(stage.el);
214
+ // Content slotted before the stage was built.
215
+ stage.slotted();
216
+ // This stage's own view of the shared session: canvas, camera, framing, minimap.
217
+ const view = new StageView(ctx.controller);
218
+ view.version = this.#version;
219
+ stage.view = view;
220
+ stage.setVersion(this.#version);
221
+ release(ctx.controller.addView(view));
222
+ // The stage adds its own minimap to the view (unless a slotted one replaces it).
223
+ view.attach(stage.canvasHost, null);
224
+ view.setChrome(() => stage.chromeLayout());
225
+ this.#setView(view);
226
+ release(() => {
227
+ this.#setView(null);
228
+ view.setChrome(null);
229
+ view.detach();
230
+ });
231
+ // The graph takes keyboard focus (shortcuts apply where focus is), also on click.
232
+ const canvas = stage.canvasHost.querySelector('canvas');
233
+ if (canvas) {
234
+ canvas.tabIndex = 0;
235
+ const focusCanvas = () => canvas.focus({ preventScroll: true });
236
+ canvas.addEventListener('pointerdown', focusCanvas);
237
+ release(() => canvas.removeEventListener('pointerdown', focusCanvas));
238
+ }
239
+ const hover = (over) => (e) => {
240
+ if (e.pointerType !== 'touch')
241
+ ctx.hover(over);
242
+ };
243
+ stage.el.addEventListener('pointerenter', hover(true));
244
+ stage.el.addEventListener('pointerleave', hover(false));
245
+ release(() => ctx.hover(false));
246
+ if (typeof ResizeObserver === 'function') {
247
+ const ro = new ResizeObserver(() => {
248
+ stage.layout();
249
+ view.layoutChanged();
250
+ });
251
+ ro.observe(stage.el);
252
+ release(() => ro.disconnect());
253
+ }
254
+ document.fonts?.ready?.then(() => this.#stage?.layout()).catch(() => undefined);
255
+ return stage;
256
+ }
257
+ }
258
+ define('kgdiff-stage', KgdiffStage);
259
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../src/elements/stage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `<kgdiff-title>` (RFC 0001 §3), documented on its class. Importing this module defines it.
3
+ */
4
+ import type { Region } from '../bind.js';
5
+ import type { KgdiffBoundElement } from '../index.js';
6
+ import type { UiContext } from '../ui/context.js';
7
+ import { BoundElement } from './bound.js';
8
+ /**
9
+ * The kgdiff mark and the root's compared names and versions. Binds to a root (`for`, `htmlFor`,
10
+ * `rootElement`). Slotted into a `<kgdiff-viewer>` it replaces the title over its canvas.
11
+ *
12
+ * @tagname kgdiff-title
13
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
14
+ */
15
+ export declare class KgdiffTitle extends BoundElement implements KgdiffBoundElement {
16
+ protected readonly name = "title";
17
+ protected build(ui: UiContext): Region;
18
+ }
19
+ declare global {
20
+ interface HTMLElementTagNameMap {
21
+ /** @experimental In 0.6. */
22
+ 'kgdiff-title': KgdiffBoundElement;
23
+ }
24
+ }
25
+ //# sourceMappingURL=title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.d.ts","sourceRoot":"","sources":["../../src/elements/title.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAU,MAAM,YAAY,CAAC;AAElD;;;;;;GAMG;AACH,qBAAa,WAAY,SAAQ,YAAa,YAAW,kBAAkB;IACzE,SAAS,CAAC,QAAQ,CAAC,IAAI,WAAW;IAElC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAIrC;CACF;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B;QAC5B,cAAc,EAAE,kBAAkB,CAAC;KACpC;CACF"}
@@ -0,0 +1,19 @@
1
+ import { Title } from '../ui/header.js';
2
+ import { BoundElement, define } from './bound.js';
3
+ /**
4
+ * The kgdiff mark and the root's compared names and versions. Binds to a root (`for`, `htmlFor`,
5
+ * `rootElement`). Slotted into a `<kgdiff-viewer>` it replaces the title over its canvas.
6
+ *
7
+ * @tagname kgdiff-title
8
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
9
+ */
10
+ export class KgdiffTitle extends BoundElement {
11
+ name = 'title';
12
+ build(ui) {
13
+ const title = new Title(ui);
14
+ this.shadow.append(title.el);
15
+ return title;
16
+ }
17
+ }
18
+ define('kgdiff-title', KgdiffTitle);
19
+ //# sourceMappingURL=title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title.js","sourceRoot":"","sources":["../../src/elements/title.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IACxB,IAAI,GAAG,OAAO,CAAC;IAExB,KAAK,CAAC,EAAa;QAC3B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `<kgdiff-transport>` (RFC 0001 §3), documented on its class. Importing this module defines it.
3
+ */
4
+ import type { Region } from '../bind.js';
5
+ import type { KgdiffBoundElement } from '../index.js';
6
+ import type { UiContext } from '../ui/context.js';
7
+ import { BoundElement } from './bound.js';
8
+ /**
9
+ * The replay transport of the root's diff. Previous, play / pause, next, the scrubber with one tick
10
+ * per change, the position and the speed; at the end, "Replay finished · Restart" above it. Shown
11
+ * in replay mode only. Binds to a root (`for`, `htmlFor`, `rootElement`). Slotted into a
12
+ * `<kgdiff-stage>` (`slot="bottom-center"`, say) it replaces the stage's built-in transport; placed
13
+ * anywhere else it is not kept clear of fits and flights unless registered. Importing this module
14
+ * defines it.
15
+ *
16
+ * @tagname kgdiff-transport
17
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
18
+ */
19
+ export declare class KgdiffTransport extends BoundElement implements KgdiffBoundElement {
20
+ protected readonly name = "transport";
21
+ protected build(ui: UiContext): Region;
22
+ }
23
+ declare global {
24
+ interface HTMLElementTagNameMap {
25
+ /** @experimental In 0.6. */
26
+ 'kgdiff-transport': KgdiffBoundElement;
27
+ }
28
+ }
29
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/elements/transport.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAU,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,YAAa,YAAW,kBAAkB;IAC7E,SAAS,CAAC,QAAQ,CAAC,IAAI,eAAe;IAEtC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAIrC;CACF;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B;QAC5B,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;CACF"}
@@ -0,0 +1,24 @@
1
+ import { h } from '../dom.js';
2
+ import { Transport } from '../ui/transport.js';
3
+ import { BoundElement, define } from './bound.js';
4
+ /**
5
+ * The replay transport of the root's diff. Previous, play / pause, next, the scrubber with one tick
6
+ * per change, the position and the speed; at the end, "Replay finished · Restart" above it. Shown
7
+ * in replay mode only. Binds to a root (`for`, `htmlFor`, `rootElement`). Slotted into a
8
+ * `<kgdiff-stage>` (`slot="bottom-center"`, say) it replaces the stage's built-in transport; placed
9
+ * anywhere else it is not kept clear of fits and flights unless registered. Importing this module
10
+ * defines it.
11
+ *
12
+ * @tagname kgdiff-transport
13
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
14
+ */
15
+ export class KgdiffTransport extends BoundElement {
16
+ name = 'transport';
17
+ build(ui) {
18
+ const transport = new Transport(ui);
19
+ this.shadow.append(h('div', { class: 'stack' }, transport.finished, transport.el));
20
+ return transport;
21
+ }
22
+ }
23
+ define('kgdiff-transport', KgdiffTransport);
24
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/elements/transport.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,WAAW,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC5B,IAAI,GAAG,WAAW,CAAC;IAE5B,KAAK,CAAC,EAAa;QAC3B,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * What the chrome that acts on one view shares (`<kgdiff-zoom>`, `<kgdiff-minimap>`; RFC 0001
3
+ * §3): it binds to a stage, not to a root. The nearest `<kgdiff-stage>` around it (across
4
+ * shadow roots, through the stage context `kgdiff.stage/1`), or the one its `stage="<id>"`
5
+ * names anywhere on the page (a `<kgdiff-viewer>` is the stage of what it holds, and can be
6
+ * named too); a stage defined or bound later is found then. It shows what the
7
+ * stage's root says (language, tokens), acts on the stage's view, and follows the stage when it
8
+ * binds again (a new view).
9
+ */
10
+ import type { Region } from '../bind.js';
11
+ import type { KgdiffRootElement, KgdiffStageElement, KgdiffViewerElement } from '../index.js';
12
+ import type { ElementName } from '../styles.js';
13
+ import type { UiContext } from '../ui/context.js';
14
+ import type { StageView } from '../view.js';
15
+ /** @experimental The base of the chrome elements that act on a stage's view, in 0.6. */
16
+ export declare abstract class ViewBoundElement extends HTMLElement {
17
+ #private;
18
+ static get observedAttributes(): readonly string[];
19
+ protected readonly shadow: ShadowRoot;
20
+ constructor();
21
+ /** The element's name after `kgdiff-` (its host rules). */
22
+ protected abstract readonly name: ElementName;
23
+ /** Build the region in the shadow root, for `view`; `release` collects what to undo. */
24
+ protected abstract build(ui: UiContext, view: StageView, release: (fn: () => void) => void): Region;
25
+ /**
26
+ * Reflects the `stage` attribute: the id of the stage to act on; '' (no attribute) for the
27
+ * nearest one around the element. Changing it binds again.
28
+ */
29
+ get stage(): string;
30
+ set stage(value: string);
31
+ /** The stage this element acts on, or null while it waits for one. */
32
+ get stageElement(): KgdiffStageElement | KgdiffViewerElement | null;
33
+ /** The root whose session the stage shows, or null while either waits. */
34
+ get rootElement(): KgdiffRootElement | null;
35
+ connectedCallback(): void;
36
+ disconnectedCallback(): void;
37
+ attributeChangedCallback(name: string, old: string | null, value: string | null): void;
38
+ }
39
+ //# sourceMappingURL=view-bound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-bound.d.ts","sourceRoot":"","sources":["../../src/elements/view-bound.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,wFAAwF;AACxF,8BAAsB,gBAAiB,SAAQ,WAAW;;IACxD,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAED,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAOtC,cAGC;IAED,2DAA2D;IAC3D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAE9C,wFAAwF;IACxF,SAAS,CAAC,QAAQ,CAAC,KAAK,CACtB,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,GAChC,MAAM,CAAC;IAEV;;;OAGG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAItB;IAED,sEAAsE;IACtE,IAAI,YAAY,IAAI,kBAAkB,GAAG,mBAAmB,GAAG,IAAI,CAElE;IAED,0EAA0E;IAC1E,IAAI,WAAW,IAAI,iBAAiB,GAAG,IAAI,CAE1C;IAED,iBAAiB,IAAI,IAAI,CAQxB;IAED,oBAAoB,IAAI,IAAI,CAE3B;IAED,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAKrF;CA6BF"}
@@ -0,0 +1,88 @@
1
+ import { bindContext, mount } from './bound.js';
2
+ import { stageContext } from './stage-context.js';
3
+ /** @experimental The base of the chrome elements that act on a stage's view, in 0.6. */
4
+ export class ViewBoundElement extends HTMLElement {
5
+ static get observedAttributes() {
6
+ return ['stage'];
7
+ }
8
+ shadow;
9
+ #stage = null;
10
+ /** Undone when the element unbinds from its stage. */
11
+ #release = [];
12
+ /** Undone when the stage's view or root changes (the region is built again). */
13
+ #regionRelease = [];
14
+ constructor() {
15
+ super();
16
+ this.shadow = this.attachShadow({ mode: 'open' });
17
+ }
18
+ /**
19
+ * Reflects the `stage` attribute: the id of the stage to act on; '' (no attribute) for the
20
+ * nearest one around the element. Changing it binds again.
21
+ */
22
+ get stage() {
23
+ return this.getAttribute('stage') ?? '';
24
+ }
25
+ set stage(value) {
26
+ const id = String(value);
27
+ if (id === '')
28
+ this.removeAttribute('stage');
29
+ else
30
+ this.setAttribute('stage', id);
31
+ }
32
+ /** The stage this element acts on, or null while it waits for one. */
33
+ get stageElement() {
34
+ return this.#stage?.stage ?? null;
35
+ }
36
+ /** The root whose session the stage shows, or null while either waits. */
37
+ get rootElement() {
38
+ return this.#stage?.root?.host ?? null;
39
+ }
40
+ connectedCallback() {
41
+ // Set before the element was defined: it shadows the accessor.
42
+ if (Object.hasOwn(this, 'stage')) {
43
+ const value = this.stage;
44
+ delete this.stage;
45
+ this.stage = String(value);
46
+ }
47
+ this.#bind();
48
+ }
49
+ disconnectedCallback() {
50
+ this.#unbind();
51
+ }
52
+ attributeChangedCallback(name, old, value) {
53
+ if (name === 'stage' && old !== value && this.isConnected) {
54
+ this.#unbind();
55
+ this.#bind();
56
+ }
57
+ }
58
+ #bind() {
59
+ const cancel = bindContext(this, stageContext, this.getAttribute('stage'), (ctx) => {
60
+ const stage = ctx;
61
+ this.#stage = stage;
62
+ this.#release.push(stage.watchView((view) => this.#build(view)));
63
+ });
64
+ this.#release.push(cancel);
65
+ }
66
+ /** The stage has a view (again), or lost it: show the region for it. */
67
+ #build(view) {
68
+ for (const fn of this.#regionRelease.splice(0))
69
+ fn();
70
+ this.shadow.replaceChildren();
71
+ const root = this.#stage?.root;
72
+ if (!view || !root)
73
+ return;
74
+ const release = (fn) => {
75
+ this.#regionRelease.push(fn);
76
+ };
77
+ mount(this, this.shadow, this.name, root, (ui) => this.build(ui, view, release), release);
78
+ }
79
+ #unbind() {
80
+ this.#stage = null;
81
+ for (const fn of this.#regionRelease.splice(0))
82
+ fn();
83
+ for (const fn of this.#release.splice(0))
84
+ fn();
85
+ this.shadow.replaceChildren();
86
+ }
87
+ }
88
+ //# sourceMappingURL=view-bound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-bound.js","sourceRoot":"","sources":["../../src/elements/view-bound.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `<kgdiff-view-dock>` (RFC 0001 §3), documented on its class. Importing this module defines it.
3
+ */
4
+ import type { Region } from '../bind.js';
5
+ import type { KgdiffBoundElement } from '../index.js';
6
+ import type { UiContext } from '../ui/context.js';
7
+ import { BoundElement } from './bound.js';
8
+ /**
9
+ * How the root's diff is viewed. The mode (overlay, swipe, replay; keys `1`–`3`) and "Changes only"
10
+ * (key `4`) with its context hops and the nearest "+N" expansion. Binds to a root like the other
11
+ * elements (`for`, `htmlFor`, `rootElement`). Slotted into a `<kgdiff-stage>` it replaces the
12
+ * stage's built-in dock; placed anywhere else it is not kept clear of fits and flights unless
13
+ * registered (`stage.registerObstacle`).
14
+ *
15
+ * @tagname kgdiff-view-dock
16
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
17
+ */
18
+ export declare class KgdiffViewDock extends BoundElement implements KgdiffBoundElement {
19
+ protected readonly name = "view-dock";
20
+ protected build(ui: UiContext, _ctx: unknown, release: (fn: () => void) => void): Region;
21
+ }
22
+ declare global {
23
+ interface HTMLElementTagNameMap {
24
+ /** @experimental In 0.6. */
25
+ 'kgdiff-view-dock': KgdiffBoundElement;
26
+ }
27
+ }
28
+ //# sourceMappingURL=view-dock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-dock.d.ts","sourceRoot":"","sources":["../../src/elements/view-dock.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAU,MAAM,YAAY,CAAC;AAElD;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,YAAa,YAAW,kBAAkB;IAC5E,SAAS,CAAC,QAAQ,CAAC,IAAI,eAAe;IAEtC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,GAAG,MAAM,CAUvF;CACF;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B;QAC5B,kBAAkB,EAAE,kBAAkB,CAAC;KACxC;CACF"}
@@ -0,0 +1,28 @@
1
+ import { Dock } from '../ui/dock.js';
2
+ import { BoundElement, define } from './bound.js';
3
+ /**
4
+ * How the root's diff is viewed. The mode (overlay, swipe, replay; keys `1`–`3`) and "Changes only"
5
+ * (key `4`) with its context hops and the nearest "+N" expansion. Binds to a root like the other
6
+ * elements (`for`, `htmlFor`, `rootElement`). Slotted into a `<kgdiff-stage>` it replaces the
7
+ * stage's built-in dock; placed anywhere else it is not kept clear of fits and flights unless
8
+ * registered (`stage.registerObstacle`).
9
+ *
10
+ * @tagname kgdiff-view-dock
11
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
12
+ */
13
+ export class KgdiffViewDock extends BoundElement {
14
+ name = 'view-dock';
15
+ build(ui, _ctx, release) {
16
+ const dock = new Dock(ui);
17
+ this.shadow.append(dock.el);
18
+ if (typeof ResizeObserver === 'function') {
19
+ // Narrow docks drop their labels.
20
+ const ro = new ResizeObserver(() => dock.layout());
21
+ ro.observe(this);
22
+ release(() => ro.disconnect());
23
+ }
24
+ return dock;
25
+ }
26
+ }
27
+ define('kgdiff-view-dock', KgdiffViewDock);
28
+ //# sourceMappingURL=view-dock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-dock.js","sourceRoot":"","sources":["../../src/elements/view-dock.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC3B,IAAI,GAAG,WAAW,CAAC;IAE5B,KAAK,CAAC,EAAa,EAAE,IAAa,EAAE,OAAiC;QAC7E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;YACzC,kCAAkC;YAClC,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACnD,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `<kgdiff-zoom>` (RFC 0001 §3), documented on its class. Importing this module defines it.
3
+ */
4
+ import type { Region } from '../bind.js';
5
+ import type { KgdiffStageBoundElement } from '../index.js';
6
+ import type { UiContext } from '../ui/context.js';
7
+ import type { StageView } from '../view.js';
8
+ import { ViewBoundElement } from './view-bound.js';
9
+ /**
10
+ * Zoom in, zoom out and fit, for one stage's view (the `+` / `−` / `f` keys act on every stage of
11
+ * the root). Binds to the nearest `<kgdiff-stage>` around it, or to the one `stage="<id>"` names
12
+ * (`stage`, `stageElement`, `rootElement`). Slotted into a stage it replaces the stage's built-in
13
+ * zoom buttons; placed anywhere else it is not kept clear of fits and flights unless registered.
14
+ *
15
+ * @tagname kgdiff-zoom
16
+ * @experimental In 0.6; stable from 0.7 (RFC 0001, decision 7).
17
+ */
18
+ export declare class KgdiffZoom extends ViewBoundElement implements KgdiffStageBoundElement {
19
+ protected readonly name = "zoom";
20
+ protected build(ui: UiContext, view: StageView): Region;
21
+ }
22
+ declare global {
23
+ interface HTMLElementTagNameMap {
24
+ /** @experimental In 0.6. */
25
+ 'kgdiff-zoom': KgdiffStageBoundElement;
26
+ }
27
+ }
28
+ //# sourceMappingURL=zoom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../src/elements/zoom.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;;;;;GAQG;AACH,qBAAa,UAAW,SAAQ,gBAAiB,YAAW,uBAAuB;IACjF,SAAS,CAAC,QAAQ,CAAC,IAAI,UAAU;IAEjC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAItD;CACF;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,4BAA4B;QAC5B,aAAa,EAAE,uBAAuB,CAAC;KACxC;CACF"}