# _palette URL: /api/themes/_palette/ Section: themes -------------------------------------------------------------------------------- _palette - Rosettes window.BENGAL_THEME_DEFAULTS = { appearance: 'light', palette: 'brown-bengal' }; window.Bengal = window.Bengal || {}; window.Bengal.enhanceBaseUrl = '/rosettes/assets/js/enhancements'; window.Bengal.watchDom = true; window.Bengal.debug = false; window.Bengal.enhanceUrls = { 'toc': '/rosettes/assets/js/enhancements/toc.632a9783.js', 'docs-nav': '/rosettes/assets/js/enhancements/docs-nav.57e4b129.js', 'tabs': '/rosettes/assets/js/enhancements/tabs.aac9e817.js', 'lightbox': '/rosettes/assets/js/enhancements/lightbox.1ca22aa1.js', 'interactive': '/rosettes/assets/js/enhancements/interactive.fc077855.js', 'mobile-nav': '/rosettes/assets/js/enhancements/mobile-nav.d991657f.js', 'action-bar': '/rosettes/assets/js/enhancements/action-bar.d62417f4.js', 'copy-link': '/rosettes/assets/js/enhancements/copy-link.7d9a5c29.js', 'data-table': '/rosettes/assets/js/enhancements/data-table.1f5bc1eb.js', 'lazy-loaders': '/rosettes/assets/js/enhancements/lazy-loaders.a5c38245.js', 'holo': '/rosettes/assets/js/enhancements/holo.ee13c841.js', 'link-previews': '/rosettes/assets/js/enhancements/link-previews.8d906535.js' }; (function () { try { var defaults = window.BENGAL_THEME_DEFAULTS || { appearance: 'system', palette: '' }; var defaultAppearance = defaults.appearance; if (defaultAppearance === 'system') { defaultAppearance = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } var storedTheme = localStorage.getItem('bengal-theme'); var storedPalette = localStorage.getItem('bengal-palette'); var theme = storedTheme ? (storedTheme === 'system' ? defaultAppearance : storedTheme) : defaultAppearance; var palette = storedPalette ?? defaults.palette; document.documentElement.setAttribute('data-theme', theme); if (palette) { document.documentElement.setAttribute('data-palette', palette); } } catch (e) { document.documentElement.setAttribute('data-theme', 'light'); } })(); { "prerender": [ { "where": { "and": [ { "href_matches": "/docs/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ], "prefetch": [ { "where": { "and": [ { "href_matches": "/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ] } Skip to main content Magnifying Glass ESC Recent Clear Magnifying Glass No results for "" Start typing to search... ↑↓ Navigate ↵ Open ESC Close Powered by Lunr ⌾⌾⌾ DocumentationInfoAboutArrow ClockwiseGet StartedCodeHighlightingPaletteStylingStarburstExtendingFormattersNoteTutorialsBookmarkReferenceReleasesDevGitHubAPI Reference Magnifying Glass Search ⌘K Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal List ⌾⌾⌾ Magnifying Glass Search X Close Documentation Caret Down Info About Arrow Clockwise Get Started Code Highlighting Palette Styling Starburst Extending Formatters Note Tutorials Bookmark Reference Releases Dev Caret Down GitHub API Reference Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal Rosettes API Reference Caret Right Formatters html null terminal Caret Right Lexers _scanners _state_machine bash_sm c_sm clojure_sm cpp_sm css_sm csv_sm cuda_sm cue_sm dart_sm diff_sm dockerfile_sm elixir_sm gleam_sm go_sm graphql_sm groovy_sm haskell_sm hcl_sm html_sm ini_sm java_sm javascript_sm jinja_sm json_sm julia_sm kida_sm kotlin_sm lua_sm makefile_sm markdown_sm mojo_sm nginx_sm nim_sm perl_sm php_sm pkl_sm plaintext_sm powershell_sm protobuf_sm python_sm r_sm ruby_sm rust_sm scala_sm sql_sm stan_sm swift_sm toml_sm tree_sm triton_sm typescript_sm v_sm xml_sm yaml_sm zig_sm Caret Right Themes _mapping _palette _roles palettes _config _escape _formatter_registry _parallel _protocol _registry _types delegate rosettes Rosettes API ReferenceThemes ᗢ Caret Down Link Copy URL External Open LLM text Copy Copy LLM text Share with AI Ask Claude Ask ChatGPT Ask Gemini Ask Copilot Module themes._palette Immutable palette definitions for Rosettes theming. Provides frozen dataclasses for syntax highlighting palettes. All palettes are thread-safe by design. Design Philosophy: Palettes define colors for semantic roles, not individual tokens. This keeps themes manageable (~20 colors) while supporting 100+ token types. Architecture: SyntaxPalette: Single theme with fixed colors ~20 color slots for semantic roles Style modifiers (bold, italic) CSS variable generation AdaptivePalette: Light/dark mode support Contains two SyntaxPalette instances Generates @media (prefers-color-scheme) CSS Creating Palettes: Minimal (only required fields): >>> palette = SyntaxPalette( ... name="minimal", ... background="#1a1a1a", ... text="#f0f0f0", ... ) >>> filled = palette.with_defaults() # Fills missing colors Complete (all roles specified): >>> palette = SyntaxPalette( ... name="complete", ... background="#1a1a1a", ... text="#f0f0f0", ... string="#98c379", ... number="#d19a66", ... function="#61afef", ... # ... all other roles ... ... ) CSS Generation: >>> css_vars = palette.to_css_vars(indent=2) >>> print(css_vars) --syntax-bg: #1a1a1a; --syntax-string: #98c379; ... Thread-Safety: Both classes are frozen dataclasses. Once created, they cannot be modified. Safe to share across threads. See Also: rosettes.themes: Palette registry and built-in palettes rosettes.themes._roles: SyntaxRole enum (what the colors are for) 2Classes Classes SyntaxPalette 36 ▼ Immutable syntax highlighting palette. Thread-safe by design. Defines ~20 semantic color slots ins… Immutable syntax highlighting palette. Thread-safe by design. Defines ~20 semantic color slots instead of 100+ individual token colors. Required Fields: name: Unique identifier for the palette background: Background color for code blocks text: Default text color Optional Fields: All other fields default to empty string and are filled by with_defaults() using sensible fallbacks. Attributes Name Type Description name str — background str — text str — background_highlight str — control_flow str — declaration str — import_ str — string str — number str — boolean str — type_ str — function str — variable str — constant str — comment str — docstring str — error str — warning str — added str — removed str — muted str — punctuation str — operator str — attribute str — namespace str — tag str — regex str — escape str — bold_control bool — bold_declaration bool — italic_comment bool — italic_docstring bool — Methods with_defaults 0 SyntaxPalette ▼ Return a new palette with empty fields filled from defaults. def with_defaults(self) -> SyntaxPalette Returns SyntaxPalette to_css_vars 1 str ▼ Generate CSS custom property declarations. def to_css_vars(self, indent: int = 0) -> str Parameters Name Type Description indent — Default: 0 Returns str generate_css 0 str ▼ Generate complete CSS stylesheet for syntax highlighting. Generates CSS rules … def generate_css(self) -> str Generate complete CSS stylesheet for syntax highlighting. Generates CSS rules for all semantic roles, suitable for use with the HTML formatter. Returns str Complete CSS stylesheet as a string. Internal Methods 1 ▼ __post_init__ 0 ▼ Validate palette after initialization. def __post_init__(self) -> None AdaptivePalette 5 ▼ Theme that adapts to light/dark mode preference. Wraps two SyntaxPalette instances for light and d… Theme that adapts to light/dark mode preference. Wraps two SyntaxPalette instances for light and dark mode. Generates CSS with @media (prefers-color-scheme) queries. Thread-safe: frozen dataclass containing frozen palettes. CSS Generation: Adaptive palettes generate CSS with media queries: @media (prefers-color-scheme: light) { :root { --syntax-bg: #ffffff; ... } } @media (prefers-color-scheme: dark) { :root { --syntax-bg: #0d1117; ... } } Attributes Name Type Description name str Unique identifier for the adaptive palette light SyntaxPalette Palette for light mode (prefers-color-scheme: light) dark SyntaxPalette Palette for dark mode (prefers-color-scheme: dark) Methods generate_css 0 str ▼ Generate adaptive CSS with light/dark mode support. Generates CSS with @media … def generate_css(self) -> str Generate adaptive CSS with light/dark mode support. Generates CSS with @media (prefers-color-scheme) queries for automatic light/dark mode switching. Returns str Complete CSS stylesheet with media queries. Internal Methods 1 ▼ __post_init__ 0 ▼ Validate adaptive palette. def __post_init__(self) -> None ← Previous _mapping Next → _roles List © 2026 Rosettes built in ᓚᘏᗢ { "linkPreviews": { "enabled": true, "hoverDelay": 200, "hideDelay": 150, "showSection": true, "showReadingTime": true, "showWordCount": true, "showDate": true, "showTags": true, "maxTags": 3, "includeSelectors": [".prose"], "excludeSelectors": ["nav", ".toc", ".breadcrumb", ".pagination", ".card", "[class*='-card']", ".tab-nav", "[class*='-widget']", ".child-items", ".content-tiles"], "allowedHosts": [], "allowedSchemes": ["https"], "hostFailureThreshold": 3 } } window.BENGAL_LAZY_ASSETS = { tabulator: '/rosettes/assets/js/tabulator.min.js', dataTable: '/rosettes/assets/js/data-table.js', mermaidToolbar: '/rosettes/assets/js/mermaid-toolbar.9de5abba.js', mermaidTheme: '/rosettes/assets/js/mermaid-theme.344822c5.js', graphMinimap: '/rosettes/assets/js/graph-minimap.ff04e939.js', graphContextual: '/rosettes/assets/js/graph-contextual.355458ba.js' }; window.BENGAL_ICONS = { close: '/rosettes/assets/icons/close.911d4fe1.svg', enlarge: '/rosettes/assets/icons/enlarge.652035e5.svg', copy: '/rosettes/assets/icons/copy.3d56e945.svg', 'download-svg': '/rosettes/assets/icons/download.04f07e1b.svg', 'download-png': '/rosettes/assets/icons/image.c34dfd40.svg', 'zoom-in': '/rosettes/assets/icons/zoom-in.237b4a83.svg', 'zoom-out': '/rosettes/assets/icons/zoom-out.38857c77.svg', reset: '/rosettes/assets/icons/reset.d26dba29.svg' }; Arrow Up -------------------------------------------------------------------------------- Metadata: - Word Count: 1132 - Reading Time: 6 minutes