Custom Themes

Build your own syntax highlighting theme

2 min read 474 words

Create a custom syntax highlighting theme with semantic classes.

Basic Theme Structure

/* Container */
.rosettes {
  background: #1e1e2e;
  color: #cdd6f4;
  padding: 1em;
  border-radius: 8px;
  overflow-x: auto;
  font-family: 'JetBrains Mono', 'Fira Code', monospace;
  font-size: 14px;
  line-height: 1.5;
}

.rosettes pre {
  margin: 0;
}

/* Keywords */
.syntax-keyword { color: #cba6f7; }
.syntax-keyword-constant { color: #fab387; }
.syntax-keyword-type { color: #89dceb; }

/* Names */
.syntax-function { color: #89b4fa; }
.syntax-class { color: #f9e2af; }
.syntax-decorator { color: #f5c2e7; }
.syntax-builtin { color: #fab387; }
.syntax-variable { color: #cdd6f4; }

/* Literals */
.syntax-string { color: #a6e3a1; }
.syntax-string-escape { color: #f5c2e7; }
.syntax-number { color: #fab387; }

/* Comments */
.syntax-comment { color: #6c7086; font-style: italic; }

/* Operators */
.syntax-operator { color: #89dceb; }
.syntax-punctuation { color: #bac2de; }

Theme Variations

Light Theme

.rosettes.light,
.rosettes[data-theme="light"] {
  background: #eff1f5;
  color: #4c4f69;
}

.rosettes.light .syntax-keyword { color: #8839ef; }
.rosettes.light .syntax-function { color: #1e66f5; }
.rosettes.light .syntax-string { color: #40a02b; }
.rosettes.light .syntax-comment { color: #9ca0b0; }

Auto Dark/Light

/* Light mode (default) */
.rosettes {
  background: #eff1f5;
  color: #4c4f69;
}

.syntax-keyword { color: #8839ef; }

/* Dark mode */
@media (prefers-color-scheme: dark) {
  .rosettes {
    background: #1e1e2e;
    color: #cdd6f4;
  }
  
  .syntax-keyword { color: #cba6f7; }
}

Line Features

Line Numbers

.rosettes .lineno {
  color: #6c7086;
  user-select: none;
  padding-right: 1.5em;
  text-align: right;
  min-width: 2.5em;
  display: inline-block;
  border-right: 1px solid #313244;
  margin-right: 1em;
}

Highlighted Lines

.rosettes .hll {
  background: rgba(203, 166, 247, 0.1);
  display: block;
  margin: 0 -1em;
  padding: 0 1em;
  border-left: 3px solid #cba6f7;
}

Language-Specific Styles

Usedata-languagefor language-specific styling:

/* Python-specific */
.rosettes[data-language="python"] .syntax-decorator {
  color: #f5c2e7;
  font-weight: bold;
}

/* Rust-specific */
.rosettes[data-language="rust"] .syntax-keyword-type {
  color: #fab387;
}

/* JSON keys */
.rosettes[data-language="json"] .syntax-attribute {
  color: #89b4fa;
}

Complete Theme Example

Here's a complete "Catppuccin Mocha" inspired theme:

/* Catppuccin Mocha for Rosettes */
.rosettes {
  --ctp-rosewater: #f5e0dc;
  --ctp-flamingo: #f2cdcd;
  --ctp-pink: #f5c2e7;
  --ctp-mauve: #cba6f7;
  --ctp-red: #f38ba8;
  --ctp-maroon: #eba0ac;
  --ctp-peach: #fab387;
  --ctp-yellow: #f9e2af;
  --ctp-green: #a6e3a1;
  --ctp-teal: #94e2d5;
  --ctp-sky: #89dceb;
  --ctp-sapphire: #74c7ec;
  --ctp-blue: #89b4fa;
  --ctp-lavender: #b4befe;
  --ctp-text: #cdd6f4;
  --ctp-subtext1: #bac2de;
  --ctp-subtext0: #a6adc8;
  --ctp-overlay2: #9399b2;
  --ctp-overlay1: #7f849c;
  --ctp-overlay0: #6c7086;
  --ctp-surface2: #585b70;
  --ctp-surface1: #45475a;
  --ctp-surface0: #313244;
  --ctp-base: #1e1e2e;
  --ctp-mantle: #181825;
  --ctp-crust: #11111b;
  
  background: var(--ctp-base);
  color: var(--ctp-text);
  padding: 1em;
  border-radius: 8px;
  overflow-x: auto;
}

.syntax-keyword { color: var(--ctp-mauve); }
.syntax-keyword-constant { color: var(--ctp-peach); }
.syntax-function { color: var(--ctp-blue); }
.syntax-class { color: var(--ctp-yellow); }
.syntax-string { color: var(--ctp-green); }
.syntax-number { color: var(--ctp-peach); }
.syntax-comment { color: var(--ctp-overlay0); font-style: italic; }
.syntax-operator { color: var(--ctp-sky); }
.syntax-decorator { color: var(--ctp-pink); }
.syntax-builtin { color: var(--ctp-red); }

Next Steps