@mohasinac/appkit 4.32.6 → 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.
Files changed (82) hide show
  1. package/dist/_internal/server/features/products/actions.js +29 -3
  2. package/dist/_internal/server/features/products/list-public.d.ts +1 -1
  3. package/dist/_internal/server/features/products/list-public.js +10 -2
  4. package/dist/_internal/server/features/stores/denormalize.d.ts +44 -0
  5. package/dist/_internal/server/features/stores/denormalize.js +58 -0
  6. package/dist/_internal/server/features/stores/index.d.ts +1 -0
  7. package/dist/_internal/server/features/stores/index.js +1 -0
  8. package/dist/_internal/server/jobs/core/jobRunners.js +5 -0
  9. package/dist/_internal/server/jobs/core/storeNameBackfill.d.ts +27 -0
  10. package/dist/_internal/server/jobs/core/storeNameBackfill.js +90 -0
  11. package/dist/_internal/shared/features/products/to-product-item.js +7 -0
  12. package/dist/client.d.ts +1 -1
  13. package/dist/client.js +4 -1
  14. package/dist/features/admin/actions/admin-actions.js +11 -1
  15. package/dist/features/admin/components/AdminSectionsView.js +17 -20
  16. package/dist/features/admin/components/sections/adminSectionsBuildParse.js +31 -14
  17. package/dist/features/admin/components/sections/adminSectionsTypes.d.ts +37 -7
  18. package/dist/features/admin/components/sections/adminSectionsTypes.js +11 -7
  19. package/dist/features/auctions/components/AuctionDetailPageView.js +56 -36
  20. package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +9 -0
  21. package/dist/features/auctions/components/MarketplaceAuctionCard.js +3 -2
  22. package/dist/features/blog/components/BlogFeaturedCard.d.ts +7 -1
  23. package/dist/features/blog/components/BlogFeaturedCard.js +3 -3
  24. package/dist/features/cart/repository/cart.repository.d.ts +27 -6
  25. package/dist/features/cart/repository/cart.repository.js +52 -21
  26. package/dist/features/cart/utils/guest-cart.js +5 -0
  27. package/dist/features/cart/utils/pending-ops.d.ts +15 -0
  28. package/dist/features/cart/utils/pending-ops.js +24 -0
  29. package/dist/features/homepage/components/BlogArticlesSection.d.ts +7 -1
  30. package/dist/features/homepage/components/BlogArticlesSection.js +5 -3
  31. package/dist/features/homepage/components/CTABannerSection.d.ts +18 -1
  32. package/dist/features/homepage/components/CTABannerSection.js +22 -4
  33. package/dist/features/homepage/components/CustomerReviewsSection.d.ts +7 -1
  34. package/dist/features/homepage/components/CustomerReviewsSection.js +2 -2
  35. package/dist/features/homepage/components/FAQSection.js +2 -11
  36. package/dist/features/homepage/components/FeaturedAuctionsSection.d.ts +3 -1
  37. package/dist/features/homepage/components/FeaturedAuctionsSection.js +5 -3
  38. package/dist/features/homepage/components/FeaturedBundlesSection.d.ts +7 -1
  39. package/dist/features/homepage/components/FeaturedBundlesSection.js +6 -5
  40. package/dist/features/homepage/components/FeaturedPreOrdersSection.d.ts +3 -1
  41. package/dist/features/homepage/components/FeaturedPreOrdersSection.js +4 -2
  42. package/dist/features/homepage/components/FeaturedProductsSection.d.ts +3 -1
  43. package/dist/features/homepage/components/FeaturedProductsSection.js +5 -3
  44. package/dist/features/homepage/components/HeroCarousel.d.ts +23 -2
  45. package/dist/features/homepage/components/HeroCarousel.js +22 -9
  46. package/dist/features/homepage/components/HomepageCustomerReviewsSection.d.ts +6 -1
  47. package/dist/features/homepage/components/HomepageCustomerReviewsSection.js +11 -3
  48. package/dist/features/homepage/components/MarketplaceHomepageView.d.ts +9 -1
  49. package/dist/features/homepage/components/MarketplaceHomepageView.js +7 -4
  50. package/dist/features/homepage/components/StatsCounterSection.d.ts +6 -1
  51. package/dist/features/homepage/components/StatsCounterSection.js +3 -3
  52. package/dist/features/homepage/constants/faq-category-labels.d.ts +15 -0
  53. package/dist/features/homepage/constants/faq-category-labels.js +23 -0
  54. package/dist/features/homepage/constants/section-copy.d.ts +107 -0
  55. package/dist/features/homepage/constants/section-copy.js +96 -0
  56. package/dist/features/homepage/lib/section-renderer.d.ts +16 -1
  57. package/dist/features/homepage/lib/section-renderer.js +58 -37
  58. package/dist/features/homepage/repository/homepage-sections.repository.d.ts +23 -0
  59. package/dist/features/homepage/repository/homepage-sections.repository.js +40 -0
  60. package/dist/features/homepage/schemas/firestore.d.ts +120 -44
  61. package/dist/features/media/MediaImage.d.ts +10 -1
  62. package/dist/features/media/MediaImage.js +6 -3
  63. package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -2
  64. package/dist/features/products/components/CardStoreLine.d.ts +32 -0
  65. package/dist/features/products/components/CardStoreLine.js +14 -0
  66. package/dist/features/products/components/MarketplacePrizeDrawCard.js +2 -1
  67. package/dist/features/products/components/ProductGrid.js +3 -6
  68. package/dist/features/products/schemas/firestore.d.ts +17 -0
  69. package/dist/features/products/types/index.d.ts +2 -0
  70. package/dist/features/seller/actions/seller-actions.d.ts +17 -0
  71. package/dist/features/seller/actions/seller-actions.js +54 -0
  72. package/dist/features/stores/components/StoreAuctionsListing.js +3 -0
  73. package/dist/features/tester/seed-data/tester-checklist-seed-data.js +119 -0
  74. package/dist/seed/carousel-slides-seed-data.js +154 -22
  75. package/dist/seed/carousels-seed-data.js +4 -1
  76. package/dist/seed/homepage-sections-seed-data.js +337 -254
  77. package/dist/seed/products-preorders-seed-data.d.ts +1 -0
  78. package/dist/server.d.ts +1 -0
  79. package/dist/server.js +4 -0
  80. package/dist/styles.css +1 -1
  81. package/dist/tailwind-utilities.css +1 -1
  82. 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: "Email placeholder", value: newsletterBuilder.placeholder, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, placeholder: e.target.value })) }), _jsx(Input, { label: "Button text", value: newsletterBuilder.buttonText, onChange: (e) => setNewsletterBuilder((prev) => ({ ...prev, buttonText: e.target.value })) }), _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) })] }));
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: "Reviews source", value: reviewsBuilder.source, onValueChange: (v) => setReviewsBuilder((prev) => ({ ...prev, source: v })), options: [
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(Input, { label: "Filter by store (storeId)", value: featuredBundlesBuilder.storeId, onChange: (e) => setFeaturedBundlesBuilder((prev) => ({ ...prev, storeId: e.target.value })), placeholder: "store-pokemon-palace", helperText: "Leave blank to show bundles from all stores." }), _jsxs(Stack, { gap: "xs", children: [_jsx(Text, { size: "sm", weight: "medium", children: LBL_FILTER_BY_CATEGORY }), _jsx(CategoryInlineSelect, { value: featuredBundlesBuilder.categorySlug, onChange: (id) => setFeaturedBundlesBuilder((prev) => ({ ...prev, categorySlug: id })), placeholder: PH_FILTER_BY_CATEGORY }), _jsx(Text, { size: "xs", color: "muted", children: "Leave blank to show bundles from all categories." })] }), _jsx(Select, { label: "Sort by", value: featuredBundlesBuilder.sortBy, onValueChange: (value) => setFeaturedBundlesBuilder((prev) => ({ ...prev, sortBy: value })), options: [
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 {