├── .env
├── .gitignore
├── README.md
├── logo.png
├── package.json
├── postcss.config.js
├── public
├── favicon.ico
├── index.html
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt
├── src
├── app
│ ├── index.js
│ └── routing.js
├── assets
│ ├── custom.css
│ ├── main.css
│ └── tailwind.css
├── components
│ ├── features
│ │ ├── Login
│ │ │ ├── Form
│ │ │ │ ├── Email
│ │ │ │ │ └── index.js
│ │ │ │ ├── Password
│ │ │ │ │ └── index.js
│ │ │ │ ├── Submit
│ │ │ │ │ └── index.js
│ │ │ │ └── index.js
│ │ │ ├── Link
│ │ │ │ └── index.js
│ │ │ └── index.js
│ │ ├── Logo
│ │ │ └── index.js
│ │ ├── Navigation
│ │ │ ├── Linker.js
│ │ │ ├── Links
│ │ │ │ └── Features
│ │ │ │ │ ├── Menu
│ │ │ │ │ ├── Badge
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── Item
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── RequestButton
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── SubMenu
│ │ │ │ │ │ └── index.js
│ │ │ │ │ ├── index.js
│ │ │ │ │ └── state.js
│ │ │ │ │ └── index.js
│ │ │ ├── Switcher.js
│ │ │ └── index.js
│ │ ├── Search
│ │ │ └── index.js
│ │ ├── Signup
│ │ │ └── index.js
│ │ └── Statement
│ │ │ └── index.js
│ └── library
│ │ ├── Button
│ │ ├── Brand.jsx
│ │ ├── index.js
│ │ └── withStyledButton.js
│ │ ├── Label
│ │ ├── Label.jsx
│ │ └── index.js
│ │ └── Textfield
│ │ ├── Outline.jsx
│ │ └── index.js
├── constants
│ └── routes.js
├── index.js
├── layouts
│ └── Header
│ │ ├── index.js
│ │ └── mobile
│ │ └── index.js
├── pages
│ ├── Customers
│ │ └── index.js
│ ├── Features
│ │ └── index.js
│ ├── Home
│ │ └── index.js
│ ├── Login
│ │ └── index.js
│ ├── Products
│ │ └── index.js
│ ├── Sales
│ │ └── index.js
│ └── index.js
├── serviceWorker.js
└── setupTests.js
└── tailwind.config.js
/.env:
--------------------------------------------------------------------------------
1 | REACT_APP_API_KEY="AIzaSyC9eABwujyTzLqJdcEufCw1tflEHHEans8",
2 | REACT_APP_AUTH_DOMAIN: "react-authentication-adb73.firebaseapp.com",
3 | REACT_APP_DATABASE_URL: "https://react-authentication-adb73.firebaseio.com",
4 | REACT_APP_PROJECT_ID: "react-authentication-adb73",
5 | REACT_APP_STORAGE_BUCKET: "react-authentication-adb73.appspot.com",
6 | REACT_APP_MESSAGING_SENDER_ID: "27359851197",
7 | REACT_APP_ID: "1:27359851197:web:ea7a24b116a2b0720ffdd4",
8 | REACT_APP_MEASUREMENT_ID: "G-D8W142VJEL"
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
React Navigation
4 |
5 | Professional Navigation with modern design.
6 |
7 | ## Demo
8 |
9 | [Live App](https://jiue8.csb.app/)
10 |
11 | [On Codesandbox](https://codesandbox.io/s/menaialareact-navigation-jiue8)
12 |
13 | ## Features
14 |
15 | - [x] Well-structured directories and modules.
16 | - [x] Modular and readable code.
17 | - [x] Modern user interface.
18 | - [x] Responsive.
19 | - [x] Respected accessibility and usability.
20 |
21 | ## Scripts
22 |
23 | In the project directory, you can run:
24 |
25 | #### `npm start`
26 |
27 | Runs the app in the development mode.
28 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
29 |
30 | #### `npm run build`
31 |
32 | Builds the app for production to the `build` folder.
33 | It correctly bundles React in production mode and optimizes the build for the best performance.
34 |
35 | The build is minified and the filenames include the hashes.
36 | Your app is ready to be deployed!
37 |
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alamenai/react-navigation/97a1dd3945c66eef05c0e8fc9c35dc0c8ec7805d/logo.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-firebase-authentication",
3 | "version": "0.1.0",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^4.2.4",
7 | "@testing-library/react": "^9.5.0",
8 | "@testing-library/user-event": "^7.2.1",
9 | "autoprefixer": "^9.8.6",
10 | "firebase": "^4.0.0",
11 | "lodash": "^4.17.19",
12 | "postcss": "^7.0.32",
13 | "react": "^16.13.1",
14 | "react-dom": "^16.13.1",
15 | "react-router-dom": "^5.2.0",
16 | "react-scripts": "3.4.1",
17 | "react-transition-group": "^4.4.1",
18 | "recompose": "^0.30.0",
19 | "sass": "^1.26.10",
20 | "tailwindcss": "^1.6.2"
21 | },
22 | "scripts": {
23 | "start": "npm run watch:css && react-scripts start",
24 | "build": "npm run build:css && react-scripts build",
25 | "test": "react-scripts test",
26 | "eject": "react-scripts eject",
27 | "build:css": "tailwind build src/assets/tailwind.css -o src/assets/main.css",
28 | "watch:css": "tailwind build src/assets/tailwind.css -o src/assets/main.css"
29 | },
30 | "eslintConfig": {
31 | "extends": "react-app"
32 | },
33 | "browserslist": {
34 | "production": [
35 | ">0.2%",
36 | "not dead",
37 | "not op_mini all"
38 | ],
39 | "development": [
40 | "last 1 chrome version",
41 | "last 1 firefox version",
42 | "last 1 safari version"
43 | ]
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | const tailwindcss = require('tailwindcss');
2 | module.exports = {
3 | plugins: [
4 | tailwindcss("./tailwind.config.js"),
5 | require('autoprefixer')
6 | ],
7 | };
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alamenai/react-navigation/97a1dd3945c66eef05c0e8fc9c35dc0c8ec7805d/public/favicon.ico
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alamenai/react-navigation/97a1dd3945c66eef05c0e8fc9c35dc0c8ec7805d/public/logo192.png
--------------------------------------------------------------------------------
/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alamenai/react-navigation/97a1dd3945c66eef05c0e8fc9c35dc0c8ec7805d/public/logo512.png
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/app/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { BrowserRouter as Router } from "react-router-dom"
3 | import Header from "../layouts/Header"
4 | import { Switcher } from "../components/features/Navigation"
5 | import HeaderMobile from "../layouts/Header/mobile"
6 |
7 | class App extends React.Component {
8 | render() {
9 | return (
10 |
11 |
12 |
13 |
14 |
15 |
16 | )
17 | }
18 | }
19 | export default App
--------------------------------------------------------------------------------
/src/app/routing.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import * as ROUTES from '../constants/routes'
3 |
4 | const Routing = () => (
5 |
6 |
7 |
8 | )
9 |
10 | export default Routing
--------------------------------------------------------------------------------
/src/assets/custom.css:
--------------------------------------------------------------------------------
1 | button:focus {
2 | outline: none;
3 | }
--------------------------------------------------------------------------------
/src/assets/tailwind.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss/base";
2 | @import "tailwindcss/components";
3 | @import "tailwindcss/utilities";
--------------------------------------------------------------------------------
/src/components/features/Login/Form/Email/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { OutlineField as EmailField } from "../../../../library/Textfield"
3 | import Label from "../../../../library/Label"
4 |
5 | const Email = () => {
6 |
7 | const email = {
8 | type: "password",
9 | id: "password",
10 | placeholder: "You@example.com",
11 | isFocused: true
12 | };
13 |
14 | return
15 |
16 |
17 |
18 | }
19 |
20 | export default Email
--------------------------------------------------------------------------------
/src/components/features/Login/Form/Password/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Link } from "react-router-dom"
3 | import { OutlineField as PasswordField } from "../../../../library/Textfield"
4 | import Label from "../../../../library/Label"
5 |
6 |
7 | const Password = () => {
8 |
9 | const password = {
10 | type: "password",
11 | id: "password",
12 | placeholder: "••••••••••",
13 | isFocused: false
14 | };
15 |
16 | return < div className="mt-3 flex flex-col" >
17 |
18 |
19 |
20 |
21 |
22 |
23 | }
24 |
25 | const ForgotPasswordLink = () => (
26 |
27 | Forgot password?
28 |
29 | )
30 |
31 | export default Password
--------------------------------------------------------------------------------
/src/components/features/Login/Form/Submit/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { BrandButtonLarge as SignInButton } from "../../../../library/Button"
3 |
4 |
5 | const LoginButton = () => {
6 |
7 | const login = (e) => e.preventDefault()
8 |
9 | return
14 | }
15 |
16 | export default LoginButton
--------------------------------------------------------------------------------
/src/components/features/Login/Form/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import Email from "./Email"
3 | import Password from "./Password"
4 | import LoginButton from "./Submit"
5 | const Form = () => {
6 | return ()
15 | }
16 | export default Form
--------------------------------------------------------------------------------
/src/components/features/Login/Link/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Link } from "react-router-dom"
3 | import * as ROUTES from "../../../../constants/routes"
4 |
5 | const Login = () => (
6 |
9 | {ROUTES.LOGIN.name}
10 | )
11 |
12 | export default Login
--------------------------------------------------------------------------------
/src/components/features/Login/index.js:
--------------------------------------------------------------------------------
1 | import LoginLink from "./Link"
2 | import LoginForm from "./Form"
3 |
4 | export default LoginForm
5 | export { LoginLink }
6 |
--------------------------------------------------------------------------------
/src/components/features/Logo/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Link } from "react-router-dom"
3 | import { HOME } from "../../../constants/routes"
4 |
5 | const Logo = () => (
6 |
7 |
9 | t
10 |
11 | )
12 |
13 | export default Logo
--------------------------------------------------------------------------------
/src/components/features/Navigation/Linker.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import * as ROUTES from "../../../constants/routes"
3 | import { NavLink } from "react-router-dom"
4 | import FeatureLink from "./Links/Features"
5 |
6 | const Linker = () => (
7 |
15 | )
16 | export default Linker
--------------------------------------------------------------------------------
/src/components/features/Navigation/Links/Features/Menu/Badge/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | const Badge = ({ text }) => (
4 |
5 | {text}
6 |
7 | )
8 | export default Badge
--------------------------------------------------------------------------------
/src/components/features/Navigation/Links/Features/Menu/Item/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Link } from "react-router-dom"
3 |
4 | const Item = ({ name, route }) => (
5 | < Link to={`/features/${route}`} className="text-gray-700 text-base-14 hover:text-brand" > {name})
6 |
7 | export default Item
--------------------------------------------------------------------------------
/src/components/features/Navigation/Links/Features/Menu/RequestButton/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Link } from "react-router-dom"
3 | import { BrandButtonDefault as Button } from "../../../../../../library/Button"
4 |
5 |
6 | const RequestButton = () => {
7 |
8 | const login = (e) => e.preventDefault()
9 |
10 | return
11 |
16 |
17 | }
18 |
19 | export default RequestButton
--------------------------------------------------------------------------------
/src/components/features/Navigation/Links/Features/Menu/SubMenu/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import ItemText from "../Item"
3 | import Badge from "../Badge"
4 |
5 | const SubMenu = ({ items }) => {
6 | return
7 | {items.map((item, index) => (
8 |
9 | {CategoryName(item, index)}
10 |
11 | {ItemsList(item)}
12 |
13 |
14 | ))}
15 |
16 | }
17 |
18 | const CategoryName = (item, index) => (
19 |
20 | {item.categoryName}
21 |
)
22 |
23 | const ItemsList = (item) => (
24 | item.links && item.links.map(({ name, route }, index) => Item(name, route, index)))
25 |
26 | const Item = (name, route, index) => (
27 |
28 |
29 | {index === 0 && }
30 |
)
31 |
32 | export default SubMenu
--------------------------------------------------------------------------------
/src/components/features/Navigation/Links/Features/Menu/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import SubMenu from "./SubMenu"
3 | import RequestButton from "./RequestButton"
4 | import { items } from "./state"
5 |
6 | const Menu = ({ isVisible }) => {
7 |
8 | return ()
14 | }
15 | export default Menu
--------------------------------------------------------------------------------
/src/components/features/Navigation/Links/Features/Menu/state.js:
--------------------------------------------------------------------------------
1 | export const items = [
2 | {
3 | categoryName: "CODE",
4 | links: [{
5 | name: "Code Review",
6 | route: "code-review"
7 | },
8 | {
9 | name: "Project management",
10 | route: "project-management"
11 | }, {
12 | name: "Integration",
13 | route: "integration"
14 | }, {
15 | name: "Hosting",
16 | route: "hosting"
17 | }]
18 | },
19 | {
20 | categoryName: "TEAM",
21 | links: [{
22 | name: "Discussion",
23 | route: "discussion"
24 | },
25 | {
26 | name: "Q&A",
27 | route: "question-answer"
28 | }, {
29 | name: "Team management",
30 | route: "team-management"
31 | },]
32 | }
33 | ]
--------------------------------------------------------------------------------
/src/components/features/Navigation/Links/Features/index.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react"
2 | import { NavLink } from "react-router-dom"
3 | import { FEATURES } from "../../../../../constants/routes"
4 | import Menu from "./Menu"
5 |
6 | const FeaturesLink = () => {
7 | const [visible, setVisible] = useState(false)
8 |
9 | const displayMenu = () => {
10 | setVisible(true)
11 | }
12 | const hideMenu = () => {
13 | setVisible(false)
14 | }
15 | return
17 |
23 | {FEATURES.name}
24 |
25 |
26 |
27 | }
28 | export default FeaturesLink
--------------------------------------------------------------------------------
/src/components/features/Navigation/Switcher.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Switch, Route } from "react-router-dom"
3 | import Home, {
4 | FeaturesPage,
5 | ProductsPage,
6 | CustomersPage,
7 | SalesPage,
8 | LoginPage
9 | } from "../../../pages"
10 |
11 | const Switcher = () => (
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | )
32 |
33 | export default Switcher
--------------------------------------------------------------------------------
/src/components/features/Navigation/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Switcher from './Switcher';
3 | import Linker from "./Linker"
4 |
5 | const Navigation = () => (
6 |
7 |
8 |
)
9 |
10 | export default Navigation
11 | export { Switcher }
--------------------------------------------------------------------------------
/src/components/features/Search/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import {useHistory} from "react-router-dom"
3 | import {HOME} from "../../../constants/routes"
4 |
5 | const Search = () => {
6 |
7 | const history=useHistory()
8 | const onSearch=()=>{
9 | history.push(HOME.link)
10 | }
11 | return
29 | }
30 |
31 | export default Search
--------------------------------------------------------------------------------
/src/components/features/Signup/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Link } from "react-router-dom"
3 | import { BrandButtonDefault } from "../../library/Button"
4 |
5 | const SignUpButton = () => (
6 |
7 |
11 | )
12 |
13 |
14 | export default SignUpButton
--------------------------------------------------------------------------------
/src/components/features/Statement/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Link } from "react-router-dom"
3 | import { BrandButtonDefault } from "../../library/Button"
4 |
5 | const UniqueValueStatement = () => (
6 |
10 | Create Apps In
11 | Minutes
12 |
13 | Without Code
14 |
15 | )
16 | const GetStartedButton = () => (
17 |
18 |
25 | )
26 |
27 | export default UniqueValueStatement
28 | export {GetStartedButton}
--------------------------------------------------------------------------------
/src/components/library/Button/Brand.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import PropTypes from "prop-types"
3 | import withStyledButton from "./withStyledButton"
4 |
5 | const commonClasses = ["bg-brand outline-none font-helvetica text-white tracking-wider cursor-pointer focus:shadow-outline"]
6 |
7 | const BrandButtonDefault = (props) => {
8 | let defaultClasses = ["w-26 py-2 text-base rounded-base mr-5"]
9 | defaultClasses.push(commonClasses)
10 | return withStyledButton(defaultClasses, props)
11 | }
12 |
13 | const BrandButtonLarge = (props) => {
14 | let defaultClasses = ["w-full py-4 rounded-md outline-none cursor-pointer"]
15 | defaultClasses.push(commonClasses)
16 | return withStyledButton(defaultClasses, props)
17 | }
18 |
19 | export const Button = ({
20 | type,
21 | value,
22 | event,
23 | classes }) => {
24 |
25 | if (type === "submit") {
26 | return ()
31 | }
32 |
33 | if (type === "button") {
34 | return ()
39 | }
40 |
41 | }
42 |
43 | Button.propTypes = {
44 | type: PropTypes.string.isRequired,
45 | value: PropTypes.string.isRequired,
46 | event: PropTypes.func.isRequired,
47 | classes: PropTypes.string
48 | }
49 |
50 | export default BrandButtonDefault
51 | export { BrandButtonLarge }
52 |
--------------------------------------------------------------------------------
/src/components/library/Button/index.js:
--------------------------------------------------------------------------------
1 | import { BrandButtonLarge } from "./Brand"
2 | import BrandButtonDefault from "./Brand"
3 | export { BrandButtonLarge, BrandButtonDefault }
--------------------------------------------------------------------------------
/src/components/library/Button/withStyledButton.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import { Button } from "./Brand"
3 |
4 | const withStyledButton = (defaultClasses, props) => {
5 | let classes = props.classes
6 | classes && defaultClasses.push(classes)
7 | return
8 | }
9 |
10 | export default withStyledButton
--------------------------------------------------------------------------------
/src/components/library/Label/Label.jsx:
--------------------------------------------------------------------------------
1 | import React from "react"
2 |
3 | const Label = ({ forInput, value }) => (
4 |
9 | )
10 |
11 | export default Label
--------------------------------------------------------------------------------
/src/components/library/Label/index.js:
--------------------------------------------------------------------------------
1 | import Label from "./Label"
2 | export default Label
--------------------------------------------------------------------------------
/src/components/library/Textfield/Outline.jsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect } from "react"
2 |
3 | const Field = ({
4 | type,
5 | name,
6 | id,
7 | placeholder,
8 | isFocused }) => {
9 |
10 | const ref = React.createRef();
11 |
12 | useEffect(() => {
13 | isFocused && ref.current.focus()
14 | });
15 |
16 | return ()
25 | }
26 |
27 | export default Field
--------------------------------------------------------------------------------
/src/components/library/Textfield/index.js:
--------------------------------------------------------------------------------
1 | import OutlineField from "./Outline"
2 | export { OutlineField }
--------------------------------------------------------------------------------
/src/constants/routes.js:
--------------------------------------------------------------------------------
1 | export const HOME = { link: "/" };
2 | export const FEATURES = { name: "Features", link: "/features" };
3 | export const PRODUCTS = { name: "Products", link: "/products" };
4 | export const CUSTOMERS = { name: "Customers", link: "/customers" };
5 | export const SALES = { name: "Sales", link: "/sales" };
6 | export const LOGIN = { name: "Login", link: "/login" };
7 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './app/index'
4 | import * as serviceWorker from './serviceWorker';
5 | import "./assets/main.css"
6 |
7 | ReactDOM.render(
8 |
9 |
10 |
11 | ,
12 | document.getElementById('root')
13 | );
14 |
15 | // If you want your app to work offline and load faster, you can change
16 | // unregister() to register() below. Note this comes with some pitfalls.
17 | // Learn more about service workers: https://bit.ly/CRA-PWA
18 | serviceWorker.unregister();
19 |
--------------------------------------------------------------------------------
/src/layouts/Header/index.js:
--------------------------------------------------------------------------------
1 | import React, { Fragment } from "react"
2 | import Logo from "../../components/features/Logo"
3 | import SignUpButton from "../../components/features/Signup"
4 | import SearchField from "../../components/features/Search"
5 | import Navigation from "../../components/features/Navigation"
6 | import { LoginLink } from "../../components/features/Login"
7 |
8 | const Header = () => (
9 |
10 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | )
27 |
28 | export default Header
--------------------------------------------------------------------------------
/src/layouts/Header/mobile/index.js:
--------------------------------------------------------------------------------
1 | import React, { Fragment } from "react"
2 | import Navigation from "../../../components/features/Navigation"
3 |
4 | const HeaderMobile = () => (
5 |
6 |
7 |
8 |
9 | )
10 |
11 | export default HeaderMobile
--------------------------------------------------------------------------------
/src/pages/Customers/index.js:
--------------------------------------------------------------------------------
1 | const Customers = () => null
2 | export default Customers
--------------------------------------------------------------------------------
/src/pages/Features/index.js:
--------------------------------------------------------------------------------
1 | const Features = () => null
2 | export default Features
--------------------------------------------------------------------------------
/src/pages/Home/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import Statement, { GetStartedButton } from "../../components/features/Statement"
3 | const Home = () => (
4 |
5 |
6 |
7 |
8 | )
9 | export default Home
--------------------------------------------------------------------------------
/src/pages/Login/index.js:
--------------------------------------------------------------------------------
1 | import React from "react"
2 | import LoginForm from "../../components/features/Login"
3 | const Login = () => (
4 |
5 |
6 |
7 | )
8 | export default Login
--------------------------------------------------------------------------------
/src/pages/Products/index.js:
--------------------------------------------------------------------------------
1 | const Products = () => null
2 | export default Products
--------------------------------------------------------------------------------
/src/pages/Sales/index.js:
--------------------------------------------------------------------------------
1 | const Sales = () => null
2 | export default Sales
--------------------------------------------------------------------------------
/src/pages/index.js:
--------------------------------------------------------------------------------
1 | import CustomersPage from "./Customers"
2 | import HomePage from "./Home"
3 | import FeaturesPage from "./Features"
4 | import ProductsPage from "./Products"
5 | import SalesPage from "./Sales"
6 | import LoginPage from "./Login"
7 |
8 | export default HomePage;
9 | export { FeaturesPage, ProductsPage, SalesPage, CustomersPage, LoginPage }
10 |
--------------------------------------------------------------------------------
/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.0/8 are considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl, {
104 | headers: { 'Service-Worker': 'script' },
105 | })
106 | .then(response => {
107 | // Ensure service worker exists, and that we really are getting a JS file.
108 | const contentType = response.headers.get('content-type');
109 | if (
110 | response.status === 404 ||
111 | (contentType != null && contentType.indexOf('javascript') === -1)
112 | ) {
113 | // No service worker found. Probably a different app. Reload the page.
114 | navigator.serviceWorker.ready.then(registration => {
115 | registration.unregister().then(() => {
116 | window.location.reload();
117 | });
118 | });
119 | } else {
120 | // Service worker found. Proceed as normal.
121 | registerValidSW(swUrl, config);
122 | }
123 | })
124 | .catch(() => {
125 | console.log(
126 | 'No internet connection found. App is running in offline mode.'
127 | );
128 | });
129 | }
130 |
131 | export function unregister() {
132 | if ('serviceWorker' in navigator) {
133 | navigator.serviceWorker.ready
134 | .then(registration => {
135 | registration.unregister();
136 | })
137 | .catch(error => {
138 | console.error(error.message);
139 | });
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom/extend-expect';
6 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | purge: [],
3 | target: 'relaxed',
4 | prefix: '',
5 | important: false,
6 | separator: ':',
7 | theme: {
8 | screens: {
9 | 'xs': {
10 | 'min': '320px',
11 | 'max': '639px'
12 | },
13 | 'sm': {
14 | 'min': '640px',
15 | 'max': '767px'
16 | },
17 | 'md': {
18 | 'min': '768px',
19 | 'max': '1023px'
20 | },
21 | 'lg': {
22 | 'min': '1024px',
23 | 'max': '1279px'
24 | },
25 | 'xl': {
26 | 'min': '1280px'
27 | },
28 |
29 | },
30 | colors: {
31 | brand: '#8F17FA',
32 | "brand-dark": '#2F0739',
33 | transparent: 'transparent',
34 | current: 'currentColor',
35 |
36 | black: '#000',
37 | white: '#fff',
38 |
39 | gray: {
40 | 50: '#f7fafc',
41 | 100: '#f9f9f9',
42 | 200: '#edf2f7',
43 | 300: '#e2e8f0',
44 | 400: '#cbd5e0',
45 | 500: '#a0aec0',
46 | 600: '#718096',
47 | 700: '#4a5568',
48 | 800: '#2d3748',
49 | 900: '#1a202c',
50 | },
51 | red: {
52 | 100: '#fff5f5',
53 | 200: '#fed7d7',
54 | 300: '#feb2b2',
55 | 400: '#fc8181',
56 | 500: '#f56565',
57 | 600: '#E6033A',
58 | 700: '#c53030',
59 | 800: '#9b2c2c',
60 | 900: '#742a2a',
61 | },
62 | orange: {
63 | 100: '#fffaf0',
64 | 200: '#feebc8',
65 | 300: '#fbd38d',
66 | 400: '#f6ad55',
67 | 500: '#ed8936',
68 | 600: '#dd6b20',
69 | 700: '#c05621',
70 | 800: '#9c4221',
71 | 900: '#7b341e',
72 | },
73 | yellow: {
74 | 100: '#fffff0',
75 | 200: '#fefcbf',
76 | 300: '#faf089',
77 | 400: '#f6e05e',
78 | 500: '#ecc94b',
79 | 600: '#d69e2e',
80 | 700: '#b7791f',
81 | 800: '#975a16',
82 | 900: '#744210',
83 | },
84 | green: {
85 | 100: '#f0fff4',
86 | 200: '#c6f6d5',
87 | 300: '#9ae6b4',
88 | 400: '#68d391',
89 | 500: '#48bb78',
90 | 600: '#38a169',
91 | 700: '#2f855a',
92 | 800: '#276749',
93 | 900: '#22543d',
94 | },
95 | teal: {
96 | 100: '#e6fffa',
97 | 200: '#b2f5ea',
98 | 300: '#81e6d9',
99 | 400: '#4fd1c5',
100 | 500: '#38b2ac',
101 | 600: '#319795',
102 | 700: '#2c7a7b',
103 | 800: '#285e61',
104 | 900: '#234e52',
105 | },
106 | blue: {
107 | 100: '#ebf8ff',
108 | 200: '#bee3f8',
109 | 300: '#90cdf4',
110 | 400: '#63b3ed',
111 | 500: '#4299e1',
112 | 600: '#3182ce',
113 | 700: '#2b6cb0',
114 | 800: '#2c5282',
115 | 900: '#2a4365',
116 | },
117 | indigo: {
118 | 100: '#ebf4ff',
119 | 200: '#c3dafe',
120 | 300: '#a3bffa',
121 | 400: '#7f9cf5',
122 | 500: '#667eea',
123 | 600: '#5a67d8',
124 | 700: '#4c51bf',
125 | 800: '#434190',
126 | 900: '#3c366b',
127 | },
128 | purple: {
129 | 100: '#faf5ff',
130 | 200: '#e9d8fd',
131 | 300: '#d6bcfa',
132 | 400: '#b794f4',
133 | 500: '#9f7aea',
134 | 600: '#805ad5',
135 | 700: '#6b46c1',
136 | 800: '#553c9a',
137 | 900: '#44337a',
138 | },
139 | pink: {
140 | 100: '#fff5f7',
141 | 200: '#fed7e2',
142 | 300: '#fbb6ce',
143 | 400: '#f687b3',
144 | 500: '#ed64a6',
145 | 600: '#d53f8c',
146 | 700: '#b83280',
147 | 800: '#97266d',
148 | 900: '#702459',
149 | },
150 | },
151 | spacing: {
152 | px: '1px',
153 | '0': '0',
154 | '1': '0.25rem',
155 | '2': '0.5rem',
156 | '3': '0.75rem',
157 | '4': '1rem',
158 | '5': '1.25rem',
159 | '6': '1.5rem',
160 | '8': '2rem',
161 | '10': '2.5rem',
162 | '12': '3rem',
163 | '16': '4rem',
164 | '20': '5rem',
165 | '24': '6rem',
166 | '26': '6.25rem',
167 | '32': '8rem',
168 | '40': '10rem',
169 | '48': '12rem',
170 | '56': '14rem',
171 | '64': '16rem',
172 | },
173 | backgroundColor: theme => theme('colors'),
174 | backgroundOpacity: theme => theme('opacity'),
175 | backgroundPosition: {
176 | bottom: 'bottom',
177 | center: 'center',
178 | left: 'left',
179 | 'left-bottom': 'left bottom',
180 | 'left-top': 'left top',
181 | right: 'right',
182 | 'right-bottom': 'right bottom',
183 | 'right-top': 'right top',
184 | top: 'top',
185 | },
186 | backgroundSize: {
187 | auto: 'auto',
188 | cover: 'cover',
189 | contain: 'contain',
190 | },
191 | borderColor: theme => ({
192 | ...theme('colors'),
193 | default: theme('colors.gray.300', 'currentColor'),
194 | }),
195 | borderOpacity: theme => theme('opacity'),
196 | borderRadius: {
197 | none: '0',
198 | sm: '0.125rem',
199 | default: '0.25rem',
200 | base: '0.5rem',
201 | md: '0.375rem',
202 | lg: '0.5rem',
203 | full: '9999px',
204 | },
205 | borderWidth: {
206 | default: '1px',
207 | '0': '0',
208 | '2': '2px',
209 | '4': '4px',
210 | '8': '8px',
211 | },
212 | boxShadow: {
213 | xs: '0 0 0 1px rgba(0, 0, 0, 0.05)',
214 | sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
215 | default: '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)',
216 | md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
217 | lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
218 | xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
219 | '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
220 | inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',
221 | outline: '0 0 0 3px rgba(143, 23, 250, 0.5)',
222 | "outline-sm": '0 0 0 2px rgba(143, 23, 250, 0.5)',
223 | "outline-orange": '0 0 0 3px rgba(223, 155, 43, 0.5)',
224 | none: 'none',
225 | },
226 | container: {},
227 | cursor: {
228 | auto: 'auto',
229 | default: 'default',
230 | pointer: 'pointer',
231 | wait: 'wait',
232 | text: 'text',
233 | move: 'move',
234 | 'not-allowed': 'not-allowed',
235 | },
236 | divideColor: theme => theme('borderColor'),
237 | divideOpacity: theme => theme('borderOpacity'),
238 | divideWidth: theme => theme('borderWidth'),
239 | fill: {
240 | current: 'currentColor',
241 | },
242 | flex: {
243 | '1': '1 1 0%',
244 | auto: '1 1 auto',
245 | initial: '0 1 auto',
246 | none: 'none',
247 | },
248 | flexGrow: {
249 | '0': '0',
250 | default: '1',
251 | },
252 | flexShrink: {
253 | '0': '0',
254 | default: '1',
255 | },
256 | fontFamily: {
257 | sans: [
258 | 'system-ui',
259 | '-apple-system',
260 | 'BlinkMacSystemFont',
261 | '"Segoe UI"',
262 | 'Roboto',
263 | '"Helvetica Neue"',
264 | 'Arial',
265 | '"Noto Sans"',
266 | 'sans-serif',
267 | '"Apple Color Emoji"',
268 | '"Segoe UI Emoji"',
269 | '"Segoe UI Symbol"',
270 | '"Noto Color Emoji"',
271 | ],
272 | serif: ['Georgia', 'Cambria', '"Times New Roman"', 'Times', 'serif'],
273 | mono: ['Menlo', 'Monaco', 'Consolas', '"Liberation Mono"', '"Courier New"', 'monospace'],
274 | helvetica: '"Helvetica"',
275 | },
276 | fontSize: {
277 | "xs-10": "0.625rem",
278 | xs: '0.75rem',
279 | sm: '0.875rem',
280 | "base-14": "0.875rem",
281 | base: '0.9375rem',
282 | lg: '1.125rem',
283 | xl: '1.25rem',
284 | '2xl': '1.5rem',
285 | '3xl': '1.875rem',
286 | '4xl': '2.25rem',
287 | '5xl': '3rem',
288 | '6xl': '4rem',
289 | },
290 | fontWeight: {
291 | hairline: '100',
292 | thin: '200',
293 | light: '300',
294 | normal: '400',
295 | medium: '500',
296 | semibold: '600',
297 | bold: '700',
298 | extrabold: '800',
299 | black: '900',
300 | },
301 | height: theme => ({
302 | auto: 'auto',
303 | ...theme('spacing'),
304 | full: '100%',
305 | screen: '100vh',
306 | }),
307 | inset: {
308 | '0': '0',
309 | auto: 'auto',
310 | },
311 | letterSpacing: {
312 | tighter: '-0.05em',
313 | tight: '-0.025em',
314 | normal: '0',
315 | wide: '0.025em',
316 | wider: '0.05em',
317 | widest: '0.1em',
318 | },
319 | lineHeight: {
320 | none: '1',
321 | tight: '1.25',
322 | snug: '1.375',
323 | normal: '1.5',
324 | relaxed: '1.625',
325 | loose: '2',
326 | '3': '.75rem',
327 | '4': '1rem',
328 | '5': '1.25rem',
329 | '6': '1.5rem',
330 | '7': '1.75rem',
331 | '8': '2rem',
332 | '9': '2.25rem',
333 | '10': '2.5rem',
334 | },
335 | listStyleType: {
336 | none: 'none',
337 | disc: 'disc',
338 | decimal: 'decimal',
339 | },
340 | margin: (theme, { negative }) => ({
341 | auto: 'auto',
342 | ...theme('spacing'),
343 | ...negative(theme('spacing')),
344 | }),
345 | maxHeight: {
346 | full: '100%',
347 | screen: '100vh',
348 | },
349 | maxWidth: (theme, { breakpoints }) => ({
350 | none: 'none',
351 | xs: '20rem',
352 | sm: '24rem',
353 | md: '28rem',
354 | lg: '32rem',
355 | xl: '36rem',
356 | '2xl': '42rem',
357 | '3xl': '48rem',
358 | '4xl': '56rem',
359 | '5xl': '64rem',
360 | '6xl': '72rem',
361 | full: '100%',
362 | ...breakpoints(theme('screens')),
363 | }),
364 | minHeight: {
365 | '0': '0',
366 | full: '100%',
367 | screen: '100vh',
368 | },
369 | minWidth: {
370 | '0': '0',
371 | full: '100%',
372 | },
373 | objectPosition: {
374 | bottom: 'bottom',
375 | center: 'center',
376 | left: 'left',
377 | 'left-bottom': 'left bottom',
378 | 'left-top': 'left top',
379 | right: 'right',
380 | 'right-bottom': 'right bottom',
381 | 'right-top': 'right top',
382 | top: 'top',
383 | },
384 | opacity: {
385 | '0': '0',
386 | '25': '0.25',
387 | '50': '0.5',
388 | '75': '0.75',
389 | '100': '1',
390 | },
391 | order: {
392 | first: '-9999',
393 | last: '9999',
394 | none: '0',
395 | '1': '1',
396 | '2': '2',
397 | '3': '3',
398 | '4': '4',
399 | '5': '5',
400 | '6': '6',
401 | '7': '7',
402 | '8': '8',
403 | '9': '9',
404 | '10': '10',
405 | '11': '11',
406 | '12': '12',
407 | },
408 | padding: theme => theme('spacing'),
409 | placeholderColor: theme => theme('colors'),
410 | placeholderOpacity: theme => theme('opacity'),
411 | space: (theme, { negative }) => ({
412 | ...theme('spacing'),
413 | ...negative(theme('spacing')),
414 | }),
415 | stroke: {
416 | current: 'currentColor',
417 | },
418 | strokeWidth: {
419 | '0': '0',
420 | '1': '1',
421 | '2': '2',
422 | },
423 | textColor: theme => theme('colors'),
424 | textOpacity: theme => theme('opacity'),
425 | width: theme => ({
426 | auto: 'auto',
427 | ...theme('spacing'),
428 | '1/2': '50%',
429 | '1/3': '33.333333%',
430 | '2/3': '66.666667%',
431 | '1/4': '25%',
432 | '2/4': '50%',
433 | '3/4': '75%',
434 | '1/5': '20%',
435 | '2/5': '40%',
436 | '3/5': '60%',
437 | '4/5': '80%',
438 | '1/6': '16.666667%',
439 | '2/6': '33.333333%',
440 | '3/6': '50%',
441 | '4/6': '66.666667%',
442 | '5/6': '83.333333%',
443 | '1/12': '8.333333%',
444 | '2/12': '16.666667%',
445 | '3/12': '25%',
446 | '4/12': '33.333333%',
447 | '5/12': '41.666667%',
448 | '6/12': '50%',
449 | '7/12': '58.333333%',
450 | '8/12': '66.666667%',
451 | '9/12': '75%',
452 | '10/12': '83.333333%',
453 | '11/12': '91.666667%',
454 | full: '100%',
455 | screen: '100vw',
456 | }),
457 | zIndex: {
458 | auto: 'auto',
459 | '0': '0',
460 | '10': '10',
461 | '20': '20',
462 | '30': '30',
463 | '40': '40',
464 | '50': '50',
465 | },
466 | gap: theme => theme('spacing'),
467 | gridTemplateColumns: {
468 | none: 'none',
469 | '1': 'repeat(1, minmax(0, 1fr))',
470 | '2': 'repeat(2, minmax(0, 1fr))',
471 | '3': 'repeat(3, minmax(0, 1fr))',
472 | '4': 'repeat(4, minmax(0, 1fr))',
473 | '5': 'repeat(5, minmax(0, 1fr))',
474 | '6': 'repeat(6, minmax(0, 1fr))',
475 | '7': 'repeat(7, minmax(0, 1fr))',
476 | '8': 'repeat(8, minmax(0, 1fr))',
477 | '9': 'repeat(9, minmax(0, 1fr))',
478 | '10': 'repeat(10, minmax(0, 1fr))',
479 | '11': 'repeat(11, minmax(0, 1fr))',
480 | '12': 'repeat(12, minmax(0, 1fr))',
481 | },
482 | gridColumn: {
483 | auto: 'auto',
484 | 'span-1': 'span 1 / span 1',
485 | 'span-2': 'span 2 / span 2',
486 | 'span-3': 'span 3 / span 3',
487 | 'span-4': 'span 4 / span 4',
488 | 'span-5': 'span 5 / span 5',
489 | 'span-6': 'span 6 / span 6',
490 | 'span-7': 'span 7 / span 7',
491 | 'span-8': 'span 8 / span 8',
492 | 'span-9': 'span 9 / span 9',
493 | 'span-10': 'span 10 / span 10',
494 | 'span-11': 'span 11 / span 11',
495 | 'span-12': 'span 12 / span 12',
496 | },
497 | gridColumnStart: {
498 | auto: 'auto',
499 | '1': '1',
500 | '2': '2',
501 | '3': '3',
502 | '4': '4',
503 | '5': '5',
504 | '6': '6',
505 | '7': '7',
506 | '8': '8',
507 | '9': '9',
508 | '10': '10',
509 | '11': '11',
510 | '12': '12',
511 | '13': '13',
512 | },
513 | gridColumnEnd: {
514 | auto: 'auto',
515 | '1': '1',
516 | '2': '2',
517 | '3': '3',
518 | '4': '4',
519 | '5': '5',
520 | '6': '6',
521 | '7': '7',
522 | '8': '8',
523 | '9': '9',
524 | '10': '10',
525 | '11': '11',
526 | '12': '12',
527 | '13': '13',
528 | },
529 | gridTemplateRows: {
530 | none: 'none',
531 | '1': 'repeat(1, minmax(0, 1fr))',
532 | '2': 'repeat(2, minmax(0, 1fr))',
533 | '3': 'repeat(3, minmax(0, 1fr))',
534 | '4': 'repeat(4, minmax(0, 1fr))',
535 | '5': 'repeat(5, minmax(0, 1fr))',
536 | '6': 'repeat(6, minmax(0, 1fr))',
537 | },
538 | gridRow: {
539 | auto: 'auto',
540 | 'span-1': 'span 1 / span 1',
541 | 'span-2': 'span 2 / span 2',
542 | 'span-3': 'span 3 / span 3',
543 | 'span-4': 'span 4 / span 4',
544 | 'span-5': 'span 5 / span 5',
545 | 'span-6': 'span 6 / span 6',
546 | },
547 | gridRowStart: {
548 | auto: 'auto',
549 | '1': '1',
550 | '2': '2',
551 | '3': '3',
552 | '4': '4',
553 | '5': '5',
554 | '6': '6',
555 | '7': '7',
556 | },
557 | gridRowEnd: {
558 | auto: 'auto',
559 | '1': '1',
560 | '2': '2',
561 | '3': '3',
562 | '4': '4',
563 | '5': '5',
564 | '6': '6',
565 | '7': '7',
566 | },
567 | transformOrigin: {
568 | center: 'center',
569 | top: 'top',
570 | 'top-right': 'top right',
571 | right: 'right',
572 | 'bottom-right': 'bottom right',
573 | bottom: 'bottom',
574 | 'bottom-left': 'bottom left',
575 | left: 'left',
576 | 'top-left': 'top left',
577 | },
578 | scale: {
579 | '0': '0',
580 | '50': '.5',
581 | '75': '.75',
582 | '90': '.9',
583 | '95': '.95',
584 | '100': '1',
585 | '105': '1.05',
586 | '110': '1.1',
587 | '125': '1.25',
588 | '150': '1.5',
589 | },
590 | rotate: {
591 | '-180': '-180deg',
592 | '-90': '-90deg',
593 | '-45': '-45deg',
594 | '0': '0',
595 | '45': '45deg',
596 | '90': '90deg',
597 | '180': '180deg',
598 | },
599 | translate: (theme, { negative }) => ({
600 | ...theme('spacing'),
601 | ...negative(theme('spacing')),
602 | '-full': '-100%',
603 | '-1/2': '-50%',
604 | '1/2': '50%',
605 | full: '100%',
606 | }),
607 | skew: {
608 | '-12': '-12deg',
609 | '-6': '-6deg',
610 | '-3': '-3deg',
611 | '0': '0',
612 | '3': '3deg',
613 | '6': '6deg',
614 | '12': '12deg',
615 | },
616 | transitionProperty: {
617 | none: 'none',
618 | all: 'all',
619 | default: 'background-color, border-color, color, fill, stroke, opacity, box-shadow, transform',
620 | colors: 'background-color, border-color, color, fill, stroke',
621 | opacity: 'opacity',
622 | shadow: 'box-shadow',
623 | transform: 'transform',
624 | },
625 | transitionTimingFunction: {
626 | linear: 'linear',
627 | in: 'cubic-bezier(0.4, 0, 1, 1)',
628 | out: 'cubic-bezier(0, 0, 0.2, 1)',
629 | 'in-out': 'cubic-bezier(0.4, 0, 0.2, 1)',
630 | },
631 | transitionDuration: {
632 | '75': '75ms',
633 | '100': '100ms',
634 | '150': '150ms',
635 | '200': '200ms',
636 | '300': '300ms',
637 | '500': '500ms',
638 | '700': '700ms',
639 | '1000': '1000ms',
640 | },
641 | transitionDelay: {
642 | '75': '75ms',
643 | '100': '100ms',
644 | '150': '150ms',
645 | '200': '200ms',
646 | '300': '300ms',
647 | '500': '500ms',
648 | '700': '700ms',
649 | '1000': '1000ms',
650 | },
651 | animation: {
652 | none: 'none',
653 | spin: 'spin 1s linear infinite',
654 | ping: 'ping 1s cubic-bezier(0, 0, 0.2, 1) infinite',
655 | pulse: 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
656 | bounce: 'bounce 1s infinite',
657 | },
658 | keyframes: {
659 | spin: {
660 | from: { transform: 'rotate(0deg)' },
661 | to: { transform: 'rotate(360deg)' },
662 | },
663 | ping: {
664 | '0%': { transform: 'scale(1)', opacity: '1' },
665 | '75%, 100%': { transform: 'scale(2)', opacity: '0' },
666 | },
667 | pulse: {
668 | '0%, 100%': { opacity: '1' },
669 | '50%': { opacity: '.5' },
670 | },
671 | bounce: {
672 | '0%, 100%': {
673 | transform: 'translateY(-25%)',
674 | animationTimingFunction: 'cubic-bezier(0.8,0,1,1)',
675 | },
676 | '50%': {
677 | transform: 'translateY(0)',
678 | animationTimingFunction: 'cubic-bezier(0,0,0.2,1)',
679 | },
680 | },
681 | },
682 | },
683 | variants: {
684 | accessibility: ['responsive', 'focus'],
685 | alignContent: ['responsive'],
686 | alignItems: ['responsive'],
687 | alignSelf: ['responsive'],
688 | appearance: ['responsive'],
689 | backgroundAttachment: ['responsive'],
690 | backgroundColor: ['responsive', 'hover', 'focus'],
691 | backgroundOpacity: ['responsive', 'hover', 'focus'],
692 | backgroundPosition: ['responsive'],
693 | backgroundRepeat: ['responsive'],
694 | backgroundSize: ['responsive'],
695 | borderCollapse: ['responsive'],
696 | borderColor: ['responsive', 'hover', 'focus'],
697 | borderOpacity: ['responsive', 'hover', 'focus'],
698 | borderRadius: ['responsive'],
699 | borderStyle: ['responsive'],
700 | borderWidth: ['responsive'],
701 | boxShadow: ['responsive', 'hover', 'focus'],
702 | boxSizing: ['responsive'],
703 | container: ['responsive'],
704 | cursor: ['responsive'],
705 | display: ['responsive'],
706 | divideColor: ['responsive'],
707 | divideOpacity: ['responsive'],
708 | divideWidth: ['responsive'],
709 | fill: ['responsive'],
710 | flex: ['responsive'],
711 | flexDirection: ['responsive'],
712 | flexGrow: ['responsive'],
713 | flexShrink: ['responsive'],
714 | flexWrap: ['responsive'],
715 | float: ['responsive'],
716 | clear: ['responsive'],
717 | fontFamily: ['responsive'],
718 | fontSize: ['responsive'],
719 | fontSmoothing: ['responsive'],
720 | fontStyle: ['responsive'],
721 | fontWeight: ['responsive', 'hover', 'focus'],
722 | height: ['responsive'],
723 | inset: ['responsive'],
724 | justifyContent: ['responsive'],
725 | letterSpacing: ['responsive'],
726 | lineHeight: ['responsive'],
727 | listStylePosition: ['responsive'],
728 | listStyleType: ['responsive'],
729 | margin: ['responsive'],
730 | maxHeight: ['responsive'],
731 | maxWidth: ['responsive'],
732 | minHeight: ['responsive'],
733 | minWidth: ['responsive'],
734 | objectFit: ['responsive'],
735 | objectPosition: ['responsive'],
736 | opacity: ['responsive', 'hover', 'focus'],
737 | order: ['responsive'],
738 | outline: ['responsive', 'focus'],
739 | overflow: ['responsive'],
740 | overscrollBehavior: ['responsive'],
741 | padding: ['responsive'],
742 | placeholderColor: ['responsive', 'focus'],
743 | placeholderOpacity: ['responsive', 'focus'],
744 | pointerEvents: ['responsive'],
745 | position: ['responsive'],
746 | resize: ['responsive'],
747 | space: ['responsive'],
748 | stroke: ['responsive'],
749 | strokeWidth: ['responsive'],
750 | tableLayout: ['responsive'],
751 | textAlign: ['responsive'],
752 | textColor: ['responsive', 'hover', 'focus'],
753 | textOpacity: ['responsive', 'hover', 'focus'],
754 | textDecoration: ['responsive', 'hover', 'focus'],
755 | textTransform: ['responsive'],
756 | userSelect: ['responsive'],
757 | verticalAlign: ['responsive'],
758 | visibility: ['responsive'],
759 | whitespace: ['responsive'],
760 | width: ['responsive'],
761 | wordBreak: ['responsive'],
762 | zIndex: ['responsive'],
763 | gap: ['responsive'],
764 | gridAutoFlow: ['responsive'],
765 | gridTemplateColumns: ['responsive'],
766 | gridColumn: ['responsive'],
767 | gridColumnStart: ['responsive'],
768 | gridColumnEnd: ['responsive'],
769 | gridTemplateRows: ['responsive'],
770 | gridRow: ['responsive'],
771 | gridRowStart: ['responsive'],
772 | gridRowEnd: ['responsive'],
773 | transform: ['responsive'],
774 | transformOrigin: ['responsive'],
775 | scale: ['responsive', 'hover', 'focus'],
776 | rotate: ['responsive', 'hover', 'focus'],
777 | translate: ['responsive', 'hover', 'focus'],
778 | skew: ['responsive', 'hover', 'focus'],
779 | transitionProperty: ['responsive'],
780 | transitionTimingFunction: ['responsive'],
781 | transitionDuration: ['responsive'],
782 | transitionDelay: ['responsive'],
783 | animation: ['responsive'],
784 | },
785 | corePlugins: {},
786 | plugins: [],
787 | }
788 |
--------------------------------------------------------------------------------