@fsegurai/codemirror-theme-basic-dark 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 +647 -360
  3. package/dist/index.js +647 -360
  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 Basic Dark theme color palette
111
598
  * ------------------------------------------
@@ -118,391 +605,191 @@ base02 = '#5c88da', // Selection elements (more vibrant blue)
118
605
  base03 = '#b8b8b8', // Comments, line numbers (slightly lighter)
119
606
  base04 = '#ffffff', // Cursor (pure white for better visibility)
120
607
  base05 = '#e4e4e4', // Panels foreground
121
- base06 = '#909090', // Comments (slightly more visible gray)
608
+ base06 = '#a2a2a2', // Comments (slightly more visible gray)
122
609
  base07 = '#000000', // Pure black for contrast elements
123
- base08 = '#e06c75', // Error, deleted (more vibrant red)
610
+ base08 = '#f47e86', // Error, deleted (more vibrant red)
124
611
  base09 = '#f39c12', // Number, boolean (warmer orange)
125
612
  base0A = '#ffcb6b', // Keywords (warmer yellow)
126
613
  base0B = '#98c379', // Strings (more vibrant green)
127
614
  base0C = '#56b6c2', // Classes, types (cyan blue)
128
615
  base0D = '#61afef', // Functions, methods (bright blue)
129
- base0E = '#c678dd', // Operators, brackets (brighter purple)
130
- base0F = '#be5046', // Special elements (darker red)
616
+ base0E = '#d284e9', // Operators, brackets (brighter purple)
617
+ base0F = '#f48073', // Special elements (darker red)
131
618
  // UI-specific colors
132
- invalid = '#e06c75', // Error highlighting (consistent red)
133
619
  darkBackground = '#252529', // Panel background (slightly darker)
134
620
  selectionBackground = '#3a5991aa', // Selection background (semi-transparent blue)
135
621
  highlightBackground = '#3a3d4166', // Active line background (subtle blue-gray)
136
622
  tooltipBackground = '#2a2c31', // Tooltip background (darker than the editor)
137
- cursor = base04, activeBracketBg = '#3a599140', activeBracketBorder = base0E,
623
+ activeBracketBg = '#3a599140',
138
624
  // Diff/merge specific colors
139
625
  addedBackground = '#1e462c50', // Dark green with transparency for insertions
140
626
  removedBackground = '#5c1e2340', // Dark red with transparency for deletions
141
627
  addedText = '#73c991', // Green for added text
142
628
  removedText = '#f07178'; // Red for removed text
