wgsl-edit 0.0.13 → 0.0.15

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.
@@ -126,12 +126,17 @@ var WgslEdit = class extends HTMLElement {
126
126
  this.updateLint();
127
127
  this.dispatchChange();
128
128
  }
129
- /** Active file content (backward compatible). */
129
+ /** Active file content (single-file API). */
130
130
  get source() {
131
131
  return this.editorView?.state.doc.toString() ?? this._pendingSource ?? "";
132
132
  }
133
- /** Set active file content (backward compatible). */
133
+ /** Set active file content (single-file API). Auto-creates a default file entry. */
134
134
  set source(value) {
135
+ if (!this._activeFile && this._files.size === 0) {
136
+ this._files.set("main.wesl", { doc: Text.of(value.split("\n")) });
137
+ this._activeFile = "main.wesl";
138
+ this.renderTabs();
139
+ }
135
140
  if (this.editorView) {
136
141
  const to = this.editorView.state.doc.length;
137
142
  this.editorView.dispatch({ changes: {
@@ -139,7 +144,11 @@ var WgslEdit = class extends HTMLElement {
139
144
  to,
140
145
  insert: value
141
146
  } });
142
- } else this._pendingSource = value;
147
+ } else {
148
+ this._pendingSource = value;
149
+ const entry = this._files.get(this._activeFile);
150
+ if (entry) entry.doc = Text.of(value.split("\n"));
151
+ }
143
152
  }
144
153
  /** All file contents keyed by module path (e.g., "package::main"). */
