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
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/*.ts — reuse 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
- Update
en/common.json + fa/common.json (covers Seller Dash, Platform, White-label).
- Find the matching key in
src/sections/telegram/locales/types.ts → update locales/en.ts + locales/fa.ts.
- If key doesn't exist in Mini App yet: declare it in
TelegramDict (types.ts) first.
New field displayed on an entity card/row
- Find every view that renders that entity (use mapping table above).
- Add the field to each view using that surface's primitives — no MUI inside telegram, no TG_PALETTE outside it.
- Add locale strings for every surface involved.
New status / enum value
- Update
TG_REQUEST_STATUS_VARIANT or TG_ESCROW_STATE_CHIPS in src/sections/telegram/constants.ts.
- Update the corresponding color/label map in
src/sections/request/constants.ts (used by Seller Dash + Platform).
- Add the label string to all locale files.
- Check
shop-orders-view.tsx for any inline status chip that also needs updating.
New API field on a shared type
- Update the type in
src/types/*.ts.
- Update
src/actions/*.ts — the normalization function that maps API responses to the type.
- All 4 surfaces reuse the same types and actions — they get the field for free once it's in the type.
- 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