@mohasinac/appkit 2.7.50 → 2.7.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.d.ts +1 -0
  2. package/dist/_internal/server/jobs/core/__tests__/couponExpiry.test.js +65 -0
  3. package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.d.ts +1 -0
  4. package/dist/_internal/server/jobs/core/__tests__/listingProcessor.test.js +163 -0
  5. package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.d.ts +1 -0
  6. package/dist/_internal/server/jobs/core/__tests__/mediaTmpCleanup.test.js +115 -0
  7. package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.d.ts +1 -0
  8. package/dist/_internal/server/jobs/core/__tests__/pendingOrderTimeout.test.js +96 -0
  9. package/dist/client.d.ts +29 -6
  10. package/dist/client.js +16 -4
  11. package/dist/constants/api-endpoints.d.ts +42 -0
  12. package/dist/constants/api-endpoints.js +14 -0
  13. package/dist/features/_guide-cls.d.ts +13 -0
  14. package/dist/features/_guide-cls.js +14 -0
  15. package/dist/features/about/components/HelpPageView.js +29 -26
  16. package/dist/features/account/components/BuyerAccountGuideView.d.ts +1 -0
  17. package/dist/features/account/components/BuyerAccountGuideView.js +39 -0
  18. package/dist/features/account/components/BuyerAuctionsGuideView.d.ts +1 -0
  19. package/dist/features/account/components/BuyerAuctionsGuideView.js +38 -0
  20. package/dist/features/account/components/BuyerOrdersGuideView.d.ts +1 -0
  21. package/dist/features/account/components/BuyerOrdersGuideView.js +48 -0
  22. package/dist/features/account/components/BuyerShoppingGuideView.d.ts +1 -0
  23. package/dist/features/account/components/BuyerShoppingGuideView.js +38 -0
  24. package/dist/features/admin/components/AdminAnalyticsGuideView.d.ts +1 -0
  25. package/dist/features/admin/components/AdminAnalyticsGuideView.js +24 -0
  26. package/dist/features/admin/components/AdminBlogEditorView.js +100 -77
  27. package/dist/features/admin/components/AdminBundleEditorView.js +20 -14
  28. package/dist/features/admin/components/AdminBundlesView.d.ts +1 -3
  29. package/dist/features/admin/components/AdminBundlesView.js +173 -52
  30. package/dist/features/admin/components/AdminCatalogGuideView.d.ts +1 -0
  31. package/dist/features/admin/components/AdminCatalogGuideView.js +28 -0
  32. package/dist/features/admin/components/AdminContentGuideView.d.ts +1 -0
  33. package/dist/features/admin/components/AdminContentGuideView.js +36 -0
  34. package/dist/features/admin/components/AdminCouponEditorView.js +1 -1
  35. package/dist/features/admin/components/AdminGuideHubView.d.ts +5 -0
  36. package/dist/features/admin/components/AdminGuideHubView.js +79 -0
  37. package/dist/features/admin/components/AdminOrdersGuideView.d.ts +1 -0
  38. package/dist/features/admin/components/AdminOrdersGuideView.js +44 -0
  39. package/dist/features/admin/components/AdminProductsView.js +8 -3
  40. package/dist/features/admin/components/AdminSiteConfigGuideView.d.ts +1 -0
  41. package/dist/features/admin/components/AdminSiteConfigGuideView.js +21 -0
  42. package/dist/features/admin/components/AdminStoresGuideView.d.ts +1 -0
  43. package/dist/features/admin/components/AdminStoresGuideView.js +32 -0
  44. package/dist/features/admin/components/AdminTeamGuideView.d.ts +1 -0
  45. package/dist/features/admin/components/AdminTeamGuideView.js +33 -0
  46. package/dist/features/admin/components/AdminTrustGuideView.d.ts +1 -0
  47. package/dist/features/admin/components/AdminTrustGuideView.js +40 -0
  48. package/dist/features/admin/components/AdminUsersGuideView.d.ts +1 -0
  49. package/dist/features/admin/components/AdminUsersGuideView.js +38 -0
  50. package/dist/features/categories/components/CategoryBundlesListing.js +3 -33
  51. package/dist/features/categories/components/index.d.ts +0 -2
  52. package/dist/features/categories/components/index.js +0 -1
  53. package/dist/features/events/components/AdminEventEditorView.js +223 -269
  54. package/dist/features/grouped/repository/grouped-listings.repository.d.ts +9 -0
  55. package/dist/features/grouped/repository/grouped-listings.repository.js +12 -0
  56. package/dist/features/media/upload/MediaUploadField.js +1 -1
  57. package/dist/features/pre-orders/components/PreOrdersIndexListing.js +3 -1
  58. package/dist/features/products/components/AuctionsIndexListing.js +3 -1
  59. package/dist/features/products/components/MarketplaceBundleCard.d.ts +21 -0
  60. package/dist/features/products/components/MarketplaceBundleCard.js +56 -0
  61. package/dist/features/products/components/ProductsIndexListing.js +3 -1
  62. package/dist/features/products/components/index.d.ts +2 -4
  63. package/dist/features/products/components/index.js +1 -2
  64. package/dist/features/promotions/schemas/firestore.js +1 -1
  65. package/dist/features/reviews/components/index.d.ts +0 -2
  66. package/dist/features/reviews/components/index.js +0 -1
  67. package/dist/features/seller/components/BrandInlineSelect.js +23 -3
  68. package/dist/features/seller/components/CategoryInlineSelect.js +20 -3
  69. package/dist/features/seller/components/SellerAnalyticsAlertsView.d.ts +6 -0
  70. package/dist/features/seller/components/SellerAnalyticsAlertsView.js +124 -0
  71. package/dist/features/seller/components/SellerAnalyticsView.d.ts +2 -0
  72. package/dist/features/seller/components/SellerAnalyticsView.js +17 -9
  73. package/dist/features/seller/components/SellerBundlesView.d.ts +5 -0
  74. package/dist/features/seller/components/SellerBundlesView.js +104 -0
  75. package/dist/features/seller/components/SellerClassifiedView.d.ts +5 -0
  76. package/dist/features/seller/components/SellerClassifiedView.js +113 -0
  77. package/dist/features/seller/components/SellerDashboardView.js +19 -7
  78. package/dist/features/seller/components/SellerDigitalCodesView.d.ts +5 -0
  79. package/dist/features/seller/components/SellerDigitalCodesView.js +115 -0
  80. package/dist/features/seller/components/SellerGoogleReviewsView.d.ts +14 -0
  81. package/dist/features/seller/components/SellerGoogleReviewsView.js +95 -0
  82. package/dist/features/seller/components/SellerGroupedListingsView.d.ts +6 -0
  83. package/dist/features/seller/components/SellerGroupedListingsView.js +112 -0
  84. package/dist/features/seller/components/SellerLiveView.d.ts +5 -0
  85. package/dist/features/seller/components/SellerLiveView.js +113 -0
  86. package/dist/features/seller/components/SellerOrdersView.js +18 -2
  87. package/dist/features/seller/components/SellerPayoutMethodsView.d.ts +7 -0
  88. package/dist/features/seller/components/SellerPayoutMethodsView.js +120 -0
  89. package/dist/features/seller/components/SellerPayoutSettingsView.js +50 -12
  90. package/dist/features/seller/components/SellerProductShell.d.ts +1 -1
  91. package/dist/features/seller/components/SellerProductShell.js +9 -7
  92. package/dist/features/seller/components/SellerProductsFilterDrawer.js +3 -1
  93. package/dist/features/seller/components/SellerProductsView.js +48 -54
  94. package/dist/features/seller/components/SellerShippingConfigsView.d.ts +7 -0
  95. package/dist/features/seller/components/SellerShippingConfigsView.js +149 -0
  96. package/dist/features/seller/components/SellerShippingView.js +37 -10
  97. package/dist/features/seller/components/SellerStoreCategoriesView.d.ts +9 -0
  98. package/dist/features/seller/components/SellerStoreCategoriesView.js +122 -0
  99. package/dist/features/seller/components/SellerStorefrontView.d.ts +0 -7
  100. package/dist/features/seller/components/SellerStorefrontView.js +26 -29
  101. package/dist/features/seller/components/SellerTemplatesView.d.ts +10 -0
  102. package/dist/features/seller/components/SellerTemplatesView.js +265 -0
  103. package/dist/features/seller/components/index.d.ts +26 -0
  104. package/dist/features/seller/components/index.js +13 -0
  105. package/dist/features/stores/api/[storeSlug]/reviews/route.js +49 -7
  106. package/dist/features/stores/components/StoreCapabilitiesGuideView.d.ts +3 -0
  107. package/dist/features/stores/components/StoreCapabilitiesGuideView.js +101 -0
  108. package/dist/features/stores/components/StoreFinanceGuideView.d.ts +3 -0
  109. package/dist/features/stores/components/StoreFinanceGuideView.js +79 -0
  110. package/dist/features/stores/components/StoreGuideHubView.d.ts +5 -0
  111. package/dist/features/stores/components/StoreGuideHubView.js +89 -0
  112. package/dist/features/stores/components/StoreListingsGuideView.d.ts +3 -0
  113. package/dist/features/stores/components/StoreListingsGuideView.js +151 -0
  114. package/dist/features/stores/components/StoreOrdersGuideView.d.ts +3 -0
  115. package/dist/features/stores/components/StoreOrdersGuideView.js +122 -0
  116. package/dist/features/stores/components/StoreReviewsListing.js +100 -23
  117. package/dist/features/stores/components/StoreSettingsGuideView.d.ts +3 -0
  118. package/dist/features/stores/components/StoreSettingsGuideView.js +56 -0
  119. package/dist/features/stores/components/index.d.ts +12 -1
  120. package/dist/features/stores/components/index.js +6 -1
  121. package/dist/features/stores/hooks/useStores.d.ts +5 -0
  122. package/dist/features/stores/hooks/useStores.js +10 -0
  123. package/dist/features/stores/manifest.js +1 -1
  124. package/dist/features/whatsapp-bot/components/SellerWhatsAppSettingsView.js +13 -2
  125. package/dist/index.d.ts +54 -9
  126. package/dist/index.js +58 -15
  127. package/dist/next/routing/route-map.d.ts +55 -0
  128. package/dist/next/routing/route-map.js +25 -0
  129. package/dist/providers/db-firebase/__tests__/filter-aliases.test.d.ts +1 -0
  130. package/dist/providers/db-firebase/__tests__/filter-aliases.test.js +93 -0
  131. package/dist/providers/db-firebase/sieve.d.ts +49 -0
  132. package/dist/providers/db-firebase/sieve.js +61 -8
  133. package/dist/repositories/index.d.ts +1 -0
  134. package/dist/repositories/index.js +2 -0
  135. package/dist/tailwind-utilities.css +1 -1
  136. package/dist/ui/components/ListingToolbar.d.ts +8 -1
  137. package/dist/ui/components/ListingToolbar.js +4 -2
  138. package/dist/ui/components/__tests__/BulkActionBar.test.d.ts +1 -0
  139. package/dist/ui/components/__tests__/BulkActionBar.test.js +96 -0
  140. package/dist/ui/components/__tests__/ListingToolbar.test.d.ts +1 -0
  141. package/dist/ui/components/__tests__/ListingToolbar.test.js +125 -0
  142. package/dist/ui/index.d.ts +1 -1
  143. package/package.json +8 -2
