@mohasinac/appkit 3.3.6 → 3.4.0

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 (133) hide show
  1. package/dist/_internal/client/features/classified/ClassifiedDetailView.js +2 -1
  2. package/dist/_internal/client/features/digital-code/DigitalCodeDetailView.js +2 -1
  3. package/dist/_internal/client/features/live/LiveItemDetailView.js +2 -1
  4. package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +1 -1
  5. package/dist/_internal/client/features/lottery/LotteryDetailView.js +2 -1
  6. package/dist/_internal/client/features/lottery/LotteryListView.js +2 -1
  7. package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +2 -1
  8. package/dist/_internal/server/features/checkout/actions.js +0 -1
  9. package/dist/_internal/server/features/lottery/actions.js +0 -2
  10. package/dist/_internal/server/features/reviews/actions.js +1 -1
  11. package/dist/features/about/components/FAQPageView.js +0 -2
  12. package/dist/features/about/components/FeesView.js +13 -1
  13. package/dist/features/about/components/HowCheckoutWorksView.js +17 -3
  14. package/dist/features/about/components/HowEmiWorksView.d.ts +3 -0
  15. package/dist/features/about/components/HowEmiWorksView.js +117 -0
  16. package/dist/features/about/components/PublicProfileView.js +1 -4
  17. package/dist/features/about/index.d.ts +2 -0
  18. package/dist/features/about/index.js +1 -0
  19. package/dist/features/account/components/BecomeSellerView.d.ts +1 -1
  20. package/dist/features/account/components/BecomeSellerView.js +1 -1
  21. package/dist/features/account/components/NotificationBell.js +1 -2
  22. package/dist/features/account/components/UserSupportView.js +0 -1
  23. package/dist/features/admin/components/AdminAdsView.js +3 -3
  24. package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
  25. package/dist/features/admin/components/AdminBundleEditorView.js +0 -4
  26. package/dist/features/admin/components/AdminCarouselEditorView.js +3 -3
  27. package/dist/features/admin/components/AdminCarouselView.js +3 -2
  28. package/dist/features/admin/components/AdminGuideHubView.js +2 -2
  29. package/dist/features/admin/components/AdminMediaView.js +2 -4
  30. package/dist/features/admin/components/AdminUserEditorView.d.ts +1 -1
  31. package/dist/features/admin/components/AdminUserEditorView.js +1 -1
  32. package/dist/features/admin/components/QuickActionsPanel.js +2 -2
  33. package/dist/features/auctions/components/AuctionDetailPageView.js +1 -1
  34. package/dist/features/blog/components/BlogFeaturedCard.js +2 -1
  35. package/dist/features/blog/components/BlogIndexListing.js +1 -1
  36. package/dist/features/blog/components/BlogListView.js +2 -1
  37. package/dist/features/blog/components/BlogPostForm.js +1 -1
  38. package/dist/features/blog/components/BlogPostView.js +2 -1
  39. package/dist/features/cart/components/CartDrawer.js +2 -1
  40. package/dist/features/categories/components/BrandDetailPageView.js +2 -1
  41. package/dist/features/categories/components/BundleCollage.js +2 -3
  42. package/dist/features/categories/components/CategoriesIndexListing.js +1 -5
  43. package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
  44. package/dist/features/categories/components/CategoryGrid.js +2 -1
  45. package/dist/features/categories/components/CategoryProductsView.d.ts +1 -1
  46. package/dist/features/categories/components/CategoryProductsView.js +1 -1
  47. package/dist/features/categories/components/ConcernCard.js +2 -1
  48. package/dist/features/collections/components/CollectionCard.js +2 -1
  49. package/dist/features/consultation/components/ConsultationForm.js +0 -1
  50. package/dist/features/contact/components/ContactInfoSidebar.js +2 -2
  51. package/dist/features/copilot/components/AdminCopilotView.js +0 -9
  52. package/dist/features/events/components/EventFormDrawer.d.ts +1 -1
  53. package/dist/features/events/components/EventFormDrawer.js +1 -1
  54. package/dist/features/events/components/EventPollWidget.js +2 -2
  55. package/dist/features/events/components/EventsIndexListing.js +1 -1
  56. package/dist/features/faq/actions/faq-actions.d.ts +2 -10
  57. package/dist/features/faq/actions/faq-actions.js +0 -4
  58. package/dist/features/homepage/components/AdSlot.js +2 -1
  59. package/dist/features/homepage/components/CustomCardsSection.js +2 -3
  60. package/dist/features/homepage/components/FeaturedBundlesSection.js +2 -3
  61. package/dist/features/homepage/components/GoogleReviewsSection.js +4 -3
  62. package/dist/features/homepage/components/HeroBanner.js +0 -1
  63. package/dist/features/homepage/components/SectionCarousel.d.ts +1 -1
  64. package/dist/features/homepage/components/SectionCarousel.js +1 -2
  65. package/dist/features/homepage/components/SocialFeedSection.js +2 -5
  66. package/dist/features/homepage/components/SocialPostCard.js +4 -3
  67. package/dist/features/media/MediaPickerModal.js +2 -3
  68. package/dist/features/media/upload/MediaUploadList.js +2 -2
  69. package/dist/features/orders/components/OrdersList.js +2 -1
  70. package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -0
  71. package/dist/features/products/api/route.js +1 -2
  72. package/dist/features/products/components/CompareOverlay.js +2 -3
  73. package/dist/features/products/components/CustomSectionTabContent.js +2 -2
  74. package/dist/features/products/components/FeatureBadge.js +0 -6
  75. package/dist/features/products/components/GroupSettingsPanel.js +2 -3
  76. package/dist/features/products/components/MarketplaceBundleCard.js +2 -1
  77. package/dist/features/products/components/MarketplacePrizeDrawCard.js +2 -3
  78. package/dist/features/products/components/PrizeDrawCollage.js +2 -3
  79. package/dist/features/products/components/PrizeDrawEntryActions.d.ts +1 -1
  80. package/dist/features/products/components/PrizeDrawEntryActions.js +3 -3
  81. package/dist/features/products/components/PrizeRevealModal.js +3 -4
  82. package/dist/features/products/components/ProductDetailActions.d.ts +1 -1
  83. package/dist/features/products/components/ProductDetailActions.js +1 -1
  84. package/dist/features/products/components/ProductDetailPageView.d.ts +3 -1
  85. package/dist/features/products/components/ProductDetailPageView.js +3 -2
  86. package/dist/features/products/components/ProductFeatureBadges.d.ts +7 -1
  87. package/dist/features/products/components/ProductFeatureBadges.js +16 -3
  88. package/dist/features/products/components/ProductGradingTab.js +2 -2
  89. package/dist/features/products/components/ProductsIndexPageView.js +2 -2
  90. package/dist/features/products/components/SublistingCarouselSection.js +3 -4
  91. package/dist/features/promotions/components/CouponsIndexListing.d.ts +1 -1
  92. package/dist/features/promotions/components/CouponsIndexListing.js +1 -1
  93. package/dist/features/reviews/components/ReviewDetailShell.js +4 -3
  94. package/dist/features/reviews/components/ReviewModal.js +2 -1
  95. package/dist/features/reviews/components/ReviewsIndexListing.js +1 -1
  96. package/dist/features/reviews/components/ReviewsList.js +2 -1
  97. package/dist/features/scams/components/ScamAwarenessModal.js +2 -2
  98. package/dist/features/search/components/SearchView.d.ts +1 -1
  99. package/dist/features/search/components/SearchView.js +1 -1
  100. package/dist/features/seller/components/SellerAddressesView.js +1 -5
  101. package/dist/features/seller/components/SellerPreOrdersView.js +3 -2
  102. package/dist/features/shell/StepForm.js +1 -1
  103. package/dist/features/stores/components/InteractiveStoreCard.js +1 -2
  104. package/dist/features/stores/components/StoreAboutView.js +2 -2
  105. package/dist/features/stores/components/StoreCapabilitiesGuideView.js +2 -2
  106. package/dist/features/stores/components/StoreFinanceGuideView.js +2 -2
  107. package/dist/features/stores/components/StoreGuideHubView.js +2 -2
  108. package/dist/features/stores/components/StoreListingsGuideView.js +2 -2
  109. package/dist/features/stores/components/StoreNavTabs.js +2 -2
  110. package/dist/features/stores/components/StoreOrdersGuideView.js +2 -2
  111. package/dist/features/stores/components/StoreSettingsGuideView.js +3 -3
  112. package/dist/features/wishlist/components/WishlistView.js +0 -7
  113. package/dist/index.d.ts +2 -0
  114. package/dist/index.js +3 -0
  115. package/dist/next/routing/route-map.d.ts +2 -0
  116. package/dist/next/routing/route-map.js +1 -0
  117. package/dist/seed/factories/product.factory.js +0 -32
  118. package/dist/seed/faq-seed-data.js +23 -4
  119. package/dist/styles.css +1 -1
  120. package/dist/tailwind-utilities.css +1 -1
  121. package/dist/tokens/index.js +6 -458
  122. package/dist/ui/DataTable.js +0 -21
  123. package/dist/ui/components/Anchor.d.ts +3 -1
  124. package/dist/ui/components/Anchor.js +1 -0
  125. package/dist/ui/components/Breadcrumb.js +2 -1
  126. package/dist/ui/components/FormActionBar.js +2 -1
  127. package/dist/ui/components/ListingLayout.d.ts +1 -1
  128. package/dist/ui/components/ListingLayout.js +1 -1
  129. package/dist/ui/components/Motion.js +1 -1
  130. package/dist/ui/components/QuickCreateModal.js +2 -1
  131. package/dist/ui/components/SlottedListingView.d.ts +1 -1
  132. package/dist/ui/components/SlottedListingView.js +1 -2
  133. package/package.json +1 -1
