@sciflow/editor-start 0.0.1-beta → 0.0.2

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 (57) hide show
  1. package/README.md +83 -2
  2. package/THIRD_PARTY_LICENSES +9 -0
  3. package/bin/extract-translations.mjs +54 -0
  4. package/dist/bundle/sciflow-editor.css +1 -1
  5. package/dist/bundle/sciflow-editor.js +10590 -15324
  6. package/dist/index.d.ts +7 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +6 -3
  9. package/dist/lib/citation-source-adapter.d.ts +22 -2
  10. package/dist/lib/citation-source-adapter.d.ts.map +1 -1
  11. package/dist/lib/citation-source-adapter.js +104 -48
  12. package/dist/lib/drag-preview.d.ts +13 -0
  13. package/dist/lib/drag-preview.d.ts.map +1 -0
  14. package/dist/lib/drag-preview.js +43 -0
  15. package/dist/lib/editor-element.d.ts +30 -4
  16. package/dist/lib/editor-element.d.ts.map +1 -1
  17. package/dist/lib/editor-element.js +131 -30
  18. package/dist/lib/format-bar.d.ts +26 -2
  19. package/dist/lib/format-bar.d.ts.map +1 -1
  20. package/dist/lib/format-bar.js +369 -56
  21. package/dist/lib/ghost-cursor.d.ts +10 -0
  22. package/dist/lib/ghost-cursor.d.ts.map +1 -0
  23. package/dist/lib/ghost-cursor.js +59 -0
  24. package/dist/lib/icons-generated.d.ts +14 -0
  25. package/dist/lib/icons-generated.d.ts.map +1 -0
  26. package/dist/lib/icons-generated.js +60 -0
  27. package/dist/lib/outline.d.ts +18 -10
  28. package/dist/lib/outline.d.ts.map +1 -1
  29. package/dist/lib/outline.js +184 -28
  30. package/dist/lib/reference-list.d.ts +10 -2
  31. package/dist/lib/reference-list.d.ts.map +1 -1
  32. package/dist/lib/reference-list.js +47 -9
  33. package/dist/lib/selection-editor.d.ts +83 -5
  34. package/dist/lib/selection-editor.d.ts.map +1 -1
  35. package/dist/lib/selection-editor.js +1225 -147
  36. package/dist/lib/selection-transform-registry.d.ts +16 -0
  37. package/dist/lib/selection-transform-registry.d.ts.map +1 -0
  38. package/dist/lib/selection-transform-registry.js +24 -0
  39. package/dist/lib/selection-ui-renderer.d.ts +22 -0
  40. package/dist/lib/selection-ui-renderer.d.ts.map +1 -0
  41. package/dist/lib/selection-ui-renderer.js +244 -0
  42. package/dist/lib/selection-widget-host.d.ts +67 -0
  43. package/dist/lib/selection-widget-host.d.ts.map +1 -0
  44. package/dist/lib/selection-widget-host.js +151 -0
  45. package/dist/lib/selection-widget-registry.d.ts +16 -0
  46. package/dist/lib/selection-widget-registry.d.ts.map +1 -0
  47. package/dist/lib/selection-widget-registry.js +30 -0
  48. package/dist/lib/test-fixtures/soak-documents.d.ts +13 -0
  49. package/dist/lib/test-fixtures/soak-documents.d.ts.map +1 -0
  50. package/dist/lib/test-fixtures/soak-documents.js +69 -0
  51. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  52. package/package.json +22 -13
  53. package/dist/demo/demo.js +0 -56
  54. package/dist/demo/index.html +0 -169
  55. package/dist/lib/citation-drop.d.ts +0 -25
  56. package/dist/lib/citation-drop.d.ts.map +0 -1
  57. package/dist/lib/citation-drop.js +0 -53
@@ -26,9 +26,10 @@
26
26
  import { __decorate } from "tslib";
27
27
  import { css, html, unsafeCSS, LitElement } from 'lit';
28
28
  import { customElement, property } from 'lit/decorators.js';
