@mohasinac/appkit 4.32.5 → 4.33.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/server/features/products/actions.js +29 -3
- package/dist/_internal/server/features/products/list-public.d.ts +1 -1
- package/dist/_internal/server/features/products/list-public.js +10 -2
- package/dist/_internal/server/features/stores/denormalize.d.ts +44 -0
- package/dist/_internal/server/features/stores/denormalize.js +58 -0
- package/dist/_internal/server/features/stores/index.d.ts +1 -0
- package/dist/_internal/server/features/stores/index.js +1 -0
- package/dist/_internal/server/jobs/core/jobRunners.js +5 -0
- package/dist/_internal/server/jobs/core/storeNameBackfill.d.ts +27 -0
- package/dist/_internal/server/jobs/core/storeNameBackfill.js +90 -0
- package/dist/_internal/shared/features/products/to-product-item.js +7 -0
- package/dist/client.d.ts +1 -1
- package/dist/client.js +4 -1
- package/dist/features/admin/actions/admin-actions.js +11 -1
- package/dist/features/admin/components/AdminSectionsView.js +17 -20
- package/dist/features/admin/components/sections/adminSectionsBuildParse.js +31 -14
- package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +37 -7
- package/dist/features/admin/components/sections/adminSectionsTypes.js +11 -7
- package/dist/features/auctions/components/AuctionDetailPageView.js +56 -36
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +9 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -2
- package/dist/features/blog/components/BlogFeaturedCard.d.ts +7 -1
- package/dist/features/blog/components/BlogFeaturedCard.js +3 -3
- package/dist/features/cart/repository/cart.repository.d.ts +27 -6
- package/dist/features/cart/repository/cart.repository.js +52 -21
- package/dist/features/cart/utils/guest-cart.js +5 -0
- package/dist/features/cart/utils/pending-ops.d.ts +15 -0
- package/dist/features/cart/utils/pending-ops.js +24 -0
- package/dist/features/events/components/EventRafflesSection.js +2 -1
- package/dist/features/homepage/components/BlogArticlesSection.d.ts +7 -1
- package/dist/features/homepage/components/BlogArticlesSection.js +5 -3
- package/dist/features/homepage/components/CTABannerSection.d.ts +18 -1
- package/dist/features/homepage/components/CTABannerSection.js +22 -4
- package/dist/features/homepage/components/CustomerReviewsSection.d.ts +7 -1
- package/dist/features/homepage/components/CustomerReviewsSection.js +2 -2
- package/dist/features/homepage/components/FAQSection.js +2 -11
- package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +3 -1
- package/dist/features/homepage/components/FeaturedAuctionsSection.js +5 -3
- package/dist/features/homepage/components/FeaturedBundlesSection.d.ts +7 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.js +6 -5
- package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +3 -1
- package/dist/features/homepage/components/FeaturedPreOrdersSection.js +4 -2
- package/dist/features/homepage/components/FeaturedProductsSection.d.ts +3 -1
- package/dist/features/homepage/components/FeaturedProductsSection.js +5 -3
- package/dist/features/homepage/components/HeroCarousel.d.ts +23 -2
- package/dist/features/homepage/components/HeroCarousel.js +22 -9
- package/dist/features/homepage/components/HomepageCustomerReviewsSection.d.ts +6 -1
- package/dist/features/homepage/components/HomepageCustomerReviewsSection.js +11 -3
- package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +9 -1
- package/dist/features/homepage/components/MarketplaceHomepageView.js +7 -4
- package/dist/features/homepage/components/StatsCounterSection.d.ts +6 -1
- package/dist/features/homepage/components/StatsCounterSection.js +3 -3
- package/dist/features/homepage/constants/faq-category-labels.d.ts +15 -0
- package/dist/features/homepage/constants/faq-category-labels.js +23 -0
- package/dist/features/homepage/constants/section-copy.d.ts +107 -0
- package/dist/features/homepage/constants/section-copy.js +96 -0
- package/dist/features/homepage/lib/section-renderer.d.ts +16 -1
- package/dist/features/homepage/lib/section-renderer.js +58 -37
- package/dist/features/homepage/repository/homepage-sections.repository.d.ts +23 -0
- package/dist/features/homepage/repository/homepage-sections.repository.js +40 -0
- package/dist/features/homepage/schemas/firestore.d.ts +120 -44
- package/dist/features/media/MediaImage.d.ts +10 -1
- package/dist/features/media/MediaImage.js +6 -3
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -2
- package/dist/features/products/components/CardStoreLine.d.ts +32 -0
- package/dist/features/products/components/CardStoreLine.js +14 -0
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +2 -1
- package/dist/features/products/components/ProductGrid.js +3 -6
- package/dist/features/products/schemas/firestore.d.ts +17 -0
- package/dist/features/products/types/index.d.ts +2 -0
- package/dist/features/seller/actions/seller-actions.d.ts +17 -0
- package/dist/features/seller/actions/seller-actions.js +54 -0
- package/dist/features/stores/components/StoreAuctionsListing.js +3 -0
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +119 -0
- package/dist/seed/carousel-slides-seed-data.js +154 -22
- package/dist/seed/carousels-seed-data.js +4 -1
- package/dist/seed/homepage-sections-seed-data.js +337 -254
- package/dist/seed/products-preorders-seed-data.d.ts +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +4 -0
- package/dist/styles.css +1 -1
- package/dist/tailwind-utilities.css +1 -1
- package/package.json +1 -1
|
@@ -29,6 +29,10 @@ const LBL_MAX_ITEMS = "Max items";
|
|
|
29
29
|
const LBL_AUTOMATIC = "Automatic";
|
|
30
30
|
const LBL_MANUAL_IDS = "Manual IDs";
|
|
31
31
|
const LBL_SCROLL_INTERVAL = "Scroll interval (ms)";
|
|
32
|
+
// Shared by all 11 section builders that expose a "view all" link.
|
|
33
|
+
const LBL_VIEW_MORE = "View all link label";
|
|
34
|
+
const PH_VIEW_MORE = "View all →";
|
|
35
|
+
const HELP_VIEW_MORE = "Leave blank to use the default label.";
|
|
32
36
|
export function AdminSectionsView({ children }) {
|
|
33
37
|
const hasChildren = React.Children.count(children) > 0;
|
|
34
38
|
const queryClient = useQueryClient();
|
|
@@ -498,7 +502,7 @@ export function AdminSectionsView({ children }) {
|
|
|
498
502
|
})) }, category.id))) }))] }));
|
|
499
503
|
}
|
|
500
504
|
function renderProductsBuilder() {
|
|
501
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Products Carousel Builder" }), _jsx(Input, { label: "Section title", value: productsBuilder.title, onChange: (event) => setProductsBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: "Subtitle", value: productsBuilder.subtitle, onChange: (event) => setProductsBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max products", type: "number", min: 1, max: 50, value: String(productsBuilder.maxItems), onChange: (event) => setProductsBuilder((prev) => ({
|
|
505
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Products Carousel Builder" }), _jsx(Input, { label: "Section title", value: productsBuilder.title, onChange: (event) => setProductsBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: productsBuilder.viewMoreLabel, onChange: (event) => setProductsBuilder((prev) => ({ ...prev, viewMoreLabel: event.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: productsBuilder.subtitle, onChange: (event) => setProductsBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max products", type: "number", min: 1, max: 50, value: String(productsBuilder.maxItems), onChange: (event) => setProductsBuilder((prev) => ({
|
|
502
506
|
...prev,
|
|
503
507
|
maxItems: Math.max(1, Number(event.target.value) || 1),
|
|
504
508
|
})) }), _jsx(Select, { label: "Status filter", value: productsBuilder.status, onValueChange: (value) => setProductsBuilder((prev) => ({
|
|
@@ -535,7 +539,7 @@ export function AdminSectionsView({ children }) {
|
|
|
535
539
|
})) }, category.id))) }))] }));
|
|
536
540
|
}
|
|
537
541
|
function renderAuctionsBuilder() {
|
|
538
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Auctions Carousel Builder" }), _jsx(Input, { label: "Section title", value: auctionsBuilder.title, onChange: (event) => setAuctionsBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: "Subtitle", value: auctionsBuilder.subtitle, onChange: (event) => setAuctionsBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max auctions", type: "number", min: 1, max: 50, value: String(auctionsBuilder.maxItems), onChange: (event) => setAuctionsBuilder((prev) => ({
|
|
542
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Auctions Carousel Builder" }), _jsx(Input, { label: "Section title", value: auctionsBuilder.title, onChange: (event) => setAuctionsBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: auctionsBuilder.viewMoreLabel, onChange: (event) => setAuctionsBuilder((prev) => ({ ...prev, viewMoreLabel: event.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: auctionsBuilder.subtitle, onChange: (event) => setAuctionsBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max auctions", type: "number", min: 1, max: 50, value: String(auctionsBuilder.maxItems), onChange: (event) => setAuctionsBuilder((prev) => ({
|
|
539
543
|
...prev,
|
|
540
544
|
maxItems: Math.max(1, Number(event.target.value) || 1),
|
|
541
545
|
})) }), _jsx(Select, { label: "Status filter", value: auctionsBuilder.status, onValueChange: (value) => setAuctionsBuilder((prev) => ({
|
|
@@ -579,7 +583,7 @@ export function AdminSectionsView({ children }) {
|
|
|
579
583
|
return (_jsxs(Stack, { gap: "sm", children: [_jsx(Text, { className: "tracking-wide", color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Category selectors" }), categoriesQuery.isLoading ? (_jsx(Text, { size: "sm", color: "muted", children: "Loading categories..." })) : categoryOptions.length === 0 ? (_jsx(Text, { size: "sm", color: "muted", children: "No categories available." })) : (_jsx(Div, { layout: "grid", gap: "2", className: "grid-cols-1 sm:grid-cols-2", children: categoryOptions.map((category) => (_jsx(Checkbox, { checked: selectedIds.includes(category.id), label: category.name, onChange: (event) => onToggle(category.id, event.target.checked) }, category.id))) }))] }));
|
|
580
584
|
}
|
|
581
585
|
function renderPreOrdersBuilder() {
|
|
582
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Pre-Orders Carousel Builder" }), _jsx(Input, { label: "Section title", value: preOrdersBuilder.title, onChange: (event) => setPreOrdersBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: "Subtitle", value: preOrdersBuilder.subtitle, onChange: (event) => setPreOrdersBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max pre-orders", type: "number", min: 1, max: 50, value: String(preOrdersBuilder.maxItems), onChange: (event) => setPreOrdersBuilder((prev) => ({
|
|
586
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Pre-Orders Carousel Builder" }), _jsx(Input, { label: "Section title", value: preOrdersBuilder.title, onChange: (event) => setPreOrdersBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: preOrdersBuilder.viewMoreLabel, onChange: (event) => setPreOrdersBuilder((prev) => ({ ...prev, viewMoreLabel: event.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: preOrdersBuilder.subtitle, onChange: (event) => setPreOrdersBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max pre-orders", type: "number", min: 1, max: 50, value: String(preOrdersBuilder.maxItems), onChange: (event) => setPreOrdersBuilder((prev) => ({
|
|
583
587
|
...prev,
|
|
584
588
|
maxItems: Math.max(1, Number(event.target.value) || 1),
|
|
585
589
|
})) }), _jsx(Select, { label: "Status filter", value: preOrdersBuilder.status, onValueChange: (value) => setPreOrdersBuilder((prev) => ({
|
|
@@ -610,7 +614,7 @@ export function AdminSectionsView({ children }) {
|
|
|
610
614
|
})) })] }));
|
|
611
615
|
}
|
|
612
616
|
function renderStoresBuilder() {
|
|
613
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Stores Section Builder" }), _jsx(Input, { label: "Section title", value: storesBuilder.title, onChange: (event) => setStoresBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: "Subtitle", value: storesBuilder.subtitle, onChange: (event) => setStoresBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max stores", type: "number", min: 1, max: 30, value: String(storesBuilder.maxItems), onChange: (event) => setStoresBuilder((prev) => ({
|
|
617
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Stores Section Builder" }), _jsx(Input, { label: "Section title", value: storesBuilder.title, onChange: (event) => setStoresBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: storesBuilder.viewMoreLabel, onChange: (event) => setStoresBuilder((prev) => ({ ...prev, viewMoreLabel: event.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: storesBuilder.subtitle, onChange: (event) => setStoresBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max stores", type: "number", min: 1, max: 30, value: String(storesBuilder.maxItems), onChange: (event) => setStoresBuilder((prev) => ({
|
|
614
618
|
...prev,
|
|
615
619
|
maxItems: Math.max(1, Number(event.target.value) || 1),
|
|
616
620
|
})) }), _jsx(Select, { label: "Status filter", value: storesBuilder.status, onValueChange: (value) => setStoresBuilder((prev) => ({
|
|
@@ -647,7 +651,7 @@ export function AdminSectionsView({ children }) {
|
|
|
647
651
|
})) })] }));
|
|
648
652
|
}
|
|
649
653
|
function renderEventsBuilder() {
|
|
650
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Events Section Builder" }), _jsx(Input, { label: "Section title", value: eventsBuilder.title, onChange: (event) => setEventsBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: "Subtitle", value: eventsBuilder.subtitle, onChange: (event) => setEventsBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max events", type: "number", min: 1, max: 30, value: String(eventsBuilder.maxItems), onChange: (event) => setEventsBuilder((prev) => ({
|
|
654
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Events Section Builder" }), _jsx(Input, { label: "Section title", value: eventsBuilder.title, onChange: (event) => setEventsBuilder((prev) => ({ ...prev, title: event.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: eventsBuilder.viewMoreLabel, onChange: (event) => setEventsBuilder((prev) => ({ ...prev, viewMoreLabel: event.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: eventsBuilder.subtitle, onChange: (event) => setEventsBuilder((prev) => ({ ...prev, subtitle: event.target.value })) }), _jsx(Input, { label: "Max events", type: "number", min: 1, max: 30, value: String(eventsBuilder.maxItems), onChange: (event) => setEventsBuilder((prev) => ({
|
|
651
655
|
...prev,
|
|
652
656
|
maxItems: Math.max(1, Number(event.target.value) || 1),
|
|
653
657
|
})) }), _jsx(Select, { label: "Status filter", value: eventsBuilder.status, onValueChange: (value) => setEventsBuilder((prev) => ({
|
|
@@ -684,7 +688,7 @@ export function AdminSectionsView({ children }) {
|
|
|
684
688
|
})) })] }));
|
|
685
689
|
}
|
|
686
690
|
function renderFAQBuilder() {
|
|
687
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "FAQ Section Builder" }), _jsx(Input, { label: "Section title", value: faqBuilder.title, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: faqBuilder.subtitle, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Display count", type: "number", min: 1, max: 20, value: String(faqBuilder.displayCount), onChange: (e) => setFaqBuilder((prev) => ({ ...prev, displayCount: Math.min(20, Math.max(1, Number(e.target.value) || 1)) })) }), _jsx(Checkbox, { checked: faqBuilder.showOnHomepage, label: "Show on homepage", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, showOnHomepage: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.expandedByDefault, label: "Expanded by default", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, expandedByDefault: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.linkToFullPage, label: "Link to full FAQ page", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, linkToFullPage: e.target.checked })) }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { className: "tracking-wide", color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Categories" }), _jsx(Div, { layout: "grid", gap: "2", className: "grid-cols-2", children: FAQ_CATEGORY_OPTIONS.map((opt) => (_jsx(Checkbox, { checked: faqBuilder.categories.includes(opt.value), label: opt.label, onChange: (e) => setFaqBuilder((prev) => ({
|
|
691
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "FAQ Section Builder" }), _jsx(Input, { label: "Section title", value: faqBuilder.title, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: faqBuilder.viewMoreLabel, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, viewMoreLabel: e.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: faqBuilder.subtitle, onChange: (e) => setFaqBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Display count", type: "number", min: 1, max: 20, value: String(faqBuilder.displayCount), onChange: (e) => setFaqBuilder((prev) => ({ ...prev, displayCount: Math.min(20, Math.max(1, Number(e.target.value) || 1)) })) }), _jsx(Checkbox, { checked: faqBuilder.showOnHomepage, label: "Show on homepage", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, showOnHomepage: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.expandedByDefault, label: "Expanded by default", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, expandedByDefault: e.target.checked })) }), _jsx(Checkbox, { checked: faqBuilder.linkToFullPage, label: "Link to full FAQ page", onChange: (e) => setFaqBuilder((prev) => ({ ...prev, linkToFullPage: e.target.checked })) }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { className: "tracking-wide", color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Categories" }), _jsx(Div, { layout: "grid", gap: "2", className: "grid-cols-2", children: FAQ_CATEGORY_OPTIONS.map((opt) => (_jsx(Checkbox, { checked: faqBuilder.categories.includes(opt.value), label: opt.label, onChange: (e) => setFaqBuilder((prev) => ({
|
|
688
692
|
...prev,
|
|
689
693
|
categories: e.target.checked
|
|
690
694
|
? [...prev.categories, opt.value]
|
|
@@ -692,10 +696,10 @@ export function AdminSectionsView({ children }) {
|
|
|
692
696
|
})) }, opt.value))) })] })] }));
|
|
693
697
|
}
|
|
694
698
|
function renderBlogBuilder() {
|
|
695
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Blog Articles Builder" }), _jsx(Input, { label: "Section title", value: blogBuilder.title, onChange: (e) => setBlogBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "Max articles", value: String(blogBuilder.maxArticles), onValueChange: (v) => setBlogBuilder((prev) => ({ ...prev, maxArticles: Number(v) })), options: [{ label: "3", value: "3" }, { label: "4", value: "4" }, { label: "6", value: "6" }] }), _jsx(Checkbox, { checked: blogBuilder.showReadTime, label: "Show read time", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showReadTime: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showAuthor, label: "Show author", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showAuthor: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showThumbnails, label: "Show thumbnails", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showThumbnails: e.target.checked })) })] }));
|
|
699
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Blog Articles Builder" }), _jsx(Input, { label: "Section title", value: blogBuilder.title, onChange: (e) => setBlogBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: blogBuilder.viewMoreLabel, onChange: (e) => setBlogBuilder((prev) => ({ ...prev, viewMoreLabel: e.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Select, { label: "Max articles", value: String(blogBuilder.maxArticles), onValueChange: (v) => setBlogBuilder((prev) => ({ ...prev, maxArticles: Number(v) })), options: [{ label: "3", value: "3" }, { label: "4", value: "4" }, { label: "6", value: "6" }] }), _jsx(Checkbox, { checked: blogBuilder.showReadTime, label: "Show read time", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showReadTime: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showAuthor, label: "Show author", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showAuthor: e.target.checked })) }), _jsx(Checkbox, { checked: blogBuilder.showThumbnails, label: "Show thumbnails", onChange: (e) => setBlogBuilder((prev) => ({ ...prev, showThumbnails: e.target.checked })) })] }));
|
|
696
700
|
}
|
|
697
701
|
function renderNewsletterBuilder() {
|
|
698
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Newsletter Section Builder" }), _jsx(Input, { label: "Title", value: newsletterBuilder.title, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Textarea, { label: "Description", value: newsletterBuilder.description, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 2 }), _jsx(Input, { label: "
|
|
702
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Newsletter Section Builder" }), _jsx(Input, { label: "Title", value: newsletterBuilder.title, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Textarea, { label: "Description", value: newsletterBuilder.description, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 2 }), _jsx(Input, { label: "Privacy text", value: newsletterBuilder.privacyText, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, privacyText: e.target.value })) }), _jsx(Input, { label: "Privacy link", value: newsletterBuilder.privacyLink, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, privacyLink: e.target.value })), placeholder: String(ROUTES.PUBLIC.PRIVACY) })] }));
|
|
699
703
|
}
|
|
700
704
|
function renderBannerBuilder() {
|
|
701
705
|
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Banner Section Builder" }), _jsx(Select, { label: "Height", value: bannerBuilder.height, onValueChange: (v) => setBannerBuilder((prev) => ({ ...prev, height: v })), options: [{ label: "Small (200px)", value: "sm" }, { label: "Medium (300px)", value: "md" }, { label: "Large (400px)", value: "lg" }, { label: "Extra Large (500px)", value: "xl" }] }), _jsx(Input, { label: "Background image URL", type: "url", value: bannerBuilder.backgroundImage, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, backgroundImage: e.target.value })), placeholder: "https://..." }), _jsx(Input, { label: "Background color (CSS token)", value: bannerBuilder.backgroundColor, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, backgroundColor: e.target.value })), placeholder: "var(--appkit-color-primary)" }), _jsx(Input, { label: "Gradient from (CSS token)", value: bannerBuilder.gradientFrom, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, gradientFrom: e.target.value })), placeholder: "var(--appkit-color-primary)" }), _jsx(Input, { label: "Gradient to (CSS token)", value: bannerBuilder.gradientTo, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, gradientTo: e.target.value })), placeholder: "var(--appkit-color-secondary)" }), _jsx(Input, { label: "Content title", value: bannerBuilder.contentTitle, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentTitle: e.target.value })) }), _jsx(Input, { label: "Content subtitle", value: bannerBuilder.contentSubtitle, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentSubtitle: e.target.value })) }), _jsx(Textarea, { label: "Content description", value: bannerBuilder.contentDescription, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, contentDescription: e.target.value })), rows: 2 }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { className: "tracking-wide", color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Buttons (max 3)" }), bannerBuilder.buttons.map((btn, index) => (_jsxs(Stack, { rounded: "md", padding: "xs", border: "default", gap: "sm", children: [_jsxs(Row, { align: "center", justify: "between", children: [_jsxs(Text, { size: "xs", color: "muted", children: ["Button ", index + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setBannerBuilder((prev) => ({ ...prev, buttons: prev.buttons.filter((_, i) => i !== index) })), children: "Remove" })] }), _jsx(Input, { label: "Text", value: btn.text, onChange: (e) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], text: e.target.value }; return { ...prev, buttons: next }; }) }), _jsx(Input, { label: "Link", value: btn.link, onChange: (e) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], link: e.target.value }; return { ...prev, buttons: next }; }) }), _jsx(Select, { label: "Variant", value: btn.variant, onValueChange: (v) => setBannerBuilder((prev) => { const next = [...prev.buttons]; next[index] = { ...next[index], variant: v }; return { ...prev, buttons: next }; }), options: [{ label: "Primary", value: "primary" }, { label: "Secondary", value: "secondary" }, { label: "Outline", value: "outline" }] })] }, `banner-btn-${index}`))), bannerBuilder.buttons.length < 3 ? (_jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setBannerBuilder((prev) => ({ ...prev, buttons: [...prev.buttons, { text: "", link: "", variant: "primary" }] })), children: "+ Add button" })) : null] }), _jsx(Checkbox, { checked: bannerBuilder.clickable, label: "Make entire banner clickable", onChange: (e) => setBannerBuilder((prev) => ({ ...prev, clickable: e.target.checked })) }), bannerBuilder.clickable ? (_jsx(Input, { label: "Click link", value: bannerBuilder.clickLink, onChange: (e) => setBannerBuilder((prev) => ({ ...prev, clickLink: e.target.value })), placeholder: String(ROUTES.PUBLIC.PRODUCTS) })) : null] }));
|
|
@@ -704,10 +708,7 @@ export function AdminSectionsView({ children }) {
|
|
|
704
708
|
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Features Section Builder" }), _jsx(Input, { label: "Section title", value: featuresBuilder.title, onChange: (e) => setFeaturesBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { className: "tracking-wide", color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Feature items" }), featuresBuilder.features.map((feature, index) => (_jsxs(Row, { align: "center", gap: "sm", children: [_jsx(Input, { value: feature, onChange: (e) => setFeaturesBuilder((prev) => { const next = [...prev.features]; next[index] = e.target.value; return { ...prev, features: next }; }), className: "flex-1" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setFeaturesBuilder((prev) => ({ ...prev, features: prev.features.filter((_, i) => i !== index) })), children: "\u2715" })] }, `feat-${index}`))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setFeaturesBuilder((prev) => ({ ...prev, features: [...prev.features, ""] })), children: "+ Add feature" })] })] }));
|
|
705
709
|
}
|
|
706
710
|
function renderReviewsBuilder() {
|
|
707
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Reviews Section Builder" }), _jsx(Input, { label: "Section title", value: reviewsBuilder.title, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Select, { label: "
|
|
708
|
-
{ label: "Platform reviews (LetItRip)", value: "platform" },
|
|
709
|
-
{ label: "Google Business Reviews", value: "google" },
|
|
710
|
-
] }), reviewsBuilder.source === "google" ? (_jsx(Input, { label: "Google Place ID", value: reviewsBuilder.placeId, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, placeId: e.target.value })), placeholder: "ChIJ...", helperText: "Find your Place ID at maps.google.com/placesinventory" })) : null, _jsx(Select, { label: "Max reviews", value: String(reviewsBuilder.maxReviews), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, maxReviews: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Select, { label: "Items per view", value: String(reviewsBuilder.itemsPerView), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, itemsPerView: Number(v) })), options: [{ label: "1", value: "1" }, { label: "2", value: "2" }, { label: "3", value: "3" }] }), _jsx(Checkbox, { checked: reviewsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: LBL_SCROLL_INTERVAL, type: "number", min: 1000, step: 500, value: String(reviewsBuilder.scrollInterval), onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) }), _jsx(Checkbox, { checked: reviewsBuilder.loop, label: "Loop carousel", onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, loop: e.target.checked })) })] }));
|
|
711
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Reviews Section Builder" }), _jsx(Input, { label: "Section title", value: reviewsBuilder.title, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: reviewsBuilder.viewMoreLabel, onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, viewMoreLabel: e.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Select, { label: "Max reviews", value: String(reviewsBuilder.maxReviews), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, maxReviews: Number(v) })), options: [{ label: "5", value: "5" }, { label: "10", value: "10" }, { label: "20", value: "20" }] }), _jsx(Select, { label: "Items per view", value: String(reviewsBuilder.itemsPerView), onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, itemsPerView: Number(v) })), options: [{ label: "1", value: "1" }, { label: "2", value: "2" }, { label: "3", value: "3" }] }), _jsx(Checkbox, { checked: reviewsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: LBL_SCROLL_INTERVAL, type: "number", min: 1000, step: 500, value: String(reviewsBuilder.scrollInterval), onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) }), _jsx(Checkbox, { checked: reviewsBuilder.loop, label: "Loop carousel", onChange: (e) => setReviewsBuilder((prev) => ({ ...prev, loop: e.target.checked })) })] }));
|
|
711
712
|
}
|
|
712
713
|
function renderWhatsAppBuilder() {
|
|
713
714
|
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "WhatsApp Community Builder" }), _jsx(Input, { label: "Title", value: whatsappBuilder.title, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Textarea, { label: "Description", value: whatsappBuilder.description, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, description: e.target.value })), rows: 2 }), _jsx(Input, { label: "WhatsApp group link", type: "url", value: whatsappBuilder.groupLink, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, groupLink: e.target.value })), placeholder: "https://chat.whatsapp.com/..." }), _jsx(Input, { label: "Member count", type: "number", min: 0, value: String(whatsappBuilder.memberCount), onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, memberCount: Math.max(0, Number(e.target.value) || 0) })) }), _jsxs(Stack, { gap: "sm", children: [_jsx(Text, { className: "tracking-wide", color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: "Benefits" }), whatsappBuilder.benefits.map((benefit, index) => (_jsxs(Row, { align: "center", gap: "sm", children: [_jsx(Input, { value: benefit, onChange: (e) => setWhatsappBuilder((prev) => { const next = [...prev.benefits]; next[index] = e.target.value; return { ...prev, benefits: next }; }), className: "flex-1" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setWhatsappBuilder((prev) => ({ ...prev, benefits: prev.benefits.filter((_, i) => i !== index) })), children: "\u2715" })] }, `wb-${index}`))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setWhatsappBuilder((prev) => ({ ...prev, benefits: [...prev.benefits, ""] })), children: "+ Add benefit" })] }), _jsx(Input, { label: "Button text", value: whatsappBuilder.buttonText, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, buttonText: e.target.value })) }), _jsx(Input, { label: "Testimonial (optional)", value: whatsappBuilder.testimonial, onChange: (e) => setWhatsappBuilder((prev) => ({ ...prev, testimonial: e.target.value })) })] }));
|
|
@@ -719,10 +720,10 @@ export function AdminSectionsView({ children }) {
|
|
|
719
720
|
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Trust Indicators Builder" }), _jsx(Input, { label: "Section title", value: trustIndicatorsBuilder.title, onChange: (e) => setTrustIndicatorsBuilder((prev) => ({ ...prev, title: e.target.value })) }), trustIndicatorsBuilder.indicators.map((ind, index) => (_jsxs(Stack, { className: `${__P.p3}`, gap: "sm", rounded: "md", border: "default", children: [_jsxs(Row, { align: "center", justify: "between", children: [_jsxs(Text, { className: "tracking-wide", color: "muted", size: "xs", weight: "semibold", transform: "uppercase", children: ["Indicator ", index + 1] }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => setTrustIndicatorsBuilder((prev) => ({ ...prev, indicators: prev.indicators.filter((_, i) => i !== index) })), children: "Remove" })] }), _jsx(Input, { label: "Icon (emoji or text)", value: ind.icon, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], icon: e.target.value }; return { ...prev, indicators: next }; }) }), _jsx(Input, { label: "Title", value: ind.title, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], title: e.target.value }; return { ...prev, indicators: next }; }) }), _jsx(Input, { label: "Description", value: ind.description, onChange: (e) => setTrustIndicatorsBuilder((prev) => { const next = [...prev.indicators]; next[index] = { ...next[index], description: e.target.value }; return { ...prev, indicators: next }; }) })] }, ind.id))), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setTrustIndicatorsBuilder((prev) => ({ ...prev, indicators: [...prev.indicators, { id: `ti-${Date.now()}`, icon: "✨", title: "", description: "" }] })), children: "+ Add indicator" })] }));
|
|
720
721
|
}
|
|
721
722
|
function renderCategoriesBuilder() {
|
|
722
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Categories Section Builder" }), _jsx(Input, { label: "Section title", value: categoriesBuilder.title, onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Max categories (4\u201312)", type: "number", min: 4, max: 12, value: String(categoriesBuilder.maxCategories), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, maxCategories: Math.min(12, Math.max(4, Number(e.target.value) || 4)) })) }), _jsx(Checkbox, { checked: categoriesBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: LBL_SCROLL_INTERVAL, type: "number", min: 1000, step: 500, value: String(categoriesBuilder.scrollInterval), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) }), _jsx(Checkbox, { checked: categoriesBuilder.loop, label: "Loop carousel", onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, loop: e.target.checked })) })] }));
|
|
723
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Categories Section Builder" }), _jsx(Input, { label: "Section title", value: categoriesBuilder.title, onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: categoriesBuilder.viewMoreLabel, onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, viewMoreLabel: e.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Max categories (4\u201312)", type: "number", min: 4, max: 12, value: String(categoriesBuilder.maxCategories), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, maxCategories: Math.min(12, Math.max(4, Number(e.target.value) || 4)) })) }), _jsx(Checkbox, { checked: categoriesBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: LBL_SCROLL_INTERVAL, type: "number", min: 1000, step: 500, value: String(categoriesBuilder.scrollInterval), onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) }), _jsx(Checkbox, { checked: categoriesBuilder.loop, label: "Loop carousel", onChange: (e) => setCategoriesBuilder((prev) => ({ ...prev, loop: e.target.checked })) })] }));
|
|
723
724
|
}
|
|
724
725
|
function renderBrandsBuilder() {
|
|
725
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Brands Section Builder" }), _jsx(Input, { label: "Section title", value: brandsBuilder.title, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: "Subtitle", value: brandsBuilder.subtitle, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Max brands", type: "number", min: 1, max: 30, value: String(brandsBuilder.maxBrands), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, maxBrands: Math.max(1, Number(e.target.value) || 1) })) }), _jsx(Checkbox, { checked: brandsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: LBL_SCROLL_INTERVAL, type: "number", min: 1000, step: 500, value: String(brandsBuilder.scrollInterval), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) }), _jsx(Checkbox, { checked: brandsBuilder.loop, label: "Loop carousel", onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, loop: e.target.checked })) })] }));
|
|
726
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Brands Section Builder" }), _jsx(Input, { label: "Section title", value: brandsBuilder.title, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, title: e.target.value })) }), _jsx(Input, { label: LBL_VIEW_MORE, value: brandsBuilder.viewMoreLabel, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, viewMoreLabel: e.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: brandsBuilder.subtitle, onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, subtitle: e.target.value })) }), _jsx(Input, { label: "Max brands", type: "number", min: 1, max: 30, value: String(brandsBuilder.maxBrands), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, maxBrands: Math.max(1, Number(e.target.value) || 1) })) }), _jsx(Checkbox, { checked: brandsBuilder.autoScroll, label: "Auto-scroll", onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, autoScroll: e.target.checked })) }), _jsx(Input, { label: LBL_SCROLL_INTERVAL, type: "number", min: 1000, step: 500, value: String(brandsBuilder.scrollInterval), onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, scrollInterval: Math.max(1000, Number(e.target.value) || 1000) })) }), _jsx(Checkbox, { checked: brandsBuilder.loop, label: "Loop carousel", onChange: (e) => setBrandsBuilder((prev) => ({ ...prev, loop: e.target.checked })) })] }));
|
|
726
727
|
}
|
|
727
728
|
function renderCarouselBuilder() {
|
|
728
729
|
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Carousel Section Builder" }), _jsx(Input, { label: "Section title", value: carouselBuilder.title, onChange: (e) => setCarouselBuilder((prev) => ({ ...prev, title: e.target.value })), placeholder: "Hero Carousel" }), _jsx(Select, { label: "Slide height", value: carouselBuilder.height, onValueChange: (value) => setCarouselBuilder((prev) => ({ ...prev, height: value })), options: [
|
|
@@ -807,14 +808,10 @@ export function AdminSectionsView({ children }) {
|
|
|
807
808
|
] }), _jsx(Checkbox, { checked: googleReviewsBuilder.showRating, label: "Show star rating on each review", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, showRating: e.target.checked })) }), _jsx(Checkbox, { checked: googleReviewsBuilder.showDate, label: "Show review date", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, showDate: e.target.checked })) }), _jsx(Checkbox, { checked: googleReviewsBuilder.linkToGoogleMaps, label: "Link to Google Maps listing", onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, linkToGoogleMaps: e.target.checked })) }), googleReviewsBuilder.linkToGoogleMaps ? (_jsx(Input, { label: "Google Maps URL", value: googleReviewsBuilder.googleMapsUrl, onChange: (e) => setGoogleReviewsBuilder((prev) => ({ ...prev, googleMapsUrl: e.target.value })), placeholder: "https://maps.google.com/..." })) : null] }));
|
|
808
809
|
}
|
|
809
810
|
function renderFeaturedBundlesBuilder() {
|
|
810
|
-
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Featured Bundles Builder" }), _jsx(Input, { label: "Section title", value: featuredBundlesBuilder.title, onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, title: e.target.value })), placeholder: "Curated Bundles" }), _jsx(Input, { label: "Subtitle", value: featuredBundlesBuilder.subtitle, onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, subtitle: e.target.value })), placeholder: "Everything you need in one deal" }), _jsx(Input, { label: "Max items", type: "number", min: 1, max: 12, value: String(featuredBundlesBuilder.maxItems), onChange: (e) => setFeaturedBundlesBuilder((prev) => ({
|
|
811
|
+
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Featured Bundles Builder" }), _jsx(Input, { label: "Section title", value: featuredBundlesBuilder.title, onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, title: e.target.value })), placeholder: "Curated Bundles" }), _jsx(Input, { label: LBL_VIEW_MORE, value: featuredBundlesBuilder.viewMoreLabel, onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, viewMoreLabel: e.target.value })), placeholder: PH_VIEW_MORE, helperText: HELP_VIEW_MORE }), _jsx(Input, { label: "Subtitle", value: featuredBundlesBuilder.subtitle, onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, subtitle: e.target.value })), placeholder: "Everything you need in one deal" }), _jsx(Input, { label: "Max items", type: "number", min: 1, max: 12, value: String(featuredBundlesBuilder.maxItems), onChange: (e) => setFeaturedBundlesBuilder((prev) => ({
|
|
811
812
|
...prev,
|
|
812
813
|
maxItems: Math.max(1, Math.min(12, Number(e.target.value) || 8)),
|
|
813
|
-
})) }), _jsx(
|
|
814
|
-
{ label: "Newest first", value: "newest" },
|
|
815
|
-
{ label: "Biggest savings", value: "savings-desc" },
|
|
816
|
-
{ label: "Price: low → high", value: "price-asc" },
|
|
817
|
-
] }), _jsx(Checkbox, { checked: featuredBundlesBuilder.showSavingsBadge, label: "Show savings % badge on each bundle", onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, showSavingsBadge: e.target.checked })) }), _jsx(Text, { size: "xs", color: "muted", children: "The bundles collection lands later in the bundle / prize-draw work; until then this section renders an empty state." })] }));
|
|
814
|
+
})) }), _jsx(Checkbox, { checked: featuredBundlesBuilder.showSavingsBadge, label: "Show savings % badge on each bundle", onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, showSavingsBadge: e.target.checked })) })] }));
|
|
818
815
|
}
|
|
819
816
|
function renderPrizeDrawsBuilder() {
|
|
820
817
|
return (_jsxs(Div, { className: CLS_SECTION_PANEL, children: [_jsx(Text, { size: "sm", weight: "semibold", color: "primary", children: "Prize Draws Builder" }), _jsx(Input, { label: "Section title", value: prizeDrawsBuilder.title, onChange: (e) => setPrizeDrawsBuilder((prev) => ({ ...prev, title: e.target.value })), placeholder: "Prize Draws" }), _jsx(Input, { label: "Subtitle", value: prizeDrawsBuilder.subtitle, onChange: (e) => setPrizeDrawsBuilder((prev) => ({ ...prev, subtitle: e.target.value })), placeholder: "Enter for a chance to win rare collectibles" }), _jsx(Input, { label: "Max items", type: "number", min: 1, max: 12, value: String(prizeDrawsBuilder.maxItems), onChange: (e) => setPrizeDrawsBuilder((prev) => ({
|
|
@@ -31,6 +31,7 @@ export function toStringArray(value) {
|
|
|
31
31
|
export function buildProductsConfig(builder) {
|
|
32
32
|
return {
|
|
33
33
|
title: builder.title,
|
|
34
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
34
35
|
subtitle: builder.subtitle || undefined,
|
|
35
36
|
maxProducts: builder.maxItems,
|
|
36
37
|
maxCount: builder.maxCount,
|
|
@@ -57,6 +58,7 @@ export function buildProductsConfig(builder) {
|
|
|
57
58
|
export function buildAuctionsConfig(builder) {
|
|
58
59
|
return {
|
|
59
60
|
title: builder.title,
|
|
61
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
60
62
|
subtitle: builder.subtitle || undefined,
|
|
61
63
|
maxAuctions: builder.maxItems,
|
|
62
64
|
maxCount: builder.maxCount,
|
|
@@ -106,6 +108,7 @@ export function buildStatsConfig(builder) {
|
|
|
106
108
|
export function buildPreOrdersConfig(builder) {
|
|
107
109
|
return {
|
|
108
110
|
title: builder.title,
|
|
111
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
109
112
|
subtitle: builder.subtitle || undefined,
|
|
110
113
|
maxItems: builder.maxItems,
|
|
111
114
|
maxCount: builder.maxCount,
|
|
@@ -130,6 +133,7 @@ export function buildPreOrdersConfig(builder) {
|
|
|
130
133
|
export function buildStoresConfig(builder) {
|
|
131
134
|
return {
|
|
132
135
|
title: builder.title,
|
|
136
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
133
137
|
subtitle: builder.subtitle || undefined,
|
|
134
138
|
maxStores: builder.maxItems,
|
|
135
139
|
maxCount: builder.maxCount,
|
|
@@ -152,6 +156,7 @@ export function buildStoresConfig(builder) {
|
|
|
152
156
|
export function buildEventsConfig(builder) {
|
|
153
157
|
return {
|
|
154
158
|
title: builder.title,
|
|
159
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
155
160
|
subtitle: builder.subtitle || undefined,
|
|
156
161
|
maxEvents: builder.maxItems,
|
|
157
162
|
maxCount: builder.maxCount,
|
|
@@ -177,6 +182,7 @@ export function parseProductsBuilder(config) {
|
|
|
177
182
|
const maxCount = toNumberValue(config.maxCount, DEFAULT_PRODUCTS_BUILDER.maxCount);
|
|
178
183
|
return {
|
|
179
184
|
title: toStringValue(config.title, DEFAULT_PRODUCTS_BUILDER.title),
|
|
185
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
180
186
|
subtitle: toStringValue(config.subtitle),
|
|
181
187
|
maxItems: toNumberValue(config.maxProducts, DEFAULT_PRODUCTS_BUILDER.maxItems),
|
|
182
188
|
status: toStringValue(filters.status, DEFAULT_PRODUCTS_BUILDER.status),
|
|
@@ -199,6 +205,7 @@ export function parseAuctionsBuilder(config) {
|
|
|
199
205
|
const maxCount = toNumberValue(config.maxCount, DEFAULT_AUCTIONS_BUILDER.maxCount);
|
|
200
206
|
return {
|
|
201
207
|
title: toStringValue(config.title, DEFAULT_AUCTIONS_BUILDER.title),
|
|
208
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
202
209
|
subtitle: toStringValue(config.subtitle),
|
|
203
210
|
maxItems: toNumberValue(config.maxAuctions, DEFAULT_AUCTIONS_BUILDER.maxItems),
|
|
204
211
|
status: toStringValue(filters.status, DEFAULT_AUCTIONS_BUILDER.status),
|
|
@@ -260,6 +267,7 @@ export function parsePreOrdersBuilder(config) {
|
|
|
260
267
|
const maxCount = toNumberValue(config.maxCount, DEFAULT_PRE_ORDERS_BUILDER.maxCount);
|
|
261
268
|
return {
|
|
262
269
|
title: toStringValue(config.title, DEFAULT_PRE_ORDERS_BUILDER.title),
|
|
270
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
263
271
|
subtitle: toStringValue(config.subtitle),
|
|
264
272
|
maxItems: toNumberValue(config.maxItems, DEFAULT_PRE_ORDERS_BUILDER.maxItems),
|
|
265
273
|
status: toStringValue(filters.status, DEFAULT_PRE_ORDERS_BUILDER.status),
|
|
@@ -280,6 +288,7 @@ export function parseStoresBuilder(config) {
|
|
|
280
288
|
const maxCount = toNumberValue(config.maxCount, DEFAULT_STORES_BUILDER.maxCount);
|
|
281
289
|
return {
|
|
282
290
|
title: toStringValue(config.title, DEFAULT_STORES_BUILDER.title),
|
|
291
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
283
292
|
subtitle: toStringValue(config.subtitle),
|
|
284
293
|
maxItems: toNumberValue(config.maxStores, DEFAULT_STORES_BUILDER.maxItems),
|
|
285
294
|
status: toStringValue(filters.status, DEFAULT_STORES_BUILDER.status),
|
|
@@ -301,6 +310,7 @@ export function parseEventsBuilder(config) {
|
|
|
301
310
|
const maxCount = toNumberValue(config.maxCount, DEFAULT_EVENTS_BUILDER.maxCount);
|
|
302
311
|
return {
|
|
303
312
|
title: toStringValue(config.title, DEFAULT_EVENTS_BUILDER.title),
|
|
313
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
304
314
|
subtitle: toStringValue(config.subtitle),
|
|
305
315
|
maxItems: toNumberValue(config.maxEvents, DEFAULT_EVENTS_BUILDER.maxItems),
|
|
306
316
|
status: toStringValue(filters.status, DEFAULT_EVENTS_BUILDER.status),
|
|
@@ -392,6 +402,7 @@ export function parseTrustIndicatorsBuilder(config) {
|
|
|
392
402
|
export function buildCategoriesConfig(builder) {
|
|
393
403
|
return {
|
|
394
404
|
title: builder.title,
|
|
405
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
395
406
|
maxCategories: builder.maxCategories,
|
|
396
407
|
autoScroll: builder.autoScroll,
|
|
397
408
|
scrollInterval: builder.scrollInterval,
|
|
@@ -401,6 +412,7 @@ export function buildCategoriesConfig(builder) {
|
|
|
401
412
|
export function parseCategoriesBuilder(config) {
|
|
402
413
|
return {
|
|
403
414
|
title: toStringValue(config.title, DEFAULT_CATEGORIES_BUILDER.title),
|
|
415
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
404
416
|
maxCategories: toNumberValue(config.maxCategories, DEFAULT_CATEGORIES_BUILDER.maxCategories),
|
|
405
417
|
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_CATEGORIES_BUILDER.autoScroll),
|
|
406
418
|
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_CATEGORIES_BUILDER.scrollInterval),
|
|
@@ -410,6 +422,7 @@ export function parseCategoriesBuilder(config) {
|
|
|
410
422
|
export function buildBrandsConfig(builder) {
|
|
411
423
|
return {
|
|
412
424
|
title: builder.title,
|
|
425
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
413
426
|
subtitle: builder.subtitle || undefined,
|
|
414
427
|
maxBrands: builder.maxBrands,
|
|
415
428
|
autoScroll: builder.autoScroll,
|
|
@@ -420,6 +433,7 @@ export function buildBrandsConfig(builder) {
|
|
|
420
433
|
export function parseBrandsBuilder(config) {
|
|
421
434
|
return {
|
|
422
435
|
title: toStringValue(config.title, DEFAULT_BRANDS_BUILDER.title),
|
|
436
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
423
437
|
subtitle: toStringValue(config.subtitle),
|
|
424
438
|
maxBrands: toNumberValue(config.maxBrands, DEFAULT_BRANDS_BUILDER.maxBrands),
|
|
425
439
|
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_BRANDS_BUILDER.autoScroll),
|
|
@@ -485,26 +499,24 @@ export function parseFeaturesBuilder(config) {
|
|
|
485
499
|
export function buildReviewsConfig(builder) {
|
|
486
500
|
return {
|
|
487
501
|
title: builder.title,
|
|
502
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
488
503
|
maxReviews: builder.maxReviews,
|
|
489
504
|
itemsPerView: builder.itemsPerView,
|
|
490
505
|
mobileItemsPerView: 1,
|
|
491
506
|
autoScroll: builder.autoScroll,
|
|
492
507
|
scrollInterval: builder.scrollInterval,
|
|
493
508
|
loop: builder.loop,
|
|
494
|
-
source: builder.source,
|
|
495
|
-
placeId: builder.source === "google" ? builder.placeId || undefined : undefined,
|
|
496
509
|
};
|
|
497
510
|
}
|
|
498
511
|
export function parseReviewsBuilder(config) {
|
|
499
512
|
return {
|
|
500
513
|
title: toStringValue(config.title, DEFAULT_REVIEWS_BUILDER.title),
|
|
514
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
501
515
|
maxReviews: toNumberValue(config.maxReviews, DEFAULT_REVIEWS_BUILDER.maxReviews),
|
|
502
516
|
itemsPerView: toNumberValue(config.itemsPerView, DEFAULT_REVIEWS_BUILDER.itemsPerView),
|
|
503
517
|
autoScroll: toBooleanValue(config.autoScroll, DEFAULT_REVIEWS_BUILDER.autoScroll),
|
|
504
518
|
scrollInterval: toNumberValue(config.scrollInterval, DEFAULT_REVIEWS_BUILDER.scrollInterval),
|
|
505
519
|
loop: toBooleanValue(config.loop, DEFAULT_REVIEWS_BUILDER.loop),
|
|
506
|
-
source: toStringValue(config.source, "platform"),
|
|
507
|
-
placeId: toStringValue(config.placeId),
|
|
508
520
|
};
|
|
509
521
|
}
|
|
510
522
|
export function buildWhatsAppConfig(builder) {
|
|
@@ -530,9 +542,19 @@ export function parseWhatsAppBuilder(config) {
|
|
|
530
542
|
testimonial: toStringValue(config.testimonial),
|
|
531
543
|
};
|
|
532
544
|
}
|
|
545
|
+
/*
|
|
546
|
+
* Known drift, NOT introduced here: this builder emits `expandedByDefault`,
|
|
547
|
+
* which is not on `FAQSectionConfig` and which no renderer reads, and it omits
|
|
548
|
+
* `showCategoryTabs` / `visibleTabs` / `allowMultipleOpen` / `defaultOpenCount`,
|
|
549
|
+
* which are. Under the old replace-on-save semantics an admin saving this
|
|
550
|
+
* section silently deleted all four. The repository's merge fixes the
|
|
551
|
+
* destructive half; reconciling the builder's own field set is its own piece
|
|
552
|
+
* of UI work and is logged in newchange.md.
|
|
553
|
+
*/
|
|
533
554
|
export function buildFAQConfig(builder) {
|
|
534
555
|
return {
|
|
535
556
|
title: builder.title,
|
|
557
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
536
558
|
subtitle: builder.subtitle || undefined,
|
|
537
559
|
showOnHomepage: builder.showOnHomepage,
|
|
538
560
|
displayCount: builder.displayCount,
|
|
@@ -546,6 +568,7 @@ export function parseFAQBuilder(config) {
|
|
|
546
568
|
const validCats = FAQ_CATEGORY_OPTIONS.map((o) => o.value);
|
|
547
569
|
return {
|
|
548
570
|
title: toStringValue(config.title, DEFAULT_FAQ_BUILDER.title),
|
|
571
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
549
572
|
subtitle: toStringValue(config.subtitle),
|
|
550
573
|
showOnHomepage: toBooleanValue(config.showOnHomepage, DEFAULT_FAQ_BUILDER.showOnHomepage),
|
|
551
574
|
displayCount: toNumberValue(config.displayCount, DEFAULT_FAQ_BUILDER.displayCount),
|
|
@@ -557,6 +580,7 @@ export function parseFAQBuilder(config) {
|
|
|
557
580
|
export function buildBlogConfig(builder) {
|
|
558
581
|
return {
|
|
559
582
|
title: builder.title,
|
|
583
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
560
584
|
maxArticles: builder.maxArticles,
|
|
561
585
|
showReadTime: builder.showReadTime,
|
|
562
586
|
showAuthor: builder.showAuthor,
|
|
@@ -566,6 +590,7 @@ export function buildBlogConfig(builder) {
|
|
|
566
590
|
export function parseBlogBuilder(config) {
|
|
567
591
|
return {
|
|
568
592
|
title: toStringValue(config.title, DEFAULT_BLOG_BUILDER.title),
|
|
593
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
569
594
|
maxArticles: toNumberValue(config.maxArticles, DEFAULT_BLOG_BUILDER.maxArticles),
|
|
570
595
|
showReadTime: toBooleanValue(config.showReadTime, DEFAULT_BLOG_BUILDER.showReadTime),
|
|
571
596
|
showAuthor: toBooleanValue(config.showAuthor, DEFAULT_BLOG_BUILDER.showAuthor),
|
|
@@ -576,8 +601,6 @@ export function buildNewsletterConfig(builder) {
|
|
|
576
601
|
return {
|
|
577
602
|
title: builder.title,
|
|
578
603
|
description: builder.description,
|
|
579
|
-
placeholder: builder.placeholder,
|
|
580
|
-
buttonText: builder.buttonText,
|
|
581
604
|
privacyText: builder.privacyText || undefined,
|
|
582
605
|
privacyLink: builder.privacyLink || undefined,
|
|
583
606
|
};
|
|
@@ -586,8 +609,6 @@ export function parseNewsletterBuilder(config) {
|
|
|
586
609
|
return {
|
|
587
610
|
title: toStringValue(config.title, DEFAULT_NEWSLETTER_BUILDER.title),
|
|
588
611
|
description: toStringValue(config.description, DEFAULT_NEWSLETTER_BUILDER.description),
|
|
589
|
-
placeholder: toStringValue(config.placeholder, DEFAULT_NEWSLETTER_BUILDER.placeholder),
|
|
590
|
-
buttonText: toStringValue(config.buttonText, DEFAULT_NEWSLETTER_BUILDER.buttonText),
|
|
591
612
|
privacyText: toStringValue(config.privacyText, DEFAULT_NEWSLETTER_BUILDER.privacyText),
|
|
592
613
|
privacyLink: toStringValue(config.privacyLink, DEFAULT_NEWSLETTER_BUILDER.privacyLink),
|
|
593
614
|
};
|
|
@@ -694,22 +715,18 @@ export function parseGoogleReviewsBuilder(config) {
|
|
|
694
715
|
export function buildFeaturedBundlesConfig(builder) {
|
|
695
716
|
return {
|
|
696
717
|
title: builder.title || undefined,
|
|
718
|
+
viewMoreLabel: builder.viewMoreLabel || undefined,
|
|
697
719
|
subtitle: builder.subtitle || undefined,
|
|
698
720
|
maxItems: builder.maxItems,
|
|
699
|
-
storeId: builder.storeId || undefined,
|
|
700
|
-
categorySlug: builder.categorySlug || undefined,
|
|
701
|
-
sortBy: builder.sortBy,
|
|
702
721
|
showSavingsBadge: builder.showSavingsBadge,
|
|
703
722
|
};
|
|
704
723
|
}
|
|
705
724
|
export function parseFeaturedBundlesBuilder(config) {
|
|
706
725
|
return {
|
|
707
726
|
title: toStringValue(config.title, DEFAULT_FEATURED_BUNDLES_BUILDER.title),
|
|
727
|
+
viewMoreLabel: toStringValue(config.viewMoreLabel),
|
|
708
728
|
subtitle: toStringValue(config.subtitle, DEFAULT_FEATURED_BUNDLES_BUILDER.subtitle),
|
|
709
729
|
maxItems: toNumberValue(config.maxItems, DEFAULT_FEATURED_BUNDLES_BUILDER.maxItems),
|
|
710
|
-
storeId: toStringValue(config.storeId),
|
|
711
|
-
categorySlug: toStringValue(config.categorySlug),
|
|
712
|
-
sortBy: toStringValue(config.sortBy, DEFAULT_FEATURED_BUNDLES_BUILDER.sortBy),
|
|
713
730
|
showSavingsBadge: toBooleanValue(config.showSavingsBadge, DEFAULT_FEATURED_BUNDLES_BUILDER.showSavingsBadge),
|
|
714
731
|
};
|
|
715
732
|
}
|
|
@@ -22,6 +22,8 @@ export type ResourceSortBy = "latest" | "oldest" | "priceLow" | "priceHigh" | "f
|
|
|
22
22
|
export type ResourceMaxCount = 5 | 10 | 20;
|
|
23
23
|
export interface ProductsBuilderState {
|
|
24
24
|
title: string;
|
|
25
|
+
/** Overrides the generic "View all →" link label. */
|
|
26
|
+
viewMoreLabel: string;
|
|
25
27
|
subtitle: string;
|
|
26
28
|
maxItems: number;
|
|
27
29
|
status: "all" | "published" | "draft";
|
|
@@ -39,6 +41,8 @@ export interface ProductsBuilderState {
|
|
|
39
41
|
}
|
|
40
42
|
export interface AuctionsBuilderState {
|
|
41
43
|
title: string;
|
|
44
|
+
/** Overrides the generic "View all →" link label. */
|
|
45
|
+
viewMoreLabel: string;
|
|
42
46
|
subtitle: string;
|
|
43
47
|
maxItems: number;
|
|
44
48
|
status: "all" | "active" | "scheduled" | "ended";
|
|
@@ -74,6 +78,8 @@ export interface StatsBuilderState {
|
|
|
74
78
|
}
|
|
75
79
|
export interface PreOrdersBuilderState {
|
|
76
80
|
title: string;
|
|
81
|
+
/** Overrides the generic "View all →" link label. */
|
|
82
|
+
viewMoreLabel: string;
|
|
77
83
|
subtitle: string;
|
|
78
84
|
maxItems: number;
|
|
79
85
|
status: "all" | "active" | "upcoming" | "closed";
|
|
@@ -89,6 +95,8 @@ export interface PreOrdersBuilderState {
|
|
|
89
95
|
}
|
|
90
96
|
export interface StoresBuilderState {
|
|
91
97
|
title: string;
|
|
98
|
+
/** Overrides the generic "View all →" link label. */
|
|
99
|
+
viewMoreLabel: string;
|
|
92
100
|
subtitle: string;
|
|
93
101
|
maxItems: number;
|
|
94
102
|
status: "all" | "active" | "pending" | "disabled";
|
|
@@ -105,6 +113,8 @@ export interface StoresBuilderState {
|
|
|
105
113
|
}
|
|
106
114
|
export interface EventsBuilderState {
|
|
107
115
|
title: string;
|
|
116
|
+
/** Overrides the generic "View all →" link label. */
|
|
117
|
+
viewMoreLabel: string;
|
|
108
118
|
subtitle: string;
|
|
109
119
|
maxItems: number;
|
|
110
120
|
status: "all" | "active" | "upcoming" | "ended";
|
|
@@ -149,6 +159,8 @@ export interface TrustIndicatorsBuilderState {
|
|
|
149
159
|
}
|
|
150
160
|
export interface CategoriesBuilderState {
|
|
151
161
|
title: string;
|
|
162
|
+
/** Overrides the generic "View all →" link label. */
|
|
163
|
+
viewMoreLabel: string;
|
|
152
164
|
maxCategories: number;
|
|
153
165
|
autoScroll: boolean;
|
|
154
166
|
scrollInterval: number;
|
|
@@ -156,6 +168,8 @@ export interface CategoriesBuilderState {
|
|
|
156
168
|
}
|
|
157
169
|
export interface BrandsBuilderState {
|
|
158
170
|
title: string;
|
|
171
|
+
/** Overrides the generic "View all →" link label. */
|
|
172
|
+
viewMoreLabel: string;
|
|
159
173
|
subtitle: string;
|
|
160
174
|
maxBrands: number;
|
|
161
175
|
autoScroll: boolean;
|
|
@@ -183,15 +197,20 @@ export interface FeaturesBuilderState {
|
|
|
183
197
|
title: string;
|
|
184
198
|
features: string[];
|
|
185
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* `source` / `placeId` were removed: this section only ever renders platform
|
|
202
|
+
* reviews (`useHomepageReviews`), so choosing "google" here changed nothing.
|
|
203
|
+
* The `google-reviews` section type is the real surface for that.
|
|
204
|
+
*/
|
|
186
205
|
export interface ReviewsBuilderState {
|
|
187
206
|
title: string;
|
|
207
|
+
/** Overrides the generic "View all →" link label. */
|
|
208
|
+
viewMoreLabel: string;
|
|
188
209
|
maxReviews: number;
|
|
189
210
|
itemsPerView: number;
|
|
190
211
|
autoScroll: boolean;
|
|
191
212
|
scrollInterval: number;
|
|
192
213
|
loop: boolean;
|
|
193
|
-
source: "platform" | "google";
|
|
194
|
-
placeId: string;
|
|
195
214
|
}
|
|
196
215
|
export interface WhatsAppBuilderState {
|
|
197
216
|
title: string;
|
|
@@ -205,6 +224,8 @@ export interface WhatsAppBuilderState {
|
|
|
205
224
|
export type FAQCategory = "general" | "shipping" | "returns" | "payment" | "account" | "products" | "sellers";
|
|
206
225
|
export interface FAQBuilderState {
|
|
207
226
|
title: string;
|
|
227
|
+
/** Overrides the generic "View all →" link label. */
|
|
228
|
+
viewMoreLabel: string;
|
|
208
229
|
subtitle: string;
|
|
209
230
|
showOnHomepage: boolean;
|
|
210
231
|
displayCount: number;
|
|
@@ -214,16 +235,21 @@ export interface FAQBuilderState {
|
|
|
214
235
|
}
|
|
215
236
|
export interface BlogBuilderState {
|
|
216
237
|
title: string;
|
|
238
|
+
/** Overrides the generic "View all →" link label. */
|
|
239
|
+
viewMoreLabel: string;
|
|
217
240
|
maxArticles: number;
|
|
218
241
|
showReadTime: boolean;
|
|
219
242
|
showAuthor: boolean;
|
|
220
243
|
showThumbnails: boolean;
|
|
221
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* `placeholder` / `buttonText` were removed: the subscribe form itself is
|
|
247
|
+
* supplied by the consumer through `newsletterFormSlot`, so appkit has no
|
|
248
|
+
* input or button to apply them to.
|
|
249
|
+
*/
|
|
222
250
|
export interface NewsletterBuilderState {
|
|
223
251
|
title: string;
|
|
224
252
|
description: string;
|
|
225
|
-
placeholder: string;
|
|
226
|
-
buttonText: string;
|
|
227
253
|
privacyText: string;
|
|
228
254
|
privacyLink: string;
|
|
229
255
|
}
|
|
@@ -267,13 +293,17 @@ export interface GoogleReviewsBuilderState {
|
|
|
267
293
|
linkToGoogleMaps: boolean;
|
|
268
294
|
googleMapsUrl: string;
|
|
269
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* `storeId` / `categorySlug` / `sortBy` were removed: bundles arrive
|
|
298
|
+
* pre-fetched from `listFeaturedBundles(8)`, which takes no scope or sort
|
|
299
|
+
* argument, so none of the three could ever affect the rendered list.
|
|
300
|
+
*/
|
|
270
301
|
export interface FeaturedBundlesBuilderState {
|
|
271
302
|
title: string;
|
|
303
|
+
/** Overrides the generic "View all →" link label. */
|
|
304
|
+
viewMoreLabel: string;
|
|
272
305
|
subtitle: string;
|
|
273
306
|
maxItems: number;
|
|
274
|
-
storeId: string;
|
|
275
|
-
categorySlug: string;
|
|
276
|
-
sortBy: "newest" | "savings-desc" | "price-asc";
|
|
277
307
|
showSavingsBadge: boolean;
|
|
278
308
|
}
|
|
279
309
|
export interface PrizeDrawsBuilderState {
|