Files
bot/apps/builder/src/lib/theme.ts
Baptiste Arnaud 138f3f8b07 🌐 Introduce i18n
Only translate dashboard page for now

Closes #322
2023-03-11 11:05:07 +01:00

246 lines
4.7 KiB
TypeScript

import {
createMultiStyleConfigHelpers,
defineStyleConfig,
extendTheme,
StyleFunctionProps,
type ThemeConfig,
} from '@chakra-ui/react'
import { mode } from '@chakra-ui/theme-tools'
import {
alertAnatomy,
accordionAnatomy,
menuAnatomy,
modalAnatomy,
popoverAnatomy,
switchAnatomy,
} from '@chakra-ui/anatomy'
const config: ThemeConfig = {
initialColorMode: 'system',
useSystemColorMode: true,
}
const fonts = {
heading:
"Outfit, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",
body: "Open Sans, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",
}
export const colors = {
gray: {
50: '#fafafa',
100: '#f4f4f5',
200: '#e4e4e7',
300: '#d4d4d8',
400: '#a1a1aa',
500: '#71717a',
600: '#52525b',
700: '#3f3f46',
800: '#27272a',
850: '#1f1f23',
900: '#18181b',
},
blue: {
50: '#e0edff',
100: '#b0caff',
200: '#7ea6ff',
300: '#4b83ff',
400: '#1a5fff',
500: '#0042da',
600: '#0036b4',
700: '#002782',
800: '#001751',
900: '#1a202c',
},
orange: {
50: '#fff1da',
100: '#ffd7ae',
200: '#ffbf7d',
300: '#ffa54c',
400: '#ff8b1a',
500: '#e67200',
600: '#b45800',
700: '#813e00',
800: '#4f2500',
900: '#200b00',
},
yellow: {
50: '#fff9da',
100: '#ffedad',
200: '#ffe17d',
300: '#ffd54b',
400: '#ffc91a',
500: '#e6b000',
600: '#b38800',
700: '#806200',
800: '#4e3a00',
900: '#1d1400',
},
}
const Modal = createMultiStyleConfigHelpers(
modalAnatomy.keys
).defineMultiStyleConfig({
baseStyle: ({ colorMode }) => ({
dialog: { bg: colorMode === 'dark' ? 'gray.800' : 'white' },
}),
})
const Popover = createMultiStyleConfigHelpers(
popoverAnatomy.keys
).defineMultiStyleConfig({
baseStyle: ({ colorMode }) => ({
popper: {
width: 'fit-content',
maxWidth: 'fit-content',
},
content: {
bg: colorMode === 'dark' ? 'gray.800' : 'white',
},
}),
})
const Menu = createMultiStyleConfigHelpers(
menuAnatomy.keys
).defineMultiStyleConfig({
baseStyle: ({ colorMode }) => ({
list: {
shadow: 'lg',
bg: colorMode === 'dark' ? 'gray.800' : 'white',
},
item: {
bg: colorMode === 'dark' ? 'gray.800' : 'white',
_hover: {
bg: colorMode === 'dark' ? 'gray.700' : 'gray.100',
},
},
}),
})
const Accordion = createMultiStyleConfigHelpers(
accordionAnatomy.keys
).defineMultiStyleConfig({
baseStyle: ({ colorMode }) => ({
button: {
_hover: {
bg: colorMode === 'dark' ? 'gray.800' : 'gray.100',
},
},
}),
})
const Button = defineStyleConfig({
baseStyle: ({ colorMode }) => ({
bg: colorMode === 'dark' ? 'gray.800' : 'white',
}),
variants: {
solid: ({ colorMode, colorScheme }) => {
if (colorScheme !== 'blue') return {}
return {
bg: colorMode === 'dark' ? 'blue.400' : 'blue.500',
color: 'white',
_hover: {
bg: colorMode === 'dark' ? 'blue.500' : 'blue.600',
},
_active: {
bg: colorMode === 'dark' ? 'blue.600' : 'blue.700',
},
}
},
outline: {
bg: 'transparent',
},
ghost: {
bg: 'transparent',
},
},
})
const Alert = createMultiStyleConfigHelpers(
alertAnatomy.keys
).defineMultiStyleConfig({
variants: {
subtle: ({ colorScheme, colorMode }) => {
if (colorScheme !== 'blue' || colorMode === 'dark') return {}
return {
container: {
bg: 'blue.50',
},
}
},
},
baseStyle: {
container: {
borderRadius: 'md',
},
},
})
const Switch = createMultiStyleConfigHelpers(
switchAnatomy.keys
).defineMultiStyleConfig({
baseStyle: ({ colorMode, colorScheme }) => ({
track: {
_checked: {
bg: colorMode === 'dark' ? `${colorScheme}.400` : `${colorScheme}.500`,
},
},
}),
})
const components = {
Modal,
Popover,
Menu,
Button,
Accordion,
Alert,
Switch,
Spinner: {
defaultProps: {
colorScheme: 'blue',
},
},
NumberInput: {
baseStyle: {
focusBorderColor: 'blue.200',
},
},
Input: {
baseStyle: {
focusBorderColor: 'blue.200',
},
},
Textarea: {
baseStyle: {
focusBorderColor: 'blue.200',
},
},
Link: {
baseStyle: {
_hover: { textDecoration: 'none' },
},
},
Tooltip: {
baseStyle: {
rounded: 'md',
},
},
}
const styles = {
global: (props: StyleFunctionProps) => ({
body: {
bg: mode('white', 'gray.900')(props),
},
}),
}
export const customTheme = extendTheme({
colors,
fonts,
components,
config,
styles,
})