diff --git a/README.md b/README.md index e8afdff..9718b99 100644 --- a/README.md +++ b/README.md @@ -1,328 +1,115 @@ - -### Next.js Enterprise Boilerplate - -
- - [![GitHub Actions Workflow Status][check-workflow-badge]][check-workflow-badge-link] [![GitHub License][github-license-badge]][github-license-badge-link] [![GitHub contributors][github-contributors-badge]][github-contributors-badge-link] [![Discord][discord-badge]][discord-badge-link] [![Blazity][made-by-blazity-badge]][made-by-blazity-badge-link] - -Welcome to the _Next.js Enterprise Boilerplate_, an open-source template for enterprise projects! It's loaded with features that'll help you build a high-performance, maintainable, and enjoyable app. We've done all the heavy lifting for you, so sit back, relax, and get ready to conquer the world with your incredible app! 🌍 - -> [!NOTE] -> **Blazity** is a group of Next.js/Headless experts. Contact us at [contact@blazity.com](https://blazity.com) if you’d like to talk about your project or just to have a chat with us - -### Integrated features - -With this template you will get all the awesomeness you need: - -- 🏎️ **[Next.js 15](https://nextjs.org/)** - Fast by default, with config optimized for performance (with **App Directory**) -- 💅 **[Tailwind CSS](https://tailwindcss.com/)** - A utility-first CSS framework for rapid UI development -- ✨ **[ESlint](https://eslint.org/)** and **[Prettier](https://prettier.io/)** - For clean, consistent, and error-free code -- 🛠️ **[Extremely strict TypeScript](https://www.typescriptlang.org/)** - With [`ts-reset`](https://github.com/total-typescript/ts-reset) library for ultimate type safety -- 🚀 **[GitHub Actions](https://github.com/features/actions)** - Pre-configured actions for smooth workflows, including Bundle Size and performance stats -- 💯 **Perfect Lighthouse score** - Because performance matters -- **[Bundle analyzer plugin](https://www.npmjs.com/package/@next/bundle-analyzer)** - Keep an eye on your bundle size -- **[Jest](https://jestjs.io/)** and **[React Testing Library](https://testing-library.com/react)** - For rock-solid unit and integration tests -- **[Playwright](https://playwright.dev/)** - Write end-to-end tests like a pro -- **[Storybook](https://storybook.js.org/)** - Create, test, and showcase your components -- **Smoke Testing** and **Acceptance Tests** - For confidence in your deployments -- **[Conventional commits git hook](https://www.conventionalcommits.org/)** - Keep your commit history neat and tidy -- **[Observability](https://opentelemetry.io/)** - Open Telemetry integration for seamless monitoring -- **[Absolute imports](https://nextjs.org/docs/advanced-features/module-path-aliases)** - No more spaghetti imports -- **[Health checks](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)** - Kubernetes-compatible for robust deployments -- **[Radix UI](https://www.radix-ui.com/)** - Headless UI components for endless customization -- **[CVA](http://cva.style/)** - Create a consistent, reusable, and atomic design system -- **[Renovate BOT](https://www.whitesourcesoftware.com/free-developer-tools/renovate)** - Auto-updating dependencies, so you can focus on coding -- **[Patch-package](https://www.npmjs.com/package/patch-package)** - Fix external dependencies without losing your mind -- **Components coupling and cohesion graph** - A tool for managing component relationships -- **[Semantic Release](https://github.com/semantic-release/semantic-release)** - for automatic changelog -- **[T3 Env](https://env.t3.gg/)** - Manage your environment variables with ease - -### More features - -**nefi** (next-enterprise feature integrations) is an AI agent that will help configuring the boilerplate to your needs using natural language. It can remove/install dependencies, modify files, manage git and integrate various solutions into your project. - -Simply set up the boilerplate, follow guide [in the getting started section](#getting-started) and type `npx nefi` in your terminal! - -Here's an example video of [nefi](https://nefi.ai/) integrating [Clerk](https://clerk.com/) auth solutions with one command, no API keys and no manual configuration needed! - - -https://github.com/user-attachments/assets/5c13a110-7389-4859-909f-60a7f623e47d - - -Leave a ⭐ for [nefi on GitHub](https://github.com/blazity/nefi) and check out the [nefi.ai docs](https://nefi.ai/)! - -## Table of Contents - -- [Next.js Enterprise Boilerplate](#nextjs-enterprise-boilerplate) - - [Features](#features) - - [Table of Contents](#table-of-contents) - - [Getting Started](#-getting-started) - - [Deployment](#-deployment) - - [Scripts Overview](#-scripts-overview) - - [Coupling Graph](#-coupling-graph) - - [Testing](#-testing) - - [Running Tests](#running-tests) - - [Acceptance Tests](#acceptance-tests) - - [Smoke Testing](#smoke-testing) - - [Styling and Design System](#-styling-and-design-system) - - [CVA - A New Approach to Variants](#cva---a-new-approach-to-variants) - - [State Management](#-state-management) - - [Zustand](#zustand) - - [Jotai](#jotai) - - [Recoil](#recoil) - - [Environment Variables handling](#-environment-variables-handling) - - [Contribution](#-contribution) - - [Support](#support) - - [License](#-license) - - [Contributors](#contributors) - -## 🎯 Getting Started - -To get started with this boilerplate, follow these steps: - -1. Fork & clone repository: - -```bash -## Don't forget to ⭐ star and fork it first :) -git clone https://github.com//next-enterprise.git -``` - -2. Install the dependencies: - -```bash -pnpm install --frozen-lockfile -``` - -3. Run the development server: - -```bash -pnpm run dev -``` - -4. Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -5. This project uses a git hook to enforce [conventional commits](https://github.com/qoomon/git-conventional-commits). To install the git hook, run the following command in the root directory of the project: - -```sh -brew install pre-commit -pre-commit install -t commit-msg -``` - -## 🚀 Deployment - -Easily deploy your Next.js app with [Vercel](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=github&utm_campaign=next-enterprise) by clicking the button below: - -[![Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/Blazity/next-enterprise) - -## 📃 Scripts Overview - -The following scripts are available in the `package.json`: - -- `dev`: Starts the development server with colorized output -- `build`: Builds the app for production -- `start`: Starts the production server -- `lint`: Lints the code using ESLint -- `lint:fix`: Automatically fixes linting errors -- `prettier`: Checks the code for proper formatting -- `prettier:fix`: Automatically fixes formatting issues -- `analyze`: Analyzes the bundle sizes for Client, Server and Edge environments -- `storybook`: Starts the Storybook server -- `build-storybook`: Builds the Storybook for deployment -- `test`: Runs unit and integration tests -- `e2e:headless`: Runs end-to-end tests in headless mode -- `e2e:ui`: Runs end-to-end tests with UI -- `format`: Formats the code with Prettier -- `postinstall`: Applies patches to external dependencies -- `coupling-graph`: **Generates a coupling and cohesion graph for the components** - -## 🔗 Coupling Graph - -The `coupling-graph` script is a useful tool that helps visualize the coupling and connections between your project's internal modules. It's built using the [Madge](https://github.com/pahen/madge) library. To generate the graph, simply run the following command: - -```bash -pnpm run coupling-graph -``` - -This will create a `graph.svg` file, which contains a graphical representation of the connections between your components. You can open the file with any SVG-compatible viewer. - -![graph](https://user-images.githubusercontent.com/28964599/233662744-3ba89713-8466-49cd-9be7-e6fb38191f58.png) - -## 🧪 Testing - -This boilerplate comes with various testing setups to ensure your application's reliability and robustness. - -### Running Tests - -- **Unit and integration tests**: Run Jest tests using `pnpm run test` -- **End-to-end tests (headless mode)**: Run Playwright tests in headless mode with `pnpm run e2e:headless` -- **End-to-end tests (UI mode)**: Run Playwright tests with UI using `pnpm run e2e:ui` - -image - -### Acceptance Tests - -To write acceptance tests, we leverage Storybook's [`play` function](https://storybook.js.org/docs/react/writing-stories/play-function#writing-stories-with-the-play-function). This allows you to interact with your components and test various user flows within Storybook. - -```ts -/* - * See https://storybook.js.org/docs/react/writing-stories/play-function#working-with-the-canvas - * to learn more about using the canvasElement to query the DOM - */ -export const FilledForm: Story = { - play: async ({ canvasElement }) => { - const canvas = within(canvasElement) - - const emailInput = canvas.getByLabelText("email", { - selector: "input", - }) - - await userEvent.type(emailInput, "example-email@email.com", { - delay: 100, - }) - - const passwordInput = canvas.getByLabelText("password", { - selector: "input", - }) - - await userEvent.type(passwordInput, "ExamplePassword", { - delay: 100, - }) - // See https://storybook.js.org/docs/react/essentials/actions#automatically-matching-args to learn how to setup logging in the Actions panel - const submitButton = canvas.getByRole("button") - - await userEvent.click(submitButton) - }, -} -``` - -### Smoke Testing - -In this boilerplate, we use Storybook's out-of-the-box support for smoke testing to verify that components render correctly without any errors. Just run `pnpm run test-storybook` to perform smoke testing. Remember to write stories in JSX or TSX format only. Smoke testing and a lot of other functionalities dont work well with MDX stories. - -## 🎨 Styling and Design System - -This boilerplate uses Tailwind CSS for styling and CVA for creating a powerful, easy-to-use design system. If you want to learn more about the setup, check out this fantastic video by Vercel: - -[![Styling and Design System](https://img.youtube.com/vi/T-Zv73yZ_QI/0.jpg)](https://www.youtube.com/watch?v=T-Zv73yZ_QI&ab_channel=Vercel) - -### CVA - A New Approach to Variants - -While CSS-in-TS libraries such as [Stitches](https://stitches.dev/) and [Vanilla Extract](https://vanilla-extract.style/) are great for building type-safe UI components, they might not be the perfect fit for everyone. You may prefer more control over your stylesheets, need to use a framework like Tailwind CSS, or simply enjoy writing your own CSS. - -Creating variants using traditional CSS can be a tedious task, requiring you to manually match classes to props and add types. CVA is here to take that pain away, allowing you to focus on the enjoyable aspects of UI development. By providing an easy and type-safe way to create variants, CVA simplifies the process and helps you create powerful design systems without compromising on the flexibility and control of CSS. - -## 💾 State Management - -While this boilerplate doesn't include a specific state management library, we believe it's essential for you to choose the one that best suits your project's needs. Here are some libraries we recommend for state management: - -### Zustand - -[Zustand](https://github.com/pmndrs/zustand) is a small, fast, and scalable state management library. It's designed to be simple and intuitive, making it a great choice for small to medium-sized projects. It's also optimized for bundle size, ensuring minimal impact on your app's performance. - -### Jotai - -[Jotai](https://github.com/pmndrs/jotai) is an atom-based state management library for React that focuses on providing a minimal and straightforward API. Its atom-based approach allows you to manage your state in a granular way while still being highly optimized for bundle size. - -### Recoil - -[Recoil](https://recoiljs.org/) is a state management library developed by Facebook, specifically designed for React applications. By utilizing atoms and selectors, Recoil allows you to efficiently manage state and derived state. Its key benefit is the ability to update components only when the state they're subscribed to changes, reducing unnecessary re-renders and keeping your application fast and efficient. Recoil also offers great developer experience with built-in debugging tools. - -Choose the library that best fits your requirements and project structure to ensure an efficient state management solution for your application. - -## 💻 Environment Variables handling - -[T3 Env](https://env.t3.gg/) is a library that provides environmental variables checking at build time, type validation and transforming. It ensures that your application is using the correct environment variables and their values are of the expected type. You’ll never again struggle with runtime errors caused by incorrect environment variable usage. - -Config file is located at `env.mjs`. Simply set your client and server variables and import `env` from any file in your project. - -```ts -export const env = createEnv({ - server: { - // Server variables - SECRET_KEY: z.string(), - }, - client: { - // Client variables - API_URL: z.string().url(), - }, - runtimeEnv: { - // Assign runtime variables - SECRET_KEY: process.env.SECRET_KEY, - API_URL: process.env.NEXT_PUBLIC_API_URL, - }, -}) -``` - -If the required environment variables are not set, you'll get an error message: - -```sh - ❌ Invalid environment variables: { SECRET_KEY: [ 'Required' ] } -``` - -## 🤝 Contribution - -Contributions are always welcome! To contribute, please follow these steps: - -1. Fork the repository. -2. Create a new branch with a descriptive name. -3. Make your changes, and commit them using the [Conventional Commits](https://www.conventionalcommits.org/) format. -4. Push your changes to the forked repository. -5. Create a pull request, and we'll review your changes. - -## Support - -If you're looking for help or simply want to share your thoughts about the project, we encourage you to join our Discord community. Here's the link: [https://blazity.com/discord](https://blazity.com/discord). It's a space where we exchange ideas and help one another. Everyone's input is appreciated, and we look forward to welcoming you. - -
- - Blazity Discord Banner - -
- - -## 📜 License - -This project is licensed under the MIT License. For more information, see the [LICENSE](./LICENSE) file. - -## Contributors - - - - - - - - - - - - - - - - - -
Bart Stefanski
Bart Stefanski

💻
Jakub Jabłoński
Jakub Jabłoński

🚇
Igor Klepacki
Igor Klepacki

📖
- - Add your contributions - -
- - - - - - - - -[check-workflow-badge]: https://img.shields.io/github/actions/workflow/status/blazity/next-enterprise/check.yml?label=check -[github-license-badge]: https://img.shields.io/github/license/blazity/next-enterprise?link=https%3A%2F%2Fgithub.com%2FBlazity%2Fnext-enterprise%2Fblob%2Fmain%2FLICENSE -[github-contributors-badge]: https://img.shields.io/github/contributors/blazity/next-enterprise?link=https%3A%2F%2Fgithub.com%2FBlazity%2Fnext-enterprise%2Fgraphs%2Fcontributors -[discord-badge]: https://img.shields.io/discord/1111676875782234175?color=7b8dcd&link=https%3A%2F%2Fblazity.com%2Fdiscord -[made-by-blazity-badge]: https://img.shields.io/badge/made_by-Blazity-blue?color=FF782B&link=https://blazity.com/ - -[check-workflow-badge-link]: https://github.com/Blazity/next-enterprise/actions/workflows/check.yml -[github-license-badge-link]: https://github.com/Blazity/next-enterprise/blob/main/LICENSE -[github-contributors-badge-link]: https://github.com/Blazity/next-enterprise/graphs/contributors -[discord-badge-link]: https://blazity.com/discord -[made-by-blazity-badge-link]: https://blazity.com/?utm_source=nextenterprise&utm_medium=github +1. โครงสร้างไฟล์หลักและการจัดเก็บรูปภาพ + 1.1โฟลเดอร์ app/: +เป็นโครงสร้างพื้นฐานของ Next.js 15 +มีไฟล์หลักเช่น layout.tsx, page.tsx, และโฟลเดอร์ย่อยต่าง ๆ + 1.2โฟลเดอร์ app/assets/: +เก็บไฟล์รูปภาพทั้งหมด เช่น image.png, image2.png, image3.png, ฯลฯ +แนะนำให้ย้ายไปไว้ใน /public/assets/ เพื่อให้ Next.js สามารถเรียกใช้งานได้สะดวก (ถ้าเป็นการแสดงรูป Static) + 1.3โฟลเดอร์ components/: +เก็บคอมโพเนนต์ย่อย ๆ ของโปรเจกต์ เช่น Navbar.tsx, HeroSection.tsx, หรืออื่น ๆ +ในตัวอย่าง เรารวมโค้ดทั้งหมดไว้ในคอมโพเนนต์เดียว (เช่น page.tsx) แต่ในงานจริงอาจแยกแต่ละ Section ออกเป็นไฟล์คอมโพเนนต์ต่างหากเพื่อให้ง่ายต่อการดูแล + +2. ขั้นตอนการติดตั้งและรันโปรเจกต์ + 2.1ติดตั้ง Dependencies +ใช้คำสั่ง npm install หรือ yarn เพื่อให้ได้ package ของ Next.js, React, และ Tailwind CSS + 2.2ตั้งค่า Tailwind CSS +เปิดไฟล์ tailwind.config.js (หรือ .ts) แล้วกำหนด content ให้ครอบคลุมทุกไฟล์ที่มีการใช้งาน Tailwind เช่น +content: [ + "./app/**/*.{js,ts,jsx,tsx}", + "./components/**/*.{js,ts,jsx,tsx}", + ... +] + 2.3รันโปรเจกต์ +ใช้คำสั่ง npm run dev หรือ yarn dev +เปิดเบราว์เซอร์ที่ http://localhost:3000 เพื่อดูหน้าเว็บ + +3. สรุปการทำงานของแต่ละส่วน +โค้ดหลักแบ่งออกเป็นหลาย Section ตามโครงสร้างเว็บ ดังนี้: + + 3.1Top Announcement Bar +แถบสีเขียวเข้มด้านบน (เช่น #0e3a24) +มีข้อความประกาศ เช่น "SupportNinja is hiring! …" พร้อมลิงก์สมัครงาน + + 3.2Navbar (Sticky) + Dropdown & Hamburger +ติดด้านบน (sticky top-0) +มีโลโก้ซ้ายมือ, เมนูขวามือ (Desktop), ปุ่ม Get Started +Dropdown Menu: เมื่อ Hover เมนูอย่าง Solutions, Industries, About จะมีเมนูย่อยแสดงขึ้นมา (ใช้ useState แยกแต่ละเมนู) +Hamburger Menu (Mobile): เมื่อจอเล็ก (< md) จะแทนที่เมนูด้วยปุ่ม Hamburger (เปิด/ปิดเมนูด้วย isMobileMenuOpen) +ภายในเมนู Mobile มีปุ่ม Get Started อีกอันด้านล่าง + + 3.3Hero Section +พื้นหลังสีครีม (เช่น #f7e1d2) +ข้อความสั้น ๆ และหัวข้อใหญ่ เช่น "Outsourcing worth talking about" +มีเส้น
คั่น + + 3.4Outsourcing Options Section (Checkbox Grid) +ยังใช้พื้นหลังสีครีม (#f7e1d2) +หัวข้อ "Which outsourcing solutions are you looking for?" +มี Grid 6 ช่อง แต่ละช่องมีรูป (เช่น image2.png), ชื่อบริการ, และ Checkbox ที่มุมขวาบน +เมื่อคลิกช่องใด จะสลับสถานะ Checkbox และเปลี่ยนพื้นหลังของช่อง (ใช้ useState ชื่อ selected) +ด้านล่างมีปุ่ม Get Started สีแดง + +3.5Section เพิ่มเติม (1 → 6) +แต่ละ Section มีดีไซน์แตกต่างกัน เช่น พื้นหลังสีต่าง ๆ, รูปซ้าย-ข้อความขวา หรือข้อความซ้าย-รูปขวา +Section 1: ใส่ Container สีเทา (#bfc1b9) ข้างใน พร้อมรูป midjourney.png +Section 2, 3, 4, 5: จัดเป็น 2 คอลัมน์ หรือ Grid 3 คอลัมน์ (เช่นบริการต่าง ๆ) +Section 6: "We’re better together. Start building your dream team." พร้อมรูป image8.png ทางขวา, ปุ่ม Get Started สีแดง + +3.6Footer +พื้นหลังสีเทาอ่อน (#bfc1b9) +มีโลโก้, คอลัมน์เมนูต่าง ๆ (Solutions, Industries, Resources, Follow, Company) +ปุ่ม Get started สีแดงอยู่ด้านขวา +ด้านล่างมีข้อความลิขสิทธิ์และลิงก์ (Privacy Policy, Security Policy, Terms of Use) +ออกแบบให้ Responsive เมื่อจอเล็กจะเรียงกันเป็นคอลัมน์ + +4. การใช้ State และฟังก์ชันต่าง ๆ + 4.1State สำหรับ Dropdown +isSolutionsOpen, isIndustriesOpen, isAboutOpen: ควบคุมการเปิด/ปิดเมนูย่อยใน Desktop +ทำงานด้วยการ onMouseEnter → setState(true), onMouseLeave → setState(false) +State สำหรับ Mobile Menu + + 4.2isMobileMenuOpen: เมื่อคลิกปุ่ม Hamburger จะสลับ true/false +ถ้า true จะแสดงเมนูในรูปแบบลิสต์ลงมา + + 4.3State สำหรับ Checkbox Grid +selected: string[]: เก็บ ID ของ Option ที่ถูกเลือก +ฟังก์ชัน toggleSelection(id: string): เช็คว่า ID นั้นอยู่ใน selected ไหม → ถ้ามีก็ถอดออก, ถ้าไม่มีให้เพิ่มเข้า + + 4.4โครงสร้างเมนู +ใน Desktop, เมนูหลักจะซ่อนบนจอเล็ก (ใช้ md:flex / hidden) +ใน Mobile, เมนูหลักจะแสดงเมื่อ isMobileMenuOpen === true + +5. เคล็ดลับการปรับแต่ง + 5.1เปลี่ยนสี / ข้อความ: +ใน Class Tailwind เช่น bg-[#0e3a24], text-[#f7e1d2], สามารถเปลี่ยนเป็นโทนสีอื่น ๆ ได้ +ข้อความต่าง ๆ เช่น H1, H2, หรือ Paragraph แก้ได้ตามต้องการ + + 5.2เปลี่ยนรูปภาพ: +ตรวจสอบว่ารูปอยู่ใน /public/assets/ แล้วเรียกใช้ด้วยเส้นทาง /assets/xxxx.png +ขนาดรูป (width, height) สามารถปรับตามดีไซน์ + + 5.3Responsive เพิ่มเติม: +Tailwind มี breakpoint sm:, md:, lg:, xl: ถ้าต้องการจัด layout หรือขนาดตัวอักษรเฉพาะจอใหญ่/เล็ก + + 5.4แยกเป็นคอมโพเนนต์: +ถ้าไฟล์ Navbar.tsx ใหญ่มาก สามารถแยกแต่ละ Section ไปเป็นไฟล์คอมโพเนนต์ย่อย แล้ว import มาใช้เพื่อความเป็นระเบียบ + +5.5Production Build: +เมื่อพร้อม Deploy, ให้ใช้คำสั่ง npm run build หรือ yarn build +จากนั้น npm run start หรือ yarn start เพื่อรัน Production Mode + +6. วิธีนำไปใช้งานจริง + 6.1คัดลอกโค้ด นี้ไปใส่ในไฟล์คอมโพเนนต์ เช่น page.tsx (หรือชื่อไฟล์ที่ต้องการ) + 6.2รัน npm run dev + 6.3เปิด http://localhost:3000 +ดูว่า Navbar, Hero, Sections และ Footer แสดงผลครบถ้วนหรือไม่ + +7. สรุป +1.โค้ดนี้เป็นตัวอย่างหน้าเว็บ Next.js 15 + Tailwind CSS ที่มีฟีเจอร์หลัก: +-Navbar Sticky พร้อม Dropdown (Desktop) และ Hamburger (Mobile) +-Hero Section สีครีม +-Grid Checkbox เลือกบริการต่าง ๆ +-Sections หลายส่วน (ใส่รูป + ข้อความ) +-Footer ที่แบ่งคอลัมน์ลิงก์ และมีปุ่ม Get Started สีแดง + +###ขอบคุณครับ :) \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index ffa4003..e74de50 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,66 +1,765 @@ -import { Metadata } from "next" -import { Button } from "components/Button/Button" +"use client"; // ใช้ useState และ useEffect ใน Next.js 15 -import { LP_GRID_ITEMS } from "lp-items" +import Image from "next/image"; +import Link from "next/link"; +import { useState } from "react"; -export const metadata: Metadata = { - title: "Next.js Enterprise Boilerplate", - twitter: { - card: "summary_large_image", - }, - openGraph: { - url: "https://next-enterprise.vercel.app/", - images: [ - { - width: 1200, - height: 630, - url: "https://raw.githubusercontent.com/Blazity/next-enterprise/main/.github/assets/project-logo.png", - }, - ], - }, -} +export default function Navbar() { + // Dropdown State (Desktop) + const [isSolutionsOpen, setSolutionsOpen] = useState(false); + const [isIndustriesOpen, setIndustriesOpen] = useState(false); + const [isAboutOpen, setAboutOpen] = useState(false); + + // Mobile Menu State + const [isMobileMenuOpen, setMobileMenuOpen] = useState(false); + + // Checkbox Grid State + const [selected, setSelected] = useState([]); + const options = [ + { id: "customer-experience", label: "Customer Experience", img: "/assets/image2.png" }, + { id: "customer-support", label: "Customer Support", img: "/assets/image2.png" }, + { id: "technical-support", label: "Technical Customer Support", img: "/assets/image2.png" }, + { id: "content-moderation", label: "Content Moderation", img: "/assets/image2.png" }, + { id: "data-processing", label: "Data Processing", img: "/assets/image2.png" }, + { id: "finance-accounting", label: "Finance & Accounting", img: "/assets/image2.png" }, + ]; + + // Toggle Checkbox selection + const toggleSelection = (id: string) => { + setSelected((prev) => + prev.includes(id) ? prev.filter((item) => item !== id) : [...prev, id] + ); + }; -export default function Web() { return ( - <> -
-
-
-

- Next.js Enterprise Boilerplate -

-

- Jumpstart your enterprise project with our feature-packed, high-performance Next.js boilerplate! - Experience rapid UI development, AI-powered code reviews, and an extensive suite of tools for a smooth and - enjoyable development process. -

- - -
+
+ {/* Top Announcement Bar */} +
+ SupportNinja is hiring! Apply through our Jobs Board.{" "} + + Find Open Positions Today + +
+ + {/* Main Navbar (Sticky) */} +
-
-
-
- {LP_GRID_ITEMS.map((singleItem) => ( -
-
- {singleItem.icon} + + {/* Hamburger Button (Mobile Only) */} + + + {/* Desktop Menu */} +
    + {/* Solutions (Desktop Dropdown) */} +
  • setSolutionsOpen(true)} + onMouseLeave={() => setSolutionsOpen(false)} + > + + + {/* Dropdown Solutions */} + {isSolutionsOpen && ( +
    +
    +
    +

    Customer Experience

    +
      +
    • Customer Conversion
    • +
    • Customer Onboarding
    • +
    • Customer Support
    • +
    • Technical Support
    • +
    • Customer Renewals
    • +
    +
    +
    +

    Finance & Accounting

    +

    Content Moderation

    +

    Data Processing

    +
    -

    {singleItem.title}

    -

    {singleItem.description}

    - ))} + )} +
  • + + {/* Industries (Desktop Dropdown) */} +
  • setIndustriesOpen(true)} + onMouseLeave={() => setIndustriesOpen(false)} + > + + + {/* Dropdown Industries */} + {isIndustriesOpen && ( +
    +
    + SaaS + AI + Ecommerce + Healthcare + Supply Chain & Logistics + Fintech +
    +
    + )} +
  • + +
  • How it Works
  • + + {/* About (Desktop Dropdown) */} +
  • setAboutOpen(true)} + onMouseLeave={() => setAboutOpen(false)} + > + + + {/* Dropdown About */} + {isAboutOpen && ( +
    +
      +
    • + About us +
    • +
      +
    • + Careers +
    • +
    +
    + )} +
  • + +
  • Resources
  • +
