Saleor Store
우리 컬렉션을 쇼핑하세요
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Next.js 15 (App Router) • React 19 • TypeScript (Strict) • Tailwind CSS
An India–China B2B manufacturing marketplace: video-first reels discovery connecting global buyers with verified manufacturers through a LinkedIn-style professional workspace.
1. Vite Developer Quickstart: Transitioning to Next.js
2. What is the Root File & Execution Flow?
3. Project Directory Architecture
4. How Data Flows (Clean Architecture & API Seam)
5. Getting Started & Running Locally
6. Design System & UI Components
7. Developer Recipes: How Do I...?
8. Production & Deployment NotesREADME 전문 보기 ↗Next.js 15 (App Router) • React 19 • TypeScript (Strict) • Tailwind CSS
An India–China B2B manufacturing marketplace: video-first reels discovery connecting global buyers with verified manufacturers through a LinkedIn-style professional workspace.
If you have built React apps using Vite, here is the exact mental map to help you feel right at home with Next.js 15:
| Concept | Vite (SPA) | Next.js 15 (App Router) |
|---|---|---|
| Root HTML & Entry | index.html + src/main.tsx | src/app/layout.tsx (renders and ) |
| Routing | ||
| eact-router-dom () | File-system routing: folder name = URL path (src/app/(buyer)/explore/page.tsx → /explore) | |
| Where Code Runs | 100% in the user's browser | Server Components by default (runs on server, ships zero JS to browser) + "use client" for interactive widgets |
| Data Fetching | useEffect(() => { fetch(...) }, []) + loading state | sync function Page() { const data = await api.get(); return ... } directly in the component! |
| Environment Variables | import.meta.env.VITE_API_URL | process.env.NEXT_PUBLIC_API_URL (public) or process.env.SECRET_KEY (server only) |
| Links / Navigation | from | |
| eact-router-dom | from | |
| ext/link | ||
| URL Parameters | useParams(), useSearchParams() | In Server Components: passed directly as props: { params, searchParams }. In Client: useParams() from |
| ext/navigation |
In this codebase, request execution follows a layered pipeline:
` Browser Request (e.g. "/") │ ▼
In Next.js App Router, parentheses indicate a Route Group:
The codebase adheres to an industry-standard Clean / Feature-Sliced architecture:
ext SeekFactory-Web-F/ ├── public/ # Static assets (official brand logos, demo reels) │ ├── brand/ # Official SeekFactory logos │ └── videos/ # Local demo video files for the reels player │ ├── messages/ # i18n localization dictionaries (EN, ZH) │ ├── en.json │ └── zh.json │ ├── src/ │ ├── app/ # Next.js App Router (Routes & Layouts) │ │ ├── layout.tsx # 🌐 GLOBAL ROOT LAYOUT (HTML, Fonts, Metadata) │ │ ├── robots.ts # SEO robots configuration │ │ │ │ │ ├── (auth)/ # Authentication & Legal route group (Clean layout) │ │ │ ├── layout.tsx # Auth shell layout │ │ │ ├── join/page.tsx # /join (Buyer / Manufacturer registration) │ │ │ ├── login/page.tsx # /login (Sign-in flow) │ │ │ └── legal/ # Privacy, Terms, Cookies, Accessibility │ │ │ │ │ ├── (buyer)/ # Buyer Portal (Wrapped in LinkedIn-style 3-column shell) │ │ │ ├── layout.tsx # Shell data loader & <AppShell> wrapper │ │ │ ├── page.tsx # / (Video Reels Home Feed) │ │ │ ├── explore/ # /explore (Taxonomy category explorer & search) │ │ │ ├── manufacturers/ # /manufacturers/[slug] (Factory profile) │ │ │ ├── products/ # /products/[slug] (Product detail page) │ │ │ ├── messages/ # /messages (Buyer-supplier chat) │ │ │ ├── notifications/ # /notifications (Activity alerts) │ │ │ ├── profile/ # /profile (User profile & preferences) │ │ │ └── rfq/new/ # /rfq/new (Post Request for Quotation) │ │ │ │ │ └── factory/ # /factory (Manufacturer onboarding landing) │ │ │ ├── components/ # Reusable UI Components │ │ ├── ui/ # 🧱 Atomic Primitives (Button, Card, Avatar, Badge...) │ │ │ └── index.ts # Clean barrel exports │ │ ├── layout/ # 📐 Global App Shell (TopNav, LeftSidebar, SearchBar...) │ │ │ └── index.ts # Clean barrel exports │ │ ├── reels/ # 🎬 Video Player & Feed (ReelCard, Scrubber, Comments) │ │ │ └── index.ts # Clean barrel exports │ │ └── widgets/ # 📊 Right-column widgets (Trending, Categories, Suppliers) │ │ └── index.ts # Clean barrel exports │ │ │ ├── entities/ # 🏷️ Domain Models & TypeScript Interfaces │ │ ├── user.ts # BuyerProfile, SupplierProfile │ │ ├── reel.ts # Reel, ReelVariant │ │ ├── product.ts # Product, ProductSpec │ │ ├── manufacturer.ts # Manufacturer, VerificationStatus │ │ ├── category.ts # Category, CategoryIconKey │ │ ├── comment.ts # ReelComment, ReelCommentReply │ │ ├── message.ts # Conversation, ChatMessage │ │ ├── notification.ts # AppNotification │ │ └── rfq.ts # RfqDraft, RfqSubmission │ │ │ ├── features/ # ⚙️ Feature-Level Business Logic & State │ │ ├── auth/ # Session cookie management, AuthCard, RoleToggle │ │ ├── feed/ # Feed loading & tab filtering │ │ ├── explore/ # Category navigation & filters │ │ ├── rfq/ # RFQ form validation & draft handling │ │ └── shell/ # Data prefetching for the global shell │ │ │ ├── shared/ # 🛠️ Cross-Cutting Core Utilities │ │ ├── api/ # API Client contracts & getApi() interface │ │ ├── config/ # Brand identity, design tokens & feature flags │ │ ├── lib/ # cn() (Tailwind class merger), formatters (currency, numbers) │ │ └── mocks/ # Mock database, machinery taxonomy & fixture data │ │ │ └── styles/ │ └── globals.css # CSS Variables, Design Tokens & Tailwind Directives │ ├── next.config.ts # Next.js compiler & asset optimization settings ├── tailwind.config.ts # Tailwind theme extensions (brand colors, radius) └── tsconfig.json # Strict TypeScript configuration & path aliases (@/*)
To keep UI components decoupled from the backend implementation, this application follows the Repository / API Contract Pattern:
[Page or Component] │ ▼ calls [getApi()] from @/shared/api │ ├─► TODAY: mockApi (In-memory mock database with simulated latency) │ └─► LATER: httpApi (Connects to REST / GraphQL backend via fetch)
UI components never import fixtures or mock files directly.
Always query through getApi():
` sx import { getApi } from "@/shared/api";
export default async function ExplorePage() { const api = getApi(); const categories = await api.categories.listRoots();
return ; } `
When connecting a real production backend, you only implement src/shared/api/http-api.ts and return it from getApi(). Zero page components need to be modified.
ash npm install
Copy the example environment file:
ash cp .env.example .env.local
(Leave NEXT_PUBLIC_API_URL empty while developing with mock data).
ash npm run dev
Open http://localhost:3000 in your browser.
| Command | Description |
|---|---|
| pm run dev | Starts local Next.js development server with Turbopack |
| pm run build | Compiles an optimized production build |
| pm run start | Runs the compiled production server |
| pm run lint | Runs ESLint and TypeScript checks across the codebase |
The application is styled with Tailwind CSS, themed specifically for SeekFactory's professional B2B branding.
| Token Name | Tailwind Class | Hex Code | Purpose |
|---|---|---|---|
| Brand Blue | g-brand-blue, ext-brand-blue | #1A73E8 | Primary CTAs, active links, verified badges |
| Brand Blue Dark | hover:bg-brand-blue-dark | #1557B0 | Button hover states |
| Brand Orange | g-brand-orange, ext-brand-orange | #F26B21 | Accent actions, RFQs, highlight badges |
| Canvas | g-canvas | #F3F4F6 | Page background |
| Surface | g-surface | #FFFFFF | Card & sidebar surface background |
| Line | order-line | #E5E7EB | Subtle divider and card borders |
Import UI primitives directly using clean barrel exports: ` sx import { Button, Card, Badge, Avatar, VerifiedBadge } from "@/components/ui";
export function ExampleCard() { return ( Contact Factory ); } `
Add a folder under src/app/(buyer)/:
sx // src/app/(buyer)/analytics/page.tsx export default async function AnalyticsPage() { return ( <div className="rounded-2xl border border-line bg-surface p-6"> <h1 className="text-xl font-bold text-ink">Analytics</h1> </div> ); }
It will automatically inherit the TopNav, LeftSidebar, and RightAside widgets!
Add a folder under src/app/(auth)/ or create a new route group without the buyer layout.
Add "use client" at the top: ` sx "use client";
import { useState } from "react";
export function Counter() { const [count, setCount] = useState(0); return <button onClick={() => setCount(c => c + 1)}>Clicks: {count}; } `
Because SeekFactory connects Indian/Global buyers with Chinese manufacturers, third-party dependencies are strictly selected to ensure accessibility in both regions:
| Service / Dependency | ❌ Avoid Defaulting To | ✅ Production Preference |
|---|---|---|
| Fonts | Google Fonts CDN runtime requests | |
| ext/font (self-hosted locally at build time) | ||
| Authentication | Google OAuth only | Email + Mobile SMS OTP (WeChat for China suppliers) |
| Video Delivery | Cloudflare Stream / Mux (blocked in parts of China) | Aliyun OSS + VOD (HLS) |
| Maps & Location | Google Maps SDK | Amap (AutoNavi) / Tencent Maps |
| Image Hosting | Cloudinary / Firebase Storage | Aliyun OSS or AWS S3 China |