@@ -0,0 +1,101 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowLeft } from "lucide-react";
3
+ import { Alert, Div, Heading, Section, Text } from "../../../ui";
4
+ import { ROUTES } from "../../../next/routing/route-map";
5
+ const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
6
+ const LIST_DISC = "list-disc leading-relaxed";
7
+ const SECTION_BODY = "space-y-4 text-sm text-[var(--appkit-color-text-muted)]";
8
+ // -- Section wrapper -----------------------------------------------------------
9
+ function GuideSection({ title, children, }) {
10
+ return (_jsxs(Section, { className: "rounded-xl border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] p-6 shadow-sm", children: [_jsx(Heading, { level: 2, className: "mb-4 text-lg font-semibold text-[var(--appkit-color-text)]", children: title }), children] }));
11
+ }
12
+ // -- Section 1: What are capabilities -----------------------------------------
13
+ function WhatAreCapabilitiesSection() {
14
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsx(Text, { className: "leading-relaxed", children: "Capabilities are per-store feature flags granted by the LetItRip team. They are not self-serve \u2014 they must be requested and approved. This gives LetItRip control over trust, quality, and platform safety as your store grows." }), _jsxs(Text, { className: "leading-relaxed", children: ["Two capabilities are enabled for every store at creation by default:", _jsx("code", { className: "text-xs bg-[var(--appkit-color-border)] px-1 rounded mx-1", children: "suggest_brands" }), " and", _jsx("code", { className: "text-xs bg-[var(--appkit-color-border)] px-1 rounded mx-1", children: "create_coupons" }), ". All others must be requested. Some require contractual agreements before they can be granted."] })] }));
15
+ }
16
+ // -- Section 2: Capability table ----------------------------------------------
17
+ const CAPABILITY_GROUPS = [
18
+ {
19
+ group: "Listing & Catalog",
20
+ items: [
21
+ { cap: "host_auctions", unlocks: "Create auction listings on your store.", defaultOn: false },
22
+ { cap: "host_preorders", unlocks: "Create pre-order listings with deposit collection.", defaultOn: false },
23
+ { cap: "create_categories", unlocks: "Request new product categories (goes to admin review).", defaultOn: false },
24
+ { cap: "suggest_brands", unlocks: "Suggest new brands for the platform catalogue.", defaultOn: true },
25
+ { cap: "create_coupons", unlocks: "Create store-level discount coupons.", defaultOn: true },
26
+ { cap: "bulk_listing_import", unlocks: "Import products in bulk via CSV upload.", defaultOn: false },
27
+ { cap: "extended_return_window", unlocks: "Offer buyers a 30-day return window (platform default: 7 days).", defaultOn: false },
28
+ ],
29
+ },
30
+ {
31
+ group: "Trust & Visibility",
32
+ items: [
33
+ { cap: "verified_seller", unlocks: "Shows a Verified badge on your store profile and listing cards.", defaultOn: false },
34
+ { cap: "featured_placement", unlocks: "Your store is eligible to appear in featured store sections on the homepage.", defaultOn: false },
35
+ { cap: "promotional_banner", unlocks: "Your store banner can be used in carousel and promotional homepage sections.", defaultOn: false },
36
+ { cap: "priority_support", unlocks: "Your support tickets go to a dedicated queue with faster response SLA.", defaultOn: false },
37
+ ],
38
+ },
39
+ {
40
+ group: "Platform & Technical",
41
+ items: [
42
+ { cap: "multiple_stores", unlocks: "You (same owner) can create more than one store on LetItRip.", defaultOn: false },
43
+ { cap: "custom_store_slug", unlocks: "Change your store URL slug after the 7-day post-creation lock period.", defaultOn: false },
44
+ { cap: "api_access", unlocks: "Programmatic API credentials for advanced integrations (future).", defaultOn: false },
45
+ { cap: "lower_commission_rate", unlocks: "Negotiated reduced platform fee. Requires a signed agreement and minimum volume.", defaultOn: false },
46
+ { cap: "early_access_features", unlocks: "Access to beta features before they are publicly available.", defaultOn: false },
47
+ { cap: "advanced_analytics", unlocks: "Cohort retention, basket analysis, and top-buyer breakdown (beyond summary stats).", defaultOn: false },
48
+ { cap: "whatsapp_catalog_sync", unlocks: "Sync your store products to your WhatsApp Business Catalog automatically.", defaultOn: false },
49
+ ],
50
+ },
51
+ ];
52
+ function CapabilityTable() {
53
+ return (_jsx(Div, { className: "space-y-6", children: CAPABILITY_GROUPS.map(({ group, items }) => (_jsxs(Div, { children: [_jsx(Text, { className: "text-xs font-semibold uppercase tracking-wide text-[var(--appkit-color-text-muted)] mb-2", children: group }), _jsx(Div, { className: "overflow-x-auto -mx-6", children: _jsxs("table", { className: "min-w-full text-sm", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-[var(--appkit-color-border)]", children: [_jsx("th", { className: "px-6 py-2 text-left font-semibold text-[var(--appkit-color-text)]", children: "Capability" }), _jsx("th", { className: "px-6 py-2 text-left font-semibold text-[var(--appkit-color-text)]", children: "What it unlocks" }), _jsx("th", { className: "px-6 py-2 text-left font-semibold text-[var(--appkit-color-text)] w-24", children: "Default" })] }) }), _jsx("tbody", { className: "divide-y divide-[var(--appkit-color-border)]", children: items.map(({ cap, unlocks, defaultOn }) => (_jsxs("tr", { children: [_jsx("td", { className: "px-6 py-2 font-mono text-xs text-[var(--appkit-color-text)] align-top whitespace-nowrap", children: cap }), _jsx("td", { className: "px-6 py-2 text-[var(--appkit-color-text-muted)] align-top", children: unlocks }), _jsx("td", { className: "px-6 py-2 align-top", children: defaultOn ? (_jsx("span", { className: "inline-block rounded-full bg-[var(--appkit-color-success,#16a34a)]/10 text-[var(--appkit-color-success,#16a34a)] text-xs px-2 py-0.5 font-medium", children: "On" })) : (_jsx("span", { className: "inline-block rounded-full bg-[var(--appkit-color-border)] text-[var(--appkit-color-text-muted)] text-xs px-2 py-0.5 font-medium", children: "Off" })) })] }, cap))) })] }) })] }, group))) }));
54
+ }
55
+ // -- Section 3: Locked feature guide ------------------------------------------
56
+ const LOCKED_FEATURES = [
57
+ {
58
+ cap: "host_auctions",
59
+ missing: ["Create auction listings", "Set reserve prices and bid increments", "Auto-notify winner at auction end"],
60
+ howToUnlock: "Contact support@letitrip.in with at least 10 delivered orders and 3 months of store activity. Our team reviews within 5 business days.",
61
+ contractRequired: false,
62
+ },
63
+ {
64
+ cap: "host_preorders",
65
+ missing: ["Create pre-order listings with deposit", "Collect deposits at checkout", "Mark pre-order ready when stock arrives"],
66
+ howToUnlock: "Contact support with proof of supplier relationship (purchase order or distributor invoice). Our team reviews within 5 business days.",
67
+ contractRequired: false,
68
+ },
69
+ {
70
+ cap: "lower_commission_rate",
71
+ missing: ["Reduced platform fee (custom rate)", "Higher net margin per order"],
72
+ howToUnlock: "Available to stores with ₹2L+ GMV per month. Contact your account manager or email partner@letitrip.in with your last 3 months' payout statements.",
73
+ contractRequired: true,
74
+ },
75
+ {
76
+ cap: "extended_return_window",
77
+ missing: ["30-day return window shown to buyers", "Differentiated listing card badge"],
78
+ howToUnlock: "Contact support with your store ID. Requires a minimum 4.5 average rating and 6+ months of store activity.",
79
+ contractRequired: true,
80
+ },
81
+ {
82
+ cap: "bulk_listing_import",
83
+ missing: ["CSV batch upload for products", "Template download for bulk edits"],
84
+ howToUnlock: "Contact support@letitrip.in — available to stores with verified status and 50+ published listings.",
85
+ contractRequired: false,
86
+ },
87
+ ];
88
+ function LockedFeatureGuide() {
89
+ return (_jsx(Div, { className: "space-y-4", children: LOCKED_FEATURES.map(({ cap, missing, howToUnlock, contractRequired }) => (_jsxs(Div, { className: "rounded-lg border border-[var(--appkit-color-border)] p-4 space-y-2", children: [_jsxs(Div, { className: "flex items-center gap-2", children: [_jsx(Text, { className: "font-mono text-sm font-semibold text-[var(--appkit-color-text)]", children: cap }), contractRequired && (_jsx("span", { className: "inline-block rounded-full bg-[var(--appkit-color-warning,#ca8a04)]/10 text-[var(--appkit-color-warning,#ca8a04)] text-xs px-2 py-0.5 font-medium", children: "Requires agreement" }))] }), _jsxs(Div, { children: [_jsx(Text, { className: "text-xs font-semibold text-[var(--appkit-color-text-muted)] mb-1", children: "What you are missing:" }), _jsx("ul", { className: "pl-4 space-y-0.5", children: missing.map((item) => (_jsx("li", { className: `text-sm text-[var(--appkit-color-text-muted)] ${LIST_DISC}`, children: item }, item))) })] }), _jsxs(Div, { children: [_jsx(Text, { className: "text-xs font-semibold text-[var(--appkit-color-text-muted)] mb-1", children: "How to unlock:" }), _jsx(Text, { className: "text-sm text-[var(--appkit-color-text-muted)] leading-relaxed", children: howToUnlock })] })] }, cap))) }));
90
+ }
91
+ // -- Section 4: Verified seller badge -----------------------------------------
92
+ function VerifiedSellerSection() {
93
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "What it means for buyers" }), _jsx(Text, { className: "leading-relaxed", children: "The Verified badge appears on your store profile page and on every listing card. It signals to buyers that LetItRip has reviewed your identity and track record. Verified sellers typically see higher conversion rates, especially on high-value items." })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Requirements" }), _jsxs("ul", { className: "space-y-1 pl-5", children: [_jsx("li", { className: LIST_DISC, children: "Government-issued photo ID submitted to LetItRip support." }), _jsx("li", { className: LIST_DISC, children: "Store active for at least 6 months." }), _jsx("li", { className: LIST_DISC, children: "Average rating of 4.5 or above (across all reviews)." }), _jsx("li", { className: LIST_DISC, children: "At least 50 delivered orders with no outstanding fraud reports." }), _jsx("li", { className: LIST_DISC, children: "No active hard ban or store suspension in the past 12 months." })] })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "How to apply" }), _jsx(Text, { className: "leading-relaxed", children: "Open a support ticket from your store dashboard with category \"Account\" and subject \"Verified Seller Application\". Attach your government ID scan. Our team reviews within 10 business days." })] })] }));
94
+ }
95
+ // -- Section 5: Multiple stores -----------------------------------------------
96
+ function MultipleStoresSection() {
97
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Text, { className: "leading-relaxed", children: ["By default, each owner account can only create one store. The", _jsx("code", { className: "text-xs bg-[var(--appkit-color-border)] px-1 rounded mx-1", children: "multiple_stores" }), "capability allows the same owner to create and manage additional stores under the same account."] }), _jsx(Alert, { variant: "info", title: "Each store is independent", children: "Multiple stores share the same owner account (Firebase Auth UID) but are separate Firestore documents with their own listings, orders, payouts, and settings. Platform fees apply per-store. Admin grants this capability after reviewing your business justification." })] }));
98
+ }
99
+ export function StoreCapabilitiesGuideView(_props) {
100
+ return (_jsxs(Div, { className: "space-y-6 pb-10", children: [_jsxs("a", { href: String(ROUTES.STORE.GUIDE), className: "inline-flex items-center gap-1.5 text-sm text-[var(--appkit-color-text-muted)] hover:text-[var(--appkit-color-text)] transition-colors", children: [_jsx(ArrowLeft, { className: "h-4 w-4" }), "Back to Seller Guide"] }), _jsxs(Div, { children: [_jsx(Heading, { level: 1, className: "text-2xl font-bold text-[var(--appkit-color-text)]", children: "Capabilities Guide" }), _jsx(Text, { className: "mt-1 text-sm text-[var(--appkit-color-text-muted)]", children: "Per-store feature flags \u2014 what they unlock, defaults, and how to request access." })] }), _jsx(GuideSection, { title: "1. What are capabilities?", children: _jsx(WhatAreCapabilitiesSection, {}) }), _jsx(GuideSection, { title: "2. Capability table", children: _jsx(CapabilityTable, {}) }), _jsx(GuideSection, { title: "3. How to unlock locked features", children: _jsx(LockedFeatureGuide, {}) }), _jsx(GuideSection, { title: "4. Verified seller badge", children: _jsx(VerifiedSellerSection, {}) }), _jsx(GuideSection, { title: "5. Multiple stores", children: _jsx(MultipleStoresSection, {}) })] }));
101
+ }
@@ -0,0 +1,3 @@
1
+ export interface StoreFinanceGuideViewProps {
2
+ }
3
+ export declare function StoreFinanceGuideView(_props: StoreFinanceGuideViewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowLeft } from "lucide-react";
3
+ import { Alert, Div, Heading, Section, Text } from "../../../ui";
4
+ import { ROUTES } from "../../../next/routing/route-map";
5
+ const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
6
+ const LIST_DISC = "list-disc leading-relaxed";
7
+ const SECTION_BODY = "space-y-4 text-sm text-[var(--appkit-color-text-muted)]";
8
+ const MONO_MUTED = "font-mono text-xs text-[var(--appkit-color-text-muted)]";
9
+ // -- Section wrapper -----------------------------------------------------------
10
+ function GuideSection({ title, children, }) {
11
+ return (_jsxs(Section, { className: "rounded-xl border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] p-6 shadow-sm", children: [_jsx(Heading, { level: 2, className: "mb-4 text-lg font-semibold text-[var(--appkit-color-text)]", children: title }), children] }));
12
+ }
13
+ // -- Section 1: Commission structure ------------------------------------------
14
+ function CommissionSection() {
15
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "How it works" }), _jsx(Text, { className: "leading-relaxed", children: "LetItRip deducts a platform fee from every completed order before paying out to you. The current fee rate is shown in your store Settings \u2192 Finance page and in the platform site settings. Custom commission rates are available to high-volume sellers \u2014 see the Capabilities guide for details." })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Worked example" }), _jsxs(Div, { className: "rounded-lg border border-[var(--appkit-color-border)] p-4 font-mono text-xs space-y-1", children: [_jsx(Text, { className: MONO_MUTED, children: "Order total: \u20B91,000.00" }), _jsx(Text, { className: MONO_MUTED, children: "Platform fee (e.g. 5%): \u2212 \u20B950.00" }), _jsx(Text, { className: MONO_MUTED, children: "Payment processing (Razorpay ~2%): \u2212 \u20B920.00" }), _jsx(Div, { className: "border-t border-[var(--appkit-color-border)] pt-1", children: _jsx(Text, { className: "font-mono text-xs font-semibold text-[var(--appkit-color-text)]", children: "Seller receives: \u2248 \u20B9930.00" }) })] }), _jsx(Text, { className: "text-xs text-[var(--appkit-color-text-muted)] mt-2", children: "Exact amounts depend on the current platform fee configured in Site Settings. Razorpay charges vary by payment method (UPI is lowest)." })] }), _jsx(Alert, { variant: "info", title: "Shipping is separate", children: "Shipping costs you charge buyers are passed through in full \u2014 the platform fee applies only to the product price, not the shipping amount." })] }));
16
+ }
17
+ // -- Section 2: Payout cycle --------------------------------------------------
18
+ const PAYOUT_STATUSES = [
19
+ { status: "PENDING", note: "Orders delivered this week — awaiting batch processing on Sunday." },
20
+ { status: "PROCESSING", note: "Batch being processed — funds being transferred to your account." },
21
+ { status: "PAID", note: "Funds sent. UPI arrives same day; bank transfer 1–2 business days." },
22
+ { status: "FAILED", note: "Transfer failed — usually a stale UPI ID or closed account. Update payoutDetails in Settings and contact support." },
23
+ ];
24
+ function PayoutCycleSection() {
25
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "When payouts are processed" }), _jsx(Text, { className: "leading-relaxed", children: "Payouts are processed weekly on Sunday. Orders included are those that reached DELIVERED status at least 7 days before the batch date (the settlement delay). This delay ensures time for return requests and fraud checks before funds are released." })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Payout statuses" }), _jsx(Div, { className: "space-y-2", children: PAYOUT_STATUSES.map(({ status, note }) => (_jsxs(Div, { className: "flex gap-3", children: [_jsx(Text, { className: "shrink-0 font-mono font-semibold text-[var(--appkit-color-text)] w-24", children: status }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: note })] }, status))) })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Minimum payout threshold" }), _jsx(Text, { className: "leading-relaxed", children: "Payouts below the minimum threshold (visible in your Finance settings) are rolled over to the next week. There is no penalty for rolling over \u2014 it accumulates until the threshold is met." })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Where to view payout history" }), _jsx(Text, { className: "leading-relaxed", children: "Go to your Store Dashboard \u2192 Finance \u2192 Payouts. Each payout shows the date range, orders included, gross amount, fee deducted, and net amount received." })] })] }));
26
+ }
27
+ // -- Section 3: Coupons -------------------------------------------------------
28
+ const COUPON_FIELDS = [
29
+ {
30
+ field: "Type",
31
+ detail: "percentage (% off), fixed (₹ off), free_shipping (removes shipping charge), buy_x_get_y (buy N items, get M free or discounted).",
32
+ },
33
+ {
34
+ field: "Value",
35
+ detail: "The discount amount. For percentage: 0–100. For fixed: amount in ₹. For buy_x_get_y: the N and M counts.",
36
+ },
37
+ {
38
+ field: "Max discount",
39
+ detail: "For percentage coupons — caps the maximum ₹ discount. E.g. 20% off but max ₹200.",
40
+ },
41
+ {
42
+ field: "Min purchase",
43
+ detail: "Minimum cart value before the coupon applies. Enforced at checkout.",
44
+ },
45
+ {
46
+ field: "Total limit",
47
+ detail: "Maximum number of times the coupon can be used across all buyers. Leave blank for unlimited.",
48
+ },
49
+ {
50
+ field: "Per-user limit",
51
+ detail: "Maximum uses per buyer account. Typically 1 for one-time welcome coupons.",
52
+ },
53
+ {
54
+ field: "Start / End date",
55
+ detail: "The validity window. Outside this window the coupon code is rejected at checkout.",
56
+ },
57
+ {
58
+ field: "First-time user only",
59
+ detail: "Restricts redemption to buyers with no prior completed orders on LetItRip.",
60
+ },
61
+ {
62
+ field: "Combine with seller coupons",
63
+ detail: "For admin coupons — whether they stack with a seller coupon on the same cart.",
64
+ },
65
+ ];
66
+ function CouponsSection() {
67
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Admin coupons vs store coupons" }), _jsxs("ul", { className: "space-y-1 pl-5", children: [_jsxs("li", { className: LIST_DISC, children: [_jsx("strong", { className: "text-[var(--appkit-color-text)]", children: "Admin coupons" }), " \u2014 created by LetItRip and apply platform-wide (all stores). You cannot create these."] }), _jsxs("li", { className: LIST_DISC, children: [_jsx("strong", { className: "text-[var(--appkit-color-text)]", children: "Store coupons" }), " \u2014 created by you. Apply only to purchases from your store. You control the terms."] }), _jsx("li", { className: LIST_DISC, children: "Admin coupons and store coupons can stack if the admin coupon has \"Combine with seller coupons\" enabled. If not, only the better coupon is applied automatically." })] })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Coupon field reference" }), _jsx(Div, { className: "space-y-3", children: COUPON_FIELDS.map(({ field, detail }) => (_jsxs(Div, { className: "flex gap-3", children: [_jsx(Text, { className: "shrink-0 w-32 font-semibold text-[var(--appkit-color-text)] text-sm", children: field }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] text-sm leading-relaxed", children: detail })] }, field))) })] })] }));
68
+ }
69
+ // -- Section 4: Promoted & featured listings ----------------------------------
70
+ function PromotedSection() {
71
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "isPromoted \u2014 Deals & promoted sections" }), _jsx(Text, { className: "leading-relaxed", children: "Promoted listings appear in the Deals carousel on the homepage and in search-result promoted slots. For most stores, this flag is set by a LetItRip admin. If you want a product promoted, contact support with the product slug and reason." })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "isFeatured \u2014 Featured badge & priority" }), _jsxs(Text, { className: "leading-relaxed", children: ["Featured listings get a \"Featured\" badge on their listing card and receive priority ordering in search results and category pages. Like isPromoted, this is admin-controlled for most stores. Stores with the ", _jsx("code", { className: "text-xs bg-[var(--appkit-color-border)] px-1 rounded", children: "manage_promoted_listings" }), " capability can self-promote from their dashboard."] })] }), _jsx(Alert, { variant: "info", title: "Promoted placement vs sponsored listings", children: "LetItRip does not currently offer paid sponsored placements \u2014 promoted and featured flags are granted editorially by the LetItRip team based on listing quality and seller performance." })] }));
72
+ }
73
+ // -- Section 5: Taxes notice --------------------------------------------------
74
+ function TaxesSection() {
75
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsx(Alert, { variant: "warning", title: "Seller tax responsibility", children: "LetItRip is a marketplace platform. Each seller operates independently and is individually responsible for applicable taxes on their sales, including GST where required by Indian tax law. LetItRip does not collect or remit GST on your behalf. Consult a qualified tax advisor to understand your obligations based on your turnover and registration status." }), _jsx(Text, { className: "leading-relaxed", children: "TCS (Tax Collected at Source) deducted by LetItRip under Section 194-O of the Income Tax Act will be reflected in your annual Form 26AS. Your gross payouts (before TCS) are visible in the Finance \u2192 Payouts dashboard." })] }));
76
+ }
77
+ export function StoreFinanceGuideView(_props) {
78
+ return (_jsxs(Div, { className: "space-y-6 pb-10", children: [_jsxs("a", { href: String(ROUTES.STORE.GUIDE), className: "inline-flex items-center gap-1.5 text-sm text-[var(--appkit-color-text-muted)] hover:text-[var(--appkit-color-text)] transition-colors", children: [_jsx(ArrowLeft, { className: "h-4 w-4" }), "Back to Seller Guide"] }), _jsxs(Div, { children: [_jsx(Heading, { level: 1, className: "text-2xl font-bold text-[var(--appkit-color-text)]", children: "Finance Guide" }), _jsx(Text, { className: "mt-1 text-sm text-[var(--appkit-color-text-muted)]", children: "Payouts, commissions, coupons, and promoted listings." })] }), _jsx(GuideSection, { title: "1. Commission structure", children: _jsx(CommissionSection, {}) }), _jsx(GuideSection, { title: "2. Payout cycle", children: _jsx(PayoutCycleSection, {}) }), _jsx(GuideSection, { title: "3. Coupons", children: _jsx(CouponsSection, {}) }), _jsx(GuideSection, { title: "4. Promoted & featured listings", children: _jsx(PromotedSection, {}) }), _jsx(GuideSection, { title: "5. Taxes", children: _jsx(TaxesSection, {}) })] }));
79
+ }
@@ -0,0 +1,5 @@
1
+ import type { StoreDocument } from "../schemas";
2
+ export interface StoreGuideHubViewProps {
3
+ store: StoreDocument | null;
4
+ }
5
+ export declare function StoreGuideHubView({ store }: StoreGuideHubViewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Package, ShoppingBag, Wallet, Settings, Shield, Headphones, CheckCircle2, Circle, BookOpen, } from "lucide-react";
3
+ import { Div, Heading, Text, Section } from "../../../ui";
4
+ import { ROUTES } from "../../../next/routing/route-map";
5
+ const GUIDE_CARDS = [
6
+ {
7
+ Icon: Package,
8
+ title: "Listings",
9
+ description: "Add products, auctions, and pre-orders. Learn condition grades, media tips, and pricing.",
10
+ href: String(ROUTES.STORE.GUIDE_LISTINGS),
11
+ },
12
+ {
13
+ Icon: ShoppingBag,
14
+ title: "Orders",
15
+ description: "Process, ship, and handle returns. Understand the full order lifecycle step by step.",
16
+ href: String(ROUTES.STORE.GUIDE_ORDERS),
17
+ },
18
+ {
19
+ Icon: Wallet,
20
+ title: "Finance",
21
+ description: "Payout cycles, commissions, coupons, and promoted listings explained.",
22
+ href: String(ROUTES.STORE.GUIDE_FINANCE),
23
+ },
24
+ {
25
+ Icon: Settings,
26
+ title: "Settings",
27
+ description: "Store profile, shipping config, return policy, vacation mode, and WhatsApp integration.",
28
+ href: String(ROUTES.STORE.GUIDE_SETTINGS),
29
+ },
30
+ {
31
+ Icon: Shield,
32
+ title: "Capabilities",
33
+ description: "Admin-granted feature flags — auctions, pre-orders, lower commissions, and more.",
34
+ href: String(ROUTES.STORE.GUIDE_CAPABILITIES),
35
+ },
36
+ {
37
+ Icon: Headphones,
38
+ title: "Support",
39
+ description: "Open a support ticket, report an issue, or escalate a dispute with our team.",
40
+ href: String(ROUTES.USER.SUPPORT),
41
+ },
42
+ ];
43
+ function buildChecklist(store) {
44
+ return [
45
+ {
46
+ label: "Complete your store profile",
47
+ done: Boolean(store?.storeDescription?.trim()),
48
+ href: String(ROUTES.STORE.STOREFRONT),
49
+ },
50
+ {
51
+ label: "Upload logo & banner",
52
+ done: Boolean(store?.storeLogoURL),
53
+ href: String(ROUTES.STORE.STOREFRONT),
54
+ },
55
+ {
56
+ label: "Create your first listing",
57
+ done: (store?.stats?.totalProducts ?? 0) > 0,
58
+ href: String(ROUTES.STORE.PRODUCTS_NEW),
59
+ },
60
+ {
61
+ label: "Configure shipping",
62
+ done: (store?.shippingConfig?.providers?.length ?? 0) > 0,
63
+ href: String(ROUTES.STORE.SHIPPING_CONFIGS),
64
+ },
65
+ {
66
+ label: "Request verified badge",
67
+ done: Boolean(store?.isVerified),
68
+ href: String(ROUTES.USER.SUPPORT),
69
+ },
70
+ ];
71
+ }
72
+ // -- Component -----------------------------------------------------------------
73
+ export function StoreGuideHubView({ store }) {
74
+ const storeName = store?.storeName ?? "Your Store";
75
+ const steps = buildChecklist(store);
76
+ const completedCount = steps.filter((s) => s.done).length;
77
+ return (_jsxs(Div, { className: "space-y-8 pb-10", children: [_jsx(Section, { className: "rounded-2xl overflow-hidden border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] shadow-sm", children: _jsxs(Div, { className: "px-6 py-8 md:px-10", style: {
78
+ background: "linear-gradient(135deg,var(--appkit-color-primary-700,#4f46e5) 0%,var(--appkit-color-cobalt,#2563eb) 60%,var(--appkit-color-secondary-400,#7c3aed) 100%)",
79
+ }, children: [_jsxs(Div, { className: "flex items-center gap-3 mb-3", children: [_jsx(Div, { className: "flex-shrink-0 w-10 h-10 rounded-xl bg-white/20 flex items-center justify-center", children: _jsx(BookOpen, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { className: "text-sm font-semibold text-white/80 uppercase tracking-widest", children: "Seller Guide" })] }), _jsx(Heading, { level: 1, className: "text-2xl md:text-3xl font-bold text-white mb-2", children: storeName }), _jsx(Text, { className: "text-white/80 text-base", children: "Everything you need to know about selling on LetItRip." })] }) }), _jsxs(Div, { className: "grid grid-cols-1 gap-8 lg:grid-cols-3", children: [_jsxs(Div, { className: "lg:col-span-2 space-y-4", children: [_jsx(Heading, { level: 2, className: "text-lg font-semibold text-[var(--appkit-color-text)]", children: "Guides" }), _jsx(Div, { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: GUIDE_CARDS.map(({ Icon, title, description, href }) => (_jsxs("a", { href: href, className: "group flex flex-col gap-3 rounded-xl border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] p-5 hover:border-[var(--appkit-color-primary)] hover:shadow-md transition-all", children: [_jsxs(Div, { className: "flex items-center gap-3", children: [_jsx(Div, { className: "flex-shrink-0 w-9 h-9 rounded-lg flex items-center justify-center", style: {
80
+ background: "linear-gradient(135deg,var(--appkit-color-primary-700,#4f46e5) 0%,var(--appkit-color-cobalt,#2563eb) 100%)",
81
+ }, children: _jsx(Icon, { className: "w-4 h-4 text-white" }) }), _jsx(Text, { className: "font-semibold text-[var(--appkit-color-text)] group-hover:text-[var(--appkit-color-primary)] transition-colors", children: title })] }), _jsx(Text, { className: "text-sm text-[var(--appkit-color-text-muted)] leading-relaxed", children: description }), _jsx(Text, { className: "text-xs font-medium text-[var(--appkit-color-primary)] mt-auto", children: "Read guide \u2192" })] }, title))) })] }), _jsxs(Div, { className: "space-y-4", children: [_jsx(Heading, { level: 2, className: "text-lg font-semibold text-[var(--appkit-color-text)]", children: "Getting started" }), _jsxs(Div, { className: "rounded-xl border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] overflow-hidden", children: [_jsxs(Div, { className: "px-5 pt-5 pb-4 border-b border-[var(--appkit-color-border)]", children: [_jsxs(Div, { className: "flex items-center justify-between mb-2", children: [_jsxs(Text, { className: "text-sm font-medium text-[var(--appkit-color-text)]", children: [completedCount, " of ", steps.length, " complete"] }), _jsxs(Text, { className: "text-xs text-[var(--appkit-color-text-muted)]", children: [Math.round((completedCount / steps.length) * 100), "%"] })] }), _jsx(Div, { className: "h-1.5 rounded-full bg-[var(--appkit-color-border)]", children: _jsx(Div, { className: "h-full rounded-full transition-all", style: {
82
+ width: `${Math.round((completedCount / steps.length) * 100)}%`,
83
+ background: "linear-gradient(90deg,var(--appkit-color-primary-700,#4f46e5),var(--appkit-color-cobalt,#2563eb))",
84
+ } }) })] }), _jsx(Div, { className: "divide-y divide-[var(--appkit-color-border)]", children: steps.map(({ label, done, href }) => (_jsxs("a", { href: done ? "#" : href, "aria-disabled": done, className: `flex items-center gap-3 px-5 py-3.5 text-sm transition-colors ${done
85
+ ? "cursor-default"
86
+ : "hover:bg-[var(--appkit-color-border)]/30"}`, children: [done ? (_jsx(CheckCircle2, { className: "w-5 h-5 flex-shrink-0 text-emerald-500" })) : (_jsx(Circle, { className: "w-5 h-5 flex-shrink-0 text-[var(--appkit-color-text-muted)]" })), _jsx(Text, { className: `leading-snug ${done
87
+ ? "line-through text-[var(--appkit-color-text-muted)]"
88
+ : "text-[var(--appkit-color-text)]"}`, children: label })] }, label))) })] }), completedCount === steps.length && (_jsx(Div, { className: "rounded-xl border border-emerald-200 bg-emerald-50 dark:bg-emerald-950/30 dark:border-emerald-800 px-5 py-4", children: _jsx(Text, { className: "text-sm font-medium text-emerald-700 dark:text-emerald-400", children: "\uD83C\uDF89 You're all set! Your store is fully configured." }) }))] })] })] }));
89
+ }
@@ -0,0 +1,3 @@
1
+ export interface StoreListingsGuideViewProps {
2
+ }
3
+ export declare function StoreListingsGuideView(_props: StoreListingsGuideViewProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,151 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ArrowLeft } from "lucide-react";
3
+ import { Alert, Div, Heading, Section, Text } from "../../../ui";
4
+ import { ROUTES } from "../../../next/routing/route-map";
5
+ const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
6
+ const LIST_DISC = "list-disc leading-relaxed";
7
+ // -- Section wrapper -----------------------------------------------------------
8
+ function GuideSection({ title, children, }) {
9
+ return (_jsxs(Section, { className: "rounded-xl border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] p-6 shadow-sm", children: [_jsx(Heading, { level: 2, className: "mb-4 text-lg font-semibold text-[var(--appkit-color-text)]", children: title }), children] }));
10
+ }
11
+ // -- Section 1: Comparison table -----------------------------------------------
12
+ const LISTING_TYPES = [
13
+ {
14
+ type: "Standard Product",
15
+ pricing: "Fixed price set by seller",
16
+ buyerFlow: "Add to cart → checkout → instant order",
17
+ requiredFields: "Title · condition · price · ≥1 image",
18
+ idealUseCase: "Collectibles with a clear market value",
19
+ },
20
+ {
21
+ type: "Auction",
22
+ pricing: "Starts at reserve/starting bid; buyers compete",
23
+ buyerFlow: "Place bid → wait for end time → winner pays within 48 h",
24
+ requiredFields: "Reserve price · starting bid · end date/time",
25
+ idealUseCase: "Rare or graded items where demand sets the price",
26
+ },
27
+ {
28
+ type: "Pre-order",
29
+ pricing: "Fixed price; deposit collected at checkout",
30
+ buyerFlow: "Pay deposit → wait for supplier arrival → pay balance",
31
+ requiredFields: "Expected delivery date · deposit % · supplier status",
32
+ idealUseCase: "Upcoming releases or items not yet in hand",
33
+ },
34
+ ];
35
+ function ListingTypesTable() {
36
+ const HEADERS = ["", "Standard Product", "Auction", "Pre-order"];
37
+ const ROWS = [
38
+ { label: "Pricing model", keys: ["pricing"] },
39
+ { label: "Buyer flow", keys: ["buyerFlow"] },
40
+ { label: "Required fields", keys: ["requiredFields"] },
41
+ { label: "Ideal use case", keys: ["idealUseCase"] },
42
+ ];
43
+ return (_jsx(Div, { className: "overflow-x-auto -mx-6", children: _jsxs("table", { className: "min-w-full text-sm", children: [_jsx("thead", { children: _jsx("tr", { className: "border-b border-[var(--appkit-color-border)]", children: HEADERS.map((h) => (_jsx("th", { className: "px-6 py-3 text-left font-semibold text-[var(--appkit-color-text)]", children: h }, h))) }) }), _jsx("tbody", { className: "divide-y divide-[var(--appkit-color-border)]", children: ROWS.map(({ label, keys }) => (_jsxs("tr", { children: [_jsx("td", { className: "px-6 py-3 font-medium text-[var(--appkit-color-text-muted)] whitespace-nowrap", children: label }), LISTING_TYPES.map((t) => (_jsx("td", { className: "px-6 py-3 text-[var(--appkit-color-text)] align-top", children: t[keys[0]] }, t.type)))] }, label))) })] }) }));
44
+ }
45
+ // -- Section 2: Standard product walkthrough -----------------------------------
46
+ const STANDARD_STEPS = [
47
+ {
48
+ step: "General",
49
+ items: [
50
+ "Title — describe the item clearly (brand, character, set, grade if PSA/BGS).",
51
+ "Condition — use grades 1–10: 1 = completely damaged, 5 = heavily played, 7 = lightly played, 9 = near mint, 10 = gem mint. Always be honest.",
52
+ "Brand & Category — required for search and filtering.",
53
+ "youtubeId — paste just the video ID (e.g. dQw4w9WgXcQ) to embed an unboxing or showcase video on the product page.",
54
+ ],
55
+ },
56
+ {
57
+ step: "Media",
58
+ items: [
59
+ "Upload at least 1 image. Recommended: 5–8 images showing front, back, corners, and any damage.",
60
+ "Drag to reorder — the first image is the card thumbnail.",
61
+ "Images are watermarked automatically; do not add your own watermarks.",
62
+ ],
63
+ },
64
+ {
65
+ step: "Pricing",
66
+ items: [
67
+ "Price — enter in Indian Rupees (₹). Stored in paise internally.",
68
+ "isOnSale + salePrice — enable the sale badge and show a strikethrough price on the listing.",
69
+ "customFields — add any extra key/value pairs buyers find useful (e.g. PSA cert number, card number, print run).",
70
+ ],
71
+ },
72
+ {
73
+ step: "Shipping",
74
+ items: [
75
+ "Select the shipping provider(s) you support for this item.",
76
+ "Estimated dispatch time — how many business days before you hand to courier.",
77
+ ],
78
+ },
79
+ {
80
+ step: "Visibility",
81
+ items: [
82
+ "Status: DRAFT saves without publishing. PUBLISHED makes it live in search.",
83
+ "isPromoted — shows the item in promoted sections (homepage deals carousel). Admin-controlled for most stores.",
84
+ "isFeatured — adds a featured badge and priority placement. Admin-controlled.",
85
+ "customSections — rich text content blocks rendered below the product description.",
86
+ ],
87
+ },
88
+ ];
89
+ function StandardWalkthrough() {
90
+ return (_jsx(Div, { className: "space-y-5", children: STANDARD_STEPS.map(({ step, items }) => (_jsxs(Div, { children: [_jsx(Text, { className: "mb-2 font-semibold text-[var(--appkit-color-text)]", children: step }), _jsx("ul", { className: "space-y-1.5 pl-5", children: items.map((item) => (_jsx("li", { className: "list-disc text-sm text-[var(--appkit-color-text-muted)] leading-relaxed", children: item }, item))) })] }, step))) }));
91
+ }
92
+ // -- Section 3: Auction walkthrough --------------------------------------------
93
+ function AuctionWalkthrough() {
94
+ return (_jsxs(Div, { className: "space-y-4 text-sm text-[var(--appkit-color-text-muted)]", children: [_jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Reserve price vs starting bid" }), _jsxs(Text, { className: "leading-relaxed", children: ["The ", _jsx("strong", { className: "text-[var(--appkit-color-text)]", children: "starting bid" }), " is the minimum first bid a buyer can place. The ", _jsx("strong", { className: "text-[var(--appkit-color-text)]", children: "reserve price" }), " is the minimum price you are willing to accept \u2014 if bidding does not reach the reserve, you are not obligated to sell. The reserve is hidden from buyers."] })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Bid increment" }), _jsx(Div, { className: "overflow-x-auto", children: _jsxs("table", { className: "text-xs min-w-[320px]", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-[var(--appkit-color-border)]", children: [_jsx("th", { className: "py-2 pr-4 text-left font-semibold text-[var(--appkit-color-text)]", children: "Current high bid" }), _jsx("th", { className: "py-2 text-left font-semibold text-[var(--appkit-color-text)]", children: "Minimum increment" })] }) }), _jsx("tbody", { className: "divide-y divide-[var(--appkit-color-border)]", children: [
95
+ ["₹0 – ₹499", "₹10"],
96
+ ["₹500 – ₹1,999", "₹25"],
97
+ ["₹2,000 – ₹9,999", "₹100"],
98
+ ["₹10,000 – ₹49,999", "₹500"],
99
+ ["₹50,000+", "₹1,000"],
100
+ ].map(([range, inc]) => (_jsxs("tr", { children: [_jsx("td", { className: "py-2 pr-4", children: range }), _jsx("td", { className: "py-2", children: inc })] }, range))) })] }) })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Auction end" }), _jsxs("ul", { className: "space-y-1 pl-5", children: [_jsx("li", { className: LIST_DISC, children: "Winner receives an email and has 48 hours to complete payment." }), _jsx("li", { className: LIST_DISC, children: "If payment is not completed within 48 hours, the order is auto-cancelled." }), _jsx("li", { className: LIST_DISC, children: "The next-highest bidder may be offered the item (if enabled in your auction settings)." })] })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Editing a live auction" }), _jsx(Text, { className: "leading-relaxed", children: "Once a bid has been placed, you cannot change the reserve price or starting bid. You can edit the title, description, and images at any time." })] })] }));
101
+ }
102
+ // -- Section 4: Pre-order walkthrough ------------------------------------------
103
+ function PreorderWalkthrough() {
104
+ return (_jsxs(Div, { className: "space-y-4 text-sm text-[var(--appkit-color-text-muted)]", children: [_jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Deposit mechanic" }), _jsxs(Text, { className: "leading-relaxed", children: ["Set a ", _jsx("strong", { className: "text-[var(--appkit-color-text)]", children: "deposit percentage" }), " (e.g. 20%). Buyers pay the deposit at checkout. The balance is collected when the item arrives and you mark the pre-order ready. Buyers see both amounts clearly on the checkout page."] })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Expected delivery date" }), _jsx(Text, { className: "leading-relaxed", children: "Set a realistic estimate. Buyers rely on this to decide whether to pre-order. You can update the date later, but repeated delays hurt your store rating." })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "\"Confirmed supplier\" requirement" }), _jsx(Text, { className: "leading-relaxed", children: "Only list pre-orders for items you have confirmed supply for \u2014 e.g. you have placed a purchase order with a distributor or manufacturer. Speculative pre-orders without supplier confirmation violate platform rules and may result in store suspension." })] }), _jsxs(Div, { children: [_jsx(Text, { className: SUBHEADING, children: "Cancellation rules" }), _jsx(Text, { className: "leading-relaxed", children: "Buyers can cancel a pre-order within 24 hours of placing it. After 24 hours, cancellation requires seller approval. If you cannot fulfill the pre-order, initiate cancellation promptly \u2014 the deposit is refunded automatically." })] })] }));
105
+ }
106
+ // -- Section 5: Product status lifecycle ---------------------------------------
107
+ const STATUS_LIFECYCLE = `
108
+ DRAFT ──────────────────────────────────► PUBLISHED
109
+ │ │
110
+ │ (seller publishes) (seller archives / auto-archive)
111
+ │ │
112
+ └──────────────────────────────────────► ARCHIVED
113
+
114
+ PUBLISHED ──► (buyer places bid / buys) ──► SOLD (auction only)
115
+ `;
116
+ const STATUS_NOTES = [
117
+ { status: "DRAFT", note: "Visible only to you. Does not appear in search or browse." },
118
+ { status: "PUBLISHED", note: "Live in search, browse, and featured sections if promoted." },
119
+ { status: "ARCHIVED", note: "Hidden from all public views. Can be re-published later." },
120
+ { status: "SOLD", note: "Auction only — marked when the winning bid is confirmed paid." },
121
+ ];
122
+ function StatusLifecycle() {
123
+ return (_jsxs(Div, { className: "space-y-4", children: [_jsx(Div, { className: "rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface-subtle,var(--appkit-color-border))/20] p-4 font-mono text-xs text-[var(--appkit-color-text-muted)] overflow-x-auto whitespace-pre", children: STATUS_LIFECYCLE }), _jsx(Div, { className: "space-y-2", children: STATUS_NOTES.map(({ status, note }) => (_jsxs(Div, { className: "flex gap-3 text-sm", children: [_jsx(Text, { className: "shrink-0 font-mono font-semibold text-[var(--appkit-color-text)] w-24", children: status }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", children: note })] }, status))) }), _jsx(Text, { className: "text-sm text-[var(--appkit-color-text-muted)]", children: "Live auctions with at least one bid cannot be taken to ARCHIVED until the auction ends." })] }));
124
+ }
125
+ // -- Section 6: Media guide ----------------------------------------------------
126
+ const MEDIA_TIPS = [
127
+ { label: "Image ratio", detail: "1:1 (square) for card thumbnails; 4:3 works well for product detail gallery." },
128
+ { label: "Minimum size", detail: "800 × 800 px recommended. Below 400 × 400 px will look blurry on Retina screens." },
129
+ { label: "Max file size", detail: "50 MB per image. Prefer JPG for photos; PNG for packaging or cards with text." },
130
+ { label: "Watermark", detail: "LetItRip adds a watermark automatically. Do not add your own — double watermarks look unprofessional." },
131
+ { label: "Order", detail: "Drag images to reorder after upload. The first image is the card thumbnail used in search results." },
132
+ { label: "Video", detail: "Add a YouTube video ID to embed an unboxing or showcase. Not a replacement for photos." },
133
+ ];
134
+ function MediaGuide() {
135
+ return (_jsx(Div, { className: "space-y-3", children: MEDIA_TIPS.map(({ label, detail }) => (_jsxs(Div, { className: "flex gap-3 text-sm", children: [_jsx(Text, { className: "shrink-0 w-28 font-semibold text-[var(--appkit-color-text)]", children: label }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] leading-relaxed", children: detail })] }, label))) }));
136
+ }
137
+ // -- Section 7: Common mistakes ------------------------------------------------
138
+ const MISTAKES = [
139
+ "Listing a pre-order without a confirmed supplier. If supply falls through, you will face cancellations, refunds, and a rating hit.",
140
+ "Leaving condition blank or writing 'good condition' without a numeric grade. Buyers cannot compare listings fairly.",
141
+ "Uploading blurry or overexposed photos. Listings with poor images receive fewer bids and lower conversion.",
142
+ "Not setting isAuction: false on standard products. If a product is not an auction, it must have listingType: 'standard' — mixed signals confuse buyers.",
143
+ "Setting an unrealistic deposit percentage. A 5% deposit gives buyers little skin in the game; 20–30% is standard for collectibles.",
144
+ "Forgetting to configure shipping before publishing. Orders without a shipping method cannot be fulfilled.",
145
+ ];
146
+ function CommonMistakes() {
147
+ return (_jsx(Alert, { variant: "warning", title: "Common mistakes to avoid", children: _jsx("ul", { className: "mt-2 space-y-2 pl-4", children: MISTAKES.map((m) => (_jsx("li", { className: "list-disc text-sm leading-relaxed", children: m }, m))) }) }));
148
+ }
149
+ export function StoreListingsGuideView(_props) {
150
+ return (_jsxs(Div, { className: "space-y-6 pb-10", children: [_jsxs("a", { href: String(ROUTES.STORE.GUIDE), className: "inline-flex items-center gap-1.5 text-sm text-[var(--appkit-color-text-muted)] hover:text-[var(--appkit-color-text)] transition-colors", children: [_jsx(ArrowLeft, { className: "h-4 w-4" }), "Back to Seller Guide"] }), _jsxs(Div, { children: [_jsx(Heading, { level: 1, className: "text-2xl font-bold text-[var(--appkit-color-text)]", children: "Listings Guide" }), _jsx(Text, { className: "mt-1 text-sm text-[var(--appkit-color-text-muted)]", children: "Products, auctions, and pre-orders \u2014 create and manage your listings." })] }), _jsx(GuideSection, { title: "1. Three listing types", children: _jsx(ListingTypesTable, {}) }), _jsx(GuideSection, { title: "2. Standard product walkthrough", children: _jsx(StandardWalkthrough, {}) }), _jsx(GuideSection, { title: "3. Auction walkthrough", children: _jsx(AuctionWalkthrough, {}) }), _jsx(GuideSection, { title: "4. Pre-order walkthrough", children: _jsx(PreorderWalkthrough, {}) }), _jsx(GuideSection, { title: "5. Product status lifecycle", children: _jsx(StatusLifecycle, {}) }), _jsx(GuideSection, { title: "6. Media guide", children: _jsx(MediaGuide, {}) }), _jsx(GuideSection, { title: "7. Common mistakes", children: _jsx(CommonMistakes, {}) })] }));
151
+ }
@@ -0,0 +1,3 @@
1
+ export interface StoreOrdersGuideViewProps {
2
+ }
3
+ export declare function StoreOrdersGuideView(_props: StoreOrdersGuideViewProps): import("react/jsx-runtime").JSX.Element;