@i14ks/ccv 0.17.0 → 0.17.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 (24) hide show
  1. package/bundle/ccv.mjs +242 -1
  2. package/package.json +1 -1
  3. package/web/assets/{codemirror-DcwBBoHv.js → codemirror-lu8HamKP.js} +1 -1
  4. package/web/assets/{index-CLScHnZN.js → index-3sshvreD.js} +1 -1
  5. package/web/assets/{index-B9bs4QFR.js → index-B7ozEwgu.js} +1 -1
  6. package/web/assets/{index-CQ0-WYgR.js → index-BJqZWIPR.js} +1 -1
  7. package/web/assets/{index-DB25Lbd8.js → index-BUWJHuYf.js} +1 -1
  8. package/web/assets/{index-D9qvIR3L.js → index-BfxQTveJ.js} +1 -1
  9. package/web/assets/{index-Bee9erGK.js → index-BuyfXyo4.js} +1 -1
  10. package/web/assets/{index-Cu4PsUGS.js → index-C13Jucn1.js} +1 -1
  11. package/web/assets/{index-RifJd-I8.js → index-C4wYlk_J.js} +30 -30
  12. package/web/assets/{index-TIzoSl17.js → index-Cc7JijiI.js} +1 -1
  13. package/web/assets/{index-CjxzVwrV.js → index-CcKtEXQw.js} +1 -1
  14. package/web/assets/{index-VZG_Pg4O.js → index-CqZsTMCh.js} +1 -1
  15. package/web/assets/{index-B0Ss0xRi.js → index-D37eFo7a.js} +1 -1
  16. package/web/assets/{index-BpL4NCNb.js → index-D5k_lqHb.js} +1 -1
  17. package/web/assets/{index-DzgVil07.js → index-D9R4w6Zg.js} +1 -1
  18. package/web/assets/{index--smhGK8Y.js → index-DIGg_HG2.js} +1 -1
  19. package/web/assets/{index-CO3xirid.js → index-DNoT5Ala.js} +1 -1
  20. package/web/assets/{index-BrAmkvn2.js → index-Dj1v9Gkj.js} +1 -1
  21. package/web/assets/{index-D51RIwGp.js → index-DmaRIPd6.js} +1 -1
  22. package/web/assets/{index-CnCCNUTy.js → index-Drc8TpEz.js} +1 -1
  23. package/web/assets/{index-DwamecDE.js → index-Dvlp7Iqq.js} +1 -1
  24. package/web/index.html +1 -1
package/bundle/ccv.mjs CHANGED
@@ -158,7 +158,68 @@ function isClientFrame(value) {
158
158
  return typeof value === "object" && value !== null && typeof value.type === "string";
159
159
  }
