experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(theme): add 七十二候 micro-seasons theme + fix extension load resilience

Add Japanese 72 micro-seasons (Shichijūnikō) theme that changes colors
every ~5 days using traditional Japanese colors (伝統色). Preload sets
data-microseason attribute based on current date; CSS uses color-mix()
for automatic dark mode derivation.

Fix: use Promise.allSettled for parallel extension loading so one failed
extension doesn't block ext:all-loaded from firing, which prevented all
command registration (including theme switching).

+415 -5
+8 -4
backend/electron/main.ts
··· 471 471 const enabledBuiltinIds = otherBuiltinIds.filter(id => isBuiltinExtensionEnabled(id)); 472 472 473 473 const parallelStart = Date.now(); 474 - await Promise.all(enabledBuiltinIds.map(id => createExtensionWindow(id))); 474 + await Promise.allSettled(enabledBuiltinIds.map(id => createExtensionWindow(id))); 475 475 DEBUG && console.log(`[ext:timing] parallel (${enabledBuiltinIds.join(',')}): ${Date.now() - parallelStart}ms`); 476 476 477 477 // Load external extensions in parallel ··· 484 484 485 485 if (enabledExternalExts.length > 0) { 486 486 const extExtStart = Date.now(); 487 - await Promise.all(enabledExternalExts.map(ext => createExtensionWindow(ext.id))); 487 + await Promise.allSettled(enabledExternalExts.map(ext => createExtensionWindow(ext.id))); 488 488 DEBUG && console.log(`[ext:timing] external: ${Date.now() - extExtStart}ms`); 489 489 } 490 490 ··· 658 658 659 659 // Load external built-in extensions (like 'example') as separate windows 660 660 for (const extId of externalBuiltinIds) { 661 - await createExtensionWindow(extId); 661 + try { await createExtensionWindow(extId); } catch (e) { 662 + console.error(`[ext] Failed to load external built-in extension ${extId}:`, e); 663 + } 662 664 } 663 665 664 666 // Load external extensions from datastore as separate windows 665 667 for (const ext of enabledExternalExts) { 666 668 if (!extensionWindows.has(ext.id)) { 667 669 registerExtensionPath(ext.id, ext.path!); 668 - await createExtensionWindow(ext.id); 670 + try { await createExtensionWindow(ext.id); } catch (e) { 671 + console.error(`[ext] Failed to load external extension ${ext.id}:`, e); 672 + } 669 673 } 670 674 } 671 675
+12
extensions/theme-shichijuni/manifest.json
··· 1 + { 2 + "id": "shichijuni", 3 + "type": "theme", 4 + "name": "七十二候 Shichijūnikō", 5 + "version": "1.0.0", 6 + "description": "Colors change with Japan's 72 micro-seasons, using traditional Japanese colors (伝統色)", 7 + "author": "Peek", 8 + "builtin": true, 9 + "colorSchemes": ["light", "dark"], 10 + "defaultScheme": "system", 11 + "variables": "./variables.css" 12 + }
+365
extensions/theme-shichijuni/variables.css
··· 1 + /** 2 + * 七十二候 Shichijūnikō — Japan's 72 Micro-Seasons Theme 3 + * 4 + * Colors change every ~5 days following the traditional Japanese calendar, 5 + * using colors from the 伝統色 (dentōshoku) palette. 6 + * 7 + * The preload.js sets data-microseason="0"–"71" on <html> based on the current date. 8 + * Each micro-season has a unique primary accent; supporting accents shift 9 + * gradually through 6 seasonal arcs. 10 + * 11 + * Micro-seasons begin at Risshun (立春, ~Feb 4) and cycle through the year. 12 + */ 13 + 14 + /* ========== Light Mode (default) ========== */ 15 + :root { 16 + /* Warm washi-paper grayscale */ 17 + --base00: #f8f7f4; /* Background — warm rice paper */ 18 + --base01: #ffffff; /* Card/panel background */ 19 + --base02: #e8e4de; /* Selection, borders */ 20 + --base03: #a09a90; /* Muted text */ 21 + --base04: #706a60; /* Secondary text */ 22 + --base05: #2d2b28; /* Default foreground */ 23 + --base06: #1a1917; /* Dark foreground */ 24 + --base07: #0f0e0d; /* Darkest */ 25 + 26 + /* Season accent tokens (overridden per micro-season) */ 27 + --season-red: #B94047; 28 + --season-orange: #C39143; 29 + --season-yellow: #DEB068; 30 + --season-green: #6B9362; 31 + --season-cyan: #81C7D4; 32 + --season-primary: #2792C3; 33 + --season-purple: #BAB8D3; 34 + --season-brown: #6A432D; 35 + 36 + /* Base16 accents reference season tokens */ 37 + --base08: var(--season-red); 38 + --base09: var(--season-orange); 39 + --base0A: var(--season-yellow); 40 + --base0B: var(--season-green); 41 + --base0C: var(--season-cyan); 42 + --base0D: var(--season-primary); 43 + --base0E: var(--season-purple); 44 + --base0F: var(--season-brown); 45 + 46 + /* Semantic Aliases */ 47 + --theme-bg: var(--base00); 48 + --theme-bg-secondary: var(--base01); 49 + --theme-bg-tertiary: var(--base02); 50 + --theme-text: var(--base05); 51 + --theme-text-secondary: var(--base04); 52 + --theme-text-muted: var(--base03); 53 + --theme-border: var(--base02); 54 + --theme-accent: var(--base0D); 55 + --theme-success: var(--base0B); 56 + --theme-warning: var(--base0A); 57 + --theme-danger: var(--base08); 58 + 59 + /* Surface */ 60 + --theme-surface-border: 1px solid rgba(0, 0, 0, 0.10); 61 + --theme-surface-ring: 0 0 0 1px rgba(0, 0, 0, 0.06); 62 + 63 + /* Typography — system fonts, colors-only theme */ 64 + --theme-font-sans: system-ui, sans-serif; 65 + --theme-font-mono: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Monaco, monospace; 66 + } 67 + 68 + /* =================================================================== 69 + SEASONAL ARCS — supporting accent colors (shared within each arc) 70 + =================================================================== */ 71 + 72 + /* Arc 1: 春の目覚め Spring Awakening — seasons 0–11 (Feb 4 – Apr 3) 73 + Ice melting, first birdsong, peach blossoms, cherry blossoms */ 74 + [data-microseason="0"], [data-microseason="1"], [data-microseason="2"], 75 + [data-microseason="3"], [data-microseason="4"], [data-microseason="5"], 76 + [data-microseason="6"], [data-microseason="7"], [data-microseason="8"], 77 + [data-microseason="9"], [data-microseason="10"], [data-microseason="11"] { 78 + --season-red: #B94047; /* 臙脂 Enji — rouge */ 79 + --season-orange: #C39143; /* 黄土 Ōdo — ochre */ 80 + --season-yellow: #DEB068; /* 飴 Ame — amber */ 81 + --season-green: #6B9362; /* 若竹 Wakatake — young bamboo */ 82 + --season-cyan: #81C7D4; /* 水 Mizu — water */ 83 + --season-purple: #BAB8D3; /* 藤 Fuji — wisteria */ 84 + --season-brown: #6A432D; /* 檜皮 Hiwada — cypress bark */ 85 + } 86 + 87 + /* Arc 2: 春から夏へ Spring to Summer — seasons 12–23 (Apr 4 – Jun 4) 88 + Swallows, rainbows, peonies, frogs, bamboo shoots */ 89 + [data-microseason="12"], [data-microseason="13"], [data-microseason="14"], 90 + [data-microseason="15"], [data-microseason="16"], [data-microseason="17"], 91 + [data-microseason="18"], [data-microseason="19"], [data-microseason="20"], 92 + [data-microseason="21"], [data-microseason="22"], [data-microseason="23"] { 93 + --season-red: #D7003A; /* 紅 Kurenai — crimson */ 94 + --season-orange: #EE7800; /* 橙 Daidai — orange */ 95 + --season-yellow: #F8B500; /* 山吹 Yamabuki — kerria gold */ 96 + --season-green: #3EB370; /* 翠 Midori — emerald */ 97 + --season-cyan: #00A3AF; /* 浅葱 Asagi — light blue-green */ 98 + --season-purple: #7058A3; /* 菫 Sumire — violet */ 99 + --season-brown: #D57835; /* 朽葉 Kuchiba — fallen leaves */ 100 + } 101 + 102 + /* Arc 3: 盛夏 Full Summer — seasons 24–35 (Jun 5 – Aug 6) 103 + Fireflies, irises, lotus, warm winds, great rains */ 104 + [data-microseason="24"], [data-microseason="25"], [data-microseason="26"], 105 + [data-microseason="27"], [data-microseason="28"], [data-microseason="29"], 106 + [data-microseason="30"], [data-microseason="31"], [data-microseason="32"], 107 + [data-microseason="33"], [data-microseason="34"], [data-microseason="35"] { 108 + --season-red: #D7003A; /* 紅 Kurenai — crimson */ 109 + --season-orange: #EB6101; /* 朱 Shu — vermillion */ 110 + --season-yellow: #E6B422; /* 金 Kin — gold */ 111 + --season-green: #007B43; /* 常磐 Tokiwa — evergreen */ 112 + --season-cyan: #008899; /* 納戸 Nando — storage blue */ 113 + --season-purple: #884898; /* 紫 Murasaki — purple */ 114 + --season-brown: #6F514C; /* 煤竹 Susutake — sooty bamboo */ 115 + } 116 + 117 + /* Arc 4: 夏から秋へ Summer to Autumn — seasons 36–47 (Aug 7 – Oct 2) 118 + Cool winds, cicadas, dew, swallows leaving */ 119 + [data-microseason="36"], [data-microseason="37"], [data-microseason="38"], 120 + [data-microseason="39"], [data-microseason="40"], [data-microseason="41"], 121 + [data-microseason="42"], [data-microseason="43"], [data-microseason="44"], 122 + [data-microseason="45"], [data-microseason="46"], [data-microseason="47"] { 123 + --season-red: #B7282E; /* 茜 Akane — madder red */ 124 + --season-orange: #C88D36; /* 枇杷 Biwa — loquat */ 125 + --season-yellow: #E6B422; /* 金 Kin — gold */ 126 + --season-green: #928C36; /* 鶯 Uguisu — warbler olive */ 127 + --season-cyan: #7EBEA5; /* 青磁 Seiji — celadon */ 128 + --season-purple: #C4A3BF; /* 薄紫 Usumurasaki — light purple */ 129 + --season-brown: #A58F86; /* 胡桃 Kurumi — walnut */ 130 + } 131 + 132 + /* Arc 5: 秋深まる Deep Autumn — seasons 48–59 (Oct 3 – Dec 1) 133 + Chrysanthemums, frost, maples, camellias, north wind */ 134 + [data-microseason="48"], [data-microseason="49"], [data-microseason="50"], 135 + [data-microseason="51"], [data-microseason="52"], [data-microseason="53"], 136 + [data-microseason="54"], [data-microseason="55"], [data-microseason="56"], 137 + [data-microseason="57"], [data-microseason="58"], [data-microseason="59"] { 138 + --season-red: #7E2639; /* 蘇芳 Suō — dark red */ 139 + --season-orange: #BF783A; /* 琥珀 Kohaku — amber */ 140 + --season-yellow: #DEB068; /* 飴 Ame — honey amber */ 141 + --season-green: #707C74; /* 利休鼠 Rikyūnezumi — tea grey */ 142 + --season-cyan: #81C7D4; /* 水 Mizu — water */ 143 + --season-purple: #5654A2; /* 群青 Gunjō — ultramarine */ 144 + --season-brown: #762F07; /* 栗 Kuri — chestnut */ 145 + } 146 + 147 + /* Arc 6: 冬籠り Winter Retreat — seasons 60–71 (Dec 2 – Feb 3) 148 + Bears hibernate, salmon, snow, ice, first signs of spring */ 149 + [data-microseason="60"], [data-microseason="61"], [data-microseason="62"], 150 + [data-microseason="63"], [data-microseason="64"], [data-microseason="65"], 151 + [data-microseason="66"], [data-microseason="67"], [data-microseason="68"], 152 + [data-microseason="69"], [data-microseason="70"], [data-microseason="71"] { 153 + --season-red: #B94047; /* 臙脂 Enji — rouge */ 154 + --season-orange: #9B6900; /* 狐 Kitsune — fox */ 155 + --season-yellow: #C39143; /* 黄土 Ōdo — ochre */ 156 + --season-green: #00552E; /* 深緑 Fukamidori — deep green */ 157 + --season-cyan: #81C7D4; /* 水 Mizu — water */ 158 + --season-purple: #223A70; /* 紺 Kon — dark navy */ 159 + --season-brown: #6A432D; /* 檜皮 Hiwada — cypress bark */ 160 + } 161 + 162 + /* =================================================================== 163 + INDIVIDUAL MICRO-SEASON PRIMARY COLORS 164 + Each season's signature color from the 伝統色 palette 165 + =================================================================== */ 166 + 167 + /* ── 立春 Risshun — Beginning of Spring ── */ 168 + [data-microseason="0"] { --season-primary: #2792C3; } /* 縹 Hanada — clear sky over melting ice */ 169 + [data-microseason="1"] { --season-primary: #928C36; } /* 鶯 Uguisu — bush warbler olive */ 170 + [data-microseason="2"] { --season-primary: #81C7D4; } /* 水 Mizu — fish emerging from ice */ 171 + 172 + /* ── 雨水 Usui — Rain Water ── */ 173 + [data-microseason="3"] { --season-primary: #6B9362; } /* 若竹 Wakatake — rain moistens earth */ 174 + [data-microseason="4"] { --season-primary: #BAB8D3; } /* 藤 Fuji — lingering mist */ 175 + [data-microseason="5"] { --season-primary: #AACF53; } /* 萌黄 Moegi — first sprouts */ 176 + 177 + /* ── 啓蟄 Keichitsu — Awakening of Insects ── */ 178 + [data-microseason="6"] { --season-primary: #3EB370; } /* 翠 Midori — earth awakening */ 179 + [data-microseason="7"] { --season-primary: #F58F98; } /* 桃 Momo — peach blossoms */ 180 + [data-microseason="8"] { --season-primary: #E7609E; } /* 牡丹 Botan — butterflies emerging */ 181 + 182 + /* ── 春分 Shunbun — Spring Equinox ── */ 183 + [data-microseason="9"] { --season-primary: #EB6101; } /* 朱 Shu — sparrow's warmth */ 184 + [data-microseason="10"] { --season-primary: #F2666C; } /* 薄紅 Usubeni — cherry blossoms */ 185 + [data-microseason="11"] { --season-primary: #5654A2; } /* 群青 Gunjō — thunder sky */ 186 + 187 + /* ── 清明 Seimei — Clear and Bright ── */ 188 + [data-microseason="12"] { --season-primary: #1E50A2; } /* 瑠璃 Ruri — swallows in lapis sky */ 189 + [data-microseason="13"] { --season-primary: #2792C3; } /* 縹 Hanada — geese in open sky */ 190 + [data-microseason="14"] { --season-primary: #E95295; } /* 躑躅 Tsutsuji — first rainbow */ 191 + 192 + /* ── 穀雨 Kokuu — Grain Rain ── */ 193 + [data-microseason="15"] { --season-primary: #B0CA71; } /* 苗 Nae — reeds sprouting */ 194 + [data-microseason="16"] { --season-primary: #AACF53; } /* 萌黄 Moegi — rice seedlings */ 195 + [data-microseason="17"] { --season-primary: #E7609E; } /* 牡丹 Botan — peonies bloom */ 196 + 197 + /* ── 立夏 Rikka — Beginning of Summer ── */ 198 + [data-microseason="18"] { --season-primary: #3EB370; } /* 翠 Midori — frogs in paddy fields */ 199 + [data-microseason="19"] { --season-primary: #007B43; } /* 常磐 Tokiwa — rich earth */ 200 + [data-microseason="20"] { --season-primary: #6B9362; } /* 若竹 Wakatake — bamboo shoots */ 201 + 202 + /* ── 小満 Shōman — Grain Buds ── */ 203 + [data-microseason="21"] { --season-primary: #C5C56A; } /* 抹茶 Matcha — silkworms on mulberry */ 204 + [data-microseason="22"] { --season-primary: #EB6101; } /* 朱 Shu — safflowers bloom */ 205 + [data-microseason="23"] { --season-primary: #E6B422; } /* 金 Kin — golden wheat */ 206 + 207 + /* ── 芒種 Bōshu — Grain in Ear ── */ 208 + [data-microseason="24"] { --season-primary: #65A16E; } /* 松 Matsu — mantis in foliage */ 209 + [data-microseason="25"] { --season-primary: #C3D825; } /* 若草 Wakakusa — luminous fireflies */ 210 + [data-microseason="26"] { --season-primary: #C88D36; } /* 枇杷 Biwa — plums turning gold */ 211 + 212 + /* ── 夏至 Geshi — Summer Solstice ── */ 213 + [data-microseason="27"] { --season-primary: #BF783A; } /* 琥珀 Kohaku — withering amber */ 214 + [data-microseason="28"] { --season-primary: #674196; } /* 菖蒲 Ayame — irises bloom */ 215 + [data-microseason="29"] { --season-primary: #3EB370; } /* 翠 Midori — crow-dipper sprouts */ 216 + 217 + /* ── 小暑 Shōsho — Minor Heat ── */ 218 + [data-microseason="30"] { --season-primary: #EB6101; } /* 朱 Shu — warm winds */ 219 + [data-microseason="31"] { --season-primary: #F5B1AA; } /* 珊瑚 Sango — lotus blossoms */ 220 + [data-microseason="32"] { --season-primary: #165E83; } /* 藍 Ai — hawk in indigo sky */ 221 + 222 + /* ── 大暑 Taisho — Major Heat ── */ 223 + [data-microseason="33"] { --season-primary: #884898; } /* 紫 Murasaki — paulownia flowers */ 224 + [data-microseason="34"] { --season-primary: #007B43; } /* 常磐 Tokiwa — humid lush green */ 225 + [data-microseason="35"] { --season-primary: #1E50A2; } /* 瑠璃 Ruri — deep rain blue */ 226 + 227 + /* ── 立秋 Risshū — Beginning of Autumn ── */ 228 + [data-microseason="36"] { --season-primary: #7EBEA5; } /* 青磁 Seiji — cool celadon winds */ 229 + [data-microseason="37"] { --season-primary: #C4A3BF; } /* 薄紫 Usumurasaki — evening cicadas */ 230 + [data-microseason="38"] { --season-primary: #97867C; } /* 銀鼠 Ginnezumi — thick fog */ 231 + 232 + /* ── 処暑 Shosho — End of Heat ── */ 233 + [data-microseason="39"] { --season-primary: #F5B1AA; } /* 珊瑚 Sango — cotton blooms */ 234 + [data-microseason="40"] { --season-primary: #707C74; } /* 利休鼠 Rikyūnezumi — heat subsides */ 235 + [data-microseason="41"] { --season-primary: #E6B422; } /* 金 Kin — golden rice */ 236 + 237 + /* ── 白露 Hakuro — White Dew ── */ 238 + [data-microseason="42"] { --season-primary: #BAB8D3; } /* 藤 Fuji — morning dew */ 239 + [data-microseason="43"] { --season-primary: #928C36; } /* 鶯 Uguisu — wagtail song */ 240 + [data-microseason="44"] { --season-primary: #1E50A2; } /* 瑠璃 Ruri — swallows depart */ 241 + 242 + /* ── 秋分 Shūbun — Autumn Equinox ── */ 243 + [data-microseason="45"] { --season-primary: #5654A2; } /* 群青 Gunjō — thunder ceases */ 244 + [data-microseason="46"] { --season-primary: #6F514C; } /* 煤竹 Susutake — insects underground */ 245 + [data-microseason="47"] { --season-primary: #C39143; } /* 黄土 Ōdo — fields drain, ochre earth */ 246 + 247 + /* ── 寒露 Kanro — Cold Dew ── */ 248 + [data-microseason="48"] { --season-primary: #97867C; } /* 銀鼠 Ginnezumi — grey autumn sky */ 249 + [data-microseason="49"] { --season-primary: #F8B500; } /* 山吹 Yamabuki — chrysanthemums */ 250 + [data-microseason="50"] { --season-primary: #6F514C; } /* 煤竹 Susutake — quiet crickets */ 251 + 252 + /* ── 霜降 Sōkō — Frost Falls ── */ 253 + [data-microseason="51"] { --season-primary: #BAB8D3; } /* 藤 Fuji — frosty lavender */ 254 + [data-microseason="52"] { --season-primary: #7D7D7D; } /* 鼠 Nezumi — autumn rain grey */ 255 + [data-microseason="53"] { --season-primary: #D57835; } /* 朽葉 Kuchiba — maple leaves turn */ 256 + 257 + /* ── 立冬 Rittō — Beginning of Winter ── */ 258 + [data-microseason="54"] { --season-primary: #D7003A; } /* 紅 Kurenai — camellia red */ 259 + [data-microseason="55"] { --season-primary: #7D7D7D; } /* 鼠 Nezumi — frozen earth */ 260 + [data-microseason="56"] { --season-primary: #F8B500; } /* 山吹 Yamabuki — daffodils */ 261 + 262 + /* ── 小雪 Shōsetsu — Minor Snow ── */ 263 + [data-microseason="57"] { --season-primary: #5654A2; } /* 群青 Gunjō — rainbows hide */ 264 + [data-microseason="58"] { --season-primary: #97867C; } /* 銀鼠 Ginnezumi — bare branches */ 265 + [data-microseason="59"] { --season-primary: #EE7800; } /* 橙 Daidai — citrus yellows */ 266 + 267 + /* ── 大雪 Taisetsu — Major Snow ── */ 268 + [data-microseason="60"] { --season-primary: #223A70; } /* 紺 Kon — deep winter navy */ 269 + [data-microseason="61"] { --season-primary: #6A432D; } /* 檜皮 Hiwada — hibernation brown */ 270 + [data-microseason="62"] { --season-primary: #EB6101; } /* 朱 Shu — salmon red */ 271 + 272 + /* ── 冬至 Tōji — Winter Solstice ── */ 273 + [data-microseason="63"] { --season-primary: #007B43; } /* 常磐 Tokiwa — green amidst snow */ 274 + [data-microseason="64"] { --season-primary: #A58F86; } /* 胡桃 Kurumi — deer antler tan */ 275 + [data-microseason="65"] { --season-primary: #81C7D4; } /* 水 Mizu — snow and ice */ 276 + 277 + /* ── 小寒 Shōkan — Minor Cold ── */ 278 + [data-microseason="66"] { --season-primary: #65A16E; } /* 松 Matsu — parsley green */ 279 + [data-microseason="67"] { --season-primary: #2792C3; } /* 縹 Hanada — springs thaw */ 280 + [data-microseason="68"] { --season-primary: #3EB370; } /* 翠 Midori — pheasant green */ 281 + 282 + /* ── 大寒 Daikan — Major Cold ── */ 283 + [data-microseason="69"] { --season-primary: #AACF53; } /* 萌黄 Moegi — butterbur buds */ 284 + [data-microseason="70"] { --season-primary: #165E83; } /* 藍 Ai — deep frozen blue */ 285 + [data-microseason="71"] { --season-primary: #BF783A; } /* 琥珀 Kohaku — amber warmth returns */ 286 + 287 + 288 + /* =================================================================== 289 + DARK MODE — system preference 290 + Grayscale inverts; accents brighten via color-mix 291 + =================================================================== */ 292 + @media (prefers-color-scheme: dark) { 293 + :root:not([data-theme="light"]) { 294 + --base00: #1a1918; 295 + --base01: #2a2825; 296 + --base02: #3a3835; 297 + --base03: #5a5752; 298 + --base04: #8a8680; 299 + --base05: #f0ede8; 300 + --base06: #faf8f4; 301 + --base07: #ffffff; 302 + 303 + --base08: color-mix(in oklch, var(--season-red), white 18%); 304 + --base09: color-mix(in oklch, var(--season-orange), white 18%); 305 + --base0A: color-mix(in oklch, var(--season-yellow), white 12%); 306 + --base0B: color-mix(in oklch, var(--season-green), white 18%); 307 + --base0C: color-mix(in oklch, var(--season-cyan), white 12%); 308 + --base0D: color-mix(in oklch, var(--season-primary), white 18%); 309 + --base0E: color-mix(in oklch, var(--season-purple), white 18%); 310 + --base0F: color-mix(in oklch, var(--season-brown), white 18%); 311 + 312 + --theme-surface-border: 1px solid rgba(255, 255, 255, 0.15); 313 + --theme-surface-ring: 0 0 0 1px rgba(0, 0, 0, 0.4); 314 + } 315 + } 316 + 317 + 318 + /* ========== Forced Light Mode ========== */ 319 + [data-theme="light"] { 320 + --base00: #f8f7f4; 321 + --base01: #ffffff; 322 + --base02: #e8e4de; 323 + --base03: #a09a90; 324 + --base04: #706a60; 325 + --base05: #2d2b28; 326 + --base06: #1a1917; 327 + --base07: #0f0e0d; 328 + 329 + --base08: var(--season-red); 330 + --base09: var(--season-orange); 331 + --base0A: var(--season-yellow); 332 + --base0B: var(--season-green); 333 + --base0C: var(--season-cyan); 334 + --base0D: var(--season-primary); 335 + --base0E: var(--season-purple); 336 + --base0F: var(--season-brown); 337 + 338 + --theme-surface-border: 1px solid rgba(0, 0, 0, 0.10); 339 + --theme-surface-ring: 0 0 0 1px rgba(0, 0, 0, 0.06); 340 + } 341 + 342 + 343 + /* ========== Forced Dark Mode ========== */ 344 + [data-theme="dark"] { 345 + --base00: #1a1918; 346 + --base01: #2a2825; 347 + --base02: #3a3835; 348 + --base03: #5a5752; 349 + --base04: #8a8680; 350 + --base05: #f0ede8; 351 + --base06: #faf8f4; 352 + --base07: #ffffff; 353 + 354 + --base08: color-mix(in oklch, var(--season-red), white 18%); 355 + --base09: color-mix(in oklch, var(--season-orange), white 18%); 356 + --base0A: color-mix(in oklch, var(--season-yellow), white 12%); 357 + --base0B: color-mix(in oklch, var(--season-green), white 18%); 358 + --base0C: color-mix(in oklch, var(--season-cyan), white 12%); 359 + --base0D: color-mix(in oklch, var(--season-primary), white 18%); 360 + --base0E: color-mix(in oklch, var(--season-purple), white 18%); 361 + --base0F: color-mix(in oklch, var(--season-brown), white 18%); 362 + 363 + --theme-surface-border: 1px solid rgba(255, 255, 255, 0.15); 364 + --theme-surface-ring: 0 0 0 1px rgba(0, 0, 0, 0.4); 365 + }
+30 -1
preload.js
··· 1064 1064 } 1065 1065 })(); 1066 1066 1067 + // Set data-microseason attribute for season-aware themes (e.g. 七十二候) 1068 + (() => { try { 1069 + // 72 microseason start dates [month, day], starting from Risshun (Feb 4) 1070 + const S = [ 1071 + [2,4],[2,9],[2,14],[2,19],[2,24],[3,1], 1072 + [3,6],[3,11],[3,16],[3,21],[3,26],[3,31], 1073 + [4,5],[4,10],[4,15],[4,20],[4,25],[4,30], 1074 + [5,5],[5,10],[5,15],[5,21],[5,26],[5,31], 1075 + [6,5],[6,11],[6,16],[6,21],[6,26],[7,1], 1076 + [7,7],[7,12],[7,17],[7,23],[7,28],[8,2], 1077 + [8,7],[8,12],[8,18],[8,23],[8,28],[9,2], 1078 + [9,7],[9,12],[9,17],[9,23],[9,28],[10,3], 1079 + [10,8],[10,13],[10,18],[10,23],[10,28],[11,2], 1080 + [11,7],[11,12],[11,17],[11,22],[11,27],[12,2], 1081 + [12,7],[12,12],[12,17],[12,22],[12,27],[1,1], 1082 + [1,5],[1,10],[1,15],[1,20],[1,25],[1,30] 1083 + ]; 1084 + // Normalize dates to "season year" starting Feb 4 = day 0 1085 + const dim = [0,31,28,31,30,31,30,31,31,30,31,30,31]; 1086 + const doy = (m, d) => { let t = d; for (let i = 1; i < m; i++) t += dim[i]; return t; }; 1087 + const toSD = (m, d) => (doy(m, d) - 35 + 365) % 365; // 35 = doy(2,4) 1088 + const now = new Date(); 1089 + const key = toSD(now.getMonth() + 1, now.getDate()); 1090 + let idx = 0; 1091 + for (let i = S.length - 1; i >= 0; i--) { 1092 + if (key >= toSD(S[i][0], S[i][1])) { idx = i; break; } 1093 + } 1094 + document.documentElement.setAttribute('data-microseason', String(idx)); 1095 + } catch (e) { console.error('[preload] microseason error:', e); } })(); 1096 + 1067 1097 // Auto-apply persisted color scheme preference for this URL 1068 1098 window.addEventListener('DOMContentLoaded', async () => { 1069 1099 try { ··· 1094 1124 */ 1095 1125 function reloadStylesheets() { 1096 1126 const timestamp = Date.now(); 1097 - 1098 1127 // Reload <link> stylesheets by removing and re-adding them 1099 1128 // This is more aggressive than just changing href and ensures @imports are re-fetched 1100 1129 document.querySelectorAll('link[rel="stylesheet"]').forEach(link => {