refactor: rename theme to Ashruvarsha, add Rajdhani and Space Mono fonts

This commit is contained in:
Sam Chau
2026-05-29 20:27:27 +09:30
parent 05f664f635
commit d4150b0804
13 changed files with 86 additions and 39 deletions

View File

@@ -922,14 +922,14 @@ and are tracked in issue #298:
### Available themes
| Theme | Mode | Selector | Description |
| ------------- | ----- | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| System | auto | (none) | Follows device `prefers-color-scheme` |
| Default Light | light | `.light` / `:root` | Clean neutral palette, DM Sans / Geist Mono |
| Default Dark | dark | `.dark` | Semi-transparent surfaces on dark background |
| Retro | light | `.theme-retro` | Win98 / Napster: silver-grey, navy accent, square corners, inset bevels, Tahoma / Courier New, Clippy help button |
| Classic | dark | `.theme-classic` | Profilarr v1: deep charcoal (#111827), gray-800 surfaces, blue-600 accent, tighter radius (8px cards, 6px controls), card shadows, Schibsted Grotesk / Fira Code |
| Vesper | dark | `.theme-vesper` | Twilight indigo (#161122), violet-purple surfaces, amber-gold accent (the evening star), soft card shadows, slightly larger card radius, IBM Plex Sans / IBM Plex Mono |
| Tannhauser | dark | `.theme-tannhauser` | Cyberpunk sprawl (#0b0e14), cyan circuit-trace borders, hot magenta accent, neon-glow card shadows, sharp corners (6px cards, 4px controls), Inter / JetBrains Mono |
| Theme | Mode | Selector | Description |
| ------------- | ----- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| System | auto | (none) | Follows device `prefers-color-scheme` |
| Default Light | light | `.light` / `:root` | Clean neutral palette, DM Sans / Geist Mono |
| Default Dark | dark | `.dark` | Semi-transparent surfaces on dark background |
| Retro | light | `.theme-retro` | Win98 / Napster: silver-grey, navy accent, square corners, inset bevels, Tahoma / Courier New, Clippy help button |
| Classic | dark | `.theme-classic` | Profilarr v1: deep charcoal (#111827), gray-800 surfaces, blue-600 accent, tighter radius (8px cards, 6px controls), card shadows, Schibsted Grotesk / Fira Code |
| Vesper | dark | `.theme-vesper` | Twilight indigo (#161122), violet-purple surfaces, amber-gold accent (the evening star), soft card shadows, slightly larger card radius, IBM Plex Sans / IBM Plex Mono |
| Ashruvarsha | dark | `.theme-ashruvarsha` | Cyberpunk sprawl (#0b0e14), cyan circuit-trace borders, hot magenta accent, neon-glow card shadows, sharp corners (6px cards, 4px controls), Rajdhani / Space Mono |
Planned: user-loadable custom theme files.

View File

@@ -5,7 +5,7 @@
@import './styles/themes/retro.css';
@import './styles/themes/classic.css';
@import './styles/themes/vesper.css';
@import './styles/themes/tannhauser.css';
@import './styles/themes/ashruvarsha.css';
@import './styles/prose.css';
@import './styles/scrollbar.css';
@import './styles/transitions.css';

View File

@@ -23,7 +23,7 @@
retro: { cls: 'theme-retro', scheme: 'light' },
classic: { cls: 'theme-classic', scheme: 'dark' },
vesper: { cls: 'theme-vesper', scheme: 'dark' },
tannhauser: { cls: 'theme-tannhauser', scheme: 'dark' }
ashruvarsha: { cls: 'theme-ashruvarsha', scheme: 'dark' }
};
var mapped = themeMap[stored];
if (mapped) {

View File

@@ -10,8 +10,8 @@ import { browser } from '$app/environment';
import { themePreference } from '$stores/theme.ts';
import { getThemeDefinition } from '$lib/client/themes/registry.ts';
export type SansFont = 'auto' | 'dm-sans' | 'inter' | 'ibm-plex-sans';
export type MonoFont = 'auto' | 'geist-mono' | 'jetbrains-mono' | 'ibm-plex-mono';
export type SansFont = 'auto' | 'dm-sans' | 'inter' | 'ibm-plex-sans' | 'rajdhani';
export type MonoFont = 'auto' | 'geist-mono' | 'jetbrains-mono' | 'ibm-plex-mono' | 'space-mono';
export interface FontSettings {
sans: SansFont;
@@ -23,25 +23,29 @@ const STORAGE_KEY = 'fontSettings';
const sansFontStacks: Record<Exclude<SansFont, 'auto'>, string> = {
'dm-sans': "'DM Sans', ui-sans-serif, system-ui, sans-serif",
inter: "'Inter', ui-sans-serif, system-ui, sans-serif",
'ibm-plex-sans': "'IBM Plex Sans', ui-sans-serif, system-ui, sans-serif"
'ibm-plex-sans': "'IBM Plex Sans', ui-sans-serif, system-ui, sans-serif",
rajdhani: "'Rajdhani', ui-sans-serif, system-ui, sans-serif"
};
const monoFontStacks: Record<Exclude<MonoFont, 'auto'>, string> = {
'geist-mono': "'Geist Mono', ui-monospace, monospace",
'jetbrains-mono': "'JetBrains Mono', ui-monospace, monospace",
'ibm-plex-mono': "'IBM Plex Mono', ui-monospace, monospace"
'ibm-plex-mono': "'IBM Plex Mono', ui-monospace, monospace",
'space-mono': "'Space Mono', ui-monospace, monospace"
};
const allSansOptions: { value: Exclude<SansFont, 'auto'>; label: string }[] = [
{ value: 'dm-sans', label: 'DM Sans' },
{ value: 'inter', label: 'Inter' },
{ value: 'ibm-plex-sans', label: 'IBM Plex Sans' }
{ value: 'ibm-plex-sans', label: 'IBM Plex Sans' },
{ value: 'rajdhani', label: 'Rajdhani' }
];
const allMonoOptions: { value: Exclude<MonoFont, 'auto'>; label: string }[] = [
{ value: 'geist-mono', label: 'Geist Mono' },
{ value: 'jetbrains-mono', label: 'JetBrains Mono' },
{ value: 'ibm-plex-mono', label: 'IBM Plex Mono' }
{ value: 'ibm-plex-mono', label: 'IBM Plex Mono' },
{ value: 'space-mono', label: 'Space Mono' }
];
function applyFonts(settings: FontSettings) {

View File

@@ -8,7 +8,7 @@ export type ThemePreference =
| 'retro'
| 'classic'
| 'vesper'
| 'tannhauser';
| 'ashruvarsha';
export type ThemeMode = 'light' | 'dark';
export interface ThemeDefinition {
@@ -89,15 +89,15 @@ export const themeDefinitions: ThemeDefinition[] = [
defaultMono: 'ibm-plex-mono'
},
{
value: 'tannhauser',
label: 'Tannhauser',
shortLabel: 'Tannhauser',
description: 'C-beams glittering in the dark',
value: 'ashruvarsha',
label: 'Ashruvarsha',
shortLabel: 'Ashruvarsha',
description: 'Tears in rain',
icon: Zap,
className: 'theme-tannhauser',
className: 'theme-ashruvarsha',
mode: 'dark',
defaultSans: 'inter',
defaultMono: 'jetbrains-mono'
defaultSans: 'rajdhani',
defaultMono: 'space-mono'
}
];

View File

@@ -78,8 +78,8 @@
let quip = '';
$: isRetro = $themePreference === 'retro';
$: isTannhauser = $themePreference === 'tannhauser';
$: activeQuips = isTannhauser ? joiQuips : isRetro ? clippyQuips : parrotQuips;
$: isAshruvarsha = $themePreference === 'ashruvarsha';
$: activeQuips = isAshruvarsha ? joiQuips : isRetro ? clippyQuips : parrotQuips;
function pickQuip() {
quip = activeQuips[Math.floor(Math.random() * activeQuips.length)];
@@ -107,7 +107,7 @@
on:click|stopPropagation
>
{#if open}
{#if isTannhauser}
{#if isAshruvarsha}
<!-- Joi holographic popup -->
<div
transition:fly={{ y: isFab ? 8 : -8, duration: 200 }}
@@ -233,7 +233,7 @@
{/if}
{#if isFab}
{#if isTannhauser}
{#if isAshruvarsha}
<!-- Holographic Bot projection -->
<div
class="joi-fab cursor-pointer"
@@ -272,7 +272,7 @@
</button>
{/if}
{:else}
{#if isTannhauser}
{#if isAshruvarsha}
<!-- Joi navbar variant: compact holographic button -->
<button
class="joi-nav-btn flex h-9 w-9 cursor-pointer items-center justify-center rounded-sm border border-[rgb(0_210_230_/_0.25)] bg-transparent text-[#00d4ee] transition-all hover:border-[rgb(0_210_230_/_0.5)] hover:text-[#f72585] hover:shadow-[0_0_12px_rgb(0_210_230_/_0.15)]"
@@ -397,7 +397,7 @@
}
}
/* ===== Joi / Tannhauser theme ===== */
/* ===== Joi / Ashruvarsha theme ===== */
/* ===== Joi holographic Bot ===== */

View File

@@ -61,3 +61,43 @@
font-display: swap;
src: url('/fonts/IBMPlexMono-Bold.woff2') format('woff2');
}
@font-face {
font-family: 'Rajdhani';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/fonts/Rajdhani-Regular.woff2') format('woff2');
}
@font-face {
font-family: 'Rajdhani';
font-style: normal;
font-weight: 600;
font-display: swap;
src: url('/fonts/Rajdhani-SemiBold.woff2') format('woff2');
}
@font-face {
font-family: 'Rajdhani';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/fonts/Rajdhani-Bold.woff2') format('woff2');
}
@font-face {
font-family: 'Space Mono';
font-style: normal;
font-weight: 400;
font-display: swap;
src: url('/fonts/SpaceMono-Regular.woff2') format('woff2');
}
@font-face {
font-family: 'Space Mono';
font-style: normal;
font-weight: 700;
font-display: swap;
src: url('/fonts/SpaceMono-Bold.woff2') format('woff2');
}

View File

@@ -1,7 +1,10 @@
/*
* Tannhauser
* Ashruvarsha (अश्रुवर्ष)
*
* "I've watched C-beams glitter in the dark near the Tannhauser Gate."
* Sanskrit: ashru (tear) + varsha (rain). Tears in rain.
*
* "I've watched C-beams glitter in the dark near the Tannhauser Gate.
* All those moments will be lost in time, like tears in rain."
*
* The grid never sleeps. Somewhere in the sprawl, your instances are
* running -- Radarr nodes pulling feeds, Sonarr scrapers indexing,
@@ -20,14 +23,14 @@
* light.
*
* Sharp corners. Industrial spacing. Everything built for function,
* not comfort. Inter is clean, dense, corporate-precise -- the font
* of megacorp interfaces. JetBrains Mono has ligatures for reading
* config at 3am.
* not comfort. Rajdhani is geometric with Devanagari roots -- the
* script of the language this theme is named in. Space Mono is
* retro-futuristic, the monospace of a replicant's terminal.
*/
.theme-tannhauser {
--theme-font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif;
--theme-font-mono: 'JetBrains Mono', ui-monospace, monospace;
.theme-ashruvarsha {
--theme-font-sans: 'Rajdhani', ui-sans-serif, system-ui, sans-serif;
--theme-font-mono: 'Space Mono', ui-monospace, monospace;
/* The dark between streetlights */
--theme-bg: #0b0e14;

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.