160
160
  function workspaceIdFromPath(absolutePath) {
161
- return absolutePath.replace(/[^a-zA-Z0-9]/g, "-").replace(/-+/g, "-").toLowerCase();
161
+ const slug = absolutePath.replace(/[^\p{L}\p{N}\p{M}]/gu, "-").replace(/-+/g, "-").toLowerCase().replace(/^-|-$/g, "");
162
+ return `${slug || "project"}-${pathHash(absolutePath)}`;
163
+ }
164
+ function formerWorkspaceIdsFromPath(absolutePath) {
165
+ const plain = absolutePath.replace(/[^a-zA-Z0-9]/g, "-").replace(/-+/g, "-").toLowerCase();
166
+ const hashed = `${plain.replace(/^-+|-+$/g, "") || "project"}-${pathHash(absolutePath)}`;
167
+ const current = workspaceIdFromPath(absolutePath);
168
+ return [plain, hashed].filter((id) => id !== current);
169
+ }
170
+ function pathHash(absolutePath) {
171
+ const windows = /^[a-zA-Z]:[\\/]|^\\\\/.test(absolutePath);
172
+ return hashText(windows ? absolutePath.toLowerCase() : absolutePath);
173
+ }
174
+ function hashText(text) {
175
+ let h1 = 3735928559;
176
+ let h2 = 1103547991;
177
+ for (let i = 0; i < text.length; i++) {
178
+ const code = text.charCodeAt(i);
179
+ h1 = Math.imul(h1 ^ code, 2654435761);
180
+ h2 = Math.imul(h2 ^ code, 1597334677);
181
+ }
182
+ h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
183
+ h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
184
+ return (4294967296 * (2097151 & h2) + (h1 >>> 0)).toString(36);
185
+ }
186
+
187
+ // ../host/dist/workspace-ids.js
188
+ function workspaceIdRemap(paths, sessionsOf) {
189
+ const byLegacy = /* @__PURE__ */ new Map();
190
+ for (const path25 of paths) {
191
+ const id = workspaceIdFromPath(path25);
192
+ for (const legacy of formerWorkspaceIdsFromPath(path25)) {
193
+ const group = byLegacy.get(legacy) ?? [];
194
+ if (!group.some((target) => target.id === id))
195
+ group.push({ id, path: path25 });
196
+ byLegacy.set(legacy, group);
197
+ }
198
+ }
199
+ const owners = /* @__PURE__ */ new Map();
200
+ return {
201
+ targets: (id) => (byLegacy.get(id) ?? []).map((target) => target.id),
202
+ owner: async (id, sessionId) => {
203
+ const group = byLegacy.get(id);
204
+ if (!group)
205
+ return void 0;
206
+ if (group.length === 1)
207
+ return group[0].id;
208
+ let lookup = owners.get(id);
209
+ if (!lookup) {
210
+ lookup = (async () => {
211
+ const found = /* @__PURE__ */ new Map();
212
+ for (const target of group) {
213
+ for (const session of await sessionsOf(target.path))
214
+ found.set(session, target.id);
215
+ }
216
+ return found;
217
+ })();
218
+ owners.set(id, lookup);
219
+ }
220
+ return (await lookup).get(sessionId);
221
+ }
222
+ };
162
223
  }
163
224
 
164
225
  // ../host/dist/session.js
