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;
}
`;