+ + {/* Desktop - Get Started Button */} + + Get Started + + + + {/* Mobile Menu (Slide Down) */} + {isMobileMenuOpen && ( +
+
    +
  • Solutions
  • +
  • Industries
  • +
  • How it Works
  • +
  • About
  • +
  • Resources
  • +
+ + {/* Mobile - Get Started Button */} +
+ + Get Started + +
+
+ )} + + {/* Hero Section */} +
+
+

+ Quickly and seamlessly scale your team with agile, highly customizable outsourcing solutions that power your growth. +

+

+ Outsourcing worth talking about +

+
+
+
+ + {/* Outsourcing Options Section */} +
+

+ Which outsourcing solutions are you looking for? +

+

Choose as many as you need.

+ + {/* Options Grid */} +
+ {options.map((option) => ( +
toggleSelection(option.id)} + > + {/* Checkbox */} +
+ toggleSelection(option.id)} + className="appearance-none w-5 h-5 border border-gray-500 rounded-md checked:bg-black checked:border-transparent checked:before:content-['✔'] checked:before:text-white checked:before:text-xs flex items-center justify-center transition-all duration-300" + /> +
+ + {/* Image & Text */} + {option.label} +

{option.label}

+
+ ))} +
+ + {/* Get Started Button */} +
+ + Get Started + + + + + + +
+
+ + {/* ----------------------------- NEW SECTIONS ----------------------------- */} + + {/* SECTION 1: bg #bfc1b9 + midjourney.png */} +
+
+

