Files
orion/docs/frontend/storefront/navigation-flow.md
Samir Boulahtit 7245f79f7b refactor: rename shop to storefront for consistency
Rename all "shop" directories and references to "storefront" to match
the API and route naming convention already in use.

Renamed directories:
- app/templates/shop/ → app/templates/storefront/
- static/shop/ → static/storefront/
- app/templates/shared/macros/shop/ → .../macros/storefront/
- docs/frontend/shop/ → docs/frontend/storefront/

Renamed files:
- shop.css → storefront.css
- shop-layout.js → storefront-layout.js

Updated references in:
- app/routes/storefront_pages.py (21 template references)
- app/modules/cms/routes/pages/vendor.py
- app/templates/storefront/base.html (static paths)
- All storefront templates (extends/includes)
- docs/architecture/frontend-structure.md

This aligns the template/static naming with:
- Route file: storefront_pages.py
- API directory: app/api/v1/storefront/
- Module routes: */routes/api/storefront.py
- URL paths: /storefront/*

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 22:58:28 +01:00

9.6 KiB

Shop Navigation Flow

Complete guide to navigation structure and URL hierarchy with landing pages.

URL Hierarchy

/ (Vendor Root)                    → Landing Page (if exists) OR redirect to /shop/
├── /shop/                         → E-commerce Homepage (Product Catalog)
│   ├── /shop/products             → Product Catalog (same as /shop/)
│   ├── /shop/products/{id}        → Product Detail Page
│   ├── /shop/cart                 → Shopping Cart
│   ├── /shop/checkout             → Checkout Process
│   ├── /shop/account/login        → Customer Login
│   ├── /shop/account/register     → Customer Registration
│   ├── /shop/account/dashboard    → Customer Dashboard (auth required)
│   ├── /shop/about                → CMS Content Page
│   ├── /shop/contact              → CMS Content Page
│   └── /shop/{slug}               → Other CMS Pages

Navigation Patterns

URL Structure:

customdomain.com/              → Landing Page (marketing/brand)
customdomain.com/shop/         → E-commerce Shop
customdomain.com/shop/products → Product Catalog

Navigation Flow:

  1. User visits vendor domain → Landing Page
  2. Clicks "Shop Now" → /shop/ (product catalog)
  3. Clicks "Home" in breadcrumb → / (back to landing page)
  4. Clicks logo → / (back to landing page)

Breadcrumb Example (on Products page):

Home > Products
 ↓
 / (Landing Page)

Pattern 2: Without Landing Page (Auto-Redirect)

URL Structure:

customdomain.com/              → Redirects to /shop/
customdomain.com/shop/         → E-commerce Shop
customdomain.com/shop/products → Product Catalog

Navigation Flow:

  1. User visits vendor domain → Redirects to /shop/
  2. User browses shop
  3. Clicks "Home" in breadcrumb → / (redirects to /shop/)
  4. Clicks logo → / (redirects to /shop/)

Breadcrumb Example (on Products page):

Home > Products
 ↓
 / → /shop/ (redirects)

Base URL Calculation

The base_url variable is calculated in shop_pages.py:get_shop_context():

# For domain/subdomain access
base_url = "/"
# Result: /shop/products, /shop/cart, etc.

# For path-based access
base_url = "/vendors/wizamart/"
# Result: /vendors/wizamart/shop/products, /vendors/wizamart/shop/cart, etc.

Logo / Home Link (Header):

{# Points to vendor root (landing page or shop) #}
<a href="{{ base_url }}shop/">{{ vendor.name }}</a>

Breadcrumb Home Link:

{# Points to vendor root (landing page) #}
<a href="{{ base_url }}">Home</a>

Shop Links:

{# All shop pages include /shop/ prefix #}
<a href="{{ base_url }}shop/products">Products</a>
<a href="{{ base_url }}shop/cart">Cart</a>
<a href="{{ base_url }}shop/checkout">Checkout</a>

CMS Page Links:

{# CMS pages are under /shop/ #}
<a href="{{ base_url }}shop/about">About</a>
<a href="{{ base_url }}shop/contact">Contact</a>
<a href="{{ base_url }}shop/{{ page.slug }}">{{ page.title }}</a>

Complete URL Examples

Path-Based Access (Development)

http://localhost:8000/vendors/wizamart/
├── / (root)                              → Landing Page OR redirect to shop
├── /shop/                                → Shop Homepage
├── /shop/products                        → Product Catalog
├── /shop/products/4                      → Product Detail
├── /shop/cart                            → Shopping Cart
├── /shop/checkout                        → Checkout
├── /shop/account/login                   → Customer Login
├── /shop/about                           → About Page (CMS)
└── /shop/contact                         → Contact Page (CMS)

Subdomain Access (Production)

https://wizamart.platform.com/
├── / (root)                              → Landing Page OR redirect to shop
├── /shop/                                → Shop Homepage
├── /shop/products                        → Product Catalog
├── /shop/products/4                      → Product Detail
├── /shop/cart                            → Shopping Cart
├── /shop/checkout                        → Checkout
├── /shop/account/login                   → Customer Login
├── /shop/about                           → About Page (CMS)
└── /shop/contact                         → Contact Page (CMS)

Custom Domain Access (Production)

https://customdomain.com/
├── / (root)                              → Landing Page OR redirect to shop
├── /shop/                                → Shop Homepage
├── /shop/products                        → Product Catalog
├── /shop/products/4                      → Product Detail
├── /shop/cart                            → Shopping Cart
├── /shop/checkout                        → Checkout
├── /shop/account/login                   → Customer Login
├── /shop/about                           → About Page (CMS)
└── /shop/contact                         → Contact Page (CMS)

User Journeys

Journey 1: First-Time Visitor (With Landing Page)

  1. Visit customdomain.com/Landing Page
    • Sees brand story, features, CTA
  2. Clicks "Shop Now" → /shop/Product Catalog
    • Browses products
  3. Clicks product → /shop/products/4Product Detail
    • Views product
  4. Clicks "Home" in breadcrumb → /Back to Landing Page
  5. Clicks logo → /Back to Landing Page

Journey 2: Returning Customer (Direct to Shop)

  1. Visit customdomain.com/shop/Product Catalog
    • Already knows the brand, goes straight to shop
  2. Adds to cart → /shop/cartShopping Cart
  3. Checkout → /shop/checkoutCheckout
  4. Clicks "Home" → /Landing Page (brand homepage)

Journey 3: Customer Account Management

  1. Visit customdomain.com/shop/account/loginLogin
  2. After login → /shop/account/dashboardDashboard
  3. View orders → /shop/account/ordersOrder History
  4. Clicks logo → /Back to Landing Page

Navigation Components

Header Navigation (base.html)

{# Logo - always points to vendor root #}
<a href="{{ base_url }}shop/">
    <img src="{{ theme.branding.logo }}" alt="{{ vendor.name }}">
</a>

{# Main Navigation #}
<nav>
    <a href="{{ base_url }}shop/">Home</a>
    <a href="{{ base_url }}shop/products">Products</a>
    <a href="{{ base_url }}shop/about">About</a>
    <a href="{{ base_url }}shop/contact">Contact</a>
</nav>

{# Actions #}
<a href="{{ base_url }}shop/cart">Cart</a>
<a href="{{ base_url }}shop/account">Account</a>
{# Quick Links #}
<a href="{{ base_url }}shop/products">Products</a>

{# CMS Pages (dynamic) #}
{% for page in footer_pages %}
<a href="{{ base_url }}shop/{{ page.slug }}">{{ page.title }}</a>
{% endfor %}

Breadcrumbs (products.html, content-page.html)

{# Points to vendor root (landing page) #}
<a href="{{ base_url }}">Home</a> / Products

Best Practices

DO:

  1. Use Landing Pages: Create engaging landing pages at vendor root
  2. Clear Navigation: Make it easy to get from landing to shop and back
  3. Consistent "Home": Logo and "Home" breadcrumb both point to / (landing)
  4. Shop Links: All shop-related links include /shop/ prefix
  5. CMS Under Shop: Keep CMS pages under /shop/ for consistency

DON'T:

  1. Hardcode URLs: Always use {{ base_url }} for vendor-aware links
  2. Skip /shop/: Don't link directly to /products, use /shop/products
  3. Mix Landing & Shop: Keep landing page separate from shop catalog
  4. Forget Breadcrumbs: Always provide "Home" link to go back

Migration Notes

Before Landing Pages

All links pointed to /shop/:

<a href="{{ base_url }}shop/">Home</a>  {# Logo #}
<a href="{{ base_url }}shop/">Home</a>  {# Breadcrumb #}

After Landing Pages

Separation of concerns:

<a href="{{ base_url }}shop/">Home</a>  {# Logo - still goes to shop #}
<a href="{{ base_url }}">Home</a>       {# Breadcrumb - goes to landing #}

This allows:

  • Landing page at / for marketing/branding
  • Shop catalog at /shop/ for e-commerce
  • Clean navigation between the two

Technical Implementation

Route Handlers (main.py)

# Vendor root - serves landing page or redirects to shop
@app.get("/")
@app.get("/vendors/{vendor_code}/")
async def root(request: Request):
    if has_landing_page():
        return render_landing_page()
    else:
        return redirect_to_shop()

# Shop routes
@app.include_router(shop_pages.router, prefix="/shop")
@app.include_router(shop_pages.router, prefix="/vendors/{vendor_code}/shop")

Context Calculation (shop_pages.py)

def get_shop_context(request: Request):
    base_url = "/"
    if access_method == "path":
        base_url = f"/vendors/{vendor.subdomain}/"

    return {
        "base_url": base_url,
        "vendor": vendor,
        "theme": theme,
        # ...
    }

Summary

The navigation system creates a two-tier structure:

  1. Landing Page (/) - Marketing, branding, vendor story
  2. Shop (/shop/) - E-commerce, products, cart, checkout

This gives vendors flexibility to:

  • Have a marketing homepage separate from their store
  • Choose different landing page designs (minimal, modern, full)
  • Or skip the landing page and go straight to the shop

All while maintaining clean, consistent navigation throughout the experience.