Skip to content

Commit a80f5bd

Browse files
authored
feat(skin): allow customizing some components theme variant by skin (#1375)
WEB-2234
1 parent 52c7882 commit a80f5bd

8 files changed

Lines changed: 46 additions & 8 deletions

File tree

packages/generate-design-tokens/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,14 @@ export const get${toPascalCase(skinName)}Skin: GetKnownSkin = () => {
145145
.join(',')}
146146
},
147147
textPresets: ${JSON.stringify(jsonSort(textTokens))},
148+
themeVariants: {
149+
${Object.entries(designTokens.themeVariant)
150+
.map(
151+
([componentName, variantDescription]) =>
152+
`'${componentName}': '${variantDescription.value}'`
153+
)
154+
.join(',')},
155+
},
148156
};
149157
return skin;
150158
};

src/__tests__/list-test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ test('RowList inside Form', async () => {
234234
radio: 'banana',
235235
});
236236
});
237-
}, 20000);
237+
}, 30000);
238238

239239
test('Row list with icon buttons', async () => {
240240
const firstButtonSpy = jest.fn();

src/feedback.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,12 +289,15 @@ export const FeedbackScreen = ({
289289

290290
export const SuccessFeedbackScreen = ({dataAttributes, ...props}: AssetFeedbackProps): JSX.Element => {
291291
const {isTabletOrSmaller} = useScreenSize();
292-
const {skinName} = useTheme();
292+
const {skinName, themeVariants} = useTheme();
293293

294294
return (
295295
<FeedbackScreen
296296
{...props}
297-
isInverse={!props.unstable_inlineInDesktop || isTabletOrSmaller}
297+
isInverse={
298+
themeVariants.successFeedback === 'inverse' &&
299+
(!props.unstable_inlineInDesktop || isTabletOrSmaller)
300+
}
298301
hapticFeedback="success"
299302
asset={
300303
skinName === VIVO_SKIN ? (

src/loading-screen.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ type BrandLoadingScreenProps = {
320320

321321
export const BrandLoadingScreen = React.forwardRef<HTMLDivElement, BrandLoadingScreenProps>(
322322
({isLoading = true, onClose, dataAttributes, ...textProps}, ref) => {
323+
const {themeVariants} = useTheme();
323324
const [isClosing, setIsClosing] = React.useState(false);
324325
const logoClosedRef = React.useRef(false);
325326
const textClosedRef = React.useRef(false);
@@ -337,7 +338,7 @@ export const BrandLoadingScreen = React.forwardRef<HTMLDivElement, BrandLoadingS
337338
return (
338339
<BaseLoadingScreen
339340
ref={ref}
340-
isInverse
341+
isInverse={themeVariants.brandLoadingScreen === 'inverse'}
341342
{...textProps}
342343
isLoading={isLoading || !isClosing}
343344
onClose={() => {

src/skins/defaults.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {BorderRadiiConfig, TextPresetsConfig} from './types';
1+
import type {BorderRadiiConfig, TextPresetsConfig, ThemeVariantsConfig} from './types';
22

33
export const defaultTextPresetsConfig: TextPresetsConfig = {
44
text1: {size: {mobile: 12, desktop: 14}, lineHeight: {mobile: 16, desktop: 20}},
@@ -35,3 +35,8 @@ export const defaultBorderRadiiConfig: BorderRadiiConfig = {
3535
avatar: '50%',
3636
mediaSmall: '8px',
3737
};
38+
39+
export const defaultThemeVariantsConfig: ThemeVariantsConfig = {
40+
brandLoadingScreen: 'inverse',
41+
successFeedback: 'inverse',
42+
};

src/skins/types/index.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type {Variant} from '../../theme-variant-context';
12
import type {Colors} from './colors';
23

34
export type {Colors} from './colors';
@@ -80,12 +81,18 @@ export type BorderRadiiConfig = {
8081
mediaSmall: string;
8182
};
8283

84+
export type ThemeVariantsConfig = {
85+
successFeedback: Variant;
86+
brandLoadingScreen: Variant;
87+
};
88+
8389
export type Skin = {
8490
name: SkinName;
8591
colors: Colors;
8692
darkModeColors?: Partial<Colors>;
8793
textPresets?: PartialTextPresetsConfig;
8894
borderRadii?: BorderRadiiConfig;
95+
themeVariants?: ThemeVariantsConfig;
8996
};
9097

9198
export type KnownSkin = {
@@ -94,4 +101,5 @@ export type KnownSkin = {
94101
darkModeColors?: Partial<Colors>;
95102
textPresets?: PartialTextPresetsConfig;
96103
borderRadii?: BorderRadiiConfig;
104+
themeVariants?: ThemeVariantsConfig;
97105
};

src/theme-context-provider.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import {AspectRatioSupportProvider} from './utils/aspect-ratio-support';
1515
import {TrackingConfig} from './utils/analytics';
1616
import {vars} from './skins/skin-contract.css';
1717
import {fromHexToRgb} from './utils/color';
18-
import {defaultBorderRadiiConfig, defaultTextPresetsConfig} from './skins/defaults';
18+
import {
19+
defaultBorderRadiiConfig,
20+
defaultTextPresetsConfig,
21+
defaultThemeVariantsConfig,
22+
} from './skins/defaults';
1923
import {isClientSide} from './utils/environment';
2024
import {PACKAGE_VERSION} from './package-version';
2125
import {SnackbarRoot} from './snackbar-context';
@@ -180,8 +184,9 @@ const ThemeContextProvider = ({theme, children, as, withoutStyles = false}: Prop
180184
...dimensions,
181185
...sanitizeDimensions(theme.dimensions),
182186
},
183-
textPresets,
184187
borderRadii: theme.skin.borderRadii ?? defaultBorderRadiiConfig,
188+
textPresets,
189+
themeVariants: theme.skin.themeVariants ?? defaultThemeVariantsConfig,
185190
Link: getMisticaLinkComponent(theme.Link),
186191
isDarkMode: isDarkModeEnabled,
187192
isIos: getPlatform(platformOverrides) === 'ios',

src/theme.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ import * as React from 'react';
22

33
import type {RegionCode} from './utils/region-code';
44
import type {Locale} from './utils/locale';
5-
import type {BorderRadiiConfig, Colors, Skin, SkinName, TextPresetsConfig} from './skins/types';
5+
import type {
6+
BorderRadiiConfig,
7+
Colors,
8+
Skin,
9+
SkinName,
10+
TextPresetsConfig,
11+
ThemeVariantsConfig,
12+
} from './skins/types';
613
import type {TrackingEvent} from './utils/types';
714
import type {Dictionary, TextToken} from './text-tokens';
815

@@ -164,6 +171,7 @@ export type Theme = {
164171
colorValues: Colors;
165172
borderRadii: BorderRadiiConfig;
166173
textPresets: TextPresetsConfig;
174+
themeVariants: ThemeVariantsConfig;
167175
Link: LinkComponent;
168176
isDarkMode: boolean;
169177
isIos: boolean;

0 commit comments

Comments
 (0)