├── src ├── components │ ├── index.js │ ├── Modals.stories.mdx │ ├── Buttons.stories.mdx │ ├── Modal.js │ └── Buttons.js ├── utils │ ├── index.js │ ├── typography.js │ ├── Global.js │ ├── colors.js │ └── themes.js ├── assets │ ├── index.js │ ├── icons │ │ └── close-icon.js │ └── illustrations │ │ └── sign-up.svg └── index.js ├── public ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── manifest.json └── index.html ├── .storybook ├── manager.js ├── main.js ├── preview.js ├── contexts.js └── myTheme.js ├── .gitignore ├── package.json └── README.md /src/components/index.js: -------------------------------------------------------------------------------- 1 | export * from "./Buttons"; 2 | export * from "./Modal"; 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/emmabostian/my-awesome-design-system/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/emmabostian/my-awesome-design-system/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/emmabostian/my-awesome-design-system/HEAD/public/logo512.png -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | export * from "./colors"; 2 | export * from "./typography"; 3 | export * from "./themes"; 4 | export * from "./Global"; 5 | -------------------------------------------------------------------------------- /.storybook/manager.js: -------------------------------------------------------------------------------- 1 | import { addons } from "@storybook/addons"; 2 | import myTheme from "./myTheme"; 3 | 4 | addons.setConfig({ 5 | theme: myTheme 6 | }); 7 | -------------------------------------------------------------------------------- /src/assets/index.js: -------------------------------------------------------------------------------- 1 | import SignUp from "./illustrations/sign-up.svg"; 2 | 3 | export * from "./icons/close-icon"; 4 | 5 | export const Illustrations = { 6 | SignUp 7 | }; 8 | -------------------------------------------------------------------------------- /src/utils/typography.js: -------------------------------------------------------------------------------- 1 | export const primaryFont = '"Roboto Mono", monospace'; 2 | 3 | export const typeScale = { 4 | header1: "1.8rem", 5 | header2: "1.6rem", 6 | header3: "1.4rem", 7 | header4: "1.2rem", 8 | header5: "1.1rem", 9 | paragraph: "1rem", 10 | helperText: "0.8rem", 11 | copyrightText: "0.7rem" 12 | }; 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /.storybook/main.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | stories: ["../src/**/*.stories.(js|mdx)"], 3 | addons: [ 4 | "@storybook/preset-create-react-app", 5 | "@storybook/addon-actions", 6 | "@storybook/addon-links", 7 | "@storybook/addon-contexts/register", 8 | "@storybook/addon-backgrounds/register", 9 | "@storybook/addon-knobs", 10 | "@storybook/addon-a11y/register", 11 | { 12 | name: "@storybook/addon-docs", 13 | options: { 14 | configureJSX: true 15 | } 16 | } 17 | ] 18 | }; 19 | -------------------------------------------------------------------------------- /src/utils/Global.js: -------------------------------------------------------------------------------- 1 | import { createGlobalStyle } from "styled-components"; 2 | import { primaryFont } from "./typography"; 3 | import { normalize } from "polished"; 4 | 5 | export const GlobalStyle = createGlobalStyle` 6 | ${normalize()} 7 | html { 8 | font-size: 16px; 9 | box-sizing: border-box; 10 | } 11 | 12 | *, *:before, *:after { 13 | box-sizing: inherit; 14 | } 15 | 16 | body { 17 | margin: 0; 18 | font-family: ${primaryFont}; 19 | } 20 | 21 | main { 22 | width: 90%; 23 | margin: 0 auto; 24 | } 25 | `; 26 | -------------------------------------------------------------------------------- /.storybook/preview.js: -------------------------------------------------------------------------------- 1 | import { addParameters, addDecorator } from "@storybook/react"; 2 | import { withContexts } from "@storybook/addon-contexts/react"; 3 | import { withKnobs } from "@storybook/addon-knobs"; 4 | import { withA11y } from "@storybook/addon-a11y"; 5 | import { contexts } from "./contexts"; 6 | 7 | addParameters({ 8 | backgrounds: [ 9 | { name: "Default theme", value: "#ffffff", default: true }, 10 | { name: "Dark theme", value: "#050449" } 11 | ] 12 | }); 13 | 14 | addDecorator(withContexts(contexts)); 15 | addDecorator(withKnobs); 16 | addDecorator(withA11y); 17 | -------------------------------------------------------------------------------- /.storybook/contexts.js: -------------------------------------------------------------------------------- 1 | import { ThemeProvider } from "styled-components"; 2 | import { defaultTheme, darkTheme } from "../src/utils"; 3 | 4 | export const contexts = [ 5 | { 6 | icon: "box", 7 | title: "Themes", 8 | components: [ThemeProvider], 9 | params: [ 10 | { 11 | name: "Default theme", 12 | props: { theme: defaultTheme, default: true } 13 | }, 14 | { name: "Dark theme", props: { theme: darkTheme } } 15 | ], 16 | options: { 17 | deep: true, 18 | disable: false, 19 | cancelable: false 20 | } 21 | } 22 | ]; 23 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/utils/colors.js: -------------------------------------------------------------------------------- 1 | export const blue = { 2 | 100: "#3a36e0", 3 | 200: "#0804b8", 4 | 300: "#030086", 5 | 400: "#5f25a4", 6 | 500: "#050449" 7 | }; 8 | 9 | export const green = { 10 | 100: "#529e66", 11 | 200: "#367b48", 12 | 300: "#276738" 13 | }; 14 | 15 | export const yellow = { 16 | 100: "#e1c542", 17 | 200: "#cab23f", 18 | 300: "#b49e35" 19 | }; 20 | 21 | export const red = { 22 | 100: "#d0454c", 23 | 200: "#b54248", 24 | 300: "#95353a" 25 | }; 26 | 27 | export const neutral = { 28 | 100: "#ffffff", 29 | 200: "#f4f5f7", 30 | 300: "#e1e1e1", 31 | 400: "#737581", 32 | 500: "#4a4b53", 33 | 600: "#000000" 34 | }; 35 | -------------------------------------------------------------------------------- /src/components/Modals.stories.mdx: -------------------------------------------------------------------------------- 1 | import { Meta, Story, Preview } from "@storybook/addon-docs/blocks"; 2 | import { withKnobs, boolean } from "@storybook/addon-knobs"; 3 | import { SignUpModal } from "./Modal"; 4 | 5 | 6 | 7 | # Modals 8 | 9 | Modals are dialogs which overlay content to convey. 10 | 11 | ## Usage 12 | 13 | Use modals to call the user to action or complete a task. 14 | 15 | ## Sign Up Modal 16 | 17 | The SignUpModal is used to prompt the user to create an account. 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /.storybook/myTheme.js: -------------------------------------------------------------------------------- 1 | import { create } from "@storybook/theming/create"; 2 | 3 | export default create({ 4 | base: "light", 5 | 6 | colorPrimary: "hotpink", 7 | colorSecondary: "deepskyblue", 8 | 9 | // UI 10 | appBg: "white", 11 | appContentBg: "silver", 12 | appBorderColor: "grey", 13 | appBorderRadius: 4, 14 | 15 | // Typography 16 | fontBase: '"Open Sans", sans-serif', 17 | fontCode: "monospace", 18 | 19 | // Text colors 20 | textColor: "black", 21 | textInverseColor: "rgba(255,255,255,0.9)", 22 | 23 | // Toolbar default and active colors 24 | barTextColor: "silver", 25 | barSelectedColor: "black", 26 | barBg: "hotpink", 27 | 28 | // Form colors 29 | inputBg: "white", 30 | inputBorder: "silver", 31 | inputTextColor: "black", 32 | inputBorderRadius: 4, 33 | 34 | brandTitle: "My custom storybook", 35 | brandUrl: "https://example.com", 36 | brandImage: "https://placehold.it/350x150" 37 | }); 38 | -------------------------------------------------------------------------------- /src/components/Buttons.stories.mdx: -------------------------------------------------------------------------------- 1 | import { Meta, Story, Preview } from "@storybook/addon-docs/blocks"; 2 | import { action } from "@storybook/addon-actions"; 3 | import { withKnobs, boolean } from "@storybook/addon-knobs"; 4 | import { PrimaryButton, SecondaryButton, TertiaryButton } from "./Buttons"; 5 | 6 | 7 | 8 | # Buttons 9 | 10 | Buttons are used to trigger actions within an application. 11 | 12 | ## Usage 13 | 14 | Buttons are used to trigger internal actions within your web applications. 15 | 16 | ## Primary Buttons 17 | 18 | Primary buttons are used as a call to action and indicate the most important action on a page. 19 | 20 | 21 | 22 | Hello world 23 | 24 | 25 | 26 | ## Secondary Buttons 27 | 28 | Primary buttons are used as a call to action and indicate the most important action on a page. 29 | 30 | 31 | Hello world 32 | 33 | 34 | ## Tertiary Buttons 35 | 36 | Primary buttons are used as a call to action and indicate the most important action on a page. 37 | 38 | 39 | Hello world 40 | 41 | -------------------------------------------------------------------------------- /src/assets/icons/close-icon.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import styled from "styled-components"; 3 | 4 | const CloseIconWrapper = styled.svg` 5 | width: 100%; 6 | height: 100%; 7 | `; 8 | 9 | export const CloseIcon = () => ( 10 | 16 | ); 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-component-library", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@storybook/addon-a11y": "^5.3.14", 7 | "@storybook/addon-backgrounds": "^5.3.14", 8 | "@storybook/addon-contexts": "^5.3.14", 9 | "@storybook/addon-docs": "^5.3.14", 10 | "@storybook/addon-knobs": "^5.3.14", 11 | "@testing-library/jest-dom": "^4.2.4", 12 | "@testing-library/react": "^9.3.2", 13 | "@testing-library/user-event": "^7.1.2", 14 | "actions": "^1.3.0", 15 | "polished": "^3.4.4", 16 | "react": "^16.13.0", 17 | "react-dom": "^16.13.0", 18 | "react-scripts": "3.4.0", 19 | "react-spring": "^8.0.27", 20 | "styled-components": "^5.0.1", 21 | "styled-components-modifiers": "^1.2.5" 22 | }, 23 | "scripts": { 24 | "start": "react-scripts start", 25 | "build": "react-scripts build", 26 | "test": "react-scripts test", 27 | "eject": "react-scripts eject", 28 | "storybook": "start-storybook -p 9009 -s public", 29 | "build-storybook": "build-storybook -s public" 30 | }, 31 | "eslintConfig": { 32 | "extends": "react-app" 33 | }, 34 | "browserslist": { 35 | "production": [ 36 | ">0.2%", 37 | "not dead", 38 | "not op_mini all" 39 | ], 40 | "development": [ 41 | "last 1 chrome version", 42 | "last 1 firefox version", 43 | "last 1 safari version" 44 | ] 45 | }, 46 | "devDependencies": { 47 | "@storybook/addon-actions": "^5.3.14", 48 | "@storybook/addon-links": "^5.3.14", 49 | "@storybook/addons": "^5.3.14", 50 | "@storybook/preset-create-react-app": "^2.0.0", 51 | "@storybook/react": "^5.3.14" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import ReactDOM from "react-dom"; 3 | import { ThemeProvider } from "styled-components"; 4 | import { SignUpModal } from "./components"; 5 | import { GlobalStyle, darkTheme, defaultTheme } from "./utils"; 6 | 7 | const App = () => { 8 | const [useDarkTheme, setUseDarkTheme] = useState(false); 9 | const [showModal, setShowModal] = useState(false); 10 | return ( 11 | 12 | 18 | 24 | 30 |
42 | 43 | 44 |
45 |
46 | ); 47 | }; 48 | 49 | ReactDOM.render(, document.querySelector("#root")); 50 | -------------------------------------------------------------------------------- /src/utils/themes.js: -------------------------------------------------------------------------------- 1 | import { blue, neutral, yellow, red, green } from "./colors"; 2 | import { primaryFont } from "./typography"; 3 | 4 | export const defaultTheme = { 5 | primaryColor: blue[300], 6 | primaryHoverColor: blue[200], 7 | primaryActiveColor: blue[100], 8 | textColorOnPrimary: neutral[100], 9 | textColor: neutral[600], 10 | textColorInverted: neutral[100], 11 | disabled: neutral[400], 12 | textOnDisabled: neutral[300], 13 | formElementBackground: neutral[100], 14 | textOnFormElementBackground: neutral[600], 15 | primaryFont, 16 | status: { 17 | warningColor: yellow[100], 18 | warningColorHover: yellow[200], 19 | warningColorActive: yellow[300], 20 | errorColor: red[100], 21 | errorColorHover: red[200], 22 | errorColorActive: red[300], 23 | successColor: green[100], 24 | successColorHover: green[200], 25 | successColorActive: green[300] 26 | } 27 | }; 28 | 29 | export const darkTheme = { 30 | primaryColor: neutral[100], 31 | primaryHoverColor: neutral[200], 32 | primaryActiveColor: neutral[300], 33 | textColorOnPrimary: blue[300], 34 | textColor: blue[300], 35 | textColorInverted: neutral[100], 36 | primaryFont: primaryFont, 37 | disabled: neutral[400], 38 | textOnDisabled: neutral[300], 39 | formElementBackground: blue[100], 40 | textOnFormElementBackground: neutral[100], 41 | status: { 42 | warningColor: yellow[100], 43 | warningColorHover: yellow[200], 44 | warningColorActive: yellow[300], 45 | errorColor: red[100], 46 | errorColorHover: red[200], 47 | errorColorActive: red[300], 48 | successColor: green[100], 49 | successColorHover: green[200], 50 | successColorActive: green[300] 51 | } 52 | }; 53 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/components/Modal.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import styled from "styled-components"; 3 | import { useSpring, animated, config } from "react-spring"; 4 | import { typeScale } from "../utils"; 5 | import { Illustrations, CloseIcon } from "../assets"; 6 | import { PrimaryButton } from "./Buttons"; 7 | 8 | const ModalWrapper = styled.div` 9 | width: 800px; 10 | height: 500px; 11 | box-shadow: 0 5px 16px rgba(0, 0, 0, 0.2); 12 | background-color: ${props => props.theme.formElementBackground}; 13 | color: ${props => props.theme.textOnFormElementBackground}; 14 | display: flex; 15 | flex-direction: column; 16 | justify-content: center; 17 | align-items: center; 18 | position: relative; 19 | border-radius: 2px; 20 | `; 21 | 22 | const SignUpHeader = styled.h3` 23 | font-size: ${typeScale.header3}; 24 | `; 25 | 26 | const SignUpText = styled.p` 27 | font-size: ${typeScale.paragraph}; 28 | max-width: 70%; 29 | text-align: center; 30 | `; 31 | 32 | const CloseModalButton = styled.button` 33 | cursor: pointer; 34 | background: none; 35 | border: none; 36 | position: absolute; 37 | right: 40px; 38 | top: 40px; 39 | width: 24px; 40 | height: 24px; 41 | padding: 0; 42 | `; 43 | 44 | export const SignUpModal = ({ showModal, setShowModal }) => { 45 | const animation = useSpring({ 46 | opacity: showModal ? 1 : 0, 47 | transform: showModal ? `translateY(0)` : `translateY(-200%)`, 48 | config: config.slow 49 | }); 50 | return ( 51 | 52 | 53 | 58 | Sign Up 59 | Sign up today to get access! 60 | Sign up! 61 | 62 | 63 | 64 | 65 | 66 | ); 67 | }; 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 2 | 3 | ## Available Scripts 4 | 5 | In the project directory, you can run: 6 | 7 | ### `yarn start` 8 | 9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 11 | 12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console. 14 | 15 | ### `yarn test` 16 | 17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 19 | 20 | ### `yarn build` 21 | 22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance. 24 | 25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed! 27 | 28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 29 | 30 | ### `yarn eject` 31 | 32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 33 | 34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 35 | 36 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 37 | 38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 39 | 40 | ## Learn More 41 | 42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 43 | 44 | To learn React, check out the [React documentation](https://reactjs.org/). 45 | 46 | ### Code Splitting 47 | 48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting 49 | 50 | ### Analyzing the Bundle Size 51 | 52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size 53 | 54 | ### Making a Progressive Web App 55 | 56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app 57 | 58 | ### Advanced Configuration 59 | 60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration 61 | 62 | ### Deployment 63 | 64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment 65 | 66 | ### `yarn build` fails to minify 67 | 68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify 69 | -------------------------------------------------------------------------------- /src/components/Buttons.js: -------------------------------------------------------------------------------- 1 | import styled from "styled-components"; 2 | import { typeScale } from "../utils"; 3 | import { applyStyleModifiers } from "styled-components-modifiers"; 4 | 5 | const BUTTON_MODIFIERS = { 6 | small: ({ props }) => ` 7 | font-size: ${typeScale.helperText}; 8 | padding: 8px; 9 | `, 10 | large: ({ props }) => ` 11 | font-size: ${typeScale.h5}; 12 | padding: 16px 24px; 13 | `, 14 | warning: ({ props }) => ` 15 | background-color: ${props.theme.status.warningColor}; 16 | color: ${props.theme.textColorInverted}; 17 | 18 | &:hover, &:focus { 19 | background-color: ${props.theme.status.warningColorHover}; 20 | outline: 3px solid ${props.theme.status.warningColorHover}; 21 | } 22 | 23 | &:active { 24 | background-color: ${props.theme.status.warningColorActive}; 25 | } 26 | `, 27 | secondaryButtonWarning: ({ props }) => ` 28 | background: none; 29 | border: 2px solid ${props.theme.status.warningColor}; 30 | color: ${props.theme.status.warningColor}; 31 | `, 32 | tertiaryButtonWarning: ({ props }) => ` 33 | background: none; 34 | color: ${props.theme.status.warningColor}; 35 | `, 36 | primaryButtonError: ({ props }) => ` 37 | background-color: ${props.theme.status.errorColor}; 38 | color: ${props.theme.textColorInverted}; 39 | `, 40 | secondaryButtonError: ({ props }) => ` 41 | background: none; 42 | border: 2px solid ${props.theme.status.errorColor}; 43 | color: ${props.theme.status.errorColor}; 44 | `, 45 | tertiaryButtonError: ({ props }) => ` 46 | background: none; 47 | color: ${props.theme.status.errorColor}; 48 | `, 49 | error: ({ props }) => ` 50 | background-color: ${props.theme.status.errorColor}; 51 | color: ${props.theme.textColorInverted}; 52 | 53 | &:hover, &:focus { 54 | background-color: ${props.theme.status.errorColorHover}; 55 | } 56 | 57 | &:active { 58 | background-color: ${props.theme.status.errorColorActive}; 59 | } 60 | `, 61 | primaryButtonSuccess: ({ props }) => ` 62 | background-color: ${props.theme.status.successColor}; 63 | color: ${props.theme.textColorInverted}; 64 | `, 65 | secondaryButtonSuccess: ({ props }) => ` 66 | background: none; 67 | border: 2px solid ${props.theme.status.successColor}; 68 | color: ${props.theme.status.successColor}; 69 | `, 70 | tertiaryButtonSuccess: ({ props }) => ` 71 | background: none; 72 | color: ${props.theme.status.successColor}; 73 | `, 74 | success: ({ props }) => ` 75 | background-color: ${props.theme.status.successColor}; 76 | color: ${props.theme.textColorInverted}; 77 | 78 | &:hover { 79 | background-color: ${props.theme.status.successColorHover}; 80 | } 81 | 82 | &:active { 83 | background-color: ${props.theme.status.successColorActive}; 84 | } 85 | ` 86 | }; 87 | 88 | const Button = styled.button` 89 | padding: 12px 24px; 90 | font-size: ${typeScale.paragraph}; 91 | border-radius: 2px; 92 | min-width: 100px; 93 | cursor: pointer; 94 | font-family: "Roboto Mono", monospace; 95 | transition: background-color 0.2s linear, color 0.2s linear; 96 | 97 | &:hover { 98 | background-color: ${props => props.theme.primaryHoverColor}; 99 | color: ${props => props.theme.textColorOnPrimary}; 100 | } 101 | 102 | &:focus { 103 | outline: 3px solid ${props => props.theme.primaryHoverColor}; 104 | outline-offset: 2px; 105 | } 106 | 107 | &:active { 108 | background-color: ${props => props.theme.primaryActiveColor}; 109 | border-color: ${props => props.theme.primaryActiveColor}; 110 | color: ${props => props.theme.textColorOnPrimary}; 111 | } 112 | `; 113 | 114 | export const PrimaryButton = styled(Button)` 115 | background-color: ${props => props.theme.primaryColor}; 116 | border: none; 117 | color: ${props => props.theme.textColorOnPrimary}; 118 | 119 | &:disabled { 120 | background-color: ${props => props.theme.disabled}; 121 | color: ${props => props.theme.textOnDisabled}; 122 | cursor: not-allowed; 123 | } 124 | 125 | ${applyStyleModifiers(BUTTON_MODIFIERS)} 126 | `; 127 | 128 | export const SecondaryButton = styled(Button)` 129 | background: none; 130 | border: 2px solid ${props => props.theme.primaryColor}; 131 | color: ${props => props.theme.primaryColor}; 132 | 133 | &:disabled { 134 | background: none; 135 | color: ${props => props.theme.disabled}; 136 | border-color: ${props => props.theme.disabled}; 137 | cursor: not-allowed; 138 | } 139 | 140 | ${applyStyleModifiers(BUTTON_MODIFIERS)} 141 | `; 142 | 143 | export const TertiaryButton = styled(Button)` 144 | background: none; 145 | border: none; 146 | color: ${props => props.theme.primaryColor}; 147 | 148 | &:disabled { 149 | background: none; 150 | color: ${props => props.theme.disabled}; 151 | cursor: not-allowed; 152 | } 153 | 154 | ${applyStyleModifiers(BUTTON_MODIFIERS)} 155 | `; 156 | -------------------------------------------------------------------------------- /src/assets/illustrations/sign-up.svg: -------------------------------------------------------------------------------- 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 | --------------------------------------------------------------------------------