├── 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 |
11 |
15 |
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 |
58 |
--------------------------------------------------------------------------------