@@ -4,7 +4,7 @@ import { Span, useApiMutation } from "@mohasinac/appkit/client";
4
4
  import { useState } from "react";
5
5
  import { useQueryClient } from "@tanstack/react-query";
6
6
  import { Shield, IndianRupee, UserX, CreditCard, Package, UserCheck, ShieldAlert, Truck } from "lucide-react";
7
- import { Div, Modal, Stack, Row, Text, Checkbox } from "../../../ui";
7
+ import { Div, Modal, Stack, Row, Text, Checkbox, TextLink } from "../../../ui";
8
8
  import { apiClient } from "../../../http";
9
9
  import { ACCOUNT_ENDPOINTS } from "../../../constants/api-endpoints";
10
10
  import { SCAM_CATEGORIES } from "../constants/scam-types";
@@ -28,5 +28,5 @@ export function ScamAwarenessModal({ isOpen, onAcknowledged }) {
28
28
  onAcknowledged();
29
29
  },
30
30
  });
31
- return (_jsx(Modal, { isOpen: isOpen, onClose: () => { }, showCloseButton: false, size: "lg", title: _jsxs(Row, { gap: "sm", align: "center", children: [_jsx(Shield, { className: "h-5 w-5 text-[color:var(--appkit-color-warning,theme(colors.amber.500))]" }), _jsx(Span, { children: "Before you start \u2014 Stay Safe on LetItRip" })] }), actions: _jsx(Row, { gap: "sm", justify: "end", className: "w-full", children: _jsx("button", { className: "appkit-button appkit-button--primary appkit-button--md", disabled: !checked || mutation.isPending, onClick: () => mutation.mutate(), children: mutation.isPending ? "Saving…" : "Continue to LetItRip →" }) }), children: _jsxs(Stack, { gap: "md", children: [_jsx(Text, { variant: "secondary", size: "sm", children: "LetItRip connects you with verified sellers, but collectibles markets attract scams. Take 60 seconds to learn the most common patterns \u2014 it could save your money." }), _jsx(Div, { layout: "grid", gap: "3", className: "grid-cols-1 sm:grid-cols-2", children: SCAM_CATEGORIES.map((cat) => (_jsxs(Div, { layout: "flex", gap: "3", rounded: "lg", padding: "sm", className: "border border-[color:var(--appkit-color-border,theme(colors.zinc.200))] bg-[color:var(--appkit-color-surface,theme(colors.zinc.50))]", children: [_jsx(Span, { layout: "flex-center", className: "mt-0.5 h-8 w-8 shrink-0 bg-[color:var(--appkit-color-warning,theme(colors.amber.500))]/10 text-[color:var(--appkit-color-warning,theme(colors.amber.600))]", rounded: "md", children: CATEGORY_ICONS[cat.id] ?? _jsx(Shield, { className: "h-4 w-4" }) }), _jsxs(Stack, { gap: "none", children: [_jsx(Text, { weight: "semibold", size: "sm", children: cat.label }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "xs", children: cat.description })] })] }, cat.id))) }), _jsxs(Row, { textSize: "sm", gap: "md", wrap: true, children: [_jsx("a", { href: String(ROUTES.PUBLIC.SCAM_TYPES), target: "_blank", rel: "noopener noreferrer", className: "text-[color:var(--appkit-color-primary,theme(colors.blue.600))] hover:underline", children: "See all 27 scam types \u2192" }), _jsx("a", { href: String(ROUTES.PUBLIC.SCAM_FAQS), target: "_blank", rel: "noopener noreferrer", className: "text-[color:var(--appkit-color-primary,theme(colors.blue.600))] hover:underline", children: "Common scam FAQs \u2192" })] }), mutation.isError && (_jsx(Text, { variant: "error", size: "sm", children: "Something went wrong \u2014 please try again." })), _jsx(Checkbox, { id: "scam-awareness-ack", checked: checked, onChange: (e) => setChecked(e.target.checked), label: "I have read the above and understand the risks of buying and selling collectibles online." })] }) }));
31
+ return (_jsx(Modal, { isOpen: isOpen, onClose: () => { }, showCloseButton: false, size: "lg", title: _jsxs(Row, { gap: "sm", align: "center", children: [_jsx(Shield, { className: "h-5 w-5 text-[color:var(--appkit-color-warning,theme(colors.amber.500))]" }), _jsx(Span, { children: "Before you start \u2014 Stay Safe on LetItRip" })] }), actions: _jsx(Row, { gap: "sm", justify: "end", className: "w-full", children: _jsx("button", { className: "appkit-button appkit-button--primary appkit-button--md", disabled: !checked || mutation.isPending, onClick: () => mutation.mutate(), children: mutation.isPending ? "Saving…" : "Continue to LetItRip →" }) }), children: _jsxs(Stack, { gap: "md", children: [_jsx(Text, { variant: "secondary", size: "sm", children: "LetItRip connects you with verified sellers, but collectibles markets attract scams. Take 60 seconds to learn the most common patterns \u2014 it could save your money." }), _jsx(Div, { layout: "grid", gap: "3", className: "grid-cols-1 sm:grid-cols-2", children: SCAM_CATEGORIES.map((cat) => (_jsxs(Div, { layout: "flex", gap: "3", rounded: "lg", padding: "sm", className: "border border-[color:var(--appkit-color-border,theme(colors.zinc.200))] bg-[color:var(--appkit-color-surface,theme(colors.zinc.50))]", children: [_jsx(Span, { layout: "flex-center", className: "mt-0.5 h-8 w-8 shrink-0 bg-[color:var(--appkit-color-warning,theme(colors.amber.500))]/10 text-[color:var(--appkit-color-warning,theme(colors.amber.600))]", rounded: "md", children: CATEGORY_ICONS[cat.id] ?? _jsx(Shield, { className: "h-4 w-4" }) }), _jsxs(Stack, { gap: "none", children: [_jsx(Text, { weight: "semibold", size: "sm", children: cat.label }), _jsx(Text, { variant: "secondary", className: "leading-relaxed", size: "xs", children: cat.description })] })] }, cat.id))) }), _jsxs(Row, { textSize: "sm", gap: "md", wrap: true, children: [_jsx(TextLink, { variant: "bare", href: String(ROUTES.PUBLIC.SCAM_TYPES), target: "_blank", rel: "noopener noreferrer", className: "text-[color:var(--appkit-color-primary,theme(colors.blue.600))] hover:underline", children: "See all 27 scam types \u2192" }), _jsx(TextLink, { variant: "bare", href: String(ROUTES.PUBLIC.SCAM_FAQS), target: "_blank", rel: "noopener noreferrer", className: "text-[color:var(--appkit-color-primary,theme(colors.blue.600))] hover:underline", children: "Common scam FAQs \u2192" })] }), mutation.isError && (_jsx(Text, { variant: "error", size: "sm", children: "Something went wrong \u2014 please try again." })), _jsx(Checkbox, { id: "scam-awareness-ack", checked: checked, onChange: (e) => setChecked(e.target.checked), label: "I have read the above and understand the risks of buying and selling collectibles online." })] }) }));
32
32
  }
