notations 1.0.2 → 1.0.6

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 (105) hide show
  1. package/README.md +1 -0
  2. package/dist/notations.umd.js +4234 -12211
  3. package/dist/notations.umd.min.js +2 -3
  4. package/dist/notations.umd.min.js.map +1 -1
  5. package/lib/cjs/block.d.ts +4 -0
  6. package/lib/cjs/block.js +24 -0
  7. package/lib/cjs/block.js.map +1 -1
  8. package/lib/cjs/core.d.ts +15 -0
  9. package/lib/cjs/core.js +144 -4
  10. package/lib/cjs/core.js.map +1 -1
  11. package/lib/cjs/entity.d.ts +4 -0
  12. package/lib/cjs/entity.js +12 -0
  13. package/lib/cjs/entity.js.map +1 -1
  14. package/lib/cjs/events.d.ts +56 -0
  15. package/lib/cjs/events.js +27 -0
  16. package/lib/cjs/events.js.map +1 -0
  17. package/lib/cjs/index.d.ts +1 -0
  18. package/lib/cjs/index.js +1 -0
  19. package/lib/cjs/index.js.map +1 -1
  20. package/lib/cjs/parser.js +1 -1
  21. package/lib/cjs/parser.js.map +1 -1
  22. package/lib/cjs/shapes.d.ts +11 -0
  23. package/lib/cjs/shapes.js +25 -2
  24. package/lib/cjs/shapes.js.map +1 -1
  25. package/lib/cjs/web/components/DockViewPlayground.d.ts +51 -0
  26. package/lib/cjs/web/components/DockViewPlayground.js +364 -0
  27. package/lib/cjs/web/components/DockViewPlayground.js.map +1 -0
  28. package/lib/cjs/web/components/NotationBlock.d.ts +35 -0
  29. package/lib/cjs/web/components/NotationBlock.js +219 -0
  30. package/lib/cjs/web/components/NotationBlock.js.map +1 -0
  31. package/lib/cjs/web/components/NotebookCell.d.ts +41 -0
  32. package/lib/cjs/web/components/NotebookCell.js +269 -0
  33. package/lib/cjs/web/components/NotebookCell.js.map +1 -0
  34. package/lib/cjs/web/components/NotebookView.d.ts +37 -0
  35. package/lib/cjs/web/components/NotebookView.js +379 -0
  36. package/lib/cjs/web/components/NotebookView.js.map +1 -0
  37. package/lib/cjs/web/components/SideBySideEditor.d.ts +47 -0
  38. package/lib/cjs/web/components/SideBySideEditor.js +171 -0
  39. package/lib/cjs/web/components/SideBySideEditor.js.map +1 -0
  40. package/lib/cjs/web/dockview.d.ts +2 -0
  41. package/lib/cjs/web/dockview.js +11 -0
  42. package/lib/cjs/web/dockview.js.map +1 -0
  43. package/lib/cjs/web/index.d.ts +8 -0
  44. package/lib/cjs/web/index.js +34 -0
  45. package/lib/cjs/web/index.js.map +1 -0
  46. package/lib/cjs/web/types/notebook.d.ts +64 -0
  47. package/lib/cjs/web/types/notebook.js +56 -0
  48. package/lib/cjs/web/types/notebook.js.map +1 -0
  49. package/lib/cjs/web/utils/cellFactory.d.ts +16 -0
  50. package/lib/cjs/web/utils/cellFactory.js +137 -0
  51. package/lib/cjs/web/utils/cellFactory.js.map +1 -0
  52. package/lib/cjs/web/utils/sourceSerializer.d.ts +19 -0
  53. package/lib/cjs/web/utils/sourceSerializer.js +162 -0
  54. package/lib/cjs/web/utils/sourceSerializer.js.map +1 -0
  55. package/lib/esm/block.d.ts +4 -0
  56. package/lib/esm/block.js +24 -0
  57. package/lib/esm/block.js.map +1 -1
  58. package/lib/esm/core.d.ts +15 -0
  59. package/lib/esm/core.js +144 -4
  60. package/lib/esm/core.js.map +1 -1
  61. package/lib/esm/entity.d.ts +4 -0
  62. package/lib/esm/entity.js +12 -0
  63. package/lib/esm/entity.js.map +1 -1
  64. package/lib/esm/events.d.ts +56 -0
  65. package/lib/esm/events.js +24 -0
  66. package/lib/esm/events.js.map +1 -0
  67. package/lib/esm/index.d.ts +1 -0
  68. package/lib/esm/index.js +1 -0
  69. package/lib/esm/index.js.map +1 -1
  70. package/lib/esm/parser.js +1 -1
  71. package/lib/esm/parser.js.map +1 -1
  72. package/lib/esm/shapes.d.ts +11 -0
  73. package/lib/esm/shapes.js +24 -2
  74. package/lib/esm/shapes.js.map +1 -1
  75. package/lib/esm/web/components/DockViewPlayground.d.ts +51 -0
  76. package/lib/esm/web/components/DockViewPlayground.js +358 -0
  77. package/lib/esm/web/components/DockViewPlayground.js.map +1 -0
  78. package/lib/esm/web/components/NotationBlock.d.ts +35 -0
  79. package/lib/esm/web/components/NotationBlock.js +216 -0
  80. package/lib/esm/web/components/NotationBlock.js.map +1 -0
  81. package/lib/esm/web/components/NotebookCell.d.ts +41 -0
  82. package/lib/esm/web/components/NotebookCell.js +266 -0
  83. package/lib/esm/web/components/NotebookCell.js.map +1 -0
  84. package/lib/esm/web/components/NotebookView.d.ts +37 -0
  85. package/lib/esm/web/components/NotebookView.js +376 -0
  86. package/lib/esm/web/components/NotebookView.js.map +1 -0
  87. package/lib/esm/web/components/SideBySideEditor.d.ts +47 -0
  88. package/lib/esm/web/components/SideBySideEditor.js +168 -0
  89. package/lib/esm/web/components/SideBySideEditor.js.map +1 -0
  90. package/lib/esm/web/dockview.d.ts +2 -0
  91. package/lib/esm/web/dockview.js +3 -0
  92. package/lib/esm/web/dockview.js.map +1 -0
  93. package/lib/esm/web/index.d.ts +8 -0
  94. package/lib/esm/web/index.js +9 -0
  95. package/lib/esm/web/index.js.map +1 -0
  96. package/lib/esm/web/types/notebook.d.ts +64 -0
  97. package/lib/esm/web/types/notebook.js +50 -0
  98. package/lib/esm/web/types/notebook.js.map +1 -0
  99. package/lib/esm/web/utils/cellFactory.d.ts +16 -0
  100. package/lib/esm/web/utils/cellFactory.js +127 -0
  101. package/lib/esm/web/utils/cellFactory.js.map +1 -0
  102. package/lib/esm/web/utils/sourceSerializer.d.ts +19 -0
  103. package/lib/esm/web/utils/sourceSerializer.js +154 -0
  104. package/lib/esm/web/utils/sourceSerializer.js.map +1 -0
  105. package/package.json +43 -1
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const dockview_core_1 = require("dockview-core");
7
+ const SideBySideEditor_1 = __importDefault(require("./SideBySideEditor"));
8
+ const DEFAULT_CONFIG = {
9
+ showConsole: true,
10
+ persistLayout: true,
11
+ storageKey: "notations-playground-layout",
12
+ layoutVersion: 1,
13
+ syncScroll: true,
14
+ };
15
+ class DockViewPlayground {
16
+ constructor(container, config = {}) {
17
+ var _a;
18
+ this.dockview = null;
19
+ this.sideBySideEditor = null;
20
+ this.consoleOutput = null;
21
+ this.consoleEntries = [];
22
+ this.container = container;
23
+ this.config = Object.assign(Object.assign({}, DEFAULT_CONFIG), config);
24
+ this._consoleVisible = (_a = this.config.showConsole) !== null && _a !== void 0 ? _a : true;
25
+ this.init();
26
+ }
27
+ get editor() {
28
+ return this.sideBySideEditor;
29
+ }
30
+ get source() {
31
+ var _a;
32
+ return ((_a = this.sideBySideEditor) === null || _a === void 0 ? void 0 : _a.source) || "";
33
+ }
34
+ set source(value) {
35
+ if (this.sideBySideEditor) {
36
+ this.sideBySideEditor.source = value;
37
+ }
38
+ }
39
+ log(message, level = "info") {
40
+ const entry = {
41
+ timestamp: new Date(),
42
+ level,
43
+ message,
44
+ };
45
+ this.consoleEntries.push(entry);
46
+ this.renderConsoleEntry(entry);
47
+ }
48
+ clearConsole() {
49
+ this.consoleEntries = [];
50
+ if (this.consoleOutput) {
51
+ this.consoleOutput.innerHTML = "";
52
+ }
53
+ }
54
+ render() {
55
+ var _a;
56
+ return ((_a = this.sideBySideEditor) === null || _a === void 0 ? void 0 : _a.render()) || false;
57
+ }
58
+ destroy() {
59
+ var _a, _b;
60
+ (_a = this.sideBySideEditor) === null || _a === void 0 ? void 0 : _a.destroy();
61
+ (_b = this.dockview) === null || _b === void 0 ? void 0 : _b.dispose();
62
+ this.container.innerHTML = "";
63
+ }
64
+ resetLayout() {
65
+ if (this.config.storageKey) {
66
+ localStorage.removeItem(this.config.storageKey);
67
+ }
68
+ if (this.dockview) {
69
+ this.dockview.clear();
70
+ this.createDefaultLayout();
71
+ }
72
+ }
73
+ isConsoleVisible() {
74
+ return this._consoleVisible;
75
+ }
76
+ showConsole() {
77
+ var _a;
78
+ if (this._consoleVisible || !this.dockview)
79
+ return;
80
+ this.dockview.addPanel({
81
+ id: "console",
82
+ component: "console",
83
+ title: "Console",
84
+ position: { direction: "below", referencePanel: "editor" },
85
+ });
86
+ const consolePanel = this.dockview.getPanel("console");
87
+ const containerHeight = this.container.clientHeight || 600;
88
+ if ((_a = consolePanel === null || consolePanel === void 0 ? void 0 : consolePanel.group) === null || _a === void 0 ? void 0 : _a.api) {
89
+ consolePanel.group.api.setSize({ height: Math.floor(containerHeight * 0.1) });
90
+ }
91
+ this._consoleVisible = true;
92
+ }
93
+ hideConsole() {
94
+ if (!this._consoleVisible || !this.dockview)
95
+ return;
96
+ const consolePanel = this.dockview.getPanel("console");
97
+ if (consolePanel) {
98
+ consolePanel.api.close();
99
+ }
100
+ this._consoleVisible = false;
101
+ }
102
+ toggleConsole() {
103
+ if (this._consoleVisible) {
104
+ this.hideConsole();
105
+ }
106
+ else {
107
+ this.showConsole();
108
+ }
109
+ return this._consoleVisible;
110
+ }
111
+ init() {
112
+ if (!this.container.style.height && !this.container.offsetHeight) {
113
+ this.container.style.height = "100%";
114
+ }
115
+ this.container.style.width = this.container.style.width || "100%";
116
+ const isDark = this.isDarkMode();
117
+ this.container.classList.add(isDark ? "dockview-theme-dark" : "dockview-theme-light");
118
+ const observer = new MutationObserver(() => {
119
+ const dark = this.isDarkMode();
120
+ this.container.classList.remove("dockview-theme-dark", "dockview-theme-light");
121
+ this.container.classList.add(dark ? "dockview-theme-dark" : "dockview-theme-light");
122
+ });
123
+ observer.observe(document.documentElement, {
124
+ attributes: true,
125
+ attributeFilter: ["class"],
126
+ });
127
+ const dockviewComponent = new dockview_core_1.DockviewComponent(this.container, {
128
+ createComponent: (options) => this.createComponent(options),
129
+ });
130
+ this.dockview = dockviewComponent.api;
131
+ if (!this.config.persistLayout || !this.loadLayout()) {
132
+ this.createDefaultLayout();
133
+ }
134
+ if (this.config.persistLayout) {
135
+ this.dockview.onDidLayoutChange(() => {
136
+ this.saveLayout();
137
+ });
138
+ }
139
+ this.log("Playground initialized", "info");
140
+ }
141
+ isDarkMode() {
142
+ if (this.config.isDarkMode) {
143
+ return this.config.isDarkMode();
144
+ }
145
+ return document.documentElement.classList.contains("dark");
146
+ }
147
+ saveLayout() {
148
+ if (!this.dockview || !this.config.storageKey)
149
+ return;
150
+ try {
151
+ const layout = this.dockview.toJSON();
152
+ const data = {
153
+ version: this.config.layoutVersion,
154
+ layout,
155
+ };
156
+ localStorage.setItem(this.config.storageKey, JSON.stringify(data));
157
+ }
158
+ catch (e) {
159
+ console.warn("Failed to save layout:", e);
160
+ }
161
+ }
162
+ loadLayout() {
163
+ if (!this.dockview || !this.config.storageKey)
164
+ return false;
165
+ try {
166
+ const saved = localStorage.getItem(this.config.storageKey);
167
+ if (saved) {
168
+ const data = JSON.parse(saved);
169
+ if (data.version !== this.config.layoutVersion) {
170
+ localStorage.removeItem(this.config.storageKey);
171
+ return false;
172
+ }
173
+ this.dockview.fromJSON(data.layout);
174
+ return true;
175
+ }
176
+ }
177
+ catch (e) {
178
+ console.warn("Failed to load layout:", e);
179
+ if (this.config.storageKey) {
180
+ localStorage.removeItem(this.config.storageKey);
181
+ }
182
+ }
183
+ return false;
184
+ }
185
+ createComponent(options) {
186
+ switch (options.name) {
187
+ case "editor":
188
+ return this.createEditorPanel();
189
+ case "output":
190
+ return this.createOutputPanel();
191
+ case "console":
192
+ return this.createConsolePanel();
193
+ default:
194
+ return {
195
+ element: document.createElement("div"),
196
+ init: () => { },
197
+ };
198
+ }
199
+ }
200
+ createDefaultLayout() {
201
+ var _a, _b, _c;
202
+ if (!this.dockview)
203
+ return;
204
+ const containerHeight = this.container.clientHeight || 600;
205
+ const containerWidth = this.container.clientWidth || 800;
206
+ this.dockview.addPanel({
207
+ id: "editor",
208
+ component: "editor",
209
+ title: "Editor",
210
+ });
211
+ if (this._consoleVisible) {
212
+ this.dockview.addPanel({
213
+ id: "console",
214
+ component: "console",
215
+ title: "Console",
216
+ position: { direction: "below", referencePanel: "editor" },
217
+ });
218
+ }
219
+ this.dockview.addPanel({
220
+ id: "output",
221
+ component: "output",
222
+ title: "Notation Output",
223
+ position: { direction: "right", referencePanel: "editor" },
224
+ });
225
+ const editorPanel = this.dockview.getPanel("editor");
226
+ const consolePanel = this.dockview.getPanel("console");
227
+ const outputPanel = this.dockview.getPanel("output");
228
+ if ((_a = consolePanel === null || consolePanel === void 0 ? void 0 : consolePanel.group) === null || _a === void 0 ? void 0 : _a.api) {
229
+ consolePanel.group.api.setSize({ height: Math.floor(containerHeight * 0.1) });
230
+ }
231
+ if ((_b = editorPanel === null || editorPanel === void 0 ? void 0 : editorPanel.group) === null || _b === void 0 ? void 0 : _b.api) {
232
+ editorPanel.group.api.setSize({ width: Math.floor(containerWidth * 0.5) });
233
+ }
234
+ if ((_c = outputPanel === null || outputPanel === void 0 ? void 0 : outputPanel.group) === null || _c === void 0 ? void 0 : _c.api) {
235
+ outputPanel.group.api.setSize({ width: Math.floor(containerWidth * 0.5) });
236
+ }
237
+ }
238
+ createEditorPanel() {
239
+ const element = document.createElement("div");
240
+ element.className = "dvp-panel dvp-editor-panel";
241
+ element.style.cssText = "display: flex; flex-direction: column; height: 100%; padding: 0.5rem;";
242
+ return {
243
+ element,
244
+ init: (_params) => {
245
+ const editorConfig = Object.assign(Object.assign({ initialSource: this.config.initialSource, debounceDelay: 300, syncScroll: this.config.syncScroll, markdownParser: this.config.markdownParser }, this.config.editorConfig), { onSourceChange: (source) => {
246
+ var _a, _b, _c, _d;
247
+ this.log(`Source changed (${source.length} chars)`, "info");
248
+ (_b = (_a = this.config).onSourceChange) === null || _b === void 0 ? void 0 : _b.call(_a, source);
249
+ (_d = (_c = this.config.editorConfig) === null || _c === void 0 ? void 0 : _c.onSourceChange) === null || _d === void 0 ? void 0 : _d.call(_c, source);
250
+ }, onNotationParsed: (notation, beatLayout) => {
251
+ var _a, _b, _c, _d;
252
+ const lineCount = beatLayout.gridModelsForLine.size;
253
+ this.log(`Parsed: ${lineCount} line${lineCount !== 1 ? "s" : ""}`, "info");
254
+ (_b = (_a = this.config).onNotationParsed) === null || _b === void 0 ? void 0 : _b.call(_a, notation, beatLayout);
255
+ (_d = (_c = this.config.editorConfig) === null || _c === void 0 ? void 0 : _c.onNotationParsed) === null || _d === void 0 ? void 0 : _d.call(_c, notation, beatLayout);
256
+ }, onParseError: (errors) => {
257
+ var _a, _b, _c, _d;
258
+ errors.forEach((e) => {
259
+ this.log(`Parse error: ${e.message || e}`, "error");
260
+ });
261
+ (_b = (_a = this.config).onParseError) === null || _b === void 0 ? void 0 : _b.call(_a, errors);
262
+ (_d = (_c = this.config.editorConfig) === null || _c === void 0 ? void 0 : _c.onParseError) === null || _d === void 0 ? void 0 : _d.call(_c, errors);
263
+ }, editorClass: this.config.editorClass });
264
+ this.sideBySideEditor = new SideBySideEditor_1.default(editorConfig);
265
+ const editorEl = this.sideBySideEditor.editorElement;
266
+ editorEl.style.cssText = `
267
+ width: 100%;
268
+ height: 100%;
269
+ resize: none;
270
+ font-family: "SF Mono", "Monaco", "Inconsolata", "Fira Code", monospace;
271
+ font-size: 14px;
272
+ padding: 0.5rem;
273
+ border: 1px solid var(--dv-separator-border, #ddd);
274
+ border-radius: 4px;
275
+ outline: none;
276
+ `;
277
+ element.appendChild(editorEl);
278
+ },
279
+ };
280
+ }
281
+ createOutputPanel() {
282
+ const element = document.createElement("div");
283
+ element.className = "dvp-panel dvp-output-panel";
284
+ element.style.cssText = "display: flex; flex-direction: column; height: 100%;";
285
+ return {
286
+ element,
287
+ init: (_params) => {
288
+ if (this.sideBySideEditor) {
289
+ const outputEl = this.sideBySideEditor.outputElement;
290
+ outputEl.style.cssText = `
291
+ width: 100%;
292
+ height: 100%;
293
+ overflow: auto;
294
+ padding: 1rem;
295
+ `;
296
+ element.appendChild(outputEl);
297
+ }
298
+ },
299
+ };
300
+ }
301
+ createConsolePanel() {
302
+ const element = document.createElement("div");
303
+ element.className = "dvp-panel dvp-console-panel";
304
+ element.style.cssText = "display: flex; flex-direction: column; height: 100%;";
305
+ return {
306
+ element,
307
+ init: (_params) => {
308
+ const header = document.createElement("div");
309
+ header.className = "dvp-console-header";
310
+ header.style.cssText = `
311
+ display: flex;
312
+ align-items: center;
313
+ justify-content: space-between;
314
+ padding: 0.25rem 0.5rem;
315
+ font-size: 0.75rem;
316
+ `;
317
+ const clearBtn = document.createElement("button");
318
+ clearBtn.className = "dvp-console-clear-btn";
319
+ clearBtn.textContent = "Clear";
320
+ clearBtn.style.cssText = `
321
+ padding: 0.125rem 0.5rem;
322
+ font-size: 0.75rem;
323
+ border-radius: 3px;
324
+ cursor: pointer;
325
+ `;
326
+ clearBtn.onclick = () => this.clearConsole();
327
+ header.appendChild(clearBtn);
328
+ element.appendChild(header);
329
+ this.consoleOutput = document.createElement("div");
330
+ this.consoleOutput.className = "dvp-console-output";
331
+ this.consoleOutput.style.cssText = `
332
+ flex: 1;
333
+ overflow: auto;
334
+ padding: 0.5rem;
335
+ font-family: "SF Mono", "Monaco", "Inconsolata", monospace;
336
+ font-size: 0.75rem;
337
+ `;
338
+ element.appendChild(this.consoleOutput);
339
+ this.consoleEntries.forEach((entry) => this.renderConsoleEntry(entry));
340
+ },
341
+ };
342
+ }
343
+ renderConsoleEntry(entry) {
344
+ if (!this.consoleOutput)
345
+ return;
346
+ const line = document.createElement("div");
347
+ line.style.cssText = `
348
+ padding: 0.125rem 0;
349
+ border-bottom: 1px solid var(--dv-separator-border, rgba(0,0,0,0.1));
350
+ `;
351
+ if (entry.level === "error") {
352
+ line.style.color = "#f44336";
353
+ }
354
+ else if (entry.level === "warning") {
355
+ line.style.color = "#ff9800";
356
+ }
357
+ const time = entry.timestamp.toLocaleTimeString();
358
+ line.textContent = `[${time}] ${entry.message}`;
359
+ this.consoleOutput.appendChild(line);
360
+ this.consoleOutput.scrollTop = this.consoleOutput.scrollHeight;
361
+ }
362
+ }
363
+ exports.default = DockViewPlayground;
364
+ //# sourceMappingURL=DockViewPlayground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DockViewPlayground.js","sourceRoot":"","sources":["../../../../src/web/components/DockViewPlayground.ts"],"names":[],"mappings":";;;;;AAaA,iDAA6F;AAC7F,0EAA8E;AAoF9E,MAAM,cAAc,GAA6B;IAC/C,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,6BAA6B;IACzC,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,IAAI;CACjB,CAAC;AA4BF,MAAqB,kBAAkB;IAyBrC,YAAY,SAAsB,EAAE,SAAmC,EAAE;;QAjBjE,aAAQ,GAAuB,IAAI,CAAC;QAGpC,qBAAgB,GAA4B,IAAI,CAAC;QAGjD,kBAAa,GAAuB,IAAI,CAAC;QAGzC,mBAAc,GAAmB,EAAE,CAAC;QAS1C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,mCAAQ,cAAc,GAAK,MAAM,CAAE,CAAC;QAC/C,IAAI,CAAC,eAAe,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,WAAW,mCAAI,IAAI,CAAC;QAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAKD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAKD,IAAI,MAAM;;QACR,OAAO,CAAA,MAAA,IAAI,CAAC,gBAAgB,0CAAE,MAAM,KAAI,EAAE,CAAC;IAC7C,CAAC;IAKD,IAAI,MAAM,CAAC,KAAa;QACtB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,KAAK,CAAC;QACvC,CAAC;IACH,CAAC;IAKD,GAAG,CAAC,OAAe,EAAE,QAAsC,MAAM;QAC/D,MAAM,KAAK,GAAiB;YAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,KAAK;YACL,OAAO;SACR,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAKD,YAAY;QACV,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE,CAAC;QACpC,CAAC;IACH,CAAC;IAKD,MAAM;;QACJ,OAAO,CAAA,MAAA,IAAI,CAAC,gBAAgB,0CAAE,MAAM,EAAE,KAAI,KAAK,CAAC;IAClD,CAAC;IAKD,OAAO;;QACL,MAAA,IAAI,CAAC,gBAAgB,0CAAE,OAAO,EAAE,CAAC;QACjC,MAAA,IAAI,CAAC,QAAQ,0CAAE,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC;IAChC,CAAC;IAMD,WAAW;QACT,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAUD,gBAAgB;QACd,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAKD,WAAW;;QACT,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAGnD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrB,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE;SAC3D,CAAC,CAAC;QAGH,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,GAAG,CAAC;QAC3D,IAAI,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,0CAAE,GAAG,EAAE,CAAC;YAC7B,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAKD,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEpD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAMD,aAAa;QACX,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAKO,IAAI;QAGV,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;YACjE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC;QAGlE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAGtF,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CAAC;YAC/E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE;YACzC,UAAU,EAAE,IAAI;YAChB,eAAe,EAAE,CAAC,OAAO,CAAC;SAC3B,CAAC,CAAC;QAGH,MAAM,iBAAiB,GAAG,IAAI,iCAAiB,CAAC,IAAI,CAAC,SAAS,EAAE;YAC9D,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;SAC5D,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC;QAGtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACrD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC;QAGD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;gBACnC,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC;IAKO,UAAU;QAChB,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,CAAC;QACD,OAAO,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAKO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QACtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;gBAClC,MAAM;aACP,CAAC;YACF,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAKO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE/B,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;oBAC/C,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAChD,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC3B,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAKO,eAAe,CAAC,OAAY;QAClC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAClC,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAClC,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACnC;gBACE,OAAO;oBACL,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;oBACtC,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;iBACf,CAAC;QACN,CAAC;IACH,CAAC;IAOO,mBAAmB;;QACzB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAG3B,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,GAAG,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,GAAG,CAAC;QAGzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrB,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QAIH,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACrB,EAAE,EAAE,SAAS;gBACb,SAAS,EAAE,SAAS;gBACpB,KAAK,EAAE,SAAS;gBAChB,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE;aAC3D,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrB,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,QAAQ;YACnB,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE;SAC3D,CAAC,CAAC;QAGH,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAGrD,IAAI,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,0CAAE,GAAG,EAAE,CAAC;YAC7B,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAChF,CAAC;QAGD,IAAI,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,0CAAE,GAAG,EAAE,CAAC;YAC5B,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,0CAAE,GAAG,EAAE,CAAC;YAC5B,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAKO,iBAAiB;QACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,4BAA4B,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,uEAAuE,CAAC;QAEhG,OAAO;YACL,OAAO;YACP,IAAI,EAAE,CAAC,OAAmB,EAAE,EAAE;gBAE5B,MAAM,YAAY,iCAChB,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,EACxC,aAAa,EAAE,GAAG,EAClB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAClC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,IACvC,IAAI,CAAC,MAAM,CAAC,YAAY,KAC3B,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE;;wBACzB,IAAI,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,MAAM,SAAS,EAAE,MAAM,CAAC,CAAC;wBAC5D,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,cAAc,mDAAG,MAAM,CAAC,CAAC;wBACrC,MAAA,MAAA,IAAI,CAAC,MAAM,CAAC,YAAY,0CAAE,cAAc,mDAAG,MAAM,CAAC,CAAC;oBACrD,CAAC,EACD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE;;wBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC;wBACpD,IAAI,CAAC,GAAG,CAAC,WAAW,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;wBAC3E,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,gBAAgB,mDAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;wBACrD,MAAA,MAAA,IAAI,CAAC,MAAM,CAAC,YAAY,0CAAE,gBAAgB,mDAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACrE,CAAC,EACD,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;;wBACvB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;4BACnB,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;wBACtD,CAAC,CAAC,CAAC;wBACH,MAAA,MAAA,IAAI,CAAC,MAAM,EAAC,YAAY,mDAAG,MAAM,CAAC,CAAC;wBACnC,MAAA,MAAA,IAAI,CAAC,MAAM,CAAC,YAAY,0CAAE,YAAY,mDAAG,MAAM,CAAC,CAAC;oBACnD,CAAC,EACD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,GACrC,CAAC;gBAGF,IAAI,CAAC,gBAAgB,GAAG,IAAI,0BAAgB,CAAC,YAAY,CAAC,CAAC;gBAG3D,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;gBACrD,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;SAUxB,CAAC;gBAEF,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;SACF,CAAC;IACJ,CAAC;IAKO,iBAAiB;QACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,4BAA4B,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,sDAAsD,CAAC;QAE/E,OAAO;YACL,OAAO;YACP,IAAI,EAAE,CAAC,OAAmB,EAAE,EAAE;gBAC5B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAE1B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC;oBACrD,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;WAKxB,CAAC;oBAEF,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAKO,kBAAkB;QACxB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,CAAC,SAAS,GAAG,6BAA6B,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,sDAAsD,CAAC;QAE/E,OAAO;YACL,OAAO;YACP,IAAI,EAAE,CAAC,OAAmB,EAAE,EAAE;gBAE5B,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,CAAC,SAAS,GAAG,oBAAoB,CAAC;gBACxC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;SAMtB,CAAC;gBAEF,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAClD,QAAQ,CAAC,SAAS,GAAG,uBAAuB,CAAC;gBAC7C,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;gBAC/B,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;SAKxB,CAAC;gBACF,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC7C,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAE7B,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAG5B,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACnD,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,oBAAoB,CAAC;gBACpD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;SAMlC,CAAC;gBACF,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAGxC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,CAAC;SACF,CAAC;IACJ,CAAC;IAKO,kBAAkB,CAAC,KAAmB;QAC5C,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE,OAAO;QAEhC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG;;;KAGpB,CAAC;QAEF,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhD,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC;IACjE,CAAC;CACF;AAlgBD,qCAkgBC","sourcesContent":["/**\n * DockViewPlayground - A complete notation playground with DockView layout.\n *\n * Provides a ready-to-use playground experience with:\n * - Resizable editor panel\n * - Resizable notation output panel\n * - Optional console panel for logs/errors\n * - Layout persistence to localStorage\n * - Dark mode support\n *\n * Uses SideBySideEditor internally for editor/output management.\n */\n\nimport { DockviewComponent, DockviewApi, IContentRenderer, Parameters } from \"dockview-core\";\nimport SideBySideEditor, { SideBySideEditorConfig } from \"./SideBySideEditor\";\nimport { Notation } from \"../../notation\";\nimport { GlobalBeatLayout } from \"../../beats\";\n\n/**\n * Configuration for DockViewPlayground.\n */\nexport interface DockViewPlaygroundConfig {\n /**\n * Initial source text.\n */\n initialSource?: string;\n\n /**\n * Whether to show the console panel initially.\n * @default true\n */\n showConsole?: boolean;\n\n /**\n * Whether to persist layout to localStorage.\n * @default true\n */\n persistLayout?: boolean;\n\n /**\n * Storage key for layout persistence.\n * @default \"notations-playground-layout\"\n */\n storageKey?: string;\n\n /**\n * Layout version number. Increment to force layout reset when structure changes.\n * @default 1\n */\n layoutVersion?: number;\n\n /**\n * Whether to enable scroll synchronization between editor and output.\n * @default true\n */\n syncScroll?: boolean;\n\n /**\n * Optional markdown parser for RawBlock content.\n */\n markdownParser?: (content: string) => string;\n\n /**\n * SideBySideEditor configuration options.\n */\n editorConfig?: Partial<SideBySideEditorConfig>;\n\n /**\n * Callback when source changes.\n */\n onSourceChange?: (source: string) => void;\n\n /**\n * Callback when notation is successfully parsed.\n */\n onNotationParsed?: (notation: Notation, beatLayout: GlobalBeatLayout) => void;\n\n /**\n * Callback when parsing fails.\n */\n onParseError?: (errors: any[]) => void;\n\n /**\n * Function to detect dark mode. If not provided, checks for \"dark\" class on documentElement.\n */\n isDarkMode?: () => boolean;\n\n /**\n * CSS class for the editor textarea.\n */\n editorClass?: string;\n\n /**\n * CSS class for the output container.\n */\n outputClass?: string;\n}\n\nconst DEFAULT_CONFIG: DockViewPlaygroundConfig = {\n showConsole: true,\n persistLayout: true,\n storageKey: \"notations-playground-layout\",\n layoutVersion: 1,\n syncScroll: true,\n};\n\n/**\n * Console log entry.\n */\ninterface ConsoleEntry {\n timestamp: Date;\n level: \"info\" | \"error\" | \"warning\";\n message: string;\n}\n\n/**\n * DockViewPlayground creates a complete notation playground with DockView layout.\n *\n * Usage:\n * ```typescript\n * const playground = new DockViewPlayground(container, {\n * initialSource: \"s r g m p\",\n * onSourceChange: (source) => console.log(\"Source:\", source),\n * });\n *\n * // Access the SideBySideEditor\n * playground.editor.source = \"new source\";\n *\n * // Log to console panel\n * playground.log(\"Hello!\", \"info\");\n * ```\n */\nexport default class DockViewPlayground {\n /** The container element */\n readonly container: HTMLElement;\n\n /** Configuration */\n readonly config: DockViewPlaygroundConfig;\n\n /** DockView API */\n private dockview: DockviewApi | null = null;\n\n /** SideBySideEditor instance */\n private sideBySideEditor: SideBySideEditor | null = null;\n\n /** Console output element */\n private consoleOutput: HTMLElement | null = null;\n\n /** Console entries */\n private consoleEntries: ConsoleEntry[] = [];\n\n /**\n * Creates a new DockViewPlayground.\n *\n * @param container The container element for the playground\n * @param config Configuration options\n */\n constructor(container: HTMLElement, config: DockViewPlaygroundConfig = {}) {\n this.container = container;\n this.config = { ...DEFAULT_CONFIG, ...config };\n this._consoleVisible = this.config.showConsole ?? true;\n\n this.init();\n }\n\n /**\n * Gets the SideBySideEditor instance.\n */\n get editor(): SideBySideEditor | null {\n return this.sideBySideEditor;\n }\n\n /**\n * Gets the current source.\n */\n get source(): string {\n return this.sideBySideEditor?.source || \"\";\n }\n\n /**\n * Sets the source and re-renders.\n */\n set source(value: string) {\n if (this.sideBySideEditor) {\n this.sideBySideEditor.source = value;\n }\n }\n\n /**\n * Logs a message to the console panel.\n */\n log(message: string, level: \"info\" | \"error\" | \"warning\" = \"info\"): void {\n const entry: ConsoleEntry = {\n timestamp: new Date(),\n level,\n message,\n };\n this.consoleEntries.push(entry);\n this.renderConsoleEntry(entry);\n }\n\n /**\n * Clears the console.\n */\n clearConsole(): void {\n this.consoleEntries = [];\n if (this.consoleOutput) {\n this.consoleOutput.innerHTML = \"\";\n }\n }\n\n /**\n * Renders the notation manually.\n */\n render(): boolean {\n return this.sideBySideEditor?.render() || false;\n }\n\n /**\n * Destroys the playground and cleans up resources.\n */\n destroy(): void {\n this.sideBySideEditor?.destroy();\n this.dockview?.dispose();\n this.container.innerHTML = \"\";\n }\n\n /**\n * Resets the layout to defaults.\n * Clears persisted layout and recreates the default layout.\n */\n resetLayout(): void {\n if (this.config.storageKey) {\n localStorage.removeItem(this.config.storageKey);\n }\n if (this.dockview) {\n this.dockview.clear();\n this.createDefaultLayout();\n }\n }\n\n // Console visibility API\n\n /** Whether the console is currently visible */\n private _consoleVisible: boolean;\n\n /**\n * Returns whether the console panel is currently visible.\n */\n isConsoleVisible(): boolean {\n return this._consoleVisible;\n }\n\n /**\n * Shows the console panel.\n */\n showConsole(): void {\n if (this._consoleVisible || !this.dockview) return;\n\n // Add console below editor (spans full width at bottom)\n this.dockview.addPanel({\n id: \"console\",\n component: \"console\",\n title: \"Console\",\n position: { direction: \"below\", referencePanel: \"editor\" },\n });\n\n // Set console to ~10% height\n const consolePanel = this.dockview.getPanel(\"console\");\n const containerHeight = this.container.clientHeight || 600;\n if (consolePanel?.group?.api) {\n consolePanel.group.api.setSize({ height: Math.floor(containerHeight * 0.1) });\n }\n\n this._consoleVisible = true;\n }\n\n /**\n * Hides the console panel.\n */\n hideConsole(): void {\n if (!this._consoleVisible || !this.dockview) return;\n\n const consolePanel = this.dockview.getPanel(\"console\");\n if (consolePanel) {\n consolePanel.api.close();\n }\n this._consoleVisible = false;\n }\n\n /**\n * Toggles the console panel visibility.\n * @returns The new visibility state.\n */\n toggleConsole(): boolean {\n if (this._consoleVisible) {\n this.hideConsole();\n } else {\n this.showConsole();\n }\n return this._consoleVisible;\n }\n\n /**\n * Initializes the playground.\n */\n private init(): void {\n // Ensure container has proper sizing for DockView\n // DockView requires explicit height on its container\n if (!this.container.style.height && !this.container.offsetHeight) {\n this.container.style.height = \"100%\";\n }\n this.container.style.width = this.container.style.width || \"100%\";\n\n // Apply theme class (preserve existing classes)\n const isDark = this.isDarkMode();\n this.container.classList.add(isDark ? \"dockview-theme-dark\" : \"dockview-theme-light\");\n\n // Watch for theme changes\n const observer = new MutationObserver(() => {\n const dark = this.isDarkMode();\n this.container.classList.remove(\"dockview-theme-dark\", \"dockview-theme-light\");\n this.container.classList.add(dark ? \"dockview-theme-dark\" : \"dockview-theme-light\");\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: [\"class\"],\n });\n\n // Create DockView\n const dockviewComponent = new DockviewComponent(this.container, {\n createComponent: (options) => this.createComponent(options),\n });\n\n this.dockview = dockviewComponent.api;\n\n // Try to restore saved layout, otherwise create default\n if (!this.config.persistLayout || !this.loadLayout()) {\n this.createDefaultLayout();\n }\n\n // Listen for layout changes to persist them\n if (this.config.persistLayout) {\n this.dockview.onDidLayoutChange(() => {\n this.saveLayout();\n });\n }\n\n this.log(\"Playground initialized\", \"info\");\n }\n\n /**\n * Checks if dark mode is active.\n */\n private isDarkMode(): boolean {\n if (this.config.isDarkMode) {\n return this.config.isDarkMode();\n }\n return document.documentElement.classList.contains(\"dark\");\n }\n\n /**\n * Saves the layout to localStorage.\n */\n private saveLayout(): void {\n if (!this.dockview || !this.config.storageKey) return;\n try {\n const layout = this.dockview.toJSON();\n const data = {\n version: this.config.layoutVersion,\n layout,\n };\n localStorage.setItem(this.config.storageKey, JSON.stringify(data));\n } catch (e) {\n console.warn(\"Failed to save layout:\", e);\n }\n }\n\n /**\n * Loads the layout from localStorage.\n */\n private loadLayout(): boolean {\n if (!this.dockview || !this.config.storageKey) return false;\n try {\n const saved = localStorage.getItem(this.config.storageKey);\n if (saved) {\n const data = JSON.parse(saved);\n // Check version - if outdated or missing, reset to defaults\n if (data.version !== this.config.layoutVersion) {\n localStorage.removeItem(this.config.storageKey);\n return false;\n }\n this.dockview.fromJSON(data.layout);\n return true;\n }\n } catch (e) {\n console.warn(\"Failed to load layout:\", e);\n if (this.config.storageKey) {\n localStorage.removeItem(this.config.storageKey);\n }\n }\n return false;\n }\n\n /**\n * Creates a component for DockView.\n */\n private createComponent(options: any): IContentRenderer {\n switch (options.name) {\n case \"editor\":\n return this.createEditorPanel();\n case \"output\":\n return this.createOutputPanel();\n case \"console\":\n return this.createConsolePanel();\n default:\n return {\n element: document.createElement(\"div\"),\n init: () => {},\n };\n }\n }\n\n /**\n * Creates the default layout.\n * Layout: Editor and Output side by side on top (80% height),\n * Console spanning full width on bottom (20% height).\n */\n private createDefaultLayout(): void {\n if (!this.dockview) return;\n\n // Get container dimensions for proportional sizing\n const containerHeight = this.container.clientHeight || 600;\n const containerWidth = this.container.clientWidth || 800;\n\n // Editor panel (top left)\n this.dockview.addPanel({\n id: \"editor\",\n component: \"editor\",\n title: \"Editor\",\n });\n\n // Console panel (bottom, full width) - add BEFORE output\n // so it creates a vertical split at the root level\n if (this._consoleVisible) {\n this.dockview.addPanel({\n id: \"console\",\n component: \"console\",\n title: \"Console\",\n position: { direction: \"below\", referencePanel: \"editor\" },\n });\n }\n\n // Output panel (top right) - splits the top row\n this.dockview.addPanel({\n id: \"output\",\n component: \"output\",\n title: \"Notation Output\",\n position: { direction: \"right\", referencePanel: \"editor\" },\n });\n\n // Set sizes using the group API\n const editorPanel = this.dockview.getPanel(\"editor\");\n const consolePanel = this.dockview.getPanel(\"console\");\n const outputPanel = this.dockview.getPanel(\"output\");\n\n // Set console height to ~10% of container\n if (consolePanel?.group?.api) {\n consolePanel.group.api.setSize({ height: Math.floor(containerHeight * 0.1) });\n }\n\n // Set editor and output to 50% width each\n if (editorPanel?.group?.api) {\n editorPanel.group.api.setSize({ width: Math.floor(containerWidth * 0.5) });\n }\n if (outputPanel?.group?.api) {\n outputPanel.group.api.setSize({ width: Math.floor(containerWidth * 0.5) });\n }\n }\n\n /**\n * Creates the editor panel.\n */\n private createEditorPanel(): IContentRenderer {\n const element = document.createElement(\"div\");\n element.className = \"dvp-panel dvp-editor-panel\";\n element.style.cssText = \"display: flex; flex-direction: column; height: 100%; padding: 0.5rem;\";\n\n return {\n element,\n init: (_params: Parameters) => {\n // Create SideBySideEditor config\n const editorConfig: SideBySideEditorConfig = {\n initialSource: this.config.initialSource,\n debounceDelay: 300,\n syncScroll: this.config.syncScroll,\n markdownParser: this.config.markdownParser,\n ...this.config.editorConfig,\n onSourceChange: (source) => {\n this.log(`Source changed (${source.length} chars)`, \"info\");\n this.config.onSourceChange?.(source);\n this.config.editorConfig?.onSourceChange?.(source);\n },\n onNotationParsed: (notation, beatLayout) => {\n const lineCount = beatLayout.gridModelsForLine.size;\n this.log(`Parsed: ${lineCount} line${lineCount !== 1 ? \"s\" : \"\"}`, \"info\");\n this.config.onNotationParsed?.(notation, beatLayout);\n this.config.editorConfig?.onNotationParsed?.(notation, beatLayout);\n },\n onParseError: (errors) => {\n errors.forEach((e) => {\n this.log(`Parse error: ${e.message || e}`, \"error\");\n });\n this.config.onParseError?.(errors);\n this.config.editorConfig?.onParseError?.(errors);\n },\n editorClass: this.config.editorClass,\n };\n\n // Create the editor\n this.sideBySideEditor = new SideBySideEditor(editorConfig);\n\n // Style the editor element\n const editorEl = this.sideBySideEditor.editorElement;\n editorEl.style.cssText = `\n width: 100%;\n height: 100%;\n resize: none;\n font-family: \"SF Mono\", \"Monaco\", \"Inconsolata\", \"Fira Code\", monospace;\n font-size: 14px;\n padding: 0.5rem;\n border: 1px solid var(--dv-separator-border, #ddd);\n border-radius: 4px;\n outline: none;\n `;\n\n element.appendChild(editorEl);\n },\n };\n }\n\n /**\n * Creates the output panel.\n */\n private createOutputPanel(): IContentRenderer {\n const element = document.createElement(\"div\");\n element.className = \"dvp-panel dvp-output-panel\";\n element.style.cssText = \"display: flex; flex-direction: column; height: 100%;\";\n\n return {\n element,\n init: (_params: Parameters) => {\n if (this.sideBySideEditor) {\n // Style the output element\n const outputEl = this.sideBySideEditor.outputElement;\n outputEl.style.cssText = `\n width: 100%;\n height: 100%;\n overflow: auto;\n padding: 1rem;\n `;\n\n element.appendChild(outputEl);\n }\n },\n };\n }\n\n /**\n * Creates the console panel.\n */\n private createConsolePanel(): IContentRenderer {\n const element = document.createElement(\"div\");\n element.className = \"dvp-panel dvp-console-panel\";\n element.style.cssText = \"display: flex; flex-direction: column; height: 100%;\";\n\n return {\n element,\n init: (_params: Parameters) => {\n // Console header\n const header = document.createElement(\"div\");\n header.className = \"dvp-console-header\";\n header.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n `;\n\n const clearBtn = document.createElement(\"button\");\n clearBtn.className = \"dvp-console-clear-btn\";\n clearBtn.textContent = \"Clear\";\n clearBtn.style.cssText = `\n padding: 0.125rem 0.5rem;\n font-size: 0.75rem;\n border-radius: 3px;\n cursor: pointer;\n `;\n clearBtn.onclick = () => this.clearConsole();\n header.appendChild(clearBtn);\n\n element.appendChild(header);\n\n // Console output\n this.consoleOutput = document.createElement(\"div\");\n this.consoleOutput.className = \"dvp-console-output\";\n this.consoleOutput.style.cssText = `\n flex: 1;\n overflow: auto;\n padding: 0.5rem;\n font-family: \"SF Mono\", \"Monaco\", \"Inconsolata\", monospace;\n font-size: 0.75rem;\n `;\n element.appendChild(this.consoleOutput);\n\n // Re-render existing entries\n this.consoleEntries.forEach((entry) => this.renderConsoleEntry(entry));\n },\n };\n }\n\n /**\n * Renders a console entry.\n */\n private renderConsoleEntry(entry: ConsoleEntry): void {\n if (!this.consoleOutput) return;\n\n const line = document.createElement(\"div\");\n line.style.cssText = `\n padding: 0.125rem 0;\n border-bottom: 1px solid var(--dv-separator-border, rgba(0,0,0,0.1));\n `;\n\n if (entry.level === \"error\") {\n line.style.color = \"#f44336\";\n } else if (entry.level === \"warning\") {\n line.style.color = \"#ff9800\";\n }\n\n const time = entry.timestamp.toLocaleTimeString();\n line.textContent = `[${time}] ${entry.message}`;\n\n this.consoleOutput.appendChild(line);\n this.consoleOutput.scrollTop = this.consoleOutput.scrollHeight;\n }\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import { NotationView } from "../../carnatic";
2
+ export interface NotationBlockConfig {
3
+ createViewer: (container: HTMLDivElement) => NotationView;
4
+ cssClasses?: {
5
+ root?: string;
6
+ sourceContainer?: string;
7
+ sourceCaption?: string;
8
+ sourceCode?: string;
9
+ outputLabel?: string;
10
+ outputContainer?: string;
11
+ };
12
+ }
13
+ export default class NotationBlock {
14
+ readonly container: HTMLElement;
15
+ readonly config: NotationBlockConfig;
16
+ id: string;
17
+ source: string;
18
+ caption: string;
19
+ height: string;
20
+ newRoot: HTMLDivElement;
21
+ notationView: NotationView;
22
+ showSource: boolean;
23
+ isEditing: boolean;
24
+ editTextarea: HTMLTextAreaElement | null;
25
+ sourceCodeElement: HTMLElement | null;
26
+ constructor(container: HTMLElement, config: NotationBlockConfig);
27
+ updatePreview(): void;
28
+ get captionId(): string;
29
+ copyToClipboard(): Promise<void>;
30
+ toggleEditMode(): void;
31
+ enterEditMode(): void;
32
+ exitEditMode(): void;
33
+ applyEdit(): void;
34
+ cancelEdit(): void;
35
+ }