Add compatibility for a smoother transition of themes.tags/0.3.0
@@ -0,0 +1,145 @@ | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: semi-expanded; | |||||
font-weight: 400; | |||||
src: | |||||
local('Encode Sans Semi Expanded'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: semi-expanded; | |||||
font-weight: 700; | |||||
src: | |||||
local('Encode Sans Semi Expanded Bold'), | |||||
local('Encode Sans Semi Expanded'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 100; | |||||
src: | |||||
local('Encode Sans Condensed Thin'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 200; | |||||
src: | |||||
local('Encode Sans Condensed ExtraLight'), | |||||
local('Encode Sans Condensed Extra Light'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 300; | |||||
src: | |||||
local('Encode Sans Condensed Light'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
:root { | |||||
--font-family-base: 'Encode Sans Semi Expanded', 'Encode Sans', system-ui; | |||||
--font-stretch-base: semi-expanded; | |||||
--font-weight-base: 400; | |||||
--line-height-base: 2; | |||||
--font-family-headings:'Encode Sans Condensed', 'Encode Sans', system-ui; | |||||
--font-stretch-headings: condensed; | |||||
--font-weight-headings: 100; | |||||
--line-height-headings: 1.5; | |||||
--font-family-monospace: 'mononoki'; | |||||
--font-size-root: 16px; | |||||
--opacity-light: 0.25; | |||||
--opacity-lighter: 0.5; | |||||
--opacity-lightest: 0.75; | |||||
} | |||||
:root { | |||||
--color-bg: var(--color-negative, white); | |||||
--color-fg: var(--color-positive, black); | |||||
} | |||||
@media (prefers-color-scheme: dark) { | |||||
:root { | |||||
--color-bg: var(--color-negative, black); | |||||
--color-fg: var(--color-positive, white); | |||||
} | |||||
} | |||||
:root { | |||||
background-color: var(--color-bg); | |||||
color: var(--color-fg); | |||||
font-size: var(--font-size-root); | |||||
font-family: var(--font-family-base), sans-serif; | |||||
font-stretch: var(--font-stretch-base, normal); | |||||
font-weight: var(--font-weight-base, 400); | |||||
line-height: var(--line-height-base, 2); | |||||
transition-property: color, background-color; | |||||
transition-timing-function: ease; | |||||
transition-duration: 350ms; | |||||
} | |||||
h1 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h2 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h3 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h4 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h5 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h6 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
code { | |||||
font-family: var(--font-family-monospace), monospace; | |||||
} | |||||
pre { | |||||
font-family: var(--font-family-monospace), monospace; | |||||
} | |||||
a { | |||||
color: var(--color-accent); | |||||
} |
@@ -1,73 +1,9 @@ | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: semi-expanded; | |||||
font-weight: 400; | |||||
src: | |||||
local('Encode Sans Semi Expanded'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: semi-expanded; | |||||
font-weight: 700; | |||||
src: | |||||
local('Encode Sans Semi Expanded Bold'), | |||||
local('Encode Sans Semi Expanded'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 100; | |||||
src: | |||||
local('Encode Sans Condensed Thin'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 200; | |||||
src: | |||||
local('Encode Sans Condensed ExtraLight'), | |||||
local('Encode Sans Condensed Extra Light'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 300; | |||||
src: | |||||
local('Encode Sans Condensed Light'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
:root { | :root { | ||||
--color-shade: #000; | --color-shade: #000; | ||||
--color-active: #f90; | |||||
--font-family-base: 'Encode Sans Semi Expanded', 'Encode Sans', system-ui; | |||||
--font-stretch-base: semi-expanded; | |||||
--font-weight-base: 400; | |||||
--line-height-base: 2; | |||||
--font-family-headings:'Encode Sans Condensed', 'Encode Sans', system-ui; | |||||
--font-stretch-headings: condensed; | |||||
--font-weight-headings: 100; | |||||
--line-height-headings: 1.5; | |||||
--font-family-monospace: 'mononoki'; | |||||
--font-size-root: 16px; | |||||
--color-negative: #222; | --color-negative: #222; | ||||
--color-positive: #eee; | --color-positive: #eee; | ||||
--color-accent: #C78AB3; | --color-accent: #C78AB3; | ||||
--opacity-light: 0.25; | |||||
--opacity-lighter: 0.5; | |||||
--opacity-lightest: 0.75; | |||||
--color-active: #f90; | |||||
--color-code-number: #74f95e; | --color-code-number: #74f95e; | ||||
--color-code-keyword: #ff4389; | --color-code-keyword: #ff4389; | ||||
--color-code-type: #5097D2; | --color-code-type: #5097D2; | ||||
@@ -81,72 +17,3 @@ | |||||
--color-code-url: #0099CC; | --color-code-url: #0099CC; | ||||
--color-code-global: #C28050; | --color-code-global: #C28050; | ||||
} | } | ||||
:root { | |||||
--color-bg: var(--color-negative, white); | |||||
--color-fg: var(--color-positive, black); | |||||
background-color: var(--color-bg); | |||||
color: var(--color-fg); | |||||
font-size: var(--font-size-root); | |||||
font-family: var(--font-family-base), sans-serif; | |||||
font-stretch: var(--font-stretch-base, normal); | |||||
font-weight: var(--font-weight-base, 400); | |||||
line-height: var(--line-height-base, 2); | |||||
transition-property: color, background-color; | |||||
transition-timing-function: ease; | |||||
transition-duration: 350ms; | |||||
} | |||||
h1 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h2 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h3 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h4 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h5 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h6 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
a { | |||||
color: var(--color-accent); | |||||
} | |||||
code { | |||||
font-family: var(--font-family-monospace), monospace; | |||||
} | |||||
pre { | |||||
font-family: var(--font-family-monospace), monospace; | |||||
} |
@@ -1,73 +1,9 @@ | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: semi-expanded; | |||||
font-weight: 400; | |||||
src: | |||||
local('Encode Sans Semi Expanded'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: semi-expanded; | |||||
font-weight: 700; | |||||
src: | |||||
local('Encode Sans Semi Expanded Bold'), | |||||
local('Encode Sans Semi Expanded'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 100; | |||||
src: | |||||
local('Encode Sans Condensed Thin'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 200; | |||||
src: | |||||
local('Encode Sans Condensed ExtraLight'), | |||||
local('Encode Sans Condensed Extra Light'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
@font-face { | |||||
font-family: 'Encode Sans'; | |||||
font-stretch: condensed; | |||||
font-weight: 300; | |||||
src: | |||||
local('Encode Sans Condensed Light'), | |||||
local('Encode Sans Condensed'), | |||||
local('Encode Sans'); | |||||
} | |||||
:root { | :root { | ||||
--color-shade: #fff; | --color-shade: #fff; | ||||
--color-negative: #f8f8f8; | --color-negative: #f8f8f8; | ||||
--color-positive: #333; | --color-positive: #333; | ||||
--color-accent: #ba6a9c; | --color-accent: #ba6a9c; | ||||
--color-active: #f90; | --color-active: #f90; | ||||
--font-family-base: 'Encode Sans Semi Expanded', 'Encode Sans', system-ui; | |||||
--font-stretch-base: semi-expanded; | |||||
--font-weight-base: 400; | |||||
--line-height-base: 2; | |||||
--font-family-headings:'Encode Sans Condensed', 'Encode Sans', system-ui; | |||||
--font-stretch-headings: condensed; | |||||
--font-weight-headings: 100; | |||||
--line-height-headings: 1.5; | |||||
--font-family-monospace: 'mononoki'; | |||||
--font-size-root: 16px; | |||||
--opacity-light: 0.5; | |||||
--opacity-lighter: 0.75; | |||||
--opacity-lightest: 0.875; | |||||
--color-code-number: #72b507; | --color-code-number: #72b507; | ||||
--color-code-keyword: #ee5189; | --color-code-keyword: #ee5189; | ||||
--color-code-type: #427fb1; | --color-code-type: #427fb1; | ||||
@@ -81,80 +17,3 @@ | |||||
--color-code-url: #0099CC; | --color-code-url: #0099CC; | ||||
--color-code-global: #C28050; | --color-code-global: #C28050; | ||||
} | } | ||||
/*@media (prefers-color-scheme: dark) {*/ | |||||
/* :root {*/ | |||||
/* --color-negative: #222;*/ | |||||
/* --color-positive: #eee;*/ | |||||
/* --color-accent: #C78AB3;*/ | |||||
/* --opacity-light: 0.25;*/ | |||||
/* --opacity-lighter: 0.5;*/ | |||||
/* --opacity-lightest: 0.75;*/ | |||||
/* }*/ | |||||
/*}*/ | |||||
:root { | |||||
--color-bg: var(--color-negative, white); | |||||
--color-fg: var(--color-positive, black); | |||||
background-color: var(--color-bg); | |||||
color: var(--color-fg); | |||||
font-size: var(--font-size-root); | |||||
font-family: var(--font-family-base), sans-serif; | |||||
font-stretch: var(--font-stretch-base, normal); | |||||
font-weight: var(--font-weight-base, 400); | |||||
line-height: var(--line-height-base, 2); | |||||
} | |||||
h1 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h2 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h3 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h4 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h5 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
h6 { | |||||
font-family: var(--font-family-headings), sans-serif; | |||||
font-stretch: var(--font-stretch-headings, normal); | |||||
font-weight: var(--font-weight-headings, 400); | |||||
line-height: var(--line-height-headings, 1.5); | |||||
} | |||||
a { | |||||
color: var(--color-accent); | |||||
} | |||||
code { | |||||
font-family: var(--font-family-monospace), monospace; | |||||
} | |||||
pre { | |||||
font-family: var(--font-family-monospace), monospace; | |||||
} |
@@ -35,61 +35,41 @@ const applyStyles = (theme) => { | |||||
}) | }) | ||||
} | } | ||||
const handleInitializeTheme = (initialTheme: string) => () => { | |||||
applyStyles(getTheme() || initialTheme) | |||||
} | |||||
const ThemeToggle = ({ | const ThemeToggle = ({ | ||||
initialTheme, | initialTheme, | ||||
}) => { | }) => { | ||||
const [theme, setTheme] = React.useState(initialTheme!) | |||||
const [theme, setTheme] = React.useState(null) | |||||
const handleSetTheme = (t: string) => () => { | |||||
setTheme(t) | |||||
const handleSetTheme = (e) => { | |||||
setTheme(e.target.checked ? 'Light' : 'Dark') | |||||
} | } | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
window.localStorage.setItem('tesseract-theme', theme as string) | |||||
}, [theme]) | |||||
React.useEffect(() => { | |||||
applyStyles(theme) | |||||
if (theme as string) { | |||||
window.localStorage.setItem('tesseract-theme', theme) | |||||
return | |||||
} | |||||
setTheme(getTheme()) | |||||
}, [theme]) | }, [theme]) | ||||
React.useEffect(() => { | React.useEffect(() => { | ||||
const handler = handleInitializeTheme(initialTheme) | |||||
window.addEventListener('load', handler) | |||||
return () => { | |||||
window.removeEventListener('load', handler) | |||||
if (theme as string) { | |||||
applyStyles(theme) | |||||
} | } | ||||
}, [initialTheme]) | |||||
}, [theme]) | |||||
return ( | return ( | ||||
<ToggleWrapper> | <ToggleWrapper> | ||||
<ToggleInput | <ToggleInput | ||||
type="checkbox" | type="checkbox" | ||||
defaultChecked={theme === 'Dark'} | |||||
onChange={handleSetTheme(theme === 'Dark' ? 'Light' : 'Dark')} | |||||
checked={theme === 'Light'} | |||||
onChange={handleSetTheme} | |||||
/> | /> | ||||
<span> | <span> | ||||
{ | |||||
theme === 'Dark' | |||||
&& ( | |||||
<Icon | |||||
label="Set Light Mode" | |||||
name="moon" | |||||
/> | |||||
) | |||||
} | |||||
{ | |||||
theme === 'Light' | |||||
&& ( | |||||
<Icon | |||||
label="Set Dark Mode" | |||||
name="sun" | |||||
/> | |||||
) | |||||
} | |||||
<Icon | |||||
label="Toggle Theme" | |||||
name={theme === 'Dark' ? 'moon' : 'sun'} | |||||
/> | |||||
</span> | </span> | ||||
</ToggleWrapper> | </ToggleWrapper> | ||||
) | ) | ||||
@@ -24,7 +24,8 @@ export default class MyDocument extends Document { | |||||
<> | <> | ||||
{initialProps.styles} | {initialProps.styles} | ||||
<link rel="stylesheet" href={`${publicUrl}/global.css`} /> | <link rel="stylesheet" href={`${publicUrl}/global.css`} /> | ||||
<link rel="stylesheet" title="Dark" href={`${publicUrl}/theme/dark.css`} /> | |||||
<link rel="stylesheet" href={`${publicUrl}/theme.css`} /> | |||||
<link rel="alternate stylesheet" title="Dark" href={`${publicUrl}/theme/dark.css`} /> | |||||
<link rel="alternate stylesheet" title="Light" href={`${publicUrl}/theme/light.css`} /> | <link rel="alternate stylesheet" title="Light" href={`${publicUrl}/theme/light.css`} /> | ||||
{sheet.getStyleElement()} | {sheet.getStyleElement()} | ||||
</> | </> | ||||