Files
nick-doc/Multi-Surface Feature Parity Guide.md
2026-06-15 22:03:18 +03:30

9.7 KiB

Multi-Surface Feature Parity Guide

Rule source: AGENTS.md §8 — every feature change must be evaluated against all 4 surfaces and ported where an equivalent exists.


The 4 surfaces at a glance

/dashboard/seller/*          → Seller Dashboard
/dashboard/request-template/* → Seller Dashboard (product/template management)
/dashboard/shop-settings/*   → Seller Dashboard (shop branding & settings)

/shop/*                      → Platform Marketplace (public)
/dashboard/shops/*           → Platform Marketplace (buyer logged-in)

/dashboard/shop/[slug]/*     → White-label Shop Platform (tenant admin)
/store/*                     → White-label Shop Platform (public storefront)

/telegram/*                  → Telegram Mini App

Surface primitives — never mix

Seller Dashboard + Platform Marketplace

Both share the same layout and component system.

Concern Primitive
Layout DashboardContent, Card, CustomBreadcrumbs (MUI)
Styling MUI sx + theme.vars.palette.* — no hex colors (see rule §1)
Strings useTranslate()src/locales/langs/en/common.json + fa/common.json
Data useSWR + src/actions/*.ts hooks
Components MUI + src/components/*

White-label Shop Platform

Uses the same MUI/SWR stack but a different layout shell.

Concern Primitive
Layout ShopDashboardLayout (src/sections/shop/shop-dashboard-layout.tsx) for admin; StorefrontLayout (src/sections/storefront/storefront-layout.tsx) for public
Sections src/sections/shop/shop-*.tsx, src/sections/storefront/storefront-*.tsx
Strings Same useTranslate()common.json
Data Same src/actions/*.tsreuse actions, don't duplicate

Telegram Mini App

Completely different design system — never import MUI here.

Concern Primitive
Layout Full-bleed mobile, TelegramTabBar, bottom-sheets
Styling TG_PALETTE CSS vars (var(--tg-saffron-600), var(--tg-ink-700), etc.) via inline style={{}}
Strings t prop typed as TelegramDict — add to locales/en.ts + locales/fa.ts + declare in locales/types.ts
Data src/sections/telegram/hooks/use-telegram-*.ts (wrap the same src/actions/*.ts calls)
Components src/sections/telegram/components/telegram-*.tsx only

Feature → surface mapping

Legend: full ⚠️ partial (read/display only) not present 🔮 planned

Product Templates (کالا)

Feature Seller Dash Platform White-label Mini App
Create / edit template request-template-create/edit-view
Template list (my products) request-template-list-view shop-catalog-view
Template detail (buyer) request-template-shop-details-view storefront-item-view telegram-template-detail-view
Browse all templates public-shops-view storefront-catalog-view telegram-shop-view

Collections (مجموعه)

Feature Seller Dash Platform White-label Mini App
Create / edit collection seller-collections-new-edit-form
Browse by collection 🔮 🔮 🔮
Collection detail (buyer) 🔮 🔮 🔮

Shop / Seller Profile

Feature Seller Dash Platform White-label Mini App
My shop overview ⚠️ shop-settings/* shop-overview-view
Public shop page public-seller-shop-view, seller-profile-view storefront-catalog-view telegram-seller-shop-view
Shop branding / settings shop-settings/ shop-settings-view
Shop admins shop-admins-view

Requests (درخواست‌ها)

Feature Seller Dash Platform White-label Mini App
Request list (seller side) seller/marketplace shop-orders-view telegram-requests-view
Request list (buyer side) /dashboard/request telegram-requests-view
Request detail telegram-request-detail-view
Create new request /dashboard/request/new telegram-new-request-view
Request from template /dashboard/request/from-template
Archived requests telegram-archived-requests-view

Chat

Feature Seller Dash Platform White-label Mini App
Chat list /dashboard/chat telegram-chat-view
Chat thread telegram-chat-thread-view
Archived chats telegram-archived-chats-view

Analytics & Reporting

Feature Seller Dash Platform White-label Mini App
Analytics dashboard seller-analytics-view shop-overview-view
Home stats summary telegram-home-stats

Inventory

Feature Seller Dash Platform White-label Mini App
Inventory list inventory-list-view shop-inventory-view
Inventory detail inventory-detail-view ⚠️

Customers & Reviews

Feature Seller Dash Platform White-label Mini App
Customer list seller-customers-view shop-customers-view
Reviews seller-reviews-view

Payments & Wallet

Feature Seller Dash Platform White-label Mini App
Cart /dashboard/shops/checkout /store/checkout telegram-cart-view
Checkout request-template-checkout-view telegram-checkout-view
Payment flow telegram-payment-view
Payment history telegram-payment-history-view
Wallet /dashboard/account/wallet telegram-wallet-view

Account & Profile

Feature Seller Dash Platform White-label Mini App
Profile settings /dashboard/account telegram-account-view
Delivery addresses /dashboard/account/address telegram-addresses-view
Notifications settings telegram-notifications-view
Passkey / security

Other

Feature Seller Dash Platform White-label Mini App
AI Assist /dashboard/assist telegram-settings-view (assist tab)
Points / loyalty /dashboard/points telegram-points-view
Disputes /dashboard/disputes
Posts / blog /dashboard/post /post
Dynamic pricing (admin)

Porting recipes by change type

Text / copy change

  1. Update en/common.json + fa/common.json (covers Seller Dash, Platform, White-label).
  2. Find the matching key in src/sections/telegram/locales/types.ts → update locales/en.ts + locales/fa.ts.
  3. If key doesn't exist in Mini App yet: declare it in TelegramDict (types.ts) first.

New field displayed on an entity card/row

  1. Find every view that renders that entity (use mapping table above).
  2. Add the field to each view using that surface's primitives — no MUI inside telegram, no TG_PALETTE outside it.
  3. Add locale strings for every surface involved.

New status / enum value

  1. Update TG_REQUEST_STATUS_VARIANT or TG_ESCROW_STATE_CHIPS in src/sections/telegram/constants.ts.
  2. Update the corresponding color/label map in src/sections/request/constants.ts (used by Seller Dash + Platform).
  3. Add the label string to all locale files.
  4. Check shop-orders-view.tsx for any inline status chip that also needs updating.

New API field on a shared type

  1. Update the type in src/types/*.ts.
  2. Update src/actions/*.ts — the normalization function that maps API responses to the type.
  3. All 4 surfaces reuse the same types and actions — they get the field for free once it's in the type.
  4. Decide per surface whether to display it (add UI) or just carry it silently.

Platform has a feature Seller Dashboard is missing

Platform (/shop/*) was built later and has richer discovery, cart, and public browsing. If Platform adds something that would benefit sellers too (e.g. a filter, a sort option, a field on a product card), evaluate adding it to the Seller Dashboard equivalent view in the same PR.


What's intentionally surface-specific (do NOT port)

Feature Where only Why
Template CRUD (create/edit) Seller Dashboard Sellers create products; buyers only view
Collection CRUD Seller Dashboard Sellers organize; buyers browse (future)
Shop admins management White-label only Multi-admin is a tenant feature
Admin dashboard (networks, trezor, thresholds, AML) Dashboard /admin/* Platform operator only
Haptic feedback Mini App only Telegram Web App SDK, no equivalent on web
TG_PALETTE dark/light toggle Mini App only Uses Telegram's native color scheme
Tenant slug routing [tenantSlug] White-label only Multi-tenant feature

Checklist before merging

  • Identified which surface(s) the change affects
  • Checked all 3 other surfaces against the mapping table
  • Ported to every surface with a full or partial equivalent
  • Used each surface's own primitives (no cross-contamination)
  • Added locale strings to all surfaces involved (both fa + en)
  • PR description names every surface updated — and explicitly names any surface skipped