diff --git a/packages/generate-design-tokens/index.js b/packages/generate-design-tokens/index.js index b9f55fec00..a1dccc9002 100644 --- a/packages/generate-design-tokens/index.js +++ b/packages/generate-design-tokens/index.js @@ -145,6 +145,14 @@ export const get${toPascalCase(skinName)}Skin: GetKnownSkin = () => { .join(',')} }, textPresets: ${JSON.stringify(jsonSort(textTokens))}, + themeVariants: { + ${Object.entries(designTokens.themeVariant) + .map( + ([componentName, variantDescription]) => + `'${componentName}': '${variantDescription.value}'` + ) + .join(',')}, + }, }; return skin; }; diff --git a/src/__tests__/list-test.tsx b/src/__tests__/list-test.tsx index bf2e81037b..a9cab60b6f 100644 --- a/src/__tests__/list-test.tsx +++ b/src/__tests__/list-test.tsx @@ -234,7 +234,7 @@ test('RowList inside Form', async () => { radio: 'banana', }); }); -}, 20000); +}, 30000); test('Row list with icon buttons', async () => { const firstButtonSpy = jest.fn(); diff --git a/src/feedback.tsx b/src/feedback.tsx index 007d9ce814..1db9a197c7 100644 --- a/src/feedback.tsx +++ b/src/feedback.tsx @@ -289,12 +289,15 @@ export const FeedbackScreen = ({ export const SuccessFeedbackScreen = ({dataAttributes, ...props}: AssetFeedbackProps): JSX.Element => { const {isTabletOrSmaller} = useScreenSize(); - const {skinName} = useTheme(); + const {skinName, themeVariants} = useTheme(); return ( ( ({isLoading = true, onClose, dataAttributes, ...textProps}, ref) => { + const {themeVariants} = useTheme(); const [isClosing, setIsClosing] = React.useState(false); const logoClosedRef = React.useRef(false); const textClosedRef = React.useRef(false); @@ -337,7 +338,7 @@ export const BrandLoadingScreen = React.forwardRef { diff --git a/src/skins/defaults.tsx b/src/skins/defaults.tsx index 8ec8965021..026314202d 100644 --- a/src/skins/defaults.tsx +++ b/src/skins/defaults.tsx @@ -1,4 +1,4 @@ -import type {BorderRadiiConfig, TextPresetsConfig} from './types'; +import type {BorderRadiiConfig, TextPresetsConfig, ThemeVariantsConfig} from './types'; export const defaultTextPresetsConfig: TextPresetsConfig = { text1: {size: {mobile: 12, desktop: 14}, lineHeight: {mobile: 16, desktop: 20}}, @@ -35,3 +35,8 @@ export const defaultBorderRadiiConfig: BorderRadiiConfig = { avatar: '50%', mediaSmall: '8px', }; + +export const defaultThemeVariantsConfig: ThemeVariantsConfig = { + brandLoadingScreen: 'inverse', + successFeedback: 'inverse', +}; diff --git a/src/skins/types/index.tsx b/src/skins/types/index.tsx index 81924aef74..8ec28d9373 100644 --- a/src/skins/types/index.tsx +++ b/src/skins/types/index.tsx @@ -1,3 +1,4 @@ +import type {Variant} from '../../theme-variant-context'; import type {Colors} from './colors'; export type {Colors} from './colors'; @@ -80,12 +81,18 @@ export type BorderRadiiConfig = { mediaSmall: string; }; +export type ThemeVariantsConfig = { + successFeedback: Variant; + brandLoadingScreen: Variant; +}; + export type Skin = { name: SkinName; colors: Colors; darkModeColors?: Partial; textPresets?: PartialTextPresetsConfig; borderRadii?: BorderRadiiConfig; + themeVariants?: ThemeVariantsConfig; }; export type KnownSkin = { @@ -94,4 +101,5 @@ export type KnownSkin = { darkModeColors?: Partial; textPresets?: PartialTextPresetsConfig; borderRadii?: BorderRadiiConfig; + themeVariants?: ThemeVariantsConfig; }; diff --git a/src/theme-context-provider.tsx b/src/theme-context-provider.tsx index 30bcded897..9d9a562187 100644 --- a/src/theme-context-provider.tsx +++ b/src/theme-context-provider.tsx @@ -15,7 +15,11 @@ import {AspectRatioSupportProvider} from './utils/aspect-ratio-support'; import {TrackingConfig} from './utils/analytics'; import {vars} from './skins/skin-contract.css'; import {fromHexToRgb} from './utils/color'; -import {defaultBorderRadiiConfig, defaultTextPresetsConfig} from './skins/defaults'; +import { + defaultBorderRadiiConfig, + defaultTextPresetsConfig, + defaultThemeVariantsConfig, +} from './skins/defaults'; import {isClientSide} from './utils/environment'; import {PACKAGE_VERSION} from './package-version'; import {SnackbarRoot} from './snackbar-context'; @@ -180,8 +184,9 @@ const ThemeContextProvider = ({theme, children, as, withoutStyles = false}: Prop ...dimensions, ...sanitizeDimensions(theme.dimensions), }, - textPresets, borderRadii: theme.skin.borderRadii ?? defaultBorderRadiiConfig, + textPresets, + themeVariants: theme.skin.themeVariants ?? defaultThemeVariantsConfig, Link: getMisticaLinkComponent(theme.Link), isDarkMode: isDarkModeEnabled, isIos: getPlatform(platformOverrides) === 'ios', diff --git a/src/theme.tsx b/src/theme.tsx index 6aa5361da1..22d0c86ce5 100644 --- a/src/theme.tsx +++ b/src/theme.tsx @@ -2,7 +2,14 @@ import * as React from 'react'; import type {RegionCode} from './utils/region-code'; import type {Locale} from './utils/locale'; -import type {BorderRadiiConfig, Colors, Skin, SkinName, TextPresetsConfig} from './skins/types'; +import type { + BorderRadiiConfig, + Colors, + Skin, + SkinName, + TextPresetsConfig, + ThemeVariantsConfig, +} from './skins/types'; import type {TrackingEvent} from './utils/types'; import type {Dictionary, TextToken} from './text-tokens'; @@ -164,6 +171,7 @@ export type Theme = { colorValues: Colors; borderRadii: BorderRadiiConfig; textPresets: TextPresetsConfig; + themeVariants: ThemeVariantsConfig; Link: LinkComponent; isDarkMode: boolean; isIos: boolean;