Skip to content

Commit 5085838

Browse files
Add Drawer component styles and integrate into CAP theme
1 parent e19132c commit 5085838

File tree

13 files changed

+372
-3
lines changed

13 files changed

+372
-3
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
type DrawerState,
5+
} from '@fluentui/react-components';
6+
import { CAP_TOKENS } from '../../theme/CAPTheme';
7+
8+
export const useDrawerStyles = makeStyles({
9+
root: {
10+
borderRadius: CAP_TOKENS['cap/ctrl/flyout/base-corner'],
11+
},
12+
});
13+
14+
export function useDrawerStylesHook(state: DrawerState): DrawerState {
15+
const styles = useDrawerStyles();
16+
17+
state.root.className = mergeClasses(state.root.className, styles.root);
18+
19+
return state;
20+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
tokens,
5+
type DrawerBodyState,
6+
} from '@fluentui/react-components';
7+
import { CAP_TOKENS } from '../../theme/CAPTheme';
8+
9+
export const useDrawerBodyStyles = makeStyles({
10+
root: {
11+
paddingLeft: CAP_TOKENS['cap/ctrl/flyout/body-Padding-Left'],
12+
paddingRight: CAP_TOKENS['cap/ctrl/flyout/body-Padding-Right']
13+
},
14+
});
15+
16+
export function useDrawerBodyStylesHook(
17+
state: DrawerBodyState
18+
): DrawerBodyState {
19+
const styles = useDrawerBodyStyles();
20+
21+
state.root.className = mergeClasses(state.root.className, styles.root);
22+
23+
return state;
24+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
type DrawerFooterState,
5+
} from '@fluentui/react-components';
6+
import { CAP_TOKENS } from '../../theme/CAPTheme';
7+
8+
export const useDrawerFooterStyles = makeStyles({
9+
root: {
10+
justifyContent: CAP_TOKENS['fixme/ctrl/drawer/footer/content-alignment'],
11+
paddingTop: CAP_TOKENS['cap/ctrl/flyout/Footer-Padding-top'],
12+
paddingRight: CAP_TOKENS['cap/ctrl/flyout/Footer-Padding-bottom'],
13+
paddingBottom: CAP_TOKENS['cap/ctrl/flyout/footer-Padding-Left'],
14+
paddingLeft: CAP_TOKENS['cap/ctrl/flyout/footer-Padding-Right'],
15+
},
16+
});
17+
18+
export function useDrawerFooterStylesHook(
19+
state: DrawerFooterState
20+
): DrawerFooterState {
21+
const styles = useDrawerFooterStyles();
22+
23+
state.root.className = mergeClasses(state.root.className, styles.root);
24+
25+
return state;
26+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
tokens,
5+
type DrawerHeaderState,
6+
} from '@fluentui/react-components';
7+
import { CAP_TOKENS } from '../../theme/CAPTheme';
8+
9+
export const useDrawerHeaderStyles = makeStyles({
10+
root: {
11+
paddingTop: CAP_TOKENS['smtc/v1/ctrl/flyout/header/paddingTop'],
12+
paddingRight: CAP_TOKENS['smtc/v1/ctrl/flyout/header/Padding-Right'],
13+
paddingBottom: CAP_TOKENS['fixme/ctrl/drawer/header/padding-bottom'],
14+
paddingLeft: CAP_TOKENS['smtc/v1/ctrl/flyout/header/Padding-Left'],
15+
},
16+
});
17+
18+
export function useDrawerHeaderStylesHook(
19+
state: DrawerHeaderState
20+
): DrawerHeaderState {
21+
const styles = useDrawerHeaderStyles();
22+
23+
state.root.className = mergeClasses(state.root.className, styles.root);
24+
25+
return state;
26+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
type DrawerHeaderNavigationState,
5+
} from '@fluentui/react-components';
6+
7+
export const useDrawerHeaderNavigationStyles = makeStyles({
8+
root: {},
9+
});
10+
11+
export function useDrawerHeaderNavigationStylesHook(
12+
state: DrawerHeaderNavigationState
13+
): DrawerHeaderNavigationState {
14+
const styles = useDrawerHeaderNavigationStyles();
15+
16+
state.root.className = mergeClasses(state.root.className, styles.root);
17+
18+
return state;
19+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
type DrawerHeaderTitleState,
5+
} from '@fluentui/react-components';
6+
7+
export const useDrawerHeaderTitleStyles = makeStyles({
8+
root: {},
9+
heading: {},
10+
action: {},
11+
});
12+
13+
export function useDrawerHeaderTitleStylesHook(
14+
state: DrawerHeaderTitleState
15+
): DrawerHeaderTitleState {
16+
const styles = useDrawerHeaderTitleStyles();
17+
18+
state.root.className = mergeClasses(state.root.className, styles.root);
19+
20+
if (state.heading) {
21+
state.heading.className = mergeClasses(
22+
state.heading.className,
23+
styles.heading
24+
);
25+
}
26+
27+
if (state.action) {
28+
state.action.className = mergeClasses(state.action.className, styles.action);
29+
}
30+
31+
return state;
32+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
type InlineDrawerState,
5+
} from '@fluentui/react-components';
6+
7+
export const useInlineDrawerStyles = makeStyles({
8+
root: {},
9+
});
10+
11+
export function useInlineDrawerStylesHook(
12+
state: InlineDrawerState
13+
): InlineDrawerState {
14+
const styles = useInlineDrawerStyles();
15+
16+
state.root.className = mergeClasses(state.root.className, styles.root);
17+
18+
return state;
19+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import {
2+
makeStyles,
3+
mergeClasses,
4+
type OverlayDrawerState,
5+
} from '@fluentui/react-components';
6+
7+
export const useOverlayDrawerStyles = makeStyles({
8+
root: {},
9+
backdrop: {},
10+
});
11+
12+
export function useOverlayDrawerStylesHook(
13+
state: OverlayDrawerState
14+
): OverlayDrawerState {
15+
const styles = useOverlayDrawerStyles();
16+
17+
state.root.className = mergeClasses(state.root.className, styles.root);
18+
19+
const backdrop = state.root.backdrop;
20+
if (backdrop) {
21+
backdrop.className = mergeClasses(backdrop.className, styles.backdrop);
22+
}
23+
24+
return state;
25+
}

packages/react-cap-theme/src/theme/CAPTheme.tsx

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { tokens } from '@fluentui/react-components';
22

3-
type TokenType = 'color' | 'dimension';
3+
type TokenType = 'color' | 'dimension' | 'shadow' | 'alignment';
44

55
export interface TokenSchema {
66
type: TokenType;
@@ -37,6 +37,7 @@ export function formatCAPTokenCssVar(varName: string): string {
3737
*/
3838
const FluentExtendedTokens = {
3939
'fluent-ext/borderRadius2XLarge': { type: 'dimension' },
40+
'fluent-ext/borderRadius3XLarge': { type: 'dimension' },
4041
} as const satisfies Record<AllowedTokenName, TokenSchema>;
4142

4243
/**
@@ -94,6 +95,22 @@ const TooltipTokens = {} as const satisfies Record<
9495
TokenSchema
9596
>;
9697

98+
const DrawerTokens = {
99+
'cap/ctrl/flyout/base-corner': { type: 'dimension' },
100+
'cap/ctrl/flyout/Elevation': { type: 'shadow' },
101+
'smtc/v1/ctrl/flyout/header/paddingTop': { type: 'dimension' },
102+
'smtc/v1/ctrl/flyout/header/Padding-Left': { type: 'dimension' },
103+
'fixme/ctrl/drawer/header/padding-bottom': { type: 'dimension' },
104+
'smtc/v1/ctrl/flyout/header/Padding-Right': { type: 'dimension' },
105+
'cap/ctrl/flyout/body-Padding-Left': { type: 'dimension' },
106+
'cap/ctrl/flyout/body-Padding-Right': { type: 'dimension' },
107+
'cap/ctrl/flyout/Footer-Padding-top': { type: 'dimension' },
108+
'cap/ctrl/flyout/Footer-Padding-bottom': { type: 'dimension' },
109+
'cap/ctrl/flyout/footer-Padding-Left': { type: 'dimension' },
110+
'cap/ctrl/flyout/footer-Padding-Right': { type: 'dimension' },
111+
'fixme/ctrl/drawer/footer/content-alignment': { type: 'alignment'}
112+
} as const satisfies Record<AllowedTokenName, TokenSchema>;
113+
97114
export const CAPTokensSchema = {
98115
...FluentExtendedTokens,
99116
...ControlTokens,
@@ -104,6 +121,7 @@ export const CAPTokensSchema = {
104121
...InputTokens,
105122
...MenuTokens,
106123
...TooltipTokens,
124+
...DrawerTokens
107125
} as const satisfies { [key: AllowedTokenName]: TokenSchema };
108126

109127
export const CAP_TOKENS = Object.keys(CAPTokensSchema).reduce((acc, key) => {
@@ -117,6 +135,7 @@ export type CAPTheme = {
117135
export const CAP_THEME_DEFAULTS = {
118136
// fluent-ext
119137
'fluent-ext/borderRadius2XLarge': '12px',
138+
'fluent-ext/borderRadius3XLarge': '16px',
120139

121140
// smtc/v1
122141
'smtc/v1/ctrl/corner/rest': CAP_TOKENS['fluent-ext/borderRadius2XLarge'],
@@ -156,6 +175,22 @@ export const CAP_THEME_DEFAULTS = {
156175
'fixme/ctrl/card/header-padding-outside': tokens.spacingVerticalM,
157176
'fixme/ctrl/card/header-padding-inside': tokens.spacingVerticalS,
158177
'fixme/ctrl/card/footer-horizontal-gap': tokens.spacingHorizontalS,
178+
179+
// drawer
180+
// Notes: Component Drawer at design specs and in code, tokens are using 'flyout'
181+
'cap/ctrl/flyout/base-corner': CAP_TOKENS['fluent-ext/borderRadius3XLarge'],
182+
'cap/ctrl/flyout/Elevation': tokens.shadow2,
183+
'smtc/v1/ctrl/flyout/header/paddingTop': tokens.spacingVerticalL,
184+
'smtc/v1/ctrl/flyout/header/Padding-Left': tokens.spacingHorizontalXL,
185+
'fixme/ctrl/drawer/header/padding-bottom': '12px', // Not exist in design specs and in tokens
186+
'smtc/v1/ctrl/flyout/header/Padding-Right': tokens.spacingHorizontalXL, // layout is different, required different value from design spec tokens.spacingHorizontalMNudge
187+
'cap/ctrl/flyout/body-Padding-Left': tokens.spacingHorizontalXL,
188+
'cap/ctrl/flyout/body-Padding-Right': tokens.spacingHorizontalXL,
189+
'cap/ctrl/flyout/Footer-Padding-top': tokens.spacingVerticalXXL,
190+
'cap/ctrl/flyout/Footer-Padding-bottom': tokens.spacingVerticalXL,
191+
'cap/ctrl/flyout/footer-Padding-Left': tokens.spacingHorizontalXL,
192+
'cap/ctrl/flyout/footer-Padding-Right': tokens.spacingHorizontalXL,
193+
'fixme/ctrl/drawer/footer/content-alignment': 'flex-end'
159194
} as const satisfies CAPTheme;
160195

161196
export const CAP_THEME_TEAMS = {

packages/react-cap-theme/src/theme/CAPThemeProvider.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@ import {
55
CardFooterState,
66
CardHeaderState,
77
CardState,
8+
DrawerBodyState,
9+
DrawerFooterState,
10+
DrawerHeaderNavigationState,
11+
DrawerHeaderState,
12+
DrawerHeaderTitleState,
13+
DrawerState,
814
FluentProvider,
915
FluentProviderProps,
1016
InputState,
17+
InlineDrawerState,
18+
OverlayDrawerState,
1119
type Theme,
1220
} from '@fluentui/react-components';
1321

@@ -18,6 +26,14 @@ import { useInputStylesHook } from '../components/Input/Input.styles';
1826
import { useCardStylesHook } from '../components/Card/Card.styles';
1927
import { useCardHeaderStylesHook } from '../components/Card/CardHeader.styles';
2028
import { useCardFooterStylesHook } from '../components/Card/CardFooter.styles';
29+
import { useDrawerStylesHook } from '../components/Drawer/Drawer.styles';
30+
import { useDrawerBodyStylesHook } from '../components/Drawer/DrawerBody.styles';
31+
import { useDrawerHeaderStylesHook } from '../components/Drawer/DrawerHeader.styles';
32+
import { useDrawerHeaderTitleStylesHook } from '../components/Drawer/DrawerHeaderTitle.styles';
33+
import { useDrawerHeaderNavigationStylesHook } from '../components/Drawer/DrawerHeaderNavigation.styles';
34+
import { useDrawerFooterStylesHook } from '../components/Drawer/DrawerFooter.styles';
35+
import { useInlineDrawerStylesHook } from '../components/Drawer/InlineDrawer.styles';
36+
import { useOverlayDrawerStylesHook } from '../components/Drawer/OverlayDrawer.styles';
2137

2238
const customStyleHooks: NonNullable<
2339
FluentProviderProps['customStyleHooks_unstable']
@@ -30,6 +46,26 @@ const customStyleHooks: NonNullable<
3046
useCardHeaderStylesHook(state as CardHeaderState),
3147
useCardFooterStyles_unstable: (state) =>
3248
useCardFooterStylesHook(state as CardFooterState),
49+
useDrawerStyles_unstable: (state) =>
50+
useDrawerStylesHook(state as DrawerState),
51+
useOverlayDrawerStyles_unstable: (state) =>
52+
useOverlayDrawerStylesHook(state as OverlayDrawerState),
53+
useDrawerOverlayStyles_unstable: (state) =>
54+
useOverlayDrawerStylesHook(state as OverlayDrawerState),
55+
useInlineDrawerStyles_unstable: (state) =>
56+
useInlineDrawerStylesHook(state as InlineDrawerState),
57+
useDrawerInlineStyles_unstable: (state) =>
58+
useInlineDrawerStylesHook(state as InlineDrawerState),
59+
useDrawerBodyStyles_unstable: (state) =>
60+
useDrawerBodyStylesHook(state as DrawerBodyState),
61+
useDrawerHeaderStyles_unstable: (state) =>
62+
useDrawerHeaderStylesHook(state as DrawerHeaderState),
63+
useDrawerHeaderTitleStyles_unstable: (state) =>
64+
useDrawerHeaderTitleStylesHook(state as DrawerHeaderTitleState),
65+
useDrawerHeaderNavigationStyles_unstable: (state) =>
66+
useDrawerHeaderNavigationStylesHook(state as DrawerHeaderNavigationState),
67+
useDrawerFooterStyles_unstable: (state) =>
68+
useDrawerFooterStylesHook(state as DrawerFooterState),
3369
useInputStyles_unstable: (state) => useInputStylesHook(state as InputState),
3470
};
3571

0 commit comments

Comments
 (0)