From 3fa7aba1e8d3268b11b30dfe7a9791b755466daa Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Wed, 4 Dec 2024 16:17:54 +0100 Subject: [PATCH 01/17] First pass: use `tint` instead of `primary-base` --- .../DocumentView/OpenAPI/scalar.css | 12 +-- .../RootLayout/CustomizationRootLayout.tsx | 102 +++++++++++++----- .../src/components/RootLayout/globals.css | 53 +++------ packages/gitbook/tailwind.config.ts | 12 ++- 4 files changed, 103 insertions(+), 76 deletions(-) diff --git a/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css b/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css index 91ce96fe7a..5f748dd65f 100644 --- a/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css +++ b/packages/gitbook/src/components/DocumentView/OpenAPI/scalar.css @@ -5,7 +5,7 @@ .light .scalar { --scalar-color-1: color-mix( in srgb, - rgb(var(--primary-base-300, 180 180 180)), + rgb(var(--tint-color-300, 180 180 180)), rgb(var(--dark-base, 23 23 23)) 96% ); --scalar-color-2: color-mix( @@ -23,12 +23,12 @@ --scalar-background-1: rgb(var(--light-base, 255 255 255)); --scalar-background-2: color-mix( in srgb, - rgb(var(--primary-base-800, 30 30 30)), + rgb(var(--tint-color-800, 30 30 30)), var(--scalar-background-1) 96% ); --scalar-background-3: color-mix( in srgb, - rgb(var(--primary-base-800, 30 30 30)), + rgb(var(--tint-color-800, 30 30 30)), var(--scalar-background-1) 90% ); --scalar-background-accent: #007d9c1f; @@ -66,7 +66,7 @@ .dark .scalar { --scalar-color-1: color-mix( in srgb, - rgb(var(--primary-base-700, 70 70 70)), + rgb(var(--tint-color-700, 70 70 70)), rgb(var(--light-base, 255 255 255)) 100% ); --scalar-color-2: color-mix( @@ -84,12 +84,12 @@ --scalar-background-1: rgb(var(--dark-base, 22 22 22)); --scalar-background-2: color-mix( in srgb, - rgb(var(--primary-base-200, 200 200 200)), + rgb(var(--tint-color-200, 200 200 200)), var(--scalar-background-1) 92% ); --scalar-background-3: color-mix( in srgb, - rgb(var(--primary-base-200, 200 200 200)), + rgb(var(--tint-color-200, 200 200 200)), var(--scalar-background-1) 88% ); --scalar-background-accent: #8ab4f81f; diff --git a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx index 5b280374ed..3b5873ad6d 100644 --- a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx +++ b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx @@ -36,26 +36,23 @@ export async function CustomizationRootLayout(props: { const headerTheme = generateHeaderTheme(customization); const language = getSpaceLanguage(customization); + const defaultTintColor = '#787878'; + + console.log('====customization', customization); + return ( {customization.privacyPolicy.url ? ( @@ -88,9 +85,27 @@ export async function CustomizationRootLayout(props: { } ${generateColorVariable( - 'primary-base', - customization.styling.primaryColor.light, + 'tint-color', + customization.styling.tint?.color.light ?? defaultTintColor, )} + ${ + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-tint', + Object.fromEntries( + Object.entries( + shadesOfColor( + customization.styling.tint?.color.light ?? + defaultTintColor, + ), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } + ${generateColorVariable( 'header-background', headerTheme.backgroundColor.light, @@ -103,10 +118,6 @@ export async function CustomizationRootLayout(props: { 'primary-color', customization.styling.primaryColor.dark, )} - ${generateColorVariable( - 'primary-base', - customization.styling.primaryColor.dark, - )} ${ // Generate the right contrast color for each shade of primary-color generateColorVariable( @@ -121,6 +132,29 @@ export async function CustomizationRootLayout(props: { ), ) } + + ${generateColorVariable( + 'tint-color', + customization.styling.tint?.color.dark ?? defaultTintColor, + )} + ${ + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-tint', + Object.fromEntries( + Object.entries( + shadesOfColor( + customization.styling.tint?.color.dark ?? + defaultTintColor, + ), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } + ${generateColorVariable( 'header-background', headerTheme.backgroundColor.dark, @@ -194,17 +228,23 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz case CustomizationHeaderPreset.Bold: { return { backgroundColor: { - light: customization.styling.primaryColor.light, - dark: customization.styling.primaryColor.dark, + light: + customization.styling.tint?.color.light ?? + customization.styling.primaryColor.light, + dark: + customization.styling.tint?.color.dark ?? + customization.styling.primaryColor.dark, }, linkColor: { light: colorContrast( - customization.styling.primaryColor.light, + customization.styling.tint?.color.light ?? + customization.styling.primaryColor.light, [colors.white, colors.black], 'aaa', ), dark: colorContrast( - customization.styling.primaryColor.dark, + customization.styling.tint?.color.dark ?? + customization.styling.primaryColor.dark, [colors.white, colors.black], 'aaa', ), @@ -226,14 +266,22 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz case CustomizationHeaderPreset.Custom: { return { backgroundColor: { - light: customization.header.backgroundColor?.light ?? colors.white, - dark: customization.header.backgroundColor?.dark ?? colors.black, + light: + customization.styling.tint?.color.light ?? + customization.header.backgroundColor?.light ?? + colors.white, + dark: + customization.styling.tint?.color.dark ?? + customization.header.backgroundColor?.dark ?? + colors.black, }, linkColor: { light: + customization.styling.tint?.color.light ?? customization.header.linkColor?.light ?? customization.styling.primaryColor.light, dark: + customization.styling.tint?.color.dark ?? customization.header.linkColor?.dark ?? customization.styling.primaryColor.dark, }, diff --git a/packages/gitbook/src/components/RootLayout/globals.css b/packages/gitbook/src/components/RootLayout/globals.css index 4b5f7b3df3..3ddc374496 100644 --- a/packages/gitbook/src/components/RootLayout/globals.css +++ b/packages/gitbook/src/components/RootLayout/globals.css @@ -7,27 +7,19 @@ --scrollbar-width: calc(100vw - 100%); --dark-base: 20 20 20; - --light-base: 251 252 252; - - --light-1: color-mix(in srgb, rgb(var(--primary-base-600)), rgb(var(--light-base)) 99%); - --light-DEFAULT: color-mix( - in srgb, - rgb(var(--primary-base-700)), - rgb(var(--light-base)) 96% - ); - --light-2: color-mix(in srgb, rgb(var(--primary-base-800)), rgb(var(--light-base)) 92%); - --light-3: color-mix(in srgb, rgb(var(--primary-base-800)), rgb(var(--light-base)) 88%); - --light-4: color-mix(in srgb, rgb(var(--primary-base-800)), rgb(var(--light-base)) 72%); + --light-base: 255 255 255; - --dark-1: color-mix(in srgb, rgb(var(--primary-base-100)), rgb(1 1 1) 96%); - --dark-DEFAULT: color-mix( - in srgb, - rgb(var(--primary-base-300)), - rgb(var(--dark-base)) 94.5% - ); - --dark-2: color-mix(in srgb, rgb(var(--primary-base-200)), rgb(var(--dark-base)) 92%); - --dark-3: color-mix(in srgb, rgb(var(--primary-base-200)), rgb(25 25 25) 91%); - --dark-4: color-mix(in srgb, rgb(var(--primary-base-200)), rgb(var(--dark-base)) 64%); + --light-1: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--light-base)) 99%); + --light-DEFAULT: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--light-base)) 96%); + --light-2: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--light-base)) 92%); + --light-3: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--light-base)) 88%); + --light-4: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--light-base)) 72%); + + --dark-1: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--dark-base)) 96%); + --dark-DEFAULT: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--dark-base)) 94.5%); + --dark-2: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--dark-base)) 92%); + --dark-3: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--dark-base)) 91%); + --dark-4: color-mix(in srgb, rgb(var(--tint-color-500)), rgb(var(--dark-base)) 64%); @apply leading-relaxed; } body { @@ -36,29 +28,12 @@ html { @apply gutter-stable; } - html:is(.plain-background) { - --dark-base: 22 22 22; - --light-base: 255 255 255; - /* reset primaries as greys */ - --primary-base-50: 239 239 239; - --primary-base-100: 222 222 222; - --primary-base-200: 200 200 200; - --primary-base-300: 180 180 180; - --primary-base-400: 150 150 150; - --primary-base-500: 120 120 120; - --primary-base-600: 90 90 90; - --primary-base-700: 70 70 70; - --primary-base-800: 30 30 30; - --primary-base-900: 19 19 19; - + html:is(.no-tint) { --light-DEFAULT: color-mix( in srgb, - rgb(var(--primary-base-700)), + rgb(var(--tint-color-500)), rgb(var(--light-base)) 100% ); - --light-2: color-mix(in srgb, rgb(var(--primary-base-800)), rgb(var(--light-base)) 96%); - --light-3: color-mix(in srgb, rgb(var(--primary-base-800)), rgb(var(--light-base)) 90%); - --light-4: color-mix(in srgb, rgb(var(--primary-base-800)), rgb(var(--light-base)) 76%); } h1 { @apply tracking-[-0.025em] text-dark dark:text-light text-balance; diff --git a/packages/gitbook/tailwind.config.ts b/packages/gitbook/tailwind.config.ts index 7a2266b017..3846247ff7 100644 --- a/packages/gitbook/tailwind.config.ts +++ b/packages/gitbook/tailwind.config.ts @@ -72,9 +72,8 @@ const config: Config = { /** primary-color used to accent elements, these colors remain unchanged when toggling between the CustomizationBackground options**/ primary: generateVarShades('primary-color'), 'contrast-primary': generateVarShades('contrast-primary'), - - /** primary-base is an internal color that generates the same colors as primary-color. But it's shades will change into a grayscale if CustomizationBackground.Plain is selected. (globals.css) **/ - primarybase: generateVarShades('primary-base'), + tint: generateVarShades('primary-color'), + 'contrast-tint': generateVarShades('contrast-primary'), 'header-background': generateVarShades('header-background'), 'header-link': generateVarShades('header-link'), @@ -232,7 +231,12 @@ const config: Config = { /** * Variant when the space is configured with a theme matching background. */ - addVariant('plain-background', 'html.plain-background &'); + addVariant('tint', 'html.tint &'); + + /** + * Variant when the space is configured without a theme matching background. + */ + addVariant('no-tint', 'html.no-tint &'); /** * Variant when the page contains a block that will be rendered in full-width mode. From cab2497643b9b1be069dd23955a9314c06024270 Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Wed, 4 Dec 2024 17:37:21 +0100 Subject: [PATCH 02/17] Revert some of the changes to be more conservative --- .../RootLayout/CustomizationRootLayout.tsx | 16 ++++++++++---- .../src/components/RootLayout/globals.css | 22 +++++++++---------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx index 3b5873ad6d..3f54b957c3 100644 --- a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx +++ b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx @@ -38,8 +38,6 @@ export async function CustomizationRootLayout(props: { const defaultTintColor = '#787878'; - console.log('====customization', customization); - return ( Date: Wed, 4 Dec 2024 17:37:52 +0100 Subject: [PATCH 03/17] Format --- packages/gitbook/tailwind.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gitbook/tailwind.config.ts b/packages/gitbook/tailwind.config.ts index 3846247ff7..2f13cc77a7 100644 --- a/packages/gitbook/tailwind.config.ts +++ b/packages/gitbook/tailwind.config.ts @@ -236,7 +236,7 @@ const config: Config = { /** * Variant when the space is configured without a theme matching background. */ - addVariant('no-tint', 'html.no-tint &'); + addVariant('no-tint', 'html.no-tint &'); /** * Variant when the page contains a block that will be rendered in full-width mode. From fc81086cc55b1e128285a308dc0c61101b4a6a3a Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 12:01:51 +0100 Subject: [PATCH 04/17] rebase --- .../RootLayout/CustomizationRootLayout.tsx | 196 +++++++++--------- 1 file changed, 101 insertions(+), 95 deletions(-) diff --git a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx index 3f54b957c3..4e0419ed76 100644 --- a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx +++ b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx @@ -1,9 +1,9 @@ import { - CustomizationBackground, CustomizationCorners, CustomizationHeaderPreset, CustomizationIconsStyle, CustomizationSettings, + CustomizationTint, SiteCustomizationSettings, } from '@gitbook/api'; import { IconsProvider, IconStyle } from '@gitbook/icons'; @@ -17,11 +17,13 @@ import { getStaticFileURL } from '@/lib/assets'; import { hexToRgb, shadesOfColor } from '@/lib/colors'; import { tcls } from '@/lib/tailwind'; -import { ClientContexts } from './ClientContexts'; import { emojiFontClassName } from '../primitives'; +import { ClientContexts } from './ClientContexts'; -import './globals.css'; import '@gitbook/icons/style.css'; +import './globals.css'; + +const DEFAULT_TINT_COLOR = '#787878'; /** * Layout shared between the content and the PDF renderer. @@ -36,7 +38,7 @@ export async function CustomizationRootLayout(props: { const headerTheme = generateHeaderTheme(customization); const language = getSpaceLanguage(customization); - const defaultTintColor = '#787878'; + const tintColor = getTintColor(customization); return ( @@ -64,99 +66,87 @@ export async function CustomizationRootLayout(props: { >{` :root { ${generateColorVariable( - 'primary-color', - customization.styling.primaryColor.light, - )} + 'primary-color', + customization.styling.primaryColor.light, + )} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-primary', - Object.fromEntries( - Object.entries( - shadesOfColor(customization.styling.primaryColor.light), - ).map(([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ]), - ), - ) - } + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-primary', + Object.fromEntries( + Object.entries( + shadesOfColor(customization.styling.primaryColor.light), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } - ${generateColorVariable( - 'tint-color', - customization.styling.tint?.color.light ?? defaultTintColor, - )} + ${generateColorVariable('tint-color', tintColor?.light ?? DEFAULT_TINT_COLOR)} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-tint', - Object.fromEntries( - Object.entries( - shadesOfColor( - customization.styling.tint?.color.light ?? - defaultTintColor, - ), - ).map(([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ]), - ), - ) - } + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-tint', + Object.fromEntries( + Object.entries(shadesOfColor(tintColor?.light || DEFAULT_TINT_COLOR)).map( + ([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ], + ), + ), + ) + } ${generateColorVariable( - 'header-background', - headerTheme.backgroundColor.light, - )} + 'header-background', + headerTheme.backgroundColor.light, + )} ${generateColorVariable('header-link', headerTheme.linkColor.light)} ${generateColorVariable('header-button-text', colorContrast(headerTheme.linkColor.light as string, ['#000', '#fff']))} } .dark { ${generateColorVariable( - 'primary-color', - customization.styling.primaryColor.dark, - )} + 'primary-color', + customization.styling.primaryColor.dark, + )} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-primary', - Object.fromEntries( - Object.entries( - shadesOfColor(customization.styling.primaryColor.dark), - ).map(([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ]), - ), - ) - } + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-primary', + Object.fromEntries( + Object.entries( + shadesOfColor(customization.styling.primaryColor.dark), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } - ${generateColorVariable( - 'tint-color', - customization.styling.tint?.color.dark ?? defaultTintColor, - )} + ${generateColorVariable('tint-color', tintColor?.dark ?? DEFAULT_TINT_COLOR)} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-tint', - Object.fromEntries( - Object.entries( - shadesOfColor( - customization.styling.tint?.color.dark ?? - defaultTintColor, - ), - ).map(([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ]), - ), - ) - } + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-tint', + Object.fromEntries( + Object.entries(shadesOfColor(tintColor?.dark || DEFAULT_TINT_COLOR)).map( + ([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ], + ), + ), + ) + } ${generateColorVariable( - 'header-background', - headerTheme.backgroundColor.dark, - )} + 'header-background', + headerTheme.backgroundColor.dark, + )} ${generateColorVariable('header-link', headerTheme.linkColor.dark)} ${generateColorVariable('header-button-text', colorContrast(headerTheme.linkColor.dark as string, ['#000', '#fff']))} } @@ -192,6 +182,19 @@ export async function CustomizationRootLayout(props: { ); } +/** + * Get the tint color from the customization settings. + * If the tint color is not set or it is a space customization, it will return the default color. + */ +export function getTintColor(customization: CustomizationSettings | SiteCustomizationSettings): CustomizationTint['color'] | undefined { + if ('tint' in customization.styling && customization.styling.tint) { + return { + light: customization.styling.tint?.color.light ?? DEFAULT_TINT_COLOR, + dark: customization.styling.tint?.color.dark ?? DEFAULT_TINT_COLOR, + }; + } +} + type ColorInput = string | Record; function generateColorVariable(name: string, color: ColorInput) { const shades: Record = typeof color === 'string' ? shadesOfColor(color) : color; @@ -209,6 +212,9 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz backgroundColor: { light: ColorInput; dark: ColorInput }; linkColor: { light: ColorInput; dark: ColorInput }; } { + + const tintColor = getTintColor(customization); + switch (customization.header.preset) { case CustomizationHeaderPreset.None: case CustomizationHeaderPreset.Default: { @@ -227,22 +233,22 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz return { backgroundColor: { light: - customization.styling.tint?.color.light ?? + tintColor?.light ?? customization.styling.primaryColor.light, dark: - customization.styling.tint?.color.dark ?? + tintColor?.dark ?? customization.styling.primaryColor.dark, }, linkColor: { light: colorContrast( - customization.styling.tint?.color.light ?? - customization.styling.primaryColor.light, + tintColor?.light ?? + customization.styling.primaryColor.light, [colors.white, colors.black], 'aaa', ), dark: colorContrast( - customization.styling.tint?.color.dark ?? - customization.styling.primaryColor.dark, + tintColor?.dark ?? + customization.styling.primaryColor.dark, [colors.white, colors.black], 'aaa', ), @@ -265,29 +271,29 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz return { backgroundColor: { light: - customization.styling.tint?.color.light ?? + tintColor?.light ?? customization.header.backgroundColor?.light ?? colors.white, dark: - customization.styling.tint?.color.dark ?? + tintColor?.dark ?? customization.header.backgroundColor?.dark ?? colors.black, }, linkColor: { light: customization.header.linkColor?.light ?? - (customization.styling.tint?.color.light && + (tintColor?.light && colorContrast( - customization.styling.tint?.color.light, + tintColor.light, [colors.white, colors.black], 'aaa', )) ?? customization.styling.primaryColor.light, dark: customization.header.linkColor?.dark ?? - (customization.styling.tint?.color.dark && + (tintColor?.dark && colorContrast( - customization.styling.tint?.color.dark, + tintColor.dark, [colors.white, colors.black], 'aaa', )) ?? From eb5fe3d294ae78903eaec50ecfc211226672525e Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Thu, 5 Dec 2024 15:57:28 +0100 Subject: [PATCH 05/17] Tweak colors --- .../RootLayout/CustomizationRootLayout.tsx | 159 ++++++++---------- .../src/components/RootLayout/globals.css | 10 +- 2 files changed, 78 insertions(+), 91 deletions(-) diff --git a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx index 4e0419ed76..0e30082d9c 100644 --- a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx +++ b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx @@ -66,87 +66,87 @@ export async function CustomizationRootLayout(props: { >{` :root { ${generateColorVariable( - 'primary-color', - customization.styling.primaryColor.light, - )} + 'primary-color', + customization.styling.primaryColor.light, + )} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-primary', - Object.fromEntries( - Object.entries( - shadesOfColor(customization.styling.primaryColor.light), - ).map(([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ]), - ), - ) - } + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-primary', + Object.fromEntries( + Object.entries( + shadesOfColor(customization.styling.primaryColor.light), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } ${generateColorVariable('tint-color', tintColor?.light ?? DEFAULT_TINT_COLOR)} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-tint', - Object.fromEntries( - Object.entries(shadesOfColor(tintColor?.light || DEFAULT_TINT_COLOR)).map( - ([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ], - ), - ), - ) - } + // Generate the right contrast color for each shade of tint-color + generateColorVariable( + 'contrast-tint', + Object.fromEntries( + Object.entries( + shadesOfColor(tintColor?.light || DEFAULT_TINT_COLOR), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } ${generateColorVariable( - 'header-background', - headerTheme.backgroundColor.light, - )} + 'header-background', + headerTheme.backgroundColor.light, + )} ${generateColorVariable('header-link', headerTheme.linkColor.light)} ${generateColorVariable('header-button-text', colorContrast(headerTheme.linkColor.light as string, ['#000', '#fff']))} } .dark { ${generateColorVariable( - 'primary-color', - customization.styling.primaryColor.dark, - )} + 'primary-color', + customization.styling.primaryColor.dark, + )} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-primary', - Object.fromEntries( - Object.entries( - shadesOfColor(customization.styling.primaryColor.dark), - ).map(([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ]), - ), - ) - } + // Generate the right contrast color for each shade of primary-color + generateColorVariable( + 'contrast-primary', + Object.fromEntries( + Object.entries( + shadesOfColor(customization.styling.primaryColor.dark), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } ${generateColorVariable('tint-color', tintColor?.dark ?? DEFAULT_TINT_COLOR)} ${ - // Generate the right contrast color for each shade of primary-color - generateColorVariable( - 'contrast-tint', - Object.fromEntries( - Object.entries(shadesOfColor(tintColor?.dark || DEFAULT_TINT_COLOR)).map( - ([index, color]) => [ - index, - colorContrast(color, ['#000', '#fff']), - ], - ), - ), - ) - } + // Generate the right contrast color for each shade of tint-color + generateColorVariable( + 'contrast-tint', + Object.fromEntries( + Object.entries( + shadesOfColor(tintColor?.dark || DEFAULT_TINT_COLOR), + ).map(([index, color]) => [ + index, + colorContrast(color, ['#000', '#fff']), + ]), + ), + ) + } ${generateColorVariable( - 'header-background', - headerTheme.backgroundColor.dark, - )} + 'header-background', + headerTheme.backgroundColor.dark, + )} ${generateColorVariable('header-link', headerTheme.linkColor.dark)} ${generateColorVariable('header-button-text', colorContrast(headerTheme.linkColor.dark as string, ['#000', '#fff']))} } @@ -186,7 +186,9 @@ export async function CustomizationRootLayout(props: { * Get the tint color from the customization settings. * If the tint color is not set or it is a space customization, it will return the default color. */ -export function getTintColor(customization: CustomizationSettings | SiteCustomizationSettings): CustomizationTint['color'] | undefined { +export function getTintColor( + customization: CustomizationSettings | SiteCustomizationSettings, +): CustomizationTint['color'] | undefined { if ('tint' in customization.styling && customization.styling.tint) { return { light: customization.styling.tint?.color.light ?? DEFAULT_TINT_COLOR, @@ -212,7 +214,6 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz backgroundColor: { light: ColorInput; dark: ColorInput }; linkColor: { light: ColorInput; dark: ColorInput }; } { - const tintColor = getTintColor(customization); switch (customization.header.preset) { @@ -232,23 +233,17 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz case CustomizationHeaderPreset.Bold: { return { backgroundColor: { - light: - tintColor?.light ?? - customization.styling.primaryColor.light, - dark: - tintColor?.dark ?? - customization.styling.primaryColor.dark, + light: tintColor?.light ?? customization.styling.primaryColor.light, + dark: tintColor?.dark ?? customization.styling.primaryColor.dark, }, linkColor: { light: colorContrast( - tintColor?.light ?? - customization.styling.primaryColor.light, + tintColor?.light ?? customization.styling.primaryColor.light, [colors.white, colors.black], 'aaa', ), dark: colorContrast( - tintColor?.dark ?? - customization.styling.primaryColor.dark, + tintColor?.dark ?? customization.styling.primaryColor.dark, [colors.white, colors.black], 'aaa', ), @@ -283,20 +278,12 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz light: customization.header.linkColor?.light ?? (tintColor?.light && - colorContrast( - tintColor.light, - [colors.white, colors.black], - 'aaa', - )) ?? + colorContrast(tintColor.light, [colors.white, colors.black], 'aaa')) ?? customization.styling.primaryColor.light, dark: customization.header.linkColor?.dark ?? (tintColor?.dark && - colorContrast( - tintColor.dark, - [colors.white, colors.black], - 'aaa', - )) ?? + colorContrast(tintColor.dark, [colors.white, colors.black], 'aaa')) ?? customization.styling.primaryColor.dark, }, }; diff --git a/packages/gitbook/src/components/RootLayout/globals.css b/packages/gitbook/src/components/RootLayout/globals.css index c90796bd3a..5f7750f4f4 100644 --- a/packages/gitbook/src/components/RootLayout/globals.css +++ b/packages/gitbook/src/components/RootLayout/globals.css @@ -7,17 +7,17 @@ --scrollbar-width: calc(100vw - 100%); --dark-base: 20 20 20; - --light-base: 255 255 255; + --light-base: 251 251 251; --light-1: color-mix(in srgb, rgb(var(--tint-color-600)), rgb(var(--light-base)) 99%); --light-DEFAULT: color-mix(in srgb, rgb(var(--tint-color-700)), rgb(var(--light-base)) 96%); - --light-2: color-mix(in srgb, rgb(var(--tint-color-800)), rgb(var(--light-base)) 94%); + --light-2: color-mix(in srgb, rgb(var(--tint-color-700)), rgb(var(--light-base)) 92%); --light-3: color-mix(in srgb, rgb(var(--tint-color-800)), rgb(var(--light-base)) 88%); --light-4: color-mix(in srgb, rgb(var(--tint-color-800)), rgb(var(--light-base)) 72%); - --dark-1: color-mix(in srgb, rgb(var(--tint-color-100)), rgb(var(--dark-base)) 96%); - --dark-DEFAULT: color-mix(in srgb, rgb(var(--tint-color-100)), rgb(var(--dark-base)) 94.5%); - --dark-2: color-mix(in srgb, rgb(var(--tint-color-200)), rgb(var(--dark-base)) 92%); + --dark-1: color-mix(in srgb, rgb(var(--tint-color-400)), rgb(var(--dark-base)) 96%); + --dark-DEFAULT: color-mix(in srgb, rgb(var(--tint-color-300)), rgb(var(--dark-base)) 94%); + --dark-2: color-mix(in srgb, rgb(var(--tint-color-300)), rgb(var(--dark-base)) 92%); --dark-3: color-mix(in srgb, rgb(var(--tint-color-200)), rgb(var(--dark-base)) 91%); --dark-4: color-mix(in srgb, rgb(var(--tint-color-200)), rgb(var(--dark-base)) 64%); @apply leading-relaxed; From 4ea0a96b9fab217be237891d8d959f44e7c3db17 Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Fri, 6 Dec 2024 13:36:14 +0100 Subject: [PATCH 06/17] Update default light color --- packages/gitbook/src/components/RootLayout/globals.css | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/gitbook/src/components/RootLayout/globals.css b/packages/gitbook/src/components/RootLayout/globals.css index 5f7750f4f4..f4d4544627 100644 --- a/packages/gitbook/src/components/RootLayout/globals.css +++ b/packages/gitbook/src/components/RootLayout/globals.css @@ -29,6 +29,7 @@ @apply gutter-stable; } html:is(.no-tint) { + --light-base: 255 255 255; --light-DEFAULT: color-mix( in srgb, rgb(var(--tint-color-500)), From a1434f32a29daa1c1a6d8fd199af42ac7d16b6e7 Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Fri, 6 Dec 2024 15:01:35 +0100 Subject: [PATCH 07/17] Change order of custom header colors --- .../src/components/RootLayout/CustomizationRootLayout.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx index 0e30082d9c..cbe61a0d37 100644 --- a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx +++ b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx @@ -266,12 +266,12 @@ function generateHeaderTheme(customization: CustomizationSettings | SiteCustomiz return { backgroundColor: { light: - tintColor?.light ?? customization.header.backgroundColor?.light ?? + tintColor?.light ?? colors.white, dark: - tintColor?.dark ?? customization.header.backgroundColor?.dark ?? + tintColor?.dark ?? colors.black, }, linkColor: { From df1361e6ab65e4938cd6547f434339fafd58907e Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Fri, 6 Dec 2024 15:12:46 +0100 Subject: [PATCH 08/17] Add patchset --- .changeset/curvy-carrots-melt.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/curvy-carrots-melt.md diff --git a/.changeset/curvy-carrots-melt.md b/.changeset/curvy-carrots-melt.md new file mode 100644 index 0000000000..c1d13c3ec9 --- /dev/null +++ b/.changeset/curvy-carrots-melt.md @@ -0,0 +1,5 @@ +--- +'gitbook': patch +--- + +Add support for tint color From 32651a9a64c12822892004d59c3e8ad440b8c88c Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 12:24:42 +0100 Subject: [PATCH 09/17] remove merge customizations --- packages/gitbook/src/lib/api.ts | 50 ++++++++------------------------- 1 file changed, 11 insertions(+), 39 deletions(-) diff --git a/packages/gitbook/src/lib/api.ts b/packages/gitbook/src/lib/api.ts index f5dab8018f..9ccbce0969 100644 --- a/packages/gitbook/src/lib/api.ts +++ b/packages/gitbook/src/lib/api.ts @@ -779,7 +779,7 @@ export async function getSiteData( const spaces = siteSpaces ?? (sections ? parseSpacesFromSiteSpaces(sections.section.siteSpaces) : []); - const customization = mergeCustomizationWithExtend( + const customization = getActiveCustomizationSettings( pointer.siteSpaceId ? customizations.siteSpaces[pointer.siteSpaceId] : customizations.site, ); @@ -1204,19 +1204,21 @@ async function getAll( } /** - * Merge the customization settings with the ones passed in the x-gitbook-customization header if present. + * Selects the customization settings from the x-gitbook-customization header if present, + * otherwise returns the original API-provided settings. */ -function mergeCustomizationWithExtend( - raw: T, -) { +function getActiveCustomizationSettings( + settings: SiteCustomizationSettings, +): SiteCustomizationSettings { const headersList = headers(); const extend = headersList.get('x-gitbook-customization'); if (extend) { try { - const parsed = rison.decode_object>(extend); + const parsedSettings = rison.decode_object(extend); + + console.log('=====> parsedSettings', parsedSettings); - // Merge objects and some properties deep - return mergeDeepPlainObject(raw, parsed, ['styling', 'themes']); + return parsedSettings; } catch (error) { console.error( `Failed to parse x-gitbook-customization header (ignored): ${ @@ -1226,35 +1228,5 @@ function mergeCustomizationWithExtend(target: T, source: DeepPartial, keys: Array): T { - if (typeof target !== 'object' || target === null) { - return target; - } - - const result = { ...target }; - - for (const key in source) { - const value = source[key]; - if (value === undefined) { - continue; - } - - if ( - typeof value === 'object' && - !Array.isArray(value) && - value !== null && - keys.includes(key as keyof T) - ) { - // @ts-ignore - result[key] = mergeDeepPlainObject(target[key] ?? {}, value, []); - } else { - // @ts-ignore - result[key] = value; - } - } - - return result; + return settings; } From 13a13e0101d0f1223d5fdf7c953db310df4ef88f Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 13:32:44 +0100 Subject: [PATCH 10/17] add default customization setttings in e2e tests --- packages/gitbook/e2e/pages.spec.ts | 57 +++++++++++++++++++++++++++++- packages/gitbook/src/lib/api.ts | 2 -- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/packages/gitbook/e2e/pages.spec.ts b/packages/gitbook/e2e/pages.spec.ts index 8476da0def..51aa02155c 100644 --- a/packages/gitbook/e2e/pages.spec.ts +++ b/packages/gitbook/e2e/pages.spec.ts @@ -1,9 +1,12 @@ import { argosScreenshot } from '@argos-ci/playwright'; import { CustomizationBackground, + CustomizationCorners, + CustomizationFont, CustomizationHeaderPreset, CustomizationIconsStyle, CustomizationLocale, + CustomizationThemeMode, SiteCustomizationSettings, } from '@gitbook/api'; import { test, expect, Page } from '@playwright/test'; @@ -971,7 +974,59 @@ for (const testCase of testCases) { * Create a URL with customization settings. */ function getCustomizationURL(partial: DeepPartial): string { - const encoded = rison.encode_object(partial); + /** + * Default customization settings. + * + * The customization object passed to the URL should be a valid API settings object. Hence we extend the test with necessary defaults. + */ + const DEFAULT_CUSTOMIZATION: SiteCustomizationSettings = { + styling: { + primaryColor: { light: '#346DDB', dark: '#346DDB' }, + corners: CustomizationCorners.Rounded, + font: CustomizationFont.Inter, + background: CustomizationBackground.Plain, + icons: CustomizationIconsStyle.Regular, + }, + internationalization: { + locale: CustomizationLocale.En, + }, + favicon: {}, + header: { + preset: CustomizationHeaderPreset.Default, + links: [], + }, + footer: { + groups: [], + }, + themes: { + default: CustomizationThemeMode.Light, + toggeable: true, + }, + pdf: { + enabled: true, + }, + feedback: { + enabled: false, + }, + aiSearch: { + enabled: true, + }, + advancedCustomization: { + enabled: true, + }, + git: { + showEditLink: false, + }, + pagination: { + enabled: true, + }, + trademark: { + enabled: true, + }, + privacyPolicy: {}, + socialPreview: {}, + }; + const encoded = rison.encode_object({ ...DEFAULT_CUSTOMIZATION, ...partial }); const searchParams = new URLSearchParams(); searchParams.set('customization', encoded); diff --git a/packages/gitbook/src/lib/api.ts b/packages/gitbook/src/lib/api.ts index 9ccbce0969..b1b3ce8e5c 100644 --- a/packages/gitbook/src/lib/api.ts +++ b/packages/gitbook/src/lib/api.ts @@ -1216,8 +1216,6 @@ function getActiveCustomizationSettings( try { const parsedSettings = rison.decode_object(extend); - console.log('=====> parsedSettings', parsedSettings); - return parsedSettings; } catch (error) { console.error( From f09a12c74f36ed6322321bbca6403f122142b6d4 Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 14:08:51 +0100 Subject: [PATCH 11/17] deep merge customizations in tests --- bun.lockb | Bin 573952 -> 574304 bytes packages/gitbook/e2e/pages.spec.ts | 4 +++- packages/gitbook/package.json | 9 +++++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/bun.lockb b/bun.lockb index 4d4fa7786af637461fe71524dad59f73be25dc3d..3a07f60b3310b15ee73180967cdf639bf40d0dcf 100755 GIT binary patch delta 81572 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 LLDX`O>5BgY{;SCl delta 81980 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 diff --git a/packages/gitbook/e2e/pages.spec.ts b/packages/gitbook/e2e/pages.spec.ts index 51aa02155c..687306d12c 100644 --- a/packages/gitbook/e2e/pages.spec.ts +++ b/packages/gitbook/e2e/pages.spec.ts @@ -13,6 +13,7 @@ import { test, expect, Page } from '@playwright/test'; import jwt from 'jsonwebtoken'; import rison from 'rison'; import { DeepPartial } from 'ts-essentials'; +import deepMerge from 'deepmerge'; import { getContentTestURL } from '../tests/utils'; @@ -1026,7 +1027,8 @@ function getCustomizationURL(partial: DeepPartial): s privacyPolicy: {}, socialPreview: {}, }; - const encoded = rison.encode_object({ ...DEFAULT_CUSTOMIZATION, ...partial }); + + const encoded = rison.encode_object(deepMerge(DEFAULT_CUSTOMIZATION, partial)); const searchParams = new URLSearchParams(); searchParams.set('customization', encoded); diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index 493916034b..6e196cfe2f 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -68,9 +68,9 @@ }, "devDependencies": { "@argos-ci/playwright": "^2.0.0", - "@playwright/test": "^1.42.1", "@cloudflare/next-on-pages": "^1.13.5", "@cloudflare/workers-types": "^4.20240725.0", + "@playwright/test": "^1.42.1", "@types/js-cookie": "^3.0.6", "@types/jsontoxml": "^1.0.5", "@types/jsonwebtoken": "^9.0.6", @@ -82,6 +82,8 @@ "@types/react-dom": "18.3.1", "@types/rison": "^0.0.9", "autoprefixer": "^10", + "deepmerge": "^4.3.1", + "env-cmd": "^10.1.0", "eslint": "^8", "eslint-config-next": "^14.2.5", "eslint-plugin-import": "^2.29.1", @@ -89,8 +91,7 @@ "postcss": "^8", "psi": "^4.1.0", "tailwindcss": "^3.4.0", - "typescript": "^5.5.3", - "env-cmd": "^10.1.0", - "ts-essentials": "^10.0.1" + "ts-essentials": "^10.0.1", + "typescript": "^5.5.3" } } From b0626053c23b6d9e4fce66a0e23fdbea839a20f4 Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 15:04:36 +0100 Subject: [PATCH 12/17] update bun --- bun.lockb | Bin 574304 -> 574304 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index 3a07f60b3310b15ee73180967cdf639bf40d0dcf..6c00827f058dac47740f49ffaa27dddc759ba3a4 100755 GIT binary patch delta 41 vcmaFRru?8yxuJ!zg{g(Pg=Gut?`Q0caVC1kdWP*x&sl+(Z9CI*_P9F$N{

Date: Mon, 9 Dec 2024 15:14:17 +0100 Subject: [PATCH 13/17] fix cookie banner issue --- packages/gitbook/e2e/pages.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/gitbook/e2e/pages.spec.ts b/packages/gitbook/e2e/pages.spec.ts index 687306d12c..6ebebf58b9 100644 --- a/packages/gitbook/e2e/pages.spec.ts +++ b/packages/gitbook/e2e/pages.spec.ts @@ -1024,7 +1024,9 @@ function getCustomizationURL(partial: DeepPartial): s trademark: { enabled: true, }, - privacyPolicy: {}, + privacyPolicy: { + url: 'https://www.gitbook.com/privacy', + }, socialPreview: {}, }; From fbf9f8a0c2e92caf298cba09e5cc515cb3665468 Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 15:56:23 +0100 Subject: [PATCH 14/17] add fullish coverage of themes and presets --- packages/gitbook/e2e/pages.spec.ts | 111 ++++++++++++----------------- 1 file changed, 47 insertions(+), 64 deletions(-) diff --git a/packages/gitbook/e2e/pages.spec.ts b/packages/gitbook/e2e/pages.spec.ts index 6ebebf58b9..e63542a2a3 100644 --- a/packages/gitbook/e2e/pages.spec.ts +++ b/packages/gitbook/e2e/pages.spec.ts @@ -39,6 +39,18 @@ const allLocales: CustomizationLocale[] = [ CustomizationLocale.Zh, ]; +const allThemeModes: CustomizationThemeMode[] = [ + CustomizationThemeMode.Light, + CustomizationThemeMode.Dark, +]; + +const allThemePresets: CustomizationHeaderPreset[] = [ + CustomizationHeaderPreset.Default, + CustomizationHeaderPreset.Bold, + CustomizationHeaderPreset.Contrast, + CustomizationHeaderPreset.Custom, +]; + async function waitForCookiesDialog(page: Page) { const dialog = page.getByRole('dialog', { name: 'Cookies' }); const accept = dialog.getByRole('button', { name: 'Accept' }); @@ -440,30 +452,36 @@ const testCases: TestsCase[] = [ { name: 'Customization', baseUrl: 'https://gitbook.gitbook.io/test-gitbook-open/', - tests: [ + tests: allThemeModes.flatMap((theme) => [ { - name: 'Without header', + name: `Without header - Theme ${theme}`, url: getCustomizationURL({ header: { preset: CustomizationHeaderPreset.None, links: [], }, + themes: { + default: theme, + }, }), run: waitForCookiesDialog, }, { - name: 'With duotone icons', + name: `With duotone icons - Theme ${theme}`, url: 'page-options/page-with-icon' + getCustomizationURL({ styling: { icons: CustomizationIconsStyle.Duotone, }, + themes: { + default: theme, + }, }), run: waitForCookiesDialog, }, { - name: 'With header buttons', + name: `With header buttons - Theme ${theme}`, url: getCustomizationURL({ header: { preset: CustomizationHeaderPreset.Default, @@ -480,39 +498,15 @@ const testCases: TestsCase[] = [ }, ], }, - }), - run: waitForCookiesDialog, - }, - { - name: 'With tint - Legacy background match', - url: getCustomizationURL({ - styling: { - background: CustomizationBackground.Match, - }, - header: { - preset: CustomizationHeaderPreset.Default, - links: [ - { - title: 'Secondary button', - to: { kind: 'url', url: 'https://www.gitbook.com' }, - style: 'button-secondary', - }, - { - title: 'Primary button', - to: { kind: 'url', url: 'https://www.gitbook.com' }, - style: 'button-primary', - }, - ], + themes: { + default: theme, }, }), run: waitForCookiesDialog, }, { - name: 'With tint - Default preset', + name: `Without tint - Default preset - Theme ${theme}`, url: getCustomizationURL({ - styling: { - tint: { color: { light: '#346DDB', dark: '#346DDB' } }, - }, header: { preset: CustomizationHeaderPreset.Default, links: [ @@ -528,41 +522,26 @@ const testCases: TestsCase[] = [ }, ], }, - }), - run: waitForCookiesDialog, - }, - { - name: 'With tint - Bold preset', - url: getCustomizationURL({ - styling: { - tint: { color: { light: '#346DDB', dark: '#346DDB' } }, - }, - header: { - preset: CustomizationHeaderPreset.Bold, - links: [ - { - title: 'Secondary button', - to: { kind: 'url', url: 'https://www.gitbook.com' }, - style: 'button-secondary', - }, - { - title: 'Primary button', - to: { kind: 'url', url: 'https://www.gitbook.com' }, - style: 'button-primary', - }, - ], + themes: { + default: theme, }, }), run: waitForCookiesDialog, }, - { - name: 'With tint - Contrast', + ...allThemePresets.flatMap((preset) => ({ + name: `With tint - Preset ${preset} - Theme ${theme}`, url: getCustomizationURL({ styling: { tint: { color: { light: '#346DDB', dark: '#346DDB' } }, }, header: { - preset: CustomizationHeaderPreset.Contrast, + preset, + ...(preset === CustomizationHeaderPreset.Custom + ? { + backgroundColor: { light: '#C62C68', dark: '#EF96B8' }, + linkColor: { light: '#4DDE98', dark: '#0C693D' }, + } + : {}), links: [ { title: 'Secondary button', @@ -576,19 +555,20 @@ const testCases: TestsCase[] = [ }, ], }, + themes: { + default: theme, + }, }), run: waitForCookiesDialog, - }, + })), { - name: 'With tint - Custom preset', + name: `With tint - Legacy background match - Theme ${theme}`, url: getCustomizationURL({ styling: { - tint: { color: { light: '#346DDB', dark: '#346DDB' } }, + background: CustomizationBackground.Match, }, header: { - preset: CustomizationHeaderPreset.Custom, - backgroundColor: { light: '#C62C68', dark: '#EF96B8' }, - linkColor: { light: '#4DDE98', dark: '#0C693D' }, + preset: CustomizationHeaderPreset.Default, links: [ { title: 'Secondary button', @@ -602,10 +582,13 @@ const testCases: TestsCase[] = [ }, ], }, + themes: { + default: theme, + }, }), run: waitForCookiesDialog, }, - ], + ]), }, { name: 'Ads', From 0fe2cdb2b19467d38676531adb2205ddceea7ba4 Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 15:58:08 +0100 Subject: [PATCH 15/17] fix css --- .../src/components/RootLayout/CustomizationRootLayout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx index cbe61a0d37..05475df6d7 100644 --- a/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx +++ b/packages/gitbook/src/components/RootLayout/CustomizationRootLayout.tsx @@ -47,7 +47,7 @@ export async function CustomizationRootLayout(props: { className={tcls( customization.header.preset === CustomizationHeaderPreset.None ? null - : ['scroll-pt-[76px]'], // Take the sticky header in consideration for the scrolling + : 'scroll-pt-[76px]', // Take the sticky header in consideration for the scrolling customization.styling.corners === CustomizationCorners.Straight ? ' straight-corners' : '', From bedd1678d5ab822cda8bf11f5c3877b0054651d9 Mon Sep 17 00:00:00 2001 From: Valentino Hudhra Date: Mon, 9 Dec 2024 16:37:31 +0100 Subject: [PATCH 16/17] fix dark mode tests --- packages/gitbook/e2e/pages.spec.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/gitbook/e2e/pages.spec.ts b/packages/gitbook/e2e/pages.spec.ts index e63542a2a3..845be06aad 100644 --- a/packages/gitbook/e2e/pages.spec.ts +++ b/packages/gitbook/e2e/pages.spec.ts @@ -462,6 +462,7 @@ const testCases: TestsCase[] = [ }, themes: { default: theme, + toggeable: false, }, }), run: waitForCookiesDialog, @@ -476,6 +477,7 @@ const testCases: TestsCase[] = [ }, themes: { default: theme, + toggeable: false, }, }), run: waitForCookiesDialog, @@ -500,6 +502,7 @@ const testCases: TestsCase[] = [ }, themes: { default: theme, + toggeable: false, }, }), run: waitForCookiesDialog, @@ -524,6 +527,7 @@ const testCases: TestsCase[] = [ }, themes: { default: theme, + toggeable: false, }, }), run: waitForCookiesDialog, @@ -557,6 +561,7 @@ const testCases: TestsCase[] = [ }, themes: { default: theme, + toggeable: false, }, }), run: waitForCookiesDialog, @@ -584,6 +589,7 @@ const testCases: TestsCase[] = [ }, themes: { default: theme, + toggeable: false, }, }), run: waitForCookiesDialog, From 44b26426dc516a36383f9570b6f7f0175952028c Mon Sep 17 00:00:00 2001 From: Zeno Kapitein Date: Mon, 9 Dec 2024 17:03:32 +0100 Subject: [PATCH 17/17] Tweak `--light-2` To make some gray elements (like codeblocks) a bit less harsh. --- packages/gitbook/src/components/RootLayout/globals.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gitbook/src/components/RootLayout/globals.css b/packages/gitbook/src/components/RootLayout/globals.css index f4d4544627..961a58fe6b 100644 --- a/packages/gitbook/src/components/RootLayout/globals.css +++ b/packages/gitbook/src/components/RootLayout/globals.css @@ -11,7 +11,7 @@ --light-1: color-mix(in srgb, rgb(var(--tint-color-600)), rgb(var(--light-base)) 99%); --light-DEFAULT: color-mix(in srgb, rgb(var(--tint-color-700)), rgb(var(--light-base)) 96%); - --light-2: color-mix(in srgb, rgb(var(--tint-color-700)), rgb(var(--light-base)) 92%); + --light-2: color-mix(in srgb, rgb(var(--tint-color-700)), rgb(var(--light-base)) 94%); --light-3: color-mix(in srgb, rgb(var(--tint-color-800)), rgb(var(--light-base)) 88%); --light-4: color-mix(in srgb, rgb(var(--tint-color-800)), rgb(var(--light-base)) 72%);