Theming & Customization
Customize colors, fonts, layouts, and styles to match your brand
Theming & Customization
Make Specra your own. This guide covers everything from simple color changes to complete custom styling.
Quick Customization
The fastest way to customize your docs is through specra.config.json.
Brand Colors
Set your primary color to match your brand:
1{2 "theme": {3 "primaryColor": "#3b82f6"4 }5}Specra automatically generates all color variations (hover states, focus rings, etc.) from this single value.
Dark Mode Settings
Control how dark mode works:
1{2 "theme": {3 "defaultMode": "system",4 "respectPrefersColorScheme": true5 }6}Options for defaultMode:
"system"- Respect user's OS preference (recommended)"light"- Always start in light mode"dark"- Always start in dark mode
Set respectPrefersColorScheme to false to ignore OS settings and only use your default.
Logos
Add your logo for light and dark modes:
1{2 "site": {3 "logo": {4 "light": "/logo-light.svg",5 "dark": "/logo-dark.svg"6 }7 }8}Or use a single logo for both:
1{2 "site": {3 "logo": "/logo.svg"4 }5}Place logo files in the public/ directory.
Custom CSS
For deeper customization, add custom CSS.
Method 1: Custom CSS File
Create a CSS file and reference it in config:
1. Create /public/custom.css:
1:root {2 --font-heading: 'Inter', system-ui, sans-serif;3 --border-radius: 12px;4}5 6.doc-content h1 {7 font-size: 3rem;8 color: var(--color-primary);9}10 11.sidebar {12 background: linear-gradient(to bottom, #f8f9fa, #ffffff);13}2. Reference in config:
1{2 "theme": {3 "customCss": "/custom.css"4 }5}Method 2: Global Styles
Edit app/globals.css directly for more control:
1@tailwind base;2@tailwind components;3@tailwind utilities;4 5@layer base {6 :root {7 /* Your custom properties */8 --radius: 0.75rem;9 }10}11 12@layer components {13 /* Your custom component styles */14 .custom-card {15 @apply rounded-lg border border-gray-200 p-4;16 }17}CSS Variables Reference
Specra uses CSS variables for theming. Override these to customize appearance:
Colors
1:root {2 /* Primary brand color */3 --color-primary: #3b82f6;4 --color-primary-hover: #2563eb;5 --color-primary-light: #dbeafe;6 7 /* Background colors */8 --color-bg: #ffffff;9 --color-bg-secondary: #f9fafb;10 --color-bg-tertiary: #f3f4f6;11 12 /* Text colors */13 --color-text: #111827;14 --color-text-secondary: #6b7280;15 --color-text-tertiary: #9ca3af;16 17 /* Border colors */18 --color-border: #e5e7eb;19 --color-border-hover: #d1d5db;20 21 /* Code block colors */22 --color-code-bg: #f3f4f6;23 --color-code-text: #1f2937;24}25 26.dark {27 --color-bg: #111827;28 --color-bg-secondary: #1f2937;29 --color-bg-tertiary: #374151;30 31 --color-text: #f9fafb;32 --color-text-secondary: #d1d5db;33 --color-text-tertiary: #9ca3af;34 35 --color-border: #374151;36 --color-border-hover: #4b5563;37 38 --color-code-bg: #1f2937;39 --color-code-text: #f9fafb;40}Typography
1:root {2 /* Font families */3 --font-sans: system-ui, -apple-system, sans-serif;4 --font-mono: 'JetBrains Mono', 'Fira Code', monospace;5 --font-heading: var(--font-sans);6 7 /* Font sizes */8 --text-xs: 0.75rem;9 --text-sm: 0.875rem;10 --text-base: 1rem;11 --text-lg: 1.125rem;12 --text-xl: 1.25rem;13 --text-2xl: 1.5rem;14 --text-3xl: 1.875rem;15 --text-4xl: 2.25rem;16 17 /* Line heights */18 --leading-tight: 1.25;19 --leading-normal: 1.5;20 --leading-relaxed: 1.75;21}Spacing
1:root {2 /* Border radius */3 --radius-sm: 0.25rem;4 --radius: 0.5rem;5 --radius-md: 0.75rem;6 --radius-lg: 1rem;7 --radius-xl: 1.5rem;8 9 /* Shadows */10 --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);11 --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);12 --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);13 --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);14}Custom Fonts
Using Google Fonts
1. Add font to your layout:
1// app/layout.tsx2// Use @fontsource packages for fonts in SvelteKit3 4const inter = Inter({ subsets: ['latin'] })5const jetbrainsMono = JetBrains_Mono({ subsets: ['latin'] })6 7export default function RootLayout({ children }) {8 return (9 <html lang="en" className={`${inter.className}`}>10 <body>{children}</body>11 </html>12 )13}2. Update CSS variables:
1:root {2 --font-sans: 'Inter', system-ui, sans-serif;3 --font-mono: 'JetBrains Mono', monospace;4}Using Local Fonts
Place font files in public/fonts/ and load them:
1@font-face {2 font-family: 'CustomFont';3 src: url('/fonts/custom-font.woff2') format('woff2');4 font-weight: 400;5 font-style: normal;6 font-display: swap;7}8 9:root {10 --font-sans: 'CustomFont', system-ui, sans-serif;11}Layout Customization
Sidebar Width
Adjust sidebar width in your custom CSS:
1.sidebar {2 width: 280px; /* Default is 260px */3}4 5@media (min-width: 1280px) {6 .sidebar {7 width: 320px;8 }9}Content Width
Change maximum content width:
1.doc-content {2 max-width: 850px; /* Default is 800px */3}Table of Contents Position
Control TOC position via config:
1{2 "navigation": {3 "tocPosition": "right",4 "showTableOfContents": true5 }6}Options: "left" or "right"
Navigation Customization
Top Navigation Links
Add custom navigation links:
1{2 "navigation": {3 "links": [4 { "label": "Home", "href": "/" },5 { "label": "Docs", "href": "/docs" },6 { "label": "Blog", "href": "/blog" },7 { "label": "GitHub", "href": "https://github.com/..." }8 ]9 }10}Social Links
Display social icons in header:
1{2 "social": {3 "github": "https://github.com/yourusername",4 "twitter": "https://twitter.com/yourusername",5 "discord": "https://discord.gg/invite",6 "custom": [7 {8 "label": "YouTube",9 "url": "https://youtube.com/@channel",10 "icon": "youtube"11 }12 ]13 }14}Footer Customization
Customize footer content and links:
1{2 "footer": {3 "copyright": "© 2024 Your Company. All rights reserved.",4 "links": [5 {6 "title": "Product",7 "items": [8 { "label": "Features", "href": "/features" },9 { "label": "Pricing", "href": "/pricing" }10 ]11 },12 {13 "title": "Resources",14 "items": [15 { "label": "Documentation", "href": "/docs" },16 { "label": "API Reference", "href": "/api" }17 ]18 }19 ],20 "branding": {21 "showBranding": true,22 "logo": "/footer-logo.svg",23 "title": "Your Brand",24 "url": "https://yoursite.com"25 }26 }27}Examples
Minimal Clean Theme
1:root {2 --color-primary: #000000;3 --radius: 0.25rem;4 --font-sans: 'Helvetica Neue', Arial, sans-serif;5}6 7.doc-content {8 max-width: 700px;9 font-size: 1.125rem;10 line-height: 1.8;11}12 13.sidebar {14 border-right: 1px solid #e5e7eb;15 background: #ffffff;16}Vibrant Modern Theme
1:root {2 --color-primary: #8b5cf6;3 --color-primary-hover: #7c3aed;4 --radius-lg: 1.5rem;5 --font-heading: 'Outfit', system-ui, sans-serif;6}7 8.card {9 background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);10 color: white;11 border: none;12}13 14.callout {15 background: linear-gradient(to right, #fef3c7, #fed7aa);16 border: 2px solid #f59e0b;17}Dark-First Theme
1:root {2 --color-bg: #0a0a0a;3 --color-bg-secondary: #141414;4 --color-text: #fafafa;5 --color-border: #262626;6 --color-primary: #10b981;7}8 9.sidebar {10 background: #0a0a0a;11 border-right: 1px solid #262626;12}13 14.doc-content {15 color: #d4d4d4;16}17 18code {19 background: #1a1a1a;20 color: #10b981;21}Best Practices
Start small. Begin with config-based customization before writing custom CSS.
Use CSS variables. They make theme switching and maintenance easier.
Test dark mode. Always test your customizations in both light and dark modes.
Keep it accessible. Ensure sufficient color contrast (4.5:1 for body text, 3:1 for large text).
Optimize fonts. Use font-display: swap and subset fonts to improve load times.
Mobile first. Test your customizations on mobile devices.