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