import React, { useMemo } from "react"; import { Text, TextProps } from "rebass"; import styled, { css, DefaultTheme, createGlobalStyle, ThemeProvider as StyledComponentsThemeProvider, } from "styled-components"; import { Colors } from "./styled"; export * from "./components"; export const MEDIA_WIDTHS = { upToExtraSmall: 500, upToSmall: 720, upToMedium: 960, upToLarge: 1280, }; const mediaWidthTemplates: { [width in keyof typeof MEDIA_WIDTHS]: typeof css; } = Object.keys(MEDIA_WIDTHS).reduce((accumulator, size) => { (accumulator as any)[size] = (a: any, b: any, c: any) => css` @media (max-width: ${(MEDIA_WIDTHS as any)[size]}px) { ${css(a, b, c)} } `; return accumulator; }, {}) as any; const white = "#FFFFFF"; const black = "#000000"; export function colors(darkMode: boolean): Colors { return { // base white, black, // text text1: darkMode ? "#FFFFFF" : "#000000", text2: darkMode ? "#C3C5CB" : "#565A69", text3: darkMode ? "#6C7284" : "#888D9B", text4: darkMode ? "#565A69" : "#C3C5CB", text5: darkMode ? "#2C2F36" : "#EDEEF2", // backgrounds / greys bg0: darkMode ? "#191B1F" : "#FFF", bg1: darkMode ? "#212429" : "#F7F8FA", bg2: darkMode ? "#2C2F36" : "#EDEEF2", bg3: darkMode ? "#40444F" : "#CED0D9", bg4: darkMode ? "#565A69" : "#888D9B", bg5: darkMode ? "#6C7284" : "#888D9B", bg6: darkMode ? "#1A2028" : "#6C7284", //specialty colors modalBG: darkMode ? "rgba(0,0,0,.425)" : "rgba(0,0,0,0.3)", advancedBG: darkMode ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.6)", //primary colors primary1: darkMode ? "#2172E5" : "#ff007a", primary2: darkMode ? "#3680E7" : "#FF8CC3", primary3: darkMode ? "#4D8FEA" : "#FF99C9", primary4: darkMode ? "#376bad70" : "#F6DDE8", primary5: darkMode ? "#153d6f70" : "#FDEAF1", // color text primaryText1: darkMode ? "#6da8ff" : "#ff007a", // secondary colors secondary1: darkMode ? "#2172E5" : "#ff007a", secondary2: darkMode ? "#17000b26" : "#F6DDE8", secondary3: darkMode ? "#17000b26" : "#FDEAF1", // other red1: "#FD4040", red2: "#F82D3A", red3: "#D60000", green1: "#27AE60", yellow1: "#e3a507", yellow2: "#ff8f00", yellow3: "#F3B71E", blue1: "#2172E5", blue2: "#5199FF", error: "#FD4040", success: "#27AE60", warning: "#ff8f00", // dont wanna forget these blue yet // blue4: darkMode ? '#153d6f70' : '#C4D9F8', // blue5: darkMode ? '#153d6f70' : '#EBF4FF', }; } export function theme(darkMode: boolean): DefaultTheme { return { ...colors(darkMode), grids: { sm: 8, md: 12, lg: 24, }, //shadows shadow1: darkMode ? "#000" : "#2F80ED", // media queries mediaWidth: mediaWidthTemplates, // css snippets flexColumnNoWrap: css` display: flex; flex-flow: column nowrap; `, flexRowNoWrap: css` display: flex; flex-flow: row nowrap; `, }; } const TextWrapper = styled(Text)<{ color: keyof Colors }>` color: ${({ color, theme }) => (theme as any)[color]}; `; export const TYPE = { main(props: TextProps) { return ; }, link(props: TextProps) { return ; }, label(props: TextProps) { return ; }, black(props: TextProps) { return ; }, white(props: TextProps) { return ; }, body(props: TextProps) { return ( ); }, largeHeader(props: TextProps) { return ; }, mediumHeader(props: TextProps) { return ; }, subHeader(props: TextProps) { return ; }, small(props: TextProps) { return ; }, blue(props: TextProps) { return ; }, yellow(props: TextProps) { return ; }, darkGray(props: TextProps) { return ; }, gray(props: TextProps) { return ; }, italic(props: TextProps) { return ( ); }, error({ error, ...props }: { error: boolean } & TextProps) { return ( ); }, }; export const FixedGlobalStyle = createGlobalStyle` html, input, textarea, button { font-family: 'Inter', sans-serif; font-display: fallback; } @supports (font-variation-settings: normal) { html, input, textarea, button { font-family: 'Inter var', sans-serif; } } html, body { margin: 0; padding: 0; } a { color: ${colors(false).blue1}; } * { box-sizing: border-box; } button { user-select: none; } html { font-size: 16px; font-variant: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-feature-settings: 'ss01' on, 'ss02' on, 'cv01' on, 'cv03' on; } `; export default function ThemeProvider({ useDarkMode, children, }: { useDarkMode: boolean; children: React.ReactNode; }) { const themeObject = useMemo(() => theme(useDarkMode), [useDarkMode]); return ( {children} ); } export const ThemedGlobalStyle = createGlobalStyle` html { color: ${({ theme }) => theme.text1}; background-color: ${({ theme }) => theme.bg1}; } body { min-height: 100vh; background-position: 0 -30vh; background-repeat: no-repeat; } `;