- App Name : ZOVEN | Fashion Shopping App React Native Expo UI Kit
- Created : 10 Nov 2026
- Last Updated : 11 Nov 2026
- Version : 1.0.0
- Screens : 78 ready-made screens
- Platforms : Android, iOS, Web
- Framework : React Native (Expo SDK 55, RN 0.83, React 19)
- Author : MKTemplateWizard
Introduction
ZOVEN - Cross-Platform Fashion Shopping Mobile Application
ZOVEN is a fashion ecommerce UI kit built with React Native and Expo. It ships with 78 screens, a mock API layer, simulated AI demos, 10 curated palettes, 10 selectable locales with complete UI key coverage and 20 currencies - no backend or API keys required to run.
The kit covers the full fashion shopping journey: onboarding, authentication, product browsing, cart, checkout, order history and tracking, returns, product requests, shopping lists, favorites, comparison, referrals, outlets, gift cards, loyalty and demo AI experiences. Server-owned data uses shared API adapters; account feature state uses the customer-state adapter.
The app has one data integration path. Typed adapters and query hooks select HTTP or bundled mock handlers; persisted customer feature state uses the same mock/HTTP switch through a Zustand storage bridge. The demo runs offline, and buyers connect a server by implementing the documented resource endpoints and generic customer-state contract.
- 78 ready-made screens - every step of a fashion shopper's journey is designed and wired (see the breakdown below)
- 63 reusable UI components - cards, bottom sheets, drawers, filter sheets, nav, modals and form controls
- 272 products, 39 categories, 10 in-house brands of fictional demo catalog data
- 22 Zustand stores (16 persisted: 11 through the customer-state bridge, 5 through AsyncStorage)
- 10 curated palettes, switchable live from the theme picker and contrast-checked for WCAG AA
- 10 selectable locales (including RTL Arabic); complete UI key coverage with English fallback for added keys, plus 20 currencies
- No-backend demo - screens use typed API adapters or the customer-state adapter, backed by mock handlers in offline mode. Mock API calls include simulated latency; the kit also includes a designed no-internet screen for when connectivity drops.
- AI demo - assistant, find/gift flows, comparison, visual search (camera/gallery)
- Leaflet + OSM maps in a WebView - no API key, works in Expo Go
The 78 screens at a glance
Screens are file-based routes, so adding or removing one is a single file. Here is how the 78 break down:
| Area | Screens | # |
|---|---|---|
| Onboarding & system | Splash, onboarding carousel, app entry, no-internet, not-found | 5 |
| Authentication & legal | Login, sign up, email verification, registration success, OTP, forgot password, reset password, reset success, terms, privacy | 10 |
| Home & discovery | Home, categories, category details, search, search results, brands, brand details, offers, offer details, lookbook, outlets, compare, product details, size guide, recently viewed, alerts, favorites | 17 |
| Cart & checkout | Cart, checkout, online payment, order success | 4 |
| Orders & after-sales | Orders, order details, invoice, track order hub, track order details, returns hub, new return / exchange | 7 |
| Account & settings | Profile, edit profile, change password, addresses, add address, payment methods, referrals, income, gift cards, loyalty, notifications, product requests, new product request, shopping lists, shopping list details, help & support, FAQ, about, contact, theme picker, language, currency, language picker, currency picker | 24 |
| AI suite | AI assistant, guided shopping flow, AI comparison, visual search | 4 |
| Policy pages | Shipping, payment, gift card, warranty, cookie, refund, sustainability | 7 |
| Total | 78 | |
Implementation lives in src/app/ (route screens) and src/screens/ (screen implementations), with shared UI in src/components/.
Requirements
Before setting up the project, ensure your development environment meets these requirements:
Node.js
Node.js 22.13+ (Node 24 LTS recommended) and npm 10+. The project ships an .nvmrc pinned to Node 24.22.2 - with nvm run nvm install then nvm use in the project root to select it. The EAS build profiles also pin Node 24.22.2 for reproducible cloud builds.
Node.js Download
Git
Required for version control and package management.
Expo Go / Emulator
For the fastest start, install the Expo Go app on your phone and scan the QR code. Alternatively use an Android emulator (Android Studio) or the iOS simulator (Xcode, macOS only). Official docs: docs.expo.dev.
Tech Stack At A Glance
- Expo SDK 55 (~55.0.31) with React Native 0.83 and React 19
- Expo Router - file-based routing with typed routes
- NativeWind v5 preview - Tailwind CSS for React Native
- Zustand v5 - 22 stores, 16 persisted (11 through the customer-state bridge, 5 through AsyncStorage); the auth token is kept in SecureStore
- TanStack React Query v5 + Axios - server state and API layer
- i18next / react-i18next - 10 selectable locales, live switching, RTL support, complete UI key coverage with English fallback for added keys
- react-hook-form + Zod - form state and validation
- react-native-reanimated + gesture-handler - gestures and animations
- react-native-webview - Leaflet + OSM maps with OSRM routing
- expo-image-picker - camera/gallery for visual search and profile photos
- expo-image - fast, cached product imagery
- expo-print / expo-sharing / expo-file-system - invoice export
- expo-secure-store - encrypted auth token storage (iOS Keychain / Android Keystore)
- expo-location / expo-audio - map-based address picker and checkout voice-note instructions
Project Folder Structure
zoven/
├── app.json # Expo config: name, icons, splash, plugins
├── eas.json # EAS build profiles (development / preview APK / production AAB)
├── package.json # dependencies, scripts, Node/npm engine range
├── .nvmrc # Node 24.22.2 for nvm users
├── metro.config.js # Metro + NativeWind
├── scripts/
│ ├── verify-integrity.js # routes + asset reference checks (npm run verify)
│ ├── smoke-tests.ts # dependency-free unit tests (npm test)
│ └── check-theme-contrast.ts # WCAG AA palette gate (npm run theme:check)
└── src/
├── app/ # Expo Router routes (80 routes / 78 screens)
│ ├── _layout.tsx # Root layout: providers, offline handling, overlays
│ ├── (auth)/ # login, signup, OTP, password reset, legal
│ ├── (main)/ # orders, addresses, profile settings, returns, referrals...
│ ├── (tabs)/ # home, categories, cart, offers, favorites, profile
│ ├── ai-*.tsx # assistant, comparison, shopping flow, visual search
│ ├── product/[slug].tsx
│ ├── search.tsx / search-results.tsx
│ └── checkout.tsx / online-payment.tsx / order-success.tsx
├── screens/ # screen implementations used by the routes
├── components/ # ai, cards, modals, navigation, products, sections, ui
├── store/ # 22 Zustand stores + storage adapters
├── services/
│ ├── api/ # typed REST endpoint functions
│ ├── mock/ # in-memory relational demo database + handlers
│ ├── queries/ # TanStack Query hooks
│ └── ai/ # AI provider boundary + mock provider
├── hooks/ # pagination, currency, network, debounce, refresh
├── lib/ # types, i18n, theme palettes, data, validation, map config
├── providers/ # React Query provider
├── utils/ # toast + navigation helpers
├── config/ # environment + home section mapping
└── assets/
├── images/ # product, category, brand, banner, offer, background, onboarding art + logos
└── icons/ # flags, payment methods, social icons
Images & icons: all bundled art lives under src/assets/images/ (products, categories, brands, banners, backgrounds, offers, onboarding, logos) and src/assets/icons/ (flags, payment methods, social icons). Each feature section below lists the exact files it uses.
Installation & Setup
- Install dependencies
npm install - Start the dev server
npx expo start - Open the app - scan the QR code with Expo Go, or press
afor an Android emulator,ifor the iOS simulator,wfor web.
No environment file is required to run: the app defaults to the bundled mock API, mock AI and OpenStreetMap tiles.
Demo Credentials
The login screen has a Demo Login button that signs you in instantly. If you prefer typing:
- Email: demo@zoven.com
- Password: Demo@123
Guest and social sign-ins are simulated local demo flows. Social sign-in creates a demo profile and token; no OAuth provider is contacted. These demo profiles start with an empty phone number to demonstrate the "Complete profile" gate in checkout.
Running & Building
Development
npx expo start # dev server (Expo Go) npx expo start -c # dev server with a cleared Metro cache
Clear the cache (-c) whenever you add/remove/rename assets or change global CSS.
Local release APK
npx expo prebuild --clean cd android .\gradlew assembleRelease
The APK is written to android/app/build/outputs/apk/release/app-release.apk. The generated Gradle project signs release builds with the debug keystore by default - use your own keystore for store releases.
Cloud builds (EAS)
npm install -g eas-cli # or use: npx eas-cli eas login # sign in - https://expo.dev/login eas init # create / link your own EAS project eas build --platform android --profile preview # installable APK (internal) eas build --platform android --profile production # AAB for the Play Store eas build --platform ios --profile production # iOS archive
EAS builds run prebuild in the cloud, so you never need a local android/ or ios/ folder. Before the first build: update the app identity in app.json, install the CLI (npm install -g eas-cli) and sign in with eas login - create a free Expo account at expo.dev/login. Full reference: docs.expo.dev.
App identity (do this first)
expo.name- display nameexpo.slug- Expo project slugexpo.scheme- deep-link schemeexpo.ios.bundleIdentifier- unique iOS application IDexpo.android.package- unique Android application IDexpo.owner/ EASprojectId- intentionally not set in this template; runeas initto create a project under your own Expo account before the first cloud build.- App icon, adaptive icon and splash assets under
src/assets/images/
App Configuration
Everything that shapes the shipped app: environment variables, the Expo manifest, and the theme tokens.
Environment Configuration
Copy .env.example to .env (or .env.local) when you want to override the defaults. Everything is optional - the demo runs offline out of the box.
EXPO_PUBLIC_API_BASE_URL=http://localhost:3000/api/v1 EXPO_PUBLIC_USE_MOCK_AI=true EXPO_PUBLIC_MAP_PROVIDER=osm EXPO_PUBLIC_MAPTILER_KEY=
| Variable | Purpose |
|---|---|
EXPO_PUBLIC_API_BASE_URL | Base URL of your real backend (used once mock mode is disabled). Defaults to localhost in dev. |
EXPO_PUBLIC_USE_MOCK_API | true (default) uses bundled mock handlers and mock persistence. Set to false with the API URL configured to use HTTP adapters and the customer-state endpoint. |
EXPO_PUBLIC_USE_MOCK_AI | Controls the AI assistant provider only. The other AI helpers are exported from the same src/services/ai layer but remain simulated demos until replaced. |
EXPO_PUBLIC_MAP_PROVIDER | osm (default, keyless) or maptiler (needs a key, falls back to OSM without one). |
EXPO_PUBLIC_MAPTILER_KEY | MapTiler API key, only used with maptiler. |
EXPO_PUBLIC_DEMO_TAX_RATE_PERCENT, _LABEL, _INCLUSION, _SHIPPING | Optional fictional tax so you can preview the tax UI on the checkout screen. Completely off by default; production rates belong on your backend. See the README's tax section. |
Mock mode is enabled by default through EXPO_PUBLIC_USE_MOCK_API. Typed adapters use bundled handlers, while persistent feature stores use the mock customer-state adapter; coupons and gift cards use their own resource adapters. Set EXPO_PUBLIC_API_BASE_URL and EXPO_PUBLIC_USE_MOCK_API=false to route those same boundaries to your server. Presentation-only size-chart reference tables and product editorial material/care copy remain bundled.
App JSON Configuration
app.json holds the Expo configuration. Key fields:
| Field | Notes |
|---|---|
name, slug, scheme | App name (ZOVEN), project slug (zoven) and deep-link scheme (zoven). |
version | 1.0.0 - bump for each release. |
userInterfaceStyle | light - the kit is designed light-only (the ten palettes repaint the light canvas). |
icon, ios.icon, android.adaptiveIcon, web.favicon | App icons (adaptive background #F7F4EA, with a monochrome adaptive icon). |
ios.bundleIdentifier, android.package | Shipped as com.mktemplatewizard.zoven - change to your own unique IDs before publishing. |
plugins | expo-router, expo-splash-screen (forest #183B32 background; the animated logo + tagline loading screen is JS at src/app/splash.tsx), expo-sharing, expo-asset, expo-image-picker (permission texts), expo-location and expo-audio (microphone permission for checkout voice notes). |
experiments | typedRoutes and reactCompiler enabled. |
owner, extra.eas.projectId | Intentionally omitted. Run eas init to create your own EAS project before your first cloud build. |
Theme & Styling
Styling is NativeWind v5 (Tailwind for React Native) with design tokens defined once in src/global.css and mirrored for every palette in src/lib/theme/themes.ts:
--color-primary- brand forest#183B32(buttons, active states, links)--color-background/--color-foreground- app surface and text--color-card,--color-muted,--color-border- surfaces and separators- Gradient helpers:
bg-gradient-dual-tone,bg-gradient-warm-bottom,bg-gradient-brand-deep(profile header)
The palettes are Tailwind tokens, republished at runtime: the same compiled classes (bg-primary, text-foreground, border-border) resolve against whichever palette is active, written onto the root view by NativeWind's VariableContextProvider. Changing the tokens in src/global.css (or switching palette) re-themes the whole app instantly. The kit renders light-only by design (userInterfaceStyle: "light").
Tap feedback is centralized in src/components/ui/RipplePressable.tsx: it picks a circular ripple for square/round buttons and a masked ripple for wide items, plus a subtle pressed dim on every platform.
Architecture Overview
Navigation & Routing
All 78 screens are Expo Router routes (file-based), so each screen is one file. Groups keep the URL structure clean:
src/app/
├── (auth)/ → /login /signup /verify-email /forgot-password /otp-verification
│ /reset-password /reset-success /registration-success /terms /privacy
├── (tabs)/ → / (home) /categories /cart /offers /favorites /profile
├── (main)/ → /orders /orders/[id] /orders/invoice/[id] /addresses /add-address
│ /edit-profile /change-password /referrals /returns /returns/new
│ /track-order /track-order/[id] /income /faq /help-support
│ /language /currency /offer-details /product-requests
│ /alerts /notifications /recently-viewed /lookbook /loyalty /gift-cards
│ /payment-methods /size-guide
├── ai-*.tsx → /ai-assistant /ai-shopping-flow /ai-comparison /ai-visual-search
├── product/ → /product/[slug]
├── brands/ → /brands /brands/[id]
├── shopping-list/ → /shopping-list /shopping-list/[id]
├── categories/ → /categories/[slug]
├── product-requests/ → /product-requests/new /product-requests
└── root screens → /splash /onboarding /language-select /currency-select /theme
/search /search-results /checkout /online-payment /order-success
/compare /outlets /contact /about /no-internet /not-found
/shipping-policy /payment-policy /gift-card-policy /warranty-policy
/cookie-policy /sustainability-policy /refund-policy
Typed routes are enabled (experiments.typedRoutes), so route names are checked at compile time. The tab bar is a custom component (src/components/navigation/TabBar.tsx) with a wave-shaped center cart button and a live cart badge.
Client State & Persistence
Zustand manages screen state. Business resources use typed API/query adapters; cart, alerts, fit profile, loyalty, notifications, product questions/requests, recently viewed, returns, shopping lists and product comparisons persist through customerStateApi using the same mock/HTTP switch. Coupon validation and gift-card validation/redemption use their own resource APIs. Account-specific data is read and written at /me/state/{resource}/{key} and must be authorized by the server. The auth session token is kept in the platform keychain/keystore through SecureStore; the user profile, theme, locale, currency, onboarding progress and temporary UI state remain on-device. Expo web has no OS keychain, so the web preview keeps the token in memory for the current session only and never persists it.
Address, payment method, favorite, review and order records use their typed resource adapters. The outlet directory is fetched via the content adapter; filter selections are transient screen state. src/services/mock/db.ts contains categories, brands and products for mock catalog responses.
Data Layer & Mock API
The demo needs no backend. Server-owned resources use typed API adapters and query hooks; persistent feature state uses a generic customer-state storage adapter. Both select bundled mock behavior or HTTP from the same environment switch.
- Typed service layer -
src/services/api/*defines resource contracts andsrc/services/queries/*wraps reads and mutations. Mock mode is the default; handlers insrc/services/mock/handlers/*and the catalog insrc/services/mock/db.tsprovide offline responses. - One switch - product, category, merchandising, outlet, address, payment, review, favorite, delivery, tax and order resources resolve through adapters.
EXPO_PUBLIC_USE_MOCK_API=falsesends the same adapter calls toEXPO_PUBLIC_API_BASE_URL. - Persistent feature state - cart, alerts, fit profile, loyalty, notifications, Q&A/requests, recently viewed, returns and shopping lists use Zustand through
customerStateApi. In HTTP mode the backend implementsGET/PUT/DELETE /me/state/{resource}/{key}; PUT accepts{ "value": "<serialized state>" }. Coupon validation/claiming and gift-card validation/redemption use/couponsand/gift-cardscontracts instead. The server must scope each key to the authenticated account.
Business resources use the same mock/HTTP adapter boundary. Checkout sends one create-order request and order screens read records from the order adapter. Persistent feature stores use the generic customer-state contract; coupon validation and gift-card balance operations have dedicated contracts. Authentication verification/recovery, guest/social sign-in, AI helpers and static presentation content (size charts, product editorial material/care, onboarding copy, return reason/status labels, tracking timeline copy and loyalty tier rules) remain simulated, local or bundled. Mock mode may seed demo feature snapshots (returns, shopping lists, product requests, notifications, loyalty history) so screens are not empty; HTTP mode starts empty. Theme, locale, currency, onboarding progress and temporary checkout fields remain device-local preferences or UI state.
Note: the demo still checks real connectivity (the no-internet screen appears when the device is offline) and map tiles stream from the provider.
Localization & Currency
- 10 selectable locales: English, Bengali, Arabic (RTL), Spanish, Japanese, Hindi, French, German, Russian, Portuguese - switchable live from Settings and persisted. All ten locale files cover the complete UI key set; English remains the fallback for added keys.
- RTL support: Arabic flips the layout direction (
I18nManager.forceRTL) and status-bar handling. - 20 currencies: USD, EUR, GBP, AED, SAR, INR, PKR, BDT, EGP, TRY, JPY, CNY, KRW, CAD, AUD, CHF, MYR, PHP, IDR, THB - with per-locale defaults and a shared formatter (
useFormatCurrency). - Flags: bundled as PNG icons in
src/assets/icons/flags.
Translation files live in src/lib/locales/*.ts. The ten locales are selectable and every UI key used by the app is present in each file. English remains the fallback in src/lib/i18n.ts so any key you add is still safe before you translate it. AI response copy is English-only in the demo.
AI Layer
The AI features run through a provider boundary in src/services/ai/index.ts. The bundled mock provider simulates thinking latency and answers from the demo catalog: it can search products, add to cart, compare items, and answer delivery/policy questions. Everything AI in the kit is an offline demo - no hosted AI service is called. Inline AI insight cards carry a visible Demo badge.
Visual search is demo mode: it uses the real camera/gallery picker but the matching is simulated against the bundled catalog (the screen shows a "Demo" badge and a note explaining this). Replace the provider to run real image recognition.
The assistant chat can use a provider implemented in src/services/ai/index.ts when EXPO_PUBLIC_USE_MOCK_AI=false. Guided flow, comparison, visual search, search interpretation, home recommendations, favorites insight and review summaries are exported from the same AI layer and call the local demo implementation until integrated with a provider. No API keys ship in the app.
Live-service costs: connecting a live backend or third-party services is not included and will incur additional costs paid directly to their providers. This can include AI provider usage/tokens, cloud hosting, database and storage, map tiles/geocoding/routing, payment gateway fees, email/SMS/OTP delivery, push notifications and app-store fees. The bundled demo uses mock data and incurs none of these costs.
AI usage disclosure. AI tools were used to assist with parts of the source code and written documentation of this item; all output was reviewed, tested and refined by the author before submission. The ZOVEN logo and bundled brand marks are author-made placeholder assets. Promotional artwork used in some preview screenshots may have been created with the assistance of AI tools. Product and category images bundled with the app are demo placeholders; replace them with your own licensed photography before production. All in-app AI features are simulated offline demos and are labeled as demos.
Features & Screens
All 78 screens are listed below by area. Screens use the API adapter boundaries with bundled mock behavior by default. Real payment processing and identity providers are not included; AI and selected account workflows are labeled demos as described in each section.
Authentication
All authentication is simulated against the mock API and persisted in authStore.
- Login - email + password, show/hide password, "remember me", inline validation, social buttons (Google / Facebook, simulated), and a one-tap Demo Login.
- Sign up - full form with validation, terms checkbox, social sign-up buttons.
- Email verification + Registration success screens.
- OTP verification - 6-digit input with resend timer (
useResendTimer). - Forgot / reset password with a reset-success confirmation.
- Guest & social logins start with an empty phone number - checkout then shows a Complete profile gate that routes to Edit Profile before ordering.
- Legal screens - Terms and Privacy (also reachable from Settings).
Resources: social button icons in src/assets/icons/social-icons/; brand logo on auth screens in src/assets/images/logo.png.
Home Screen
Top Bar
Delivery address (opens the address modal), search entry, notification bell with unread dot, and a menu button that opens the side drawer. The category drawer opens from the grid icon.
Hero Slider (Stories)
A looping, center-snapping campaign banner slider with auto-play:
- Infinite loop - first/last slides are cloned so scrolling never hits a wall; reaching a clone rewinds silently.
- Center snapping with pagination dots.
- Art-directed banners - the eyebrow, headline and CTA are printed into each 2:1 artwork (with the ZOVEN lockup already in the panel), so slides render the artwork alone and tap into a search query instead of live text.
Banners live in src/lib/data/stories.ts (images in src/assets/images/banners/, 1200x600).
Resources: section backgrounds and promo art in src/assets/images/backgrounds/ (background-1..4, plus background-5.webp and background-6.webp for the seasonal sale bands); offer popup poster in src/assets/images/offers/popup-offer.webp.
Home Sections
- Category grid - quick navigation with tinted category rings.
- Weekday deals - live countdown to midnight with a deal rail and a forest band.
- Promo product rows - a promo card on the left (image with badge/headline/CTA, or full-design
imageOnlyart) next to a product rail. The card sizes itself from the artwork so nothing is cropped. - Featured finds - themed band with a product rail.
- Seasonal sale bands - Winter Sale and Summer Sale use the same full-width image band as Bags & Backpacks and Fragrance & Beauty: campaign art, heading over the image and a related-product rail. Edit the pools in
src/config/homeSections.ts(winter-sale,summer-sale) and swap the art insrc/assets/images/backgrounds/. - Offer showcase - hero banner + overlay cards, each sized to its artwork.
- Sections bands - Bags & Backpacks and Fragrance & Beauty bands sized from their 2:1 art.
- Product rails - configurable in
src/config/homeSections.ts. - Brand slider, outlets section, lookbook teaser, AI recommendations.
Offer Popup
A promo poster modal appears once after the home loads (2s delay). Dismissal is persisted - it does not show again on the next launch. The poster ratio is derived from the asset, so any export size works.
Floating Controls
- AI assistant button - floating brand FAB, hidden on splash/onboarding, auth flow, cart, checkout, the AI chat itself and the offline screen; visible everywhere else (including home).
- Palette button - opens the live theme picker from any main screen.
- Back to top - appears after scrolling with per-screen clearance so it never covers bottom bars.
Product Browsing
Categories
The categories tab shows a two-column grid with inline drill-down (root → sub → child) and a full category listing screen (/categories/[slug]) with a sidebar, sorting and pagination. The demo tree has 39 categories across Clothing, Bags & Luggage, Jewelry & Watches, Fragrance & Beauty, Home & Living and Eyewear.
Search
- Live suggestions as you type (debounced).
- AI interpretation of natural-language queries ("something for a wedding").
- Recent & trending searches (persisted).
- Entry point to visual search (camera/gallery).
Search Results & Filters
- Filters: category tree, brand, size, colour, stock, price range, rating, shipping - each with its own bottom sheet or sidebar.
- Sorting: relevance, price (low/high), rating, newest, discount.
- Paginated grid with skeleton loaders and pull-to-refresh.
Product Detail
- Zoom gallery with colour-aware imagery, discount badges, stock states (out-of-stock disables add-to-cart with a notify option).
- Colour & size picker with live price, per-variant stock and a multi-variant quantity builder (one sheet with add / quantity per colour × size).
- Fit, material & care details, a size guide and an interactive fit finder.
- Postcode delivery estimate, nearby store availability, persistent product alerts.
- Customer reviews (with a write-review sheet), rating breakdown and product Q&A.
- Shop the look, an offline style studio (drop the piece on your own photo - drag, pinch, rotate, share) and an auto-playing motion lookbook built from the product photos (no video, AR or try-on SDK).
- Compare - add to a compare tray (up to three) and open a side-by-side screen.
- Sticky bottom bar: price, quantity, add to cart, buy now.
Favorites
Grid and list views (ProductListRow), named collections, shareable product links, a "You may also like" rail and an AI wishlist insight card.
Brands & Outlets
- Brand directory (
/brands) with a featured slider and full brand pages (self-hides whenBRANDSis empty). - Outlets - list + map view, district/thana filtering, outlet detail modal, and directions via OSRM routing in the WebView map. Store names, addresses and coordinates are fictional sample data.
Resources: product photos in src/assets/images/products/ (600×600 WebP named zoven-<id>-<colour>.webp, referenced from src/lib/data/products/*); category tiles in src/assets/images/categories/ (category-1.webp ... category-39.webp, 39 files); brand logos in src/assets/images/brands/ - 10 transparent marks (brand-1.png ... brand-10.png) matching the ten house labels in src/lib/data/brands.ts (all logos ship local, no remote URLs).
Cart & Checkout
Cart
- Quantity steppers with live totals, variant labels (colour / size) and per-line pricing.
- Coupon entry with validation (percentage, fixed, caps, minimum purchase) and gift-card redemption.
- Free-shipping progress and tax estimate.
- Persisted across restarts (
cartStore). - The tab bar and floating controls hide on the cart so the sticky summary and checkout CTA own the screen.
Checkout
A single scrolling checkout with the address, delivery choice, gift options, coupon / gift card, payment and review in one flow.
- Address selection - a bottom-sheet address drawer with saved addresses, "Save & use", and a full add-address flow including a Leaflet map picker (drag the pin or search; reverse geocoding via Photon with a BigDataCloud fallback).
- Delivery options - Standard, Express and Nominated day, priced by delivery zone (Central Dhaka / North Dhaka / South Dhaka / Outside Dhaka / International). Free-delivery thresholds show as "Free"; a failed quote shows an "Unavailable - pull to retry" state.
- Gift options - gift wrap (with fee), a gift message and a gift receipt toggle.
- Coupons & gift cards - validated coupon entry plus redeemable gift-card balance applied to the total.
- Tax quote - destination-aware, quoted by the API (off by default in the demo).
- Payment - brand-icon method list: Cash on Delivery, bKash, Nagad, PayPal, Google Pay, Apple Pay and saved cards. Prepaid methods route through the online payment demo screen (a simulated gateway with processing / success / decline states) and the order is only created once the payment succeeds - cancelling keeps the cart intact. COD confirms directly.
- Loyalty earn preview - points the order will earn, based on your tier.
- Review modal - a formatted confirm-order card (items, payment, address, delivery + ETA, gift options, highlighted total).
- Complete profile gate - if the account has no phone number, the CTA routes to Edit Profile first.
Order Success
Animated success screen with the order number; the primary CTA jumps to Track order.
Resources: payment brand icons in src/assets/icons/payment-methods/ (numbered files pay-1.webp to pay-9.webp).
Orders & Tracking
- Order history - status chips, totals, item thumbnails, and quick access to details and invoices.
- Order details - full summary, items with variant + per-unit price, delivery zone/option, gift wrap, payment method, contact info, and a status timeline.
- Invoice - printable invoice with a Qty column; export via print/share (
expo-print+expo-sharing). - Track order hub - active shipments for signed-in users plus a guest lookup: enter the order number and the phone/email used at checkout.
- Tracking detail (
/track-order/[id]) - localized status timeline (placed, confirmed, preparing, shipped, out for delivery, delivered) with per-step icons and timestamps.
Returns & Exchanges
- Returns hub with status chips (pending, approved, rejected, refunded, cancelled) and refund totals.
- Full-page request form: order picker (only delivered orders), reason chips, description, evidence photos (camera/gallery), and pickup notes.
- Refund or exchange - choose a refund, or request an exchange with the replacement size / colour.
- Detail sheet with a status timeline; requests can be cancelled while pending.
- Requests are stored in
returnRequestStoreand appear immediately in the hub.
Product Requests
Customers can ask the store to source a piece that is not in the catalog:
- Create form: product name, category, quantity, target price, notes, and a reference image.
- List with status chips (pending, quoted, fulfilled, declined) and admin responses.
- Details drawer with the full request, and editing is allowed only while pending.
Shopping Lists
- Create lists from a bottom sheet; rename anytime.
- Add products with debounced catalog search and a spinner, or pick from popular suggestions.
- Sections for To buy and Purchased, product thumbnails, per-item prices and an estimated total.
- Add list items to the cart in one tap.
Profile & Settings
- Profile header - deep brand gradient with status-bar tint, avatar, edit and notification buttons, and a stats strip (orders, favorites, lists).
- Edit profile - photo upload (camera/gallery) with an avatar fallback chain (photo → initials → icon), name/email/phone validation, and a live version badge.
- Change password with validation.
- Addresses - full list (name, complete address, floor/apartment, phone, notes), map-based add/edit flow with geocoding.
- Payment methods - saved cards and mobile-wallet methods (card / bKash / Nagad).
- Referrals - invite code, share sheet, and reward tracking. Income - earnings summary for payouts.
- Gift cards - browse and redeem gift-card balances.
- Loyalty - Silver / Gold / Platinum tiers, points history and reward redemption.
- Alerts - persistent restock and price-drop watches. Recently viewed - product history.
- Notifications - preference toggles (push, orders, offers) persisted in
notificationStore. - Language & currency pickers with instant switching, plus the theme picker (ten palettes).
- Size & fit guide (
/size-guide) - every chart, IN/CM toggle, international conversions and measuring tips. - Lookbook - editorial stories and shoppable looks.
- Help & support, FAQ, About Us, and the policy pages (shipping, payment, gift card, warranty, cookie, sustainability, refund, terms, privacy).
- Social links (Facebook, Instagram, Twitter, YouTube) and a softened Delete account flow with a confirmation modal.
Resources: social icons in src/assets/icons/social-icons/; language flags in src/assets/icons/flags/; payment method icons in src/assets/icons/payment-methods/; profile photos are picked by the user (camera/gallery).
Notifications & Offline Handling
- Notification sheet - a single global bottom sheet (rendered once at the root) opened from the home or profile bell. All / unread filters, mark-all-read, swipe-down or backdrop to dismiss, unread dot in the header.
- Offline screen - when connectivity drops, the app redirects to a dedicated no-internet screen with a retry action, and returns automatically when the connection is restored. The AI button and overlays are hidden there.
- Not-found route for unmatched deep links.
AI Suite (Offline Demo)
- AI assistant - a chat screen with suggested prompts, product cards in replies, add-to-cart actions, comparisons, and answers about delivery and policies.
- Guided flows - "Find my product" and "Gift finder" ask a few questions and build a recommendation.
- Comparison - pick products and see an at-a-glance spec table.
- Visual search - real camera / gallery capture (
expo-image-picker) with simulated catalog matching. - Inline AI - review summaries, product Q&A, wishlist insights and home recommendations.
The assistant is also reachable from the floating button on every main screen. See AI Layer for wiring a real provider.
Customization Guide
Everything below is designed so you can rebrand the kit from central theme and configuration files.
App Identity
Edit app.json before publishing:
name- display name (default "ZOVEN")slug- Expo project slugscheme- deep-link scheme (default "zoven")ios.bundleIdentifier/android.package- shipped ascom.mktemplatewizard.zoven; change to your own unique IDsversion- currently 1.0.0- Icons & splash:
app-icon.png,app-icon-foreground.pngandapp-icon-monochrome.png(all 1024×1024; adaptive canvas#F7F4EA),splash-blank.png(native splash image on solid#183B32),logo-white.png(animated JS splash logo),logo.png - Run
eas initto create your own EAS project (no owner or project id ships in this template)
Images & Placeholders
Every image under src/assets/images/ is a placeholder you can swap. Replace a file with your art at the same size (keep the file name) and the layout stays untouched.
Some demo background/editorial artwork shown in the preview build and screenshots is sourced from Freepik under its license. The downloadable main template ships with dimension placeholders and does not include the Freepik artwork files.
| Folder | Used for | Notes |
|---|---|---|
products/ | Product photos | 600×600; named zoven-<id>-<colour>.webp (plus default-product.webp fallback) |
categories/ | Category tiles | 512×512; category-1.webp ... category-39.webp |
brands/ | Brand logos (directory, home slider, filter rows) | 512×512 transparent marks (brand-1.png ... brand-10.png), one per brand in brands.ts |
banners/ | Home hero slider (stories) | 1200×600 (2:1), art-directed with the CTA baked in |
backgrounds/ | Home section backdrops | background-1..6 (band art; keep the aspect ratio since band height derives from it) |
collections/ | Collection artwork | 960×600; collection-1.webp ... collection-7.webp |
lookbook/ | Lookbook chapters | lookbook-1..8.webp (900×1200) plus look-book-featured.webp (1200×600) |
offers/ | Offers screen + offer popup | offer-1..5, offer-dresses, offer-hero, offer-shoes (2:1) plus popup-offer.webp (portrait) |
onboarding/ | Onboarding carousel | portrait; 01.webp ... 05.webp |
- Format: WebP for photography, displayed through
expo-imageon iOS and Android; PNG for transparent brand marks. If you need to support an older OS image decoder, convert the affected assets to JPEG/PNG. - Icons are untouched: flags, payment-method brand icons and social icons live in
src/assets/icons/. - Promo cards: pass
imageOnlytoPromoProductRow/ the offer showcase when the artwork already contains the badge, headline and CTA; omit it to render the code overlay instead. - Banners are listed in
src/lib/data/stories.tsin slider order.
Colors & Theme
All colors flow from design tokens in src/global.css, with the ten palettes mirrored in src/lib/theme/themes.ts. Change the default once and the whole app follows:
--color-primary: #183B32; /* brand forest (Zoven Signature) */ --color-background / --color-foreground --color-card / --color-muted / --color-border
The default palette is Zoven Signature - forest #183B32, leather #3D3028, sage #8FA892, oat canvas #E8E1D5, paper #FBF7EE. To add your own, append an entry to PALETTES; the picker, the CSS variables and the contrast gate all pick it up. Run npm run theme:check to verify every palette clears WCAG AA, and npm run theme:check also fails if global.css drifts from the default palette. The app is intentionally light-only.
Demo Data
All catalog content lives in plain TypeScript files - no database:
| File | Contents |
|---|---|
src/lib/data/products/* | 272 products with colour/size options, variants, prices, stock and badges |
src/lib/data/categories.ts | 39 categories (root / sub / child tree) |
src/lib/data/brands.ts | 10 in-house labels (ZOVRA, VENZEL, ZENOVA, NOVEN, ZOVELLE, ENZORA, ZOVINE, ZENVOR, ZOVANI, VEZRA) |
src/lib/data/offers.ts, stories.ts, lookbook.ts | Offers, hero banners and lookbook stories. The fictional outlet fixtures are in src/lib/data/outlets.ts and served by the content mock handler; src/lib/data/fashionStores.ts supplies demo locations for product availability. |
src/lib/data/sizeCharts.ts, fitFinder.ts | Size charts and the fit-finder recommender |
src/lib/data/loyalty.ts, giftCards.ts, mockCommerce.ts | Loyalty reward and gift-card catalog fixtures (served through the content adapter), plus mock commerce fixtures |
src/lib/data/notifications.ts, returns.ts, orderTimeline.ts | Notification feed, return reasons, tracking timeline |
src/services/mock/db.ts | In-memory mock database assembled from categories, brands and products, with product/category/brand relations joined for API responses. Users, orders and coupons are handled in separate mock handlers or stores. |
src/config/homeSections.ts | Which categories appear in which home section |
After editing data, run npm run verify - it checks that every reference (product variants, category slugs, offer/story products, asset paths) still resolves.
Translations
- Translation files:
src/lib/locales/*.ts(en, bn, ar, es, ja, hi, fr, de, ru, pt). - English is complete; the other nine ship a translated core, with missing keys falling back to English. Add the missing keys to reach full coverage.
- Register a new language in
src/lib/i18n.tsand add its flag tosrc/assets/icons/flags. - RTL languages (Arabic) flip layout direction automatically.
- Language switching is live and persisted.
Currency
Add or remove currencies in src/store/currencyStore.ts (code, symbol, locale, sample rate). All prices format through useFormatCurrency, so a new currency applies everywhere at once. Rates in the demo are sample values - fetch production rates from a trusted service and keep prices in a single server-side base currency.
Backend Integration
All server-owned app data follows one adapter path. The bundled demo uses mock handlers and mock persistence; connecting your server does not require screen-by-screen data-source changes.
- Set
EXPO_PUBLIC_API_BASE_URLto your API URL. - Implement the typed request and response contracts in
src/services/api/*. These cover catalog and content, authentication initiation, addresses, payment methods, favorites, reviews, delivery and tax quotes, order reads/writes, and other server resources. - Implement the generic customer-state contract:
GET /me/state/{resource}/{key}returns{ "value": string | null };PUTaccepts{ "value": "<serialized Zustand state>" };DELETEremoves the key. Authenticate and scope every request to the current customer. - Set
EXPO_PUBLIC_USE_MOCK_API=false. Resource adapters and the Zustand storage bridge then send their calls to your server. Mock mode remains the default for the offline preview.
The server must validate prices, stock, discounts, tax quotes, gift-card balances, payment state and order totals. Coupon validation and gift-card balance operations have dedicated resource endpoints. Generic customer-state snapshots provide a convenient integration contract for UI-kit feature state; a production commerce backend can replace the generic snapshots with normalized resource APIs, but you should review the mock-mode feature seeds and static presentation content before claiming all screens are server-driven. Password recovery/verification, guest/social login and AI widgets are demos and require provider-specific implementation before production.
Auth headers are attached by the Axios client in src/services/apiClient.ts. Keep map providers configured with appropriate production credentials and usage policies.
Map Providers
Maps are Leaflet + raster tiles inside a WebView. Provider attribution is enabled on every map (required by the providers' terms). Pick a provider in .env:
| Provider | Key | Notes |
|---|---|---|
osm (default) | none | OpenStreetMap tiles - community server, demo use only |
maptiler | EXPO_PUBLIC_MAPTILER_KEY | Falls back to OSM if the key is missing |
Before going live, configure your own production providers. The defaults are public community services whose policies only cover light/demo traffic:
- Tiles: use your own MapTiler key or another tile host - see the OSM tile usage policy: operations.osmfoundation.org/policies/tiles
- Routing: the public OSRM demo server is not for production - self-host OSRM or use a commercial routing API
- Geocoding: the public Photon and BigDataCloud services are used by the address picker as demo defaults. Review their usage policies and configure providers you are authorized to use, or self-host/use a commercial geocoder.
Provider config lives in src/lib/mapConfig.ts; the Leaflet HTML is built in src/components/maps/leafletMapHtml.ts and the address map in src/screens/addresses/components/addressMapHtml.ts. Google Maps would require the native react-native-maps/expo-maps module plus a billing-enabled API key - the map logic is isolated in a single component, so the swap stays contained.
Quality Checks
npm run lint # ESLint (expo config) npm test # dependency-free smoke tests npm run verify # data + navigation integrity checks npm run theme:check # WCAG AA contrast of every palette npx tsc --noEmit # TypeScript npx expo-doctor # Expo SDK / dependency validation
npm test covers the search matcher, variant pricing, coupon math (percentage, fixed, caps, minimums), order totals (including gift wrap and gift cards), size-chart integrity, the fit-finder recommender and loyalty tier maths. npm run verify validates order seed items, home-section slugs, offer/story references, every asset require() target on disk, and every static navigation target against the route table. npm run theme:check measures every palette against WCAG AA and fails if global.css drifts from the default palette.
Demo Data Reference
- Login: demo@zoven.com / Demo@123, or phone +880 1712 345678 / Demo@123. Password login signs in directly; the One-time-code tab uses OTP 123456.
- Addresses: five saved demo addresses across Greenfield, Fairview, Northvale, Lakeshore and Stonebridge
- Orders: seeded history with varied statuses plus live tracking timelines
- Coupons: WELCOME10 (10% off, min $100, max $30), FLAT25 ($25 off, min $150), SAVE8 ($8 off, min $120) and SAVE50 ($50 off, min $400)
- Gift card: ZOVEN-DEMO-25 ($25 demo balance), or buy a card from the Gift Cards screen
- Returns & requests: sample entries in every status
- Shopping lists: pre-filled demo lists with to-buy and purchased items
- Loyalty: Silver / Gold / Platinum tiers with sample points
- Notifications: order, promo and system entries with unread states
Troubleshooting
| Symptom | Fix |
|---|---|
| Images look stale or missing after replacing assets | Restart with a cleared cache: npx expo start -c |
| Image cropped on one screen | Export at the placeholder's exact dimensions / ratio - several bands size themselves from the artwork, so a matching ratio is never cropped. |
| Ripple not visible on a button | The ripple sits behind opaque content on image/solid buttons; the pressed dim still shows. Circular ripples apply to square/round buttons automatically. |
| Local release build uses the wrong package name | Run npx expo prebuild --clean after changing app.json, then rebuild. |
| EAS asks for a keystore | Let EAS generate one (recommended) or supply your own for store releases. |
| EAS asks for a project | Run eas init to create a project under your account; the template intentionally ships without an owner or project id. |
| Map tiles blank | Check EXPO_PUBLIC_MAP_PROVIDER; maptiler without a key falls back to OSM automatically. |
| Untranslated text in a non-English locale | All shipped UI keys are present in every locale. If you add a new key, add it to src/lib/locales/*.ts; until then it falls back to English. |
Source & Credits
Built with open-source software. Main libraries and their licenses:
- Expo / React Native - MIT
- Expo Router - MIT
- NativeWind - MIT
- Zustand - MIT
- TanStack React Query - MIT
- i18next / react-i18next - MIT
- react-hook-form / Zod - MIT
- react-native-reanimated / gesture-handler - MIT
- Leaflet - BSD-2-Clause; map data © OpenStreetMap contributors
- Lucide icons - ISC
Demo catalog text, brand names (ZOVRA, VENZEL, ZENOVA ...), outlet names, addresses, coordinates and imagery are fictional placeholders created for this kit and are not affiliated with any real company or retail location.
Version Log
- v1.0.0 (10 Nov 2026) - Initial release: 78 screens / 80 routes (5 system, 10 auth & legal, 17 discovery, 4 cart & checkout, 7 orders & after-sales, 24 account & settings, 4 AI, 7 policy pages), full shopping + checkout + orders + tracking + returns & exchanges + product requests + shopping lists + gift cards + loyalty + AI demo, 10 palettes, 22 stores, 10 selectable locales with complete UI key coverage, 20 currencies, mock API layer, Leaflet maps, EAS profiles.
Support
Questions, bug reports or feature requests? Get in touch:
Author: MKTemplateWizard
Email: khanmonir1335@gmail.com
Portfolio: codecanyon.net/user/mktemplatewizard/portfolio
Theme Color: #183B32 (Primary) - see src/global.css --color-primary
We typically respond within 24 hours (6 months support included, extendable to 12 months).
Thank you for choosing ZOVEN.