Premium Modest Fashion Affiliate Platform
A full-featured, production-grade affiliate e-commerce platform for premium modest fashion β built with React, TypeScript, Tailwind CSS, and Vite.
Features β’ Tech Stack β’ Getting Started β’ Project Structure β’ Screenshots β’ License
β¨ Premium storefront with hero carousel, category grid, and editorial lookbook
BORMLINE. is a curated affiliate marketplace designed for the Gulf region's modest fashion industry. It connects consumers with premium abaya, sheila, and hijab brands through an elegant storefront experience β while providing brands with a complete affiliate tracking, analytics, and partner management system behind the scenes.
The platform demonstrates a real-world Server-to-Server (S2S) postback affiliate tracking workflow, making it ideal for learning, portfolio showcase, or as a starting point for production affiliate platforms.
- Premium Homepage β Hero carousel, visual category grid, trending products, deal-of-the-day countdown, best sellers, Instagram-style lookbook, and newsletter signup
- Product Catalog β Full product listing with category filtering, search, and sorting
- Product Detail Pages β Detailed product view with affiliate click-through tracking
- Brand Directory β Browse and discover partner brands with individual brand pages
- Product Comparison β Side-by-side product comparison tool
- Wishlist β Save and manage favorite products (persisted via localStorage)
- Global Search β Real-time search across products, brands, and categories
- Contact Page β Full contact form with office location details
- Click Tracking β Every outbound affiliate click is logged with a unique
click_id, referrer, user agent, and timestamp - S2S Postback Simulation β Simulates server-to-server conversion postbacks with realistic order data, commission calculation, and status tracking (completed/pending/failed/refunded)
- S2S Journey Page β Interactive educational walkthrough explaining the full S2S tracking lifecycle with animated diagrams and live demo capabilities
- Retargeting Engine β Detects abandoned clicks (no conversion) and surfaces personalized re-engagement banners with discount offers
- Analytics Dashboard β Real-time metrics: total clicks, conversions, revenue, commission earned, conversion rates, and performance charts (powered by Recharts)
- Product Management β Full CRUD for products with image URLs, pricing, categories, and affiliate links
- Brand Management β Add, edit, and delete partner brands with commission rates, API secrets, and integration types (S2S / CSV)
- Tracking & Postback Logs β Detailed click and postback log viewer with CSV export
- CSV Import/Export β Bulk product import via CSV and data export capabilities
- Brand Applications β Review, approve, or reject incoming brand partnership requests
- Settings β Admin profile management and data reset controls
- Activity Log β Audit trail of all admin actions (add/edit/delete/import operations)
- Auth Guard β Protected admin routes with demo login system
- Bilingual Support β Full English β Arabic translation with RTL layout support
- Dark / Light Mode β System-aware theme switching with manual override
- Responsive Design β Mobile-first with premium bottom navigation bar, mega dropdown menus, and touch-optimized interactions
- 49 Radix UI Components β Fully accessible component library (shadcn/ui)
- Premium Animations β Scroll reveal, marquee banners, hover accordion lookbook, staggered loading
- Glassmorphism & Modern Design β Trust strips, bento grids, gradient overlays, and editorial layouts
- Live Chat Widget β Floating support chat bubble (demo mode)
- Scroll-to-Top β Floating button appears on scroll
- Payment Badges β mada, Visa, Mastercard, Tabby, Tamara icons in footer
- SEO Optimized β Open Graph, Twitter Card meta tags, semantic HTML, and robots.txt
| Layer | Technology |
|---|---|
| Framework | React 18 + TypeScript |
| Build Tool | Vite 5 (SWC plugin) |
| Styling | Tailwind CSS 3 + CSS Variables |
| Components | shadcn/ui (Radix UI primitives) |
| Routing | React Router v6 |
| State | React Context + localStorage persistence |
| Charts | Recharts |
| Data Fetching | TanStack React Query |
| Forms | React Hook Form + Zod |
| Icons | Lucide React |
| Typography | DM Sans (Google Fonts) |
| Testing | Vitest + Playwright |
| Linting | ESLint 9 (flat config) |
- Node.js β₯ 18
- npm, yarn, pnpm, or bun
# Clone the repository
git clone https://github.com/abdirizak-30/bormline.git
cd bormline
# Install dependencies
npm install
# Start the development server
npm run devThe app will be available at http://localhost:3000
| Command | Description |
|---|---|
npm run dev |
Start Vite dev server with HMR |
npm run build |
Production build |
npm run preview |
Preview the production build locally |
npm run lint |
Run ESLint |
npm run test |
Run unit tests via Vitest |
npm run test:watch |
Run tests in watch mode |
Navigate to /admin/login and use the demo credentials:
| Field | Value |
|---|---|
admin@bormline.com |
|
| Password | admin123 |
β οΈ Note: This is a client-side demo with localStorage persistence. No real backend or database is used. All data resets onlocalStorage.clear().
BORMLINE./
βββ public/ # Static assets & favicons
β βββ bormline-favicon.svg
β βββ favicon.ico
β βββ robots.txt
βββ src/
β βββ components/ # Reusable UI components
β β βββ ui/ # 49 shadcn/ui primitives
β β βββ Layout.tsx # Global layout (header, footer, nav, chat)
β β βββ ProductCard.tsx # Product card component
β β βββ BrandCard.tsx # Brand card component
β β βββ FilterBar.tsx # Product filter sidebar
β β βββ AdminShell.tsx # Admin dashboard shell
β β βββ AdminGuard.tsx # Route protection for admin
β β βββ TrackingButton.tsx # Affiliate click-through button
β β βββ ThemeToggle.tsx # Dark/light mode switcher
β βββ hooks/ # Custom React hooks
β β βββ use-auth.tsx # Authentication context
β β βββ use-language.tsx # i18n context (EN/AR)
β β βββ use-wishlist.ts # Wishlist state management
β β βββ use-data-store.ts # Store event listener hook
β β βββ use-mobile.tsx # Mobile breakpoint detection
β β βββ use-toast.ts # Toast notification hook
β βββ lib/ # Core utilities & data
β β βββ data-store.ts # In-memory data store + localStorage
β β βββ data-translations.ts# Arabic product translations
β β βββ translations.ts # Full UI translation dictionary
β β βββ types.ts # TypeScript interfaces
β β βββ utils.ts # Utility functions
β βββ pages/ # Route-level page components
β β βββ HomePage.tsx # Landing page (13 sections)
β β βββ ProductsPage.tsx # Product catalog
β β βββ ProductDetailPage.tsx # Single product view
β β βββ BrandsPage.tsx # Brand directory
β β βββ BrandPage.tsx # Individual brand page
β β βββ SearchPage.tsx # Search results
β β βββ ComparePage.tsx # Product comparison
β β βββ WishlistPage.tsx # Saved items
β β βββ ContactPage.tsx # Contact form
β β βββ S2SJourneyPage.tsx # S2S tracking explainer
β β βββ LegalPage.tsx # Legal pages (terms, privacy, etc.)
β β βββ BrandApplyPage.tsx # Brand partnership application
β β βββ AgreementPage.tsx # Partner agreement
β β βββ AdminPage.tsx # Admin analytics dashboard
β β βββ AdminProductsPage.tsx # Admin product CRUD
β β βββ AdminBrandsPage.tsx # Admin brand CRUD
β β βββ AdminTrackingPage.tsx # Click & postback logs
β β βββ AdminImportPage.tsx # CSV import tool
β β βββ AdminBrandRequestsPage.tsx # Brand application review
β β βββ AdminSettingsPage.tsx # Admin settings
β β βββ AdminLoginPage.tsx # Admin authentication
β β βββ NotFound.tsx # 404 page
β βββ App.tsx # Root app with routing
β βββ main.tsx # Entry point
β βββ index.css # Global styles + CSS variables
βββ index.html # HTML entry point
βββ vite.config.ts # Vite configuration
βββ tailwind.config.ts # Tailwind CSS configuration
βββ tsconfig.json # TypeScript configuration
βββ eslint.config.js # ESLint flat config
βββ vitest.config.ts # Vitest configuration
βββ playwright.config.ts # Playwright E2E config
βββ package.json # Dependencies & scripts
The platform operates on five core entities:
| Entity | Key Fields |
|---|---|
| Brand | id, name, logo_url, website_url, integration_type (s2s/csv), commission_rate, api_secret, country |
| Product | id, brand_id, name, price, original_price, image_url, affiliate_url, category, is_new |
| ClickLog | id, product_id, brand_id, referrer, user_agent, clicked_at |
| PostbackLog | id, click_id, brand_id, product_id, order_id, amount, commission, currency, status |
| BrandRequest | id, name, contact_name, contact_email, category, company_size, status (pending/approved/rejected) |
ββββββββββββ click βββββββββββββ redirect ββββββββββββββββ
β User β βββββββββββΊ β BORMLINE β ββββββββββββΊ β Brand Store β
β (Browser)β β (Track) β β (Merchant) β
ββββββββββββ βββββββββββββ ββββββββ¬ββββββββ
β β
Log click_id User purchases
β β
βΌ βΌ
ββββββββββββββββββββ βββββββββββββββββββ
β Click Logs DB ββββββββββββ S2S Postback β
β (localStorage) β match β (click_id + β
ββββββββββββββββββββ click_id β order data) β
βββββββββββββββββββ
- User clicks an affiliate link on BORMLINE
- BORMLINE logs the click with a unique
click_idand appends it to the redirect URL - User lands on the brand's website and (optionally) makes a purchase
- Brand sends a postback to BORMLINE with the
click_id, order ID, amount, and commission - BORMLINE matches the postback to the original click and records the conversion
| Category | Description |
|---|---|
| Everyday Abayas | Classic, comfortable daily wear |
| Evening Abayas | Silk, embellished, and occasion wear |
| Modern Abayas | Contemporary cuts and trending styles |
| Winter Abayas | Warm, lined abayas for cold weather |
| Bridal Abayas | White and beaded bridal collections |
| Sheilas & Hijabs | Chiffon, silk, and jersey head coverings |
| Under Abayas | Inner dresses and slips |
| Brand | Country | Integration | Commission |
|---|---|---|---|
| Elegance Abaya | UAE | S2S | 15% |
| Dar Al Abaya | Kuwait | CSV | 10% |
| Silk & Stitch | Bahrain | S2S | 12% |
| Modest Crown | Saudi Arabia | CSV | 10% |
| Nova Abayas | Saudi Arabia | S2S | 8% |
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License β see the LICENSE file for details.
Abdirizak β @abdirizak
BORMLINE. β Where Modest Fashion Meets Modern Technology