+ Driving better business results for 200+ companies. +

+
+ Midjourney Logo
- - ) + + {/* SECTION 2: bg-white + image2.png + เนื้อหา 2 คอลัมน์ (ข้อความซ้าย, รูปขวา) */} +
+ +
+
+ Scale Up +
+
+

+ Free up resources, accelerate growth, and solve for scale. +

+

+ At SupportNinja, we combine cutting-edge technology with value-centricity to foster high-performing, reliable teams that turn growing pains into efficient pathways to profitability. +

+

+ Our customized, agile, AI-enabled solutions don’t just deliver cost savings — they also keep key business outcomes front and center. +

+

+ We work closely with you to continually adjust strategies, realize efficiencies, and drive scaling according to your unique needs. Plus, flexibility is baked in so you’re never locked into rigid, long-term contracts. +

+
+ +
+
+ + {/* SECTION 3: bg-white + image3.png + เนื้อหา (Don't grow it alone) */} +
+
+
+

+ Don’t grow it alone +

+

+ Don’t let headcount become a headache. We’ll connect you with talent that meets your needs. +

+

+ Your dedicated new team members will become experts in your world — your customers, your tech, your data, your systems — so they can expand on what you’ve built. +

+
+
+ Grow Together +
+
+
+{/* SECTION 4 */} +
+
+
+ {/* Customer Support */} +
+
+ {/* Icon (No Background, Enlarged, #2b2c30) */} + + + + + +

