Skip to content

Commit 25392ab

Browse files
Bikram GoleBikram Gole
authored andcommitted
Add Material 3 palettes and segmented tabs
1 parent 9f225c6 commit 25392ab

5 files changed

Lines changed: 136 additions & 0 deletions

File tree

about.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@
6363
<option value="paper">Paper Link</option>
6464
<option value="blackflag">Black Flag Uprising</option>
6565
</select>
66+
<label for="m3-palette-select" class="theme-top-label m3-palette-label">M3</label>
67+
<select id="m3-palette-select" class="theme-top-select m3-palette-select" aria-label="Material 3 palette">
68+
<option value="lavender">Lavender</option>
69+
<option value="emerald">Emerald</option>
70+
<option value="sunset">Sunset</option>
71+
</select>
6672
</div>
6773
</header>
6874

contact.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@
6363
<option value="paper">Paper Link</option>
6464
<option value="blackflag">Black Flag Uprising</option>
6565
</select>
66+
<label for="m3-palette-select" class="theme-top-label m3-palette-label">M3</label>
67+
<select id="m3-palette-select" class="theme-top-select m3-palette-select" aria-label="Material 3 palette">
68+
<option value="lavender">Lavender</option>
69+
<option value="emerald">Emerald</option>
70+
<option value="sunset">Sunset</option>
71+
</select>
6672
</div>
6773
</header>
6874

index.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@
6363
<option value="paper">Paper Link</option>
6464
<option value="blackflag">Black Flag Uprising</option>
6565
</select>
66+
<label for="m3-palette-select" class="theme-top-label m3-palette-label">M3</label>
67+
<select id="m3-palette-select" class="theme-top-select m3-palette-select" aria-label="Material 3 palette">
68+
<option value="lavender">Lavender</option>
69+
<option value="emerald">Emerald</option>
70+
<option value="sunset">Sunset</option>
71+
</select>
6672
<button id="theme-cycle-btn" class="theme-cycle-btn" type="button" aria-label="Cycle theme"></button>
6773
</div>
6874
</header>