29
- import { Editor, SourceField, citationFeature, figureFeature, headingFeature, markFormattingFeature, tableFeature, } from '@sciflow/editor-core';
29
+ import { Editor, SourceField, setLocale, citationFeature, crossReferenceFeature, figureFeature, footnoteFeature, headingFeature, hyperlinkFeature, markFormattingFeature, mathFeature, paragraphFeature, tableFeature, } from '@sciflow/editor-core';
30
30
  import { manuscript as manuscriptSchema } from '@sciflow/schema-prosemirror';
31
31
  import editorStyles from './editor-element.css?inline';
32
+ import { ghostCursorFeature } from './ghost-cursor.js';
32
33
  import { applyThemeStylesToRoot, subscribeToSciFlowTheme } from './theme.js';
33
34
  /**
34
35
  * Custom element that owns a SciFlow editor instance.
@@ -73,6 +74,25 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
73
74
  this.headingText = 'Moby-Dick: A Study in Obsession';
74
75
  /** Paragraph text used when no initial content is provided. */
75
76
  this.placeholder = 'Introduce Ishmael and the enigmatic Captain Ahab…';
77
+ /**
78
+ * Max-width of the ProseMirror content area.
79
+ * Approximates page-like text columns at 11pt:
80
+ * - 'narrow': narrow column (~52 characters per line)
81
+ * - 'wide': normal column (~82 characters per line)
82
+ * Styles are applied to the shadow DOM.
83
+ */
84
+ this.editorWidth = 'wide';
85
+ /**
86
+ * UI locale for all editor components and command metadata.
87
+ * Setting this attribute calls `setLocale()` and triggers a
88
+ * `sciflow-locale-change` event so all components re-render.
89
+ *
90
+ * @example
91
+ * ```html
92
+ * <sciflow-editor locale="de"></sciflow-editor>
93
+ * ```
94
+ */
95
+ this.locale = null;
76
96
  this.view = null;
77
97
  this.pendingOps = [];
78
98
  this.pendingOpsFromTransform = false;
@@ -80,6 +100,7 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
80
100
  this.deferInitializationForDoc = false;
81
101
  this.shadowStyleElements = [];
82
102
  this.themeStyleElements = [];
103
+ this._hostDragoverBound = null;
83
104
  }
