├── src ├── react-app-env.d.ts ├── index.tsx ├── components │ ├── Copyright.tsx │ ├── Footer.tsx │ ├── HeroImage.tsx │ ├── NavBar.tsx │ ├── Information.tsx │ ├── GenerateNavbarLinks.tsx │ ├── Quote.tsx │ ├── InformationImage.tsx │ ├── NavbarLogo.tsx │ ├── Contact.tsx │ ├── NavbarLinks.tsx │ ├── Hero.tsx │ └── GenerateInformationCards.tsx ├── index.css ├── App.tsx └── data.ts ├── public ├── favicon.ico ├── logo192.png ├── logo512.png ├── robots.txt ├── lighthouse.png ├── manifest.json └── index.html ├── postcss.config.js ├── tailwind.config.js ├── .gitignore ├── .github ├── dependabot.yml └── workflows │ └── automerge.yml ├── tsconfig.json ├── LICENSE ├── README.md └── package.json /src/react-app-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milliorn/landing-page/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milliorn/landing-page/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milliorn/landing-page/HEAD/public/logo512.png -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/lighthouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/milliorn/landing-page/HEAD/public/lighthouse.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ["./src/**/*.{js,jsx,ts,tsx}"], 3 | theme: { 4 | extend: {}, 5 | }, 6 | plugins: [], 7 | }; 8 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App"; 4 | import "./index.css"; 5 | 6 | const root = ReactDOM.createRoot( 7 | document.getElementById("root") as HTMLElement, 8 | ); 9 | 10 | root.render( 11 | 12 | 13 | , 14 | ); 15 | -------------------------------------------------------------------------------- /src/components/Copyright.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {{ owner: string }} props 3 | */ 4 | export function Copyright({ 5 | props, 6 | }: { 7 | props: { owner: string }; 8 | }): JSX.Element { 9 | return ( 10 |

11 | © {new Date().getFullYear()}{" "} 12 | {props.owner} 13 |

