@@ -4,6 +4,7 @@ title: useTheme
4
4
date : " 2019-01-07"
5
5
gist : https://gist.github.com/gragland/509efd16c695e7817eb70921c77c8a05
6
6
sandbox : https://codesandbox.io/s/15mko9187
7
+ isMultilingual : true
7
8
links :
8
9
- url : https://medium.com/geckoboard-under-the-hood/how-we-made-our-product-more-personalized-with-css-variables-and-react-b29298fde608
9
10
name : CSS Variables and React
@@ -52,3 +53,49 @@ function useTheme(theme) {
52
53
);
53
54
}
54
55
```
56
+
57
+ ``` typescript
58
+ import { useLayoutEffect } from " react" ;
59
+ import " ./styles.scss" ; // -> https://codesandbox.io/s/15mko9187
60
+
61
+ // Usage
62
+ const theme = {
63
+ " button-padding" : " 16px" ,
64
+ " button-font-size" : " 14px" ,
65
+ " button-border-radius" : " 4px" ,
66
+ " button-border" : " none" ,
67
+ " button-color" : " #FFF" ,
68
+ " button-background" : " #6772e5" ,
69
+ " button-hover-border" : " none" ,
70
+ " button-hover-color" : " #FFF" ,
71
+ };
72
+
73
+ // This is type of "theme" object, kind of dynamic type
74
+ interface Theme {
75
+ [name : string ]: string ;
76
+ }
77
+
78
+ function App() {
79
+ useTheme (theme );
80
+
81
+ return (
82
+ <div >
83
+ < button className = " button" > Button < / button >
84
+ < / div >
85
+ );
86
+ }
87
+
88
+ // Hook
89
+ function useTheme(theme : Theme ): void {
90
+ useLayoutEffect (
91
+ (): void => {
92
+ // Iterate through each value in theme object
93
+ for (const key in theme ) {
94
+ // Update css variables in document's root element
95
+ document .documentElement .style .setProperty (` --${key } ` , theme [key ]);
96
+ }
97
+ },
98
+ [theme ] // Only call again if theme object reference changes
99
+ );
100
+ }
101
+ ```
0 commit comments