Customer Support

+
+

+ Transform every interaction into a positive experience with customer-centric support that scales as you grow. +

+ + Explore Customer Support → + +
+ + {/* Customer Experience */} +
+
+ + + + + +

Customer Experience

+
+

+ Enhance every stage of your customer journey and scale confidently — from a simple touchpoint to the entire lifecycle. +

+ + Explore Customer Experience → + +
+ + {/* Technical Customer Support */} +
+
+ + + + + +

Technical Customer Support

+
+

+ Outsourced dedicated experts on your business to answer customer questions in detail. +

+ + Explore Technical Customer Support → + +
+ + {/* Content Moderation */} +
+
+ + + + + +

Content Moderation

+
+

+ Build a thriving online presence with a team specially trained to uphold your community standards. +

+ + Explore Content Moderation → + +
+ + {/* Data Processing */} +
+
+ + + + + +

Data Processing

+
+

+ Receive analyzed data, specific to how you need it interpreted and presented. +

+ + Explore Data Processing → + +
+ + {/* Finance & Accounting */} +
+
+ + + + + +

Finance & Accounting

+
+

+ Streamline your financial operations with expert accounting and bookkeeping services. +

+ + Explore Finance & Accounting → + +
+
+
+
+ + +{/* SECTION 5 */} +
+
+ {/* Row 1: Images Left, Text Right */} +
+ {/* Images (Left) */} +
+ {/* คุณอาจจัดวาง image5, image6 ซ้อนกัน หรือวางเคียงกันได้ตามต้องการ */} + + {/* Text (Right) */} +
+