script.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ const quizStartBtn = document.getElementById("quiz-start");
131131
const quizResetBtn = document.getElementById("quiz-reset");
132132
const quizScore = document.getElementById("quiz-score");
133133
const headerThemeSelect = document.getElementById("header-theme-select");
134+
const material3PaletteSelect = document.getElementById("m3-palette-select");
134135
const themeCycleBtn = document.getElementById("theme-cycle-btn");
135136
const heroName = document.getElementById("hero-name");
136137
const heroStatus = document.getElementById("hero-status");
@@ -144,6 +145,7 @@ const miniTerminalTheme = document.getElementById("mini-terminal-theme");
144145
const NEPAL_TIMEZONE = "Asia/Kathmandu";
145146
const BS_CONVERTER_URL = "https://cdn.jsdelivr.net/npm/nepali-date-library@1.1.9/+esm";
146147
const THEME_STORAGE_KEY = "neoThemeVariant.v1";
148+
const M3_PALETTE_STORAGE_KEY = "neoMaterial3Palette.v1";
147149
const ACTION_STORAGE_KEY = "neoAutoAction.v1";
148150
const HERO_TYPED_KEY = "neoHeroTyped.v1";
149151
const MINI_PROMPT = "╰─❯";
@@ -168,6 +170,7 @@ const THEME_OPTIONS = [
168170
"paper",
169171
"blackflag",
170172
];
173+
const MATERIAL3_PALETTES = ["lavender", "emerald", "sunset"];
171174
const MAX_TERMINAL_LINES = 220;
172175
const TERMINAL_COMMANDS = [
173176
"help", "whoami", "mission", "status", "clear",
@@ -181,6 +184,7 @@ let launches = 0;
181184
let adToBsConverter = null;
182185
let startPersonaQuiz = null;
183186
let currentTheme = "neo";
187+
let currentMaterial3Palette = "lavender";
184188
let terminalHistory = [];
185189
let terminalHistoryIndex = 0;
186190
let terminalDraft = "";
@@ -727,6 +731,11 @@ function applyTheme(theme, notify = false) {
727731
miniTerminalTheme.textContent = `theme: ${selected}`;
728732
}
729733

734+
document.body.classList.toggle("m3-palette-active", selected === "material3");
735+
if (selected === "material3") {
736+
applyMaterial3Palette(currentMaterial3Palette, false);
737+
}
738+
730739
try {
731740
window.localStorage.setItem(THEME_STORAGE_KEY, selected);
732741
} catch (error) {
@@ -739,33 +748,73 @@ function applyTheme(theme, notify = false) {
739748
if (notify) showToast(`Theme changed: ${selected}`);
740749
}
741750

751+
function applyMaterial3Palette(palette, notify = false) {
752+
const selected = MATERIAL3_PALETTES.includes(palette) ? palette : "lavender";
753+
currentMaterial3Palette = selected;
754+
document.documentElement.dataset.m3Palette = selected;
755+
document.body.dataset.m3Palette = selected;
756+
if (material3PaletteSelect) {
757+
material3PaletteSelect.value = selected;
758+
}
759+
760+
try {
761+
window.localStorage.setItem(M3_PALETTE_STORAGE_KEY, selected);
762+
} catch (error) {
763+
// Ignore storage errors.
764+
}
765+
766+
if (notify && currentTheme === "material3") {
767+
showToast(`M3 palette: ${selected}`);
768+
}
769+
}
770+
742771
function initThemeSwitcher() {
743772
let savedTheme = "neo";
744773
let urlTheme = null;
774+
let savedPalette = "lavender";
745775
try {
746776
urlTheme = getThemeFromUrl();
747777
const storedTheme = window.localStorage.getItem(THEME_STORAGE_KEY);
778+
const storedPalette = window.localStorage.getItem(M3_PALETTE_STORAGE_KEY);
748779
savedTheme = storedTheme || urlTheme || "neo";
780+
savedPalette = MATERIAL3_PALETTES.includes(storedPalette) ? storedPalette : "lavender";
749781
if (!storedTheme && urlTheme) {
750782
window.localStorage.setItem(THEME_STORAGE_KEY, urlTheme);
751783
}
752784
} catch (error) {
753785
savedTheme = "neo";
786+
savedPalette = "lavender";
754787
}
755788

789+
applyMaterial3Palette(savedPalette, false);
756790
applyTheme(savedTheme, false);
757791
window.addEventListener("pageshow", () => {
758792
let latestTheme = "neo";
793+
let latestPalette = "lavender";
759794
try {
760795
latestTheme = window.localStorage.getItem(THEME_STORAGE_KEY) || getThemeFromUrl() || "neo";
796+
const storedPalette = window.localStorage.getItem(M3_PALETTE_STORAGE_KEY);
797+
latestPalette = MATERIAL3_PALETTES.includes(storedPalette) ? storedPalette : "lavender";
761798
} catch (error) {
762799
latestTheme = "neo";
800+
latestPalette = "lavender";
801+
}
802+
if (latestPalette !== currentMaterial3Palette) {
803+
applyMaterial3Palette(latestPalette, false);
763804
}
764805
if (latestTheme !== currentTheme) {
765806
applyTheme(latestTheme, false);
766807
}
767808
});
768809
window.addEventListener("storage", (event) => {
810+
if (event.key === M3_PALETTE_STORAGE_KEY && event.newValue) {
811+
if (!MATERIAL3_PALETTES.includes(event.newValue)) return;
812+
if (event.newValue !== currentMaterial3Palette) {
813+
applyMaterial3Palette(event.newValue, false);
814+
}
815+
return;
816+
}
817+
769818
if (event.key !== THEME_STORAGE_KEY || !event.newValue) return;
770819
if (!THEME_OPTIONS.includes(event.newValue)) return;
771820
if (event.newValue !== currentTheme) {
@@ -776,6 +825,10 @@ function initThemeSwitcher() {
776825
applyTheme(event.target.value, true);
777826
});
778827

828+
material3PaletteSelect?.addEventListener("change", (event) => {
829+
applyMaterial3Palette(event.target.value, true);
830+
});
831+
779832
themeCycleBtn?.addEventListener("click", () => {
780833
const idx = THEME_OPTIONS.indexOf(currentTheme);
781834
const next = THEME_OPTIONS[(idx + 1 + THEME_OPTIONS.length) % THEME_OPTIONS.length];
@@ -1436,6 +1489,9 @@ function initCommandPalette() {
14361489
{ label: "Theme: Sunset Warp", keywords: "theme sunset orange", run: () => applyTheme("sunset", true) },
14371490
{ label: "Theme: Liquid Glass", keywords: "theme liquid glass apple", run: () => applyTheme("liquidglass", true) },
14381491
{ label: "Theme: Material 3", keywords: "theme material3 google", run: () => applyTheme("material3", true) },
1492+
{ label: "M3 Palette: Lavender", keywords: "material3 palette lavender", run: () => applyMaterial3Palette("lavender", true) },
1493+
{ label: "M3 Palette: Emerald", keywords: "material3 palette emerald", run: () => applyMaterial3Palette("emerald", true) },
1494+
{ label: "M3 Palette: Sunset", keywords: "material3 palette sunset", run: () => applyMaterial3Palette("sunset", true) },
14391495
{ label: "Theme: Paper Link", keywords: "theme paper", run: () => applyTheme("paper", true) },
14401496
{ label: "Theme: Black Flag Uprising", keywords: "theme blackflag anarchy", run: () => applyTheme("blackflag", true) },
14411497
{ label: "Mode: Toggle Matrix Rain", keywords: "matrix rain mode", run: () => toggleMatrixMode() },

styles.css

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,11 @@ nav a.active {
768768
text-transform: uppercase;
769769
}
770770

771+
.m3-palette-label,
772+
.m3-palette-select {
773+
display: none;
774+
}
775+
771776
.theme-top-select {
772777
border: 1px solid rgba(107, 155, 227, 0.44);
773778
border-radius: 7px;
@@ -3142,3 +3147,60 @@ body[data-theme="material3"] .site-footer {
31423147
background: rgba(50, 52, 67, 0.8);
31433148
padding: 0.48rem 0.84rem;
31443149
}
3150+
3151+
/* Material 3 extras: segmented tabs + palette presets. */
3152+
body[data-theme="material3"] .m3-palette-label,
3153+
body[data-theme="material3"] .m3-palette-select {
3154+
display: inline-flex;
3155+
}
3156+
3157+
body[data-theme="material3"] nav {
3158+
background: rgba(63, 64, 83, 0.62);
3159+
border: 1px solid rgba(189, 182, 220, 0.28);
3160+
border-radius: 999px;
3161+
padding: 0.16rem;
3162+
gap: 0.16rem;
3163+
box-shadow: inset 0 1px 0 rgba(242, 236, 255, 0.1);
3164+
}
3165+
3166+
body[data-theme="material3"] nav a {
3167+
min-width: 5.2rem;
3168+
justify-content: center;
3169+
}
3170+
3171+
body[data-theme="material3"][data-m3-palette="lavender"] {
3172+
--blue: #d0bcff;
3173+
--blue-2: #ebe1ff;
3174+
--orange: #7ee6c0;
3175+
--orange-2: #bdf4df;
3176+
}
3177+
3178+
body[data-theme="material3"][data-m3-palette="emerald"] {
3179+
--blue: #84f7c2;
3180+
--blue-2: #cfffe9;
3181+
--orange: #7cdfff;
3182+
--orange-2: #b8efff;
3183+
}
3184+
3185+
body[data-theme="material3"][data-m3-palette="sunset"] {
3186+
--blue: #ffbf8c;
3187+
--blue-2: #ffe2c7;
3188+
--orange: #ff8ea9;
3189+
--orange-2: #ffc8d6;
3190+
}
3191+
3192+
body[data-theme="material3"][data-m3-palette="emerald"] {
3193+
background:
3194+
radial-gradient(860px 320px at 10% -12%, rgba(116, 241, 191, 0.3), transparent 64%),
3195+
radial-gradient(760px 300px at 92% -8%, rgba(132, 224, 255, 0.22), transparent 66%),
3196+
radial-gradient(680px 260px at 46% 108%, rgba(145, 255, 211, 0.18), transparent 68%),
3197+
linear-gradient(156deg, #111a17 0%, #172623 44%, #1d2f2b 100%);
3198+
}
3199+
3200+
body[data-theme="material3"][data-m3-palette="sunset"] {
3201+
background:
3202+
radial-gradient(860px 320px at 10% -12%, rgba(255, 189, 130, 0.32), transparent 64%),
3203+
radial-gradient(760px 300px at 92% -8%, rgba(255, 141, 172, 0.23), transparent 66%),
3204+
radial-gradient(680px 260px at 46% 108%, rgba(255, 214, 165, 0.19), transparent 68%),
3205+
linear-gradient(156deg, #211517 0%, #2b1c22 44%, #33242a 100%);
3206+
}

0 commit comments

Comments
 (0)