尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 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 Notes檢視完整 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.
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 |