145
154
  get sources() {
@@ -347,6 +356,10 @@ var WgslEdit = class extends HTMLElement {
347
356
  const initialDoc = this._pendingSource ?? (firstFile ? this._files.get(firstFile).doc.toString() : "");
348
357
  this._pendingSource = null;
349
358
  if (firstFile) this._activeFile = firstFile;
359
+ else if (initialDoc) {
360
+ this._files.set("main.wesl", { doc: Text.of(initialDoc.split("\n")) });
361
+ this._activeFile = "main.wesl";
362
+ }
350
363
  this.editorView = new EditorView({
351
364
  state: EditorState.create({
352
365
  doc: initialDoc,
@@ -371,7 +384,8 @@ var WgslEdit = class extends HTMLElement {
371
384
  buildExtensions() {
372
385
  const baseTheme = EditorView.theme({
373
386
  ".cm-content": { padding: "0" },
374
- ".cm-line": { padding: "0" }
387
+ ".cm-line": { padding: "0" },
388
+ ".cm-panels": { position: "relative" }
375
389
  });
376
390
  return [
377
391
  basicSetup,
@@ -40,9 +40,9 @@ declare class WgslEdit extends HTMLElement {
40
40
  /** Conditions for conditional compilation (@if/@elif/@else). */
41
41
  get conditions(): Conditions;
42
42
  set conditions(value: Conditions);
43
- /** Active file content (backward compatible). */
43
+ /** Active file content (single-file API). */
44
44
  get source(): string;
45
- /** Set active file content (backward compatible). */
45
+ /** Set active file content (single-file API). Auto-creates a default file entry. */
46
46
  set source(value: string);
47
47
  /** All file contents keyed by module path (e.g., "package::main"). */
48
48
  get sources(): Record<string, string>;
package/dist/WgslEdit.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import "./Language.js";
2
- import { t as WgslEdit } from "./WgslEdit-BSUXQfGS.js";
2
+ import { t as WgslEdit } from "./WgslEdit-Cnm70aie.js";
3
3
 
4
4
  export { WgslEdit };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { wesl, weslLanguage } from "./Language.js";
2
- import { t as WgslEdit } from "./WgslEdit-BSUXQfGS.js";
2
+ import { t as WgslEdit } from "./WgslEdit-Cnm70aie.js";
3
3
 
4
4
  //#region src/index.ts
5
5
  if (!customElements.get("wgsl-edit")) customElements.define("wgsl-edit", WgslEdit);
package/dist/wgsl-edit.js CHANGED
@@ -1473,9 +1473,9 @@ var Parser = class {
1473
1473
  Run a full parse, returning the resulting tree.
1474
1474
  */
1475
1475
  parse(input, fragments, ranges) {
1476
- let parse$1 = this.startParse(input, fragments, ranges);
1476
+ let parse = this.startParse(input, fragments, ranges);
1477
1477
  for (;;) {
1478
- let done = parse$1.advance();
1478
+ let done = parse.advance();
1479
1479
  if (done) return done;
1480
1480
  }
1481
1481
  }
@@ -3101,8 +3101,8 @@ var StateField = class StateField {
3101
3101
  return field;
3102
3102
  }
3103
3103
  create(state) {
3104
- let init$1 = state.facet(initField).find((i$2) => i$2.field == this);
3105
- return ((init$1 === null || init$1 === void 0 ? void 0 : init$1.create) || this.createF)(state);
3104
+ let init = state.facet(initField).find((i$2) => i$2.field == this);
3105
+ return ((init === null || init === void 0 ? void 0 : init.create) || this.createF)(state);
3106
3106
  }
3107
3107
  /**
3108
3108
  @internal
@@ -3122,8 +3122,8 @@ var StateField = class StateField {
3122
3122
  return 1;
3123
3123
  },
3124
3124
  reconfigure: (state, oldState) => {
3125
- let init$1 = state.facet(initField), oldInit = oldState.facet(initField), reInit;
3126
- if ((reInit = init$1.find((i$2) => i$2.field == this)) && reInit != oldInit.find((i$2) => i$2.field == this)) {
3125
+ let init = state.facet(initField), oldInit = oldState.facet(initField), reInit;
3126
+ if ((reInit = init.find((i$2) => i$2.field == this)) && reInit != oldInit.find((i$2) => i$2.field == this)) {
3127
3127
  state.values[idx] = reInit.create(state);
3128
3128
  return 1;
3129
3129
  }
@@ -4902,8 +4902,8 @@ function findColumn(string$1, col, tabSize, strict) {
4902
4902
 
4903
4903
  //#endregion
4904
4904
  //#region ../../node_modules/.pnpm/style-mod@4.1.2/node_modules/style-mod/src/style-mod.js
4905
- const C$1 = "ͼ";
4906
- const COUNT = typeof Symbol == "undefined" ? "__" + C$1 : Symbol.for(C$1);
4905
+ const C = "ͼ";
4906
+ const COUNT = typeof Symbol == "undefined" ? "__" + C : Symbol.for(C);
4907
4907
  const SET = typeof Symbol == "undefined" ? "__styleSet" + Math.floor(Math.random() * 1e8) : Symbol("styleSet");
4908
4908
  const top = typeof globalThis != "undefined" ? globalThis : typeof window != "undefined" ? window : {};
4909
4909
  var StyleModule = class {
@@ -4934,7 +4934,7 @@ var StyleModule = class {
4934
4934
  static newName() {
4935
4935
  let id = top[COUNT] || 1;
4936
4936
  top[COUNT] = id + 1;
4937
- return C$1 + id.toString(36);
4937
+ return C + id.toString(36);
4938
4938
  }
4939
4939
  static mount(root, modules, options) {
4940
4940
  let set = root[SET], nonce = options && options.nonce;
@@ -18725,9 +18725,9 @@ var LRParser = class LRParser extends Parser {
18725
18725
  this.top = this.topRules[Object.keys(this.topRules)[0]];
18726
18726
  }
18727
18727
  createParse(input, fragments, ranges) {
18728
- let parse$1 = new Parse(this, input, fragments, ranges);
18729
- for (let w of this.wrappers) parse$1 = w(parse$1, input, fragments, ranges);
18730
- return parse$1;
18728
+ let parse = new Parse(this, input, fragments, ranges);
18729
+ for (let w of this.wrappers) parse = w(parse, input, fragments, ranges);
18730
+ return parse;
18731
18731
  }
18732
18732
  /**
18733
18733
  Get a goto table entry @internal
@@ -19956,8 +19956,8 @@ function parseCommaList(ctx, parseItem) {
19956
19956
  return items;
19957
19957
  }
19958
19958
  /** Yield parsed elements until parser returns null. */
19959
- function* parseMany(ctx, parse$1) {
19960
- for (let elem = parse$1(ctx); elem; elem = parse$1(ctx)) yield elem;
19959
+ function* parseMany(ctx, parse) {
19960
+ for (let elem = parse(ctx); elem; elem = parse(ctx)) yield elem;
19961
19961
  }
19962
19962
  /** Create a NameElem from a word token. */
19963
19963
  function makeNameElem(token) {
@@ -27634,89 +27634,14 @@ const minimalSetup = [
27634
27634
  keymap.of([...defaultKeymap, ...historyKeymap])
27635
27635
  ];
27636
27636
 
27637
- //#endregion
27638
- //#region ../../node_modules/.pnpm/es-module-lexer@1.7.0/node_modules/es-module-lexer/dist/lexer.js
27639
- var ImportType;
27640
- (function(A$1) {
27641
- A$1[A$1.Static = 1] = "Static", A$1[A$1.Dynamic = 2] = "Dynamic", A$1[A$1.ImportMeta = 3] = "ImportMeta", A$1[A$1.StaticSourcePhase = 4] = "StaticSourcePhase", A$1[A$1.DynamicSourcePhase = 5] = "DynamicSourcePhase", A$1[A$1.StaticDeferPhase = 6] = "StaticDeferPhase", A$1[A$1.DynamicDeferPhase = 7] = "DynamicDeferPhase";
27642
- })(ImportType || (ImportType = {}));
27643
- const A = 1 === new Uint8Array(new Uint16Array([1]).buffer)[0];
27644
- function parse(E$1, g = "@") {
27645
- if (!C) return init.then((() => parse(E$1)));
27646
- const I = E$1.length + 1, w = (C.__heap_base.value || C.__heap_base) + 4 * I - C.memory.buffer.byteLength;
27647
- w > 0 && C.memory.grow(Math.ceil(w / 65536));
27648
- const K = C.sa(I - 1);
27649
- if ((A ? B : Q)(E$1, new Uint16Array(C.memory.buffer, K, I)), !C.parse()) throw Object.assign(/* @__PURE__ */ new Error(`Parse error ${g}:${E$1.slice(0, C.e()).split("\n").length}:${C.e() - E$1.lastIndexOf("\n", C.e() - 1)}`), { idx: C.e() });
27650
- const o = [], D = [];
27651
- for (; C.ri();) {
27652
- const A$1 = C.is(), Q$1 = C.ie(), B$1 = C.it(), g$1 = C.ai(), I$1 = C.id(), w$1 = C.ss(), K$1 = C.se();
27653
- let D$1;
27654
- C.ip() && (D$1 = k(E$1.slice(-1 === I$1 ? A$1 - 1 : A$1, -1 === I$1 ? Q$1 + 1 : Q$1))), o.push({
27655
- n: D$1,
27656
- t: B$1,
27657
- s: A$1,
27658
- e: Q$1,
27659
- ss: w$1,
27660
- se: K$1,
27661
- d: I$1,
27662
- a: g$1
27663
- });
27664
- }
27665
- for (; C.re();) {
27666
- const A$1 = C.es(), Q$1 = C.ee(), B$1 = C.els(), g$1 = C.ele(), I$1 = E$1.slice(A$1, Q$1), w$1 = I$1[0], K$1 = B$1 < 0 ? void 0 : E$1.slice(B$1, g$1), o$1 = K$1 ? K$1[0] : "";
27667
- D.push({
27668
- s: A$1,
27669
- e: Q$1,
27670
- ls: B$1,
27671
- le: g$1,
27672
- n: "\"" === w$1 || "'" === w$1 ? k(I$1) : I$1,
27673
- ln: "\"" === o$1 || "'" === o$1 ? k(K$1) : K$1
27674
- });
27675
- }
27676
- function k(A$1) {
27677
- try {
27678
- return (0, eval)(A$1);
27679
- } catch (A$2) {}
27680
- }
27681
- return [
27682
- o,
27683
- D,
27684
- !!C.f(),
27685
- !!C.ms()
27686
- ];
27687
- }
27688
- function Q(A$1, Q$1) {
27689
- const B$1 = A$1.length;
27690
- let C$2 = 0;
27691
- for (; C$2 < B$1;) {
27692
- const B$2 = A$1.charCodeAt(C$2);
27693
- Q$1[C$2++] = (255 & B$2) << 8 | B$2 >>> 8;
27694
- }
27695
- }
27696
- function B(A$1, Q$1) {
27697
- const B$1 = A$1.length;
27698
- let C$2 = 0;
27699
- for (; C$2 < B$1;) Q$1[C$2] = A$1.charCodeAt(C$2++);
27700
- }
27701
- let C;
27702
- const E = () => {
27703
- return A$1 = "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GzYCHAtBAEEAKAKwCkECajYCsAoCQAJAAkACQEEAECkiAUHhAEYNACABQfcARg0BQQAoArAKIQEMAgtBACgCsAoiAUECakHACEEKEC8NAUEGIQIMAgtBACgCsAoiAS8BAkHpAEcNACABLwEEQfQARw0AQQQhAiABLwEGQegARg0BC0EAIAFBfmo2ArAKDwtBACABIAJBAXRqNgKwCgJAQQEQKUH7AEYNAEEAIAE2ArAKDwtBACgCsAoiACECA0BBACACQQJqNgKwCgJAAkACQEEBECkiAkEiRg0AIAJBJ0cNAUEnEBpBAEEAKAKwCkECajYCsApBARApIQIMAgtBIhAaQQBBACgCsApBAmo2ArAKQQEQKSECDAELIAIQLCECCwJAIAJBOkYNAEEAIAE2ArAKDwtBAEEAKAKwCkECajYCsAoCQEEBECkiAkEiRg0AIAJBJ0YNAEEAIAE2ArAKDwsgAhAaQQBBACgCsApBAmo2ArAKAkACQEEBECkiAkEsRg0AIAJB/QBGDQFBACABNgKwCg8LQQBBACgCsApBAmo2ArAKQQEQKUH9AEYNAEEAKAKwCiECDAELC0EAKALwCSIBIAA2AhAgAUEAKAKwCkECajYCDAttAQJ/AkACQANAAkAgAEH//wNxIgFBd2oiAkEXSw0AQQEgAnRBn4CABHENAgsgAUGgAUYNASAAIQIgARAoDQJBACECQQBBACgCsAoiAEECajYCsAogAC8BAiIADQAMAgsLIAAhAgsgAkH//wNxC6sBAQR/AkACQEEAKAKwCiICLwEAIgNB4QBGDQAgASEEIAAhBQwBC0EAIAJBBGo2ArAKQQEQKSECQQAoArAKIQUCQAJAIAJBIkYNACACQSdGDQAgAhAsGkEAKAKwCiEEDAELIAIQGkEAQQAoArAKQQJqIgQ2ArAKC0EBECkhA0EAKAKwCiECCwJAIAIgBUYNACAFIARBACAAIAAgAUYiAhtBACABIAIbEAILIAMLcgEEf0EAKAKwCiEAQQAoArQKIQECQAJAA0AgAEECaiECIAAgAU8NAQJAAkAgAi8BACIDQaR/ag4CAQQACyACIQAgA0F2ag4EAgEBAgELIABBBGohAAwACwtBACACNgKwChAlQQAPC0EAIAI2ArAKQd0AC0kBA39BACEDAkAgAkUNAAJAA0AgAC0AACIEIAEtAAAiBUcNASABQQFqIQEgAEEBaiEAIAJBf2oiAg0ADAILCyAEIAVrIQMLIAMLC+wBAgBBgAgLzgEAAHgAcABvAHIAdABtAHAAbwByAHQAZgBvAHIAZQB0AGEAbwB1AHIAYwBlAHIAbwBtAHUAbgBjAHQAaQBvAG4AcwBzAGUAcgB0AHYAbwB5AGkAZQBkAGUAbABlAGMAbwBuAHQAaQBuAGkAbgBzAHQAYQBuAHQAeQBiAHIAZQBhAHIAZQB0AHUAcgBkAGUAYgB1AGcAZwBlAGEAdwBhAGkAdABoAHIAdwBoAGkAbABlAGkAZgBjAGEAdABjAGYAaQBuAGEAbABsAGUAbABzAABB0AkLEAEAAAACAAAAAAQAAEA5AAA=", "undefined" != typeof Buffer ? Buffer.from(A$1, "base64") : Uint8Array.from(atob(A$1), ((A$2) => A$2.charCodeAt(0)));
27704
- var A$1;
27705
- };
27706
- const init = WebAssembly.compile(E()).then(WebAssembly.instantiate).then((({ exports: A$1 }) => {
27707
- C = A$1;
27708
- }));
27709
-
27710
27637
  //#endregion
27711
27638
  //#region ../wesl-fetch/src/BundleHydrator.ts
27712
- const initPromise = init;
27639
+ const importPattern = /import\s+(?:\*\s+as\s+)?(\w+)\s+from\s+["']([^"']+)["']/g;
27713
27640
  const nestedBundlePattern = /package\/dist\/(.+)\/weslBundle\.js$/;
27714
27641
  const rootBundlePattern = /package\/dist\/weslBundle\.js$/;
27715
27642
  const weslBundleExportPattern = /export\s+const\s+weslBundle\s*=\s*({[\s\S]+});?\s*$/m;
27716
- const importVarPattern = /import\s+(\w+)\s+from/;
27717
27643
  /** Parse bundle files into a registry without hydrating. */
27718
27644
  async function bundleRegistry(bundleFiles, registry = /* @__PURE__ */ new Map()) {
27719
- await initPromise;
27720
27645
  for (const file of bundleFiles) {
27721
27646
  const { content: content$1, packagePath, packageName } = file;
27722
27647
  const bundleInfo = parseBundleImports(content$1);
@@ -27732,19 +27657,14 @@ async function hydrateBundleRegistry(registry, fetcher) {
27732
27657
  for (const path of registry.keys()) bundles.push(await hydrateBundle(path, registry, hydrated, fetcher));
27733
27658
  return bundles;
27734
27659
  }
27735
- /** Parse ES module imports from bundle code using es-module-lexer. */
27660
+ /** Parse ES module imports from bundle code. */
27736
27661
  function parseBundleImports(code$1) {
27737
27662
  const exportMatch = code$1.match(weslBundleExportPattern);
27738
27663
  if (!exportMatch) throw new Error("Could not find weslBundle export in bundle");
27739
- const [imports] = parse(code$1);
27740
- const parsedImports = imports.map((imp) => {
27741
- const statement = code$1.slice(imp.ss, imp.se);
27742
- const match = statement.match(importVarPattern);
27743
- if (!match) throw new Error(`Could not parse import variable name from: ${statement}`);
27744
- return {
27745
- varName: match[1],
27746
- path: imp.n.replace(/\//g, "::")
27747
- };
27664
+ const parsedImports = [];
27665
+ for (const match of code$1.matchAll(importPattern)) parsedImports.push({
27666
+ varName: match[1],
27667
+ path: match[2].replace(/\//g, "::")
27748
27668
  });
27749
27669
  return {
27750
27670
  bundleLiteral: exportMatch[1],
@@ -28400,12 +28320,17 @@ var WgslEdit = class extends HTMLElement {
28400
28320
  this.updateLint();
28401
28321
  this.dispatchChange();
28402
28322
  }
28403
- /** Active file content (backward compatible). */
28323
+ /** Active file content (single-file API). */
28404
28324
  get source() {
28405
28325
  return this.editorView?.state.doc.toString() ?? this._pendingSource ?? "";
28406
28326
  }
28407
- /** Set active file content (backward compatible). */
28327
+ /** Set active file content (single-file API). Auto-creates a default file entry. */
28408
28328
  set source(value) {
28329
+ if (!this._activeFile && this._files.size === 0) {
28330
+ this._files.set("main.wesl", { doc: Text.of(value.split("\n")) });
28331
+ this._activeFile = "main.wesl";
28332
+ this.renderTabs();
28333
+ }
28409
28334
  if (this.editorView) {
28410
28335
  const to = this.editorView.state.doc.length;
28411
28336
  this.editorView.dispatch({ changes: {
@@ -28413,7 +28338,11 @@ var WgslEdit = class extends HTMLElement {
28413
28338
  to,
28414
28339
  insert: value
28415
28340
  } });
28416
- } else this._pendingSource = value;
28341
+ } else {
28342
+ this._pendingSource = value;
28343
+ const entry = this._files.get(this._activeFile);
28344
+ if (entry) entry.doc = Text.of(value.split("\n"));
28345
+ }
28417
28346
  }
28418
28347
  /** All file contents keyed by module path (e.g., "package::main"). */
28419
28348
  get sources() {
@@ -28621,6 +28550,10 @@ var WgslEdit = class extends HTMLElement {
28621
28550
  const initialDoc = this._pendingSource ?? (firstFile ? this._files.get(firstFile).doc.toString() : "");
28622
28551
  this._pendingSource = null;
28623
28552
  if (firstFile) this._activeFile = firstFile;
28553
+ else if (initialDoc) {
28554
+ this._files.set("main.wesl", { doc: Text.of(initialDoc.split("\n")) });
28555
+ this._activeFile = "main.wesl";
28556
+ }
28624
28557
  this.editorView = new EditorView({
28625
28558
  state: EditorState.create({
28626
28559
  doc: initialDoc,
@@ -28645,7 +28578,8 @@ var WgslEdit = class extends HTMLElement {
28645
28578
  buildExtensions() {
28646
28579
  const baseTheme$6 = EditorView.theme({
28647
28580
  ".cm-content": { padding: "0" },
28648
- ".cm-line": { padding: "0" }
28581
+ ".cm-line": { padding: "0" },
28582
+ ".cm-panels": { position: "relative" }
28649
28583
  });
28650
28584
  return [
28651
28585
  basicSetup,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "wgsl-edit",
3
3
  "description": "Web component for editing WGSL/WESL with CodeMirror",
4
- "version": "0.0.13",
4
+ "version": "0.0.15",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
@@ -33,9 +33,9 @@
33
33
  "@codemirror/view": "^6.0.0",
34
34
  "@lezer/highlight": "^1.2.1",
35
35
  "codemirror": "^6.0.0",
36
- "lezer-wesl": "0.6.41",
37
36
  "wesl": "0.7.20",
38
- "wesl-fetch": "0.0.7"
37
+ "lezer-wesl": "0.6.41",
38
+ "wesl-fetch": "0.0.8"
39
39
  },
40
40
  "devDependencies": {
41
41
  "open": "^10.0.0",
package/src/WgslEdit.ts CHANGED
@@ -194,18 +194,25 @@ export class WgslEdit extends HTMLElement {
194
194
  this.dispatchChange();
195
195
  }
196
196
 
197
- /** Active file content (backward compatible). */
197
+ /** Active file content (single-file API). */
198
198
  get source(): string {
199
199
  return this.editorView?.state.doc.toString() ?? this._pendingSource ?? "";
200
200
  }
201
201
 
202
- /** Set active file content (backward compatible). */
202
+ /** Set active file content (single-file API). Auto-creates a default file entry. */
203
203
  set source(value: string) {
204
+ if (!this._activeFile && this._files.size === 0) {
205
+ this._files.set("main.wesl", { doc: Text.of(value.split("\n")) });
206
+ this._activeFile = "main.wesl";
207
+ this.renderTabs();
208
+ }
204
209
  if (this.editorView) {
205
210
  const to = this.editorView.state.doc.length;
206
211
  this.editorView.dispatch({ changes: { from: 0, to, insert: value } });
207
212
  } else {
208
213
  this._pendingSource = value;
214
+ const entry = this._files.get(this._activeFile);
215
+ if (entry) entry.doc = Text.of(value.split("\n"));
209
216
  }
210
217
  }
211
218
 
@@ -444,7 +451,12 @@ export class WgslEdit extends HTMLElement {
444
451
  this._pendingSource ??
445
452
  (firstFile ? this._files.get(firstFile)!.doc.toString() : "");
446
453
  this._pendingSource = null;
447
- if (firstFile) this._activeFile = firstFile;
454
+ if (firstFile) {
455
+ this._activeFile = firstFile;
456
+ } else if (initialDoc) {
457
+ this._files.set("main.wesl", { doc: Text.of(initialDoc.split("\n")) });
458
+ this._activeFile = "main.wesl";
459
+ }
448
460
 
449
461
  const state = EditorState.create({
450
462
  doc: initialDoc,
@@ -472,6 +484,7 @@ export class WgslEdit extends HTMLElement {
472
484
  const baseTheme = EditorView.theme({
473
485
  ".cm-content": { padding: "0" },
474
486
  ".cm-line": { padding: "0" },
487
+ ".cm-panels": { position: "relative" }, // suppress firefox warning in scrollable containers
475
488
  });
476
489
  return [
477
490
  basicSetup,