@mohasinac/appkit 3.3.5 → 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.
- package/dist/_internal/client/features/classified/ClassifiedDetailView.js +2 -1
- package/dist/_internal/client/features/digital-code/DigitalCodeDetailView.js +2 -1
- package/dist/_internal/client/features/live/LiveItemDetailView.js +2 -1
- package/dist/_internal/client/features/lottery/LotteryAdminEditView.js +1 -1
- package/dist/_internal/client/features/lottery/LotteryDetailView.js +2 -1
- package/dist/_internal/client/features/lottery/LotteryListView.js +2 -1
- package/dist/_internal/client/features/lottery/PrizeDrawLotteryDetailView.js +2 -1
- package/dist/_internal/server/features/checkout/actions.js +0 -1
- package/dist/_internal/server/features/lottery/actions.js +0 -2
- package/dist/_internal/server/features/reviews/actions.js +1 -1
- package/dist/features/about/components/AboutView.js +1 -1
- package/dist/features/about/components/FAQPageView.js +0 -2
- package/dist/features/about/components/FeesView.js +13 -1
- package/dist/features/about/components/HowCheckoutWorksView.js +17 -3
- package/dist/features/about/components/HowEmiWorksView.d.ts +3 -0
- package/dist/features/about/components/HowEmiWorksView.js +117 -0
- package/dist/features/about/components/PublicProfileView.js +1 -4
- package/dist/features/about/components/TrackOrderView.js +1 -1
- package/dist/features/about/index.d.ts +2 -0
- package/dist/features/about/index.js +1 -0
- package/dist/features/account/components/AddressesIndexListing.js +1 -1
- package/dist/features/account/components/BecomeSellerView.d.ts +1 -1
- package/dist/features/account/components/BecomeSellerView.js +1 -1
- package/dist/features/account/components/NotificationBell.js +1 -2
- package/dist/features/account/components/UserSupportView.js +0 -1
- package/dist/features/admin/components/AdminAdsView.js +3 -3
- package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
- package/dist/features/admin/components/AdminBundleEditorView.js +0 -4
- package/dist/features/admin/components/AdminCarouselEditorView.js +3 -3
- package/dist/features/admin/components/AdminCarouselView.js +3 -2
- package/dist/features/admin/components/AdminGuideHubView.js +2 -2
- package/dist/features/admin/components/AdminMediaView.js +2 -4
- package/dist/features/admin/components/AdminProductsView.js +2 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +1 -1
- package/dist/features/admin/components/AdminUserEditorView.d.ts +1 -1
- package/dist/features/admin/components/AdminUserEditorView.js +1 -1
- package/dist/features/admin/components/QuickActionsPanel.js +2 -2
- package/dist/features/auctions/components/AuctionBidsTable.js +1 -1
- package/dist/features/auctions/components/AuctionDetailPageView.js +1 -1
- package/dist/features/blog/components/BlogFeaturedCard.js +2 -1
- package/dist/features/blog/components/BlogIndexListing.js +1 -1
- package/dist/features/blog/components/BlogListView.js +2 -1
- package/dist/features/blog/components/BlogPostForm.js +1 -1
- package/dist/features/blog/components/BlogPostView.js +2 -1
- package/dist/features/cart/components/CartDrawer.js +2 -1
- package/dist/features/categories/components/BrandDetailPageView.js +2 -1
- package/dist/features/categories/components/BundleCollage.js +2 -3
- package/dist/features/categories/components/CategoriesIndexListing.js +1 -5
- package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
- package/dist/features/categories/components/CategoryGrid.js +2 -1
- package/dist/features/categories/components/CategoryProductsView.d.ts +1 -1
- package/dist/features/categories/components/CategoryProductsView.js +1 -1
- package/dist/features/categories/components/ConcernCard.js +2 -1
- package/dist/features/collections/components/CollectionCard.js +2 -1
- package/dist/features/consultation/components/ConsultationForm.js +0 -1
- package/dist/features/contact/components/ContactInfoSidebar.js +2 -2
- package/dist/features/copilot/components/AdminCopilotView.js +0 -9
- package/dist/features/events/components/EventFormDrawer.d.ts +1 -1
- package/dist/features/events/components/EventFormDrawer.js +1 -1
- package/dist/features/events/components/EventLeaderboard.js +1 -1
- package/dist/features/events/components/EventPollWidget.js +2 -2
- package/dist/features/events/components/EventsIndexListing.js +1 -1
- package/dist/features/faq/actions/faq-actions.d.ts +2 -10
- package/dist/features/faq/actions/faq-actions.js +0 -4
- package/dist/features/forms/Slider.js +1 -1
- package/dist/features/homepage/components/AdSlot.js +2 -1
- package/dist/features/homepage/components/BeforeAfterCard.js +1 -1
- package/dist/features/homepage/components/CustomCardsSection.js +2 -3
- package/dist/features/homepage/components/FeaturedBundlesSection.js +2 -3
- package/dist/features/homepage/components/GoogleReviewsSection.js +4 -3
- package/dist/features/homepage/components/HeroBanner.js +0 -1
- package/dist/features/homepage/components/HowItWorksInfoView.js +1 -1
- package/dist/features/homepage/components/SectionCarousel.d.ts +1 -1
- package/dist/features/homepage/components/SectionCarousel.js +1 -2
- package/dist/features/homepage/components/SiteFeaturesSection.js +1 -1
- package/dist/features/homepage/components/SocialFeedSection.js +2 -5
- package/dist/features/homepage/components/SocialPostCard.js +4 -3
- package/dist/features/homepage/components/TrustIndicatorsSection.js +1 -1
- package/dist/features/media/MediaPickerModal.js +2 -3
- package/dist/features/media/upload/MediaUploadList.js +2 -2
- package/dist/features/orders/components/MarketplaceOrderCard.js +7 -4
- package/dist/features/orders/components/OrdersList.js +2 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -0
- package/dist/features/products/api/route.js +1 -2
- package/dist/features/products/components/BidHistory.js +1 -1
- package/dist/features/products/components/CompareOverlay.js +2 -3
- package/dist/features/products/components/CustomSectionTabContent.js +2 -2
- package/dist/features/products/components/FeatureBadge.js +0 -6
- package/dist/features/products/components/GroupSettingsPanel.js +2 -3
- package/dist/features/products/components/MarketplaceBundleCard.js +2 -1
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +2 -3
- package/dist/features/products/components/PrizeDrawCollage.js +2 -3
- package/dist/features/products/components/PrizeDrawEntryActions.d.ts +1 -1
- package/dist/features/products/components/PrizeDrawEntryActions.js +3 -3
- package/dist/features/products/components/PrizeRevealModal.js +3 -4
- package/dist/features/products/components/ProductDetailActions.d.ts +1 -1
- package/dist/features/products/components/ProductDetailActions.js +1 -1
- package/dist/features/products/components/ProductDetailPageView.d.ts +3 -1
- package/dist/features/products/components/ProductDetailPageView.js +3 -2
- package/dist/features/products/components/ProductFeatureBadges.d.ts +7 -1
- package/dist/features/products/components/ProductFeatureBadges.js +16 -3
- package/dist/features/products/components/ProductGalleryClient.js +1 -1
- package/dist/features/products/components/ProductGradingTab.js +2 -2
- package/dist/features/products/components/ProductsIndexPageView.js +2 -2
- package/dist/features/products/components/ShowGroupSection.js +1 -1
- package/dist/features/products/components/SublistingCarouselSection.js +3 -4
- package/dist/features/promotions/components/CouponsIndexListing.d.ts +1 -1
- package/dist/features/promotions/components/CouponsIndexListing.js +1 -1
- package/dist/features/reviews/components/ReviewDetailShell.js +4 -3
- package/dist/features/reviews/components/ReviewModal.js +2 -1
- package/dist/features/reviews/components/ReviewsIndexListing.js +1 -1
- package/dist/features/reviews/components/ReviewsList.js +2 -1
- package/dist/features/scams/components/ScamAwarenessModal.js +2 -2
- package/dist/features/search/components/Search.js +1 -1
- package/dist/features/search/components/SearchView.d.ts +1 -1
- package/dist/features/search/components/SearchView.js +1 -1
- package/dist/features/seller/components/SellerAddressesView.js +1 -5
- package/dist/features/seller/components/SellerGoogleReviewsView.js +1 -1
- package/dist/features/seller/components/SellerPayoutMethodsView.js +1 -1
- package/dist/features/seller/components/SellerPreOrdersView.js +3 -2
- package/dist/features/shell/QuickFormDrawer.js +1 -1
- package/dist/features/shell/StepForm.js +1 -1
- package/dist/features/stores/components/InteractiveStoreCard.js +1 -2
- package/dist/features/stores/components/StoreAboutView.js +2 -2
- package/dist/features/stores/components/StoreCapabilitiesGuideView.js +2 -2
- package/dist/features/stores/components/StoreFinanceGuideView.js +2 -2
- package/dist/features/stores/components/StoreGuideHubView.js +2 -2
- package/dist/features/stores/components/StoreListingsGuideView.js +2 -2
- package/dist/features/stores/components/StoreNavTabs.js +2 -2
- package/dist/features/stores/components/StoreOrdersGuideView.js +2 -2
- package/dist/features/stores/components/StoreSettingsGuideView.js +3 -3
- package/dist/features/wishlist/components/WishlistView.js +0 -7
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/next/ErrorBoundary.js +2 -2
- package/dist/next/routing/route-map.d.ts +2 -0
- package/dist/next/routing/route-map.js +1 -0
- package/dist/seed/factories/product.factory.js +0 -32
- package/dist/seed/faq-seed-data.js +23 -4
- package/dist/styles.css +1 -1
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/index.js +6 -458
- package/dist/ui/DataTable.js +0 -21
- package/dist/ui/components/Anchor.d.ts +12 -3
- package/dist/ui/components/Anchor.js +18 -2
- package/dist/ui/components/Breadcrumb.js +2 -1
- package/dist/ui/components/Div.d.ts +1 -1
- package/dist/ui/components/Div.js +2 -0
- package/dist/ui/components/FormActionBar.js +2 -1
- package/dist/ui/components/ListingLayout.d.ts +1 -1
- package/dist/ui/components/ListingLayout.js +1 -1
- package/dist/ui/components/Motion.js +1 -1
- package/dist/ui/components/QuickCreateModal.js +2 -1
- package/dist/ui/components/SlottedListingView.d.ts +1 -1
- package/dist/ui/components/SlottedListingView.js +1 -2
- package/dist/ui/components/Typography.d.ts +1 -1
- package/dist/ui/components/Typography.js +1 -0
- package/dist/ui/components/surface-tokens.d.ts +1 -1
- package/dist/ui/components/surface-tokens.js +4 -0
- package/package.json +1 -1
|
@@ -121,7 +121,7 @@ export function QuickFormDrawer({ isOpen, onClose, title, fields, defaultValues,
|
|
|
121
121
|
if (!isOpen)
|
|
122
122
|
return null;
|
|
123
123
|
const busy = submitting || isLoading;
|
|
124
|
-
return (_jsxs(_Fragment, { children: [_jsx(Div, { surface: "overlay-xs", className: "fixed inset-0 backdrop-blur-[2px] [z-index:calc(var(--appkit-z-modal)+1)]", "aria-hidden": "true", onClick: handleClose }), _jsxs(Div, { ref: drawerRef, role: "dialog", "aria-modal": "true", "aria-label": title, className: "fixed inset-y-0 right-0
|
|
124
|
+
return (_jsxs(_Fragment, { children: [_jsx(Div, { surface: "overlay-xs", className: "fixed inset-0 backdrop-blur-[2px] [z-index:calc(var(--appkit-z-modal)+1)]", "aria-hidden": "true", onClick: handleClose }), _jsxs(Div, { ref: drawerRef, role: "dialog", "aria-modal": "true", "aria-label": title, layout: "flex-col", shadow: "2xl", className: "fixed inset-y-0 right-0 bg-[var(--appkit-color-surface)] w-full lg:w-[40%] [z-index:calc(var(--appkit-z-modal)+2)]", children: [_jsxs(Row, { className: "flex-shrink-0 border-b border-[var(--appkit-color-border)]", padding: "md", align: "center", gap: "3", children: [_jsx(Text, { className: "flex-1 text-[var(--appkit-color-text)]", size: "base", weight: "semibold", children: title }), _jsx("button", { type: "button", onClick: handleClose, "aria-label": "Close", className: "rounded-lg p-1.5 text-[var(--appkit-color-text-muted)] hover:bg-[var(--appkit-color-border-subtle)] transition-colors", children: _jsx(X, { className: "w-5 h-5" }) })] }), _jsxs("form", { className: "flex-1 overflow-y-auto px-4 py-5 space-y-4", onSubmit: handleSubmit, noValidate: true, children: [fields.map((field) => {
|
|
125
125
|
const value = values[field.name];
|
|
126
126
|
if (field.type === "toggle") {
|
|
127
127
|
return (_jsxs(Stack, { gap: "xs", children: [_jsx(Toggle, { checked: !!value, onChange: (checked) => set(field.name, checked), label: field.label }), field.helperText && (_jsx(Text, { className: "text-[var(--appkit-color-text-muted)]", size: "xs", children: field.helperText }))] }, field.name));
|
|
@@ -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,
|
|
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)
|
|
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(
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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.
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Component } from "react";
|
|
4
4
|
import { Button } from "../ui/components/Button";
|
|
5
|
-
import {
|
|
5
|
+
import { Stack } from "../ui/components/Layout";
|
|
6
6
|
import { Heading, Text } from "../ui/components/Typography";
|
|
7
7
|
function DefaultFallback({ error, onReset, }) {
|
|
8
|
-
return (_jsxs(
|
|
8
|
+
return (_jsxs(Stack, { centered: true, gap: "md", surface: "default", padding: "lg", rounded: "xl", border: "default", className: "min-h-[40vh] text-center", "data-section": "errorboundary-div-445", children: [_jsx(Heading, { level: 2, children: "Something went wrong" }), _jsx(Text, { variant: "secondary", children: "An unexpected error occurred. Please try again." }), process.env.NODE_ENV === "development" && error ? (_jsx("pre", { className: "max-w-full overflow-auto rounded-md bg-[var(--appkit-color-surface)] p-3 text-left text-xs bg-[var(--appkit-color-surface-elevated)]", children: error.message })) : null, _jsx(Button, { type: "button", onClick: onReset, children: "Try again" })] }));
|
|
9
9
|
}
|
|
10
10
|
export class ErrorBoundary extends Component {
|
|
11
11
|
constructor(props) {
|
|
@@ -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
|
|
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", "
|
|
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,
|
|
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?",
|