From 8ea662e0bd66ea720518ceefc124929c43d74772 Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Wed, 21 Jan 2026 11:05:11 +0800 Subject: [PATCH 01/10] update sharepoint site theming json schema --- .../sharepoint-site-theming-json-schema.md | 749 +++++------------- 1 file changed, 205 insertions(+), 544 deletions(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md index db182d93b4..d88000c2b4 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md @@ -1,7 +1,7 @@ --- title: SharePoint site theming - JSON schema description: The new SharePoint site theming features use a JSON schema to store color settings and other information about each theme. -ms.date: 08/08/2024 +ms.date: 01/21/2026 ms.localizationpriority: high --- @@ -10,618 +10,279 @@ ms.localizationpriority: high The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to store color settings and other information about each theme. Theme settings are stored in a JSON object that contains the following keys: - **name**: The name of the theme, which appears in the theme picker UI and is also used by administrators and developers to refer to the theme in PowerShell cmdlets or calls to the SharePoint REST API. -- **isInverted**: This value should be false for light themes and true for dark themes; it controls whether SharePoint uses dark or light theme colors to render text on colored backgrounds. -- **backgroundImageUri**: The URI of an optional background image for the theme (value can be blank if no background image). -- **palette**: The RGB color settings for the theme, stored as a nested JSON object with the following keys: - - themePrimary - - themeLighterAlt - - themeLighter - - themeLight - - themeTertiary - - themeSecondary - - themeDarkAlt - - themeDark - - themeDarker - - neutralLighterAlt - - neutralLighter - - neutralLight - - neutralQuaternaryAlt - - neutralQuaternary - - neutralTertiaryAlt - - neutralTertiary - - neutralSecondaryAlt - - neutralSecondary - - neutralPrimaryAlt - - neutralPrimary - - neutralDark - - black - - white - - primaryBackground - - primaryText - - bodyBackground - - bodyText - - disabledBackground - - disabledText - - error - - accent - -The colors in the `palette` element are specified as 6-digit or 3-digit hexadecimal RGB string values. - -The following is an example of a JSON object that defines a theme. +- **colorPairs**: Color pairs are the foundation of your theme, enabling multiple brand colors to reflect your organization’s brand identity and personality. Each theme supports up to 16 color pairs, with each pair consisting of an accent color and a background color. To ensure readability, the text color is automatically set to black or white based on the contrast ratio of the background color. +The colors in the colorPairs element are specified as 6-digit or 3-digit hexadecimal RGB string values. +The following is an example of a JSON object that defines a colorPairs. ```json { - "name": "Blue", - "isInverted": true, - "backgroundImageUri": "", - "palette": { - "themePrimary": "#00bcf2", - "themeLighterAlt": "#00090c", - "themeLighter": "#001318", - "themeLight": "#002630", - "themeTertiary": "#005066", - "themeSecondary": "#00abda", - "themeDarkAlt": "#0ecbff", - "themeDark": "#44d6ff", - "themeDarker": "#6cdfff", - "neutralLighterAlt": "#2e3340", - "neutralLighter": "#353a49", - "neutralLight": "#404759", - "neutralQuaternaryAlt": "#474e62", - "neutralQuaternary": "#4c546a", - "neutralTertiaryAlt": "#646e8a", - "neutralTertiary": "#c8c8c8", - "neutralSecondaryAlt": "#d0d0d0", - "neutralSecondary": "#dadada", - "neutralPrimaryAlt": "#eaeaea", - "neutralPrimary": "#ffffff", - "neutralDark": "#f4f4f4", - "black": "#f8f8f8", - "white": "#262a35", - "primaryBackground": "#262a35", - "primaryText": "#ffffff", - "bodyBackground": "#ffffff", - "bodyText": "#333333", - "disabledBackground": "#f4f4f4", - "disabledText": "#c8c8c8", - "error": "#ff5f5f", - "accent": "#ffb900" - } + "light": [ + { "accentColor": "#03787C", "backgroundColor": "#FFFFFF" }, + { "accentColor": "#FFFFFF", "backgroundColor": "#03787C" }, + { "accentColor": "#E3FFFD", "backgroundColor": "#03787C" }, + { "accentColor": "#03787C", "backgroundColor": "#E3FFFD" }, + { "accentColor": "#FFF9E3", "backgroundColor": "#03787C" }, + { "accentColor": "#03787C", "backgroundColor": "#FFF9E3" }, + { "accentColor": "#03787C", "backgroundColor": "#F5F5F5" }, + { "accentColor": "#242424", "backgroundColor": "#F5F5F5" }, + { "accentColor": "#155473", "backgroundColor": "#FFFFFF" }, + { "accentColor": "#FFFFFF", "backgroundColor": "#155473" }, + { "accentColor": "#155473", "backgroundColor": "#E3FFFD" }, + { "accentColor": "#E3FFFD", "backgroundColor": "#155473" }, + { "accentColor": "#FFF9E3", "backgroundColor": "#155473" }, + { "accentColor": "#155473", "backgroundColor": "#FFF9E3" } + ] } ``` -The SharePoint Framework includes eight built-in themes: six on light backgrounds, and two on dark backgrounds. You might find it useful to create a custom theme by starting from one of the built-in themes and adjusting it to suit your needs. -Another option is to use the [Theme Generator tool](https://aka.ms/themedesigner) to build a custom theme. It provides an interactive UI for selecting theme colors, and automatically generates the JSON, SASS, and PowerShell definitions for your custom theme. - -> [!NOTE] -> The theme generator definitions do not currently include the following color slots and key/value pairs: -> -> - "primaryBackground" -> - "primaryText" -> - "bodyBackground" -> - "bodyText" -> - "disabledBackground" -> - "disabledText" -> - "error" -> - "accent" -> -> These can be manually added to your generated definition before uploading to the tenant. - -![Theme Generator tool](../../images/theme-generator-tool.png) - -The following is a summary of the built-in themes, including JSON definitions for the theme colors that you can use as a starting point for customization. +The SharePoint Framework includes ten built-in themes: eight on light backgrounds, and two on dark backgrounds. You might find it useful to create a custom theme by starting from one of the built-in themes and adjusting it to suit your needs. ## Teal theme -The following table shows the color palette used by the Teal theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #014446 | black: #000000 | -| themeDark: #025c5f | neutralDark: #212121 | -| themeDarkAlt: #026d70 | neutralPrimary: #333 | -| themePrimary: #03787c | neutralPrimaryAlt: #3c3c3c | -| | neutralSecondary: #666666 | -| | neutralTertiary: #a6a6a6 | -| themeSecondary: #13898d | neutralTertiaryAlt: #c8c8c8 | -| themeTertiary: #49aeb1 | neutralLight: #eaeaea | -| themeLight: #98d6d8 | neutralLighter: #f4f4f4 | -| themeLighter: #c5e9ea | neutralLighterAlt: #f8f8f8 | -| themeLighterAlt: #f0f9fa | white: #fff | - -The following code shows how to define a dictionary in PowerShell for the Teal theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Teal theme. ```powershell -{  - themeDarker: '#014446',  - themeDark: '#025c5f',  - themeDarkAlt: '#026d70',  - themePrimary: '#03787c',  - themeSecondary: '#13898d',  - themeTertiary: '#49aeb1',  - themeLight: '#98d6d8',  - themeLighter: '#c5e9ea',  - themeLighterAlt: '#f0f9fa',  - black: '#000000',  - neutralDark: '#212121',  - neutralPrimary: '#333',  - neutralPrimaryAlt: '#3c3c3c',  - neutralSecondary: '#666666',  - neutralTertiary: '#a6a6a6',  - neutralTertiaryAlt: '#c8c8c8',  - neutralLight: '#eaeaea',  - neutralLighter: '#f4f4f4',  - neutralLighterAlt: '#f8f8f8',  - white: '#fff',  - neutralQuaternaryAlt: '#dadada',  - neutralQuaternary: '#d0d0d0',  - neutralSecondaryAlt: '#767676',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#4f6bed' +$colorPairs = @{ + light = @( + @{ "accentColor" = "#03787C"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#03787C" } + @{ "accentColor" = "#E3FFFD"; "backgroundColor" = "#03787C" } + @{ "accentColor" = "#03787C"; "backgroundColor" = "#E3FFFD" } + @{ "accentColor" = "#FFF9E3"; "backgroundColor" = "#03787C" } + @{ "accentColor" = "#03787C"; "backgroundColor" = "#FFF9E3" } + @{ "accentColor" = "#03787C"; "backgroundColor" = "#F5F5F5" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#F5F5F5" } + @{ "accentColor" = "#155473"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#155473" } + @{ "accentColor" = "#155473"; "backgroundColor" = "#E3FFFD" } + @{ "accentColor" = "#E3FFFD"; "backgroundColor" = "#155473" } + @{ "accentColor" = "#FFF9E3"; "backgroundColor" = "#155473" } + @{ "accentColor" = "#155473"; "backgroundColor" = "#FFF9E3" } + ) } ``` -## Red theme - -The following table shows the color palette used by the Red theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #751b1e | black: #000000 | -| themeDark: #952226 | neutralDark: #212121 | -| themeDarkAlt: #c02b30 | neutralPrimary: #333 | -| themePrimary: #d13438 | neutralPrimaryAlt: #3c3c3c | -| | neutralSecondary: #666666 | -| | neutralTertiary: #a6a6a6 | -| themeSecondary: #d6494d | neutralTertiaryAlt: #c8c8c8 | -| themeTertiary: #ecaaac | neutralLight: #eaeaea | -| themeLight: #f6d6d8 | neutralLighter:#f4f4f4 | -| themeLighter: #faebeb | neutralLighterAlt: #f8f8f8 | -| themeLighterAlt: #fdf5f5 | white: #fff | +## Blue theme -The following code shows how to define a dictionary in PowerShell for the Red theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Blue theme. ```powershell -{  - themeDarker: '#751b1e',  - themeDark: '#952226',  - themeDarkAlt: '#c02b30',  - themePrimary: '#d13438',  - themeSecondary: '#d6494d',  - themeTertiary: '#ecaaac',  - themeLight: '#f6d6d8',  - themeLighter: '#faebeb',  - themeLighterAlt: '#fdf5f5',  - black: '#000000',  - neutralDark: '#212121',  - neutralPrimary: '#333',  - neutralPrimaryAlt: '#3c3c3c',  -  neutralSecondary: '#666666',  - neutralTertiary: '#a6a6a6',  - neutralTertiaryAlt: '#c8c8c8',  - neutralLight: '#eaeaea',  - neutralLighter: '#f4f4f4',  - neutralLighterAlt: '#f8f8f8',  - white: '#fff',  - neutralQuaternaryAlt: '#dadada',  - neutralQuaternary: '#d0d0d0',  - neutralSecondaryAlt: '#767676',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#ca5010' +$colorPairs = @{ + light = @( + @{ "accentColor" = "#1267B5"; "backgroundColor" = "#ffffff" } + @{ "accentColor" = "#ffffff"; "backgroundColor" = "#1267B5" } + @{ "accentColor" = "#1267B5"; "backgroundColor" = "#D7EEFF" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#1267B5" } + @{ "accentColor" = "#1267B5"; "backgroundColor" = "#B6FEC3" } + @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#1267B5" } + @{ "accentColor" = "#1267B5"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#010B2F"; "backgroundColor" = "#ffffff" } + @{ "accentColor" = "#ffffff"; "backgroundColor" = "#010B2F" } + @{ "accentColor" = "#010B2F"; "backgroundColor" = "#D7EEFF" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#010B2F" } + @{ "accentColor" = "#010B2F"; "backgroundColor" = "#B6FEC3" } + @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#010B2F" } + ) } ``` ## Orange theme -The following table shows the color palette used by the Orange theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #6f2d09 | black: #000000 | -| themeDark: #8d390b | neutralDark: #212121 | -| themeDarkAlt: #b5490f | neutralPrimary: #333 | -| themePrimary: #ca5010 | neutralPrimaryAlt: #3c3c3c | -| | neutralSecondary: #666666 | -| | neutralTertiary: #a6a6a6 | -| themeSecondary: #e55c12 | neutralTertiaryAlt: #c8c8c8 | -| themeTertiary: #f6b28d | neutralLight: #eaeaea | -| themeLight: #fbdac9 | neutralLighter: #f4f4f4 | -| themeLighter: #fdede4 | neutralLighterAlt: #f8f8f8 | -| themeLighterAlt: #fef6f1 | white: #fff | - -The following code shows how to define a dictionary in PowerShell for the Orange theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Orange theme. ```powershell -{  - themeDarker: '#6f2d09',  - themeDark: '#8d390b',  - themeDarkAlt: '#b5490f',  - themePrimary: '#ca5010',  - themeSecondary: '#e55c12',  - themeTertiary: '#f6b28d',  - themeLight: '#fbdac9',  - themeLighter: '#fdede4',  - themeLighterAlt: '#fef6f1',  - black: '#000000',  - neutralDark: '#212121',  - neutralPrimary: '#333',  - neutralPrimaryAlt: '#3c3c3c',  - neutralSecondary: '#666666',  - neutralTertiary: '#a6a6a6',  - neutralTertiaryAlt: '#c8c8c8',  - neutralLight: '#eaeaea',  - neutralLighter: '#f4f4f4',  - neutralLighterAlt: '#f8f8f8',  - white: '#fff',  - neutralQuaternaryAlt: '#dadada',  - neutralQuaternary: '#d0d0d0',  - neutralSecondaryAlt: '#767676',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#986f0b' -} -``` -## Green theme +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#A74411"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#A74411" } + @{ "themePrimary" = "#A74411"; "backgroundColor" = "#D7EEFF" } + @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#A74411" } + @{ "themePrimary" = "#A74411"; "backgroundColor" = "#FFECB6" } + @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#A74411" } + @{ "themePrimary" = "#FF9557"; "backgroundColor" = "#242424" } + @{ "themePrimary" = "#A74411"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } + ) +} -The following table shows the color palette used by the Green theme. +``` -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #294903 | black: #000000 | -| themeDark: #386304 | neutralDark: #201f1e | -| themeDarkAlt: #427505 | neutralPrimary: #323130 | -| themePrimary: #498205 | neutralPrimaryAlt: #3b3a39 | -| | neutralSecondary: #605e5c | -| | neutralTertiary: #a19f9d | -| themeSecondary: #5a9117 | neutralTertiaryAlt: #c8c6c4 | -| themeTertiary: #85b44c | neutralLight: #edebe9 | -| themeLight: #bdda9b | neutralLighter: #f3f2f1 | -| themeLighter: #dbebc7 | neutralLighterAlt: #faf9f8 | -| themeLighterAlt: #f6faf0 | white: #fff | +## Red theme -The following code shows how to define a dictionary in PowerShell for the Green theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Red theme. ```powershell -{  - themePrimary: '#498205',  - themeLighterAlt: '#f6faf0',  - themeLighter: '#dbebc7',  - themeLight: '#bdda9b',  - themeTertiary: '#85b44c',  - themeSecondary: '#5a9117',  - themeDarkAlt: '#427505',  - themeDark: '#386304',  - themeDarker: '#294903',  - neutralLighterAlt: '#faf9f8',  - neutralLighter: '#f3f2f1',  - neutralLight: '#edebe9',  - neutralQuaternaryAlt: '#e1dfdd',  - neutralQuaternary: '#d2d0ce',  - neutralTertiaryAlt: '#c8c6c4',  - neutralTertiary: '#a19f9d',  - neutralSecondaryAlt: '#8a8886',  - neutralSecondary: '#605e5c',  - neutralPrimary: '#323130',  - neutralPrimaryAlt: '#3b3a39',  - neutralDark: '#201f1e',  - black: '#000000',  - white: '#fff',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#03787c' +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#AD3A39" } + @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#FFE0E2" } + @{ "themePrimary" = "#FFE0E2"; "backgroundColor" = "#AD3A39" } + @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#FFECB6" } + @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#AD3A39" } + @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#590408"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#590408" } + @{ "themePrimary" = "#590408"; "backgroundColor" = "#FFE0E2" } + @{ "themePrimary" = "#FFE0E2"; "backgroundColor" = "#590408" } + @{ "themePrimary" = "#590408"; "backgroundColor" = "#FFECB6" } + @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#590408" } + ) } ``` -## Blue theme - -The following table shows the color palette used by the Blue theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #004578 | black: #000000 | -| themeDark: #005a9e | neutralDark: #212121 | -| themeDarkAlt: #106ebe | neutralPrimary: #333 | -| themePrimary: #0078d7 | neutralPrimaryAlt: #3c3c3c | -| | neutralSecondary: #666666 | -| | neutralTertiary: #a6a6a6 | -| themeSecondary: #2b88d8 | neutralTertiaryAlt: #c8c8c8 | -| themeTertiary: #71afe5 | neutralLight: #eaeaea | -| themeLight: #c7e0f4 | neutralLighter: #f4f4f4 | -| themeLighter: #deecf9 | neutralLighterAlt: #f8f8f8 | -| themeLighterAlt: #eff6fc | white: #fff | +## Purple theme -The following code shows how to define a dictionary in PowerShell for the Blue theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Purple theme. ```powershell -{  - themePrimary: '#0078d7',  - themeLighterAlt: '#eff6fc',  - themeLighter: '#deecf9',  - themeLight: '#c7e0f4',  - themeTertiary: '#71afe5',  - themeSecondary: '#2b88d8',  - themeDarkAlt: '#106ebe',  - themeDark: '#005a9e',  - themeDarker: '#004578',  - neutralLighterAlt: '#f8f8f8',  - neutralLighter: '#f4f4f4',  - neutralLight: '#eaeaea',  - neutralQuaternaryAlt: '#dadada',  - neutralQuaternary: '#d0d0d0',  - neutralTertiaryAlt: '#c8c8c8',  - neutralTertiary: '#a6a6a6',  - neutralSecondaryAlt: '#767676',  - neutralSecondary: '#666666',  - neutralPrimary: '#333',  - neutralPrimaryAlt: '#3c3c3c',  - neutralDark: '#212121',  - black: '#000000',  - white: '#fff',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#8764b8' +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#72559B"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#72559B" } + @{ "themePrimary" = "#72559B"; "backgroundColor" = "#EEE2FF" } + @{ "themePrimary" = "#EEE2FF"; "backgroundColor" = "#72559B" } + @{ "themePrimary" = "#72559B"; "backgroundColor" = "#FFECB6" } + @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#72559B" } + @{ "themePrimary" = "#72559B"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#382D6F" } + @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#EEE2FF" } + @{ "themePrimary" = "#EEE2FF"; "backgroundColor" = "#382D6F" } + @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#FFECB6" } + @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#382D6F" } + ) } ``` -## Purple theme - -The following table shows the color palette used by the Purple theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #27268a | black: #000000 | -| themeDark: #3230b0 | neutralDark: #212121 | -| themeDarkAlt: #5250cf | neutralPrimary: #333 | -| themePrimary: #6b69d6 | neutralPrimaryAlt: #3c3c3c | -| | neutralSecondary: #666666 | -| | neutralTertiary: #a6a6a6 | -| themeSecondary: #7a78da | neutralTertiaryAlt: #c8c8c8 | -| themeTertiary: #c1c0ee | neutralLight: #eaeaea | -| themeLight: #e1e1f7 | neutralLighter: #f4f4f4 | -| themeLighter: #f0f0fb | neutralLighterAlt: #f8f8f8 | -| themeLighterAlt: #f8f7fd | white: #fff | +## Green theme -The following code shows how to define a dictionary in PowerShell for the Purple theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Green theme. ```powershell -{  - themePrimary: '#6b69d6',  - themeLighterAlt: '#f8f7fd',  - themeLighter: '#f0f0fb',  - themeLight: '#e1e1f7',  - themeTertiary: '#c1c0ee',  - themeSecondary: '#7a78da',  - themeDarkAlt: '#5250cf',  - themeDark: '#3230b0',  - themeDarker: '#27268a',  - neutralLighterAlt: '#f8f8f8',  - neutralLighter: '#f4f4f4',  - neutralLight: '#eaeaea',  - neutralQuaternaryAlt: '#dadada',  - neutralQuaternary: '#d0d0d0',  - neutralTertiaryAlt: '#c8c8c8',  - neutralTertiary: '#a6a6a6',  - neutralSecondaryAlt: '#767676',  - neutralSecondary: '#666666',  - neutralPrimary: '#333',  - neutralPrimaryAlt: '#3c3c3c',  - neutralDark: '#212121',  - black: '#000000',  - white: '#fff',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#038387' +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#437509"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#437509" } + @{ "themePrimary" = "#437509"; "backgroundColor" = "#C2FFFC" } + @{ "themePrimary" = "#C2FFFC"; "backgroundColor" = "#437509" } + @{ "themePrimary" = "#437509"; "backgroundColor" = "#CCFF4D" } + @{ "themePrimary" = "#CCFF4D"; "backgroundColor" = "#437509" } + @{ "themePrimary" = "#437509"; "backgroundColor" = "#F5F5F5" } + @{ "themePrimary" = "#242424"; "backgroundColor" = "#F5F5F5" } + @{ "themePrimary" = "#2C5A43"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#2C5A43" } + @{ "themePrimary" = "#2C5A43"; "backgroundColor" = "#C2FFFC" } + @{ "themePrimary" = "#C2FFFC"; "backgroundColor" = "#2C5A43" } + @{ "themePrimary" = "#2C5A43"; "backgroundColor" = "#CCFF4D" } + @{ "themePrimary" = "#CCFF4D"; "backgroundColor" = "#2C5A43" } + ) } ``` -## Gray theme - -The following table shows the color palette used by the Gray theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #323130 | black: #000000 | -| themeDark: #403e3d | neutralDark: #212121 | -| themeDarkAlt: #53504e | neutralPrimary: #333 | -| themePrimary: #5d5a58 | neutralPrimaryAlt: #3c3c3c | -| | neutralSecondary: #666666 | -| | neutralTertiary: #a6a6a6 | -| themeSecondary: #6d6a67 | neutralTertiaryAlt: #c8c8c8 | -| themeTertiary: #bbb9b8 | neutralLight: #eaeaea | -| themeLight: #dfdedd | neutralLighter: #f4f4f4 | -| themeLighter: #efeeee | neutralLighterAlt: #f8f8f8 | -| themeLighterAlt: #f7f7f7 | white: #fff | +## Periwinkle theme -The following code shows how to define a dictionary in PowerShell for the Gray theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Periwinkle theme. ```powershell -{  - themePrimary: '#5d5a58',  - themeLighterAlt: '#f7f7f7',  - themeLighter: '#efeeee',  - themeLight: '#dfdedd',  - themeTertiary: '#bbb9b8',  - themeSecondary: '#6d6a67',  - themeDarkAlt: '#53504e',  - themeDark: '#403e3d',  - themeDarker: '#323130',  - neutralLighterAlt: '#f8f8f8',  - neutralLighter: '#f4f4f4',  - neutralLight: '#eaeaea',  - neutralQuaternaryAlt: '#dadada',  - neutralQuaternary: '#d0d0d0',  - neutralTertiaryAlt: '#c8c8c8',  - neutralTertiary: '#a6a6a6',  - neutralSecondaryAlt: '#767676',  - neutralSecondary: '#666666',  - neutralPrimary: '#333',  - neutralPrimaryAlt: '#3c3c3c',  - neutralDark: '#212121',  - black: '#000000',  - white: '#fff',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#0078d4' +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#5B5D9B" } + @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#DEE2FC" } + @{ "themePrimary" = "#DEE2FC"; "backgroundColor" = "#5B5D9B" } + @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#B6FEC3" } + @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#5B5D9B" } + @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#382D6F" } + @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#DEE2FC" } + @{ "themePrimary" = "#DEE2FC"; "backgroundColor" = "#382D6F" } + @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#B6FEC3" } + @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#382D6F" } + ) } ``` -## Periwinkle theme - -The following table shows the color palette used by the Periwinkle theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #383966 | black: #000000 | -| themeDark: #3D3E78 | neutralDark: #201f1e | -| themeDarkAlt: #444791 | neutralPrimary: #323130 | -| themePrimary: #5B5FC7 | neutralPrimaryAlt: #3b3a39 | -| | neutralSecondary: #605e5c | -| | neutralTertiary: #a19f9d | -| themeSecondary: #7579EB | neutralTertiaryAlt: #c8c6c4 | -| themeTertiary: #7F85F5 | neutralLight: #edebe9 | -| themeLight: #AAB1FA | neutralLighter: #f3f2f1 | -| themeLighter: #B6BCFA | neutralLighterAlt: #faf9f8 | -| themeLighterAlt: #C5CBFA | white: #fff | +## Cobalt theme -The following code shows how to define a dictionary in PowerShell for the Periwinkle theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Cobalt theme. ```powershell -{  - themeDarker: '#383966',  - themeDark: '#3D3E78',  - themeDarkAlt: '#444791',  - themePrimary: '#5B5FC7',  - themeSecondary: '#7579EB',  - themeTertiary: '#7F85F5',  - themeLight: '#AAB1FA',  - themeLighter: '#B6BCFA',  - themeLighterAlt: '#C5CBFA',  - black: '#000000',  - neutralDark: '#201f1e',  - neutralPrimary: '#323130',  - neutralPrimaryAlt: '#3b3a39',  - neutralSecondary: '#605e5c',  - neutralTertiary: '#a19f9d',  - neutralTertiaryAlt: '#c8c6c4',  - neutralLight: '#edebe9',  - neutralLighter: '#f3f2f1',  - neutralLighterAlt: '#faf9f8',  - white: '#fff',  - neutralQuaternaryAlt: '#dadada',  - neutralQuaternary: '#d0d0d0',  - neutralSecondaryAlt: '#767676',  - primaryBackground: '#fff',  - primaryText: '#333', - accent: '#5B5FC7' +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#355DCD" } + @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#D7EEFF" } + @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#355DCD" } + @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#B0F4FF" } + @{ "themePrimary" = "#B0F4FF"; "backgroundColor" = "#355DCD" } + @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "themePrimary" = "#1A1F50"; "backgroundColor" = "#ffffff" } + @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#1A1F50" } + @{ "themePrimary" = "#1A1F50"; "backgroundColor" = "#D7EEFF" } + @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#1A1F50" } + @{ "themePrimary" = "#1A1F50"; "backgroundColor" = "#B0F4FF" } + @{ "themePrimary" = "#B0F4FF"; "backgroundColor" = "#1A1F50" } + ) } ``` -## Dark Yellow theme +## Dark Teal theme -The following table shows the color palette used by the Dark Yellow theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #fff171 | black: #f8f8f8 | -| themeDark: #ffed4b | neutralDark: #f4f4f4 | -| themeDarkAlt: #ffe817 | neutralPrimary: #ffffff | -| themePrimary: #fce100 | neutralPrimaryAlt: #eaeaea | -| | neutralSecondary: #dadada | -| | neutralTertiary: #c8c8c8 | -| themeSecondary: #e3cc00 | neutralTertiaryAlt: #6d6d6d | -| themeTertiary: #6a5f00 | neutralLight: #3f3f3f | -| themeLight: #322d00 | neutralLighter: #313131 | -| themeLighter: #191700 | neutralLighterAlt: #282828 | -| themeLighterAlt: #0d0b00 | white: #1f1f1f | - -The following code shows how to define a dictionary in PowerShell for the Dark Yellow theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Dark Teal theme. ```powershell -{  - themePrimary: '#fce100',  - themeLighterAlt: '#0d0b00',  - themeLighter: '#191700',  - themeLight: '#322d00',  - themeTertiary: '#6a5f00',  - themeSecondary: '#e3cc00',  - themeDarkAlt: '#ffe817',  - themeDark: '#ffed4b',  - themeDarker: '#fff171',  - neutralLighterAlt: '#282828',  - neutralLighter: '#313131',  - neutralLight: '#3f3f3f',  - neutralQuaternaryAlt: '#484848',  - neutralQuaternary: '#4f4f4f',  - neutralTertiaryAlt: '#6d6d6d',  - neutralTertiary: '#c8c8c8',  - neutralSecondaryAlt: '#d0d0d0',  - neutralSecondary: '#dadada',  - neutralPrimaryAlt: '#eaeaea',  - neutralPrimary: '#ffffff',  - neutralDark: '#f4f4f4',  - black: '#f8f8f8',  - white: '#1f1f1f',  - primaryBackground: '#1f1f1f',  - primaryText: '#ffffff',  - error: '#ff5f5f', - accent: '#ffc83d' +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#51AEB2"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#03787C" } + @{ "themePrimary" = "#E3FFFD"; "backgroundColor" = "#03787C" } + @{ "themePrimary" = "#03787C"; "backgroundColor" = "#E3FFFD" } + @{ "themePrimary" = "#FFF9E3"; "backgroundColor" = "#03787C" } + @{ "themePrimary" = "#03787C"; "backgroundColor" = "#FFF9E3" } + @{ "themePrimary" = "#FFF9E3"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#F5F5F5"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#E3FFFD"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#155473" } + @{ "themePrimary" = "#155473"; "backgroundColor" = "#E3FFFD" } + @{ "themePrimary" = "#E3FFFD"; "backgroundColor" = "#155473" } + @{ "themePrimary" = "#FFF9E3"; "backgroundColor" = "#155473" } + @{ "themePrimary" = "#155473"; "backgroundColor" = "#FFF9E3" } + ) } ``` ## Dark Blue theme -The following table shows the color palette used by the Dark Blue theme. - -| Theme colors | Neutral colors | -| ------------------------ | --------------------------- | -| themeDarker: #6cdfff | black: #f8f8f8 | -| themeDark: #44d6ff | neutralDark: #f4f4f4 | -| themeDarkAlt: #0ecbff | neutralPrimary: #ffffff | -| themePrimary: #00bcf2 | neutralPrimaryAlt: #eaeaea | -| | neutralSecondary: #dadada | -| | neutralTertiary: #c8c8c8 | -| themeSecondary: #00abda | neutralTertiaryAlt: #646e8a | -| themeTertiary: #005066 | neutralLight: #404759 | -| themeLight: #002630 | neutralLighter: #353a49 | -| themeLighter: #001318 | neutralLighterAlt: #2e3340 | -| themeLighterAlt: #00090c | white: #262a35 | - -The following code shows how to define a dictionary in PowerShell for the Dark Blue theme's color palette. +Use the following PowerShell hashtable to define the color pairs for the Dark Blue theme. ```powershell -{  - themePrimary: '#00bcf2',  - themeLighterAlt: '#00090c',  - themeLighter: '#001318',  - themeLight: '#002630',  - themeTertiary: '#005066',  - themeSecondary: '#00abda',  - themeDarkAlt: '#0ecbff',  - themeDark: '#44d6ff',  - themeDarker: '#6cdfff',  - neutralLighterAlt: '#2e3340',  - neutralLighter: '#353a49',  - neutralLight: '#404759',  - neutralQuaternaryAlt: '#474e62',  - neutralQuaternary: '#4c546a',  - neutralTertiaryAlt: '#646e8a',  - neutralTertiary: '#c8c8c8',  - neutralSecondaryAlt: '#d0d0d0',  - neutralSecondary: '#dadada',  - neutralPrimaryAlt: '#eaeaea',  - neutralPrimary: '#ffffff',  - neutralDark: '#f4f4f4',  - black: '#f8f8f8',  - white: '#262a35',  - primaryBackground: '#262a35',  - primaryText: '#ffffff', - error: '#ff5f5f', - accent: '#3a96dd' +$colorPairs = @{ + light = @( + @{ "themePrimary" = "#529FF1"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#1267B5" } + @{ "themePrimary" = "#1267B5"; "backgroundColor" = "#D7EEFF" } + @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#1267B5" } + @{ "themePrimary" = "#1267B5"; "backgroundColor" = "#B6FEC3" } + @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#1267B5" } + @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#F5F5F5"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#292929" } + @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#010B2F" } + @{ "themePrimary" = "#010B2F"; "backgroundColor" = "#D7EEFF" } + @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#010B2F" } + @{ "themePrimary" = "#010B2F"; "backgroundColor" = "#B6FEC3" } + @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#010B2F" } + ) } ``` From 6bab3abe4ecedcd898b16904f9dd57b524fabc47 Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Wed, 21 Jan 2026 11:17:55 +0800 Subject: [PATCH 02/10] update --- .../sharepoint-site-theming-json-schema.md | 225 +++++++++--------- 1 file changed, 113 insertions(+), 112 deletions(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md index d88000c2b4..a7ac0e77fd 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md @@ -7,11 +7,12 @@ ms.localizationpriority: high # SharePoint site theming: JSON schema -The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to store color settings and other information about each theme. Theme settings are stored in a JSON object that contains the following keys: +The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to define color settings and other information about each theme. Each theme includes the following keys: - **name**: The name of the theme, which appears in the theme picker UI and is also used by administrators and developers to refer to the theme in PowerShell cmdlets or calls to the SharePoint REST API. - **colorPairs**: Color pairs are the foundation of your theme, enabling multiple brand colors to reflect your organization’s brand identity and personality. Each theme supports up to 16 color pairs, with each pair consisting of an accent color and a background color. To ensure readability, the text color is automatically set to black or white based on the contrast ratio of the background color. The colors in the colorPairs element are specified as 6-digit or 3-digit hexadecimal RGB string values. + The following is an example of a JSON object that defines a colorPairs. ```json @@ -70,16 +71,16 @@ Use the following PowerShell hashtable to define the color pairs for the Blue th ```powershell $colorPairs = @{ light = @( - @{ "accentColor" = "#1267B5"; "backgroundColor" = "#ffffff" } - @{ "accentColor" = "#ffffff"; "backgroundColor" = "#1267B5" } + @{ "accentColor" = "#1267B5"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#1267B5" } @{ "accentColor" = "#1267B5"; "backgroundColor" = "#D7EEFF" } @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#1267B5" } @{ "accentColor" = "#1267B5"; "backgroundColor" = "#B6FEC3" } @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#1267B5" } @{ "accentColor" = "#1267B5"; "backgroundColor" = "#EBEBEB" } @{ "accentColor" = "#242424"; "backgroundColor" = "#EBEBEB" } - @{ "accentColor" = "#010B2F"; "backgroundColor" = "#ffffff" } - @{ "accentColor" = "#ffffff"; "backgroundColor" = "#010B2F" } + @{ "accentColor" = "#010B2F"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#010B2F" } @{ "accentColor" = "#010B2F"; "backgroundColor" = "#D7EEFF" } @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#010B2F" } @{ "accentColor" = "#010B2F"; "backgroundColor" = "#B6FEC3" } @@ -96,15 +97,15 @@ Use the following PowerShell hashtable to define the color pairs for the Orange $colorPairs = @{ light = @( - @{ "themePrimary" = "#A74411"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#A74411" } - @{ "themePrimary" = "#A74411"; "backgroundColor" = "#D7EEFF" } - @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#A74411" } - @{ "themePrimary" = "#A74411"; "backgroundColor" = "#FFECB6" } - @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#A74411" } - @{ "themePrimary" = "#FF9557"; "backgroundColor" = "#242424" } - @{ "themePrimary" = "#A74411"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#A74411"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#A74411" } + @{ "accentColor" = "#A74411"; "backgroundColor" = "#D7EEFF" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#A74411" } + @{ "accentColor" = "#A74411"; "backgroundColor" = "#FFECB6" } + @{ "accentColor" = "#FFECB6"; "backgroundColor" = "#A74411" } + @{ "accentColor" = "#FF9557"; "backgroundColor" = "#242424" } + @{ "accentColor" = "#A74411"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#EBEBEB" } ) } @@ -117,20 +118,20 @@ Use the following PowerShell hashtable to define the color pairs for the Red the ```powershell $colorPairs = @{ light = @( - @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#AD3A39" } - @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#FFE0E2" } - @{ "themePrimary" = "#FFE0E2"; "backgroundColor" = "#AD3A39" } - @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#FFECB6" } - @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#AD3A39" } - @{ "themePrimary" = "#AD3A39"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#590408"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#590408" } - @{ "themePrimary" = "#590408"; "backgroundColor" = "#FFE0E2" } - @{ "themePrimary" = "#FFE0E2"; "backgroundColor" = "#590408" } - @{ "themePrimary" = "#590408"; "backgroundColor" = "#FFECB6" } - @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#590408" } + @{ "accentColor" = "#AD3A39"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#AD3A39" } + @{ "accentColor" = "#AD3A39"; "backgroundColor" = "#FFE0E2" } + @{ "accentColor" = "#FFE0E2"; "backgroundColor" = "#AD3A39" } + @{ "accentColor" = "#AD3A39"; "backgroundColor" = "#FFECB6" } + @{ "accentColor" = "#FFECB6"; "backgroundColor" = "#AD3A39" } + @{ "accentColor" = "#AD3A39"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#590408"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#590408" } + @{ "accentColor" = "#590408"; "backgroundColor" = "#FFE0E2" } + @{ "accentColor" = "#FFE0E2"; "backgroundColor" = "#590408" } + @{ "accentColor" = "#590408"; "backgroundColor" = "#FFECB6" } + @{ "accentColor" = "#FFECB6"; "backgroundColor" = "#590408" } ) } ``` @@ -142,20 +143,20 @@ Use the following PowerShell hashtable to define the color pairs for the Purple ```powershell $colorPairs = @{ light = @( - @{ "themePrimary" = "#72559B"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#72559B" } - @{ "themePrimary" = "#72559B"; "backgroundColor" = "#EEE2FF" } - @{ "themePrimary" = "#EEE2FF"; "backgroundColor" = "#72559B" } - @{ "themePrimary" = "#72559B"; "backgroundColor" = "#FFECB6" } - @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#72559B" } - @{ "themePrimary" = "#72559B"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#382D6F" } - @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#EEE2FF" } - @{ "themePrimary" = "#EEE2FF"; "backgroundColor" = "#382D6F" } - @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#FFECB6" } - @{ "themePrimary" = "#FFECB6"; "backgroundColor" = "#382D6F" } + @{ "accentColor" = "#72559B"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#72559B" } + @{ "accentColor" = "#72559B"; "backgroundColor" = "#EEE2FF" } + @{ "accentColor" = "#EEE2FF"; "backgroundColor" = "#72559B" } + @{ "accentColor" = "#72559B"; "backgroundColor" = "#FFECB6" } + @{ "accentColor" = "#FFECB6"; "backgroundColor" = "#72559B" } + @{ "accentColor" = "#72559B"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#382D6F"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#382D6F" } + @{ "accentColor" = "#382D6F"; "backgroundColor" = "#EEE2FF" } + @{ "accentColor" = "#EEE2FF"; "backgroundColor" = "#382D6F" } + @{ "accentColor" = "#382D6F"; "backgroundColor" = "#FFECB6" } + @{ "accentColor" = "#FFECB6"; "backgroundColor" = "#382D6F" } ) } ``` @@ -167,20 +168,20 @@ Use the following PowerShell hashtable to define the color pairs for the Green t ```powershell $colorPairs = @{ light = @( - @{ "themePrimary" = "#437509"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#437509" } - @{ "themePrimary" = "#437509"; "backgroundColor" = "#C2FFFC" } - @{ "themePrimary" = "#C2FFFC"; "backgroundColor" = "#437509" } - @{ "themePrimary" = "#437509"; "backgroundColor" = "#CCFF4D" } - @{ "themePrimary" = "#CCFF4D"; "backgroundColor" = "#437509" } - @{ "themePrimary" = "#437509"; "backgroundColor" = "#F5F5F5" } - @{ "themePrimary" = "#242424"; "backgroundColor" = "#F5F5F5" } - @{ "themePrimary" = "#2C5A43"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#2C5A43" } - @{ "themePrimary" = "#2C5A43"; "backgroundColor" = "#C2FFFC" } - @{ "themePrimary" = "#C2FFFC"; "backgroundColor" = "#2C5A43" } - @{ "themePrimary" = "#2C5A43"; "backgroundColor" = "#CCFF4D" } - @{ "themePrimary" = "#CCFF4D"; "backgroundColor" = "#2C5A43" } + @{ "accentColor" = "#437509"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#437509" } + @{ "accentColor" = "#437509"; "backgroundColor" = "#C2FFFC" } + @{ "accentColor" = "#C2FFFC"; "backgroundColor" = "#437509" } + @{ "accentColor" = "#437509"; "backgroundColor" = "#CCFF4D" } + @{ "accentColor" = "#CCFF4D"; "backgroundColor" = "#437509" } + @{ "accentColor" = "#437509"; "backgroundColor" = "#F5F5F5" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#F5F5F5" } + @{ "accentColor" = "#2C5A43"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#2C5A43" } + @{ "accentColor" = "#2C5A43"; "backgroundColor" = "#C2FFFC" } + @{ "accentColor" = "#C2FFFC"; "backgroundColor" = "#2C5A43" } + @{ "accentColor" = "#2C5A43"; "backgroundColor" = "#CCFF4D" } + @{ "accentColor" = "#CCFF4D"; "backgroundColor" = "#2C5A43" } ) } ``` @@ -192,20 +193,20 @@ Use the following PowerShell hashtable to define the color pairs for the Periwin ```powershell $colorPairs = @{ light = @( - @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#5B5D9B" } - @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#DEE2FC" } - @{ "themePrimary" = "#DEE2FC"; "backgroundColor" = "#5B5D9B" } - @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#B6FEC3" } - @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#5B5D9B" } - @{ "themePrimary" = "#5B5D9B"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#382D6F" } - @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#DEE2FC" } - @{ "themePrimary" = "#DEE2FC"; "backgroundColor" = "#382D6F" } - @{ "themePrimary" = "#382D6F"; "backgroundColor" = "#B6FEC3" } - @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#382D6F" } + @{ "accentColor" = "#5B5D9B"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#5B5D9B" } + @{ "accentColor" = "#5B5D9B"; "backgroundColor" = "#DEE2FC" } + @{ "accentColor" = "#DEE2FC"; "backgroundColor" = "#5B5D9B" } + @{ "accentColor" = "#5B5D9B"; "backgroundColor" = "#B6FEC3" } + @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#5B5D9B" } + @{ "accentColor" = "#5B5D9B"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#382D6F"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#382D6F" } + @{ "accentColor" = "#382D6F"; "backgroundColor" = "#DEE2FC" } + @{ "accentColor" = "#DEE2FC"; "backgroundColor" = "#382D6F" } + @{ "accentColor" = "#382D6F"; "backgroundColor" = "#B6FEC3" } + @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#382D6F" } ) } ``` @@ -217,20 +218,20 @@ Use the following PowerShell hashtable to define the color pairs for the Cobalt ```powershell $colorPairs = @{ light = @( - @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#355DCD" } - @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#D7EEFF" } - @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#355DCD" } - @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#B0F4FF" } - @{ "themePrimary" = "#B0F4FF"; "backgroundColor" = "#355DCD" } - @{ "themePrimary" = "#355DCD"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#242424"; "backgroundColor" = "#EBEBEB" } - @{ "themePrimary" = "#1A1F50"; "backgroundColor" = "#ffffff" } - @{ "themePrimary" = "#ffffff"; "backgroundColor" = "#1A1F50" } - @{ "themePrimary" = "#1A1F50"; "backgroundColor" = "#D7EEFF" } - @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#1A1F50" } - @{ "themePrimary" = "#1A1F50"; "backgroundColor" = "#B0F4FF" } - @{ "themePrimary" = "#B0F4FF"; "backgroundColor" = "#1A1F50" } + @{ "accentColor" = "#355DCD"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#355DCD" } + @{ "accentColor" = "#355DCD"; "backgroundColor" = "#D7EEFF" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#355DCD" } + @{ "accentColor" = "#355DCD"; "backgroundColor" = "#B0F4FF" } + @{ "accentColor" = "#B0F4FF"; "backgroundColor" = "#355DCD" } + @{ "accentColor" = "#355DCD"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#242424"; "backgroundColor" = "#EBEBEB" } + @{ "accentColor" = "#1A1F50"; "backgroundColor" = "#FFFFFF" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#1A1F50" } + @{ "accentColor" = "#1A1F50"; "backgroundColor" = "#D7EEFF" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#1A1F50" } + @{ "accentColor" = "#1A1F50"; "backgroundColor" = "#B0F4FF" } + @{ "accentColor" = "#B0F4FF"; "backgroundColor" = "#1A1F50" } ) } ``` @@ -243,20 +244,20 @@ Use the following PowerShell hashtable to define the color pairs for the Dark Te ```powershell $colorPairs = @{ light = @( - @{ "themePrimary" = "#51AEB2"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#03787C" } - @{ "themePrimary" = "#E3FFFD"; "backgroundColor" = "#03787C" } - @{ "themePrimary" = "#03787C"; "backgroundColor" = "#E3FFFD" } - @{ "themePrimary" = "#FFF9E3"; "backgroundColor" = "#03787C" } - @{ "themePrimary" = "#03787C"; "backgroundColor" = "#FFF9E3" } - @{ "themePrimary" = "#FFF9E3"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#F5F5F5"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#E3FFFD"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#155473" } - @{ "themePrimary" = "#155473"; "backgroundColor" = "#E3FFFD" } - @{ "themePrimary" = "#E3FFFD"; "backgroundColor" = "#155473" } - @{ "themePrimary" = "#FFF9E3"; "backgroundColor" = "#155473" } - @{ "themePrimary" = "#155473"; "backgroundColor" = "#FFF9E3" } + @{ "accentColor" = "#51AEB2"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#03787C" } + @{ "accentColor" = "#E3FFFD"; "backgroundColor" = "#03787C" } + @{ "accentColor" = "#03787C"; "backgroundColor" = "#E3FFFD" } + @{ "accentColor" = "#FFF9E3"; "backgroundColor" = "#03787C" } + @{ "accentColor" = "#03787C"; "backgroundColor" = "#FFF9E3" } + @{ "accentColor" = "#FFF9E3"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#F5F5F5"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#E3FFFD"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#155473" } + @{ "accentColor" = "#155473"; "backgroundColor" = "#E3FFFD" } + @{ "accentColor" = "#E3FFFD"; "backgroundColor" = "#155473" } + @{ "accentColor" = "#FFF9E3"; "backgroundColor" = "#155473" } + @{ "accentColor" = "#155473"; "backgroundColor" = "#FFF9E3" } ) } ``` @@ -268,20 +269,20 @@ Use the following PowerShell hashtable to define the color pairs for the Dark Bl ```powershell $colorPairs = @{ light = @( - @{ "themePrimary" = "#529FF1"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#1267B5" } - @{ "themePrimary" = "#1267B5"; "backgroundColor" = "#D7EEFF" } - @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#1267B5" } - @{ "themePrimary" = "#1267B5"; "backgroundColor" = "#B6FEC3" } - @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#1267B5" } - @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#F5F5F5"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#292929" } - @{ "themePrimary" = "#FFFFFF"; "backgroundColor" = "#010B2F" } - @{ "themePrimary" = "#010B2F"; "backgroundColor" = "#D7EEFF" } - @{ "themePrimary" = "#D7EEFF"; "backgroundColor" = "#010B2F" } - @{ "themePrimary" = "#010B2F"; "backgroundColor" = "#B6FEC3" } - @{ "themePrimary" = "#B6FEC3"; "backgroundColor" = "#010B2F" } + @{ "accentColor" = "#529FF1"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#1267B5" } + @{ "accentColor" = "#1267B5"; "backgroundColor" = "#D7EEFF" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#1267B5" } + @{ "accentColor" = "#1267B5"; "backgroundColor" = "#B6FEC3" } + @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#1267B5" } + @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#F5F5F5"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#292929" } + @{ "accentColor" = "#FFFFFF"; "backgroundColor" = "#010B2F" } + @{ "accentColor" = "#010B2F"; "backgroundColor" = "#D7EEFF" } + @{ "accentColor" = "#D7EEFF"; "backgroundColor" = "#010B2F" } + @{ "accentColor" = "#010B2F"; "backgroundColor" = "#B6FEC3" } + @{ "accentColor" = "#B6FEC3"; "backgroundColor" = "#010B2F" } ) } ``` From 87424098eaadfcc09b3660240b4abdf64ac9b900 Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Wed, 21 Jan 2026 11:36:51 +0800 Subject: [PATCH 03/10] update site theming overview --- .../images/default-themes.png | Bin 0 -> 43889 bytes .../sharepoint-site-theming-csom.md | 2 +- .../sharepoint-site-theming-overview.md | 18 ++++++------------ 3 files changed, 7 insertions(+), 13 deletions(-) create mode 100644 docs/declarative-customization/images/default-themes.png diff --git a/docs/declarative-customization/images/default-themes.png b/docs/declarative-customization/images/default-themes.png new file mode 100644 index 0000000000000000000000000000000000000000..602bf3219297f8737b3f895c5d5d1bfb35e51280 GIT binary patch literal 43889 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 ezd6yIk=T2V%KB+aU<8K @@ -51,7 +45,7 @@ To select from the available themes for a SharePoint site, choose the __gear ico The following image shows how the default themes are presented in the theme picker dialog box. -![Image showing list of default and dark (inverted) themes](../../images/theme-defaults.png) +![Image showing list of default and dark (inverted) themes](../images/default-themes.png) When you choose a theme in the list, those color settings are instantly applied to the page so that you can see what the selected theme will look like. From 48f13168b52efac458293774dce85ee820b8d045 Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Wed, 21 Jan 2026 18:20:58 +0800 Subject: [PATCH 04/10] update site theme csom --- .../sharepoint-site-theming-csom.md | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-csom.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-csom.md index 7e2606e4ec..cfe97994ea 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-csom.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-csom.md @@ -16,7 +16,7 @@ Before you get started, make sure that you're familiar with the following: - [Using the Client Object Model](https://msdn.microsoft.com/library/ff798388.aspx) - [Common Programming Tasks in the Managed Client Object Model](https://msdn.microsoft.com/library/ee537013.aspx) -You also need to reference the [Microsoft.SharePointOnline.CSOM](https://www.nuget.org/packages/Microsoft.SharePointOnline.CSOM/) NuGet package (version 16.1.6906.1200 or later). +You also need to reference the [Microsoft.SharePointOnline.CSOM](https://www.nuget.org/packages/Microsoft.SharePointOnline.CSOM/) NuGet package (version 16.1.26712.12000 or later). ## CSOM code example @@ -46,7 +46,7 @@ ClientObjectList themes = tenant.GetAllTenantThemes(); ## Theme definition example -For methods that take a theme argument, the following code defines an __SPOTheme__ class that you can use to create custom themes. +For methods that take a theme argument, the following code defines an __SPOTheme__ class that you can use to create custom themes. For the new theme format, only the `Name` and `ColorPairs` properties are required. For the legacy theme format, include the `Name`, `Palette`, and `IsInverted` properties. ```csharp ///   @@ -67,6 +67,13 @@ public class SPOTheme      public IDictionary Palette      {          get; private set;  +    }  + ///   + /// Specifies the color pairs setting of the theme. +    ///   +    public IDictionary>> ColorPairs +    {  +        get; private set;      }      ///       /// Specifies whether the theme is inverted, with a dark background and a light foreground.  @@ -86,14 +93,39 @@ There's currently no supported CSOM API to programmatically apply a theme to a s Use the following methods to customize the set of available themes for a SharePoint tenant administration site. You can add a new custom theme, update an existing theme, or delete a theme, and you can retrieve a specific theme or all themes. You can also hide or restore the default themes that come with SharePoint. +### AddTenantThemeAdvanced public method + +Add a theme to the organization. + +In multi-geo environments, themes added by an administrator in the primary geography are automatically propagated and available across the organization. This method is not supported for administrators in satellite geographies. + +__Namespace:__ Microsoft.Online.SharePoint.TenantAdministration.Tenant
+__Parameters:__ string name, string themeJson, bool shouldParseColorPair
+__Return type:__ ClientResult\ + +### UpdateTenantThemeAdvanced public method + +Update the settings for an existing theme. + +__Namespace:__ Microsoft.Online.SharePoint.TenantAdministration.Tenant
+__Parameters:__ string name, string themeJson, bool shouldParseColorPair
+__Return type:__ ClientResult\ + ### AddTenantTheme public method -Add a theme to the tenant. +Add a theme to the organization. This method is not supported for administrators in satellite geographies. __Namespace:__ Microsoft.Online.SharePoint.TenantAdministration.Tenant
__Parameters:__ string name, string themeJson
__Return type:__ ClientResult\ +### UpdateTenantTheme public method + +Update the settings for an existing theme. + +__Namespace:__ Microsoft.Online.SharePoint.TenantAdministration.Tenant
+__Parameters:__ string name, string themeJson
+__Return type:__ ClientResult\ ### DeleteTenantTheme public method Delete a theme from the tenant. @@ -104,7 +136,11 @@ __Return type:__ void ### GetAllTenantThemes public method -Retrieve all the themes that are currently available in the tenant, including any custom themes that have been added. Default themes are only included if the __HideDefaultThemes__ property is __false__ (the default value). +Retrieves the complete set of custom themes defined at the tenant level, including themes created through command-based tools and those created in the Brand Center UI. +> [!NOTE] +> To support consistent branding and simplify governance, theme management is transitioning to a centralized model. +> - The **primary geo** will act as the central location for **organization-wide theme creation and management**. Themes created here will be visible and applicable across satellite geos. +> - The satellite **Geo Administrators** will be able to view themes from the primary geo to their own sites by using `GetAllTenantThemes` method. Themes previously created within satellite geos will remain available for use. However, **creating new themes in satellite geos will no longer be supported** going forward. __Namespace:__ Microsoft.Online.SharePoint.TenantAdministration.Tenant
__Parameters:__ none
@@ -125,13 +161,6 @@ This property indicates whether the default themes are available in the theme pi __Namespace:__ Microsoft.Online.SharePoint.TenantAdministration.Tenant
__Type:__ Boolean -### UpdateTenantTheme public method - -Update the settings for an existing theme. - -__Namespace:__ Microsoft.Online.SharePoint.TenantAdministration.Tenant
-__Parameters:__ string name, string themeJson
-__Return type:__ ClientResult\ ## Methods of the Microsoft.Online.SharePoint.TenantManagement.Tenant class From 51e16fb44a484702476cbf39b173ef7cd71b2d2e Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Wed, 21 Jan 2026 18:50:47 +0800 Subject: [PATCH 05/10] update sharepoint theme rest api --- .../sharepoint-site-theming-rest-api.md | 107 ++++++++++++++++-- 1 file changed, 100 insertions(+), 7 deletions(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-rest-api.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-rest-api.md index de3d444348..d68ff3b59b 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-rest-api.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-rest-api.md @@ -1,7 +1,7 @@ --- title: SharePoint site theming - REST API description: Use the the SharePoint REST interface to perform basic create, read, update, and delete (CRUD) operations on site themes. -ms.date: 06/28/2022 +ms.date: 01/21/2026 ms.localizationpriority: high --- @@ -38,7 +38,53 @@ The URL for theme management REST commands is based on _api/thememanager. For ex ## AddTenantTheme -The following JavaScript sample code shows how to add a new theme to a tenant. +The following JavaScript sample code shows how to add a new format theme to a tenant. + +```javascript +function RestRequest(url,params) { + var req = new XMLHttpRequest(); + req.onreadystatechange = function () + { + if (req.readyState != 4) // Loaded + return; + console.log(req.responseText); + }; + // Prepend web URL to url and remove duplicated slashes. + var webBasedUrl = (_spPageContextInfo.webServerRelativeUrl + "//" + url).replace(/\/{2,}/,"/"); + req.open("POST",webBasedUrl,true); + req.setRequestHeader("Content-Type", "application/json;charset=utf-8"); + req.setRequestHeader("ACCEPT", "application/json; odata.metadata=minimal"); + req.setRequestHeader("x-requestdigest", _spPageContextInfo.formDigestValue); + req.setRequestHeader("ODATA-VERSION","4.0"); + req.send(params ? JSON.stringify(params) : void 0); +} + + +RestRequest("/_api/thememanager/AddTenantTheme"); + +var colorPairs = { + "light": [ + { "accentColor": "#03787C", "backgroundColor": "#FFFFFF" }, + { "accentColor": "#FFFFFF", "backgroundColor": "#03787C" }, + { "accentColor": "#E3FFFD", "backgroundColor": "#03787C" }, + { "accentColor": "#03787C", "backgroundColor": "#E3FFFD" }, + { "accentColor": "#FFF9E3", "backgroundColor": "#03787C" }, + { "accentColor": "#03787C", "backgroundColor": "#FFF9E3" }, + { "accentColor": "#03787C", "backgroundColor": "#F5F5F5" }, + { "accentColor": "#242424", "backgroundColor": "#F5F5F5" }, + { "accentColor": "#155473", "backgroundColor": "#FFFFFF" }, + { "accentColor": "#FFFFFF", "backgroundColor": "#155473" }, + { "accentColor": "#155473", "backgroundColor": "#E3FFFD" }, + { "accentColor": "#E3FFFD", "backgroundColor": "#155473" }, + { "accentColor": "#FFF9E3", "backgroundColor": "#155473" }, + { "accentColor": "#155473", "backgroundColor": "#FFF9E3" } + ] +} + +RestRequest("/_api/thememanager/AddTenantTheme", {name:"Teal Theme", themeJson: JSON.stringify(colorPairs), shouldParseColorPair: true}); +``` + +The following JavaScript sample code shows how to add a legacy format theme to a tenant. ```javascript function RestRequest(url,params) { @@ -91,6 +137,7 @@ var pal = { "error": "#ff5f5f" } } + RestRequest("/_api/thememanager/AddTenantTheme", {name:"Sounders Rave Green", themeJson: JSON.stringify(pal)}); ``` @@ -153,7 +200,7 @@ RestRequest("/_api/thememanager/GetTenantThemingOptions"); ## ApplyTheme -The following JavaScript sample code shows how to apply theme to the site. +The following JavaScript sample code shows how to apply theme to the site. For details about the themeJson structure, see the [SharePoint site theming: JSON schema](sharepoint-site-theming-json-schema.md) ```javascript function RestRequest(url,params) { @@ -174,14 +221,14 @@ function RestRequest(url,params) { req.send(params ? JSON.stringify(params) : void 0); } -var pal = { +var themeJson = { "palette" : { "themePrimary": "#1BF242", "themeLighterAlt": "#0d0b00", "themeLighter": "#0b35bc", "themeLight": "#322d00", "themeTertiary": "#6a5f00", - "themeSecondary": "#1B22F2", + "themeSecondary": "#1B22F2", "themeDarkAlt": "#ffe817", "themeDark": "#ffed4b", "themeDarker": "#fff171", @@ -203,12 +250,58 @@ var pal = { "error": "#ff5f5f" } } -RestRequest("/_api/thememanager/ApplyTheme", {name:"Sounders Rave Green", themeJson: JSON.stringify(pal)}); +RestRequest("/_api/thememanager/ApplyTheme", {name:"Sounders Rave Green", themeJson: JSON.stringify(themeJson)}); ``` ## UpdateTenantTheme -The following JavaScript sample code shows how to update tenant theme. +The following JavaScript example shows how to update a tenant theme in the new format. + +```javascript +function RestRequest(url,params) { + var req = new XMLHttpRequest(); + req.onreadystatechange = function () + { + if (req.readyState != 4) // Loaded + return; + console.log(req.responseText); + }; + // Prepend web URL to url and remove duplicated slashes. + var webBasedUrl = (_spPageContextInfo.webServerRelativeUrl + "//" + url).replace(/\/{2,}/,"/"); + req.open("POST",webBasedUrl,true); + req.setRequestHeader("Content-Type", "application/json;charset=utf-8"); + req.setRequestHeader("ACCEPT", "application/json; odata.metadata=minimal"); + req.setRequestHeader("x-requestdigest", _spPageContextInfo.formDigestValue); + req.setRequestHeader("ODATA-VERSION","4.0"); + req.send(params ? JSON.stringify(params) : void 0); +} + + +RestRequest("/_api/thememanager/AddTenantTheme"); + +var colorPairs = { + "light": [ + { "accentColor": "#03787C", "backgroundColor": "#FFFFFF" }, + { "accentColor": "#FFFFFF", "backgroundColor": "#03787C" }, + { "accentColor": "#E3FFFD", "backgroundColor": "#03787C" }, + { "accentColor": "#03787C", "backgroundColor": "#E3FFFD" }, + { "accentColor": "#FFF9E3", "backgroundColor": "#03787C" }, + { "accentColor": "#03787C", "backgroundColor": "#FFF9E3" }, + { "accentColor": "#03787C", "backgroundColor": "#F5F5F5" }, + { "accentColor": "#242424", "backgroundColor": "#F5F5F5" }, + { "accentColor": "#155473", "backgroundColor": "#FFFFFF" }, + { "accentColor": "#FFFFFF", "backgroundColor": "#155473" }, + { "accentColor": "#155473", "backgroundColor": "#E3FFFD" }, + { "accentColor": "#E3FFFD", "backgroundColor": "#155473" }, + { "accentColor": "#FFF9E3", "backgroundColor": "#155473" }, + { "accentColor": "#155473", "backgroundColor": "#FFF9E3" } + ] +} + +RestRequest("/_api/thememanager/UpdateTenantTheme", {name:"Teal Theme", themeJson: JSON.stringify(colorPairs), shouldParseColorPair: true}); +``` + +The following JavaScript example shows how to update a tenant theme in the legacy format. ```javascript function RestRequest(url,params) { From 2bbe35c65be354c9a2199d5f6ebffd72d93b0f65 Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Thu, 22 Jan 2026 13:59:39 +0800 Subject: [PATCH 06/10] update theme json store schema --- .../sharepoint-site-theming-json-schema.md | 138 +++++++++++++++--- 1 file changed, 114 insertions(+), 24 deletions(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md index a7ac0e77fd..658bc81b52 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md @@ -7,37 +7,127 @@ ms.localizationpriority: high # SharePoint site theming: JSON schema -The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to define color settings and other information about each theme. Each theme includes the following keys: - -- **name**: The name of the theme, which appears in the theme picker UI and is also used by administrators and developers to refer to the theme in PowerShell cmdlets or calls to the SharePoint REST API. -- **colorPairs**: Color pairs are the foundation of your theme, enabling multiple brand colors to reflect your organization’s brand identity and personality. Each theme supports up to 16 color pairs, with each pair consisting of an accent color and a background color. To ensure readability, the text color is automatically set to black or white based on the contrast ratio of the background color. -The colors in the colorPairs element are specified as 6-digit or 3-digit hexadecimal RGB string values. - -The following is an example of a JSON object that defines a colorPairs. +The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to define color settings and other information about each theme. Legacy theme formats do not support the secondaryColors and displayMode fields. Theme settings are stored in a JSON object that contains the following keys: + +- **isInverted**: This value should be false for light themes and true for dark themes; it controls whether SharePoint uses dark or light theme colors to render text on colored backgrounds. +- **backgroundImageUri**: The URI of an optional background image for the theme (value can be blank if no background image). +- **palette**: A nested JSON object that stores the RGB color values for the theme. +When using the new theme format, the values of themePrimary and backgroundColor are used as the first color pair in the palette: + - themePrimary + - themeLighterAlt + - themeLighter + - themeLight + - themeTertiary + - themeSecondary + - themeDarkAlt + - themeDark + - themeDarker + - neutralLighterAlt + - neutralLighter + - neutralLight + - neutralQuaternaryAlt + - neutralQuaternary + - neutralTertiaryAlt + - neutralTertiary + - neutralSecondaryAlt + - neutralSecondary + - neutralPrimaryAlt + - neutralPrimary + - neutralDark + - black + - white + - primaryBackground + - primaryText + - bodyBackground + - bodyText + - disabledBackground + - disabledText + - error + - accent + - backgroundColor + + Another option is to use the [Theme Generator tool](https://aka.ms/themedesigner) to build a custom theme palette. It provides an interactive UI for selecting theme colors, and automatically generates the JSON, SASS, and PowerShell definitions for your custom theme. + +> [!NOTE] +> The theme generator definitions do not currently include the following color slots and key/value pairs: +> +> - "primaryBackground" +> - "primaryText" +> - "bodyBackground" +> - "bodyText" +> - "disabledBackground" +> - "disabledText" +> - "error" +> - "accent" +> - "backgroundColor" +> +> These can be manually added to your generated definition before uploading to the tenant. + +![Theme Generator tool](../../images/theme-generator-tool.png) +- **secondaryColors**: An optional section available only in the new theme format of the SharePoint site theme schema. It defines additional accent and background color pairs that complement the main theme palette. The first color pair comes from the palette. Currently, only the light theme is supported. +- **displayMode**: The visual mode that the theme palette corresponds to. Currently, only `light` mode is supported. +- **themeSchemaVersion**: The theme schema version. Use `2.0.0` for the latest theme format. Use `1.0.0` for legacy theme format. +- **version**: The theme version. Use `2.0.0` for the latest theme format. Use `1.0.0` for legacy theme format. + +The following is an example of a JSON object that defines a theme. ```json { - "light": [ - { "accentColor": "#03787C", "backgroundColor": "#FFFFFF" }, - { "accentColor": "#FFFFFF", "backgroundColor": "#03787C" }, - { "accentColor": "#E3FFFD", "backgroundColor": "#03787C" }, - { "accentColor": "#03787C", "backgroundColor": "#E3FFFD" }, - { "accentColor": "#FFF9E3", "backgroundColor": "#03787C" }, - { "accentColor": "#03787C", "backgroundColor": "#FFF9E3" }, - { "accentColor": "#03787C", "backgroundColor": "#F5F5F5" }, - { "accentColor": "#242424", "backgroundColor": "#F5F5F5" }, - { "accentColor": "#155473", "backgroundColor": "#FFFFFF" }, - { "accentColor": "#FFFFFF", "backgroundColor": "#155473" }, - { "accentColor": "#155473", "backgroundColor": "#E3FFFD" }, - { "accentColor": "#E3FFFD", "backgroundColor": "#155473" }, - { "accentColor": "#FFF9E3", "backgroundColor": "#155473" }, - { "accentColor": "#155473", "backgroundColor": "#FFF9E3" } - ] + "name": "Teal theme", + "isInverted": true, + "palette": { + "themeDarker": "#014446", + "themeDark": "#025C5F", + "themeDarkAlt": "#026D70", + "themePrimary": "#03787C", + "themeSecondary": "#13898D", + "themeTertiary": "#49AEB1", + "themeLight": "#98D6D8", + "themeLighter": "#C5E9EA", + "themeLighterAlt": "#F0F9FA", + "neutralDark": "#201F1E", + "neutralPrimary": "#323130", + "neutralPrimaryAlt": "#3B3A39", + "neutralSecondary": "#605E5C", + "neutralTertiary": "#A19F9D", + "neutralTertiaryAlt": "#C8C8C8", + "neutralLight": "#EAEAEA", + "neutralLighter": "#F4F4F4", + "neutralLighterAlt": "#F8F8F8", + "neutralQuaternaryAlt": "#DADADA", + "neutralQuaternary": "#D0D0D0", + "backgroundColor": "#FFFFFF", + "black": "#000000", + "white": "#FFFFFF" + }, + "secondaryColors": { + "light": [ + { "themePrimary": "#FFFFFF", "backgroundColor": "#03787C" }, + { "themePrimary": "#E3FFFD", "backgroundColor": "#03787C" }, + { "themePrimary": "#03787C", "backgroundColor": "#E3FFFD" }, + { "themePrimary": "#FFF9E3", "backgroundColor": "#03787C" }, + { "themePrimary": "#03787C", "backgroundColor": "#FFF9E3" }, + { "themePrimary": "#03787C", "backgroundColor": "#F5F5F5" }, + { "themePrimary": "#242424", "backgroundColor": "#F5F5F5" }, + { "themePrimary": "#155473", "backgroundColor": "#FFFFFF" }, + { "themePrimary": "#FFFFFF", "backgroundColor": "#155473" }, + { "themePrimary": "#155473", "backgroundColor": "#E3FFFD" }, + { "themePrimary": "#E3FFFD", "backgroundColor": "#155473" }, + { "themePrimary": "#FFF9E3", "backgroundColor": "#155473" }, + { "themePrimary": "#155473", "backgroundColor": "#FFF9E3" } + ], + "dark": [] + }, + "displayMode": "light", + "themeSchemaVersion": "2.0.0", + "version": "2.0.0" } ``` -The SharePoint Framework includes ten built-in themes: eight on light backgrounds, and two on dark backgrounds. You might find it useful to create a custom theme by starting from one of the built-in themes and adjusting it to suit your needs. + +Besides the theme store schema, we also offer a simplified format for creating themes. +SharePoint Framework provides ten built‑in themes—eight for light backgrounds, and two for dark backgrounds. If you want to build a custom theme, a good starting point is to pick one of these built‑in themes and adjust the values as needed. You can then use the [Add‑SPOTheme](/powershell/module/microsoft.online.sharepoint.powershell/add-spotheme) PowerShell cmdlet to create your custom theme with this simplified structure. ## Teal theme From 13945a253d954fc4f6319f35b6518fc7b52a7c33 Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Thu, 22 Jan 2026 15:16:26 +0800 Subject: [PATCH 07/10] update --- .../sharepoint-site-theming-json-schema.md | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md index 658bc81b52..4ce4533354 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md @@ -7,12 +7,12 @@ ms.localizationpriority: high # SharePoint site theming: JSON schema -The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to define color settings and other information about each theme. Legacy theme formats do not support the secondaryColors and displayMode fields. Theme settings are stored in a JSON object that contains the following keys: +The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to store color settings and other information about each theme. Legacy theme formats do not support the secondaryColors and displayMode fields. Theme settings are stored in a JSON object that contains the following keys: - **isInverted**: This value should be false for light themes and true for dark themes; it controls whether SharePoint uses dark or light theme colors to render text on colored backgrounds. - **backgroundImageUri**: The URI of an optional background image for the theme (value can be blank if no background image). - **palette**: A nested JSON object that stores the RGB color values for the theme. -When using the new theme format, the values of themePrimary and backgroundColor are used as the first color pair in the palette: +When using the new theme format, the values of `themePrimary` and `backgroundColor` are used as the first color pair in the palette. The `backgroundColor` setting is only used in the new theme format. The palette object includes the following keys: - themePrimary - themeLighterAlt - themeLighter @@ -46,6 +46,8 @@ When using the new theme format, the values of themePrimary and backgroundColor - accent - backgroundColor +The colors in the `palette` element are specified as 6-digit or 3-digit hexadecimal RGB string values. + Another option is to use the [Theme Generator tool](https://aka.ms/themedesigner) to build a custom theme palette. It provides an interactive UI for selecting theme colors, and automatically generates the JSON, SASS, and PowerShell definitions for your custom theme. > [!NOTE] @@ -64,7 +66,31 @@ When using the new theme format, the values of themePrimary and backgroundColor > These can be manually added to your generated definition before uploading to the tenant. ![Theme Generator tool](../../images/theme-generator-tool.png) -- **secondaryColors**: An optional section available only in the new theme format of the SharePoint site theme schema. It defines additional accent and background color pairs that complement the main theme palette. The first color pair comes from the palette. Currently, only the light theme is supported. +- **secondaryColors**: An optional section available only in the new theme format of the SharePoint site theme schema. It defines additional accent and background color pairs that complement the main theme palette. The first color pair comes from the palette. Currently, only the light theme is supported. +Here is an example of secondaryColors, it is the set of combination of themePrimary and backgroundColor.The colors in the `secondaryColors` element are specified as 6-digit or 3-digit hexadecimal RGB string values. + + +```json + "secondaryColors": { + "light": [ + { "themePrimary": "#FFFFFF", "backgroundColor": "#03787C" }, + { "themePrimary": "#E3FFFD", "backgroundColor": "#03787C" }, + { "themePrimary": "#03787C", "backgroundColor": "#E3FFFD" }, + { "themePrimary": "#FFF9E3", "backgroundColor": "#03787C" }, + { "themePrimary": "#03787C", "backgroundColor": "#FFF9E3" }, + { "themePrimary": "#03787C", "backgroundColor": "#F5F5F5" }, + { "themePrimary": "#242424", "backgroundColor": "#F5F5F5" }, + { "themePrimary": "#155473", "backgroundColor": "#FFFFFF" }, + { "themePrimary": "#FFFFFF", "backgroundColor": "#155473" }, + { "themePrimary": "#155473", "backgroundColor": "#E3FFFD" }, + { "themePrimary": "#E3FFFD", "backgroundColor": "#155473" }, + { "themePrimary": "#FFF9E3", "backgroundColor": "#155473" }, + { "themePrimary": "#155473", "backgroundColor": "#FFF9E3" } + ], + "dark": [] + } +``` + - **displayMode**: The visual mode that the theme palette corresponds to. Currently, only `light` mode is supported. - **themeSchemaVersion**: The theme schema version. Use `2.0.0` for the latest theme format. Use `1.0.0` for legacy theme format. - **version**: The theme version. Use `2.0.0` for the latest theme format. Use `1.0.0` for legacy theme format. From 80dac3ffb411c4ed654221506cc1fe7a37a5f04a Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Thu, 22 Jan 2026 15:34:27 +0800 Subject: [PATCH 08/10] update image --- .../images/default-themes.png | Bin 43889 -> 29366 bytes .../sharepoint-site-theming-json-schema.md | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/declarative-customization/images/default-themes.png b/docs/declarative-customization/images/default-themes.png index 602bf3219297f8737b3f895c5d5d1bfb35e51280..f6f6b88feba5c43750ad633db85365579501f1b9 100644 GIT binary patch literal 29366 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
YHgPoDa{WI^=xr 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 ezd6yIk=T2V%KB+aU<8K Date: Thu, 22 Jan 2026 15:42:08 +0800 Subject: [PATCH 09/10] update --- .../sharepoint-site-theming-json-schema.md | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md index ea89d677b7..20f6a916c1 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md @@ -94,11 +94,10 @@ Here is an example of secondaryColors, it is the set of combination of themePrim - **themeSchemaVersion**: The theme schema version. Use `2.0.0` for the latest theme format. Use `1.0.0` for legacy theme format. - **version**: The theme version. Use `2.0.0` for the latest theme format. Use `1.0.0` for legacy theme format. -The following is an example of a JSON object that defines a theme. +The following is an example of a JSON object that defines a theme in new theme format. ```json { - "name": "Teal theme", "isInverted": true, "palette": { "themeDarker": "#014446", @@ -121,9 +120,9 @@ The following is an example of a JSON object that defines a theme. "neutralLighterAlt": "#F8F8F8", "neutralQuaternaryAlt": "#DADADA", "neutralQuaternary": "#D0D0D0", - "backgroundColor": "#FFFFFF", "black": "#000000", - "white": "#FFFFFF" + "white": "#FFFFFF", + "backgroundColor": "#FFFFFF" }, "secondaryColors": { "light": [ @@ -150,6 +149,40 @@ The following is an example of a JSON object that defines a theme. ``` +The following is an example of a JSON object that defines a theme in legacy theme format. + +```json +{ + "isInverted": true, + "palette": { + "themeDarker": "#014446", + "themeDark": "#025C5F", + "themeDarkAlt": "#026D70", + "themePrimary": "#03787C", + "themeSecondary": "#13898D", + "themeTertiary": "#49AEB1", + "themeLight": "#98D6D8", + "themeLighter": "#C5E9EA", + "themeLighterAlt": "#F0F9FA", + "neutralDark": "#201F1E", + "neutralPrimary": "#323130", + "neutralPrimaryAlt": "#3B3A39", + "neutralSecondary": "#605E5C", + "neutralTertiary": "#A19F9D", + "neutralTertiaryAlt": "#C8C8C8", + "neutralLight": "#EAEAEA", + "neutralLighter": "#F4F4F4", + "neutralLighterAlt": "#F8F8F8", + "neutralQuaternaryAlt": "#DADADA", + "neutralQuaternary": "#D0D0D0", + "black": "#000000", + "white": "#FFFFFF" + }, + "themeSchemaVersion": "1.0.0", + "version": "1.0.0" +} +``` + Besides the theme store schema, we also offer a simplified format for creating themes. SharePoint Framework provides ten built‑in themes—eight for light backgrounds, and two for dark backgrounds. If you want to build a custom theme, a good starting point is to pick one of these built‑in themes and adjust the values as needed. You can then use the [Add‑SPOTheme](/powershell/module/microsoft.online.sharepoint.powershell/add-spotheme) PowerShell cmdlet to create your custom theme with this simplified structure. From 88aa827fae3ee2addd50adcf08e1d1b9da7e0737 Mon Sep 17 00:00:00 2001 From: rongqizhou Date: Thu, 22 Jan 2026 15:58:22 +0800 Subject: [PATCH 10/10] update --- .../site-theming/sharepoint-site-theming-json-schema.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md index 20f6a916c1..91fbd9ddad 100644 --- a/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md +++ b/docs/declarative-customization/site-theming/sharepoint-site-theming-json-schema.md @@ -7,7 +7,7 @@ ms.localizationpriority: high # SharePoint site theming: JSON schema -The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to store color settings and other information about each theme. Legacy theme formats do not support the secondaryColors and displayMode fields. Theme settings are stored in a JSON object that contains the following keys: +The new [SharePoint site theming](sharepoint-site-theming-overview.md) features use a JSON schema to store color settings and other information about each theme. Only the new theme format supports the secondaryColor and displayMode fields. Theme settings are stored in a JSON object that contains the following keys: - **isInverted**: This value should be false for light themes and true for dark themes; it controls whether SharePoint uses dark or light theme colors to render text on colored backgrounds. - **backgroundImageUri**: The URI of an optional background image for the theme (value can be blank if no background image).