-
Notifications
You must be signed in to change notification settings - Fork 132
/
Styling.tsx
119 lines (112 loc) · 2.76 KB
/
Styling.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import { useEffect, useRef, useState } from 'react'
import cx from 'classnames'
import {
ReactReader,
ReactReaderStyle,
type IReactReaderStyle,
} from '../../lib/index'
import { DEMO_URL, DEMO_NAME } from '../components/config'
import { Example } from '../components/Example'
import { type Rendition } from 'epubjs'
type ITheme = 'light' | 'dark'
function updateTheme(rendition: Rendition, theme: ITheme) {
const themes = rendition.themes
switch (theme) {
case 'dark': {
themes.override('color', '#fff')
themes.override('background', '#000')
break
}
case 'light': {
themes.override('color', '#000')
themes.override('background', '#fff')
break
}
}
}
export const Styling = () => {
const [location, setLocation] = useState<string | number>(0)
const rendition = useRef<Rendition | undefined>(undefined)
const [theme, setTheme] = useState<ITheme>('dark')
useEffect(() => {
if (rendition.current) {
updateTheme(rendition.current, theme)
}
}, [theme])
return (
<Example
title="Styling example"
actions={
<div className="contents">
<button
onClick={() => setTheme('light')}
className={cx('btn', { underline: theme === 'light' })}
>
Light theme
</button>
<button
onClick={() => setTheme('dark')}
className={cx('btn', { underline: theme === 'dark' })}
>
Dark theme
</button>
</div>
}
>
<ReactReader
url={DEMO_URL}
title={DEMO_NAME}
location={location}
locationChanged={(loc: string) => setLocation(loc)}
readerStyles={theme === 'dark' ? darkReaderTheme : lightReaderTheme}
getRendition={(_rendition) => {
updateTheme(_rendition, theme)
rendition.current = _rendition
}}
/>
</Example>
)
}
const lightReaderTheme: IReactReaderStyle = {
...ReactReaderStyle,
readerArea: {
...ReactReaderStyle.readerArea,
transition: undefined,
},
}
const darkReaderTheme: IReactReaderStyle = {
...ReactReaderStyle,
arrow: {
...ReactReaderStyle.arrow,
color: 'white',
},
arrowHover: {
...ReactReaderStyle.arrowHover,
color: '#ccc',
},
readerArea: {
...ReactReaderStyle.readerArea,
backgroundColor: '#000',
transition: undefined,
},
titleArea: {
...ReactReaderStyle.titleArea,
color: '#ccc',
},
tocArea: {
...ReactReaderStyle.tocArea,
background: '#111',
},
tocButtonExpanded: {
...ReactReaderStyle.tocButtonExpanded,
background: '#222',
},
tocButtonBar: {
...ReactReaderStyle.tocButtonBar,
background: '#fff',
},
tocButton: {
...ReactReaderStyle.tocButton,
color: 'white',
},
}