Skip to content

Commit 2757ea1

Browse files
authored
Merge pull request #9 from solved-ac/feature/fix-nested-themeprovider
Feature/fix nested themeprovider
2 parents a29b604 + 6a9e2d1 commit 2757ea1

File tree

11 files changed

+52
-63
lines changed

11 files changed

+52
-63
lines changed

example/src/stories/Typo.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export default {
1313
variant: {
1414
control: {
1515
type: 'select',
16-
optopns: [
16+
options: [
1717
'default',
1818
'description',
1919
'error',

src/components/$List/ListItem.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@ import { computeHoverColor, readableColor } from '../../utils/color'
66
import { cssClickable, cssVariables } from '../../utils/styles'
77
import { transparentHoverTemplate } from '../../utils/variables'
88

9-
export const listItemVariables = cssVariables(
9+
const { vars, v, styles } = cssVariables(
1010
{
1111
...transparentHoverTemplate,
1212
},
1313
'listItem'
1414
)
1515

16-
const { vars, v } = listItemVariables
17-
1816
const paddingMap = {
1917
none: 'padding: 0;',
2018
normal: 'padding: 16px 8px;',
@@ -48,6 +46,7 @@ const whenClickable = css`
4846
`
4947

5048
const ListItemContainer = styled.div<ListItemContainerProps>`
49+
${({ theme }) => styles(theme)}
5150
display: block;
5251
width: 100%;
5352
background: ${v.backgroundColor};

src/components/$Tab/Tab.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@ import { computeHoverColor, readableColor } from '../../utils/color'
77
import { cssClickable, cssVariables } from '../../utils/styles'
88
import { transparentHoverTemplate } from '../../utils/variables'
99

10-
export const tabVariables = cssVariables(
10+
const { vars, v, styles } = cssVariables(
1111
{
1212
...transparentHoverTemplate,
1313
accentColor: (theme) => theme.color.background.table.header,
1414
},
1515
'tab'
1616
)
1717

18-
const { vars, v } = tabVariables
19-
2018
interface TabContainerProps {
2119
current: boolean
2220
}
@@ -30,6 +28,7 @@ const whenCurrent = css`
3028
`
3129

3230
const TabContainer = styled.button<TabContainerProps>`
31+
${({ theme }) => styles(theme)}
3332
${cssClickable}
3433
${ellipsis()}
3534
flex: 1 0 0;

src/components/Button.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { computeHoverColor, readableColor } from '../utils/color'
77
import { cssClickable, cssVariables } from '../utils/styles'
88
import { cardHoverTemplate } from '../utils/variables'
99

10-
export const buttonVariables = cssVariables(
10+
const { vars, v, styles } = cssVariables(
1111
{
1212
...cardHoverTemplate,
1313
hoverShadow: (theme) =>
@@ -24,8 +24,6 @@ export const buttonVariables = cssVariables(
2424
'button'
2525
)
2626

27-
const { vars, v } = buttonVariables
28-
2927
const paddingMap = {
3028
none: 'padding: 0;',
3129
normal: 'padding: 12px 16px;',
@@ -38,6 +36,7 @@ interface ButtonContainerProps {
3836
}
3937

4038
const ButtonContainer = styled.button<ButtonContainerProps>`
39+
${({ theme }) => styles(theme)}
4140
${cssClickable}
4241
${({ fullWidth }) => fullWidth && 'width: 100%;'}
4342
${({ padding }) => paddingMap[padding]}

src/components/Card.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@ import { computeHoverColor, readableColor } from '../utils/color'
66
import { cssClickable, cssVariables } from '../utils/styles'
77
import { cardHoverTemplate } from '../utils/variables'
88

9-
export const cardVariables = cssVariables(
9+
const { vars, v, styles } = cssVariables(
1010
{
1111
...cardHoverTemplate,
1212
},
1313
'card'
1414
)
1515

16-
const { vars, v } = cardVariables
17-
1816
const paddingMap = {
1917
none: 'padding: 0;',
2018
normal: 'padding: 8px;',
@@ -37,6 +35,7 @@ const whenClickable = css`
3735
`
3836

3937
const CardContainer = styled.div<CardContainerProps>`
38+
${({ theme }) => styles(theme)}
4039
display: block;
4140
background: ${v.backgroundColor};
4241
color: ${v.textColor};

src/components/Chip.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@ import { PC, PP, PR } from '../types/PolymorphicElementProps'
55
import { readableColor } from '../utils/color'
66
import { cssVariables } from '../utils/styles'
77

8-
export const chipVariables = cssVariables(
8+
const { vars, v, styles } = cssVariables(
99
{
1010
backgroundColor: (theme) => theme.color.background.card.dark,
1111
textColor: (theme) => theme.color.text.primary.main,
1212
},
1313
'chip'
1414
)
1515

16-
const { vars, v } = chipVariables
17-
1816
const ChipContainer = styled.div`
17+
${({ theme }) => styles(theme)}
1918
background-color: ${v.backgroundColor};
2019
color: ${v.textColor};
2120
padding: 8px 12px;

src/components/Container.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@ import React, { ElementType } from 'react'
33
import { PC, PP, PR } from '../types/PolymorphicElementProps'
44
import { cssVariables } from '../utils/styles'
55

6-
export const containerVariables = cssVariables(
6+
const { vars, v, styles } = cssVariables(
77
{
88
width: '1200px',
99
},
1010
'container'
1111
)
1212

13-
const { vars, v } = containerVariables
14-
1513
const paddingMap = {
1614
none: 'padding: 0;',
1715
normal: 'padding: 0 16px;',
@@ -24,6 +22,7 @@ interface ContainerContainerProps {
2422
}
2523

2624
const ContainerContainer = styled.nav<ContainerContainerProps>`
25+
${({ theme }) => styles(theme)}
2726
max-width: ${v.width};
2827
${({ padding }) => paddingMap[padding]}
2928
${({ topBarPadding }) => topBarPadding && 'padding-top: 48px;'}

src/components/Footer.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@ import React, { ElementType } from 'react'
33
import { PC, PP, PR } from '../types/PolymorphicElementProps'
44
import { cssVariables } from '../utils/styles'
55

6-
export const footerVariables = cssVariables(
6+
const { vars, v, styles } = cssVariables(
77
{
88
backgroundColor: (theme) => theme.color.background.footer,
99
textColor: (theme) => theme.color.text.secondary.main,
1010
},
1111
'footer'
1212
)
1313

14-
const { vars, v } = footerVariables
15-
1614
const paddingMap = {
1715
none: 'padding: 0;',
1816
normal: 'padding: 16px 0;',
@@ -24,6 +22,7 @@ interface FooterContainerProps {
2422
}
2523

2624
const FooterContainer = styled.nav<FooterContainerProps>`
25+
${({ theme }) => styles(theme)}
2726
background: ${v.backgroundColor};
2827
color: ${v.textColor};
2928
${({ padding }) => paddingMap[padding]}

src/components/PaginationItem.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { computeHoverColor, readableColor } from '../utils/color'
77
import { cssClickable, cssVariables } from '../utils/styles'
88
import { transparentHoverTemplate } from '../utils/variables'
99

10-
export const paginationItemVariables = cssVariables(
10+
const { vars, v, styles } = cssVariables(
1111
{
1212
...transparentHoverTemplate,
1313
activeBackgroundColor: (theme) =>
@@ -17,8 +17,6 @@ export const paginationItemVariables = cssVariables(
1717
'pagination-item'
1818
)
1919

20-
const { vars, v } = paginationItemVariables
21-
2220
interface PaginationItemContainerProps {
2321
current: boolean
2422
}
@@ -35,6 +33,7 @@ const whenCurrent = css`
3533
`
3634

3735
const PaginationItemContainer = styled.button<PaginationItemContainerProps>`
36+
${({ theme }) => styles(theme)}
3837
${ellipsis()}
3938
${cssClickable}
4039
flex: 1 0 0;

src/components/Typo.tsx

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { css } from '@emotion/react'
22
import styled from '@emotion/styled'
33
import React, { ElementType } from 'react'
4-
import { SolvedTheme } from '../styles'
4+
import { SolvedTheme, solvedThemes } from '../styles'
55
import { PC, PP, PR } from '../types/PolymorphicElementProps'
66

77
const variants = (theme: SolvedTheme) =>
@@ -85,10 +85,10 @@ const variants = (theme: SolvedTheme) =>
8585
margin-inline-end: 0px;
8686
`,
8787
small: css`
88-
font-size: small;
88+
font-size: 75%;
8989
`,
9090
smaller: css`
91-
font-size: smaller;
91+
font-size: 65%;
9292
`,
9393
tabular: css`
9494
font-feature-settings: 'tnum';
@@ -104,7 +104,13 @@ const variants = (theme: SolvedTheme) =>
104104
`,
105105
} as const)
106106

107-
export type TypoVariant = keyof ReturnType<typeof variants>
107+
const variantKeys = Object.keys(variants(solvedThemes.light))
108+
109+
type VariantsObject = ReturnType<typeof variants>
110+
type OptionalVariables = {
111+
[key in keyof VariantsObject]: boolean
112+
}
113+
export type TypoVariant = keyof VariantsObject
108114

109115
const asMap = {
110116
h1: 'h1',
@@ -118,23 +124,18 @@ const asMap = {
118124
} as const
119125

120126
interface TypoContainerProps {
121-
variant: TypoVariant | TypoVariant[]
127+
variant: TypoVariant[]
122128
}
123129

124130
const TypoContainer = styled.span<TypoContainerProps>`
125-
${({ theme, variant }) =>
126-
typeof variant === 'string'
127-
? variants(theme)[variant]
128-
: variant.map((v) => variants(theme)[v])}
131+
${({ theme, variant }) => variant.map((v) => variants(theme)[v])}
129132
`
130133

131-
export interface TypoProps {
134+
export type TypoProps = {
132135
variant?: TypoVariant | TypoVariant[]
133-
}
136+
} & OptionalVariables
134137

135-
const firstVariant = (
136-
variant?: TypoVariant | TypoVariant[]
137-
): TypoVariant | undefined => {
138+
const firstVariant = (variant?: TypoVariant[]): TypoVariant | undefined => {
138139
if (typeof variant === 'string') return variant
139140
if (Array.isArray(variant) && variant.length > 0) return variant[0]
140141
return undefined
@@ -144,12 +145,30 @@ export const Typo: PC<'span', TypoProps> = React.forwardRef(
144145
<T extends ElementType>(props: PP<T, TypoProps>, ref?: PR<T>) => {
145146
const { variant = [], as, ...rest } = props
146147

148+
const calculatedVariants = [
149+
...(typeof variant === 'string' ? [variant] : variant),
150+
...Object.entries(rest)
151+
.filter(
152+
([k, v]) => variantKeys.includes(k) && typeof v === 'boolean' && v
153+
)
154+
.map(([k]) => k),
155+
] as TypoVariant[]
156+
147157
// TODO types are wrong when `as` is inferred by variant
148158
const calculatedAs =
149-
as || asMap[firstVariant(variant) ?? 'default'] || 'span'
159+
as || asMap[firstVariant(calculatedVariants) ?? 'default'] || 'span'
160+
161+
const filteredRest = Object.fromEntries(
162+
Object.entries(rest).filter(([k]) => !variantKeys.includes(k))
163+
)
150164

151165
return (
152-
<TypoContainer ref={ref} as={calculatedAs} variant={variant} {...rest} />
166+
<TypoContainer
167+
ref={ref}
168+
as={calculatedAs}
169+
variant={calculatedVariants}
170+
{...filteredRest}
171+
/>
153172
)
154173
}
155174
)

0 commit comments

Comments
 (0)