+ We’re passionate about our people. +

+

+ Our people-first culture attracts and retains top talent... +

+

+ For nearly a decade, we’ve fostered the growth, wellbeing, and career development + of our team members — and that’s earned us industry-high talent retention rates. +

+ + Read our story + +
+
+ +
+ Image 5 +
+
+
+
+ +
+
+ {/* Row 2: Text Left, Image Right */} +
+ {/* Text (Left) */} + + {/* Image (Right) */} +
+ Image 7 +
+
+

+ Grow your career and unleash your potential. +

+

+ Ready to expand your horizons at a truly global company? +

+

+ At SupportNinja, we prioritize your progress, celebrate your wins, and provide + a supportive environment where you can thrive. Check out our openings today. +

+ + View open roles + +
+ +
+
+
+{/* SECTION 6 */} +
+
+ {/* Left Side: Text */} +
+

+ We’re better together. Start building your dream team. +

+

+ Design a custom outsourcing solution that drives results. +

+ + {/* ปุ่ม Get Started สีแดง */} + + Get Started + + {/* ไอคอนลูกศร → */} + + + + + +
+ + {/* Right Side: Image */} +
+ Building Dream Team +
+
+
+ + + {/* ----------------------------------------------------------------------- */} + + ); } diff --git a/next.config.ts b/next.config.ts index 98ca220..a826c2a 100644 --- a/next.config.ts +++ b/next.config.ts @@ -10,6 +10,10 @@ const config: NextConfig = { fullUrl: true, }, }, + images: { + domains: ["raw.githubusercontent.com"], // ✅ อนุญาตโหลดรูปจาก GitHub + unoptimized: true, // ✅ ปิดการ Optimize รูปภาพ (ถ้าต้องการโหลด URL ตรง) + }, rewrites: async () => [ { source: "/healthz", destination: "/api/health" }, { source: "/api/healthz", destination: "/api/health" }, diff --git a/public/assets/image.png b/public/assets/image.png new file mode 100644 index 0000000..0924481 Binary files /dev/null and b/public/assets/image.png differ diff --git a/public/assets/image2.png b/public/assets/image2.png new file mode 100644 index 0000000..c05845e Binary files /dev/null and b/public/assets/image2.png differ diff --git a/public/assets/image3.png b/public/assets/image3.png new file mode 100644 index 0000000..5e009cd Binary files /dev/null and b/public/assets/image3.png differ diff --git a/public/assets/image4.png b/public/assets/image4.png new file mode 100644 index 0000000..ba50785 Binary files /dev/null and b/public/assets/image4.png differ diff --git a/public/assets/image5.png b/public/assets/image5.png new file mode 100644 index 0000000..d9315b0 Binary files /dev/null and b/public/assets/image5.png differ diff --git a/public/assets/image6.png b/public/assets/image6.png new file mode 100644 index 0000000..e48c660 Binary files /dev/null and b/public/assets/image6.png differ diff --git a/public/assets/image7.png b/public/assets/image7.png new file mode 100644 index 0000000..5ec1b2a Binary files /dev/null and b/public/assets/image7.png differ diff --git a/public/assets/image8.png b/public/assets/image8.png new file mode 100644 index 0000000..28b4235 Binary files /dev/null and b/public/assets/image8.png differ diff --git a/public/assets/midjourney.png b/public/assets/midjourney.png new file mode 100644 index 0000000..91241c7 Binary files /dev/null and b/public/assets/midjourney.png differ