11import type { PageHeadTemplate } from '@purestack/ts-common'
22import { Style } from '@purestack/ts-css'
33import { h } from '@purestack/ts-html'
4+ import { createStudioLandingPalette } from './studioLandingColors'
45import { createStudioDarkPalette } from './studioSkinDark'
56import { createStudioLightPalette } from './studioSkinLight'
67import {
@@ -15,17 +16,23 @@ export function buildSiteColorInitScript() {
1516 return `(()=>{let c=${ JSON . stringify ( DEFAULT_SITE_COLOR ) } ;try{let s=localStorage.getItem(${ JSON . stringify ( SITE_COLOR_STORAGE_KEY ) } );if(${ ids } .includes(s))c=s}catch{}document.documentElement.setAttribute("data-site-color",c)})();`
1617}
1718
18- let criticalStyle : string | undefined
19+ const criticalStyles = new Map < boolean , string > ( )
1920
20- function buildSiteColorCriticalStyle ( ) {
21- if ( criticalStyle ) return criticalStyle
21+ function buildSiteColorCriticalStyle ( landing : boolean ) {
22+ const cached = criticalStyles . get ( landing )
23+ if ( cached ) return cached
2224 const root = new Style ( )
25+ if ( landing ) registerLandingInitialColors ( root )
2326 for ( const preset of studioColorPresets ) {
24- const light = createStudioLightPalette ( preset , preset . layers . light )
25- const dark = createStudioDarkPalette ( preset , preset . layers . dark )
27+ const light = landing
28+ ? createStudioLandingPalette ( 'light' , preset )
29+ : createStudioLightPalette ( preset , preset . layers . light )
30+ const dark = landing
31+ ? createStudioLandingPalette ( 'dark' , preset )
32+ : createStudioDarkPalette ( preset , preset . layers . dark )
2633 const lightCanvas = light . semanticTone . neutral . canvas
2734 const darkCanvas = dark . semanticTone . neutral . canvas
28- const selector = `html[data-site-color="${ preset . id } "]`
35+ const selector = `html:root [data-site-color="${ preset . id } "]`
2936 root . select ( selector ) . background ( lightCanvas )
3037 root
3138 . media ( 'prefers-color-scheme: dark' )
@@ -34,19 +41,34 @@ function buildSiteColorCriticalStyle() {
3441 root . select ( `${ selector } [data-theme="light"]` ) . background ( lightCanvas )
3542 root . select ( `${ selector } [data-theme="dark"]` ) . background ( darkCanvas )
3643 }
37- criticalStyle = root . toCSS ( )
44+ const criticalStyle = root . toCSS ( )
45+ criticalStyles . set ( landing , criticalStyle )
3846 return criticalStyle
3947}
4048
41- export const renderStudioColorHead : PageHeadTemplate = ( { head } ) => {
49+ function registerLandingInitialColors ( root : Style ) {
50+ const light = createStudioLandingPalette ( 'light' ) . semanticTone . neutral
51+ const dark = createStudioLandingPalette ( 'dark' ) . semanticTone . neutral
52+ root . select ( 'html, body' ) . background ( light . canvas ) . color ( light . text . default )
53+ root
54+ . media ( 'prefers-color-scheme: dark' )
55+ . select ( 'html, body' )
56+ . background ( dark . canvas )
57+ . color ( dark . text . default )
58+ }
59+
60+ export const renderStudioColorHead : PageHeadTemplate = ( {
61+ head,
62+ templateName,
63+ } ) => {
4264 const startup = h ( 'script' )
4365 . attr ( { 'data-site-color-init' : '' } )
4466 . raw ( buildSiteColorInitScript ( ) )
4567 if ( ! head . insertBefore ( 'link' , startup , { rel : 'stylesheet' } ) )
4668 head . push ( startup )
4769 const critical = h ( 'style' )
4870 . attr ( { 'data-site-color-critical' : '' } )
49- . raw ( buildSiteColorCriticalStyle ( ) )
71+ . raw ( buildSiteColorCriticalStyle ( templateName === 'studio' ) )
5072 if ( ! head . insertBefore ( 'link' , critical , { rel : 'stylesheet' } ) )
5173 head . push ( critical )
5274 return head
0 commit comments