143
- /**
144
- * Enhanced editor theme styles for Basic Dark
145
- */
146
- const basicDarkTheme = view.EditorView.theme({
147
- // Base editor styles
148
- '&': {
149
- color: base01,
150
- backgroundColor: base00,
151
- fontSize: generalContent.fontSize,
152
- fontFamily: generalContent.fontFamily,
153
- },
154
- // Content and cursor
155
- '.cm-content': {
156
- caretColor: cursor,
157
- lineHeight: generalContent.lineHeight,
158
- },
159
- '.cm-cursor, .cm-dropCursor': {
160
- borderLeftColor: cursor,
161
- borderLeftWidth: generalCursor.borderLeftWidth,
162
- },
163
- '.cm-fat-cursor': {
164
- backgroundColor: `${cursor}99`,
165
- color: base00,
166
- },
167
- // Selection
168
- '&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection': {
169
- backgroundColor: selectionBackground,
170
- color: base01,
171
- },
172
- // Make sure selection appears above active line
173
- '.cm-selectionLayer': {
174
- zIndex: 100,
175
- },
176
- // Search functionality
177
- '.cm-searchMatch': {
178
- backgroundColor: '#4a74c480',
179
- outline: `1px solid ${base02}`,
180
- color: base01,
181
- borderRadius: generalSearchField.borderRadius,
182
- '& span': {
183
- color: base01,
629
+ const theme = defineTheme({
630
+ dark: true,
631
+ ui: {
632
+ background: base00,
633
+ foreground: base01,
634
+ border: 'none',
635
+ cursor: base04,
636
+ cursorWidth: '2px',
637
+ cursorShadow: 'none',
638
+ fatCursor: { background: `${base04}99`, border: 'none' },
639
+ selection: '#3a59916f',
640
+ selectionInactive: '#3a59916f',
641
+ selectionForeground: base01,
642
+ selectionOutline: 'none',
643
+ activeLine: '#3a3d415f',
644
+ activeLineBorder: { left: 'none', right: 'none' },
645
+ ghostText: base03,
646
+ ghostTextOpacity: '0.5',
647
+ specialChar: base08,
648
+ focusRing: `0 0 0 2px ${base00}, 0 0 0 4px ${base02}`,
649
+ outlineWidth: '1px',
650
+ searchMatch: {
651
+ background: '#4a74c480',
652
+ outline: base02,
653
+ foreground: base01,
654
+ shadow: 'none',
655
+ selectedBackground: `${base02}90`,
656
+ selectedForeground: base01,
657
+ selectedOutline: `1px solid ${base02}`,
658
+ selectedShadow: 'none',
184
659
  },
185
- },
186
- '.cm-searchMatch.cm-searchMatch-selected': {
187
- backgroundColor: '#5c88da90',
188
- color: base01,
189
- padding: generalSearchField.padding,
190
- '& span': {
191
- color: base01,
660
+ selectionMatch: { background: '#4a74c440', outline: `${base02}50` },
661
+ matchingBracket: { background: activeBracketBg, outline: `${base0E}a0`, shadow: 'none' },
662
+ nonMatchingBracket: { background: `${base08}40`, outline: base08 },
663
+ panel: {
664
+ background: darkBackground,
665
+ foreground: base05,
666
+ border: '#3a3a3a',
667
+ borderWidth: '1px',
668
+ outline: 'none',
669
+ shadow: 'none',
670
+ buttonBackground: darkBackground,
671
+ buttonForeground: base05,
672
+ buttonBorder: 'none',
673
+ buttonHoverBackground: '#35373d',
674
+ buttonHoverForeground: base05,
675
+ buttonHoverBorder: 'none',
676
+ buttonHoverShadow: 'none',
677
+ inputBackground: base00,
678
+ inputBorder: '1px solid #3a3a3a',
192
679
  },
193
- },
194
- '.cm-search.cm-panel.cm-textfield': {
195
- color: base05,
196
- borderRadius: generalSearchField.borderRadius,
197
- padding: generalSearchField.padding,
198
- },
199
- // Panels
200
- '.cm-panels': {
201
- backgroundColor: darkBackground,
202
- color: base05,
203
- borderRadius: '0 0 4px 4px',
204
- },
205
- '.cm-panels.cm-panels-top': {
206
- borderBottom: '1px solid #3a3a3a',
207
- },
208
- '.cm-panels.cm-panels-bottom': {
209
- borderTop: '1px solid #3a3a3a',
210
- },
211
- '.cm-panel button': {
212
- backgroundColor: darkBackground,
213
- color: base05,
214
- border: generalPanel.border,
215
- borderRadius: generalPanel.borderRadius,
216
- padding: generalPanel.padding,
217
- },
218
- '.cm-panel button:hover': {
219
- backgroundColor: '#35373d',
220
- },
221
- // Line highlighting
222
- '.cm-activeLine': {
223
- backgroundColor: highlightBackground,
224
- borderRadius: generalLine.borderRadius,
225
- zIndex: 1,
226
- },
227
- // Gutters
228
- '.cm-gutters': {
229
- backgroundColor: darkBackground,
230
- color: base06,
231
- border: generalGutter.border,
232
- borderRight: '1px solid #35383d',
233
- paddingRight: generalGutter.paddingRight,
234
- },
235
- '.cm-activeLineGutter': {
236
- backgroundColor: highlightBackground,
237
- color: base03,
238
- fontWeight: generalGutter.fontWeight,
239
- },
240
- '.cm-lineNumbers': {
241
- fontSize: generalGutter.fontSize,
242
- lineHeight: generalGutter.lineHeight,
243
- },
244
- '.cm-foldGutter': {
245
- fontSize: generalGutter.fontSize,
246
- lineHeight: generalGutter.lineHeight,
247
- },
248
- '.cm-foldGutter .cm-gutterElement': {
249
- color: base06,
250
- cursor: 'pointer',
251
- },
252
- '.cm-foldGutter .cm-gutterElement:hover': {
253
- color: base01,
254
- },
255
- // Diff/Merge View Styles
256
- // Inserted/Added Content
257
- '.cm-insertedLine': {
258
- textDecoration: generalDiff.insertedTextDecoration,
259
- backgroundColor: addedBackground,
260
- color: addedText,
261
- padding: generalDiff.insertedLinePadding,
262
- borderRadius: generalDiff.borderRadius,
263
- },
264
- 'ins.cm-insertedLine, ins.cm-insertedLine:not(:has(.cm-changedText))': {
265
- textDecoration: generalDiff.insertedTextDecoration,
266
- backgroundColor: `${addedBackground} !important`,
267
- color: addedText,
268
- padding: generalDiff.insertedLinePadding,
269
- borderRadius: generalDiff.borderRadius,
270
- border: `1px solid ${addedText}40`,
271
- },
272
- 'ins.cm-insertedLine .cm-changedText': {
273
- background: 'transparent !important',
274
- },
275
- // Deleted/Removed Content
276
- '.cm-deletedLine': {
277
- textDecoration: generalDiff.deletedTextDecoration,
278
- backgroundColor: removedBackground,
279
- color: removedText,
280
- padding: generalDiff.insertedLinePadding,
281
- borderRadius: generalDiff.borderRadius,
282
- },
283
- 'del.cm-deletedLine, del, del:not(:has(.cm-deletedText))': {
284
- textDecoration: generalDiff.deletedTextDecoration,
285
- backgroundColor: `${removedBackground} !important`,
286
- color: removedText,
287
- padding: generalDiff.insertedLinePadding,
288
- borderRadius: generalDiff.borderRadius,
289
- border: `1px solid ${removedText}40`,
290
- },
291
- 'del .cm-deletedText, del .cm-changedText': {
292
- background: 'transparent !important',
293
- },
294
- // Tooltips and autocomplete
295
- '.cm-tooltip': {
296
- backgroundColor: tooltipBackground,
297
- border: '1px solid #3a3a3a',
298
- borderRadius: generalTooltip.borderRadius,
299
- padding: generalTooltip.padding,
300
- boxShadow: '0 2px 8px rgba(0, 0, 0, 0.3)',
301
- },
302
- '.cm-tooltip-autocomplete': {
303
- '& > ul': {
304
- backgroundColor: tooltipBackground,
305
- border: 'none',
306
- },
307
- '& > ul > li': {
308
- padding: generalTooltip.padding,
309
- lineHeight: generalTooltip.lineHeight,
680
+ gutter: {
681
+ background: darkBackground,
682
+ foreground: base06,
683
+ border: '#35383d',
684
+ activeBackground: highlightBackground,
685
+ activeForeground: base03,
686
+ activeFontWeight: '500',
687
+ activeBorder: 'none',
688
+ foldHover: base01,
310
689
  },
311
- '& > ul > li[aria-selected]': {
312
- backgroundColor: selectionBackground,
313
- color: base01,
314
- borderRadius: generalTooltip.borderRadiusSelected,
690
+ foldPlaceholder: { background: 'transparent', foreground: base02, border: `${base02}70`, borderStyle: 'dotted' },
691
+ tooltip: {
692
+ background: tooltipBackground,
693
+ foreground: base01,
694
+ border: '#3a3a3a',
695
+ shadow: '0 2px 8px rgba(0, 0, 0, 0.3)',
696
+ listBackground: tooltipBackground,
697
+ listBorder: 'none',
698
+ hoverBackground: 'transparent',
699
+ selectedBackground: selectionBackground,
700
+ selectedForeground: base01,
701
+ selectedBorder: 'none',
702
+ icon: base06,
703
+ detail: base06,
315
704
  },
316
- '& > ul > li > span.cm-completionIcon': {
317
- color: base06,
318
- paddingRight: generalTooltip.paddingRight,
705
+ diff: {
706
+ insertedBackground: addedBackground,
707
+ insertedForeground: addedText,
708
+ insertedBorder: `1px solid ${addedText}40`,
709
+ deletedBackground: removedBackground,
710
+ deletedForeground: removedText,
711
+ deletedBorder: `1px solid ${removedText}40`,
319
712
  },
320
- '& > ul > li > span.cm-completionDetail': {
321
- color: base06,
322
- fontStyle: 'italic',
713
+ diagnostic: {
714
+ error: base08,
715
+ warning: base0A,
716
+ info: base0D,
717
+ hint: base0D,
718
+ errorBackground: 'transparent',
719
+ warningBackground: 'transparent',
720
+ infoBackground: 'transparent',
721
+ borderWidth: '3px',
722
+ underlineWidth: '2px',
323
723
  },
324
- },
325
- '.cm-tooltip .cm-tooltip-arrow:before': {
326
- borderTopColor: 'transparent',
327
- borderBottomColor: 'transparent',
328
- },
329
- '.cm-tooltip .cm-tooltip-arrow:after': {
330
- borderTopColor: tooltipBackground,
331
- borderBottomColor: tooltipBackground,
332
- },
333
- // Diagnostics styling
334
- '.cm-diagnostic': {
335
- '&-error': {
336
- borderLeft: `3px solid ${invalid}`,
724
+ scrollbar: {
725
+ track: darkBackground,
726
+ trackBorder: 'none',
727
+ thumb: '#444448',
728
+ thumbBorder: `3px solid ${darkBackground}`,
729
+ thumbHover: '#55555a',
730
+ thumbHoverShadow: 'none',
337
731
  },
338
- '&-warning': {
339
- borderLeft: `3px solid ${base0A}`,
732
+ merge: {
733
+ backgroundColor: darkBackground,
734
+ borderColor: '#3a3a3a',
735
+ buttonColor: base05,
736
+ buttonHoverColor: '#35373d',
340
737
  },
341
- '&-info': {
342
- borderLeft: `3px solid ${base0D}`,
343
- },
344
- },
345
- '.cm-lintPoint-error': {
346
- borderBottom: `2px wavy ${invalid}`,
347
- },
348
- '.cm-lintPoint-warning': {
349
- borderBottom: `2px wavy ${base0A}`,
350
- },
351
- // Matching brackets
352
- '.cm-matchingBracket': {
353
- backgroundColor: activeBracketBg,
354
- outline: `1px solid ${activeBracketBorder}60`,
355
- borderRadius: generalMatching.borderRadius,
356
- },
357
- '.cm-nonmatchingBracket': {
358
- backgroundColor: '#e06c7540',
359
- outline: `1px solid ${invalid}`,
360
- borderRadius: generalMatching.borderRadius,
361
- },
362
- // Selection matches
363
- '.cm-selectionMatch': {
364
- backgroundColor: '#4a74c440',
365
- outline: `1px solid ${base02}50`,
366
- borderRadius: generalMatching.borderRadius,
367
- },
368
- // Fold placeholder
369
- '.cm-foldPlaceholder': {
370
- backgroundColor: 'transparent',
371
- color: base02,
372
- border: `1px dotted ${base02}70`,
373
- borderRadius: generalPlaceholder.borderRadius,
374
- padding: generalPlaceholder.padding,
375
- margin: generalPlaceholder.margin,
376
738
  },
377
- // Focus outline
378
- '&.cm-focused': {
379
- outline: 'none',
380
- boxShadow: `0 0 0 2px ${base00}, 0 0 0 3px ${base02}40`,
381
- },
382
- // Scrollbars
383
- '& .cm-scroller::-webkit-scrollbar': {
384
- width: generalScroller.width,
385
- height: generalScroller.height,
386
- },
387
- '& .cm-scroller::-webkit-scrollbar-track': {
388
- background: darkBackground,
389
- },
390
- '& .cm-scroller::-webkit-scrollbar-thumb': {
391
- backgroundColor: '#444448',
392
- borderRadius: generalScroller.borderRadius,
393
- border: `3px solid ${darkBackground}`,
394
- },
395
- '& .cm-scroller::-webkit-scrollbar-thumb:hover': {
396
- backgroundColor: '#55555a',
397
- },
398
- // Ghost text
399
- '.cm-ghostText': {
400
- opacity: '0.5',
401
- color: '#b8b8b8',
402
- },
403
- }, { dark: true });
404
- /**
405
- * Enhanced syntax highlighting for Basic Dark theme
406
- */
407
- const basicDarkHighlightStyle = language.HighlightStyle.define([
408
- // Keywords and control flow
409
- { tag: highlight.tags.keyword, color: base0A, fontWeight: 'bold' },
410
- { tag: highlight.tags.controlKeyword, color: base0A, fontWeight: 'bold' },
411
- { tag: highlight.tags.moduleKeyword, color: base0A, fontWeight: 'bold' },
412
- // Names and variables
413
- { tag: [highlight.tags.name, highlight.tags.deleted, highlight.tags.character, highlight.tags.macroName], color: base0D },
414
- { tag: [highlight.tags.variableName], color: base0D },
415
- { tag: [highlight.tags.propertyName], color: base0C, fontStyle: 'normal' },
416
- // Classes and types
417
- { tag: [highlight.tags.typeName], color: base0C },
418
- { tag: [highlight.tags.className], color: base0C, fontStyle: 'italic' },
419
- { tag: [highlight.tags.namespace], color: base0D, fontStyle: 'italic' },
420
- // Operators and punctuation
421
- { tag: [highlight.tags.operator, highlight.tags.operatorKeyword], color: base0E },
422
- { tag: [highlight.tags.bracket], color: base0E },
423
- { tag: [highlight.tags.brace], color: base0E },
424
- { tag: [highlight.tags.punctuation], color: base0E },
425
- // Functions and parameters
426
- { tag: [highlight.tags.function(highlight.tags.variableName), highlight.tags.labelName], color: base0D },
427
- { tag: [highlight.tags.definition(highlight.tags.variableName)], color: base0D },
428
- // Constants and literals
429
- { tag: highlight.tags.number, color: base09 },
430
- { tag: highlight.tags.changed, color: base09 },
431
- { tag: highlight.tags.annotation, color: invalid, fontStyle: 'italic' },
432
- { tag: highlight.tags.modifier, color: base09, fontStyle: 'italic' },
433
- { tag: highlight.tags.self, color: base09 },
434
- { tag: [highlight.tags.color, highlight.tags.constant(highlight.tags.name), highlight.tags.standard(highlight.tags.name)], color: base09 },
435
- { tag: [highlight.tags.atom, highlight.tags.bool, highlight.tags.special(highlight.tags.variableName)], color: base09 },
436
- // Strings and regex
437
- { tag: [highlight.tags.processingInstruction, highlight.tags.inserted], color: base0B },
438
- { tag: [highlight.tags.special(highlight.tags.string), highlight.tags.regexp], color: base0B },
439
- { tag: highlight.tags.string, color: base0B },
440
- // Punctuation and structure
441
- { tag: highlight.tags.definition(highlight.tags.typeName), color: base0C, fontWeight: 'bold' },
442
- // Comments and documentation
443
- { tag: highlight.tags.meta, color: base08 },
444
- { tag: highlight.tags.comment, fontStyle: 'italic', color: base06 },
445
- { tag: highlight.tags.docComment, fontStyle: 'italic', color: base06 },
446
- // HTML/XML elements
447
- { tag: [highlight.tags.tagName], color: base0A },
448
- { tag: [highlight.tags.attributeName], color: base0D },
449
- // Markdown and text formatting
450
- { tag: [highlight.tags.heading], fontWeight: 'bold', color: base0A },
451
- {
452
- tag: [highlight.tags.strong],
453
- fontWeight: 'bold',
454
- color: base09,
455
- textShadow: `0 0 2px ${base07}`,
456
- },
457
- { tag: [highlight.tags.emphasis], fontStyle: 'italic', color: base0D },
458
- // Links and URLs
459
- {
460
- tag: [highlight.tags.link],
461
- color: base0F,
462
- fontWeight: '500',
463
- textDecoration: 'underline',
464
- textUnderlinePosition: 'under',
465
- },
466
- {
467
- tag: [highlight.tags.url],
468
- color: base0B,
469
- textDecoration: 'underline',
470
- textUnderlineOffset: '2px',
471
- },
472
- // Special states
473
- {
474
- tag: [highlight.tags.invalid],
475
- color: base01,
476
- textDecoration: 'underline wavy',
477
- borderBottom: `1px wavy ${invalid}`,
478
- },
479
- { tag: [highlight.tags.strikethrough], color: invalid, textDecoration: 'line-through' },
480
- // Enhanced syntax highlighting
481
- { tag: highlight.tags.constant(highlight.tags.name), color: base09 },
482
- { tag: highlight.tags.deleted, color: invalid },
483
- { tag: highlight.tags.squareBracket, color: base0E },
484
- { tag: highlight.tags.angleBracket, color: base0E },
485
- // Additional specific styles
486
- { tag: highlight.tags.monospace, color: base01 },
487
- { tag: [highlight.tags.contentSeparator], color: base0D },
488
- { tag: highlight.tags.quote, color: base06 },
489
- ]);
739
+ syntax: {
740
+ keyword: { color: base0A, fontWeight: 'bold' },
741
+ definitionKeyword: { color: base0A },
742
+ modifier: { color: base09, fontStyle: 'italic' },
743
+ operator: { color: base0E },
744
+ punctuation: { color: base0E },
745
+ name: { color: base0D },
746
+ function: { color: base0D },
747
+ self: { color: base09 },
748
+ property: { color: base0C, fontStyle: 'normal' },
749
+ type: { color: base0C },
750
+ typeDefinition: { color: base0C, fontWeight: 'bold' },
751
+ className: { color: base0C, fontStyle: 'italic' },
752
+ namespace: { color: base0D, fontStyle: 'italic' },
753
+ tag: { color: base0A },
754
+ attribute: { color: base0D },
755
+ content: { color: base01 },
756
+ string: { color: base0B },
757
+ number: { color: base09 },
758
+ constant: { color: base09 },
759
+ comment: { fontStyle: 'italic', color: base06 },
760
+ meta: { color: base08 },
761
+ processingInstruction: { color: base0B },
762
+ annotation: { color: base08, fontStyle: 'italic' },
763
+ heading: { fontWeight: 'bold', color: base0A },
764
+ headingLevel: { color: base0A },
765
+ list: { color: base0A },
766
+ quote: { color: base06 },
767
+ monospace: { color: base01 },
768
+ contentSeparator: { color: base0D },
769
+ link: {
770
+ color: base0F,
771
+ fontWeight: '500',
772
+ textDecoration: 'underline',
773
+ textUnderlinePosition: 'under',
774
+ },
775
+ url: { color: base0B, textDecoration: 'underline', textUnderlineOffset: '2px' },
776
+ emphasis: { fontStyle: 'italic', color: base0D },
777
+ strong: { fontWeight: 'bold', color: base09, textShadow: `0 0 2px ${base07}` },
778
+ strikethrough: { color: base08, textDecoration: 'line-through' },
779
+ invalid: { color: base01, textDecoration: 'underline wavy', borderBottom: `1px wavy ${base08}` },
780
+ inserted: { color: base0B },
781
+ deleted: { color: base08 },
782
+ changed: { color: base09 },
783
+ },
784
+ });
490
785
  /**
491
786
  * Combined Basic Dark theme extension
492
787
  */
493
- const basicDark = [
494
- basicDarkTheme,
495
- language.syntaxHighlighting(basicDarkHighlightStyle),
496
- ];
788
+ const basicDark = theme.extension;
497
789
  /**
498
790
  * Basic Dark merge revert styles configuration
499
791
  */
500
- const basicDarkMergeStyles = {
501
- backgroundColor: darkBackground,
502
- borderColor: '#3a3a3a',
503
- buttonColor: base05,
504
- buttonHoverColor: '#35373d',
505
- };
792
+ const basicDarkMergeStyles = theme.mergeStyles;
506
793
 
507
794
  exports.applyMergeRevertStyles = applyMergeRevertStyles;
508
795
  exports.basicDark = basicDark;