@@ -3831,6 +3892,27 @@ var AntigravityStore = class {
3831
3892
  await this.#load();
3832
3893
  return [...this.#records.values()].filter((r) => r.workspaceId === workspaceId);
3833
3894
  }
3895
+ /**
3896
+ * Перенести записи с id проекта прежнего формата на нынешний (см.
3897
+ * [`workspace-ids.ts`](./workspace-ids.ts)). Какому из проектов, деливших
3898
+ * прежний id, принадлежит сессия, здесь видно без поиска — по её `cwd`.
3899
+ */
3900
+ async remapWorkspaceIds(remap) {
3901
+ await this.#load();
3902
+ let changed = false;
3903
+ for (const record of this.#records.values()) {
3904
+ const targets = remap.targets(record.workspaceId);
3905
+ const own = workspaceIdFromPath(record.cwd);
3906
+ const next = targets.find((target) => target === own) ?? targets[0];
3907
+ if (!next || next === record.workspaceId)
3908
+ continue;
3909
+ record.workspaceId = next;
3910
+ changed = true;
3911
+ }
3912
+ if (changed)
3913
+ await this.#persist();
3914
+ return changed;
3915
+ }
3834
3916
  async save(record) {
3835
3917
  await this.#load();
3836
3918
  this.#records.set(record.id, { ...record });
@@ -5060,6 +5142,10 @@ var WorkspaceRegistry = class {
5060
5142
  listArchived() {
5061
5143
  return this.#entries.filter((e) => e.archivedAt).map((e) => toInfo(e));
5062
5144
  }
5145
+ /** Каталоги всех проектов реестра, открытых и закрытых. */
5146
+ paths() {
5147
+ return this.#entries.map((e) => e.path);
5148
+ }
5063
5149
  find(id) {
5064
5150
  const entry = this.#entries.find((e) => workspaceIdFromPath(e.path) === id);
5065
5151
  return entry ? toInfo(entry) : void 0;
@@ -5251,6 +5337,25 @@ var SessionArchive = class {
5251
5337
  this.#restored = /* @__PURE__ */ new Map();
5252
5338
  }
5253
5339
  }
5340
+ /**
5341
+ * Перенести записи с id проекта прежнего формата на нынешний (см.
5342
+ * [`workspace-ids.ts`](./workspace-ids.ts)). Запись о сессии, которой нет ни
5343
+ * в одном из проектов, деливших прежний id, уходит первому из них — там её
5344
+ * уберёт обычное подметание.
5345
+ */
5346
+ async remapWorkspaceIds(remap) {
5347
+ let changed = false;
5348
+ for (const [id, record] of this.#archived) {
5349
+ const next = await remap.owner(record.workspaceId, id) ?? remap.targets(record.workspaceId)[0];
5350
+ if (!next || next === record.workspaceId)
5351
+ continue;
5352
+ this.#archived.set(id, { ...record, workspaceId: next });
5353
+ changed = true;
5354
+ }
5355
+ if (changed)
5356
+ await this.#persist();
5357
+ return changed;
5358
+ }
5254
5359
  find(sessionId) {
5255
5360
  return this.#archived.get(sessionId);
5256
5361
  }
@@ -5369,6 +5474,24 @@ var SessionPins = class {
5369
5474
  this.#moved = /* @__PURE__ */ new Map();
5370
5475
  }
5371
5476
  }
5477
+ /**
5478
+ * Перенести записи с id проекта прежнего формата на нынешний — то же, что
5479
+ * `SessionArchive.remapWorkspaceIds`, и с той же оговоркой про сессию,
5480
+ * которой нет ни в одном из проектов.
5481
+ */
5482
+ async remapWorkspaceIds(remap) {
5483
+ let changed = false;
5484
+ for (const [id, record] of this.#pinned) {
5485
+ const next = await remap.owner(record.workspaceId, id) ?? remap.targets(record.workspaceId)[0];
5486
+ if (!next || next === record.workspaceId)
5487
+ continue;
5488
+ this.#pinned.set(id, { ...record, workspaceId: next });
5489
+ changed = true;
5490
+ }
5491
+ if (changed)
5492
+ await this.#persist();
5493
+ return changed;
5494
+ }
5372
5495
  find(sessionId) {
5373
5496
  return this.#pinned.get(sessionId);
5374
5497
  }
@@ -5544,6 +5667,48 @@ var ListOrderStore = class {
5544
5667
  } else {
5545
5668
  this.#order[scope] = clean ?? [];
5546
5669
  }
5670
+ await this.#persist();
5671
+ }
5672
+ /**
5673
+ * Перенести порядок с id проектов прежнего формата на нынешние (см.
5674
+ * [`workspace-ids.ts`](./workspace-ids.ts)).
5675
+ *
5676
+ * Порядок сессий, записанный под id, который делили несколько проектов,
5677
+ * раскладывается по владельцам сессий: общий список у каждого из них
5678
+ * переставлял бы чужие строки, которых в его списке нет.
5679
+ */
5680
+ async remapWorkspaceIds(remap) {
5681
+ let changed = false;
5682
+ const workspaces = dedupe(this.#order.workspaces.flatMap((id) => {
5683
+ const targets = remap.targets(id);
5684
+ return targets.length > 0 ? targets : [id];
5685
+ }));
5686
+ if (workspaces.join("\n") !== this.#order.workspaces.join("\n")) {
5687
+ this.#order.workspaces = workspaces;
5688
+ changed = true;
5689
+ }
5690
+ for (const [workspaceId, ids] of Object.entries(this.#order.sessions)) {
5691
+ const targets = remap.targets(workspaceId);
5692
+ if (targets.length === 0)
5693
+ continue;
5694
+ const split = /* @__PURE__ */ new Map();
5695
+ for (const id of ids) {
5696
+ const owner = await remap.owner(workspaceId, id);
5697
+ if (!owner)
5698
+ continue;
5699
+ split.set(owner, [...split.get(owner) ?? [], id]);
5700
+ }
5701
+ delete this.#order.sessions[workspaceId];
5702
+ for (const [owner, own] of split) {
5703
+ this.#order.sessions[owner] ??= own;
5704
+ }
5705
+ changed = true;
5706
+ }
5707
+ if (changed)
5708
+ await this.#persist();
5709
+ return changed;
5710
+ }
5711
+ async #persist() {
5547
5712
  await mkdir8(path15.dirname(this.#storePath), { recursive: true });
5548
5713
  await writeFile9(this.#storePath, JSON.stringify(this.#order, null, 2), "utf8");
5549
5714
  }
@@ -5608,6 +5773,60 @@ var Folders = class {
5608
5773
  this.#pinnedAssignments = /* @__PURE__ */ new Map();
5609
5774
  }
5610
5775
  }
5776
+ /**
5777
+ * Перенести папки с id проектов прежнего формата на нынешние (см.
5778
+ * [`workspace-ids.ts`](./workspace-ids.ts)).
5779
+ *
5780
+ * Проект в папке проектов, чей id делили несколько проектов, — это все они:
5781
+ * в списке они и стояли в ней вместе. Папка сессий так не делится, она
5782
+ * принадлежит одному проекту — тому, чьих сессий в ней больше; сессии
5783
+ * остальных из неё вынимаются, иначе они указывали бы на папку, которой в
5784
+ * их списке нет.
5785
+ */
5786
+ async remapWorkspaceIds(remap) {
5787
+ let changed = false;
5788
+ for (const [workspaceId, folderId] of [...this.#workspaceAssignments]) {
5789
+ const targets = remap.targets(workspaceId);
5790
+ if (targets.length === 0)
5791
+ continue;
5792
+ this.#workspaceAssignments.delete(workspaceId);
5793
+ for (const target of targets) {
5794
+ if (!this.#workspaceAssignments.has(target))
5795
+ this.#workspaceAssignments.set(target, folderId);
5796
+ }
5797
+ changed = true;
5798
+ }
5799
+ for (const [folderId, record] of [...this.#sessionFolders]) {
5800
+ const targets = remap.targets(record.workspaceId);
5801
+ if (targets.length === 0)
5802
+ continue;
5803
+ const owners = /* @__PURE__ */ new Map();
5804
+ const votes = /* @__PURE__ */ new Map();
5805
+ for (const [sessionId, assigned] of this.#sessionAssignments) {
5806
+ if (assigned !== folderId)
5807
+ continue;
5808
+ const owner = await remap.owner(record.workspaceId, sessionId);
5809
+ if (!owner)
5810
+ continue;
5811
+ owners.set(sessionId, owner);
5812
+ votes.set(owner, (votes.get(owner) ?? 0) + 1);
5813
+ }
5814
+ let winner = targets[0];
5815
+ for (const [owner, count2] of votes) {
5816
+ if (count2 > (votes.get(winner) ?? 0))
5817
+ winner = owner;
5818
+ }
5819
+ for (const [sessionId, owner] of owners) {
5820
+ if (owner !== winner)
5821
+ this.#sessionAssignments.delete(sessionId);
5822
+ }
5823
+ this.#sessionFolders.set(folderId, { ...record, workspaceId: winner });
5824
+ changed = true;
5825
+ }
5826
+ if (changed)
5827
+ await this.#persist();
5828
+ return changed;
5829
+ }
5611
5830
  /** Все папки — для кадра `folder.list`. */
5612
5831
  list() {
5613
5832
  return {
@@ -7311,12 +7530,33 @@ var HostServer = class {
7311
7530
  void this.#sendAuthStatus();
7312
7531
  });
7313
7532
  }
7533
+ /**
7534
+ * Перенести всё, что записано под id проектов прежнего формата, на нынешние.
7535
+ *
7536
+ * До первого кадра клиенту: списки собираются по id, и запись под прежним
7537
+ * не нашлась бы — закрепления выглядели бы пропавшими, а подметание стёрло
7538
+ * бы их уже по-настоящему. Повторный запуск ничего не находит и не пишет.
7539
+ */
7540
+ async #carryOverWorkspaceIds() {
7541
+ const remap = workspaceIdRemap(this.#workspaces.paths(), async (dir) => {
7542
+ const id = workspaceIdFromPath(dir);
7543
+ const onDisk = await this.#workspaces.sessionsOnDisk(id);
7544
+ const antigravity = await this.#antigravity.list(id);
7545
+ return [...onDisk.map((s) => s.sessionId), ...antigravity.map((r) => r.id)];
7546
+ });
7547
+ await this.#antigravity.remapWorkspaceIds(remap);
7548
+ await this.#archive.remapWorkspaceIds(remap);
7549
+ await this.#pins.remapWorkspaceIds(remap);
7550
+ await this.#order.remapWorkspaceIds(remap);
7551
+ await this.#folders.remapWorkspaceIds(remap);
7552
+ }
7314
7553
  async start() {
7315
7554
  await this.#workspaces.load();
7316
7555
  await this.#archive.load();
7317
7556
  await this.#pins.load();
7318
7557
  await this.#order.load();
7319
7558
  await this.#folders.load();
7559
+ await this.#carryOverWorkspaceIds();
7320
7560
  await this.#settings.load();
7321
7561
  await this.#limitStop.load();
7322
7562
  await this.#github.load();
@@ -7523,6 +7763,7 @@ var HostServer = class {
7523
7763
  return;
7524
7764
  case "workspace.open":
7525
7765
  await this.#workspaces.open(frame.path);
7766
+ await this.#carryOverWorkspaceIds();
7526
7767
  this.#broadcastWorkspaces();
7527
7768
  await this.#closeFinder();
7528
7769
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@i14ks/ccv",
3
- "version": "0.17.0",
3
+ "version": "0.17.2",
4
4
  "license": "UNLICENSED",
5
5
  "description": "GUI для Claude Code: сессии агента в каталогах проектов, дерево файлов и редактор рядом с разговором.",
6
6
  "homepage": "https://claudevisual.com",
@@ -1 +1 @@
1
- import{s as r,H as a}from"./index-TIzoSl17.js";import{E as e}from"./index-891wE-Rj.js";import{t as o}from"./index-RifJd-I8.js";import"./index-BHot-lnj.js";const m=e.theme({"&":{height:"100%",color:"var(--text)",backgroundColor:"var(--bg)",fontSize:"13px"},".cm-scroller":{fontFamily:"var(--mono)",lineHeight:"1.6"},".cm-content":{caretColor:"var(--accent)"},".cm-cursor, .cm-dropCursor":{borderLeftColor:"var(--accent)"},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:"var(--cm-selection)"},".cm-gutters":{backgroundColor:"var(--bg)",color:"var(--muted)",borderRight:"1px solid var(--border-soft)"},".cm-activeLineGutter":{backgroundColor:"var(--surface-2)",color:"var(--text-2)"},".cm-activeLine":{backgroundColor:"var(--cm-active)"},".cm-selectionMatch":{backgroundColor:"var(--cm-match)"},"&.cm-focused .cm-matchingBracket":{backgroundColor:"var(--cm-match)",outline:"1px solid var(--accent-line)"},".cm-foldPlaceholder":{backgroundColor:"var(--surface-2)",border:"1px solid var(--border)",color:"var(--muted)"},".cm-panels":{backgroundColor:"var(--surface)",color:"var(--text)",border:"1px solid var(--border)"},".cm-panels input, .cm-panels button, .cm-panels select":{fontFamily:"var(--sans)",fontSize:"12px",background:"var(--surface-2)",color:"var(--text)",border:"1px solid var(--border)",borderRadius:"6px",padding:"3px 6px"},".cm-searchMatch":{backgroundColor:"var(--cm-match)"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"var(--accent-soft)"},".cm-tooltip":{background:"var(--surface)",border:"1px solid var(--border)",borderRadius:"8px",boxShadow:"var(--shadow-md)",color:"var(--text)"},".cm-tooltip-autocomplete ul li[aria-selected]":{background:"var(--surface-2)",color:"var(--text)"}}),i=r(a.define([{tag:[o.keyword,o.modifier,o.controlKeyword,o.moduleKeyword],color:"var(--cm-key)"},{tag:[o.name,o.deleted,o.character,o.macroName],color:"var(--text)"},{tag:[o.propertyName],color:"var(--cm-prop)"},{tag:[o.function(o.variableName),o.labelName],color:"var(--cm-fn)"},{tag:[o.color,o.constant(o.name),o.standard(o.name),o.bool],color:"var(--cm-const)"},{tag:[o.definition(o.name),o.separator],color:"var(--text)"},{tag:[o.typeName,o.className,o.changed,o.annotation,o.self,o.namespace],color:"var(--cm-type)"},{tag:[o.number,o.integer,o.float],color:"var(--cm-num)"},{tag:[o.string,o.special(o.string),o.regexp],color:"var(--cm-str)"},{tag:[o.operator,o.operatorKeyword,o.escape],color:"var(--cm-op)"},{tag:[o.meta,o.comment],color:"var(--cm-comment)",fontStyle:"italic"},{tag:o.strong,fontWeight:"650"},{tag:o.emphasis,fontStyle:"italic"},{tag:o.strikethrough,textDecoration:"line-through"},{tag:o.link,color:"var(--cm-str)",textDecoration:"underline"},{tag:o.heading,fontWeight:"650",color:"var(--cm-key)"},{tag:o.invalid,color:"var(--danger)"}]));export{i as editorHighlight,m as editorTheme};
1
+ import{s as r,H as a}from"./index-Cc7JijiI.js";import{E as e}from"./index-891wE-Rj.js";import{t as o}from"./index-C4wYlk_J.js";import"./index-BHot-lnj.js";const m=e.theme({"&":{height:"100%",color:"var(--text)",backgroundColor:"var(--bg)",fontSize:"13px"},".cm-scroller":{fontFamily:"var(--mono)",lineHeight:"1.6"},".cm-content":{caretColor:"var(--accent)"},".cm-cursor, .cm-dropCursor":{borderLeftColor:"var(--accent)"},"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:"var(--cm-selection)"},".cm-gutters":{backgroundColor:"var(--bg)",color:"var(--muted)",borderRight:"1px solid var(--border-soft)"},".cm-activeLineGutter":{backgroundColor:"var(--surface-2)",color:"var(--text-2)"},".cm-activeLine":{backgroundColor:"var(--cm-active)"},".cm-selectionMatch":{backgroundColor:"var(--cm-match)"},"&.cm-focused .cm-matchingBracket":{backgroundColor:"var(--cm-match)",outline:"1px solid var(--accent-line)"},".cm-foldPlaceholder":{backgroundColor:"var(--surface-2)",border:"1px solid var(--border)",color:"var(--muted)"},".cm-panels":{backgroundColor:"var(--surface)",color:"var(--text)",border:"1px solid var(--border)"},".cm-panels input, .cm-panels button, .cm-panels select":{fontFamily:"var(--sans)",fontSize:"12px",background:"var(--surface-2)",color:"var(--text)",border:"1px solid var(--border)",borderRadius:"6px",padding:"3px 6px"},".cm-searchMatch":{backgroundColor:"var(--cm-match)"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"var(--accent-soft)"},".cm-tooltip":{background:"var(--surface)",border:"1px solid var(--border)",borderRadius:"8px",boxShadow:"var(--shadow-md)",color:"var(--text)"},".cm-tooltip-autocomplete ul li[aria-selected]":{background:"var(--surface-2)",color:"var(--text)"}}),i=r(a.define([{tag:[o.keyword,o.modifier,o.controlKeyword,o.moduleKeyword],color:"var(--cm-key)"},{tag:[o.name,o.deleted,o.character,o.macroName],color:"var(--text)"},{tag:[o.propertyName],color:"var(--cm-prop)"},{tag:[o.function(o.variableName),o.labelName],color:"var(--cm-fn)"},{tag:[o.color,o.constant(o.name),o.standard(o.name),o.bool],color:"var(--cm-const)"},{tag:[o.definition(o.name),o.separator],color:"var(--text)"},{tag:[o.typeName,o.className,o.changed,o.annotation,o.self,o.namespace],color:"var(--cm-type)"},{tag:[o.number,o.integer,o.float],color:"var(--cm-num)"},{tag:[o.string,o.special(o.string),o.regexp],color:"var(--cm-str)"},{tag:[o.operator,o.operatorKeyword,o.escape],color:"var(--cm-op)"},{tag:[o.meta,o.comment],color:"var(--cm-comment)",fontStyle:"italic"},{tag:o.strong,fontWeight:"650"},{tag:o.emphasis,fontStyle:"italic"},{tag:o.strikethrough,textDecoration:"line-through"},{tag:o.link,color:"var(--cm-str)",textDecoration:"underline"},{tag:o.heading,fontWeight:"650",color:"var(--cm-key)"},{tag:o.invalid,color:"var(--danger)"}]));export{i as editorHighlight,m as editorTheme};