@fsegurai/codemirror-theme-gruvbox-light 6.2.5 → 6.3.0

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 (4) hide show
  1. package/README.md +40 -32
  2. package/dist/index.cjs +654 -368
  3. package/dist/index.js +654 -368
  4. package/package.json +12 -3
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var view = require('@codemirror/view');
4
3
  var language = require('@codemirror/language');
4
+ var view = require('@codemirror/view');
5
5
  var highlight = require('@lezer/highlight');
6
6
 
7
7
  // Helper module for styling options
@@ -10,9 +10,6 @@ const generalContent = {
10
10
  fontFamily: 'JetBrains Mono, Consolas, monospace',
11
11
  lineHeight: '1.6',
12
12
  };
13
- const generalCursor = {
14
- borderLeftWidth: '2px',
15
- };
16
13
  const generalDiff = {
17
14
  insertedTextDecoration: 'none',
18
15
  deletedTextDecoration: 'line-through',
@@ -22,11 +19,9 @@ const generalGutter = {
22
19
  border: 'none',
23
20
  paddingRight: '8px',
24
21
  fontSize: '0.9em',
25
- fontWeight: '500',
26
22
  lineHeight: '1.78', // Adjusted to compensate for 0.9em fontSize (1.6 / 0.9 ≈ 1.78)
27
23
  };
28
24
  const generalPanel = {
29
- border: 'none',
30
25
  borderRadius: '4px',
31
26
  padding: '2px 10px',
32
27
  };
@@ -106,6 +101,498 @@ function applyMergeRevertStyles(styles) {
106
101
  document.head.appendChild(styleEl);
107
102
  }
108
103
 
104
+ // Shared theme core: every theme package describes a palette (`ThemeDefinition`) and this module turns it into the
105
+ // CodeMirror extension. Generated into each package by `bun run generate:helpers`; edit only the copy in
106
+ // `packages/.helper/utils/`.
107
+ /** Parent of every fine role: an omitted fine role resolves to its parent. */
108
+ const ROLE_PARENTS = {
109
+ controlKeyword: 'keyword',
110
+ moduleKeyword: 'keyword',
111
+ definitionKeyword: 'keyword',
112
+ operatorKeyword: 'operator',
113
+ modifier: 'keyword',
114
+ arithmeticOperator: 'operator',
115
+ logicOperator: 'operator',
116
+ compareOperator: 'operator',
117
+ bitwiseOperator: 'operator',
118
+ updateOperator: 'operator',
119
+ derefOperator: 'operator',
120
+ definitionOperator: 'operator',
121
+ typeOperator: 'operator',
122
+ controlOperator: 'operator',
123
+ separator: 'punctuation',
124
+ bracket: 'punctuation',
125
+ paren: 'bracket',
126
+ brace: 'bracket',
127
+ squareBracket: 'bracket',
128
+ angleBracket: 'bracket',
129
+ character: 'name',
130
+ macroName: 'name',
131
+ variable: 'name',
132
+ localVariable: 'variable',
133
+ variableDefinition: 'variable',
134
+ nameDefinition: 'variableDefinition',
135
+ functionDefinition: 'function',
136
+ self: 'variable',
137
+ label: 'name',
138
+ propertyDefinition: 'property',
139
+ method: 'property',
140
+ methodDefinition: 'method',
141
+ specialProperty: 'property',
142
+ typeDefinition: 'type',
143
+ className: 'type',
144
+ namespace: 'type',
145
+ standardTag: 'tag',
146
+ annotation: 'meta',
147
+ documentMeta: 'meta',
148
+ processingInstruction: 'meta',
149
+ attributeValue: 'string',
150
+ literal: 'string',
151
+ docString: 'string',
152
+ regexp: 'string',
153
+ specialString: 'regexp',
154
+ escape: 'string',
155
+ unit: 'number',
156
+ atom: 'constant',
157
+ bool: 'atom',
158
+ null: 'constant',
159
+ constantName: 'constant',
160
+ standardName: 'constant',
161
+ color: 'standardName',
162
+ specialVariable: 'constant',
163
+ docComment: 'comment',
164
+ headingLevel: 'heading',
165
+ heading1: 'headingLevel',
166
+ heading2: 'headingLevel',
167
+ heading3: 'headingLevel',
168
+ heading4: 'headingLevel',
169
+ heading5: 'headingLevel',
170
+ heading6: 'headingLevel',
171
+ list: 'name',
172
+ quote: 'string',
173
+ monospace: 'string',
174
+ contentSeparator: 'punctuation',
175
+ };
176
+ /**
177
+ * Canonical tag → role table shared by every theme: every Lezer base tag and the modifier combinations that the
178
+ * official grammars emit. Each tag appears once, so no rule is shadowed by a later one.
179
+ */
180
+ const SYNTAX_TAGS = [
181
+ ['keyword', [highlight.tags.keyword]],
182
+ ['controlKeyword', [highlight.tags.controlKeyword]],
183
+ ['moduleKeyword', [highlight.tags.moduleKeyword]],
184
+ ['definitionKeyword', [highlight.tags.definitionKeyword]],
185
+ ['operatorKeyword', [highlight.tags.operatorKeyword]],
186
+ ['modifier', [highlight.tags.modifier]],
187
+ ['operator', [highlight.tags.operator]],
188
+ ['arithmeticOperator', [highlight.tags.arithmeticOperator]],
189
+ ['logicOperator', [highlight.tags.logicOperator]],
190
+ ['compareOperator', [highlight.tags.compareOperator]],
191
+ ['bitwiseOperator', [highlight.tags.bitwiseOperator]],
192
+ ['updateOperator', [highlight.tags.updateOperator]],
193
+ ['derefOperator', [highlight.tags.derefOperator]],
194
+ ['definitionOperator', [highlight.tags.definitionOperator]],
195
+ ['typeOperator', [highlight.tags.typeOperator]],
196
+ ['controlOperator', [highlight.tags.controlOperator]],
197
+ ['punctuation', [highlight.tags.punctuation, highlight.tags.function(highlight.tags.punctuation)]],
198
+ ['separator', [highlight.tags.separator]],
199
+ ['bracket', [highlight.tags.bracket]],
200
+ ['paren', [highlight.tags.paren]],
201
+ ['brace', [highlight.tags.brace, highlight.tags.special(highlight.tags.brace)]],
202
+ ['squareBracket', [highlight.tags.squareBracket]],
203
+ ['angleBracket', [highlight.tags.angleBracket]],
204
+ ['name', [highlight.tags.name, highlight.tags.special(highlight.tags.name)]],
205
+ ['character', [highlight.tags.character]],
206
+ ['macroName', [highlight.tags.macroName]],
207
+ ['variable', [highlight.tags.variableName, highlight.tags.standard(highlight.tags.variableName)]],
208
+ ['localVariable', [highlight.tags.local(highlight.tags.variableName)]],
209
+ ['variableDefinition', [highlight.tags.definition(highlight.tags.variableName)]],
210
+ ['nameDefinition', [highlight.tags.definition(highlight.tags.name)]],
211
+ ['function', [highlight.tags.function(highlight.tags.variableName)]],
212
+ ['functionDefinition', [highlight.tags.definition(highlight.tags.function(highlight.tags.variableName))]],
213
+ ['self', [highlight.tags.self]],
214
+ ['label', [highlight.tags.labelName]],
215
+ ['property', [highlight.tags.propertyName]],
216
+ ['propertyDefinition', [highlight.tags.definition(highlight.tags.propertyName)]],
217
+ ['method', [highlight.tags.function(highlight.tags.propertyName)]],
218
+ ['methodDefinition', [highlight.tags.definition(highlight.tags.function(highlight.tags.propertyName))]],
219
+ ['specialProperty', [highlight.tags.special(highlight.tags.propertyName), highlight.tags.definition(highlight.tags.special(highlight.tags.propertyName))]],
220
+ ['type', [highlight.tags.typeName, highlight.tags.standard(highlight.tags.typeName)]],
221
+ ['typeDefinition', [highlight.tags.definition(highlight.tags.typeName)]],
222
+ ['className', [highlight.tags.className, highlight.tags.definition(highlight.tags.className), highlight.tags.constant(highlight.tags.className)]],
223
+ ['namespace', [highlight.tags.namespace]],
224
+ ['tag', [highlight.tags.tagName]],
225
+ ['standardTag', [highlight.tags.standard(highlight.tags.tagName)]],
226
+ ['attribute', [highlight.tags.attributeName, highlight.tags.special(highlight.tags.attributeName)]],
227
+ ['attributeValue', [highlight.tags.attributeValue]],
228
+ ['literal', [highlight.tags.literal]],
229
+ ['string', [highlight.tags.string]],
230
+ ['docString', [highlight.tags.docString]],
231
+ ['regexp', [highlight.tags.regexp]],
232
+ ['specialString', [highlight.tags.special(highlight.tags.string), highlight.tags.special(highlight.tags.docString)]],
233
+ ['escape', [highlight.tags.escape]],
234
+ ['number', [highlight.tags.number, highlight.tags.integer, highlight.tags.float]],
235
+ ['unit', [highlight.tags.unit]],
236
+ ['atom', [highlight.tags.atom]],
237
+ ['bool', [highlight.tags.bool]],
238
+ ['null', [highlight.tags.null]],
239
+ ['constantName', [highlight.tags.constant(highlight.tags.name)]],
240
+ ['standardName', [highlight.tags.standard(highlight.tags.name)]],
241
+ ['color', [highlight.tags.color]],
242
+ ['specialVariable', [highlight.tags.special(highlight.tags.variableName)]],
243
+ ['comment', [highlight.tags.comment, highlight.tags.lineComment, highlight.tags.blockComment]],
244
+ ['docComment', [highlight.tags.docComment]],
245
+ ['meta', [highlight.tags.meta]],
246
+ ['documentMeta', [highlight.tags.documentMeta]],
247
+ ['processingInstruction', [highlight.tags.processingInstruction]],
248
+ ['annotation', [highlight.tags.annotation]],
249
+ ['content', [highlight.tags.content, highlight.tags.special(highlight.tags.content)]],
250
+ ['heading', [highlight.tags.heading]],
251
+ ['heading1', [highlight.tags.heading1]],
252
+ ['heading2', [highlight.tags.heading2]],
253
+ ['heading3', [highlight.tags.heading3]],
254
+ ['heading4', [highlight.tags.heading4]],
255
+ ['heading5', [highlight.tags.heading5]],
256
+ ['heading6', [highlight.tags.heading6]],
257
+ ['list', [highlight.tags.list]],
258
+ ['quote', [highlight.tags.quote]],
259
+ ['monospace', [highlight.tags.monospace]],
260
+ ['contentSeparator', [highlight.tags.contentSeparator]],
261
+ ['link', [highlight.tags.link]],
262
+ ['url', [highlight.tags.url]],
263
+ ['emphasis', [highlight.tags.emphasis]],
264
+ ['strong', [highlight.tags.strong]],
265
+ ['strikethrough', [highlight.tags.strikethrough]],
266
+ ['invalid', [highlight.tags.invalid]],
267
+ ['inserted', [highlight.tags.inserted]],
268
+ ['deleted', [highlight.tags.deleted]],
269
+ ['changed', [highlight.tags.changed]],
270
+ ];
271
+ /** Inline SVG image (same encoding as `@codemirror/lint`), used to draw lint markers in the theme colors. */
272
+ function svg(content, attrs = 'viewBox="0 0 40 40"') {
273
+ return `url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" ${attrs}>${encodeURIComponent(content)}</svg>')`;
274
+ }
275
+ /** Wavy underline of a lint range. */
276
+ function lintUnderline(color) {
277
+ return svg(`<path d="m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0" stroke="${color}" fill="none" stroke-width=".7"/>`, 'width="6" height="3"');
278
+ }
279
+ /**
280
+ * Canonical UI template: the same selectors for every theme, only palette values differ. Rules of equal specificity
281
+ * keep the order of the original theme files (later rules win).
282
+ */
283
+ function uiTemplate(ui) {
284
+ return {
285
+ '&': {
286
+ color: ui.foreground,
287
+ backgroundColor: ui.background,
288
+ border: ui.border,
289
+ fontSize: generalContent.fontSize,
290
+ fontFamily: generalContent.fontFamily,
291
+ },
292
+ '.cm-content': { caretColor: ui.cursor, lineHeight: generalContent.lineHeight },
293
+ '.cm-cursor, .cm-dropCursor': {
294
+ borderLeftColor: ui.cursor,
295
+ borderLeftWidth: ui.cursorWidth,
296
+ boxShadow: ui.cursorShadow,
297
+ },
298
+ '.cm-cursor-secondary': { borderLeftColor: ui.cursor, opacity: '0.6' },
299
+ '.cm-fat-cursor': {
300
+ backgroundColor: ui.fatCursor.background,
301
+ color: ui.background,
302
+ border: ui.fatCursor.border,
303
+ boxShadow: ui.cursorShadow,
304
+ },
305
+ '&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': { backgroundColor: ui.selection, color: ui.selectionForeground, outline: ui.selectionOutline },
306
+ '&:not(.cm-focused) .cm-selectionBackground': { backgroundColor: ui.selectionInactive },
307
+ '.cm-selectionLayer': { zIndex: 100 },
308
+ '.cm-searchMatch': {
309
+ backgroundColor: ui.searchMatch.background,
310
+ outline: `${ui.outlineWidth} solid ${ui.searchMatch.outline}`,
311
+ color: ui.searchMatch.foreground,
312
+ borderRadius: generalSearchField.borderRadius,
313
+ boxShadow: ui.searchMatch.shadow,
314
+ },
315
+ '.cm-searchMatch span': { color: ui.searchMatch.foreground },
316
+ '.cm-searchMatch.cm-searchMatch-selected': {
317
+ backgroundColor: ui.searchMatch.selectedBackground,
318
+ color: ui.searchMatch.selectedForeground,
319
+ padding: generalSearchField.padding,
320
+ outline: ui.searchMatch.selectedOutline,
321
+ boxShadow: ui.searchMatch.selectedShadow,
322
+ },
323
+ '.cm-searchMatch.cm-searchMatch-selected span': { color: ui.searchMatch.selectedForeground },
324
+ '.cm-search.cm-panel.cm-textfield': {
325
+ color: ui.panel.foreground,
326
+ borderRadius: generalSearchField.borderRadius,
327
+ padding: generalSearchField.padding,
328
+ },
329
+ '.cm-textfield': {
330
+ backgroundColor: ui.panel.inputBackground,
331
+ color: ui.panel.foreground,
332
+ border: ui.panel.inputBorder,
333
+ borderRadius: generalSearchField.borderRadius,
334
+ padding: generalSearchField.padding,
335
+ },
336
+ '.cm-panels': {
337
+ backgroundColor: ui.panel.background,
338
+ color: ui.panel.foreground,
339
+ border: ui.panel.outline,
340
+ borderRadius: generalPanel.borderRadius,
341
+ boxShadow: ui.panel.shadow,
342
+ },
343
+ '.cm-panels.cm-panels-top': { borderBottom: `${ui.panel.borderWidth} solid ${ui.panel.border}` },
344
+ '.cm-panels.cm-panels-bottom': { borderTop: `${ui.panel.borderWidth} solid ${ui.panel.border}` },
345
+ '.cm-panel.cm-gotoLine': { color: ui.panel.foreground, padding: generalPanel.padding },
346
+ '.cm-panel button, .cm-button': {
347
+ backgroundColor: ui.panel.buttonBackground,
348
+ backgroundImage: 'none',
349
+ color: ui.panel.buttonForeground,
350
+ border: ui.panel.buttonBorder,
351
+ borderRadius: generalPanel.borderRadius,
352
+ padding: generalPanel.padding,
353
+ },
354
+ '.cm-panel button:hover, .cm-button:hover': {
355
+ backgroundColor: ui.panel.buttonHoverBackground,
356
+ color: ui.panel.buttonHoverForeground,
357
+ border: ui.panel.buttonHoverBorder,
358
+ boxShadow: ui.panel.buttonHoverShadow,
359
+ },
360
+ '.cm-activeLine': {
361
+ backgroundColor: ui.activeLine,
362
+ borderLeft: ui.activeLineBorder.left,
363
+ borderRight: ui.activeLineBorder.right,
364
+ borderRadius: generalLine.borderRadius,
365
+ zIndex: 1,
366
+ },
367
+ '.cm-gutters': {
368
+ backgroundColor: ui.gutter.background,
369
+ color: ui.gutter.foreground,
370
+ border: generalGutter.border,
371
+ borderRight: `${ui.outlineWidth} solid ${ui.gutter.border}`,
372
+ paddingRight: generalGutter.paddingRight,
373
+ },
374
+ '.cm-activeLineGutter': {
375
+ backgroundColor: ui.gutter.activeBackground,
376
+ color: ui.gutter.activeForeground,
377
+ fontWeight: ui.gutter.activeFontWeight,
378
+ border: ui.gutter.activeBorder,
379
+ },
380
+ '.cm-lineNumbers': { fontSize: generalGutter.fontSize, lineHeight: generalGutter.lineHeight },
381
+ '.cm-foldGutter': { fontSize: generalGutter.fontSize, lineHeight: generalGutter.lineHeight },
382
+ '.cm-foldGutter .cm-gutterElement': { color: ui.gutter.foreground, cursor: 'pointer' },
383
+ '.cm-foldGutter .cm-gutterElement:hover': { color: ui.gutter.foldHover },
384
+ '.cm-gutter-lint': { color: ui.gutter.foreground },
385
+ '.cm-lint-marker': { width: '1em', height: '1em' },
386
+ '.cm-lint-marker-error': {
387
+ content: svg(`<circle cx="20" cy="20" r="15" fill="${ui.diagnostic.error}" stroke="${ui.background}" stroke-width="4"/>`),
388
+ },
389
+ '.cm-lint-marker-warning': {
390
+ content: svg(`<path fill="${ui.diagnostic.warning}" stroke="${ui.background}" stroke-width="4" stroke-linejoin="round" d="M20 6L37 35L3 35Z"/>`),
391
+ },
392
+ '.cm-lint-marker-info': {
393
+ content: svg(`<path fill="${ui.diagnostic.info}" stroke="${ui.background}" stroke-width="4" stroke-linejoin="round" d="M5 5L35 5L35 35L5 35Z"/>`),
394
+ },
395
+ '.cm-changeGutter': { backgroundColor: ui.gutter.background },
396
+ '.cm-merge-b .cm-changedLineGutter, .cm-inlineChangedLineGutter': { background: ui.diff.insertedForeground },
397
+ '.cm-merge-a .cm-changedLineGutter, .cm-deletedLineGutter': { background: ui.diff.deletedForeground },
398
+ '.cm-insertedLine': {
399
+ textDecoration: generalDiff.insertedTextDecoration,
400
+ backgroundColor: ui.diff.insertedBackground,
401
+ color: ui.diff.insertedForeground,
402
+ padding: generalDiff.insertedLinePadding,
403
+ borderRadius: generalDiff.borderRadius,
404
+ },
405
+ 'ins.cm-insertedLine, ins.cm-insertedLine:not(:has(.cm-changedText))': {
406
+ textDecoration: generalDiff.insertedTextDecoration,
407
+ backgroundColor: `${ui.diff.insertedBackground} !important`,
408
+ color: ui.diff.insertedForeground,
409
+ padding: generalDiff.insertedLinePadding,
410
+ borderRadius: generalDiff.borderRadius,
411
+ border: ui.diff.insertedBorder,
412
+ },
413
+ 'ins.cm-insertedLine .cm-changedText': { background: 'transparent !important' },
414
+ '.cm-deletedLine': {
415
+ textDecoration: generalDiff.deletedTextDecoration,
416
+ backgroundColor: ui.diff.deletedBackground,
417
+ color: ui.diff.deletedForeground,
418
+ padding: generalDiff.insertedLinePadding,
419
+ borderRadius: generalDiff.borderRadius,
420
+ },
421
+ // Merge view deletions only: `del` decorations, inline deletion widgets and the lines of deleted chunks. `:where()`
422
+ // keeps the specificity of the former bare `del` selector without styling other `del` elements.
423
+ 'del.cm-deletedLine, del.cm-deletedText, :where(.cm-deletedChunk) del, :where(.cm-deletedChunk) del:not(:has(.cm-deletedText))': {
424
+ textDecoration: generalDiff.deletedTextDecoration,
425
+ backgroundColor: `${ui.diff.deletedBackground} !important`,
426
+ color: ui.diff.deletedForeground,
427
+ padding: generalDiff.insertedLinePadding,
428
+ borderRadius: generalDiff.borderRadius,
429
+ border: ui.diff.deletedBorder,
430
+ },
431
+ ':where(.cm-deletedChunk) del .cm-deletedText, :where(.cm-deletedChunk) del .cm-changedText, del:where(.cm-deletedLine) .cm-deletedText, del:where(.cm-deletedLine) .cm-changedText': { background: 'transparent !important' },
432
+ '.cm-merge-b .cm-changedLine, .cm-inlineChangedLine': { backgroundColor: ui.diff.insertedBackground },
433
+ '.cm-merge-a .cm-changedLine, .cm-deletedChunk': { backgroundColor: ui.diff.deletedBackground },
434
+ '.cm-collapsedLines': {
435
+ background: ui.foldPlaceholder.background,
436
+ color: ui.foldPlaceholder.foreground,
437
+ },
438
+ '.cm-mergeSpacer': { background: ui.merge.backgroundColor },
439
+ '.cm-tooltip': {
440
+ backgroundColor: ui.tooltip.background,
441
+ color: ui.tooltip.foreground,
442
+ border: `${ui.outlineWidth} solid ${ui.tooltip.border}`,
443
+ borderRadius: generalTooltip.borderRadius,
444
+ padding: generalTooltip.padding,
445
+ boxShadow: ui.tooltip.shadow,
446
+ },
447
+ '.cm-tooltip-autocomplete > ul': { backgroundColor: ui.tooltip.listBackground, border: ui.tooltip.listBorder },
448
+ '.cm-tooltip-autocomplete > ul > li': { padding: generalTooltip.padding, lineHeight: generalTooltip.lineHeight },
449
+ '.cm-tooltip-autocomplete > ul > li:hover': { backgroundColor: ui.tooltip.hoverBackground },
450
+ '.cm-tooltip-autocomplete > ul > li[aria-selected]': {
451
+ backgroundColor: ui.tooltip.selectedBackground,
452
+ color: ui.tooltip.selectedForeground,
453
+ border: ui.tooltip.selectedBorder,
454
+ borderRadius: generalTooltip.borderRadiusSelected,
455
+ },
456
+ '.cm-tooltip-autocomplete > ul > li > span.cm-completionIcon': {
457
+ color: ui.tooltip.icon,
458
+ paddingRight: generalTooltip.paddingRight,
459
+ },
460
+ '.cm-tooltip-autocomplete > ul > li > span.cm-completionDetail': { color: ui.tooltip.detail, fontStyle: 'italic' },
461
+ '.cm-completionMatchedText': {
462
+ color: 'inherit',
463
+ fontWeight: 'bold',
464
+ textDecoration: 'underline',
465
+ textDecorationColor: ui.matchingBracket.outline,
466
+ },
467
+ '.cm-completionInfo': {
468
+ backgroundColor: ui.tooltip.background,
469
+ color: ui.tooltip.foreground,
470
+ border: `${ui.outlineWidth} solid ${ui.tooltip.border}`,
471
+ padding: generalTooltip.padding,
472
+ },
473
+ '.cm-tooltip .cm-tooltip-arrow:before': { borderTopColor: 'transparent', borderBottomColor: 'transparent' },
474
+ '.cm-tooltip .cm-tooltip-arrow:after': {
475
+ borderTopColor: ui.tooltip.background,
476
+ borderBottomColor: ui.tooltip.background,
477
+ },
478
+ '.cm-tooltip-lint': { color: ui.tooltip.foreground, padding: '0' },
479
+ '.cm-tooltip-section:not(:first-child)': { borderTop: `1px solid ${ui.tooltip.border}` },
480
+ '.cm-diagnostic-error': {
481
+ borderLeft: `${ui.diagnostic.borderWidth} solid ${ui.diagnostic.error}`,
482
+ backgroundColor: ui.diagnostic.errorBackground,
483
+ },
484
+ '.cm-diagnostic-warning': {
485
+ borderLeft: `${ui.diagnostic.borderWidth} solid ${ui.diagnostic.warning}`,
486
+ backgroundColor: ui.diagnostic.warningBackground,
487
+ },
488
+ '.cm-diagnostic-info': {
489
+ borderLeft: `${ui.diagnostic.borderWidth} solid ${ui.diagnostic.info}`,
490
+ backgroundColor: ui.diagnostic.infoBackground,
491
+ },
492
+ '.cm-diagnostic-hint': { borderLeft: `${ui.diagnostic.borderWidth} solid ${ui.diagnostic.hint}` },
493
+ '.cm-diagnosticAction': {
494
+ backgroundColor: ui.panel.buttonBackground,
495
+ color: ui.panel.buttonForeground,
496
+ border: ui.panel.buttonBorder,
497
+ borderRadius: generalPanel.borderRadius,
498
+ },
499
+ '.cm-lintRange-error': { backgroundImage: lintUnderline(ui.diagnostic.error) },
500
+ '.cm-lintRange-warning': { backgroundImage: lintUnderline(ui.diagnostic.warning) },
501
+ '.cm-lintRange-info': { backgroundImage: lintUnderline(ui.diagnostic.info) },
502
+ '.cm-lintRange-hint': { backgroundImage: lintUnderline(ui.diagnostic.hint) },
503
+ '.cm-lintPoint-error': { borderBottom: `${ui.diagnostic.underlineWidth} wavy ${ui.diagnostic.error}` },
504
+ '.cm-lintPoint-warning': { borderBottom: `${ui.diagnostic.underlineWidth} wavy ${ui.diagnostic.warning}` },
505
+ '.cm-lintPoint-info': { borderBottom: `${ui.diagnostic.underlineWidth} wavy ${ui.diagnostic.info}` },
506
+ '.cm-matchingBracket': {
507
+ backgroundColor: ui.matchingBracket.background,
508
+ outline: `${ui.outlineWidth} solid ${ui.matchingBracket.outline}`,
509
+ borderRadius: generalMatching.borderRadius,
510
+ boxShadow: ui.matchingBracket.shadow,
511
+ },
512
+ '.cm-nonmatchingBracket': {
513
+ backgroundColor: ui.nonMatchingBracket.background,
514
+ outline: `${ui.outlineWidth} solid ${ui.nonMatchingBracket.outline}`,
515
+ borderRadius: generalMatching.borderRadius,
516
+ },
517
+ '.cm-selectionMatch': {
518
+ backgroundColor: ui.selectionMatch.background,
519
+ outline: `${ui.outlineWidth} solid ${ui.selectionMatch.outline}`,
520
+ borderRadius: generalMatching.borderRadius,
521
+ },
522
+ '.cm-snippetField': {
523
+ backgroundColor: ui.selectionMatch.background,
524
+ outline: `1px dashed ${ui.selectionMatch.outline}`,
525
+ borderRadius: generalMatching.borderRadius,
526
+ },
527
+ '.cm-snippetFieldPosition': { borderLeft: `1px dotted ${ui.cursor}` },
528
+ '.cm-foldPlaceholder': {
529
+ backgroundColor: ui.foldPlaceholder.background,
530
+ color: ui.foldPlaceholder.foreground,
531
+ border: `${ui.outlineWidth} ${ui.foldPlaceholder.borderStyle} ${ui.foldPlaceholder.border}`,
532
+ borderRadius: generalPlaceholder.borderRadius,
533
+ padding: generalPlaceholder.padding,
534
+ margin: generalPlaceholder.margin,
535
+ },
536
+ // Transparent outline: invisible normally, repainted with the system color in forced-colors mode (drops box-shadow).
537
+ '&.cm-focused': { outline: '2px solid transparent', boxShadow: ui.focusRing },
538
+ '& .cm-scroller::-webkit-scrollbar': { width: generalScroller.width, height: generalScroller.height },
539
+ '& .cm-scroller::-webkit-scrollbar-track': { background: ui.scrollbar.track, border: ui.scrollbar.trackBorder },
540
+ '& .cm-scroller::-webkit-scrollbar-thumb': {
541
+ backgroundColor: ui.scrollbar.thumb,
542
+ borderRadius: generalScroller.borderRadius,
543
+ border: ui.scrollbar.thumbBorder,
544
+ },
545
+ '& .cm-scroller::-webkit-scrollbar-thumb:hover': {
546
+ backgroundColor: ui.scrollbar.thumbHover,
547
+ boxShadow: ui.scrollbar.thumbHoverShadow,
548
+ },
549
+ '.cm-ghostText': { opacity: ui.ghostTextOpacity, color: ui.ghostText },
550
+ '.cm-placeholder': { color: ui.ghostText },
551
+ '.cm-specialChar': { color: ui.specialChar },
552
+ '.cm-trailingSpace': { backgroundColor: ui.diff.deletedBackground },
553
+ '.cm-highlightSpace': {
554
+ backgroundImage: `radial-gradient(circle at 50% 55%, ${ui.gutter.foreground} 20%, transparent 0)`,
555
+ },
556
+ '.cm-crosshair': { cursor: 'crosshair' },
557
+ };
558
+ }
559
+ /** Drops `null` declarations and selectors left without declarations. */
560
+ function emittedRules(spec) {
561
+ const result = {};
562
+ for (const [selector, declarations] of Object.entries(spec)) {
563
+ const emitted = Object.entries(declarations).filter((entry) => entry[1] !== null);
564
+ if (emitted.length > 0)
565
+ result[selector] = Object.fromEntries(emitted);
566
+ }
567
+ return result;
568
+ }
569
+ /** Style of a role, falling back through `ROLE_PARENTS` for omitted fine roles. */
570
+ function resolveRole(syntax, role) {
571
+ let current = role;
572
+ while (current) {
573
+ const style = syntax[current];
574
+ if (style)
575
+ return style;
576
+ current = ROLE_PARENTS[current];
577
+ }
578
+ return {};
579
+ }
580
+ /** Highlight rules of a theme: one rule per entry of the canonical table. */
581
+ function highlightRules(definition) {
582
+ return SYNTAX_TAGS.map(([role, tagList]) => (Object.assign({ tag: [...tagList] }, resolveRole(definition.syntax, role))));
583
+ }
584
+ /** Builds the editor theme, the syntax highlighting and the merge view styles of a theme definition. */
585
+ function defineTheme(definition) {
586
+ const theme = view.EditorView.theme(emittedRules(uiTemplate(definition.ui)), { dark: definition.dark });
587
+ const highlightStyle = language.HighlightStyle.define(highlightRules(definition));
588
+ return {
589
+ extension: [theme, language.syntaxHighlighting(highlightStyle)],
590
+ theme,
591
+ highlightStyle,
592
+ mergeStyles: Object.assign({}, definition.ui.merge),
593
+ };
594
+ }
595
+
109
596
  /**
110
597
  * Enhanced Gruvbox Light theme color definitions
111
598
  * --------------------------------------------
@@ -115,8 +602,8 @@ function applyMergeRevertStyles(styles) {
115
602
  const base00 = '#3c3836', // Main foreground (text)
116
603
  base01 = '#504945', // Secondary foreground
117
604
  base02 = '#665c54', // Tertiary foreground
118
- base03 = '#7c6f64', // Quaternary foreground
119
- base04 = '#928374', // Comments, invisibles, line highlighting
605
+ base03 = '#6b5e54', // Quaternary foreground
606
+ base04 = '#6a5c4e', // Comments, invisibles, line highlighting
120
607
  // Light/background shades
121
608
  base05 = '#fbf1c7', // Main background
122
609
  base06 = '#ebdbb2', // Secondary background
@@ -125,387 +612,186 @@ base08 = '#bdae93', // Quaternary background
125
612
  base09 = '#a89984', // Quinary background (not defined above)
126
613
  // Accent colors
127
614
  base0A = '#9d0006', // Keywords, storage, operator
128
- base0B = '#79740e', // Strings, tag attributes
129
- base0C = '#b57614', // Functions, tag names
615
+ base0B = '#65600d', // Strings, tag attributes
616
+ base0C = '#845408', // Functions, tag names
130
617
  base0D = '#076678', // Variables
131
618
  base0E = '#8f3f71', // Numbers, special constants
132
- base0F = '#427b58', // Types
133
- base10 = '#af3a03'; // Cursor, constants
619
+ base0F = '#306947', // Types
620
+ base10 = '#a63b0f'; // Cursor, constants
134
621
  // UI specific colors
135
- const invalid = base0A, darkBackground = base06, highlightBackground = '#ffc42e25', // Line highlight with transparency
136
- background = base05, tooltipBackground = base06, selection = darkBackground, selectionMatch = '#ffc42e40', // Selection match background
137
- cursor = base10, // Cursor color
138
- activeBracketBg = '#d5c4a180', // Active bracket background
139
- activeBracketBorder = base10, // Active bracket border
140
- diagnosticWarning = base0C, // Warning color
141
- linkColor = base0D, // Link color
142
- visitedLinkColor = base0E; // Visited link color
622
+ const highlightBackground = '#ffc42e25', // Line highlight with transparency
623
+ selectionMatch = '#ffc42e40', // Selection match background
624
+ activeBracketBg = '#d5c4a180'; // Active bracket background
143
625
  // Diff/merge specific colors
144
626
  const addedBackground = '#d8e5bc80', // Light base0B with transparency for insertions
145
- removedBackground = '#f7cfcf80', // Light base0A with transparency for deletions
146
- addedText = '#79740e', // Gruvbox base0B for added text
147
- removedText = '#9d0006'; // Gruvbox base0A for removed text
148
- /**
149
- * Enhanced editor theme styles for Gruvbox Light
150
- */
151
- const gruvboxLightTheme = view.EditorView.theme({
152
- // Base editor styles
153
- '&': {
154
- color: base00,
155
- backgroundColor: background,
156
- fontSize: generalContent.fontSize,
157
- fontFamily: generalContent.fontFamily,
158
- },
159
- // Content and cursor
160
- '.cm-content': {
161
- caretColor: cursor,
162
- lineHeight: generalContent.lineHeight,
163
- },
164
- '.cm-cursor, .cm-dropCursor': {
165
- borderLeftColor: cursor,
166
- borderLeftWidth: generalCursor.borderLeftWidth,
167
- },
168
- '.cm-fat-cursor': {
169
- backgroundColor: `${cursor}99`,
170
- color: base05,
171
- },
172
- // Selection
173
- '&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {
174
- backgroundColor: selection,
175
- color: base00,
176
- },
177
- // Make sure selection appears above active line
178
- '.cm-selectionLayer': {
179
- zIndex: 100,
180
- },
181
- // Search functionality
182
- '.cm-searchMatch': {
183
- backgroundColor: '#ffc42e80',
184
- outline: `1px solid ${base10}`,
185
- color: base00,
186
- borderRadius: generalSearchField.borderRadius,
187
- '& span': {
188
- color: base00,
627
+ removedBackground = '#f7cfcf80'; // Light base0A with transparency for deletions
628
+ const theme = defineTheme({
629
+ dark: false,
630
+ ui: {
631
+ background: base05,
632
+ foreground: base00,
633
+ border: 'none',
634
+ cursor: base10,
635
+ cursorWidth: '2px',
636
+ cursorShadow: 'none',
637
+ fatCursor: { background: `${base10}99`, border: 'none' },
638
+ selection: '#e7d7ae',
639
+ selectionInactive: '#e7d7ae',
640
+ selectionForeground: base00,
641
+ selectionOutline: 'none',
642
+ activeLine: highlightBackground,
643
+ activeLineBorder: { left: 'none', right: 'none' },
644
+ ghostText: base04,
645
+ ghostTextOpacity: '0.5',
646
+ specialChar: base0A,
647
+ focusRing: `0 0 0 2px ${base05}, 0 0 0 4px ${base10}`,
648
+ outlineWidth: '1px',
649
+ searchMatch: {
650
+ background: '#ffc42e80',
651
+ outline: base10,
652
+ foreground: base00,
653
+ shadow: 'none',
654
+ selectedBackground: base10,
655
+ selectedForeground: base05,
656
+ selectedOutline: `1px solid ${base10}`,
657
+ selectedShadow: 'none',
189
658
  },
190
- },
191
- '.cm-searchMatch.cm-searchMatch-selected': {
192
- backgroundColor: base10,
193
- color: base05,
194
- padding: generalSearchField.padding,
195
- '& span': {
196
- color: base05,
659
+ selectionMatch: { background: selectionMatch, outline: base08 },
660
+ matchingBracket: { background: activeBracketBg, outline: base10, shadow: 'none' },
661
+ nonMatchingBracket: { background: '#fb492740', outline: base0A },
662
+ panel: {
663
+ background: base06,
664
+ foreground: base01,
665
+ border: base08,
666
+ borderWidth: '1px',
667
+ outline: 'none',
668
+ shadow: 'none',
669
+ buttonBackground: base05,
670
+ buttonForeground: base00,
671
+ buttonBorder: 'none',
672
+ buttonHoverBackground: base07,
673
+ buttonHoverForeground: base00,
674
+ buttonHoverBorder: 'none',
675
+ buttonHoverShadow: 'none',
676
+ inputBackground: base05,
677
+ inputBorder: `1px solid ${base08}`,
197
678
  },
198
- },
199
- '.cm-search.cm-panel.cm-textfield': {
200
- color: base00,
201
- borderRadius: generalSearchField.borderRadius,
202
- padding: generalSearchField.padding,
203
- },
204
- // Panels
205
- '.cm-panels': {
206
- backgroundColor: base06,
207
- color: base01,
208
- borderRadius: '0 0 4px 4px',
209
- },
210
- '.cm-panels.cm-panels-top': {
211
- borderBottom: `1px solid ${base08}`,
212
- },
213
- '.cm-panels.cm-panels-bottom': {
214
- borderTop: `1px solid ${base08}`,
215
- },
216
- '.cm-panel button': {
217
- backgroundColor: base05,
218
- color: base00,
219
- border: generalPanel.border,
220
- borderRadius: generalPanel.borderRadius,
221
- padding: generalPanel.padding,
222
- },
223
- '.cm-panel button:hover': {
224
- backgroundColor: base07,
225
- },
226
- // Line highlighting
227
- '.cm-activeLine': {
228
- backgroundColor: highlightBackground,
229
- borderRadius: generalLine.borderRadius,
230
- zIndex: 1,
231
- },
232
- // Gutters
233
- '.cm-gutters': {
234
- backgroundColor: base06,
235
- color: base03,
236
- border: generalGutter.border,
237
- borderRight: `1px solid ${base08}`,
238
- paddingRight: generalGutter.paddingRight,
239
- },
240
- '.cm-activeLineGutter': {
241
- backgroundColor: base07,
242
- color: base00,
243
- fontWeight: generalGutter.fontWeight,
244
- },
245
- '.cm-lineNumbers': {
246
- fontSize: generalGutter.fontSize,
247
- lineHeight: generalGutter.lineHeight,
248
- },
249
- '.cm-foldGutter': {
250
- fontSize: generalGutter.fontSize,
251
- lineHeight: generalGutter.lineHeight,
252
- },
253
- '.cm-foldGutter .cm-gutterElement': {
254
- color: base03,
255
- cursor: 'pointer',
256
- },
257
- '.cm-foldGutter .cm-gutterElement:hover': {
258
- color: base00,
259
- },
260
- // Diff/Merge View Styles
261
- // Inserted/Added Content
262
- '.cm-insertedLine': {
263
- textDecoration: generalDiff.insertedTextDecoration,
264
- backgroundColor: addedBackground,
265
- color: addedText,
266
- padding: generalDiff.insertedLinePadding,
267
- borderRadius: generalDiff.borderRadius,
268
- },
269
- 'ins.cm-insertedLine, ins.cm-insertedLine:not(:has(.cm-changedText))': {
270
- textDecoration: generalDiff.insertedTextDecoration,
271
- backgroundColor: `${addedBackground} !important`,
272
- color: addedText,
273
- padding: generalDiff.insertedLinePadding,
274
- borderRadius: generalDiff.borderRadius,
275
- border: `1px solid ${addedText}40`,
276
- },
277
- 'ins.cm-insertedLine .cm-changedText': {
278
- background: 'transparent !important',
279
- },
280
- // Deleted/Removed Content
281
- '.cm-deletedLine': {
282
- textDecoration: generalDiff.deletedTextDecoration,
283
- backgroundColor: removedBackground,
284
- color: removedText,
285
- padding: generalDiff.insertedLinePadding,
286
- borderRadius: generalDiff.borderRadius,
287
- },
288
- 'del.cm-deletedLine, del, del:not(:has(.cm-deletedText))': {
289
- textDecoration: generalDiff.deletedTextDecoration,
290
- backgroundColor: `${removedBackground} !important`,
291
- color: removedText,
292
- padding: generalDiff.insertedLinePadding,
293
- borderRadius: generalDiff.borderRadius,
294
- border: `1px solid ${removedText}40`,
295
- },
296
- 'del .cm-deletedText, del .cm-changedText': {
297
- background: 'transparent !important',
298
- },
299
- // Tooltips and autocomplete
300
- '.cm-tooltip': {
301
- backgroundColor: tooltipBackground,
302
- border: `1px solid ${base08}`,
303
- borderRadius: generalTooltip.borderRadius,
304
- padding: generalTooltip.padding,
305
- boxShadow: '0 1px 5px rgba(0, 0, 0, 0.1)',
306
- },
307
- '.cm-tooltip-autocomplete': {
308
- '& > ul': {
309
- backgroundColor: tooltipBackground,
310
- border: 'none',
679
+ gutter: {
680
+ background: base06,
681
+ foreground: base03,
682
+ border: base08,
683
+ activeBackground: base07,
684
+ activeForeground: base00,
685
+ activeFontWeight: '500',
686
+ activeBorder: 'none',
687
+ foldHover: base00,
311
688
  },
312
- '& > ul > li': {
313
- padding: generalTooltip.padding,
314
- lineHeight: generalTooltip.lineHeight,
689
+ foldPlaceholder: { background: 'transparent', foreground: base02, border: base08, borderStyle: 'dotted' },
690
+ tooltip: {
691
+ background: base06,
692
+ foreground: base00,
693
+ border: base08,
694
+ shadow: '0 1px 5px rgba(0, 0, 0, 0.1)',
695
+ listBackground: base06,
696
+ listBorder: 'none',
697
+ hoverBackground: `${base10}15`,
698
+ selectedBackground: `${base10}30`,
699
+ selectedForeground: base00,
700
+ selectedBorder: 'none',
701
+ icon: base03,
702
+ detail: base03,
315
703
  },
316
- '& > ul > li[aria-selected]': {
317
- backgroundColor: base10 + '30',
318
- color: base00,
319
- borderRadius: generalTooltip.borderRadiusSelected,
704
+ diff: {
705
+ insertedBackground: addedBackground,
706
+ insertedForeground: base0B,
707
+ insertedBorder: `1px solid ${base0B}40`,
708
+ deletedBackground: removedBackground,
709
+ deletedForeground: base0A,
710
+ deletedBorder: `1px solid ${base0A}40`,
320
711
  },
321
- '& > ul > li:hover': {
322
- backgroundColor: base10 + '15',
712
+ diagnostic: {
713
+ error: base0A,
714
+ warning: base0C,
715
+ info: base0D,
716
+ hint: base0D,
717
+ errorBackground: 'transparent',
718
+ warningBackground: 'transparent',
719
+ infoBackground: 'transparent',
720
+ borderWidth: '3px',
721
+ underlineWidth: '2px',
323
722
  },
324
- '& > ul > li > span.cm-completionIcon': {
325
- color: base03,
326
- paddingRight: generalTooltip.paddingRight,
723
+ scrollbar: {
724
+ track: base05,
725
+ trackBorder: 'none',
726
+ thumb: base08,
727
+ thumbBorder: `3px solid ${base05}`,
728
+ thumbHover: base09,
729
+ thumbHoverShadow: 'none',
327
730
  },
328
- '& > ul > li > span.cm-completionDetail': {
329
- color: base03,
330
- fontStyle: 'italic',
731
+ merge: {
732
+ backgroundColor: base06,
733
+ borderColor: base08,
734
+ buttonColor: base00,
735
+ buttonHoverColor: base07,
331
736
  },
332
737
  },
333
- '.cm-tooltip .cm-tooltip-arrow:before': {
334
- borderTopColor: 'transparent',
335
- borderBottomColor: 'transparent',
336
- },
337
- '.cm-tooltip .cm-tooltip-arrow:after': {
338
- borderTopColor: tooltipBackground,
339
- borderBottomColor: tooltipBackground,
340
- },
341
- // Diagnostics styling
342
- '.cm-diagnostic': {
343
- '&-error': {
344
- borderLeft: `3px solid ${invalid}`,
345
- },
346
- '&-warning': {
347
- borderLeft: `3px solid ${diagnosticWarning}`,
738
+ syntax: {
739
+ keyword: { color: base0A, fontWeight: 'bold' },
740
+ definitionKeyword: { color: base0A },
741
+ modifier: { color: base0E, fontStyle: 'italic' },
742
+ functionDefinition: { color: base0D },
743
+ operator: { color: base00 },
744
+ punctuation: { color: base04 },
745
+ name: { color: base0D },
746
+ function: { color: base0C },
747
+ self: { color: base0E },
748
+ label: { color: base0C },
749
+ property: { color: base0F, fontStyle: 'normal' },
750
+ type: { color: base0F },
751
+ typeDefinition: { color: base0F, fontWeight: 'bold' },
752
+ className: { color: base0C, fontStyle: 'italic' },
753
+ namespace: { color: base0D, fontStyle: 'italic' },
754
+ tag: { color: base0A },
755
+ attribute: { color: base0C },
756
+ content: { color: base00 },
757
+ string: { color: base0B },
758
+ number: { color: base0E },
759
+ constant: { color: base10 },
760
+ comment: { fontStyle: 'italic', color: base04 },
761
+ meta: { color: base04 },
762
+ processingInstruction: { color: base0B },
763
+ null: { color: base0E },
764
+ annotation: { color: base0A, fontStyle: 'italic' },
765
+ heading: { fontWeight: 'bold', color: base0C },
766
+ headingLevel: { color: base0C },
767
+ list: { color: base0C },
768
+ quote: { color: base04 },
769
+ monospace: { color: base00 },
770
+ contentSeparator: { color: base0D },
771
+ link: {
772
+ color: base0E,
773
+ fontWeight: '500',
774
+ textDecoration: 'underline',
775
+ textUnderlinePosition: 'under',
348
776
  },
349
- '&-info': {
350
- borderLeft: `3px solid ${linkColor}`,
351
- },
352
- },
353
- '.cm-lintPoint-error': {
354
- borderBottom: `2px wavy ${invalid}`,
355
- },
356
- '.cm-lintPoint-warning': {
357
- borderBottom: `2px wavy ${diagnosticWarning}`,
358
- },
359
- // Matching brackets
360
- '.cm-matchingBracket': {
361
- backgroundColor: activeBracketBg,
362
- outline: `1px solid ${activeBracketBorder}`,
363
- borderRadius: generalMatching.borderRadius,
364
- },
365
- '.cm-nonmatchingBracket': {
366
- backgroundColor: '#fb492740',
367
- outline: `1px solid ${invalid}`,
368
- borderRadius: generalMatching.borderRadius,
369
- },
370
- // Selection matches
371
- '.cm-selectionMatch': {
372
- backgroundColor: selectionMatch,
373
- outline: `1px solid ${base08}`,
374
- borderRadius: generalMatching.borderRadius,
375
- },
376
- // Fold placeholder
377
- '.cm-foldPlaceholder': {
378
- backgroundColor: 'transparent',
379
- color: base02,
380
- border: `1px dotted ${base08}`,
381
- borderRadius: generalPlaceholder.borderRadius,
382
- padding: generalPlaceholder.padding,
383
- margin: generalPlaceholder.margin,
384
- },
385
- // Focus outline
386
- '&.cm-focused': {
387
- outline: 'none',
388
- boxShadow: `0 0 0 2px ${base05}, 0 0 0 3px ${base10}40`,
389
- },
390
- // Scrollbars
391
- '& .cm-scroller::-webkit-scrollbar': {
392
- width: generalScroller.width,
393
- height: generalScroller.height,
394
- },
395
- '& .cm-scroller::-webkit-scrollbar-track': {
396
- background: base05,
397
- },
398
- '& .cm-scroller::-webkit-scrollbar-thumb': {
399
- backgroundColor: base08,
400
- borderRadius: generalScroller.borderRadius,
401
- border: `3px solid ${base05}`,
402
- },
403
- '& .cm-scroller::-webkit-scrollbar-thumb:hover': {
404
- backgroundColor: base09,
405
- },
406
- // Ghost text
407
- '.cm-ghostText': {
408
- opacity: '0.5',
409
- color: base04,
410
- },
411
- }, { dark: false });
412
- /**
413
- * Enhanced syntax highlighting for Gruvbox Light theme
414
- */
415
- const gruvboxLightHighlightStyle = language.HighlightStyle.define([
416
- // Keywords and control flow
417
- { tag: highlight.tags.keyword, color: base0A, fontWeight: 'bold' },
418
- { tag: highlight.tags.controlKeyword, color: base0A, fontWeight: 'bold' },
419
- { tag: highlight.tags.moduleKeyword, color: base0A, fontWeight: 'bold' },
420
- // Names and variables
421
- { tag: [highlight.tags.name, highlight.tags.deleted, highlight.tags.character, highlight.tags.macroName], color: base0D },
422
- { tag: [highlight.tags.variableName], color: base0D },
423
- { tag: [highlight.tags.propertyName], color: base0F, fontStyle: 'normal' },
424
- // Classes and types
425
- { tag: [highlight.tags.typeName], color: base0F },
426
- { tag: [highlight.tags.className], color: base0C, fontStyle: 'italic' },
427
- { tag: [highlight.tags.namespace], color: base0D, fontStyle: 'italic' },
428
- // Operators and punctuation
429
- { tag: [highlight.tags.operator, highlight.tags.operatorKeyword], color: base00 },
430
- { tag: [highlight.tags.bracket], color: base04 },
431
- { tag: [highlight.tags.brace], color: base04 },
432
- { tag: [highlight.tags.punctuation], color: base04 },
433
- // Functions and parameters
434
- { tag: [highlight.tags.function(highlight.tags.variableName), highlight.tags.labelName], color: base0C },
435
- { tag: [highlight.tags.definition(highlight.tags.variableName)], color: base0D },
436
- // Constants and literals
437
- { tag: highlight.tags.number, color: base0E },
438
- { tag: highlight.tags.changed, color: base0E },
439
- { tag: highlight.tags.annotation, color: invalid, fontStyle: 'italic' },
440
- { tag: highlight.tags.modifier, color: base0E, fontStyle: 'italic' },
441
- { tag: highlight.tags.self, color: base0E },
442
- { tag: [highlight.tags.color, highlight.tags.constant(highlight.tags.name), highlight.tags.standard(highlight.tags.name)], color: base10 },
443
- { tag: [highlight.tags.atom, highlight.tags.bool, highlight.tags.special(highlight.tags.variableName)], color: base10 },
444
- // Strings and regex
445
- { tag: [highlight.tags.processingInstruction, highlight.tags.inserted], color: base0B },
446
- { tag: [highlight.tags.special(highlight.tags.string), highlight.tags.regexp], color: base0B },
447
- { tag: highlight.tags.string, color: base0B },
448
- // Punctuation and structure
449
- { tag: highlight.tags.definition(highlight.tags.typeName), color: base0F, fontWeight: 'bold' },
450
- // Comments and documentation
451
- { tag: highlight.tags.meta, color: base04 },
452
- { tag: highlight.tags.comment, fontStyle: 'italic', color: base04 },
453
- { tag: highlight.tags.docComment, fontStyle: 'italic', color: base04 },
454
- // HTML/XML elements
455
- { tag: [highlight.tags.tagName], color: base0A },
456
- { tag: [highlight.tags.attributeName], color: base0C },
457
- // Markdown and text formatting
458
- { tag: [highlight.tags.heading], fontWeight: 'bold', color: base0C },
459
- { tag: [highlight.tags.strong], fontWeight: 'bold', color: base0C },
460
- { tag: [highlight.tags.emphasis], fontStyle: 'italic', color: base0B },
461
- // Links and URLs
462
- {
463
- tag: [highlight.tags.link],
464
- color: visitedLinkColor,
465
- fontWeight: '500',
466
- textDecoration: 'underline',
467
- textUnderlinePosition: 'under',
468
- },
469
- {
470
- tag: [highlight.tags.url],
471
- color: linkColor,
472
- textDecoration: 'underline',
473
- textUnderlineOffset: '2px',
474
- },
475
- // Special states
476
- {
477
- tag: [highlight.tags.invalid],
478
- color: base00,
479
- textDecoration: 'underline wavy',
480
- borderBottom: `1px wavy ${invalid}`,
481
- },
482
- { tag: [highlight.tags.strikethrough], color: invalid, textDecoration: 'line-through' },
483
- // Enhanced syntax highlighting
484
- { tag: highlight.tags.constant(highlight.tags.name), color: base10 },
485
- { tag: highlight.tags.deleted, color: invalid },
486
- { tag: highlight.tags.squareBracket, color: base04 },
487
- { tag: highlight.tags.angleBracket, color: base04 },
488
- // Additional specific styles
489
- { tag: highlight.tags.monospace, color: base00 },
490
- { tag: [highlight.tags.contentSeparator], color: base0D },
491
- { tag: highlight.tags.quote, color: base04 },
492
- ]);
777
+ url: { color: base0D, textDecoration: 'underline', textUnderlineOffset: '2px' },
778
+ emphasis: { fontStyle: 'italic', color: base0B },
779
+ strong: { fontWeight: 'bold', color: base0C },
780
+ strikethrough: { color: base0A, textDecoration: 'line-through' },
781
+ invalid: { color: base00, textDecoration: 'underline wavy', borderBottom: `1px wavy ${base0A}` },
782
+ inserted: { color: base0B },
783
+ deleted: { color: base0A },
784
+ changed: { color: base0E },
785
+ },
786
+ });
493
787
  /**
494
788
  * Combined Gruvbox Light theme extension
495
789
  */
496
- const gruvboxLight = [
497
- gruvboxLightTheme,
498
- language.syntaxHighlighting(gruvboxLightHighlightStyle),
499
- ];
790
+ const gruvboxLight = theme.extension;
500
791
  /**
501
792
  * Gruvbox Light merge revert styles configuration
502
793
  */
503
- const gruvboxLightMergeStyles = {
504
- backgroundColor: tooltipBackground,
505
- borderColor: base08,
506
- buttonColor: base00,
507
- buttonHoverColor: base07,
508
- };
794
+ const gruvboxLightMergeStyles = theme.mergeStyles;
509
795
 
510
796
  exports.applyMergeRevertStyles = applyMergeRevertStyles;
511
797
  exports.gruvboxLight = gruvboxLight;