Ecommerce Template
Next.js·React 등으로 만든 최신 전자상거래 템플릿
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗B2B marketplace for medical supplies and equipment. Next.js 16 App Router frontend using vertical modules with light layers, React 19, Redux Toolkit / RTK Query, and TypeScript.
# 1. Install dependencies
pnpm install
# 2. Set up environment
cp .env.example .env.local
# 3. Start the backend (separate repository)
# See suminia-backend README — it must be running on port 8001
# 4. Start development server
pnpm dev
The app runs at http://localhost:3000 and talks to the API at http://localhost:8001.
Suminia is a B2B marketplace connecting suppliers (manufacturers, importers) with buyers (clinics, hospitals, distributors) of medicines and medical supplies in Colombia.
This repository is the web frontend. It is organized in vertical business modules that
mirror the backend's NestJS modules — auth, catalog, orders mean the same thing on
both sides of the stack. Boundaries between layers are enforced by ESLint, not convention.
The project started from a commercial e-commerce template (Voxo). That template is
quarantined under src/_template/ and is deleted screen by screen as real ones replace
it. See ARCHITECTURE.md for the retirement plan.
eslint-config-next├── src/
│ ├── app/ # Next.js App Router — routes only, no business logic
│ │ ├── layout.js # Root layout + global metadata
│ │ ├── providers.tsx # Server/client boundary: Redux + session bootstrap
│ │ ├── api/ # Template mock backend (21 handlers, to be deleted)
│ │ └── (main)/
│ │ ├── (suminia)/ # Real product routes
│ │ └── (template)/ # Voxo demo routes, deleted piece by piece
│ ├── modules/ # Business modules (auth, catalog, suppliers, orders…)
│ │ └── auth/ # api/ model/ lib/ hooks/ ui/ index.ts
│ ├── shared/ # Cross-cutting, no business logic
│ │ ├── api/ # baseApi — the single HTTP client
│ │ ├── lib/ # tokenStorage, validators, apiError
│ │ ├── ui/ # Reusable components
│ │ ├── config/ # Environment variables
│ │ └── i18n/ # i18next configuration and locales
│ ├── store/ # configureStore + typed hooks
│ └── _template/ # Voxo template in quarantine (delete-only)
├── public/ # Static assets and Sass sources
├── ARCHITECTURE.md # Structural source of truth
├── CLAUDE.md # Conventions and commands
├── Dockerfile # Multi-stage production image
└── ecosystem.config.js # PM2 process definition
The dependency rule, enforced by ESLint:
app → modules → shared
Before you begin, ensure you have the following installed:
npm install -g pnpm)Clone the repository
git clone [email protected]:Suminia-Tech/suminia-frontend.git
cd suminia-frontend
Install dependencies
pnpm install
Set up environment
cp .env.example .env.local
Edit .env.local and point NEXT_PUBLIC_API_URL at your backend.
Start the development server
pnpm dev
Environment variables live in .env.local (git-ignored). See .env.example.
# Backend API
# Any variable consumed by the browser must be prefixed NEXT_PUBLIC_.
NEXT_PUBLIC_API_URL=http://localhost:8001
Environment variables are read in a single place — src/shared/config/env.ts. Do not read
process.env anywhere else.
# Development (hot reload)
pnpm dev
# Production build
pnpm build
# Serve the production build
pnpm start
# Lint, including the architecture boundary rules
pnpm lint
# Type check (no emit)
npx tsc --noEmit
# Build the application
pnpm build
Before considering anything finished:
npx tsc --noEmit && pnpm lint && pnpm build
A boundary violation fails pnpm lint exactly like a syntax error would. There are no
tests in the project yet — types are the safety net during refactors.
For structure, module anatomy, and data flow, see:
Every business module follows the same internal layout:
modules/<name>/
├── api/ RTK Query endpoints, via baseApi.injectEndpoints
├── model/ Domain types + state slice
├── lib/ Pure functions (validation, formatting, calculations)
├── hooks/ React hooks owned by the module
├── ui/ Screens (…Screen.tsx) and pieces (ProductCard.tsx)
└── index.ts Public API ← the only thing importable from outside
| Command | Description |
|---|---|
pnpm dev | Start development server |
pnpm build | Production build (Turbopack) |
pnpm start | Serve the production build |
pnpm lint | Lint, including boundary rules |
npx tsc --noEmit | Type check |
Product routes live in the (suminia) route group. Names in parentheses are Next route
groups — they never appear in the URL.
| Route | Description |
|---|---|
/ | Home |
/register | Company registration (buyer or supplier) |
/forgot-password | Request a password reset link |
/reset-password | Set a new password (arrives with ?token=) |
/verify-email | Verify email address (arrives with ?token=) |
Login has no route of its own: it is a modal available from anywhere in the app.
Routes under /shop/…, /blog/…, /product/…, /voxo_plus/… and /page/… are template
demos and will be removed.
Created by the backend seeder (make db-seed in suminia-backend). Their organizations
are already approved, so they can be used for end-to-end flows.
| Password | Role | |
|---|---|---|
[email protected] | SupAdm!n2026 | supplier_admin |
[email protected] | SupOper!2026 | supplier_operator |
[email protected] | BuyAdm!n2026 | buyer_admin |
[email protected] | BuyOper!2026 | buyer_operator |
[email protected] | S3crEtP4ssw0rd! | superuser |
[email protected] | S3crEtP4ssw0rd! | admin |
The header shows which account is active — "Mi cuenta (Administrador · Proveedor)" versus "(Operador · Proveedor)" — which matters when testing several accounts in parallel.
The build produces a Next standalone output (output: "standalone" in
next.config.mjs), which ships only the dependencies the server actually needs.
Docker — multi-stage build, runs as a non-root user, with a healthcheck:
docker build -t suminia-frontend .
docker run -p 3000:3000 -e NEXT_PUBLIC_API_URL=https://api.example.com suminia-frontend
PM2 — ecosystem.config.js defines the suminia-frontend process on port 3000.
CI/CD lives in .github/workflows/deploy.yaml.
NEXT_PUBLIC_*variables are inlined at build time, not read at runtime. Changing the API URL requires rebuilding the image.
Private and proprietary. This repository additionally contains a commercial template
(Voxo) under src/_template/, licensed to Suminia and not redistributable.