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