@@ -10,9 +10,12 @@ import {
1010 BrandColorLightDark ,
1111 BrandFont ,
1212 BrandLogoExplicitResource ,
13+ BrandLogoSingle ,
14+ BrandLogoUnified ,
1315 BrandNamedLogo ,
1416 BrandNamedThemeColor ,
1517 BrandSingle ,
18+ BrandStringLightDark ,
1619 BrandTypographyOptionsBase ,
1720 BrandTypographyOptionsHeadingsSingle ,
1821 BrandTypographySingle ,
@@ -26,18 +29,13 @@ import { join, relative } from "../../deno_ral/path.ts";
2629import { warnOnce } from "../log.ts" ;
2730import { isCssColorName } from "../css/color-names.ts" ;
2831
29- type CanonicalLogoInfo = {
30- light : BrandLogoExplicitResource ;
31- dark : BrandLogoExplicitResource ;
32- } ;
33-
3432type ProcessedBrandData = {
3533 color : Record < string , string > ;
3634 typography : BrandTypographySingle ;
3735 logo : {
38- small ?: CanonicalLogoInfo ;
39- medium ?: CanonicalLogoInfo ;
40- large ?: CanonicalLogoInfo ;
36+ small ?: BrandLogoExplicitResource ;
37+ medium ?: BrandLogoExplicitResource ;
38+ large ?: BrandLogoExplicitResource ;
4139 images : Record < string , BrandLogoExplicitResource > ;
4240 } ;
4341} ;
@@ -253,30 +251,12 @@ export class Brand {
253251 } ;
254252 }
255253
256- getLogo ( name : BrandNamedLogo ) : CanonicalLogoInfo | undefined {
254+ getLogo ( name : BrandNamedLogo ) : BrandLogoExplicitResource | undefined {
257255 const entry = this . data . logo ?. [ name ] ;
258256 if ( ! entry ) {
259257 return undefined ;
260258 }
261- if ( typeof entry === "string" ) {
262- const res = this . getLogoResource ( entry ) ;
263- return {
264- light : res ,
265- dark : res ,
266- } ;
267- }
268- const lightEntry = entry ?. light
269- ? this . getLogoResource ( entry . light )
270- : undefined ;
271- const darkEntry = entry ?. dark
272- ? this . getLogoResource ( entry . dark )
273- : undefined ;
274- if ( lightEntry && darkEntry ) {
275- return {
276- light : lightEntry ,
277- dark : darkEntry ,
278- } ;
279- }
259+ return this . getLogoResource ( entry ) ;
280260 }
281261}
282262
@@ -295,7 +275,7 @@ export const getFavicon = (brand: Brand): string | undefined => {
295275 if ( ! logoInfo ) {
296276 return undefined ;
297277 }
298- return logoInfo . light . path ;
278+ return logoInfo . path ;
299279} ;
300280
301281function splitColorLightDark (
@@ -307,9 +287,8 @@ function splitColorLightDark(
307287 return bcld ;
308288}
309289
310- function enablesDarkMode ( blcd : BrandColorLightDark ) {
311- return typeof blcd === "object" && "dark" in blcd ;
312- }
290+ const enablesDarkMode = ( x : BrandColorLightDark | BrandStringLightDark ) =>
291+ typeof x === "object" && x ?. dark ;
313292
314293export function brandHasDarkMode ( brand : BrandUnified ) : boolean {
315294 if ( brand . color ) {
@@ -324,7 +303,7 @@ export function brandHasDarkMode(brand: BrandUnified): boolean {
324303 }
325304 if ( brand . typography ) {
326305 for ( const elementName of Zod . BrandNamedTypographyElements . options ) {
327- const element = brand . typography ! [ elementName ] ;
306+ const element = brand . typography [ elementName ] ;
328307 if ( ! element || typeof element === "string" ) {
329308 continue ;
330309 }
@@ -342,6 +321,17 @@ export function brandHasDarkMode(brand: BrandUnified): boolean {
342321 }
343322 }
344323 }
324+ if ( brand . logo ) {
325+ for ( const logoName of Zod . BrandNamedLogo . options ) {
326+ const logo = brand . logo [ logoName ] ;
327+ if ( ! logo || typeof logo === "string" ) {
328+ continue ;
329+ }
330+ if ( enablesDarkMode ( logo ) ) {
331+ return true ;
332+ }
333+ }
334+ }
345335 return false ;
346336}
347337
@@ -367,6 +357,25 @@ function sharedTypography(
367357 }
368358 return ret ;
369359}
360+
361+ function splitLogo (
362+ unifiedLogo : BrandLogoUnified ,
363+ ) : { light : BrandLogoSingle ; dark : BrandLogoSingle } {
364+ const light : BrandLogoSingle = { images : unifiedLogo . images } ,
365+ dark : BrandLogoSingle = { images : unifiedLogo . images } ;
366+ for ( const logoName of Zod . BrandNamedLogo . options ) {
367+ if ( unifiedLogo [ logoName ] ) {
368+ if ( typeof unifiedLogo [ logoName ] === "string" ) {
369+ light [ logoName ] = dark [ logoName ] = unifiedLogo [ logoName ] ;
370+ continue ;
371+ }
372+ ( { light : light [ logoName ] , dark : dark [ logoName ] } =
373+ unifiedLogo [ logoName ] ) ;
374+ }
375+ }
376+ return { light, dark } ;
377+ }
378+
370379export function splitUnifiedBrand (
371380 unified : unknown ,
372381 brandDir : string ,
@@ -506,18 +515,19 @@ export function splitUnifiedBrand(
506515 linkBackgroundColor [ mode ] ,
507516 } ,
508517 } ;
518+ const logos = unifiedBrand . logo && splitLogo ( unifiedBrand . logo ) ;
509519 const lightBrand : BrandSingle = {
510520 meta : unifiedBrand . meta ,
511521 color : { palette : unifiedBrand . color && { ...unifiedBrand . color . palette } } ,
512522 typography : typography && specializeTypography ( typography , "light" ) ,
513- logo : unifiedBrand . logo ,
523+ logo : logos && logos . light ,
514524 defaults : unifiedBrand . defaults ,
515525 } ;
516526 const darkBrand : BrandSingle = {
517527 meta : unifiedBrand . meta ,
518528 color : { palette : unifiedBrand . color && { ...unifiedBrand . color . palette } } ,
519529 typography : typography && specializeTypography ( typography , "dark" ) ,
520- logo : unifiedBrand . logo ,
530+ logo : logos && logos . dark ,
521531 defaults : unifiedBrand . defaults ,
522532 } ;
523533 if ( unifiedBrand . color ) {
0 commit comments