@abelfubu/dv 1.0.0 → 1.0.1

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 (42) hide show
  1. package/dist/components/diff-view.d.ts +1 -1
  2. package/dist/components/diff-view.d.ts.map +1 -1
  3. package/dist/components/diff-view.js +69 -8
  4. package/dist/components/diff-view.test.d.ts.map +1 -1
  5. package/dist/components/diff-view.test.js +54 -0
  6. package/dist/themes/aura.json +69 -0
  7. package/dist/themes/ayu.json +80 -0
  8. package/dist/themes/catppuccin-frappe.json +233 -0
  9. package/dist/themes/catppuccin-macchiato.json +233 -0
  10. package/dist/themes/catppuccin.json +112 -0
  11. package/dist/themes/cobalt2.json +228 -0
  12. package/dist/themes/cursor.json +249 -0
  13. package/dist/themes/dracula.json +219 -0
  14. package/dist/themes/everforest.json +241 -0
  15. package/dist/themes/flexoki.json +237 -0
  16. package/dist/themes/github-light.json +56 -0
  17. package/dist/themes/github.json +244 -244
  18. package/dist/themes/gruvbox.json +95 -0
  19. package/dist/themes/kanagawa.json +77 -0
  20. package/dist/themes/lucent-orng.json +227 -0
  21. package/dist/themes/material.json +235 -0
  22. package/dist/themes/matrix.json +77 -0
  23. package/dist/themes/mercury.json +252 -0
  24. package/dist/themes/monokai.json +221 -0
  25. package/dist/themes/muted-slate.json +56 -0
  26. package/dist/themes/nightowl.json +221 -0
  27. package/dist/themes/nord.json +223 -0
  28. package/dist/themes/one-dark.json +84 -0
  29. package/dist/themes/opencode-light.json +62 -0
  30. package/dist/themes/opencode.json +245 -0
  31. package/dist/themes/orng.json +245 -0
  32. package/dist/themes/palenight.json +222 -0
  33. package/dist/themes/rosepine.json +234 -0
  34. package/dist/themes/solarized.json +223 -0
  35. package/dist/themes/synthwave84.json +226 -0
  36. package/dist/themes/tokyonight.json +243 -0
  37. package/dist/themes/vercel.json +255 -0
  38. package/dist/themes/vesper.json +218 -0
  39. package/dist/themes/zenburn.json +223 -0
  40. package/dist/themes.d.ts.map +1 -1
  41. package/dist/themes.js +4 -4
  42. package/package.json +3 -2
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { DiffRenderable } from "@opentuah/core";
2
+ import { type DiffRenderable } from "@opentuah/core";
3
3
  export interface DiffViewRef {
4
4
  getDiffRenderable(): DiffRenderable | null;
5
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../src/components/diff-view.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAqB,MAAM,gBAAgB,CAAA;AAIlE,MAAM,WAAW,WAAW;IAC1B,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAAA;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACnC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+EAA+E;IAC/E,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4DAA4D;IAC5D,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACjD,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAwDD,eAAO,MAAM,QAAQ,mFA4InB,CAAA"}
1
+ {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../src/components/diff-view.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAqB,KAAK,cAAc,EAAmD,MAAM,gBAAgB,CAAA;AAIxH,MAAM,WAAW,WAAW;IAC1B,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAAA;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;IACnC,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,+EAA+E;IAC/E,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,4DAA4D;IAC5D,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IACjD,uFAAuF;IACvF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAuHD,eAAO,MAAM,QAAQ,mFAiKnB,CAAA"}
@@ -3,9 +3,55 @@ import { jsx as _jsx } from "@opentuah/react/jsx-runtime";
3
3
  // Wraps opentui's <diff> element with theme-aware colors and syntax styles.
4
4
  // Supports split and unified view modes with line numbers.
5
5
  import * as React from "react";
6
- import { DiffRenderable, RGBA, SyntaxStyle } from "@opentuah/core";
6
+ import { RGBA, SyntaxStyle } from "@opentuah/core";
7
7
  import { getSyntaxTheme, getResolvedTheme, rgbaToHex } from "../themes.js";
8
8
  import { balanceDelimiters } from "../balance-delimiters.js";
9
+ function getSideLineColorConfig(side, line) {
10
+ if (!side)
11
+ return null;
12
+ const { gutter, content } = side.getLineColors();
13
+ const g = gutter.get(line);
14
+ const c = content.get(line);
15
+ if (!g && !c)
16
+ return null;
17
+ const config = {};
18
+ if (g)
19
+ config.gutter = g;
20
+ if (c)
21
+ config.content = c;
22
+ return config;
23
+ }
24
+ function snapshotLineColors(diffRenderable, line) {
25
+ const { leftSide, rightSide } = diffRenderable;
26
+ return {
27
+ left: getSideLineColorConfig(leftSide, line),
28
+ right: getSideLineColorConfig(rightSide, line),
29
+ };
30
+ }
31
+ function isTransparent(color) {
32
+ if (!color)
33
+ return true;
34
+ if (typeof color === "string")
35
+ return color.toLowerCase() === "transparent" || color === "#00000000";
36
+ return color.a === 0;
37
+ }
38
+ function restoreSideLineColor(side, line, color) {
39
+ if (!side)
40
+ return;
41
+ const hasVisibleColor = color && ((color.gutter && !isTransparent(color.gutter)) ||
42
+ (color.content && !isTransparent(color.content)));
43
+ if (hasVisibleColor) {
44
+ side.setLineColor(line, color);
45
+ }
46
+ else {
47
+ side.clearLineColor(line);
48
+ }
49
+ }
50
+ function restoreLineColors(diffRenderable, line, base) {
51
+ const { leftSide, rightSide } = diffRenderable;
52
+ restoreSideLineColor(leftSide, line, base.left);
53
+ restoreSideLineColor(rightSide, line, base.right);
54
+ }
9
55
  function getLuminance(color) {
10
56
  return color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;
11
57
  }
@@ -83,36 +129,51 @@ export const DiffView = React.forwardRef(function DiffView({ diff, view, filetyp
83
129
  const activeSelectionColor = React.useMemo(() => {
84
130
  return selectionColor ?? "#264F78";
85
131
  }, [selectionColor]);
86
- // Track previously-applied highlights so we can clear only our own overrides.
87
132
  const prevCursorRef = React.useRef(null);
88
133
  const prevSelectionRef = React.useRef(null);
134
+ // Reset highlight tracking when the underlying diff surface is rebuilt so
135
+ // we do not try to clear lines on a stale renderable.
136
+ React.useEffect(() => {
137
+ prevCursorRef.current = null;
138
+ prevSelectionRef.current = null;
139
+ }, [diff, view, themeName]);
89
140
  // Apply cursor line and selection highlights to the underlying DiffRenderable.
90
141
  React.useEffect(() => {
91
142
  const diffRenderable = diffRef.current;
92
143
  if (!diffRenderable)
93
144
  return;
94
- // Clear previous cursor override.
145
+ // Restore previous cursor override.
95
146
  if (prevCursorRef.current) {
96
- diffRenderable.clearLineColor(prevCursorRef.current.line);
147
+ restoreLineColors(diffRenderable, prevCursorRef.current.line, prevCursorRef.current.base);
97
148
  }
98
- // Clear previous selection overrides.
149
+ // Restore previous selection overrides.
99
150
  if (prevSelectionRef.current) {
100
- diffRenderable.clearHighlightLines(prevSelectionRef.current.start, prevSelectionRef.current.end);
151
+ const { start, end, base } = prevSelectionRef.current;
152
+ for (let line = start; line <= end; line++) {
153
+ restoreLineColors(diffRenderable, line, base.get(line) ?? { left: null, right: null });
154
+ }
101
155
  }
102
156
  prevCursorRef.current = null;
103
157
  prevSelectionRef.current = null;
104
158
  if (!focused)
105
159
  return;
160
+ // Snapshot the cursor line's base color before applying any override.
161
+ const cursorBase = snapshotLineColors(diffRenderable, cursorLine);
162
+ // Snapshot and apply selection range.
106
163
  if (selection) {
107
164
  const start = Math.min(selection.start, selection.end);
108
165
  const end = Math.max(selection.start, selection.end);
109
166
  if (end >= start) {
167
+ const selectionBase = new Map();
168
+ for (let line = start; line <= end; line++) {
169
+ selectionBase.set(line, snapshotLineColors(diffRenderable, line));
170
+ }
110
171
  diffRenderable.highlightLines(start, end, activeSelectionColor);
111
- prevSelectionRef.current = { start, end, color: activeSelectionColor };
172
+ prevSelectionRef.current = { start, end, color: activeSelectionColor, base: selectionBase };
112
173
  }
113
174
  }
114
175
  diffRenderable.setLineColor(cursorLine, activeCursorColor);
115
- prevCursorRef.current = { line: cursorLine, color: activeCursorColor };
176
+ prevCursorRef.current = { line: cursorLine, base: cursorBase };
116
177
  }, [focused, cursorLine, selection, activeCursorColor, activeSelectionColor]);
117
178
  return (_jsx("box", { style: { backgroundColor: colors.bgPanel }, children: _jsx("diff", { ref: diffRef, diff: balancedDiff, view: view, fg: colors.text, treeSitterClient: undefined, filetype: filetype, syntaxStyle: syntaxStyle, showLineNumbers: true, wrapMode: wrapMode,
118
179
  // `addedBg`/`removedBg` are used by opentui as the base colors for word-level highlights.
@@ -1 +1 @@
1
- {"version":3,"file":"diff-view.test.d.ts","sourceRoot":"","sources":["../../src/components/diff-view.test.tsx"],"names":[],"mappings":"AASA,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAA;CAClD"}
1
+ {"version":3,"file":"diff-view.test.d.ts","sourceRoot":"","sources":["../../src/components/diff-view.test.tsx"],"names":[],"mappings":"AAUA,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAA;CAClD"}
@@ -2,6 +2,7 @@ import { jsx as _jsx } from "@opentuah/react/jsx-runtime";
2
2
  // Tests for DiffView theme reactivity when switching themes at runtime.
3
3
  import * as React from "react";
4
4
  import { afterEach, describe, expect, it } from "bun:test";
5
+ import { act } from "react";
5
6
  import { testRender } from "@opentuah/react/test-utils";
6
7
  import { getDataPaths } from "@opentuah/core";
7
8
  import { DiffView } from "./diff-view.js";
@@ -186,6 +187,19 @@ describe("DiffView", () => {
186
187
  }
187
188
  useAppStore.setState({ themeName: "github" });
188
189
  });
190
+ it("uses transparent background for context lines when transparentBackground is enabled", async () => {
191
+ testSetup = await setupTest(_jsx(DiffView, { diff: sampleDiff, view: "unified", filetype: "txt", themeName: "github", transparentBackground: true }), {
192
+ width: 80,
193
+ height: 8,
194
+ });
195
+ await testSetup.renderOnce();
196
+ const frame = testSetup.captureSpans();
197
+ const contextLine = getLineWithToken(frame, "keep");
198
+ const contextSpan = contextLine.spans.find((span) => span.text === "keep");
199
+ expect(contextSpan).toBeDefined();
200
+ const bg = Array.from(contextSpan.bg.buffer);
201
+ expect(bg[3]).toBeCloseTo(0, 4);
202
+ });
189
203
  it("updates diff background colors after theme switch", async () => {
190
204
  useAppStore.setState({ themeName: "github" });
191
205
  testSetup = await setupTest(_jsx(ThemeToggleHarness, {}), {
@@ -293,6 +307,46 @@ describe("DiffView", () => {
293
307
  expect.closeTo(86 / 255, 4),
294
308
  ]);
295
309
  });
310
+ it("restores the diff background color when the cursor moves past a line", async () => {
311
+ let setCursorLine = () => { };
312
+ function CursorMoveHarness() {
313
+ const [line, setLine] = React.useState(2);
314
+ setCursorLine = setLine;
315
+ return (_jsx(DiffView, { diff: sampleDiff, view: "unified", filetype: "txt", themeName: "github", focused: true, cursorLine: line, cursorColor: "#123456" }));
316
+ }
317
+ testSetup = await setupTest(_jsx(CursorMoveHarness, {}), {
318
+ width: 80,
319
+ height: 8,
320
+ });
321
+ await testSetup.renderOnce();
322
+ // Capture the original context background before the cursor moves over it.
323
+ const frameBefore = testSetup.captureSpans();
324
+ const contextLineBefore = getLineWithToken(frameBefore, "keep");
325
+ expect(contextLineBefore).toBeDefined();
326
+ const contextBg = Array.from(contextLineBefore.spans[0].bg.buffer).slice(0, 3);
327
+ // Move the cursor from the added line to the context line.
328
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true;
329
+ act(() => setCursorLine(3));
330
+ globalThis.IS_REACT_ACT_ENVIRONMENT = false;
331
+ await testSetup.renderOnce();
332
+ const frameAfter = testSetup.captureSpans();
333
+ const addedLine = getLineWithToken(frameAfter, "new");
334
+ const removedLine = getLineWithToken(frameAfter, "old");
335
+ expect(addedLine).toBeDefined();
336
+ expect(removedLine).toBeDefined();
337
+ const addedSpan = addedLine.spans.find((span) => span.text === "new");
338
+ const removedSpan = removedLine.spans.find((span) => span.text === "old");
339
+ expect(addedSpan).toBeDefined();
340
+ expect(removedSpan).toBeDefined();
341
+ const addedBg = Array.from(addedSpan.bg.buffer).slice(0, 3);
342
+ const removedBg = Array.from(removedSpan.bg.buffer).slice(0, 3);
343
+ // After moving the cursor, the added and removed lines should show their
344
+ // original diff backgrounds, not the default context background.
345
+ expect(addedBg).not.toEqual(contextBg);
346
+ expect(removedBg).not.toEqual(contextBg);
347
+ // They should also be different from each other (added vs removed).
348
+ expect(addedBg).not.toEqual(removedBg);
349
+ });
296
350
  it("does not highlight a cursor line when not focused", async () => {
297
351
  testSetup = await setupTest(_jsx(DiffView, { diff: sampleDiff, view: "unified", filetype: "txt", themeName: "github", focused: false, cursorLine: 2, cursorColor: "#123456" }), {
298
352
  width: 80,
@@ -0,0 +1,69 @@
1
+ {
2
+ "$schema": "https://opencode.ai/theme.json",
3
+ "defs": {
4
+ "darkBg": "#0f0f0f",
5
+ "darkBgPanel": "#15141b",
6
+ "darkBorder": "#2d2d2d",
7
+ "darkFgMuted": "#6d6d6d",
8
+ "darkFg": "#edecee",
9
+ "purple": "#a277ff",
10
+ "pink": "#f694ff",
11
+ "blue": "#82e2ff",
12
+ "red": "#ff6767",
13
+ "orange": "#ffca85",
14
+ "cyan": "#61ffca",
15
+ "green": "#9dff65"
16
+ },
17
+ "theme": {
18
+ "primary": "purple",
19
+ "secondary": "pink",
20
+ "accent": "purple",
21
+ "error": "red",
22
+ "warning": "orange",
23
+ "success": "cyan",
24
+ "info": "purple",
25
+ "text": "darkFg",
26
+ "textMuted": "darkFgMuted",
27
+ "background": "darkBg",
28
+ "backgroundPanel": "darkBgPanel",
29
+ "backgroundElement": "darkBgPanel",
30
+ "border": "darkBorder",
31
+ "borderActive": "darkFgMuted",
32
+ "borderSubtle": "darkBorder",
33
+ "diffAdded": "cyan",
34
+ "diffRemoved": "red",
35
+ "diffContext": "darkFgMuted",
36
+ "diffHunkHeader": "darkFgMuted",
37
+ "diffHighlightAdded": "cyan",
38
+ "diffHighlightRemoved": "red",
39
+ "diffAddedBg": "#354933",
40
+ "diffRemovedBg": "#3f191a",
41
+ "diffContextBg": "darkBgPanel",
42
+ "diffLineNumber": "darkBorder",
43
+ "diffAddedLineNumberBg": "#162620",
44
+ "diffRemovedLineNumberBg": "#26161a",
45
+ "markdownText": "darkFg",
46
+ "markdownHeading": "purple",
47
+ "markdownLink": "pink",
48
+ "markdownLinkText": "purple",
49
+ "markdownCode": "cyan",
50
+ "markdownBlockQuote": "darkFgMuted",
51
+ "markdownEmph": "orange",
52
+ "markdownStrong": "purple",
53
+ "markdownHorizontalRule": "darkFgMuted",
54
+ "markdownListItem": "purple",
55
+ "markdownListEnumeration": "purple",
56
+ "markdownImage": "pink",
57
+ "markdownImageText": "purple",
58
+ "markdownCodeBlock": "darkFg",
59
+ "syntaxComment": "darkFgMuted",
60
+ "syntaxKeyword": "pink",
61
+ "syntaxFunction": "purple",
62
+ "syntaxVariable": "purple",
63
+ "syntaxString": "cyan",
64
+ "syntaxNumber": "green",
65
+ "syntaxType": "purple",
66
+ "syntaxOperator": "pink",
67
+ "syntaxPunctuation": "darkFg"
68
+ }
69
+ }
@@ -0,0 +1,80 @@
1
+ {
2
+ "$schema": "https://opencode.ai/theme.json",
3
+ "defs": {
4
+ "darkBg": "#0B0E14",
5
+ "darkBgAlt": "#0D1017",
6
+ "darkLine": "#11151C",
7
+ "darkPanel": "#0F131A",
8
+ "darkFg": "#BFBDB6",
9
+ "darkFgMuted": "#565B66",
10
+ "darkGutter": "#6C7380",
11
+ "darkTag": "#39BAE6",
12
+ "darkFunc": "#FFB454",
13
+ "darkEntity": "#59C2FF",
14
+ "darkString": "#AAD94C",
15
+ "darkRegexp": "#95E6CB",
16
+ "darkMarkup": "#F07178",
17
+ "darkKeyword": "#FF8F40",
18
+ "darkSpecial": "#E6B673",
19
+ "darkComment": "#ACB6BF",
20
+ "darkConstant": "#D2A6FF",
21
+ "darkOperator": "#F29668",
22
+ "darkAdded": "#7FD962",
23
+ "darkRemoved": "#F26D78",
24
+ "darkAccent": "#E6B450",
25
+ "darkError": "#D95757",
26
+ "darkIndentActive": "#6C7380"
27
+ },
28
+ "theme": {
29
+ "primary": "darkEntity",
30
+ "secondary": "darkConstant",
31
+ "accent": "darkAccent",
32
+ "error": "darkError",
33
+ "warning": "darkSpecial",
34
+ "success": "darkAdded",
35
+ "info": "darkTag",
36
+ "text": "darkFg",
37
+ "textMuted": "darkFgMuted",
38
+ "background": "darkBg",
39
+ "backgroundPanel": "darkPanel",
40
+ "backgroundElement": "darkBgAlt",
41
+ "border": "darkGutter",
42
+ "borderActive": "darkIndentActive",
43
+ "borderSubtle": "darkLine",
44
+ "diffAdded": "darkAdded",
45
+ "diffRemoved": "darkRemoved",
46
+ "diffContext": "darkComment",
47
+ "diffHunkHeader": "darkComment",
48
+ "diffHighlightAdded": "darkString",
49
+ "diffHighlightRemoved": "darkMarkup",
50
+ "diffAddedBg": "#20303b",
51
+ "diffRemovedBg": "#37222c",
52
+ "diffContextBg": "darkPanel",
53
+ "diffLineNumber": "darkGutter",
54
+ "diffAddedLineNumberBg": "#1b2b34",
55
+ "diffRemovedLineNumberBg": "#2d1f26",
56
+ "markdownText": "darkFg",
57
+ "markdownHeading": "darkConstant",
58
+ "markdownLink": "darkEntity",
59
+ "markdownLinkText": "darkTag",
60
+ "markdownCode": "darkString",
61
+ "markdownBlockQuote": "darkSpecial",
62
+ "markdownEmph": "darkSpecial",
63
+ "markdownStrong": "darkFunc",
64
+ "markdownHorizontalRule": "darkFgMuted",
65
+ "markdownListItem": "darkEntity",
66
+ "markdownListEnumeration": "darkTag",
67
+ "markdownImage": "darkEntity",
68
+ "markdownImageText": "darkTag",
69
+ "markdownCodeBlock": "darkFg",
70
+ "syntaxComment": "darkComment",
71
+ "syntaxKeyword": "darkKeyword",
72
+ "syntaxFunction": "darkFunc",
73
+ "syntaxVariable": "darkEntity",
74
+ "syntaxString": "darkString",
75
+ "syntaxNumber": "darkConstant",
76
+ "syntaxType": "darkSpecial",
77
+ "syntaxOperator": "darkOperator",
78
+ "syntaxPunctuation": "darkFg"
79
+ }
80
+ }
@@ -0,0 +1,233 @@
1
+ {
2
+ "$schema": "https://opencode.ai/theme.json",
3
+ "defs": {
4
+ "frappeRosewater": "#f2d5cf",
5
+ "frappeFlamingo": "#eebebe",
6
+ "frappePink": "#f4b8e4",
7
+ "frappeMauve": "#ca9ee6",
8
+ "frappeRed": "#e78284",
9
+ "frappeMaroon": "#ea999c",
10
+ "frappePeach": "#ef9f76",
11
+ "frappeYellow": "#e5c890",
12
+ "frappeGreen": "#a6d189",
13
+ "frappeTeal": "#81c8be",
14
+ "frappeSky": "#99d1db",
15
+ "frappeSapphire": "#85c1dc",
16
+ "frappeBlue": "#8da4e2",
17
+ "frappeLavender": "#babbf1",
18
+ "frappeText": "#c6d0f5",
19
+ "frappeSubtext1": "#b5bfe2",
20
+ "frappeSubtext0": "#a5adce",
21
+ "frappeOverlay2": "#949cb8",
22
+ "frappeOverlay1": "#838ba7",
23
+ "frappeOverlay0": "#737994",
24
+ "frappeSurface2": "#626880",
25
+ "frappeSurface1": "#51576d",
26
+ "frappeSurface0": "#414559",
27
+ "frappeBase": "#303446",
28
+ "frappeMantle": "#292c3c",
29
+ "frappeCrust": "#232634"
30
+ },
31
+ "theme": {
32
+ "primary": {
33
+ "dark": "frappeBlue",
34
+ "light": "frappeBlue"
35
+ },
36
+ "secondary": {
37
+ "dark": "frappeMauve",
38
+ "light": "frappeMauve"
39
+ },
40
+ "accent": {
41
+ "dark": "frappePink",
42
+ "light": "frappePink"
43
+ },
44
+ "error": {
45
+ "dark": "frappeRed",
46
+ "light": "frappeRed"
47
+ },
48
+ "warning": {
49
+ "dark": "frappeYellow",
50
+ "light": "frappeYellow"
51
+ },
52
+ "success": {
53
+ "dark": "frappeGreen",
54
+ "light": "frappeGreen"
55
+ },
56
+ "info": {
57
+ "dark": "frappeTeal",
58
+ "light": "frappeTeal"
59
+ },
60
+ "text": {
61
+ "dark": "frappeText",
62
+ "light": "frappeText"
63
+ },
64
+ "textMuted": {
65
+ "dark": "frappeSubtext1",
66
+ "light": "frappeSubtext1"
67
+ },
68
+ "background": {
69
+ "dark": "frappeBase",
70
+ "light": "frappeBase"
71
+ },
72
+ "backgroundPanel": {
73
+ "dark": "frappeMantle",
74
+ "light": "frappeMantle"
75
+ },
76
+ "backgroundElement": {
77
+ "dark": "frappeCrust",
78
+ "light": "frappeCrust"
79
+ },
80
+ "border": {
81
+ "dark": "frappeSurface0",
82
+ "light": "frappeSurface0"
83
+ },
84
+ "borderActive": {
85
+ "dark": "frappeSurface1",
86
+ "light": "frappeSurface1"
87
+ },
88
+ "borderSubtle": {
89
+ "dark": "frappeSurface2",
90
+ "light": "frappeSurface2"
91
+ },
92
+ "diffAdded": {
93
+ "dark": "frappeGreen",
94
+ "light": "frappeGreen"
95
+ },
96
+ "diffRemoved": {
97
+ "dark": "frappeRed",
98
+ "light": "frappeRed"
99
+ },
100
+ "diffContext": {
101
+ "dark": "frappeOverlay2",
102
+ "light": "frappeOverlay2"
103
+ },
104
+ "diffHunkHeader": {
105
+ "dark": "frappePeach",
106
+ "light": "frappePeach"
107
+ },
108
+ "diffHighlightAdded": {
109
+ "dark": "frappeGreen",
110
+ "light": "frappeGreen"
111
+ },
112
+ "diffHighlightRemoved": {
113
+ "dark": "frappeRed",
114
+ "light": "frappeRed"
115
+ },
116
+ "diffAddedBg": {
117
+ "dark": "#29342b",
118
+ "light": "#29342b"
119
+ },
120
+ "diffRemovedBg": {
121
+ "dark": "#3a2a31",
122
+ "light": "#3a2a31"
123
+ },
124
+ "diffContextBg": {
125
+ "dark": "frappeMantle",
126
+ "light": "frappeMantle"
127
+ },
128
+ "diffLineNumber": {
129
+ "dark": "frappeSurface1",
130
+ "light": "frappeSurface1"
131
+ },
132
+ "diffAddedLineNumberBg": {
133
+ "dark": "#223025",
134
+ "light": "#223025"
135
+ },
136
+ "diffRemovedLineNumberBg": {
137
+ "dark": "#2f242b",
138
+ "light": "#2f242b"
139
+ },
140
+ "markdownText": {
141
+ "dark": "frappeText",
142
+ "light": "frappeText"
143
+ },
144
+ "markdownHeading": {
145
+ "dark": "frappeMauve",
146
+ "light": "frappeMauve"
147
+ },
148
+ "markdownLink": {
149
+ "dark": "frappeBlue",
150
+ "light": "frappeBlue"
151
+ },
152
+ "markdownLinkText": {
153
+ "dark": "frappeSky",
154
+ "light": "frappeSky"
155
+ },
156
+ "markdownCode": {
157
+ "dark": "frappeGreen",
158
+ "light": "frappeGreen"
159
+ },
160
+ "markdownBlockQuote": {
161
+ "dark": "frappeYellow",
162
+ "light": "frappeYellow"
163
+ },
164
+ "markdownEmph": {
165
+ "dark": "frappeYellow",
166
+ "light": "frappeYellow"
167
+ },
168
+ "markdownStrong": {
169
+ "dark": "frappePeach",
170
+ "light": "frappePeach"
171
+ },
172
+ "markdownHorizontalRule": {
173
+ "dark": "frappeSubtext0",
174
+ "light": "frappeSubtext0"
175
+ },
176
+ "markdownListItem": {
177
+ "dark": "frappeBlue",
178
+ "light": "frappeBlue"
179
+ },
180
+ "markdownListEnumeration": {
181
+ "dark": "frappeSky",
182
+ "light": "frappeSky"
183
+ },
184
+ "markdownImage": {
185
+ "dark": "frappeBlue",
186
+ "light": "frappeBlue"
187
+ },
188
+ "markdownImageText": {
189
+ "dark": "frappeSky",
190
+ "light": "frappeSky"
191
+ },
192
+ "markdownCodeBlock": {
193
+ "dark": "frappeText",
194
+ "light": "frappeText"
195
+ },
196
+ "syntaxComment": {
197
+ "dark": "frappeOverlay2",
198
+ "light": "frappeOverlay2"
199
+ },
200
+ "syntaxKeyword": {
201
+ "dark": "frappeMauve",
202
+ "light": "frappeMauve"
203
+ },
204
+ "syntaxFunction": {
205
+ "dark": "frappeBlue",
206
+ "light": "frappeBlue"
207
+ },
208
+ "syntaxVariable": {
209
+ "dark": "frappeRed",
210
+ "light": "frappeRed"
211
+ },
212
+ "syntaxString": {
213
+ "dark": "frappeGreen",
214
+ "light": "frappeGreen"
215
+ },
216
+ "syntaxNumber": {
217
+ "dark": "frappePeach",
218
+ "light": "frappePeach"
219
+ },
220
+ "syntaxType": {
221
+ "dark": "frappeYellow",
222
+ "light": "frappeYellow"
223
+ },
224
+ "syntaxOperator": {
225
+ "dark": "frappeSky",
226
+ "light": "frappeSky"
227
+ },
228
+ "syntaxPunctuation": {
229
+ "dark": "frappeText",
230
+ "light": "frappeText"
231
+ }
232
+ }
233
+ }