@@ -26,4 +26,4 @@ export interface SearchViewProps {
26
26
  renderPagination?: () => React.ReactNode;
27
27
  className?: string;
28
28
  }
29
- export declare function SearchView({ query, total, isLoading, labels, renderSearchInput, renderFilters, renderActiveFilters, renderToolbar, renderResults, renderPagination, className, }: SearchViewProps): React.JSX.Element;
29
+ export declare function SearchView({ query, total, isLoading: _isLoading, labels, renderSearchInput, renderFilters, renderActiveFilters, renderToolbar, renderResults, renderPagination, className, }: SearchViewProps): React.JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { Div, Heading, Main, Row, Span, Stack, Text } from "../../../ui";
3
- export function SearchView({ query, total, isLoading, labels = {}, renderSearchInput, renderFilters, renderActiveFilters, renderToolbar, renderResults, renderPagination, className = "", }) {
3
+ export function SearchView({ query, total, isLoading: _isLoading, labels = {}, renderSearchInput, renderFilters, renderActiveFilters, renderToolbar, renderResults, renderPagination, className = "", }) {
4
4
  const hasQuery = !!query?.trim();
5
5
  return (_jsx(Main, { className: `min-h-screen ${className}`, children: _jsxs(Stack, { padding: "y-lg", gap: "md", children: [_jsx(Div, { children: renderSearchInput() }), hasQuery && (_jsx(Div, { children: _jsx(Heading, { level: 1, size: "xl", weight: "semibold", children: labels.resultsCount
6
6
  ? labels.resultsCount(total, query)
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useState } from "react";
4
4
  import { MapPin, Pencil, Plus, Trash2, Star } from "lucide-react";
5
- import { Badge, Button, ConfirmDeleteModal, Div, Grid, Heading, Label, Row, SideDrawer, Span, Stack, Table, Thead, Tbody, Tr, Th, Td, Text } from "../../../ui";
5
+ import { Badge, Button, ConfirmDeleteModal, Div, Grid, Heading, Row, SideDrawer, Span, Stack, Table, Thead, Tbody, Tr, Th, Td, Text } from "../../../ui";
6
6
  import { FieldInput } from "../../../ui/forms/FieldInput";
7
7
  import { FieldCheckbox } from "../../../ui/forms/FieldCheckbox";
8
8
  import { ROW_ACTION_META, ROW_ACTION_ID } from "../../../features/products/constants/action-defs";
@@ -12,12 +12,8 @@ import { normalizeError } from "../../../errors/normalize";
12
12
  const __O = {
13
13
  xAuto: "overflow-x-auto",
14
14
  };
15
- const INPUT_CLS = "w-full rounded-lg border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)] px-3 py-2 text-sm text-[var(--appkit-color-text)] placeholder-zinc-400 dark:placeholder-zinc-500 focus:outline-none focus:ring-2 focus:ring-[var(--appkit-color-primary)]";
16
15
  const CLS_DEFAULT_PILL = "inline-flex items-center gap-1 rounded-full bg-warning-surface dark:bg-warning-surface text-warning dark:text-warning border border-warning dark:border-warning px-2 py-0.5";
17
16
  const CLS_DELETE_BTN = "rounded-lg p-1.5 text-[var(--appkit-color-text-muted)] hover:bg-error-surface dark:hover:bg-error-surface hover:text-error dark:hover:text-error transition-colors";
18
- function Field({ label, hint, children }) {
19
- return (_jsxs(Stack, { gap: "xs", children: [_jsx(Label, { className: "block", color: "primary", size: "xs", weight: "medium", children: label }), children, hint && _jsx(Text, { size: "xs", color: "muted", children: hint })] }));
20
- }
21
17
  // ---------------------------------------------------------------------------
22
18
  // Helpers
23
19
  // ---------------------------------------------------------------------------
@@ -4,7 +4,8 @@ import { Row, SIEVE_OP, Stack, sieveFilter } from "@mohasinac/appkit";
4
4
  import { sortBy } from "@mohasinac/appkit";
5
5
  import React, { useState, useCallback } from "react";
6
6
  import { useEntityDelete } from "../../../react/hooks/useEntityDelete";
7
- import { Badge, ConfirmDeleteModal, FilterChipGroup, ListingLayout, RowActionMenu, Span, Text } from "../../../ui";
7
+ import { Badge, ConfirmDeleteModal, Div, FilterChipGroup, ListingLayout, RowActionMenu, Span, Text } from "../../../ui";
8
+ import { MediaImage } from "../../media/MediaImage";
8
9
  import { SELLER_ENDPOINTS } from "../../../constants/api-endpoints";
9
10
  import { SELLER_PRE_ORDER_STATUS_TABS } from "../../admin/constants/filter-tabs";
10
11
  import { ROUTES } from "../../../constants";
@@ -17,7 +18,7 @@ const PRE_ORDER_COLUMNS = [
17
18
  key: "thumbnail",
18
19
  header: "",
19
20
  className: "w-12",
20
- render: (row) => row.imageUrl ? (_jsx("img", { src: row.imageUrl, alt: "", className: "w-10 h-10 rounded-lg object-cover border border-[var(--appkit-color-border)]" })) : (_jsx(Row, { className: "w-10 h-10 bg-[var(--appkit-color-surface-raised)] border border-[var(--appkit-color-border)]", align: "center", justify: "center", rounded: "lg", children: _jsx(Span, { size: "xs", color: "faint", children: "\u2013" }) })),
21
+ render: (row) => row.imageUrl ? (_jsx(Div, { className: "relative w-10 h-10 flex-shrink-0 overflow-hidden border border-[var(--appkit-color-border)]", rounded: "lg", children: _jsx(MediaImage, { src: row.imageUrl, alt: "", size: "thumbnail" }) })) : (_jsx(Row, { className: "w-10 h-10 bg-[var(--appkit-color-surface-raised)] border border-[var(--appkit-color-border)]", align: "center", justify: "center", rounded: "lg", children: _jsx(Span, { size: "xs", color: "faint", children: "\u2013" }) })),
21
22
  },
22
23
  {
23
24
  key: "primary",
@@ -36,7 +36,7 @@ export function StepIndicator({ steps, currentStep, onStepClick, stepErrors, })
36
36
  }
37
37
  export function StepForm({ steps, values, onChange, onComplete, completeLabel = "Publish Now", isLoading = false, formId, currentStep, onStepChange, hideActions = false, stepErrors, }) {
38
38
  const { showToast } = useToast();
39
- const [fieldErrors, setFieldErrors] = useState({});
39
+ const [fieldErrors, _setFieldErrors] = useState({});
40
40
  const [stepError, setStepError] = useState(null);
41
41
  // Persist step to localStorage if formId provided
42
42
  useEffect(() => {
@@ -13,9 +13,8 @@ const CLS_RATING_BADGE = "absolute top-2 right-2 flex items-center gap-1 rounded
13
13
  export function InteractiveStoreCard({ store, href, selectable, isSelected = false, onSelect, labels = {}, className = "", }) {
14
14
  const initial = store.storeName[0]?.toUpperCase() ?? "S";
15
15
  const [logoBroken, setLogoBroken] = useState(false);
16
- const [bannerBroken, setBannerBroken] = useState(false);
17
16
  const hasLogo = Boolean(store.storeLogoURL) && !logoBroken;
18
- const hasBanner = Boolean(store.storeBannerURL) && !bannerBroken;
17
+ const hasBanner = Boolean(store.storeBannerURL);
19
18
  const longPress = useLongPress(() => onSelect?.(store.id, !isSelected));
20
19
  return (_jsxs(Div, { className: [
21
20
  "group relative flex flex-col h-full overflow-hidden rounded-xl border bg-[var(--appkit-color-surface)] shadow-sm transition-shadow hover:shadow-lg",
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Row } from "@mohasinac/appkit/ui";
3
- import { Div, Heading, RichText, Stack, Text } from "../../../ui";
3
+ import { Anchor, Div, Heading, RichText, Stack, Text } from "../../../ui";
4
4
  const CLS_LABEL = "font-medium text-neutral-700 min-w-[120px]";
5
5
  const CLS_WARN_BOX = "bg-warning-surface border border-warning rounded-lg p-4";
6
6
  const CLS_WARN_TITLE = "text-warning font-medium";
@@ -14,5 +14,5 @@ export function StoreAboutView({ store, labels = {}, renderSocialLinks, renderSt
14
14
  month: "long",
15
15
  })
16
16
  : null;
17
- return (_jsxs(Stack, { className: `${className}`, gap: "lg", padding: "y-lg", children: [store.bio && (_jsxs(Div, { children: [_jsx(Heading, { level: 2, className: "mb-2", size: "lg", weight: "semibold", children: labels.aboutTitle ?? "About" }), _jsx(RichText, { html: normalizeRichTextHtml(store.bio) })] })), renderStats?.(store), _jsxs(Stack, { textSize: "sm", gap: "3", children: [store.location && (_jsxs(Row, { gap: "sm", children: [_jsx(Text, { className: CLS_LABEL, children: labels.locationLabel ?? "Location" }), _jsx(Text, { className: "", children: store.location })] })), joinDate && (_jsxs(Row, { gap: "sm", children: [_jsx(Text, { className: CLS_LABEL, children: labels.memberSinceLabel ?? "Member since" }), _jsx(Text, { className: "", children: joinDate })] })), store.website && (_jsxs(Row, { gap: "sm", children: [_jsx(Text, { className: CLS_LABEL, children: labels.websiteLabel ?? "Website" }), _jsx("a", { href: store.website, target: "_blank", rel: "noopener noreferrer", className: "text-primary hover:underline break-all", children: store.website })] }))] }), store.socialLinks && renderSocialLinks?.(store.socialLinks), store.returnPolicy && (_jsxs(Div, { children: [_jsx(Heading, { level: 3, className: "mb-2", size: "base", weight: "semibold", children: labels.returnPolicyLabel ?? "Return Policy" }), _jsx(RichText, { html: normalizeRichTextHtml(store.returnPolicy) })] })), store.shippingPolicy && (_jsxs(Div, { children: [_jsx(Heading, { level: 3, className: "mb-2", size: "base", weight: "semibold", children: labels.shippingPolicyLabel ?? "Shipping Policy" }), _jsx(RichText, { html: normalizeRichTextHtml(store.shippingPolicy) })] })), store.isVacationMode && (_jsxs(Div, { className: CLS_WARN_BOX, children: [_jsx(Text, { className: CLS_WARN_TITLE, children: labels.vacationModeLabel ?? "This store is on vacation mode" }), store.vacationMessage && (_jsx(Text, { className: CLS_WARN_BODY, children: store.vacationMessage }))] }))] }));
17
+ return (_jsxs(Stack, { className: `${className}`, gap: "lg", padding: "y-lg", children: [store.bio && (_jsxs(Div, { children: [_jsx(Heading, { level: 2, className: "mb-2", size: "lg", weight: "semibold", children: labels.aboutTitle ?? "About" }), _jsx(RichText, { html: normalizeRichTextHtml(store.bio) })] })), renderStats?.(store), _jsxs(Stack, { textSize: "sm", gap: "3", children: [store.location && (_jsxs(Row, { gap: "sm", children: [_jsx(Text, { className: CLS_LABEL, children: labels.locationLabel ?? "Location" }), _jsx(Text, { className: "", children: store.location })] })), joinDate && (_jsxs(Row, { gap: "sm", children: [_jsx(Text, { className: CLS_LABEL, children: labels.memberSinceLabel ?? "Member since" }), _jsx(Text, { className: "", children: joinDate })] })), store.website && (_jsxs(Row, { gap: "sm", children: [_jsx(Text, { className: CLS_LABEL, children: labels.websiteLabel ?? "Website" }), _jsx(Anchor, { href: store.website, tone: "none", underline: "hover", className: "text-primary break-all", children: store.website })] }))] }), store.socialLinks && renderSocialLinks?.(store.socialLinks), store.returnPolicy && (_jsxs(Div, { children: [_jsx(Heading, { level: 3, className: "mb-2", size: "base", weight: "semibold", children: labels.returnPolicyLabel ?? "Return Policy" }), _jsx(RichText, { html: normalizeRichTextHtml(store.returnPolicy) })] })), store.shippingPolicy && (_jsxs(Div, { children: [_jsx(Heading, { level: 3, className: "mb-2", size: "base", weight: "semibold", children: labels.shippingPolicyLabel ?? "Shipping Policy" }), _jsx(RichText, { html: normalizeRichTextHtml(store.shippingPolicy) })] })), store.isVacationMode && (_jsxs(Div, { className: CLS_WARN_BOX, children: [_jsx(Text, { className: CLS_WARN_TITLE, children: labels.vacationModeLabel ?? "This store is on vacation mode" }), store.vacationMessage && (_jsx(Text, { className: CLS_WARN_BODY, children: store.vacationMessage }))] }))] }));
18
18
  }
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { ArrowLeft } from "lucide-react";
3
- import { Alert, Code, Div, Heading, Li, Row, Section, Span, Stack, Table, Tbody, Td, Text, Th, Thead, Tr, Ul } from "../../../ui";
3
+ import { Alert, Code, Div, Heading, Li, Row, Section, Span, Stack, Table, Tbody, Td, Text, TextLink, Th, Thead, Tr, Ul } from "../../../ui";
4
4
  import { ROUTES } from "../../../next/routing/route-map";
5
5
  const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
6
6
  const LIST_DISC = "list-disc leading-relaxed";
@@ -97,5 +97,5 @@ function MultipleStoresSection() {
97
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: "mx-1", size: "xs", padding: "xs", rounded: "default", surface: "subtle", 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
98
  }
99
99
  export function StoreCapabilitiesGuideView(_props) {
100
- return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", 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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Capabilities Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", 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, {}) })] }));
100
+ return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", children: [_jsxs(TextLink, { variant: "bare", href: String(ROUTES.STORE.GUIDE), size: "sm", layout: "inline-flex", align: "center", gap: "sm", className: "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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Capabilities Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", 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
101
  }
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Row } from "@mohasinac/appkit/ui";
3
3
  import { ArrowLeft } from "lucide-react";
4
- import { Alert, Code, Div, Heading, Li, Section, Span, Stack, Text, Ul } from "../../../ui";
4
+ import { Alert, Code, Div, Heading, Li, Section, Span, Stack, Text, TextLink, Ul } from "../../../ui";
5
5
  import { ROUTES } from "../../../next/routing/route-map";
6
6
  const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
7
7
  const LIST_DISC = "list-disc leading-relaxed";
@@ -76,5 +76,5 @@ function TaxesSection() {
76
76
  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." })] }));
77
77
  }
78
78
  export function StoreFinanceGuideView(_props) {
79
- return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", 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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Finance Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", 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
+ return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", children: [_jsxs(TextLink, { variant: "bare", href: String(ROUTES.STORE.GUIDE), size: "sm", layout: "inline-flex", align: "center", gap: "sm", className: "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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Finance Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", 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, {}) })] }));
80
80
  }
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Package, ShoppingBag, Wallet, Settings, Shield, Headphones, CheckCircle2, Circle, BookOpen, } from "lucide-react";
3
- import { Div, Heading, Progress, Row, Section, Stack, Text } from "../../../ui";
3
+ import { Div, Heading, Progress, Row, Section, Stack, Text, TextLink } from "../../../ui";
4
4
  import { ROUTES } from "../../../next/routing/route-map";
5
5
  const CLS_CHECK_ICON = "w-5 h-5 flex-shrink-0 text-emerald-500";
6
6
  const CLS_SUCCESS_BOX = "rounded-xl border border-emerald-200 bg-emerald-50 dark:bg-emerald-950/30 dark:border-emerald-800 px-5 py-4";
@@ -77,7 +77,7 @@ export function StoreGuideHubView({ store }) {
77
77
  const storeName = store?.storeName ?? "Your Store";
78
78
  const steps = buildChecklist(store);
79
79
  const completedCount = steps.filter((s) => s.done).length;
80
- return (_jsxs(Stack, { gap: "xl", padding: "b-2xl", children: [_jsx(Section, { overflow: "hidden", className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)]", rounded: "2xl", shadow: "sm", children: _jsxs(Div, { paddingX: "x-md-xl", paddingY: "y-xl", className: "[background:linear-gradient(135deg,var(--appkit-color-primary-700)_0%,var(--appkit-color-cobalt)_60%,var(--appkit-color-secondary-400)_100%)]", children: [_jsxs(Row, { className: "mb-3", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", surface: "default", align: "center", justify: "center", rounded: "xl", children: _jsx(BookOpen, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { color: "inverse", className: "/80 tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Seller Guide" })] }), _jsx(Heading, { color: "inverse", level: 1, className: "mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: storeName }), _jsx(Text, { color: "inverse", className: "/80", size: "base", children: "Everything you need to know about selling on LetItRip." })] }) }), _jsxs(Div, { layout: "grid", gap: "8", className: "grid-cols-1 lg:grid-cols-3", children: [_jsxs(Stack, { className: "lg:col-span-2", gap: "md", children: [_jsx(Heading, { level: 2, className: "text-[var(--appkit-color-text)]", size: "lg", weight: "semibold", children: "Guides" }), _jsx(Div, { layout: "grid", gap: "4", className: "grid-cols-1 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(Row, { align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-9 h-9 [background:linear-gradient(135deg,var(--appkit-color-primary-700)_0%,var(--appkit-color-cobalt)_100%)]", align: "center", justify: "center", rounded: "lg", children: _jsx(Icon, { className: "w-4 h-4 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text)] group-hover:text-[var(--appkit-color-primary)] transition-colors", weight: "semibold", children: title })] }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] leading-relaxed", size: "sm", children: description }), _jsx(Text, { className: "text-[var(--appkit-color-primary)] mt-auto", size: "xs", weight: "medium", children: "Read guide \u2192" })] }, title))) })] }), _jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 2, className: "text-[var(--appkit-color-text)]", size: "lg", weight: "semibold", children: "Getting started" }), _jsxs(Div, { overflow: "hidden", className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)]", rounded: "xl", children: [_jsxs(Div, { className: "px-[1.25rem] pt-[1.25rem] border-b border-[var(--appkit-color-border)]", padding: "b-md", children: [_jsxs(Row, { className: "mb-2", align: "center", justify: "between", children: [_jsxs(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: [completedCount, " of ", steps.length, " complete"] }), _jsxs(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: [Math.round((completedCount / steps.length) * 100), "%"] })] }), _jsx(Progress, { value: completedCount, max: steps.length, size: "sm", variant: "gradient" })] }), _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
80
+ return (_jsxs(Stack, { gap: "xl", padding: "b-2xl", children: [_jsx(Section, { overflow: "hidden", className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)]", rounded: "2xl", shadow: "sm", children: _jsxs(Div, { paddingX: "x-md-xl", paddingY: "y-xl", className: "[background:linear-gradient(135deg,var(--appkit-color-primary-700)_0%,var(--appkit-color-cobalt)_60%,var(--appkit-color-secondary-400)_100%)]", children: [_jsxs(Row, { className: "mb-3", align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-10 h-10", surface: "default", align: "center", justify: "center", rounded: "xl", children: _jsx(BookOpen, { className: "w-5 h-5 text-white" }) }), _jsx(Text, { color: "inverse", className: "/80 tracking-widest", size: "sm", weight: "semibold", transform: "uppercase", children: "Seller Guide" })] }), _jsx(Heading, { color: "inverse", level: 1, className: "mb-2", mdSize: "3xl", size: "2xl", weight: "bold", children: storeName }), _jsx(Text, { color: "inverse", className: "/80", size: "base", children: "Everything you need to know about selling on LetItRip." })] }) }), _jsxs(Div, { layout: "grid", gap: "8", className: "grid-cols-1 lg:grid-cols-3", children: [_jsxs(Stack, { className: "lg:col-span-2", gap: "md", children: [_jsx(Heading, { level: 2, className: "text-[var(--appkit-color-text)]", size: "lg", weight: "semibold", children: "Guides" }), _jsx(Div, { layout: "grid", gap: "4", className: "grid-cols-1 sm:grid-cols-2", children: GUIDE_CARDS.map(({ Icon, title, description, href }) => (_jsxs(TextLink, { variant: "bare", href: href, rounded: "xl", layout: "flex-col", gap: "md", className: "group 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(Row, { align: "center", gap: "3", children: [_jsx(Row, { className: "flex-shrink-0 w-9 h-9 [background:linear-gradient(135deg,var(--appkit-color-primary-700)_0%,var(--appkit-color-cobalt)_100%)]", align: "center", justify: "center", rounded: "lg", children: _jsx(Icon, { className: "w-4 h-4 text-white" }) }), _jsx(Text, { className: "text-[var(--appkit-color-text)] group-hover:text-[var(--appkit-color-primary)] transition-colors", weight: "semibold", children: title })] }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] leading-relaxed", size: "sm", children: description }), _jsx(Text, { className: "text-[var(--appkit-color-primary)] mt-auto", size: "xs", weight: "medium", children: "Read guide \u2192" })] }, title))) })] }), _jsxs(Stack, { gap: "md", children: [_jsx(Heading, { level: 2, className: "text-[var(--appkit-color-text)]", size: "lg", weight: "semibold", children: "Getting started" }), _jsxs(Div, { overflow: "hidden", className: "border border-[var(--appkit-color-border)] bg-[var(--appkit-color-surface)]", rounded: "xl", children: [_jsxs(Div, { className: "px-[1.25rem] pt-[1.25rem] border-b border-[var(--appkit-color-border)]", padding: "b-md", children: [_jsxs(Row, { className: "mb-2", align: "center", justify: "between", children: [_jsxs(Text, { className: "text-[var(--appkit-color-text)]", size: "sm", weight: "medium", children: [completedCount, " of ", steps.length, " complete"] }), _jsxs(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: [Math.round((completedCount / steps.length) * 100), "%"] })] }), _jsx(Progress, { value: completedCount, max: steps.length, size: "sm", variant: "gradient" })] }), _jsx(Div, { className: "divide-y divide-[var(--appkit-color-border)]", children: steps.map(({ label, done, href }) => (_jsxs(TextLink, { variant: "bare", href: done ? "#" : href, "aria-disabled": done, layout: "flex", align: "center", gap: "sm", paddingX: "lg", size: "sm", className: `py-3.5 transition-colors ${done
81
81
  ? "cursor-default"
82
82
  : "hover:bg-[var(--appkit-color-border)]/30"}`, children: [done ? (_jsx(CheckCircle2, { className: CLS_CHECK_ICON })) : (_jsx(Circle, { className: "w-5 h-5 flex-shrink-0 text-[var(--appkit-color-text-muted)]" })), _jsx(Text, { className: `leading-snug ${done
83
83
  ? "line-through text-[var(--appkit-color-text-muted)]"
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Row } from "@mohasinac/appkit/ui";
3
3
  import { ArrowLeft } from "lucide-react";
4
- import { Alert, Div, Heading, Li, Section, Span, Stack, Table, Tbody, Td, Text, Th, Thead, Tr, Ul } from "../../../ui";
4
+ import { Alert, Div, Heading, Li, Section, Span, Stack, Table, Tbody, Td, Text, TextLink, Th, Thead, Tr, Ul } from "../../../ui";
5
5
  import { ROUTES } from "../../../next/routing/route-map";
6
6
  const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
7
7
  const LIST_DISC = "list-disc leading-relaxed";
@@ -148,5 +148,5 @@ function CommonMistakes() {
148
148
  return (_jsx(Alert, { variant: "warning", title: "Common mistakes to avoid", children: _jsx(Ul, { className: "mt-2", spacing: "comfortable", indent: "md", children: MISTAKES.map((m) => (_jsx(Li, { textSize: "sm", className: LIST_DISC, children: m }, m))) }) }));
149
149
  }
150
150
  export function StoreListingsGuideView(_props) {
151
- return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", 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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Listings Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", 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
+ return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", children: [_jsxs(TextLink, { variant: "bare", href: String(ROUTES.STORE.GUIDE), size: "sm", layout: "inline-flex", align: "center", gap: "sm", className: "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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Listings Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", 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, {}) })] }));
152
152
  }
@@ -1,11 +1,11 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
2
- import { Div } from "../../../ui";
2
+ import { Div, TextLink } from "../../../ui";
3
3
  export function StoreNavTabs({ tabs, activeValue, onTabChange, renderTabBar, className = "", }) {
4
4
  const handleChange = (v) => onTabChange?.(v);
5
5
  if (renderTabBar) {
6
6
  return _jsx(_Fragment, { children: renderTabBar(tabs, activeValue, handleChange) });
7
7
  }
8
- return (_jsx(Div, { layout: "flex", gap: "2", role: "tablist", border: "bottom", className: `overflow-x-auto ${className}`, children: tabs.map((tab) => tab.href ? (_jsx("a", { href: tab.href, role: "tab", "aria-selected": activeValue === tab.value, className: `px-4 py-2 text-sm font-medium whitespace-nowrap border-b-2 -mb-px transition-colors ${activeValue === tab.value
8
+ return (_jsx(Div, { layout: "flex", gap: "2", role: "tablist", border: "bottom", className: `overflow-x-auto ${className}`, children: tabs.map((tab) => tab.href ? (_jsx(TextLink, { variant: "bare", href: tab.href, role: "tab", "aria-selected": activeValue === tab.value, paddingX: "md", paddingY: "xs", size: "sm", weight: "medium", className: `whitespace-nowrap border-b-2 -mb-px transition-colors ${activeValue === tab.value
9
9
  ? "border-primary text-primary"
10
10
  : "border-transparent text-[var(--appkit-color-text-muted)] text-[var(--appkit-color-text-muted)] hover:text-neutral-800 hover:text-[var(--appkit-color-text-muted)]"}`, children: tab.label }, tab.value)) : (_jsx("button", { type: "button", role: "tab", "aria-selected": activeValue === tab.value, onClick: () => handleChange(tab.value), className: `px-4 py-2 text-sm font-medium whitespace-nowrap border-b-2 -mb-px transition-colors ${activeValue === tab.value
11
11
  ? "border-primary text-primary"
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { ArrowLeft } from "lucide-react";
3
- import { Accordion, Alert, Code, Div, Heading, Li, Ol, Row, Section, Span, Stack, Table, Tbody, Td, Text, Th, Thead, Tr, Ul } from "../../../ui";
3
+ import { Accordion, Alert, Code, Div, Heading, Li, Ol, Row, Section, Span, Stack, Table, Tbody, Td, Text, TextLink, Th, Thead, Tr, Ul } from "../../../ui";
4
4
  import { ROUTES } from "../../../next/routing/route-map";
5
5
  const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
6
6
  const LIST_DISC = "list-disc leading-relaxed";
@@ -118,5 +118,5 @@ function CommonFAQs() {
118
118
  return (_jsx(Stack, { gap: "3", children: FAQS.map(({ q, a }) => (_jsx(Accordion, { title: q, children: _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] leading-relaxed", size: "sm", children: a }) }, q))) }));
119
119
  }
120
120
  export function StoreOrdersGuideView(_props) {
121
- return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", 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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Orders & Fulfilment Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", children: "Processing orders, shipping, cancellations, returns, and auction orders." })] }), _jsx(GuideSection, { title: "1. Order lifecycle", children: _jsx(OrderLifecycle, {}) }), _jsx(GuideSection, { title: "2. Processing an order", children: _jsx(ProcessingWalkthrough, {}) }), _jsx(GuideSection, { title: "3. Supported carriers", children: _jsx(CarriersSection, {}) }), _jsx(GuideSection, { title: "4. Cancellations", children: _jsx(CancellationsSection, {}) }), _jsx(GuideSection, { title: "5. Return requests", children: _jsx(ReturnsSection, {}) }), _jsx(GuideSection, { title: "6. Auction orders", children: _jsx(AuctionOrdersSection, {}) }), _jsx(GuideSection, { title: "7. Common questions", children: _jsx(CommonFAQs, {}) })] }));
121
+ return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", children: [_jsxs(TextLink, { variant: "bare", href: String(ROUTES.STORE.GUIDE), size: "sm", layout: "inline-flex", align: "center", gap: "sm", className: "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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Orders & Fulfilment Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", children: "Processing orders, shipping, cancellations, returns, and auction orders." })] }), _jsx(GuideSection, { title: "1. Order lifecycle", children: _jsx(OrderLifecycle, {}) }), _jsx(GuideSection, { title: "2. Processing an order", children: _jsx(ProcessingWalkthrough, {}) }), _jsx(GuideSection, { title: "3. Supported carriers", children: _jsx(CarriersSection, {}) }), _jsx(GuideSection, { title: "4. Cancellations", children: _jsx(CancellationsSection, {}) }), _jsx(GuideSection, { title: "5. Return requests", children: _jsx(ReturnsSection, {}) }), _jsx(GuideSection, { title: "6. Auction orders", children: _jsx(AuctionOrdersSection, {}) }), _jsx(GuideSection, { title: "7. Common questions", children: _jsx(CommonFAQs, {}) })] }));
122
122
  }
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Row } from "@mohasinac/appkit/ui";
3
3
  import { ArrowLeft } from "lucide-react";
4
- import { Alert, Code, Div, Heading, Li, Section, Span, Stack, Text, Ul } from "../../../ui";
4
+ import { Alert, Code, Div, Heading, Li, Section, Span, Stack, Text, TextLink, Ul } from "../../../ui";
5
5
  import { ROUTES } from "../../../next/routing/route-map";
6
6
  const SUBHEADING = "mb-1 font-semibold text-[var(--appkit-color-text)]";
7
7
  const LIST_DISC = "list-disc leading-relaxed";
@@ -28,7 +28,7 @@ function VacationModeSection() {
28
28
  }
29
29
  // -- Section 5: WhatsApp integration ------------------------------------------
30
30
  function WhatsAppSection() {
31
- return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Text, { className: "leading-relaxed", children: ["The WhatsApp integration allows your customers to contact you via WhatsApp from your store profile and lets you sync your product catalog to your WhatsApp Business Catalog (requires the", _jsx(Code, { className: "mx-1", size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "whatsapp_catalog_sync" }), " capability)."] }), _jsxs(Text, { className: "leading-relaxed", children: ["Full settings and the catalog sync toggle are at", " ", _jsx("a", { href: String(ROUTES.STORE.WHATSAPP), className: "underline text-[var(--appkit-color-primary)] hover:opacity-80", children: "Settings \u2192 WhatsApp" }), ". See the WhatsApp settings page for step-by-step setup instructions."] })] }));
31
+ return (_jsxs(Div, { className: SECTION_BODY, children: [_jsxs(Text, { className: "leading-relaxed", children: ["The WhatsApp integration allows your customers to contact you via WhatsApp from your store profile and lets you sync your product catalog to your WhatsApp Business Catalog (requires the", _jsx(Code, { className: "mx-1", size: "xs", padding: "xs", rounded: "default", surface: "subtle", children: "whatsapp_catalog_sync" }), " capability)."] }), _jsxs(Text, { className: "leading-relaxed", children: ["Full settings and the catalog sync toggle are at", " ", _jsx(TextLink, { variant: "bare", href: String(ROUTES.STORE.WHATSAPP), className: "underline text-[var(--appkit-color-primary)] hover:opacity-80", children: "Settings \u2192 WhatsApp" }), ". See the WhatsApp settings page for step-by-step setup instructions."] })] }));
32
32
  }
33
33
  // -- Section 6: Visibility states ---------------------------------------------
34
34
  function VisibilityStatesSection() {
@@ -53,5 +53,5 @@ function VisibilityStatesSection() {
53
53
  return (_jsx(Stack, { gap: "3", children: STATES.map(({ state, note }) => (_jsxs(Row, { textSize: "sm", gap: "3", children: [_jsx(Text, { className: "shrink-0 w-32 text-[var(--appkit-color-text)]", weight: "semibold", children: state }), _jsx(Text, { className: "text-[var(--appkit-color-text-muted)] leading-relaxed", children: note })] }, state))) }));
54
54
  }
55
55
  export function StoreSettingsGuideView(_props) {
56
- return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", 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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Settings Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", children: "Store profile, shipping, returns, vacation mode, WhatsApp, and visibility." })] }), _jsx(GuideSection, { title: "1. Store profile", children: _jsx(StoreProfileSection, {}) }), _jsx(GuideSection, { title: "2. Shipping configuration", children: _jsx(ShippingSection, {}) }), _jsx(GuideSection, { title: "3. Return policy", children: _jsx(ReturnPolicySection, {}) }), _jsx(GuideSection, { title: "4. Vacation mode", children: _jsx(VacationModeSection, {}) }), _jsx(GuideSection, { title: "5. WhatsApp integration", children: _jsx(WhatsAppSection, {}) }), _jsx(GuideSection, { title: "6. Visibility states", children: _jsx(VisibilityStatesSection, {}) })] }));
56
+ return (_jsxs(Stack, { gap: "lg", padding: "b-2xl", children: [_jsxs(TextLink, { variant: "bare", href: String(ROUTES.STORE.GUIDE), size: "sm", layout: "inline-flex", align: "center", gap: "sm", className: "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-[var(--appkit-color-text)]", size: "2xl", weight: "bold", children: "Settings Guide" }), _jsx(Text, { className: "mt-1 text-[var(--appkit-color-text-muted)]", size: "sm", children: "Store profile, shipping, returns, vacation mode, WhatsApp, and visibility." })] }), _jsx(GuideSection, { title: "1. Store profile", children: _jsx(StoreProfileSection, {}) }), _jsx(GuideSection, { title: "2. Shipping configuration", children: _jsx(ShippingSection, {}) }), _jsx(GuideSection, { title: "3. Return policy", children: _jsx(ReturnPolicySection, {}) }), _jsx(GuideSection, { title: "4. Vacation mode", children: _jsx(VacationModeSection, {}) }), _jsx(GuideSection, { title: "5. WhatsApp integration", children: _jsx(WhatsAppSection, {}) }), _jsx(GuideSection, { title: "6. Visibility states", children: _jsx(VisibilityStatesSection, {}) })] }));
57
57
  }
@@ -1,16 +1,9 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { sortBy } from "@mohasinac/appkit";
4
3
  import React from "react";
5
4
  import { Div, Heading, Row, Text } from "../../../ui";
6
5
  import { useUrlTable } from "../../../react/hooks/useUrlTable";
7
6
  import { useWishlist } from "../hooks/useWishlist";
8
- const WISHLIST_SORT_OPTIONS = [
9
- { value: sortBy("addedAt", "DESC"), label: "Newest first" },
10
- { value: "addedAt", label: "Oldest first" },
11
- { value: sortBy("price", "DESC"), label: "Price: high → low" },
12
- { value: sortBy("price", "ASC"), label: "Price: low → high" },
13
- ];
14
7
  export function WishlistView({ userId, initialData, labels = {}, renderTabs, renderSearch, renderSort, renderViewToggle, renderProducts, renderTabPlaceholder, renderBulkActions, renderPagination, className = "", }) {
15
8
  const table = useUrlTable({ defaults: { sort: "-addedAt", view: "card" } });
16
9
  const [selectedIds, setSelectedIds] = React.useState([]);
package/dist/index.d.ts CHANGED
@@ -911,6 +911,7 @@ export { FeesView } from "./features/about/index";
911
911
  export { HelpPageView } from "./features/about/index";
912
912
  export { HowAuctionsWorkView } from "./features/about/index";
913
913
  export { HowCheckoutWorksView } from "./features/about/index";
914
+ export { HowEmiWorksView } from "./features/about/index";
914
915
  export { HowOffersWorkView } from "./features/about/index";
915
916
  export { HowOrdersWorkView } from "./features/about/index";
916
917
  export { HowPayoutsWorkView } from "./features/about/index";
@@ -929,6 +930,7 @@ export type { FeesViewProps } from "./features/about/index";
929
930
  export type { HelpPageViewProps } from "./features/about/index";
930
931
  export type { HowAuctionsWorkViewProps } from "./features/about/index";
931
932
  export type { HowCheckoutWorksViewProps } from "./features/about/index";
933
+ export type { HowEmiWorksViewProps } from "./features/about/index";
932
934
  export type { HowOffersWorkViewProps } from "./features/about/index";
933
935
  export type { HowOrdersWorkViewProps } from "./features/about/index";
934
936
  export type { HowPayoutsWorkViewProps } from "./features/about/index";
package/dist/index.js CHANGED
@@ -1888,6 +1888,9 @@ export { HowAuctionsWorkView } from "./features/about/index";
1888
1888
  // HowCheckoutWorksView - Component for how checkout works view.
1889
1889
  export { HowCheckoutWorksView } from "./features/about/index";
1890
1890
  // [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
1891
+ // HowEmiWorksView - Component for how EMI works view.
1892
+ export { HowEmiWorksView } from "./features/about/index";
1893
+ // [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
1891
1894
  // HowOffersWorkView - Component for how offers work view.
1892
1895
  export { HowOffersWorkView } from "./features/about/index";
1893
1896
  // [CLIENT-SSR]-Runs in both SSR and browser â€" React component or hook that does not depend on browser-only APIs.
@@ -72,6 +72,7 @@ export declare const DEFAULT_ROUTE_MAP: {
72
72
  readonly HOW_PRE_ORDERS_WORK: "/how-pre-orders-work";
73
73
  readonly HOW_OFFERS_WORK: "/how-offers-work";
74
74
  readonly HOW_CHECKOUT_WORKS: "/how-checkout-works";
75
+ readonly HOW_EMI_WORKS: "/how-emi-works";
75
76
  readonly HOW_ORDERS_WORK: "/how-orders-work";
76
77
  readonly HOW_REVIEWS_WORK: "/how-reviews-work";
77
78
  readonly HOW_PAYOUTS_WORK: "/how-payouts-work";
@@ -421,6 +422,7 @@ export declare const ROUTES: {
421
422
  readonly HOW_PRE_ORDERS_WORK: "/how-pre-orders-work";
422
423
  readonly HOW_OFFERS_WORK: "/how-offers-work";
423
424
  readonly HOW_CHECKOUT_WORKS: "/how-checkout-works";
425
+ readonly HOW_EMI_WORKS: "/how-emi-works";
424
426
  readonly HOW_ORDERS_WORK: "/how-orders-work";
425
427
  readonly HOW_REVIEWS_WORK: "/how-reviews-work";
426
428
  readonly HOW_PAYOUTS_WORK: "/how-payouts-work";
@@ -60,6 +60,7 @@ export const DEFAULT_ROUTE_MAP = {
60
60
  HOW_PRE_ORDERS_WORK: "/how-pre-orders-work",
61
61
  HOW_OFFERS_WORK: "/how-offers-work",
62
62
  HOW_CHECKOUT_WORKS: "/how-checkout-works",
63
+ HOW_EMI_WORKS: "/how-emi-works",
63
64
  HOW_ORDERS_WORK: "/how-orders-work",
64
65
  HOW_REVIEWS_WORK: "/how-reviews-work",
65
66
  HOW_PAYOUTS_WORK: "/how-payouts-work",
@@ -3,38 +3,6 @@ import { seedExtMedia } from "../_helpers/media";
3
3
  import { getSeedLocale, getDefaultCurrency, pick, irand, } from "../seed-market-config";
4
4
  let _seq = 1;
5
5
  // --- Realistic data pools (from seed locale config) ---------------------------
6
- const PRODUCT_NAMES = [
7
- "Handloom Cotton Saree",
8
- "Silver Oxidised Jhumkas",
9
- "Brass Pooja Diya Set",
10
- "Khadi Kurta & Pyjama Set",
11
- "Terracotta Flower Vase",
12
- "Sandalwood Incense Sticks",
13
- "Batik Print Salwar Suit",
14
- "Copper Water Bottle",
15
- "Warli Art Wall Frame",
16
- "Clay Tea Kadai Set",
17
- "Jute Laptop Bag",
18
- "Madhubani Painting Print",
19
- "Organic Tulsi Green Tea",
20
- "Kantha Embroidered Cushion",
21
- "Brass Dancing Ganesha Figurine",
22
- "Block Print Bedsheet Set",
23
- "Bamboo Cutlery Kit",
24
- "Dhokra Metal Elephant",
25
- "Rajasthani Mojari Jutti",
26
- "Coconut Shell Bowl Set",
27
- ];
28
- const CATEGORIES = [
29
- "clothing",
30
- "jewellery",
31
- "home-decor",
32
- "food-beverages",
33
- "art-crafts",
34
- "wellness",
35
- "accessories",
36
- "kitchenware",
37
- ];
38
6
  const TAGS_POOL = [
39
7
  ["handmade", "artisan"],
40
8
  ["featured", "new-arrival"],
@@ -484,22 +484,41 @@ export const faqSeedData = [
484
484
  {
485
485
  id: "faq-payment-methods",
486
486
  question: "What payment methods are accepted?",
487
- answer: html(`<p>LetItRip accepts UPI (GPay, PhonePe, Paytm), credit/debit cards, net banking, and wallets via Razorpay. All payments are processed through secure escrow the seller only receives funds after you confirm delivery.</p>`),
487
+ answer: html(`<p>LetItRip's default payment method is <strong>Manual UPI / Bank Transfer</strong> — you pay directly and submit your payment reference, which the seller or LetItRip confirms before shipping. Where enabled, you can also pay instantly via <strong>Razorpay</strong> (cards, UPI, net banking), choose <strong>Cash on Delivery</strong> (a small deposit online plus cash on arrival), or spread the cost with <strong>EMI</strong> on eligible orders. Sellers only receive payout funds after you confirm delivery (or after the dispute window closes).</p>`),
488
488
  category: "orders_payment",
489
489
  showOnHomepage: false,
490
490
  showInFooter: true,
491
491
  isPinned: false,
492
492
  order: 25,
493
493
  priority: 8,
494
- tags: ["payment", "upi", "razorpay", "escrow"],
495
- relatedFAQs: ["faq-what-is-escrow"],
494
+ tags: ["payment", "upi", "razorpay", "cod", "emi"],
495
+ relatedFAQs: ["faq-what-is-escrow", "faq-emi-installments"],
496
496
  stats: makeStats(5100, 255),
497
- seo: { slug: "faq-payment-methods", metaTitle: "Payment Methods on LetItRip", metaDescription: "UPI, cards, net banking — all payment options on LetItRip." },
497
+ seo: { slug: "faq-payment-methods", metaTitle: "Payment Methods on LetItRip", metaDescription: "Manual UPI, Razorpay, Cash on Delivery, and EMI — all payment options on LetItRip." },
498
498
  isActive: true,
499
499
  createdBy: "user-admin-letitrip",
500
500
  createdAt: daysAgo(110),
501
501
  updatedAt: daysAgo(6),
502
502
  },
503
+ {
504
+ id: "faq-emi-installments",
505
+ question: "Can I pay in installments (EMI)?",
506
+ answer: html(`<p>Yes — on eligible orders. If the seller has EMI enabled and your order with them meets the minimum order value, "Pay in EMI" appears as a payment option at checkout. Choose a tenure of 2–6 months, pay a small token amount upfront, and the remaining balance plus a small monthly surcharge is billed automatically in equal installments each month. Your order ships as soon as the token payment is confirmed — you don't wait for the full amount to be paid.</p>`),
507
+ category: "orders_payment",
508
+ showOnHomepage: false,
509
+ showInFooter: false,
510
+ isPinned: false,
511
+ order: 56,
512
+ priority: 6,
513
+ tags: ["emi", "installments", "payment"],
514
+ relatedFAQs: ["faq-payment-methods"],
515
+ stats: makeStats(1400, 70),
516
+ seo: { slug: "faq-emi-installments", metaTitle: "Pay in EMI on LetItRip", metaDescription: "How EMI installment payments work for eligible orders on LetItRip." },
517
+ isActive: true,
518
+ createdBy: "user-admin-letitrip",
519
+ createdAt: daysAgo(20),
520
+ updatedAt: daysAgo(2),
521
+ },
503
522
  {
504
523
  id: "faq-coupons-and-discounts",
505
524
  question: "How do I use coupons and discount codes?",