Skip to content

Commit f78c54b

Browse files
Internal: refactor experimental theme consumption (#4056)
1 parent 4f4e8ca commit f78c54b

File tree

71 files changed

+7716
-711
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+7716
-711
lines changed

docs/docs-components/DocsVisualRefreshTypographyStyle.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
// eslint-disable-next-line eslint-comments/disable-enable-pair
22
/* eslint-disable gestalt/only-valid-tokens */
3-
import { useDangerouslyInGestaltExperiment } from 'gestalt';
3+
import { useExperimentalTheme } from 'gestalt';
44

55
export default function DocsVisualRefreshTypographyStyle() {
6-
const isInExperiment = useDangerouslyInGestaltExperiment({
7-
webExperimentName: 'web_gestalt_visualrefresh',
8-
mwebExperimentName: 'web_gestalt_visualrefresh',
9-
});
6+
const theme = useExperimentalTheme();
107

11-
return isInExperiment ? (
8+
return theme.MAIN ? (
129
<style
1310
// eslint-disable-next-line react/no-danger
1411
dangerouslySetInnerHTML={{

docs/docs-components/Header.tsx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
Sticky,
1313
Tabs,
1414
Text,
15-
useDangerouslyInGestaltExperiment,
15+
useExperimentalTheme,
1616
} from 'gestalt';
1717
import { useAppContext } from './appContext';
1818
import trackButtonClick from './buttons/trackButtonClick';
@@ -39,23 +39,14 @@ function getTabs(componentPlatform: 'web' | 'android' | 'ios') {
3939
}
4040

4141
function Header() {
42+
const theme = useExperimentalTheme();
4243
const router = useRouter();
4344
const { isSidebarOpen, setIsSidebarOpen, componentPlatformFilteredBy } = useNavigationContext();
4445
const [isMobileSearchExpandedOpen, setMobileSearchExpanded] = useState(false);
4546
const [showVRToggle, setShowVRToggle] = useState(false);
4647

4748
const searchAnchorRef = useRef<null | HTMLButtonElement | HTMLAnchorElement>(null);
4849

49-
const isInVRExperiment = useDangerouslyInGestaltExperiment({
50-
webExperimentName: 'web_gestalt_visualrefresh',
51-
mwebExperimentName: 'web_gestalt_visualrefresh',
52-
});
53-
54-
const isInCalico01Experiment = useDangerouslyInGestaltExperiment({
55-
webExperimentName: 'web_gestalt_calico01',
56-
mwebExperimentName: 'web_gestalt_calico01',
57-
});
58-
5950
const { setExperiments, experiments } = useAppContext();
6051

6152
const mainNavigationTabs = useMemo(
@@ -90,8 +81,8 @@ function Header() {
9081
);
9182

9283
useEffect(() => {
93-
if (isInVRExperiment || isInCalico01Experiment) setShowVRToggle(true);
94-
}, [isInVRExperiment, isInCalico01Experiment]);
84+
if (theme.MAIN) setShowVRToggle(true);
85+
}, [theme]);
9586

9687
useEffect(() => {
9788
const isDeployPreviewEnvironment =

docs/docs-components/contexts/DocsExperimentProvider.tsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ import { useAppContext } from '../appContext';
1010

1111
const enabledExperiments = {
1212
VR01Tokens: ['web_gestalt_visualrefresh', 'web_gestalt_visualrefresh'],
13-
CA01Tokens: [
14-
'web_gestalt_calico01',
15-
'web_gestalt_calico01',
16-
'web_gestalt_visualrefresh',
17-
'web_gestalt_visualrefresh',
18-
],
13+
CA01Tokens: ['web_gestalt_calico01', 'web_gestalt_calico01'],
1914
} as const;
2015

2116
type ExperimentKey = keyof typeof enabledExperiments;

packages/gestalt-charts/src/ChartGraph/BarLabel.tsx

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useDangerouslyInGestaltExperiment } from 'gestalt';
1+
import { useExperimentalTheme } from 'gestalt';
22
import { TOKEN_COLOR_ICON_INFO, TOKEN_COLOR_TEXT_DEFAULT } from 'gestalt-design-tokens';
33
import InlineStyle from './InlineStyle';
44

@@ -19,18 +19,15 @@ function BarLabel({
1919
width: number;
2020
height: number;
2121
}) {
22-
const isInVRExperiment = useDangerouslyInGestaltExperiment({
23-
webExperimentName: 'web_gestalt_visualrefresh',
24-
mwebExperimentName: 'web_gestalt_visualrefresh',
25-
});
22+
const theme = useExperimentalTheme();
2623

2724
let dPath;
2825
let VRdPathVR;
2926

3027
if (icon === 'ribbon') {
31-
VRdPathVR =
32-
'M12 12a3 3 0 1 0 0-6 3 3 0 0 0 0 6m7.96 1.21a9 9 0 1 0-15.91 0L2.32 19.6a2.27 2.27 0 0 0 2.91 2.74l1.76-.6 1.07 1.3a2.26 2.26 0 0 0 3.92-.84l.01-.04.01.04a2.26 2.26 0 0 0 3.92.85l1.07-1.3 1.76.59a2.27 2.27 0 0 0 2.9-2.74zm-2.35 2.83.8 3.02-2.41-.8-1.47 1.77-.6-2.24q2.07-.46 3.68-1.75m-7.55 1.75-.6 2.24L8 18.25l-2.42.8.81-3.01a9 9 0 0 0 3.67 1.75M6 9a6 6 0 1 1 12 0A6 6 0 0 1 6 9';
3328
dPath =
29+
'M12 12a3 3 0 1 0 0-6 3 3 0 0 0 0 6m7.96 1.21a9 9 0 1 0-15.91 0L2.32 19.6a2.27 2.27 0 0 0 2.91 2.74l1.76-.6 1.07 1.3a2.26 2.26 0 0 0 3.92-.84l.01-.04.01.04a2.26 2.26 0 0 0 3.92.85l1.07-1.3 1.76.59a2.27 2.27 0 0 0 2.9-2.74zm-2.35 2.83.8 3.02-2.41-.8-1.47 1.77-.6-2.24q2.07-.46 3.68-1.75m-7.55 1.75-.6 2.24L8 18.25l-2.42.8.81-3.01a9 9 0 0 0 3.67 1.75M6 9a6 6 0 1 1 12 0A6 6 0 0 1 6 9';
30+
VRdPathVR =
3431
'M12 14a5 5 0 1 0 0-10 5 5 0 0 0 0 10M9 9a3 3 0 1 1 6 0 3 3 0 0 1-6 0m10.48 5a9 9 0 1 0-14.97 0l-1.7 6.4a1.7 1.7 0 0 0 2.5 1.92l1.94-1.12 1.12 1.95a1.7 1.7 0 0 0 3.12-.42l.51-1.88.5 1.88a1.7 1.7 0 0 0 3.13.42l1.12-1.95 1.95 1.12a1.7 1.7 0 0 0 2.5-1.92zM5 9a7 7 0 1 1 14 0A7 7 0 0 1 5 9m14.08 11.24-3.06-1.77-1.77 3.06-.97-3.62c1.75-.25 3.34-1 4.61-2.1zm-9.33 1.3-1.77-3.07-3.06 1.77L6.1 15.8a9 9 0 0 0 4.6 2.1z';
3532
}
3633

@@ -66,7 +63,7 @@ function BarLabel({
6663
"
6764
/>
6865
<text
69-
className={isInVRExperiment ? 'VRbodySM' : 'bodySM'}
66+
className={theme.MAIN ? 'VRbodySM' : 'bodySM'}
7067
fill={TOKEN_COLOR_TEXT_DEFAULT}
7168
textAnchor={icon ? undefined : 'middle'}
7269
x={layout === 'vertical' ? xHorizontalPosText : xVerticalPosText}
@@ -85,7 +82,7 @@ function BarLabel({
8582
x={layout === 'vertical' ? xHorizontalPosIcon : xVerticalPosIcon}
8683
y={layout === 'vertical' ? yHorizontalPosIcon : yVerticalPosIcon}
8784
>
88-
<path d={isInVRExperiment ? dPath : VRdPathVR} />
85+
<path d={theme.MAIN ? VRdPathVR : dPath} />
8986
</svg>
9087
)}
9188
</g>

packages/gestalt-datepicker/src/DateField.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useEffect } from 'react';
22
import { Locale } from 'date-fns/locale';
3-
import { useDangerouslyInGestaltExperiment, useGlobalEventsHandler } from 'gestalt';
3+
import { useExperimentalTheme, useGlobalEventsHandler } from 'gestalt';
44
import InternalDateField from './DateField/InternalDateField';
55
import VRInternalDateField from './DateField/VRInternalDateField';
66

@@ -127,16 +127,13 @@ function DateField({
127127
dateFieldHandlers: undefined,
128128
};
129129

130-
const isInVRExperiment = useDangerouslyInGestaltExperiment({
131-
webExperimentName: 'web_gestalt_visualrefresh',
132-
mwebExperimentName: 'web_gestalt_visualrefresh',
133-
});
130+
const theme = useExperimentalTheme();
134131

135132
useEffect(() => {
136133
if (dateFieldHandlers?.onRender) dateFieldHandlers?.onRender();
137134
}, [dateFieldHandlers]);
138135

139-
if (isInVRExperiment) {
136+
if (theme.MAIN) {
140137
return (
141138
<VRInternalDateField
142139
autoComplete={autoComplete}

packages/gestalt-datepicker/src/DatePicker/DateInput.tsx

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
import { forwardRef, useImperativeHandle, useRef } from 'react';
2-
import {
3-
Box,
4-
Icon,
5-
TapArea,
6-
TextField,
7-
useDangerouslyInGestaltExperiment,
8-
useDefaultLabel,
9-
} from 'gestalt';
2+
import { Box, Icon, TapArea, TextField, useDefaultLabel, useExperimentalTheme } from 'gestalt';
103
import VRDateInput from './VRDateInput';
114
import styles from '../DatePicker.css';
125

@@ -63,12 +56,9 @@ const DateInputWithForwardRef = forwardRef<HTMLInputElement, Props>(function Dat
6356
useImperativeHandle(ref, () => innerRef.current);
6457
const { openCalendar } = useDefaultLabel('DatePicker');
6558

66-
const isInVRExperiment = useDangerouslyInGestaltExperiment({
67-
webExperimentName: 'web_gestalt_visualrefresh',
68-
mwebExperimentName: 'web_gestalt_visualrefresh',
69-
});
59+
const theme = useExperimentalTheme();
7060

71-
if (isInVRExperiment) {
61+
if (theme.MAIN) {
7262
return (
7363
<VRDateInput
7464
ref={innerRef}

packages/gestalt-datepicker/src/DatePicker/InternalDatePicker.tsx

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,7 @@ import {
99
} from 'react';
1010
import ReactDatePicker, { registerLocale } from 'react-datepicker';
1111
import { limitShift, shift } from '@floating-ui/react';
12-
import {
13-
Box,
14-
Icon,
15-
Label,
16-
Text,
17-
useDangerouslyInGestaltExperiment,
18-
useDefaultLabel,
19-
} from 'gestalt';
12+
import { Box, Icon, Label, Text, useDefaultLabel, useExperimentalTheme } from 'gestalt';
2013
import DateInput from './DateInput';
2114
import { Props } from '../DatePicker';
2215
import styles from '../DatePicker.css';
@@ -73,10 +66,7 @@ const InternalDatePickerWithForwardRef = forwardRef<HTMLInputElement, InternalPr
7366

7467
const { nextMonth, previousMonth } = useDefaultLabel('DatePicker');
7568

76-
const isInVRExperiment = useDangerouslyInGestaltExperiment({
77-
webExperimentName: 'web_gestalt_visualrefresh',
78-
mwebExperimentName: 'web_gestalt_visualrefresh',
79-
});
69+
const theme = useExperimentalTheme();
8070
// This state is only used if the component is uncontrolled or value === undefined. If uncontrolled, DatePicker manages the selected Date value internally
8171
const [uncontrolledValue, setUncontrolledValue] = useState<Date | null | undefined>(null);
8272
// We keep month in state to trigger a re-render when month changes since height will vary by where days fall
@@ -120,7 +110,7 @@ const InternalDatePickerWithForwardRef = forwardRef<HTMLInputElement, InternalPr
120110

121111
return (
122112
<div className="_gestalt">
123-
{label && !isInVRExperiment && !inline && (
113+
{label && !theme.MAIN && !inline && (
124114
<Label htmlFor={id}>
125115
<Box marginBottom={2}>
126116
<Text size="100">{label}</Text>

packages/gestalt/src/Avatar/Foundation.tsx

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import Box from '../Box';
88
import { useColorScheme } from '../contexts/ColorSchemeProvider';
99
import icons from '../icons/index';
1010
import vrIcons from '../icons-vr-theme/index';
11-
import useInExperiment from '../useInExperiment';
11+
import useExperimentalTheme from '../utils/useExperimentalTheme';
1212

1313
const ICON_SIZE_RATIO = (20 / 48) * 100; // For pixel perfect icon button, we use the icon (20px) to parent container (48px) size ratio
1414

@@ -31,10 +31,7 @@ function ResponsiveFitSizeBox({
3131
isPressed,
3232
outline,
3333
}: ResponsiveFitSizeBoxProps) {
34-
const isInVRExperiment = useInExperiment({
35-
webExperimentName: 'web_gestalt_visualrefresh',
36-
mwebExperimentName: 'web_gestalt_visualrefresh',
37-
});
34+
const theme = useExperimentalTheme();
3835

3936
const { colorSchemeName } = useColorScheme();
4037
const isDarkMode = colorSchemeName === 'darkMode';
@@ -44,11 +41,11 @@ function ResponsiveFitSizeBox({
4441
? getAvatarColorToken('default', isHovered, isPressed, isDarkMode)
4542
: getAvatarColorToken(color || 'default', isHovered, isPressed, isDarkMode);
4643

47-
return isInVRExperiment ? (
44+
return theme.MAIN ? (
4845
<div
4946
className={classnames({
5047
[avatarStyles.container]: true,
51-
[avatarStyles.outlineVR]: isInVRExperiment && outline,
48+
[avatarStyles.outlineVR]: theme.MAIN && outline,
5249
})}
5350
role="button"
5451
style={{
@@ -114,10 +111,7 @@ export default function AvatarFoundation({
114111
translate,
115112
content = 'text',
116113
}: AvatarFoundationProps) {
117-
const isInVRExperiment = useInExperiment({
118-
webExperimentName: 'web_gestalt_visualrefresh',
119-
mwebExperimentName: 'web_gestalt_visualrefresh',
120-
});
114+
const theme = useExperimentalTheme();
121115
const { colorSchemeName } = useColorScheme();
122116
const isDarkMode = colorSchemeName === 'darkMode';
123117

@@ -134,7 +128,7 @@ export default function AvatarFoundation({
134128
<svg
135129
preserveAspectRatio="xMidYMid meet"
136130
version="1.1"
137-
viewBox={isInVRExperiment ? '-25 -25 50 50' : '-50 -50 100 100'}
131+
viewBox={theme.MAIN ? '-25 -25 50 50' : '-50 -50 100 100'}
138132
width="100%"
139133
xmlns="http://www.w3.org/2000/svg"
140134
>
@@ -143,13 +137,13 @@ export default function AvatarFoundation({
143137
className={classnames(
144138
translate && avatarGroupStyles[translate], // if addCollaborator button is present, translateX moves numbers closer to the edge
145139
{
146-
[avatarStyles.text]: !isInVRExperiment,
147-
[avatarStyles.vrText]: isInVRExperiment,
140+
[avatarStyles.text]: !theme.MAIN,
141+
[avatarStyles.vrText]: theme.MAIN,
148142
},
149143
)}
150144
dy="0.35em"
151145
fill={TOKEN_COLOR_TEXT_DEFAULT}
152-
fontSize={!isInVRExperiment ? fontSize : undefined}
146+
fontSize={!theme.MAIN ? fontSize : undefined}
153147
textAnchor={textAnchor}
154148
>
155149
{children}
@@ -160,8 +154,8 @@ export default function AvatarFoundation({
160154
<svg
161155
className={classnames({
162156
[avatarStyles.icon]: true,
163-
[avatarStyles.iconFillDefault]: isInVRExperiment && !isDarkMode,
164-
[avatarStyles.iconFillDarkMode]: isInVRExperiment && isDarkMode,
157+
[avatarStyles.iconFillDefault]: theme.MAIN && !isDarkMode,
158+
[avatarStyles.iconFillDarkMode]: theme.MAIN && isDarkMode,
165159
})}
166160
preserveAspectRatio="xMidYMid meet" // percentual width to the parent container, reduces icon to 20px on a 48px parent container and keeps proportions upon resizing
167161
role="img" // full icon size
@@ -171,7 +165,7 @@ export default function AvatarFoundation({
171165
xmlns="http://www.w3.org/2000/svg"
172166
>
173167
<title>Icon</title>
174-
<path d={(isInVRExperiment ? vrIcons : icons)['person-add']} />
168+
<path d={(theme.MAIN ? vrIcons : icons)['person-add']} />
175169
</svg>
176170
) : null}
177171
</ResponsiveFitSizeBox>

packages/gestalt/src/Avatar/InternalAvatar.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import Icon from '../Icon';
1212
import IconCompact from '../IconCompact';
1313
import Image from '../Image';
1414
import Mask from '../Mask';
15-
import useInExperiment from '../useInExperiment';
15+
import useExperimentalTheme from '../utils/useExperimentalTheme';
1616

1717
const sizes = {
1818
xs: 24,
@@ -44,10 +44,7 @@ type Props = {
4444
};
4545

4646
function InternalAvatar(props: Props) {
47-
const isInVRExperiment = useInExperiment({
48-
webExperimentName: 'web_gestalt_visualrefresh',
49-
mwebExperimentName: 'web_gestalt_visualrefresh',
50-
});
47+
const theme = useExperimentalTheme();
5148
const {
5249
accessibilityLabel,
5350
color,
@@ -68,7 +65,7 @@ function InternalAvatar(props: Props) {
6865
xs: TOKEN_SPACE_0,
6966
sm: TOKEN_SPACE_0,
7067
md: TOKEN_SPACE_0,
71-
lg: isInVRExperiment ? 'var(--sema-space-50)' : '2px',
68+
lg: theme.MAIN ? 'var(--sema-space-50)' : '2px',
7269
xl: '5px',
7370
fit: TOKEN_SPACE_0,
7471
} as const;
@@ -78,7 +75,7 @@ function InternalAvatar(props: Props) {
7875
dangerouslySetInlineStyle={{
7976
__style: outline
8077
? {
81-
outline: isInVRExperiment
78+
outline: theme.MAIN
8279
? '1px solid var(--sema-color-border-inverse)'
8380
: '1px solid rgb(255 255 255)',
8481
}
@@ -94,8 +91,8 @@ function InternalAvatar(props: Props) {
9491
<Mask rounding="circle" wash>
9592
<div
9693
className={classnames({
97-
[avatarStyles.imageHovered]: isInVRExperiment && isHovered,
98-
[avatarStyles.imagePressed]: isInVRExperiment && isPressed,
94+
[avatarStyles.imageHovered]: theme.MAIN && isHovered,
95+
[avatarStyles.imagePressed]: theme.MAIN && isPressed,
9996
})}
10097
>
10198
<Image
@@ -127,7 +124,7 @@ function InternalAvatar(props: Props) {
127124
? {
128125
bottom: verifiedIconPadding[size],
129126
right: verifiedIconPadding[size],
130-
outline: isInVRExperiment
127+
outline: theme.MAIN
131128
? '1px solid var(--sema-color-background-default)'
132129
: `1px solid ${TOKEN_COLOR_BACKGROUND_DEFAULT}`,
133130
}

0 commit comments

Comments
 (0)