@@ -30,6 +30,24 @@ class CoCreateFileSystem {
3030 try {
3131 const hostname = urlObject . hostname ;
3232
33+ // --- determine preferred color scheme from browser headers ---
34+ let theme ;
35+ const headerValue =
36+ ( req && req . headers && (
37+ req . headers [ "sec-ch-prefers-color-scheme" ] ||
38+ req . headers [ "prefers-color-scheme" ] ||
39+ req . headers [ "x-prefers-color-scheme" ] ||
40+ req . headers [ "x-color-scheme" ]
41+ ) ) ;
42+ if ( typeof headerValue === "string" ) {
43+ // take first token, strip quotes, normalize
44+ const token = headerValue . split ( "," ) [ 0 ] . trim ( ) . replace ( / ^ " | " $ / g, "" ) . toLowerCase ( ) ;
45+ if ( token === "dark" || token === "light" ) theme = token ;
46+ }
47+ // optional: expose detected theme to clients / downstream code
48+ if ( theme ) res . setHeader ( "X-Preferred-Color-Scheme" , theme ) ;
49+ // --- end theme detection ---
50+
3351 let data = {
3452 method : "object.read" ,
3553 host : hostname ,
@@ -239,12 +257,14 @@ class CoCreateFileSystem {
239257 try {
240258 let data = { } ;
241259
260+ // pass detected theme (may be undefined) into server-side renderer
242261 src = await this . render . HTML (
243262 file ,
244263 organization ,
245264 urlObject ,
246265 langRegion ,
247- lang
266+ lang ,
267+ theme
248268 ) ;
249269 } catch ( err ) {
250270 console . warn ( "server-side-render: " + err . message ) ;
@@ -289,6 +309,16 @@ class CoCreateFileSystem {
289309
290310 // Always override/set Cache-Control header so the response aligns with the file metadata/defaults
291311 headers [ "Cache-Control" ] = cacheControl ;
312+ // Advertise that we accept the Sec-CH-Prefers-Color-Scheme client hint.
313+ // After the browser sees this in a response it may include
314+ // the Sec-CH-Prefers-Color-Scheme header on subsequent requests.
315+ headers [ "Accept-CH" ] = "Sec-CH-Prefers-Color-Scheme" ;
316+ // optional: tell browser how long to remember this preference (seconds)
317+ headers [ "Accept-CH-Lifetime" ] = "86400" ;
318+ // ensure caches/proxies vary responses by this hint
319+ headers [ "Vary" ] = headers [ "Vary" ]
320+ ? headers [ "Vary" ] + ", Sec-CH-Prefers-Color-Scheme"
321+ : "Sec-CH-Prefers-Color-Scheme" ;
292322
293323 if ( src instanceof Uint8Array || Buffer . isBuffer ( src ) ) {
294324 // Ensure binary data is sent as-is
0 commit comments