@fsegurai/codemirror-theme-android-studio 6.2.5 → 6.3.0

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