84
105
  get shadowStyles() {
85
106
  return this._shadowStyles;
@@ -102,6 +123,14 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
102
123
  get document() {
103
124
  return this.editor?.getDocument() ?? null;
104
125
  }
126
+ /** Get the current references (bibliography) stored with the document. */
127
+ get references() {
128
+ return this.editor?.getReferences() ?? [];
129
+ }
130
+ /** Get the merged selection UI schema (Draft-07 + _ui_*), when available. */
131
+ getSelectionUiSchema() {
132
+ return this.editor?.getSelectionUiSchema?.();
133
+ }
105
134
  /** Get position utilities for coordinate mapping. */
106
135
  get positions() {
107
136
  return {
@@ -138,23 +167,25 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
138
167
  }
139
168
  connectedCallback() {
140
169
  super.connectedCallback();
170
+ if (this.locale) {
171
+ setLocale(this.locale);
172
+ }
173
+ this._hostDragoverBound = (e) => {
174
+ if (!e.dataTransfer?.types || !this.contains(e.target))
175
+ return;
176
+ const types = Array.from(e.dataTransfer.types);
177
+ const allow = types.includes('application/x-sciflow-reference') ||
178
+ types.includes('application/x-sciflow-cross-reference');
179
+ if (!allow)
180
+ return;
181
+ e.preventDefault();
182
+ e.dataTransfer.dropEffect = 'copy';
183
+ };
184
+ this.addEventListener('dragover', this._hostDragoverBound, { capture: true });
141
185
  this.themeUnsub = subscribeToSciFlowTheme((cssTexts) => {
142
186
  this.themeStyleElements = applyThemeStylesToRoot(this.renderRoot, this.themeStyleElements, cssTexts);
143
187
  this.applyShadowStyles();
144
188
  });
145
- queueMicrotask(() => {
146
- this.debugTestLog('connected microtask', { hasEditor: !!this.editor });
147
- if (this.editor) {
148
- return;
149
- }
150
- try {
151
- const initialDoc = this.resolveInitialDoc();
152
- this.dispatchEditorChange(initialDoc.toJSON(), [], []);
153
- }
154
- catch {
155
- // Ignore errors during eager ready dispatch; initialization will retry in firstUpdated.
156
- }
157
- });
158
189
  }
159
190
  /**
160
191
  * React to property changes coming from the host application.
@@ -173,10 +204,16 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
173
204
  if (changedProperties.has('shadowStyles') && !this._shadowStylesAppliedExternally) {
174
205
  this.applyShadowStyles();
175
206
  }
207
+ if (changedProperties.has('editorWidth')) {
208
+ this.applyShadowStyles();
209
+ }
176
210
  // Reset flag for next update
177
211
  if (changedProperties.has('shadowStyles')) {
178
212
  this._shadowStylesAppliedExternally = false;
179
213
  }
214
+ if (changedProperties.has('locale') && this.locale) {
215
+ setLocale(this.locale);
216
+ }
180
217
  if (changedProperties.has('doc')) {
181
218
  this.applyDocUpdate();
182
219
  }
@@ -186,6 +223,10 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
186
223
  * Other frameworks should execute the same logic in their unmount hook.
187
224
  */
188
225
  disconnectedCallback() {
226
+ if (this._hostDragoverBound) {
227
+ this.removeEventListener('dragover', this._hostDragoverBound, { capture: true });
228
+ this._hostDragoverBound = null;
229
+ }
189
230
  super.disconnectedCallback();
190
231
  this.themeUnsub?.();
191
232
  this.themeUnsub = undefined;
@@ -215,7 +256,19 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
215
256
  * Resolves a mount point, creates the editor instance, and wires listeners.
216
257
  */
217
258
  getDefaultFeatures() {
218
- return [citationFeature, markFormattingFeature, headingFeature, figureFeature, tableFeature];
259
+ return [
260
+ citationFeature,
261
+ crossReferenceFeature,
262
+ footnoteFeature,
263
+ hyperlinkFeature,
264
+ markFormattingFeature,
265
+ paragraphFeature,
266
+ headingFeature,
267
+ figureFeature,
268
+ tableFeature,
269
+ mathFeature,
270
+ ghostCursorFeature,
271
+ ];
219
272
  }
220
273
  getActiveFeatures() {
221
274
  return this.features ?? this.getDefaultFeatures();
@@ -224,13 +277,11 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
224
277
  return this.doc === null && this.initialContent === null;
225
278
  }
226
279
  async initializeView() {
227
- this.debugTestLog('initializeView invoked');
228
280
  if (this.view) {
229
281
  return;
230
282
  }
231
283
  const mountPoint = this.renderRoot.querySelector('.editor');
232
284
  if (!mountPoint) {
233
- this.debugTestLog('initializeView: mount point missing');
234
285
  return;
235
286
  }
236
287
  const initialDoc = this.resolveInitialDoc();
@@ -263,11 +314,7 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
263
314
  this.editor = editor;
264
315
  editor.mount(mountPoint);
265
316
  this.view = editor.getView();
266
- this.debugTestLog('editor mounted', { hasView: !!this.view });
267
- const runner = editor.getCommands();
268
- this.debugTestLog('command keys', runner ? Object.keys(runner.commands) : null);
269
317
  this.docUnsub = editor.onDoc((doc) => {
270
- this.debugTestLog('dispatching editor-change', { ops: this.pendingOps.length });
271
318
  const files = editor.getFiles();
272
319
  this.dispatchEditorChange(doc, this.pendingOps, files);
273
320
  this.pendingOps = [];
@@ -277,6 +324,7 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
277
324
  this.dispatchSelectionChange(selection);
278
325
  });
279
326
  this.validationUnsub = editor.onValidation(() => undefined);
327
+ this.dispatchEditorChange(initialDoc.toJSON(), [], editor.getFiles());
280
328
  this.dispatchEditorReady();
281
329
  this.initialSelection = undefined;
282
330
  }
@@ -294,6 +342,9 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
294
342
  if (!update) {
295
343
  return;
296
344
  }
345
+ if (this.isNoopSyncUpdate(update)) {
346
+ return;
347
+ }
297
348
  this.pendingOps = [];
298
349
  this.pendingOpsFromTransform = false;
299
350
  this.editor.updateFromSync(update);
@@ -366,6 +417,46 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
366
417
  }
367
418
  return { doc: input };
368
419
  }
420
+ isNoopSyncUpdate(update) {
421
+ const editor = this.editor;
422
+ if (!editor) {
423
+ return false;
424
+ }
425
+ if (update.doc !== undefined && !this.deepEqualsJSON(update.doc, editor.getDoc())) {
426
+ return false;
427
+ }
428
+ if (update.selection !== undefined) {
429
+ const current = editor.getSelection();
430
+ if (!current) {
431
+ return false;
432
+ }
433
+ if (update.selection.anchor !== current.anchor || update.selection.head !== current.head) {
434
+ return false;
435
+ }
436
+ }
437
+ if (update.version !== undefined && update.version !== editor.getVersion()) {
438
+ return false;
439
+ }
440
+ if (update.files !== undefined && !this.deepEqualsJSON(update.files, editor.getFiles())) {
441
+ return false;
442
+ }
443
+ if (update.references !== undefined &&
444
+ !this.deepEqualsJSON(update.references, editor.getReferences())) {
445
+ return false;
446
+ }
447
+ return true;
448
+ }
449
+ deepEqualsJSON(left, right) {
450
+ if (left === right) {
451
+ return true;
452
+ }
453
+ try {
454
+ return JSON.stringify(left) === JSON.stringify(right);
455
+ }
456
+ catch {
457
+ return false;
458
+ }
459
+ }
369
460
  /**
370
461
  * Determine which document should be loaded on startup.
371
462
  * Preference order: externally supplied JSON, provided PM node, fallback.
@@ -482,7 +573,6 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
482
573
  * Applications can listen and update their stores or routing state.
483
574
  */
484
575
  dispatchEditorChange(doc, operations, files) {
485
- this.debugTestLog('editor-change event', { doc, operations });
486
576
  this.dispatchEvent(new CustomEvent('editor-change', {
487
577
  detail: { doc, operations, files, references: this.editor?.getReferences() ?? [] },
488
578
  bubbles: true,
@@ -601,6 +691,10 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
601
691
  }
602
692
  this.shadowStyleElements = [];
603
693
  const cssTexts = this.normalizeShadowStyles(this.shadowStyles);
694
+ const widthCss = this.getEditorWidthStyles();
695
+ if (widthCss) {
696
+ cssTexts.push(widthCss);
697
+ }
604
698
  if (cssTexts.length === 0) {
605
699
  return;
606
700
  }
@@ -611,6 +705,15 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
611
705
  this.shadowStyleElements.push(styleEl);
612
706
  }
613
707
  }
708
+ getEditorWidthStyles() {
709
+ const isNarrow = this.editorWidth === 'narrow';
710
+ return `.ProseMirror {
711
+ font-size: 11pt;
712
+ max-width: ${isNarrow ? '52ch' : '82ch'};
713
+ margin-left: auto;
714
+ margin-right: auto;
715
+ }`;
716
+ }
614
717
  normalizeShadowStyles(styles) {
615
718
  if (!styles) {
616
719
  return [];
@@ -648,14 +751,6 @@ let SciFlowEditorElement = class SciFlowEditorElement extends LitElement {
648
751
  return null;
649
752
  }
650
753
  }
651
- debugTestLog(message, payload) {
652
- const isDebug = (typeof process !== 'undefined' && process.env?.DEBUG_TESTS === 'true') ||
653
- (typeof import.meta !== 'undefined' && import.meta.env?.DEBUG_TESTS === 'true');
654
- if (!isDebug) {
655
- return;
656
- }
657
- console.log('[sciflow-editor]', message, payload ?? '');
658
- }
659
754
  };
660
755
  __decorate([
661
756
  property({ attribute: false })
@@ -675,6 +770,12 @@ __decorate([
675
770
  __decorate([
676
771
  property({ type: String })
677
772
  ], SciFlowEditorElement.prototype, "placeholder", void 0);
773
+ __decorate([
774
+ property({ type: String })
775
+ ], SciFlowEditorElement.prototype, "editorWidth", void 0);
776
+ __decorate([
777
+ property({ type: String, reflect: true })
778
+ ], SciFlowEditorElement.prototype, "locale", void 0);
678
779
  SciFlowEditorElement = __decorate([
679
780
  customElement('sciflow-editor')
680
781
  ], SciFlowEditorElement);
@@ -36,11 +36,15 @@ export declare class SciFlowFormatBarElement extends LitElement {
36
36
  /** ID reference to resolve an editor instance declaratively. */
37
37
  for?: string;
38
38
  private selectionVersion;
39
+ private styleMenuOpen;
40
+ private insertMenuOpen;
39
41
  private resolvedEditor;
40
42
  private selectionListener?;
41
43
  private readyListener?;
44
+ private localeListener?;
42
45
  private themeUnsub?;
43
46
  private themeStyleElements;
47
+ private outsideClickHandler?;
44
48
  static styles: import("lit").CSSResult;
45
49
  /** Subscribe to editor events once the toolbar attaches to the DOM. */
46
50
  connectedCallback(): void;
@@ -56,6 +60,20 @@ export declare class SciFlowFormatBarElement extends LitElement {
56
60
  * command runner so the UI stays in sync with the currently loaded features.
57
61
  */
58
62
  protected render(): import("lit-html").TemplateResult<1>;
63
+ private renderStyleDropdown;
64
+ private toggleStyleMenu;
65
+ private selectStyle;
66
+ private isBlockquoteActive;
67
+ private canUseCommand;
68
+ private renderInsertDropdown;
69
+ private toggleInsertMenu;
70
+ private executeInsertCommand;
71
+ private installOutsideClickHandler;
72
+ private removeOutsideClickHandler;
73
+ /**
74
+ * Render fixed toolbar commands that are not driven by metadata groups.
75
+ */
76
+ private renderFixedCommandButton;
59
77
  /**
60
78
  * Find the target editor element and attach listeners for selection changes.
61
79
  * This mirrors the wiring a framework component would perform in `useEffect`.
@@ -66,8 +84,6 @@ export declare class SciFlowFormatBarElement extends LitElement {
66
84
  private detachEditorListeners;
67
85
  /** Convenience getter mirroring `editor.getCommands()`. */
68
86
  private getCommandRunner;
69
- /** Interpret the block-style dropdown and trigger the relevant commands. */
70
- private handleStyleChange;
71
87
  /** Apply a specific heading level after ensuring the editor can handle it. */
72
88
  private handleSetHeading;
73
89
  /** Reset the current block back to a paragraph. */
@@ -76,9 +92,17 @@ export declare class SciFlowFormatBarElement extends LitElement {
76
92
  private getActiveBlockStyle;
77
93
  /** Check if a style option can be executed against the current editor state. */
78
94
  private canUseStyleOption;
95
+ /** True if the current selection is inside a table (cell or header). */
96
+ private isSelectionInTable;
97
+ /**
98
+ * Render table commands split into logical sub-groups (columns, rows,
99
+ * merge/split, header toggles, navigation/delete) separated visually.
100
+ */
101
+ private renderTableSubGroups;
79
102
  /**
80
103
  * Render a set of command buttons that share the same metadata group.
81
104
  * Groups are sorted by each command's declared order so feature authors control layout.
105
+ * When onlyCommandNames is set, only those commands in the group are rendered.
82
106
  */
83
107
  private renderCommandGroup;
84
108
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"format-bar.d.ts","sourceRoot":"","sources":["../../src/lib/format-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAa,UAAU,EAAa,MAAM,KAAK,CAAC;AAKvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAoBhE;;;;;;;;;;;GAWG;AACH,qBACa,uBAAwB,SAAQ,UAAU;IACrD,oFAAoF;IAEpF,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE3C,gEAAgE;IAEhE,GAAG,CAAC,EAAE,MAAM,CAAC;IAGb,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,iBAAiB,CAAC,CAAgB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,kBAAkB,CAA0B;IAEpD,OAAgB,MAAM,0BAAmC;IAEzD,uEAAuE;IAC9D,iBAAiB,IAAI,IAAI;IAYlC,qDAAqD;IAC5C,oBAAoB,IAAI,IAAI;IAOrC;;;OAGG;cACgB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMjF;;;OAGG;cACgB,MAAM;IAiDzB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA+B9B,OAAO,CAAC,aAAa;IAkBrB,+DAA+D;IAC/D,OAAO,CAAC,qBAAqB;IAc7B,2DAA2D;IAC3D,OAAO,CAAC,gBAAgB;IAIxB,4EAA4E;IAC5E,OAAO,CAAC,iBAAiB;IAiBzB,8EAA8E;IAC9E,OAAO,CAAC,gBAAgB;IA6BxB,mDAAmD;IACnD,OAAO,CAAC,kBAAkB;IA6B1B,yEAAyE;IACzE,OAAO,CAAC,mBAAmB;IA6C3B,gFAAgF;IAChF,OAAO,CAAC,iBAAiB;IAmBzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuC3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA2BzB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,mBAAmB,EAAE,uBAAuB,CAAC;KAC9C;CACF"}
1
+ {"version":3,"file":"format-bar.d.ts","sourceRoot":"","sources":["../../src/lib/format-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAa,UAAU,EAAsB,MAAM,KAAK,CAAC;AAOhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAoChE;;;;;;;;;;;GAWG;AACH,qBACa,uBAAwB,SAAQ,UAAU;IACrD,oFAAoF;IAEpF,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAE3C,gEAAgE;IAEhE,GAAG,CAAC,EAAE,MAAM,CAAC;IAGb,OAAO,CAAC,gBAAgB,CAAK;IAG7B,OAAO,CAAC,aAAa,CAAS;IAG9B,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,iBAAiB,CAAC,CAAgB;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,UAAU,CAAC,CAAa;IAChC,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,mBAAmB,CAAC,CAA0B;IAEtD,OAAgB,MAAM,0BAAmC;IAEzD,uEAAuE;IAC9D,iBAAiB,IAAI,IAAI;IAoBlC,qDAAqD;IAC5C,oBAAoB,IAAI,IAAI;IAYrC;;;OAGG;cACgB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAMjF;;;OAGG;cACgB,MAAM;IAwCzB,OAAO,CAAC,mBAAmB;IAyD3B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,kBAAkB;IAc1B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,oBAAoB;IAuD5B,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,0BAA0B;IAkBlC,OAAO,CAAC,yBAAyB;IAWjC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA2ChC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA+B9B,OAAO,CAAC,aAAa;IAkBrB,+DAA+D;IAC/D,OAAO,CAAC,qBAAqB;IAc7B,2DAA2D;IAC3D,OAAO,CAAC,gBAAgB;IAQxB,8EAA8E;IAC9E,OAAO,CAAC,gBAAgB;IA6BxB,mDAAmD;IACnD,OAAO,CAAC,kBAAkB;IA6B1B,yEAAyE;IACzE,OAAO,CAAC,mBAAmB;IA6C3B,gFAAgF;IAChF,OAAO,CAAC,iBAAiB;IAmBzB,wEAAwE;IACxE,OAAO,CAAC,kBAAkB;IAmB1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAkB5B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAuC3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;CA2BzB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,mBAAmB,EAAE,uBAAuB,CAAC;KAC9C;CACF"}