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