@duffcloudservices/cms 0.1.1 → 0.1.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.
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Editor Bridge — injected into customer site iframes by the DCS visual editor.
3
+ *
4
+ * Responsibilities:
5
+ * 1. Report available sections and text keys to the parent portal
6
+ * 2. Enable inline contenteditable editing on data-text-key elements (double-click)
7
+ * 3. Render section overlay highlights on hover/select from parent
8
+ * 4. Communicate all interactions back to the parent via postMessage
9
+ * 5. Monitor navigation within the iframe and notify the parent
10
+ * 6. Show floating edit icon on hover for text-key elements
11
+ *
12
+ * NOTE: AI ✨ buttons are rendered by the portal-side SectionOverlayLayer,
13
+ * NOT by this bridge. The bridge only reports section/text key data and
14
+ * handles inline text editing.
15
+ *
16
+ * This script runs inside the iframe (customer site). The parent portal
17
+ * communicates via postMessage using the `dcs:*` message protocol.
18
+ */
19
+ interface SectionInfo {
20
+ id: string;
21
+ label: string | null;
22
+ bounds: {
23
+ x: number;
24
+ y: number;
25
+ width: number;
26
+ height: number;
27
+ };
28
+ textKeyCount: number;
29
+ }
30
+ interface EditorReadyPayload {
31
+ sections: SectionInfo[];
32
+ textKeys: string[];
33
+ contentHeight: number;
34
+ }
35
+ declare function initEditorBridge(): void;
36
+
37
+ export { type EditorReadyPayload, type SectionInfo, initEditorBridge };
@@ -0,0 +1,556 @@
1
+ // src/editor/editorBridge.ts
2
+ function isInIframe() {
3
+ try {
4
+ return globalThis.self !== globalThis.self.parent;
5
+ } catch {
6
+ return true;
7
+ }
8
+ }
9
+ function postToParent(type, data) {
10
+ if (!isInIframe()) return;
11
+ globalThis.self.parent.postMessage({ type, data }, "*");
12
+ }
13
+ var editorActive = false;
14
+ var bridgeInitialized = false;
15
+ var currentHighlightOverlay = null;
16
+ var activeEditElement = null;
17
+ var lastKnownPathname = "";
18
+ var editIconElement = null;
19
+ var editIconTarget = null;
20
+ var arrayEditIconElement = null;
21
+ var arrayEditIconTarget = null;
22
+ var editingEnabled = true;
23
+ var originalTextValues = /* @__PURE__ */ new Map();
24
+ function discoverSections() {
25
+ const elements = document.querySelectorAll("[data-section]");
26
+ return Array.from(elements).map((el) => {
27
+ const rect = el.getBoundingClientRect();
28
+ const textKeyCount = el.querySelectorAll("[data-text-key]").length;
29
+ return {
30
+ id: el.dataset.section,
31
+ label: el.dataset.sectionLabel ?? null,
32
+ bounds: {
33
+ x: rect.left + scrollX,
34
+ y: rect.top + scrollY,
35
+ width: rect.width,
36
+ height: rect.height
37
+ },
38
+ textKeyCount
39
+ };
40
+ });
41
+ }
42
+ function discoverTextKeys() {
43
+ return Array.from(document.querySelectorAll("[data-text-key]")).map(
44
+ (el) => el.dataset.textKey
45
+ );
46
+ }
47
+ function showSectionHighlight(sectionId) {
48
+ clearSectionHighlight();
49
+ const el = document.querySelector(`[data-section="${sectionId}"]`);
50
+ if (!el) return;
51
+ const rect = el.getBoundingClientRect();
52
+ const overlay = document.createElement("div");
53
+ overlay.className = "dcs-section-highlight";
54
+ overlay.style.cssText = `
55
+ position: absolute;
56
+ left: ${rect.left + scrollX}px;
57
+ top: ${rect.top + scrollY}px;
58
+ width: ${rect.width}px;
59
+ height: ${rect.height}px;
60
+ border: 2px dashed hsl(221.2 83.2% 53.3%);
61
+ background: hsla(221.2, 83.2%, 53.3%, 0.05);
62
+ pointer-events: none;
63
+ z-index: 99998;
64
+ border-radius: 8px;
65
+ transition: all 0.15s ease;
66
+ `;
67
+ document.body.appendChild(overlay);
68
+ currentHighlightOverlay = overlay;
69
+ }
70
+ function clearSectionHighlight() {
71
+ if (currentHighlightOverlay) {
72
+ currentHighlightOverlay.remove();
73
+ currentHighlightOverlay = null;
74
+ }
75
+ }
76
+ function monitorNavigation() {
77
+ lastKnownPathname = globalThis.location.pathname;
78
+ setInterval(() => {
79
+ checkForNavigation();
80
+ }, 250);
81
+ globalThis.addEventListener("popstate", () => {
82
+ checkForNavigation();
83
+ });
84
+ const handleLinkClick = (e) => {
85
+ const link = e.target.closest?.("a[href]");
86
+ if (!link) return;
87
+ const href = link.getAttribute("href");
88
+ if (!href || href.startsWith("#") || href === "javascript:void(0)") return;
89
+ try {
90
+ const resolved = new URL(href, globalThis.location.href);
91
+ if (resolved.origin !== globalThis.location.origin) {
92
+ e.preventDefault();
93
+ e.stopPropagation();
94
+ e.stopImmediatePropagation();
95
+ }
96
+ } catch {
97
+ e.preventDefault();
98
+ }
99
+ };
100
+ globalThis.addEventListener("click", handleLinkClick, true);
101
+ document.addEventListener("click", handleLinkClick, true);
102
+ document.addEventListener("submit", (e) => {
103
+ e.preventDefault();
104
+ e.stopPropagation();
105
+ }, true);
106
+ window.addEventListener("beforeunload", (e) => {
107
+ e.preventDefault();
108
+ });
109
+ }
110
+ function checkForNavigation() {
111
+ const currentPathname = globalThis.location.pathname;
112
+ if (currentPathname === lastKnownPathname) return;
113
+ lastKnownPathname = currentPathname;
114
+ postToParent("dcs:navigation", { pathname: currentPathname });
115
+ if (activeEditElement) {
116
+ finishEdit(activeEditElement);
117
+ }
118
+ removeEditIcon();
119
+ removeArrayEditIcon();
120
+ setTimeout(() => {
121
+ rediscoverAndNotify();
122
+ }, 500);
123
+ }
124
+ function setMode(mode) {
125
+ if (mode === "explore") {
126
+ if (activeEditElement) {
127
+ finishEdit(activeEditElement);
128
+ }
129
+ }
130
+ }
131
+ function rediscoverAndNotify() {
132
+ currentHighlightOverlay = null;
133
+ activeEditElement = null;
134
+ const sections = discoverSections();
135
+ const textKeys = discoverTextKeys();
136
+ const contentHeight = document.body.scrollHeight;
137
+ postToParent("dcs:ready", { sections, textKeys, contentHeight });
138
+ if (editorActive) {
139
+ editorActive = false;
140
+ enableEditorMode();
141
+ }
142
+ }
143
+ function enableEditorMode() {
144
+ if (editorActive) return;
145
+ editorActive = true;
146
+ injectEditorStyles();
147
+ const textElements = document.querySelectorAll("[data-text-key]");
148
+ textElements.forEach((htmlEl) => {
149
+ htmlEl.classList.add("dcs-editable");
150
+ htmlEl.addEventListener("dblclick", handleTextKeyDblClick);
151
+ htmlEl.addEventListener("blur", handleTextKeyBlur);
152
+ htmlEl.addEventListener("keydown", handleTextKeyKeydown);
153
+ htmlEl.addEventListener("mouseenter", () => {
154
+ if (activeEditElement) return;
155
+ const key = htmlEl.dataset.textKey;
156
+ if (isArrayTextKey(key)) {
157
+ showArrayEditIcon(htmlEl);
158
+ } else {
159
+ showEditIcon(htmlEl);
160
+ }
161
+ });
162
+ htmlEl.addEventListener("mouseleave", (e) => {
163
+ const related = e.relatedTarget;
164
+ if (related && (related.classList?.contains("dcs-edit-icon") || related.closest?.(".dcs-edit-icon") || related.classList?.contains("dcs-array-edit-icon") || related.closest?.(".dcs-array-edit-icon"))) return;
165
+ removeEditIcon();
166
+ removeArrayEditIcon();
167
+ });
168
+ });
169
+ const sections = document.querySelectorAll("[data-section]");
170
+ sections.forEach((el) => {
171
+ const sectionId = el.dataset.section;
172
+ el.addEventListener("mouseenter", () => {
173
+ postToParent("dcs:section-hover", { sectionId });
174
+ });
175
+ el.addEventListener("mouseleave", () => {
176
+ postToParent("dcs:section-hover", { sectionId: null });
177
+ });
178
+ el.addEventListener("click", (e) => {
179
+ const target = e.target;
180
+ if (!target.closest("[data-text-key]")) {
181
+ postToParent("dcs:section-click", { sectionId });
182
+ }
183
+ });
184
+ });
185
+ }
186
+ function handleTextKeyDblClick(e) {
187
+ if (!editingEnabled) return;
188
+ e.preventDefault();
189
+ e.stopPropagation();
190
+ e.stopImmediatePropagation();
191
+ const el = e.currentTarget;
192
+ const key = el.dataset.textKey;
193
+ const sectionParent = el.closest("[data-section]");
194
+ const sectionId = sectionParent?.dataset.section ?? null;
195
+ postToParent("dcs:text-key-dblclick", { key, sectionId });
196
+ startInlineEdit(el, key, sectionId);
197
+ }
198
+ function startInlineEdit(el, key, sectionId) {
199
+ if (activeEditElement && activeEditElement !== el) {
200
+ finishEdit(activeEditElement);
201
+ }
202
+ originalTextValues.set(el, el.innerText.trim());
203
+ el.setAttribute("contenteditable", "true");
204
+ el.classList.add("dcs-editing");
205
+ el.focus();
206
+ activeEditElement = el;
207
+ const selection = getSelection();
208
+ const range = document.createRange();
209
+ range.selectNodeContents(el);
210
+ selection?.removeAllRanges();
211
+ selection?.addRange(range);
212
+ postToParent("dcs:text-key-click", { key, sectionId });
213
+ }
214
+ function handleTextKeyBlur(e) {
215
+ const el = e.currentTarget;
216
+ finishEdit(el);
217
+ }
218
+ function handleTextKeyKeydown(e) {
219
+ if (e.key === "Enter" && !e.shiftKey) {
220
+ e.preventDefault();
221
+ e.currentTarget.blur();
222
+ }
223
+ if (e.key === "Escape") {
224
+ e.preventDefault();
225
+ e.currentTarget.blur();
226
+ }
227
+ }
228
+ function finishEdit(el) {
229
+ if (!el.hasAttribute("contenteditable")) return;
230
+ el.removeAttribute("contenteditable");
231
+ el.classList.remove("dcs-editing");
232
+ const key = el.dataset.textKey;
233
+ const sectionParent = el.closest("[data-section]");
234
+ const sectionId = sectionParent?.dataset.section ?? null;
235
+ const newValue = el.innerText.trim();
236
+ const originalValue = originalTextValues.get(el) ?? "";
237
+ if (activeEditElement === el) {
238
+ activeEditElement = null;
239
+ }
240
+ if (newValue !== originalValue) {
241
+ postToParent("dcs:text-key-changed", { key, value: newValue, sectionId });
242
+ }
243
+ originalTextValues.delete(el);
244
+ }
245
+ function focusTextKey(key) {
246
+ const el = document.querySelector(`[data-text-key="${key}"]`);
247
+ if (!el) return;
248
+ el.scrollIntoView({ behavior: "smooth", block: "center" });
249
+ const sectionParent = el.closest("[data-section]");
250
+ const sectionId = sectionParent?.dataset.section ?? null;
251
+ startInlineEdit(el, key, sectionId);
252
+ }
253
+ function updateTextInPlace(key, value) {
254
+ const el = document.querySelector(`[data-text-key="${key}"]`);
255
+ if (!el) return;
256
+ if (el === activeEditElement) return;
257
+ el.innerText = value;
258
+ }
259
+ function createEditIcon() {
260
+ const icon = document.createElement("button");
261
+ icon.className = "dcs-edit-icon";
262
+ icon.setAttribute("type", "button");
263
+ icon.setAttribute("title", "Edit text");
264
+ icon.setAttribute("aria-label", "Edit text inline");
265
+ icon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 7 4 4 20 4 20 7"/><line x1="9" y1="20" x2="15" y2="20"/><line x1="12" y1="4" x2="12" y2="20"/></svg>`;
266
+ icon.addEventListener("click", (e) => {
267
+ e.preventDefault();
268
+ e.stopPropagation();
269
+ e.stopImmediatePropagation();
270
+ if (!editIconTarget) return;
271
+ const el = editIconTarget;
272
+ const key = el.dataset.textKey;
273
+ const sectionParent = el.closest("[data-section]");
274
+ const sectionId = sectionParent?.dataset.section ?? null;
275
+ postToParent("dcs:text-key-dblclick", { key, sectionId });
276
+ startInlineEdit(el, key, sectionId);
277
+ removeEditIcon();
278
+ }, true);
279
+ icon.addEventListener("mouseleave", (e) => {
280
+ const related = e.relatedTarget;
281
+ if (related && editIconTarget && (related === editIconTarget || editIconTarget.contains(related))) return;
282
+ removeEditIcon();
283
+ });
284
+ return icon;
285
+ }
286
+ function showEditIcon(el) {
287
+ if (!editingEnabled) return;
288
+ if (!editIconElement) {
289
+ editIconElement = createEditIcon();
290
+ document.body.appendChild(editIconElement);
291
+ }
292
+ editIconTarget = el;
293
+ const rect = el.getBoundingClientRect();
294
+ editIconElement.style.top = `${rect.top + scrollY - 4}px`;
295
+ editIconElement.style.left = `${rect.left + scrollX - 4}px`;
296
+ editIconElement.style.display = "flex";
297
+ }
298
+ function removeEditIcon() {
299
+ if (editIconElement) {
300
+ editIconElement.style.display = "none";
301
+ }
302
+ editIconTarget = null;
303
+ }
304
+ function isArrayTextKey(key) {
305
+ return /\.\d+\./.test(key) || /\.\w+-\d+\./.test(key);
306
+ }
307
+ function getArrayBaseKey(key) {
308
+ const hyphenMatch = key.match(/^(.+?)-\d+\./);
309
+ if (hyphenMatch) return hyphenMatch[1];
310
+ const numMatch = key.match(/^(.+?)\.\d+\./);
311
+ return numMatch ? numMatch[1] : null;
312
+ }
313
+ function createArrayEditIcon() {
314
+ const icon = document.createElement("button");
315
+ icon.className = "dcs-array-edit-icon";
316
+ icon.setAttribute("type", "button");
317
+ icon.setAttribute("title", "Edit list items");
318
+ icon.setAttribute("aria-label", "Edit list items in panel");
319
+ icon.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="8" y1="6" x2="21" y2="6"/><line x1="8" y1="12" x2="21" y2="12"/><line x1="8" y1="18" x2="21" y2="18"/><line x1="3" y1="6" x2="3.01" y2="6"/><line x1="3" y1="12" x2="3.01" y2="12"/><line x1="3" y1="18" x2="3.01" y2="18"/></svg>`;
320
+ icon.addEventListener("click", (e) => {
321
+ e.preventDefault();
322
+ e.stopPropagation();
323
+ e.stopImmediatePropagation();
324
+ if (!arrayEditIconTarget) return;
325
+ const el = arrayEditIconTarget;
326
+ const key = el.dataset.textKey;
327
+ const arrayKey = getArrayBaseKey(key);
328
+ if (!arrayKey) return;
329
+ const sectionParent = el.closest("[data-section]");
330
+ const sectionId = sectionParent?.dataset.section ?? null;
331
+ postToParent("dcs:array-key-click", { arrayKey, sectionId });
332
+ removeArrayEditIcon();
333
+ }, true);
334
+ icon.addEventListener("mouseleave", (e) => {
335
+ const related = e.relatedTarget;
336
+ if (related && arrayEditIconTarget && (related === arrayEditIconTarget || arrayEditIconTarget.contains(related))) return;
337
+ removeArrayEditIcon();
338
+ });
339
+ return icon;
340
+ }
341
+ function showArrayEditIcon(el) {
342
+ if (!editingEnabled) return;
343
+ if (!arrayEditIconElement) {
344
+ arrayEditIconElement = createArrayEditIcon();
345
+ document.body.appendChild(arrayEditIconElement);
346
+ }
347
+ arrayEditIconTarget = el;
348
+ const rect = el.getBoundingClientRect();
349
+ arrayEditIconElement.style.top = `${rect.top + scrollY - 4}px`;
350
+ arrayEditIconElement.style.left = `${rect.left + scrollX - 4}px`;
351
+ arrayEditIconElement.style.display = "flex";
352
+ }
353
+ function removeArrayEditIcon() {
354
+ if (arrayEditIconElement) {
355
+ arrayEditIconElement.style.display = "none";
356
+ }
357
+ arrayEditIconTarget = null;
358
+ }
359
+ function injectEditorStyles() {
360
+ if (document.getElementById("dcs-editor-styles")) return;
361
+ const style = document.createElement("style");
362
+ style.id = "dcs-editor-styles";
363
+ style.textContent = `
364
+ [data-text-key].dcs-editable {
365
+ cursor: text !important;
366
+ border-radius: 4px;
367
+ position: relative;
368
+ }
369
+
370
+ [data-text-key].dcs-editable:hover {
371
+ outline: 2px dashed hsl(221.2 83.2% 53.3% / 0.4) !important;
372
+ outline-offset: 4px;
373
+ background-color: hsl(221.2 83.2% 53.3% / 0.03);
374
+ }
375
+
376
+ [data-text-key].dcs-editing {
377
+ outline: 2px solid hsl(221.2 83.2% 53.3%) !important;
378
+ outline-offset: 4px;
379
+ background-color: hsl(221.2 83.2% 53.3% / 0.06);
380
+ min-height: 1em;
381
+ }
382
+
383
+ [data-text-key].dcs-editing:focus {
384
+ outline: 2px solid hsl(221.2 83.2% 53.3%) !important;
385
+ outline-offset: 4px;
386
+ }
387
+
388
+ .dcs-section-highlight {
389
+ pointer-events: none;
390
+ }
391
+
392
+ /* Floating edit icon button */
393
+ .dcs-edit-icon {
394
+ position: absolute;
395
+ z-index: 99999;
396
+ display: none;
397
+ align-items: center;
398
+ justify-content: center;
399
+ width: 24px;
400
+ height: 24px;
401
+ padding: 0;
402
+ margin: 0;
403
+ border: 1.5px solid hsl(221.2 83.2% 53.3%);
404
+ border-radius: 4px;
405
+ background: hsl(221.2 83.2% 53.3% / 0.1);
406
+ backdrop-filter: blur(4px);
407
+ color: hsl(221.2 83.2% 53.3%);
408
+ cursor: pointer;
409
+ pointer-events: auto;
410
+ transition: background 0.15s, transform 0.1s;
411
+ box-shadow: 0 1px 3px rgba(0,0,0,0.12);
412
+ }
413
+
414
+ .dcs-edit-icon:hover {
415
+ background: hsl(221.2 83.2% 53.3% / 0.25);
416
+ transform: scale(1.1);
417
+ }
418
+
419
+ .dcs-edit-icon svg {
420
+ display: block;
421
+ }
422
+
423
+ /* Floating array edit icon button */
424
+ .dcs-array-edit-icon {
425
+ position: absolute;
426
+ z-index: 99999;
427
+ display: none;
428
+ align-items: center;
429
+ justify-content: center;
430
+ width: 24px;
431
+ height: 24px;
432
+ padding: 0;
433
+ margin: 0;
434
+ border: 1.5px solid hsl(271 91% 65%);
435
+ border-radius: 4px;
436
+ background: hsl(271 91% 65% / 0.1);
437
+ backdrop-filter: blur(4px);
438
+ color: hsl(271 91% 65%);
439
+ cursor: pointer;
440
+ pointer-events: auto;
441
+ transition: background 0.15s, transform 0.1s;
442
+ box-shadow: 0 1px 3px rgba(0,0,0,0.12);
443
+ }
444
+
445
+ .dcs-array-edit-icon:hover {
446
+ background: hsl(271 91% 65% / 0.25);
447
+ transform: scale(1.1);
448
+ }
449
+
450
+ .dcs-array-edit-icon svg {
451
+ display: block;
452
+ }
453
+ `;
454
+ document.head.appendChild(style);
455
+ }
456
+ function handleMessage(event) {
457
+ const msg = event.data;
458
+ if (!msg || typeof msg !== "object" || typeof msg.type !== "string") return;
459
+ if (!msg.type.startsWith("dcs:")) return;
460
+ const { type, data } = msg;
461
+ switch (type) {
462
+ case "dcs:init-editor":
463
+ enableEditorMode();
464
+ break;
465
+ case "dcs:highlight-section":
466
+ if (data && typeof data === "object" && "sectionId" in data) {
467
+ showSectionHighlight(data.sectionId);
468
+ }
469
+ break;
470
+ case "dcs:clear-highlight":
471
+ clearSectionHighlight();
472
+ break;
473
+ case "dcs:select-text-key":
474
+ if (data && typeof data === "object" && "key" in data) {
475
+ focusTextKey(data.key);
476
+ }
477
+ break;
478
+ case "dcs:update-text":
479
+ if (data && typeof data === "object" && "key" in data && "value" in data) {
480
+ const d = data;
481
+ updateTextInPlace(d.key, d.value);
482
+ }
483
+ break;
484
+ case "dcs:set-mode":
485
+ if (data && typeof data === "object" && "mode" in data) {
486
+ setMode(data.mode);
487
+ }
488
+ break;
489
+ case "dcs:set-editing-enabled":
490
+ if (data && typeof data === "object" && "enabled" in data) {
491
+ editingEnabled = data.enabled;
492
+ if (editingEnabled) {
493
+ document.querySelectorAll("[data-text-key]").forEach((el) => {
494
+ el.classList.add("dcs-editable");
495
+ });
496
+ } else {
497
+ if (activeEditElement) {
498
+ finishEdit(activeEditElement);
499
+ }
500
+ removeEditIcon();
501
+ removeArrayEditIcon();
502
+ document.querySelectorAll(".dcs-editable").forEach((el) => {
503
+ el.classList.remove("dcs-editable");
504
+ });
505
+ }
506
+ }
507
+ break;
508
+ }
509
+ }
510
+ function initEditorBridge() {
511
+ if (!isInIframe()) return;
512
+ if (!bridgeInitialized) {
513
+ bridgeInitialized = true;
514
+ monitorNavigation();
515
+ document.addEventListener("contextmenu", (e) => {
516
+ e.preventDefault();
517
+ const sectionEl = e.target.closest?.("[data-section]");
518
+ postToParent("dcs:contextmenu", {
519
+ x: e.clientX,
520
+ y: e.clientY,
521
+ sectionId: sectionEl?.dataset.section ?? null,
522
+ sectionLabel: sectionEl?.dataset.sectionLabel ?? null
523
+ });
524
+ }, true);
525
+ document.addEventListener("click", () => {
526
+ postToParent("dcs:click", {});
527
+ }, true);
528
+ globalThis.self.addEventListener("message", handleMessage);
529
+ if (import.meta.hot) {
530
+ import.meta.hot.on("vite:afterUpdate", () => {
531
+ setTimeout(rediscoverAndNotify, 300);
532
+ });
533
+ }
534
+ }
535
+ const sections = discoverSections();
536
+ const textKeys = discoverTextKeys();
537
+ const contentHeight = document.body.scrollHeight;
538
+ postToParent("dcs:ready", {
539
+ sections,
540
+ textKeys,
541
+ contentHeight
542
+ });
543
+ }
544
+ if (typeof globalThis.self !== "undefined" && isInIframe()) {
545
+ if (document.readyState === "loading") {
546
+ document.addEventListener("DOMContentLoaded", () => {
547
+ setTimeout(initEditorBridge, 200);
548
+ });
549
+ } else {
550
+ setTimeout(initEditorBridge, 200);
551
+ }
552
+ }
553
+
554
+ export { initEditorBridge };
555
+ //# sourceMappingURL=editorBridge.js.map
556
+ //# sourceMappingURL=editorBridge.js.map