14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /.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 | .private 25 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | body { 6 | font-family: 7 | "Roboto", 8 | -apple-system, 9 | BlinkMacSystemFont, 10 | "Segoe UI", 11 | "Oxygen", 12 | "Ubuntu", 13 | "Cantarell", 14 | "Fira Sans", 15 | "Droid Sans", 16 | "Helvetica Neue", 17 | sans-serif; 18 | } 19 | 20 | .animate { 21 | animation: ease-in-out fadeIn 100s; 22 | } 23 | -------------------------------------------------------------------------------- /src/components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import { Copyright } from "./Copyright"; 2 | 3 | /** 4 | * @param {{ owner: string; }} props 5 | */ 6 | export function Footer(props: { owner: string }): JSX.Element { 7 | const url = "https://github.com/milliorn" as string; 8 | return ( 9 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/components/HeroImage.tsx: -------------------------------------------------------------------------------- 1 | /* create hero image */ 2 | export function HeroImage(): JSX.Element { 3 | return ( 4 | 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Dependabot configuration file 2 | # Docs: https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 3 | 4 | version: 2 5 | updates: 6 | - package-ecosystem: "github-actions" 7 | directory: "/" 8 | schedule: 9 | interval: "monthly" 10 | 11 | - package-ecosystem: "npm" 12 | directory: "/" 13 | schedule: 14 | interval: "monthly" 15 | ignore: 16 | - dependency-name: "*" 17 | update-types: 18 | - "version-update:semver-major" 19 | -------------------------------------------------------------------------------- /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/components/NavBar.tsx: -------------------------------------------------------------------------------- 1 | import { NavbarLinks } from "./NavbarLinks"; 2 | import { NavbarLogo } from "./NavbarLogo"; 3 | 4 | /** 5 | * @param {{ logo: string; linkFirst: string; linkMiddle: string; linkLast: string; }} props 6 | */ 7 | export function NavBar(props: { 8 | logo: string; 9 | linkFirst: string; 10 | linkMiddle: string; 11 | linkLast: string; 12 | }): JSX.Element { 13 | return ( 14 | 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /src/components/Information.tsx: -------------------------------------------------------------------------------- 1 | import { GenerateInformationCards } from "./GenerateInformationCards"; 2 | 3 | /** 4 | * @param {{ infoHeading: string; img: (string | undefined)[]; paragraph: (string | undefined)[]; }} props 5 | */ 6 | export function Information(props: { 7 | infoHeading: string; 8 | img: (string | undefined)[]; 9 | paragraph: (string | undefined)[]; 10 | }): JSX.Element { 11 | return ( 12 |
13 |

14 | {props.infoHeading} 15 |

16 | 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /src/components/GenerateNavbarLinks.tsx: -------------------------------------------------------------------------------- 1 | import uuid from "react-uuid"; 2 | /** 3 | * @param {{ href: string; linkText: string }} props 4 | */ 5 | export function GenerateNavbarLinks({ 6 | navbarLinksData, 7 | }: { 8 | navbarLinksData: { href: string; linkText: string }[]; 9 | }): JSX.Element[] { 10 | return navbarLinksData.map((link) => ( 11 |
  • 12 | 18 | {link.linkText} 19 | 20 |
  • 21 | )); 22 | } 23 | -------------------------------------------------------------------------------- /src/components/Quote.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {{ quote: string; author: string; }} props 3 | */ 4 | import { motion } from "framer-motion"; 5 | 6 | export function Quote(props: { quote: string; author: string }): JSX.Element { 7 | return ( 8 |
    9 | 15 | {props.quote} 16 | 17 |

    18 | - {props.author} 19 |

    20 |
    21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/components/InformationImage.tsx: -------------------------------------------------------------------------------- 1 | import { LazyLoadImage } from "react-lazy-load-image-component"; 2 | 3 | /** 4 | * @param {{ imgSrc: string | undefined; alt: string; pText: string | undefined; width: number height: number; }} 5 | */ 6 | export function InformationImage({ 7 | card, 8 | }: { 9 | card: { 10 | imgSrc: string | undefined; 11 | alt: string; 12 | pText: string | undefined; 13 | width: number; 14 | height: number; 15 | }; 16 | }): JSX.Element { 17 | return ( 18 |
    19 | 25 |
    26 | ); 27 | } 28 | -------------------------------------------------------------------------------- /src/components/NavbarLogo.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {{ logo: string; linkFirst: string; linkMiddle: string; linkLast: string; }} props 3 | */ 4 | export function NavbarLogo({ 5 | props, 6 | }: { 7 | props: { 8 | logo: string; 9 | linkFirst: string; 10 | linkMiddle: string; 11 | linkLast: string; 12 | }; 13 | }): JSX.Element { 14 | return ( 15 |
    16 | 22 | 23 | {props.logo} 24 | 25 | 26 |
    27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /src/components/Contact.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {{ h2: string; p: string; button: string; }} props 3 | */ 4 | export function Contact(props: { 5 | h2: string; 6 | p: string; 7 | button: string; 8 | }): JSX.Element { 9 | return ( 10 |
    11 |
    12 |

    {props.h2}

    13 |

    {props.p}

    14 | 20 |
    21 |
    22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /src/components/NavbarLinks.tsx: -------------------------------------------------------------------------------- 1 | import { GenerateNavbarLinks } from "./GenerateNavbarLinks"; 2 | 3 | /** 4 | * @param {{ logo: string; linkFirst: string; linkMiddle: string; linkLast: string; }} props 5 | */ 6 | export function NavbarLinks({ 7 | props, 8 | }: { 9 | props: { 10 | logo: string; 11 | linkFirst: string; 12 | linkMiddle: string; 13 | linkLast: string; 14 | }; 15 | }): JSX.Element { 16 | const navbarLinksData = [ 17 | { href: "/", linkText: props.linkFirst }, 18 | { href: "/", linkText: props.linkMiddle }, 19 | { href: "/", linkText: props.linkLast }, 20 | ]; 21 | 22 | return ( 23 |
    24 | 27 |
    28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "checkJs": true, 7 | "noImplicitReturns": true, 8 | "noImplicitThis": true, 9 | "noImplicitAny": true, 10 | "strictNullChecks": true, 11 | "sourceMap": true, 12 | "allowSyntheticDefaultImports": true, 13 | "allowUnreachableCode": false, 14 | "esModuleInterop": true, 15 | "forceConsistentCasingInFileNames": true, 16 | "isolatedModules": true, 17 | "jsx": "react-jsx", 18 | "module": "esnext", 19 | "moduleResolution": "node", 20 | "noEmit": true, 21 | "noFallthroughCasesInSwitch": true, 22 | "resolveJsonModule": true, 23 | "skipLibCheck": true, 24 | "strict": true, 25 | "noUnusedLocals": true, 26 | "noUnusedParameters": true 27 | }, 28 | "include": ["src"], 29 | "exclude": ["node_modules"] 30 | } 31 | -------------------------------------------------------------------------------- /src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Contact } from "./components/Contact"; 2 | import { Footer } from "./components/Footer"; 3 | import { Hero } from "./components/Hero"; 4 | import { Information } from "./components/Information"; 5 | import { NavBar } from "./components/NavBar"; 6 | import { Quote } from "./components/Quote"; 7 | import { heading, img, links, paragraphText, text } from "./data"; 8 | 9 | /* main app */ 10 | export default function App(): JSX.Element { 11 | return ( 12 |
    13 | 19 | 20 | 25 | 26 | 27 |
    28 |
    29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Scott Milliorn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/components/Hero.tsx: -------------------------------------------------------------------------------- 1 | import { HeroImage } from "./HeroImage"; 2 | 3 | /** 4 | * @param {{ hText: string; pText: string; bText: string; }} props 5 | */ 6 | export function Hero(props: { 7 | hText: string; 8 | pText: string; 9 | bText: string; 10 | }): JSX.Element { 11 | return ( 12 |
    13 | {/**/} 14 |
    15 |

    16 | {props.hText} 17 |

    18 |

    19 | {props.pText} 20 |

    21 | 27 |
    28 | {/**/} 29 |
    30 | {/**/} 31 | 32 |
    33 |
    34 | ); 35 | } 36 | -------------------------------------------------------------------------------- /src/components/GenerateInformationCards.tsx: -------------------------------------------------------------------------------- 1 | import uuid from "react-uuid"; 2 | import { InformationImage } from "./InformationImage"; 3 | 4 | /** 5 | * @param {{ infoHeading: string; img: (string | undefined)[]; paragraph: (string | undefined)[]; }} 6 | */ 7 | export function GenerateInformationCards({ 8 | props, 9 | }: { 10 | props: { 11 | infoHeading: string; 12 | img: (string | undefined)[]; 13 | paragraph: (string | undefined)[]; 14 | }; 15 | }): JSX.Element { 16 | const informationCardsData = [ 17 | { 18 | imgSrc: props.img[0], 19 | alt: "image1", 20 | pText: props.paragraph[0], 21 | width: 1470, 22 | height: 980, 23 | }, 24 | { 25 | imgSrc: props.img[1], 26 | alt: "image2", 27 | pText: props.paragraph[1], 28 | width: 935, 29 | height: 624, 30 | }, 31 | { 32 | imgSrc: props.img[2], 33 | alt: "image3", 34 | pText: props.paragraph[2], 35 | width: 935, 36 | height: 624, 37 | }, 38 | ]; 39 | 40 | return ( 41 |
    42 | {informationCardsData.map((card) => ( 43 |
    44 | 45 |

    {card.pText}

    46 |
    47 | ))} 48 |
    49 | ); 50 | } 51 | -------------------------------------------------------------------------------- /.github/workflows/automerge.yml: -------------------------------------------------------------------------------- 1 | name: Dependabot reviewer 2 | 3 | on: pull_request_target 4 | 5 | permissions: 6 | pull-requests: write 7 | contents: write 8 | 9 | jobs: 10 | review-dependabot-pr: 11 | runs-on: ubuntu-latest 12 | if: ${{ github.event.pull_request.user.login == 'dependabot[bot]' }} 13 | steps: 14 | - name: Dependabot metadata 15 | id: dependabot-metadata 16 | uses: dependabot/fetch-metadata@v2.4.0 17 | 18 | - name: Approve and auto-merge minor and patch updates 19 | if: ${{ steps.dependabot-metadata.outputs.update-type == 'version-update:semver-patch' || steps.dependabot-metadata.outputs.update-type == 'version-update:semver-minor' }} 20 | run: | 21 | gh pr review "$PR_URL" --approve -b "✅ Auto-approved: This pull request includes a **patch** or **minor** update." 22 | gh pr merge "$PR_URL" --squash --auto 23 | env: 24 | PR_URL: ${{ github.event.pull_request.html_url }} 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 26 | 27 | - name: Deny major updates 28 | if: ${{ steps.dependabot-metadata.outputs.update-type == 'version-update:semver-major' }} 29 | run: | 30 | gh pr review "$PR_URL" --request-changes -b "🚫 Denied: This PR includes a **major update**, which is not allowed." 31 | gh pr close "$PR_URL" 32 | env: 33 | PR_URL: ${{ github.event.pull_request.html_url }} 34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 35 | -------------------------------------------------------------------------------- /src/data.ts: -------------------------------------------------------------------------------- 1 | const paragraphText = [ 2 | "Lorem ipsum dolor sit amet consectetur adipisicing elit. Suscipit eos ea nostrum, quas molestias autem veniam natus deserunt et obcaecati commodi eveniet illum aliquid quo, voluptate est ipsum idperferendis?", 3 | "Lorem ipsum dolor sit amet consectetur adipisicing. Culpa, soluta molestiae nihil nam, at ea dolore debitis maxime aliquam adipisci, illum amet pariatur corrupti ipsam delectus repellat quod repudiandae minus?", 4 | "Lorem ipsum dolor sit amet consectetur. Tempora, nihil quo. Aliquam excepturi quaerat exercitationem reprehenderit, maxime saepe! Nostrum repudiandae, amet culpa iusto recusandae aliquid. Dolor iure saepe nobis fugit.", 5 | "Lorem ipsum dolor sit amet, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", 6 | "Sign up for more lorem ipsum", 7 | ]; 8 | 9 | const links = ["link 1", "link 2", "link 3"] as const; 10 | 11 | const heading = [ 12 | "react tailwind", 13 | "information heading", 14 | "join us! lorem ipsum", 15 | ] as const; 16 | 17 | const text = [ 18 | "sign up", 19 | "Nihil et nobis aperiam natus quod quos quisquam quasi earum possimus amet obcaecati excepturi, ratione reprehenderit! Rem, in!", 20 | "anonymous", 21 | "header logo", 22 | "Scott Milliorn", 23 | ] as const; 24 | 25 | const img = [ 26 | "https://images.unsplash.com/photo-1633356122102-3fe601e05bd2?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80", 27 | "https://images.unsplash.com/photo-1581276879432-15e50529f34b?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80", 28 | "https://images.unsplash.com/photo-1569748130764-3fed0c102c59?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1470&q=80", 29 | ]; 30 | 31 | export { paragraphText, links, heading, text, img }; 32 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | Landing Page 28 | 29 | 30 | 31 |
    32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Landing Page 2 | 3 | [![CodeQL](https://github.com/milliorn/Landing-Page/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/milliorn/Landing-Page/actions/workflows/github-code-scanning/codeql) 4 | [![pages-build-deployment](https://github.com/milliorn/Landing-Page/actions/workflows/pages/pages-build-deployment/badge.svg)](https://github.com/milliorn/Landing-Page/actions/workflows/pages/pages-build-deployment) 5 | 6 | This repository contains a template landing page site built using React and Tailwind CSS. It provides a starting point for creating beautiful and responsive landing pages. 7 | 8 | ## Getting Started 9 | 10 | To get started with the project, follow these steps: 11 | 12 | 1. Clone the repository 13 | 2. Install the dependencies: `npm install` 14 | 3. Start the development server: `npm start` 15 | 16 | The above command will run the app in development mode. Open [http://localhost:3000](http://localhost:3000) to view it in your browser. The page will automatically reload when you make changes. 17 | 18 | ## Building for Production 19 | 20 | To build the app for production, use the following command `npm run build` 21 | 22 | This command will create a production-ready build of the app in the `build` folder. The build is optimized for performance and the filenames include hashes for cache busting. 23 | 24 | ## Deployment 25 | 26 | To deploy the app, you can use the following command `npm run deploy` 27 | 28 | This command will deploy the app to the GitHub Pages. You can customize the deployment configuration in the `package.json` file. 29 | 30 | ## Learn More 31 | 32 | To learn more about React, check out the [React documentation](https://reactjs.org/). 33 | 34 | To learn more about Tailwind CSS, check out the [Tailwind CSS documentation](https://tailwindcss.com/). 35 | 36 | ## License 37 | 38 | This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. 39 | 40 | ## Preview 41 | 42 | ![Landing Page](public/lighthouse.png) 43 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "landing-page", 3 | "version": "0.1.0", 4 | "description": "Template landing page site using React with Tailwind", 5 | "keywords": [ 6 | "css", 7 | "html", 8 | "javascript", 9 | "js", 10 | "landing page", 11 | "react", 12 | "tailwind" 13 | ], 14 | "homepage": "http://milliorn.github.io/landing-page", 15 | "bugs": { 16 | "email": "scottmilliorn@gmail.com", 17 | "url": "https://github.com/milliorn/landing-page/issues" 18 | }, 19 | "license": "MIT", 20 | "author": { 21 | "email": "scottmilliorn@gmail.com", 22 | "name": "Scott Milliorn", 23 | "url": "https://github.com/milliorn" 24 | }, 25 | "repository": { 26 | "repository": { 27 | "type": "git", 28 | "url": "https://github.com/milliorn/landing-page.git" 29 | } 30 | }, 31 | "private": true, 32 | "dependencies": { 33 | "framer-motion": "^12.23.24", 34 | "react": "18.3.1", 35 | "react-dom": "18.3.1", 36 | "react-lazy-load-image-component": "^1.6.3", 37 | "react-scripts": "5.0.1", 38 | "react-uuid": "^2.0.0" 39 | }, 40 | "scripts": { 41 | "build": "react-scripts build", 42 | "deploy": "gh-pages -d build", 43 | "eject": "react-scripts eject", 44 | "predeploy": "npm run build", 45 | "start": "react-scripts start" 46 | }, 47 | "eslintConfig": { 48 | "extends": [ 49 | "react-app" 50 | ] 51 | }, 52 | "browserslist": { 53 | "production": [ 54 | ">0.2%", 55 | "not dead", 56 | "not op_mini all" 57 | ], 58 | "development": [ 59 | "last 1 chrome version", 60 | "last 1 firefox version", 61 | "last 1 safari version" 62 | ] 63 | }, 64 | "devDependencies": { 65 | "@types/node": "^20.19.24", 66 | "@types/react": "^18.2.34", 67 | "@types/react-dom": "^18.2.17", 68 | "@types/react-lazy-load-image-component": "^1.6.4", 69 | "autoprefixer": "10.4.22", 70 | "gh-pages": "6.3.0", 71 | "postcss": "8.5.6", 72 | "tailwindcss": "3.4.18", 73 | "typescript": "^4.9.5" 74 | } 75 | } 76 | --------------------------------------------------------------------------------