📦 NEW: Theme Shades of Purple (#2114)
Co-authored-by: Scott Densmore <scottdensmore@mac.com>
This commit is contained in:
parent
7b86a2015f
commit
19a9b50aab
|
@ -0,0 +1,348 @@
|
||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright 2025 Google LLC
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shades of Purple Theme — for Highlightjs.
|
||||||
|
* @author Ahmad Awais <https://twitter.com/mrahmadawais/>
|
||||||
|
*/
|
||||||
|
import { type ColorsTheme, Theme } from './theme.js';
|
||||||
|
|
||||||
|
const shadesOfPurpleColors: ColorsTheme = {
|
||||||
|
type: 'dark',
|
||||||
|
// Required colors for ColorsTheme interface
|
||||||
|
Background: '#2d2b57', // Main background
|
||||||
|
Foreground: '#e3dfff', // Default text color (hljs, hljs-subst)
|
||||||
|
LightBlue: '#847ace', // Light blue/purple accent
|
||||||
|
AccentBlue: '#a599e9', // Borders, secondary blue
|
||||||
|
AccentPurple: '#ac65ff', // Comments (main purple)
|
||||||
|
AccentCyan: '#a1feff', // Names
|
||||||
|
AccentGreen: '#A5FF90', // Strings and many others
|
||||||
|
AccentYellow: '#fad000', // Title, main yellow
|
||||||
|
AccentRed: '#ff628c', // Error/deletion accent
|
||||||
|
Comment: '#B362FF', // Comment color (same as AccentPurple)
|
||||||
|
Gray: '#726c86', // Gray color
|
||||||
|
GradientColors: ['#4d21fc', '#847ace', '#ff628c'],
|
||||||
|
};
|
||||||
|
|
||||||
|
// Additional colors from CSS that don't fit in the ColorsTheme interface
|
||||||
|
const additionalColors = {
|
||||||
|
AccentYellowAlt: '#f8d000', // Attr yellow (slightly different)
|
||||||
|
AccentOrange: '#fb9e00', // Keywords, built_in, meta
|
||||||
|
AccentPink: '#fa658d', // Numbers, literals
|
||||||
|
AccentLightPurple: '#c991ff', // For params and properties
|
||||||
|
AccentDarkPurple: '#6943ff', // For operators
|
||||||
|
AccentTeal: '#2ee2fa', // For special constructs
|
||||||
|
};
|
||||||
|
|
||||||
|
export const ShadesOfPurple = new Theme(
|
||||||
|
'Shades Of Purple',
|
||||||
|
'dark',
|
||||||
|
{
|
||||||
|
// Base styles
|
||||||
|
hljs: {
|
||||||
|
display: 'block',
|
||||||
|
overflowX: 'auto',
|
||||||
|
background: shadesOfPurpleColors.Background,
|
||||||
|
color: shadesOfPurpleColors.Foreground,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Title elements
|
||||||
|
'hljs-title': {
|
||||||
|
color: shadesOfPurpleColors.AccentYellow,
|
||||||
|
fontWeight: 'normal',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Names
|
||||||
|
'hljs-name': {
|
||||||
|
color: shadesOfPurpleColors.AccentCyan,
|
||||||
|
fontWeight: 'normal',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
'hljs-tag': {
|
||||||
|
color: shadesOfPurpleColors.Foreground,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
'hljs-attr': {
|
||||||
|
color: additionalColors.AccentYellowAlt,
|
||||||
|
fontStyle: 'italic',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Built-ins, selector tags, sections
|
||||||
|
'hljs-built_in': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
},
|
||||||
|
'hljs-selector-tag': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
fontWeight: 'normal',
|
||||||
|
},
|
||||||
|
'hljs-section': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Keywords
|
||||||
|
'hljs-keyword': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
fontWeight: 'normal',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Default text and substitutions
|
||||||
|
'hljs-subst': {
|
||||||
|
color: shadesOfPurpleColors.Foreground,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Strings and related elements (all green)
|
||||||
|
'hljs-string': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-attribute': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-symbol': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-bullet': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-addition': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-code': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-regexp': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-selector-class': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-selector-attr': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-selector-pseudo': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-template-tag': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-quote': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-deletion': {
|
||||||
|
color: shadesOfPurpleColors.AccentRed,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Meta elements
|
||||||
|
'hljs-meta': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
},
|
||||||
|
'hljs-meta-string': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Comments
|
||||||
|
'hljs-comment': {
|
||||||
|
color: shadesOfPurpleColors.AccentPurple,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Literals and numbers
|
||||||
|
'hljs-literal': {
|
||||||
|
color: additionalColors.AccentPink,
|
||||||
|
fontWeight: 'normal',
|
||||||
|
},
|
||||||
|
'hljs-number': {
|
||||||
|
color: additionalColors.AccentPink,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Emphasis and strong
|
||||||
|
'hljs-emphasis': {
|
||||||
|
fontStyle: 'italic',
|
||||||
|
},
|
||||||
|
'hljs-strong': {
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Diff-specific classes
|
||||||
|
'hljs-diff': {
|
||||||
|
color: shadesOfPurpleColors.Foreground,
|
||||||
|
},
|
||||||
|
'hljs-meta.hljs-diff': {
|
||||||
|
color: shadesOfPurpleColors.AccentBlue,
|
||||||
|
},
|
||||||
|
'hljs-ln': {
|
||||||
|
color: shadesOfPurpleColors.Gray,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Additional elements that might be needed
|
||||||
|
'hljs-type': {
|
||||||
|
color: shadesOfPurpleColors.AccentYellow,
|
||||||
|
fontWeight: 'normal',
|
||||||
|
},
|
||||||
|
'hljs-variable': {
|
||||||
|
color: shadesOfPurpleColors.AccentYellow,
|
||||||
|
},
|
||||||
|
'hljs-template-variable': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
'hljs-function .hljs-keyword': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
},
|
||||||
|
'hljs-link': {
|
||||||
|
color: shadesOfPurpleColors.LightBlue,
|
||||||
|
},
|
||||||
|
'hljs-doctag': {
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Function parameters
|
||||||
|
'hljs-params': {
|
||||||
|
color: additionalColors.AccentLightPurple,
|
||||||
|
fontStyle: 'italic',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Class definitions
|
||||||
|
'hljs-class': {
|
||||||
|
color: shadesOfPurpleColors.AccentCyan,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Function definitions
|
||||||
|
'hljs-function': {
|
||||||
|
color: shadesOfPurpleColors.AccentCyan,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Object properties
|
||||||
|
'hljs-property': {
|
||||||
|
color: shadesOfPurpleColors.AccentBlue,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
'hljs-operator': {
|
||||||
|
color: additionalColors.AccentDarkPurple,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Punctuation (if supported by the parser)
|
||||||
|
'hljs-punctuation': {
|
||||||
|
color: shadesOfPurpleColors.Gray,
|
||||||
|
},
|
||||||
|
|
||||||
|
// CSS ID selectors
|
||||||
|
'hljs-selector-id': {
|
||||||
|
color: shadesOfPurpleColors.AccentYellow,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Character literals
|
||||||
|
'hljs-char': {
|
||||||
|
color: shadesOfPurpleColors.AccentGreen,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Escape sequences
|
||||||
|
'hljs-escape': {
|
||||||
|
color: additionalColors.AccentPink,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Meta keywords
|
||||||
|
'hljs-meta-keyword': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Built-in names
|
||||||
|
'hljs-builtin-name': {
|
||||||
|
color: additionalColors.AccentTeal,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Modules
|
||||||
|
'hljs-module': {
|
||||||
|
color: shadesOfPurpleColors.AccentCyan,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Namespaces
|
||||||
|
'hljs-namespace': {
|
||||||
|
color: shadesOfPurpleColors.LightBlue,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Important annotations
|
||||||
|
'hljs-important': {
|
||||||
|
color: shadesOfPurpleColors.AccentRed,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Formulas (for LaTeX, etc.)
|
||||||
|
'hljs-formula': {
|
||||||
|
color: shadesOfPurpleColors.AccentCyan,
|
||||||
|
fontStyle: 'italic',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Language-specific additions
|
||||||
|
// Python decorators
|
||||||
|
'hljs-decorator': {
|
||||||
|
color: additionalColors.AccentTeal,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Ruby symbols
|
||||||
|
'hljs-symbol.ruby': {
|
||||||
|
color: additionalColors.AccentPink,
|
||||||
|
},
|
||||||
|
|
||||||
|
// SQL keywords
|
||||||
|
'hljs-keyword.sql': {
|
||||||
|
color: additionalColors.AccentOrange,
|
||||||
|
textTransform: 'uppercase',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Markdown specific
|
||||||
|
'hljs-section.markdown': {
|
||||||
|
color: shadesOfPurpleColors.AccentYellow,
|
||||||
|
fontWeight: 'bold',
|
||||||
|
},
|
||||||
|
|
||||||
|
// JSON keys
|
||||||
|
'hljs-attr.json': {
|
||||||
|
color: shadesOfPurpleColors.AccentCyan,
|
||||||
|
},
|
||||||
|
|
||||||
|
// XML/HTML specific
|
||||||
|
'hljs-tag .hljs-name': {
|
||||||
|
color: shadesOfPurpleColors.AccentRed,
|
||||||
|
},
|
||||||
|
'hljs-tag .hljs-attr': {
|
||||||
|
color: additionalColors.AccentYellowAlt,
|
||||||
|
},
|
||||||
|
|
||||||
|
// Line highlighting (if line numbers are enabled)
|
||||||
|
'hljs.hljs-line-numbers': {
|
||||||
|
borderRight: `1px solid ${shadesOfPurpleColors.Gray}`,
|
||||||
|
},
|
||||||
|
'hljs.hljs-line-numbers .hljs-ln-numbers': {
|
||||||
|
color: shadesOfPurpleColors.Gray,
|
||||||
|
paddingRight: '1em',
|
||||||
|
},
|
||||||
|
'hljs.hljs-line-numbers .hljs-ln-code': {
|
||||||
|
paddingLeft: '1em',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Selection styling
|
||||||
|
'hljs::selection': {
|
||||||
|
background: shadesOfPurpleColors.AccentBlue + '40', // 40 = 25% opacity
|
||||||
|
},
|
||||||
|
'hljs ::-moz-selection': {
|
||||||
|
background: shadesOfPurpleColors.AccentBlue + '40',
|
||||||
|
},
|
||||||
|
|
||||||
|
// Highlighted lines (for emphasis)
|
||||||
|
'hljs .hljs-highlight': {
|
||||||
|
background: shadesOfPurpleColors.AccentPurple + '20', // 20 = 12.5% opacity
|
||||||
|
display: 'block',
|
||||||
|
width: '100%',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
shadesOfPurpleColors,
|
||||||
|
);
|
|
@ -13,6 +13,7 @@ import { GitHubLight } from './github-light.js';
|
||||||
import { GoogleCode } from './googlecode.js';
|
import { GoogleCode } from './googlecode.js';
|
||||||
import { DefaultLight } from './default-light.js';
|
import { DefaultLight } from './default-light.js';
|
||||||
import { DefaultDark } from './default.js';
|
import { DefaultDark } from './default.js';
|
||||||
|
import { ShadesOfPurple } from './shades-of-purple.js';
|
||||||
import { XCode } from './xcode.js';
|
import { XCode } from './xcode.js';
|
||||||
import { Theme, ThemeType } from './theme.js';
|
import { Theme, ThemeType } from './theme.js';
|
||||||
import { ANSI } from './ansi.js';
|
import { ANSI } from './ansi.js';
|
||||||
|
@ -42,6 +43,7 @@ class ThemeManager {
|
||||||
GitHubDark,
|
GitHubDark,
|
||||||
GitHubLight,
|
GitHubLight,
|
||||||
GoogleCode,
|
GoogleCode,
|
||||||
|
ShadesOfPurple,
|
||||||
XCode,
|
XCode,
|
||||||
ANSI,
|
ANSI,
|
||||||
ANSILight,
|
ANSILight,
|
||||||
|
|
Loading…
Reference in New Issue