@reblu/site-blocks 0.29.0 → 0.31.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/index.cjs CHANGED
@@ -23,21 +23,29 @@ __export(src_exports, {
23
23
  ALLOWED_YOUTUBE_HOSTS: () => ALLOWED_YOUTUBE_HOSTS,
24
24
  AddedToCartToast: () => AddedToCartToast,
25
25
  ArbitrationBadge: () => ArbitrationBadge,
26
+ BeforeAfterPairs: () => BeforeAfterPairs,
27
+ CARD_ICON_NAMES: () => CARD_ICON_NAMES,
28
+ CardIconSvg: () => CardIconSvg,
26
29
  CartAdjustmentsNotice: () => CartAdjustmentsNotice,
30
+ CartLineIncludes: () => CartLineIncludes,
27
31
  CartLineList: () => CartLineList,
28
32
  CartSummary: () => CartSummary,
29
33
  CheckoutDeliveryChoice: () => CheckoutDeliveryChoice,
30
34
  CheckoutForm: () => CheckoutForm,
31
35
  CheckoutLoginPrompt: () => CheckoutLoginPrompt,
32
36
  CheckoutPayAction: () => CheckoutPayAction,
37
+ CheckoutQuoteNotice: () => CheckoutQuoteNotice,
33
38
  CheckoutQuoteSummary: () => CheckoutQuoteSummary,
34
39
  CheckoutTermsAcceptance: () => CheckoutTermsAcceptance,
40
+ ChipList: () => ChipList,
35
41
  ContactInterestField: () => ContactInterestField,
36
42
  CourseCatalogFilters: () => CourseCatalogFilters,
37
43
  CourseDescription: () => CourseDescription,
38
44
  CoursePurchaseTerms: () => CoursePurchaseTerms,
39
45
  DATA_REQUEST_TYPES: () => import_site_contracts.DATA_REQUEST_TYPES,
46
+ DEFAULT_BEFORE_AFTER_LABELS: () => DEFAULT_BEFORE_AFTER_LABELS,
40
47
  DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS: () => DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS,
48
+ DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS: () => DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS,
41
49
  DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS: () => DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS,
42
50
  DEFAULT_COURSE_CATALOG_FILTERS_LABELS: () => DEFAULT_COURSE_CATALOG_FILTERS_LABELS,
43
51
  DEFAULT_COURSE_PRICE_BANDS: () => DEFAULT_COURSE_PRICE_BANDS,
@@ -54,6 +62,8 @@ __export(src_exports, {
54
62
  EMPTY_FULL_INVOICE_VALUE: () => EMPTY_FULL_INVOICE_VALUE,
55
63
  FaqAccordion: () => FaqAccordion,
56
64
  FullInvoiceFields: () => FullInvoiceFields,
65
+ IconCardGrid: () => IconCardGrid,
66
+ ImageTextSplit: () => ImageTextSplit,
57
67
  LegalDocument: () => LegalDocument,
58
68
  LessonPreview: () => LessonPreview,
59
69
  MarkdownRenderer: () => MarkdownRenderer,
@@ -73,11 +83,15 @@ __export(src_exports, {
73
83
  TrustBadges: () => TrustBadges,
74
84
  buildFaqPageJsonLd: () => buildFaqPageJsonLd,
75
85
  buildShareUrls: () => buildShareUrls,
86
+ bundleComponentsToIncludes: () => bundleComponentsToIncludes,
87
+ checkoutQuoteNotice: () => checkoutQuoteNotice,
76
88
  collectFaqItems: () => collectFaqItems,
89
+ courseSellsAsGuest: () => courseSellsAsGuest,
77
90
  defaultCheckoutFulfillment: () => defaultCheckoutFulfillment,
78
91
  formatPrice: () => formatPrice,
79
92
  getShopErrorMessage: () => getShopErrorMessage,
80
93
  isAllowedYouTubeHost: () => isAllowedYouTubeHost,
94
+ isCheckoutDeliveryComplete: () => isCheckoutDeliveryComplete,
81
95
  isOverSimplifiedInvoiceCap: () => isOverSimplifiedInvoiceCap,
82
96
  markdownToPlainText: () => markdownToPlainText,
83
97
  markdownToSafeHtml: () => markdownToSafeHtml,
@@ -86,6 +100,7 @@ __export(src_exports, {
86
100
  sanitizeHtml: () => sanitizeHtml,
87
101
  shopIssuesInvoices: () => shopIssuesInvoices,
88
102
  shouldRenderShopFilters: () => shouldRenderShopFilters,
103
+ toAcademyCheckoutInvoiceFields: () => toAcademyCheckoutInvoiceFields,
89
104
  toCheckoutFulfillmentFields: () => toCheckoutFulfillmentFields,
90
105
  toCheckoutInvoiceFields: () => toCheckoutInvoiceFields,
91
106
  toCheckoutTermsFields: () => toCheckoutTermsFields
@@ -14588,40 +14603,376 @@ function ArbitrationBadge({
14588
14603
  }
14589
14604
 
14590
14605
  // src/components/page-blocks.tsx
14591
- var import_utils14 = require("@reblu/site-ui/utils");
14606
+ var import_utils15 = require("@reblu/site-ui/utils");
14592
14607
  var import_button_variants2 = require("@reblu/site-ui/button-variants");
14608
+
14609
+ // src/components/content-blocks.tsx
14610
+ var import_utils14 = require("@reblu/site-ui/utils");
14611
+
14612
+ // src/components/_card-icons.ts
14613
+ var CARD_ICON_NODES = {
14614
+ check: [["path", { d: "M20 6 9 17l-5-5" }]],
14615
+ star: [
14616
+ [
14617
+ "path",
14618
+ {
14619
+ d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z"
14620
+ }
14621
+ ]
14622
+ ],
14623
+ heart: [
14624
+ [
14625
+ "path",
14626
+ {
14627
+ d: "M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"
14628
+ }
14629
+ ]
14630
+ ],
14631
+ "shield-check": [
14632
+ [
14633
+ "path",
14634
+ {
14635
+ d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"
14636
+ }
14637
+ ],
14638
+ ["path", { d: "m9 12 2 2 4-4" }]
14639
+ ],
14640
+ sparkles: [
14641
+ [
14642
+ "path",
14643
+ {
14644
+ d: "M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"
14645
+ }
14646
+ ],
14647
+ ["path", { d: "M20 2v4" }],
14648
+ ["path", { d: "M22 4h-4" }],
14649
+ ["circle", { cx: "4", cy: "20", r: "2" }]
14650
+ ],
14651
+ clock: [
14652
+ ["path", { d: "M12 6v6l4 2" }],
14653
+ ["circle", { cx: "12", cy: "12", r: "10" }]
14654
+ ],
14655
+ calendar: [
14656
+ ["path", { d: "M8 2v4" }],
14657
+ ["path", { d: "M16 2v4" }],
14658
+ ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2" }],
14659
+ ["path", { d: "M3 10h18" }]
14660
+ ],
14661
+ user: [
14662
+ ["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" }],
14663
+ ["circle", { cx: "12", cy: "7", r: "4" }]
14664
+ ],
14665
+ users: [
14666
+ ["path", { d: "M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" }],
14667
+ ["path", { d: "M16 3.128a4 4 0 0 1 0 7.744" }],
14668
+ ["path", { d: "M22 21v-2a4 4 0 0 0-3-3.87" }],
14669
+ ["circle", { cx: "9", cy: "7", r: "4" }]
14670
+ ],
14671
+ phone: [
14672
+ [
14673
+ "path",
14674
+ {
14675
+ d: "M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384"
14676
+ }
14677
+ ]
14678
+ ],
14679
+ mail: [
14680
+ ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7" }],
14681
+ ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2" }]
14682
+ ],
14683
+ "map-pin": [
14684
+ [
14685
+ "path",
14686
+ {
14687
+ d: "M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"
14688
+ }
14689
+ ],
14690
+ ["circle", { cx: "12", cy: "10", r: "3" }]
14691
+ ],
14692
+ leaf: [
14693
+ [
14694
+ "path",
14695
+ { d: "M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z" }
14696
+ ],
14697
+ ["path", { d: "M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12" }]
14698
+ ],
14699
+ droplet: [
14700
+ [
14701
+ "path",
14702
+ {
14703
+ d: "M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5C6 11.1 5 13 5 15a7 7 0 0 0 7 7z"
14704
+ }
14705
+ ]
14706
+ ],
14707
+ sun: [
14708
+ ["circle", { cx: "12", cy: "12", r: "4" }],
14709
+ ["path", { d: "M12 2v2" }],
14710
+ ["path", { d: "M12 20v2" }],
14711
+ ["path", { d: "m4.93 4.93 1.41 1.41" }],
14712
+ ["path", { d: "m17.66 17.66 1.41 1.41" }],
14713
+ ["path", { d: "M2 12h2" }],
14714
+ ["path", { d: "M20 12h2" }],
14715
+ ["path", { d: "m6.34 17.66-1.41 1.41" }],
14716
+ ["path", { d: "m19.07 4.93-1.41 1.41" }]
14717
+ ],
14718
+ zap: [
14719
+ [
14720
+ "path",
14721
+ {
14722
+ d: "M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"
14723
+ }
14724
+ ]
14725
+ ],
14726
+ award: [
14727
+ [
14728
+ "path",
14729
+ {
14730
+ d: "m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526"
14731
+ }
14732
+ ],
14733
+ ["circle", { cx: "12", cy: "8", r: "6" }]
14734
+ ],
14735
+ target: [
14736
+ ["circle", { cx: "12", cy: "12", r: "10" }],
14737
+ ["circle", { cx: "12", cy: "12", r: "6" }],
14738
+ ["circle", { cx: "12", cy: "12", r: "2" }]
14739
+ ],
14740
+ lightbulb: [
14741
+ [
14742
+ "path",
14743
+ {
14744
+ d: "M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"
14745
+ }
14746
+ ],
14747
+ ["path", { d: "M9 18h6" }],
14748
+ ["path", { d: "M10 22h4" }]
14749
+ ],
14750
+ smile: [
14751
+ ["circle", { cx: "12", cy: "12", r: "10" }],
14752
+ ["path", { d: "M8 14s1.5 2 4 2 4-2 4-2" }],
14753
+ ["line", { x1: "9", x2: "9.01", y1: "9", y2: "9" }],
14754
+ ["line", { x1: "15", x2: "15.01", y1: "9", y2: "9" }]
14755
+ ],
14756
+ "thumbs-up": [
14757
+ [
14758
+ "path",
14759
+ {
14760
+ d: "M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z"
14761
+ }
14762
+ ],
14763
+ ["path", { d: "M7 10v12" }]
14764
+ ],
14765
+ info: [
14766
+ ["circle", { cx: "12", cy: "12", r: "10" }],
14767
+ ["path", { d: "M12 16v-4" }],
14768
+ ["path", { d: "M12 8h.01" }]
14769
+ ]
14770
+ };
14771
+
14772
+ // src/components/content-blocks.tsx
14593
14773
  var import_jsx_runtime18 = require("react/jsx-runtime");
14774
+ var DEFAULT_BEFORE_AFTER_LABELS = Object.freeze({ before: "Antes", after: "Despu\xE9s" });
14775
+ function PairImage({ url, alt, label }) {
14776
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("figure", { className: "space-y-2", children: [
14777
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "relative aspect-[4/3] w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14778
+ "img",
14779
+ {
14780
+ src: url,
14781
+ alt,
14782
+ loading: "lazy",
14783
+ decoding: "async",
14784
+ className: "h-full w-full object-cover"
14785
+ }
14786
+ ) }),
14787
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("figcaption", { className: "text-sm font-semibold", children: label })
14788
+ ] });
14789
+ }
14790
+ function BeforeAfterPairs({
14791
+ pairs,
14792
+ showCaption = false,
14793
+ caption,
14794
+ labels = DEFAULT_BEFORE_AFTER_LABELS,
14795
+ className
14796
+ }) {
14797
+ const visibleCaption = showCaption && caption && caption.trim() !== "" ? caption : null;
14798
+ if (pairs.length === 0 && !visibleCaption) return null;
14799
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { "data-slot": "before-after", className: (0, import_utils14.cn)("space-y-4", className), children: [
14800
+ pairs.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "grid gap-6 lg:grid-cols-2", children: pairs.map((pair, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
14801
+ "li",
14802
+ {
14803
+ "data-slot": "before-after-pair",
14804
+ className: "grid grid-cols-1 gap-3 sm:grid-cols-2",
14805
+ children: [
14806
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PairImage, { url: pair.beforeUrl, alt: pair.alt ?? "", label: labels.before }),
14807
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PairImage, { url: pair.afterUrl, alt: pair.alt ?? "", label: labels.after })
14808
+ ]
14809
+ },
14810
+ `${pair.beforeUrl}-${pair.afterUrl}-${i}`
14811
+ )) }),
14812
+ visibleCaption && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { "data-slot": "before-after-caption", className: "whitespace-pre-line text-sm opacity-80", children: visibleCaption })
14813
+ ] });
14814
+ }
14815
+ function ChipList({ items, className }) {
14816
+ const visible = items.filter((item) => item.trim() !== "");
14817
+ if (visible.length === 0) return null;
14818
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { "data-slot": "chip-list", className: (0, import_utils14.cn)("flex flex-wrap gap-3", className), children: visible.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14819
+ "li",
14820
+ {
14821
+ "data-slot": "chip",
14822
+ className: "rounded-full border border-primary/20 bg-primary/10 px-4 py-2 text-sm font-medium text-primary",
14823
+ children: item
14824
+ },
14825
+ `${item}-${i}`
14826
+ )) });
14827
+ }
14828
+ var CARD_ICON_NAMES = Object.freeze(Object.keys(CARD_ICON_NODES));
14829
+ function hasCardIcon(icon) {
14830
+ return Object.prototype.hasOwnProperty.call(CARD_ICON_NODES, icon);
14831
+ }
14832
+ function CardIconSvg({ icon, className }) {
14833
+ if (!hasCardIcon(icon)) return null;
14834
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14835
+ "svg",
14836
+ {
14837
+ xmlns: "http://www.w3.org/2000/svg",
14838
+ viewBox: "0 0 24 24",
14839
+ fill: "none",
14840
+ stroke: "currentColor",
14841
+ strokeWidth: 2,
14842
+ strokeLinecap: "round",
14843
+ strokeLinejoin: "round",
14844
+ "aria-hidden": "true",
14845
+ focusable: "false",
14846
+ "data-icon": icon,
14847
+ className: (0, import_utils14.cn)("h-5 w-5", className),
14848
+ children: CARD_ICON_NODES[icon].map(([Tag, attrs], i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Tag, { ...attrs }, i))
14849
+ }
14850
+ );
14851
+ }
14852
+ function IconCardGrid({ items, intro, headingLevel = 3, className }) {
14853
+ const hasIntro = !!intro && intro.trim() !== "";
14854
+ if (items.length === 0 && !hasIntro) return null;
14855
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { "data-slot": "icon-cards", className: (0, import_utils14.cn)("space-y-6", className), children: [
14856
+ hasIntro && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "max-w-prose text-lg opacity-80", children: intro }),
14857
+ items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14858
+ "ul",
14859
+ {
14860
+ "data-slot": "icon-card-grid",
14861
+ className: "grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3",
14862
+ children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
14863
+ "li",
14864
+ {
14865
+ "data-slot": "icon-card",
14866
+ className: "space-y-3 rounded-xl border border-border bg-card p-6 text-card-foreground",
14867
+ children: [
14868
+ hasCardIcon(item.icon) && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "inline-flex h-12 w-12 items-center justify-center rounded-xl bg-primary/10 text-primary", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(CardIconSvg, { icon: item.icon }) }),
14869
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: item.title }),
14870
+ item.text && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-muted-foreground", children: item.text })
14871
+ ]
14872
+ },
14873
+ `${item.title}-${i}`
14874
+ ))
14875
+ }
14876
+ )
14877
+ ] });
14878
+ }
14879
+ var KICKER_CLASS_NAME = "text-sm font-semibold uppercase tracking-wider opacity-80";
14880
+ function ImageTextSplit({
14881
+ imageUrl,
14882
+ alt,
14883
+ imageSide,
14884
+ mobileOrder = "image_first",
14885
+ html: html5,
14886
+ kicker,
14887
+ heading,
14888
+ headingLevel = 2,
14889
+ headingId,
14890
+ className
14891
+ }) {
14892
+ const textFirst = mobileOrder === "text_first";
14893
+ const imageRight = imageSide === "right";
14894
+ const hasKicker = !!kicker && kicker.trim() !== "";
14895
+ const bodyOffset = heading ? headingLevel : headingLevel - 1;
14896
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
14897
+ "div",
14898
+ {
14899
+ "data-slot": "image-text",
14900
+ "data-image-side": imageRight ? "right" : "left",
14901
+ className: (0, import_utils14.cn)("grid grid-cols-1 items-center gap-8 md:grid-cols-2", className),
14902
+ children: [
14903
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14904
+ "div",
14905
+ {
14906
+ "data-slot": "image-text-media",
14907
+ className: (0, import_utils14.cn)(textFirst ? "order-2" : "order-1", imageRight ? "md:order-2" : "md:order-1"),
14908
+ children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "relative aspect-[4/3] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14909
+ "img",
14910
+ {
14911
+ src: imageUrl,
14912
+ alt: alt ?? "",
14913
+ loading: "lazy",
14914
+ decoding: "async",
14915
+ className: "h-full w-full object-cover"
14916
+ }
14917
+ ) })
14918
+ }
14919
+ ),
14920
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
14921
+ "div",
14922
+ {
14923
+ "data-slot": "image-text-body",
14924
+ className: (0, import_utils14.cn)(
14925
+ "space-y-4",
14926
+ textFirst ? "order-1" : "order-2",
14927
+ imageRight ? "md:order-1" : "md:order-2"
14928
+ ),
14929
+ children: [
14930
+ (hasKicker || heading) && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "space-y-2", children: [
14931
+ hasKicker && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { "data-slot": "page-block-kicker", className: KICKER_CLASS_NAME, children: kicker }),
14932
+ heading && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { id: headingId, children: heading }) })
14933
+ ] }),
14934
+ html5 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SafeHtml, { html: sanitizeHtml(html5), headingOffset: bodyOffset })
14935
+ ]
14936
+ }
14937
+ )
14938
+ ]
14939
+ }
14940
+ );
14941
+ }
14942
+
14943
+ // src/components/page-blocks.tsx
14944
+ var import_jsx_runtime19 = require("react/jsx-runtime");
14594
14945
  var ALIASES = {
14595
14946
  doctor_embed: "profile_embed",
14596
14947
  specialty_embed: "page_embed"
14597
14948
  };
14598
14949
  function HeroBlock({ block, headingLevel }) {
14599
14950
  const { title, subtitle, imageUrl } = block.data;
14600
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "space-y-4", children: [
14601
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
14602
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
14603
- imageUrl && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
14951
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "space-y-4", children: [
14952
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
14953
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
14954
+ imageUrl && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
14604
14955
  ] });
14605
14956
  }
14606
14957
  function RichtextBlock({ block, headingLevel }) {
14607
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
14958
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
14608
14959
  }
14609
14960
  function FaqBlock({ block }) {
14610
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(FaqAccordion, { items: block.data.items });
14961
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(FaqAccordion, { items: block.data.items });
14611
14962
  }
14612
14963
  function StatsBlock({ block }) {
14613
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dl", { className: "grid gap-6 sm:grid-cols-2 lg:grid-cols-4", children: block.data.items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex flex-col-reverse gap-1", children: [
14614
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
14615
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dd", { className: "text-3xl font-bold", children: item.value })
14964
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("dl", { className: "grid gap-6 sm:grid-cols-2 lg:grid-cols-4", children: block.data.items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex flex-col-reverse gap-1", children: [
14965
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
14966
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("dd", { className: "text-3xl font-bold", children: item.value })
14616
14967
  ] }, i)) });
14617
14968
  }
14618
14969
  function TestimonialBlock({ block }) {
14619
14970
  const { quote, author, role, avatarUrl } = block.data;
14620
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("figure", { className: "space-y-4", children: [
14621
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { children: quote }) }),
14622
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("figcaption", { className: "flex items-center gap-3", children: [
14971
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("figure", { className: "space-y-4", children: [
14972
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { children: quote }) }),
14973
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("figcaption", { className: "flex items-center gap-3", children: [
14623
14974
  avatarUrl && // eslint-disable-next-line @next/next/no-img-element
14624
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14975
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14625
14976
  "img",
14626
14977
  {
14627
14978
  src: avatarUrl,
@@ -14630,9 +14981,9 @@ function TestimonialBlock({ block }) {
14630
14981
  className: "h-10 w-10 rounded-full object-cover"
14631
14982
  }
14632
14983
  ),
14633
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { children: [
14634
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "font-semibold", children: author }),
14635
- role && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "block text-sm opacity-80", children: role })
14984
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { children: [
14985
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "font-semibold", children: author }),
14986
+ role && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "block text-sm opacity-80", children: role })
14636
14987
  ] })
14637
14988
  ] })
14638
14989
  ] });
@@ -14641,19 +14992,19 @@ function CtaSlotBlock(_props) {
14641
14992
  return null;
14642
14993
  }
14643
14994
  function FeatureListBlock({ block }) {
14644
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "grid list-disc gap-2 pl-5 sm:grid-cols-2", children: block.data.items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("li", { children: item.text }, i)) });
14995
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("ul", { className: "grid list-disc gap-2 pl-5 sm:grid-cols-2", children: block.data.items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("li", { children: item.text }, i)) });
14645
14996
  }
14646
14997
  function GalleryBlock({ block }) {
14647
14998
  const { images } = block.data;
14648
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14999
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14649
15000
  "div",
14650
15001
  {
14651
- className: (0, import_utils14.cn)(
15002
+ className: (0, import_utils15.cn)(
14652
15003
  "grid gap-4",
14653
15004
  images.length > 1 ? "sm:grid-cols-2 lg:grid-cols-3" : "grid-cols-1"
14654
15005
  ),
14655
- children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("figure", { className: "space-y-1", children: [
14656
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
15006
+ children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("figure", { className: "space-y-1", children: [
15007
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14657
15008
  "img",
14658
15009
  {
14659
15010
  src: img.url,
@@ -14662,7 +15013,7 @@ function GalleryBlock({ block }) {
14662
15013
  className: "h-full w-full object-cover"
14663
15014
  }
14664
15015
  ) }),
14665
- img.caption && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("figcaption", { className: "text-sm opacity-80", children: img.caption })
15016
+ img.caption && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("figcaption", { className: "text-sm opacity-80", children: img.caption })
14666
15017
  ] }, `${img.url}-${i}`))
14667
15018
  }
14668
15019
  );
@@ -14672,13 +15023,13 @@ function EmbedCard({
14672
15023
  headingLevel,
14673
15024
  embedHref
14674
15025
  }) {
14675
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
15026
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
14676
15027
  "a",
14677
15028
  {
14678
15029
  href: embedHref(resolved),
14679
15030
  className: "group block overflow-hidden rounded-xl border border-border bg-card text-card-foreground transition-shadow hover:shadow-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring",
14680
15031
  children: [
14681
- resolved.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
15032
+ resolved.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14682
15033
  "img",
14683
15034
  {
14684
15035
  src: resolved.coverImageUrl,
@@ -14687,24 +15038,51 @@ function EmbedCard({
14687
15038
  className: "h-full w-full object-cover"
14688
15039
  }
14689
15040
  ) }),
14690
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "space-y-1 p-4", children: [
14691
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
14692
- resolved.role && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
14693
- resolved.excerpt && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-muted-foreground", children: resolved.excerpt })
15041
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "space-y-1 p-4", children: [
15042
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
15043
+ resolved.role && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
15044
+ resolved.excerpt && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-muted-foreground", children: resolved.excerpt })
14694
15045
  ] })
14695
15046
  ]
14696
15047
  }
14697
15048
  );
14698
15049
  }
14699
15050
  function PageEmbedBlock({ block, headingLevel, embedHref }) {
14700
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
15051
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
14701
15052
  }
14702
15053
  function ProfileEmbedBlock({
14703
15054
  block,
14704
15055
  headingLevel,
14705
15056
  embedHref
14706
15057
  }) {
14707
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
15058
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
15059
+ }
15060
+ function BeforeAfterBlock({ block }) {
15061
+ const { pairs, showCaption, caption } = block.data;
15062
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(BeforeAfterPairs, { pairs, showCaption, caption });
15063
+ }
15064
+ function ChipsBlock({ block }) {
15065
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ChipList, { items: block.data.items });
15066
+ }
15067
+ function ImageTextBlock({ block, headingLevel, headingId }) {
15068
+ const { kicker, imageUrl, alt, imageSide, mobileOrder, html: html5 } = block.data;
15069
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15070
+ ImageTextSplit,
15071
+ {
15072
+ imageUrl,
15073
+ alt,
15074
+ imageSide,
15075
+ mobileOrder,
15076
+ html: html5,
15077
+ kicker,
15078
+ heading: block.heading,
15079
+ headingLevel,
15080
+ headingId
15081
+ }
15082
+ );
15083
+ }
15084
+ function IconCardsBlock({ block, headingLevel }) {
15085
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(IconCardGrid, { items: block.data.items, intro: block.data.intro, headingLevel });
14708
15086
  }
14709
15087
  var DEFAULT_RENDERERS = {
14710
15088
  hero: HeroBlock,
@@ -14716,8 +15094,25 @@ var DEFAULT_RENDERERS = {
14716
15094
  feature_list: FeatureListBlock,
14717
15095
  gallery: GalleryBlock,
14718
15096
  page_embed: PageEmbedBlock,
14719
- profile_embed: ProfileEmbedBlock
15097
+ profile_embed: ProfileEmbedBlock,
15098
+ before_after: BeforeAfterBlock,
15099
+ chips: ChipsBlock,
15100
+ icon_cards: IconCardsBlock,
15101
+ image_text: ImageTextBlock
14720
15102
  };
15103
+ var KICKER_TYPES = /* @__PURE__ */ new Set([
15104
+ "before_after",
15105
+ "chips",
15106
+ "icon_cards"
15107
+ ]);
15108
+ var OWN_HEADING_TYPES = /* @__PURE__ */ new Set([
15109
+ "image_text"
15110
+ ]);
15111
+ function kickerOf(type, block) {
15112
+ if (!KICKER_TYPES.has(type)) return null;
15113
+ const kicker = block.data.kicker;
15114
+ return typeof kicker === "string" && kicker.trim() !== "" ? kicker : null;
15115
+ }
14721
15116
  var EMBED_TYPES = /* @__PURE__ */ new Set([
14722
15117
  "page_embed",
14723
15118
  "profile_embed"
@@ -14761,14 +15156,14 @@ function toIdFragment(value) {
14761
15156
  function SectionCta2({ cta }) {
14762
15157
  if (!hasUsableCta(cta)) return null;
14763
15158
  const variant = toButtonVariant(cta.variant);
14764
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
15159
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14765
15160
  "a",
14766
15161
  {
14767
15162
  href: cta.url,
14768
15163
  "data-slot": "button",
14769
15164
  "data-variant": variant,
14770
15165
  "data-size": "default",
14771
- className: (0, import_utils14.cn)((0, import_button_variants2.buttonVariants)({ variant, size: "default" })),
15166
+ className: (0, import_utils15.cn)((0, import_button_variants2.buttonVariants)({ variant, size: "default" })),
14772
15167
  ...cta.isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {},
14773
15168
  children: cta.label
14774
15169
  }
@@ -14793,18 +15188,29 @@ function PageBlocks({
14793
15188
  const Renderer = components?.[type] ?? DEFAULT_RENDERERS[type];
14794
15189
  const headingId = block.heading ? `${safePrefix}-${toIdFragment(block.id)}-heading` : void 0;
14795
15190
  const background = block.backgroundColor;
15191
+ const kicker = kickerOf(type, block);
15192
+ const ownsHeading = OWN_HEADING_TYPES.has(type);
14796
15193
  return [
14797
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
15194
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
14798
15195
  "section",
14799
15196
  {
14800
15197
  "data-slot": "page-block",
14801
15198
  "data-block-type": type,
14802
15199
  "aria-labelledby": headingId,
14803
15200
  style: surfaceStyle(background),
14804
- className: (0, import_utils14.cn)("space-y-6", background && "rounded-xl px-6 py-10", sectionClassName),
15201
+ className: (0, import_utils15.cn)("space-y-6", background && "rounded-xl px-6 py-10", sectionClassName),
14805
15202
  children: [
14806
- block.heading && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { id: headingId, children: block.heading }) }),
14807
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
15203
+ kicker && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { "data-slot": "page-block-kicker", className: (0, import_utils15.cn)("-mb-4", KICKER_CLASS_NAME), children: kicker }),
15204
+ block.heading && !ownsHeading && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { id: headingId, children: block.heading }) }),
15205
+ ownsHeading ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15206
+ Renderer,
15207
+ {
15208
+ block,
15209
+ headingLevel,
15210
+ embedHref,
15211
+ headingId
15212
+ }
15213
+ ) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14808
15214
  Renderer,
14809
15215
  {
14810
15216
  block,
@@ -14812,7 +15218,7 @@ function PageBlocks({
14812
15218
  embedHref
14813
15219
  }
14814
15220
  ),
14815
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SectionCta2, { cta: block.cta })
15221
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SectionCta2, { cta: block.cta })
14816
15222
  ]
14817
15223
  },
14818
15224
  block.id
@@ -14820,12 +15226,12 @@ function PageBlocks({
14820
15226
  ];
14821
15227
  });
14822
15228
  if (sections.length === 0) return null;
14823
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: (0, import_utils14.cn)("space-y-12", className), "data-slot": "page-blocks", children: sections });
15229
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: (0, import_utils15.cn)("space-y-12", className), "data-slot": "page-blocks", children: sections });
14824
15230
  }
14825
15231
 
14826
15232
  // src/components/shop-filters.tsx
14827
- var import_utils15 = require("@reblu/site-ui/utils");
14828
- var import_jsx_runtime19 = require("react/jsx-runtime");
15233
+ var import_utils16 = require("@reblu/site-ui/utils");
15234
+ var import_jsx_runtime20 = require("react/jsx-runtime");
14829
15235
  var DEFAULT_SHOP_PRICE_BANDS = [
14830
15236
  { max: 2500 },
14831
15237
  { min: 2500, max: 5e3 },
@@ -14869,7 +15275,7 @@ function priceBandLabel(band, t, currencyCode, locale) {
14869
15275
  return "";
14870
15276
  }
14871
15277
  function OptionLink({ href, active, label, onActivate }) {
14872
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15278
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14873
15279
  "a",
14874
15280
  {
14875
15281
  href,
@@ -14878,7 +15284,7 @@ function OptionLink({ href, active, label, onActivate }) {
14878
15284
  event.preventDefault();
14879
15285
  onActivate();
14880
15286
  } : void 0,
14881
- className: (0, import_utils15.cn)(
15287
+ className: (0, import_utils16.cn)(
14882
15288
  "inline-flex items-center rounded-full border px-3 py-1 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
14883
15289
  active ? "border-transparent bg-primary text-primary-foreground" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"
14884
15290
  ),
@@ -14887,9 +15293,9 @@ function OptionLink({ href, active, label, onActivate }) {
14887
15293
  );
14888
15294
  }
14889
15295
  function FilterFieldset({ legend, children: children2 }) {
14890
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("fieldset", { className: "space-y-2", children: [
14891
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
14892
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
15296
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("fieldset", { className: "space-y-2", children: [
15297
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
15298
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
14893
15299
  ] });
14894
15300
  }
14895
15301
  function ShopFilters({
@@ -14912,11 +15318,11 @@ function ShopFilters({
14912
15318
  if (!shouldRenderShopFilters(facets, active)) {
14913
15319
  return null;
14914
15320
  }
14915
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: (0, import_utils15.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
15321
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: (0, import_utils16.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
14916
15322
  visibleTaxonomies.map((axis) => {
14917
15323
  const activeSlug = active.taxonomy?.[axis.key];
14918
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(FilterFieldset, { legend: axis.label, children: [
14919
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15324
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(FilterFieldset, { legend: axis.label, children: [
15325
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14920
15326
  OptionLink,
14921
15327
  {
14922
15328
  href: hrefs.taxonomy(axis.key, void 0),
@@ -14931,7 +15337,7 @@ function ShopFilters({
14931
15337
  ),
14932
15338
  axis.terms.map((term) => {
14933
15339
  const isActive = activeSlug === term.slug;
14934
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15340
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14935
15341
  OptionLink,
14936
15342
  {
14937
15343
  href: hrefs.taxonomy(axis.key, isActive ? void 0 : term.slug),
@@ -14951,9 +15357,9 @@ function ShopFilters({
14951
15357
  }),
14952
15358
  visibleAttributes.map((attr) => {
14953
15359
  const activeValues = toValueArray(active.attr?.[attr.key]);
14954
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
15360
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
14955
15361
  const isActive = activeValues.includes(opt.value);
14956
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15362
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14957
15363
  OptionLink,
14958
15364
  {
14959
15365
  href: hrefs.attr(attr.key, opt.value),
@@ -14971,11 +15377,11 @@ function ShopFilters({
14971
15377
  );
14972
15378
  }) }, attr.key);
14973
15379
  }),
14974
- showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
15380
+ showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
14975
15381
  const isActive = active.priceMin === band.min && active.priceMax === band.max;
14976
15382
  const nextMin = isActive ? void 0 : band.min;
14977
15383
  const nextMax = isActive ? void 0 : band.max;
14978
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15384
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14979
15385
  OptionLink,
14980
15386
  {
14981
15387
  href: hrefs.price(nextMin, nextMax),
@@ -14986,7 +15392,7 @@ function ShopFilters({
14986
15392
  i
14987
15393
  );
14988
15394
  }) }),
14989
- hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15395
+ hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14990
15396
  OptionLink,
14991
15397
  {
14992
15398
  href: hrefs.onSale(!active.onSale),
@@ -14995,7 +15401,7 @@ function ShopFilters({
14995
15401
  onActivate: onChange ? () => onChange({ onSale: !active.onSale }) : void 0
14996
15402
  }
14997
15403
  ),
14998
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15404
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14999
15405
  "a",
15000
15406
  {
15001
15407
  href: hrefs.clearAll(),
@@ -15011,8 +15417,8 @@ function ShopFilters({
15011
15417
  }
15012
15418
 
15013
15419
  // src/components/course-catalog-filters.tsx
15014
- var import_utils16 = require("@reblu/site-ui/utils");
15015
- var import_jsx_runtime20 = require("react/jsx-runtime");
15420
+ var import_utils17 = require("@reblu/site-ui/utils");
15421
+ var import_jsx_runtime21 = require("react/jsx-runtime");
15016
15422
  var DEFAULT_COURSE_PRICE_BANDS = [
15017
15423
  { max: 5e3 },
15018
15424
  { min: 5e3, max: 15e3 },
@@ -15065,9 +15471,9 @@ function CourseCatalogFilters({
15065
15471
  const showPrice = enabled.price !== false;
15066
15472
  const isFree = Boolean(active.free);
15067
15473
  if (!showCategories && !showInstructors && !showPrice) return null;
15068
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: (0, import_utils16.cn)("space-y-6", className), "data-slot": "course-catalog-filters", children: [
15069
- showCategories && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(FilterFieldset, { legend: t.category, children: [
15070
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15474
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: (0, import_utils17.cn)("space-y-6", className), "data-slot": "course-catalog-filters", children: [
15475
+ showCategories && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(FilterFieldset, { legend: t.category, children: [
15476
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15071
15477
  OptionLink,
15072
15478
  {
15073
15479
  href: categoryHref(void 0),
@@ -15079,7 +15485,7 @@ function CourseCatalogFilters({
15079
15485
  sortedCategories.map((category) => {
15080
15486
  const isActive = active.category === category.slug;
15081
15487
  const next2 = isActive ? void 0 : category.slug;
15082
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15488
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15083
15489
  OptionLink,
15084
15490
  {
15085
15491
  href: categoryHref(next2),
@@ -15091,8 +15497,8 @@ function CourseCatalogFilters({
15091
15497
  );
15092
15498
  })
15093
15499
  ] }),
15094
- showInstructors && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(FilterFieldset, { legend: t.instructor, children: [
15095
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15500
+ showInstructors && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(FilterFieldset, { legend: t.instructor, children: [
15501
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15096
15502
  OptionLink,
15097
15503
  {
15098
15504
  href: hrefs.instructor(void 0),
@@ -15104,7 +15510,7 @@ function CourseCatalogFilters({
15104
15510
  named.map((instructor) => {
15105
15511
  const isActive = active.instructor === instructor.id;
15106
15512
  const next2 = isActive ? void 0 : instructor.id;
15107
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15513
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15108
15514
  OptionLink,
15109
15515
  {
15110
15516
  href: hrefs.instructor(next2),
@@ -15116,8 +15522,8 @@ function CourseCatalogFilters({
15116
15522
  );
15117
15523
  })
15118
15524
  ] }),
15119
- showPrice && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(FilterFieldset, { legend: t.price, children: [
15120
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15525
+ showPrice && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(FilterFieldset, { legend: t.price, children: [
15526
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15121
15527
  OptionLink,
15122
15528
  {
15123
15529
  href: hrefs.free(!isFree),
@@ -15132,7 +15538,7 @@ function CourseCatalogFilters({
15132
15538
  const isActive = !isFree && active.priceMin === band.min && active.priceMax === band.max;
15133
15539
  const nextMin = isActive ? void 0 : band.min;
15134
15540
  const nextMax = isActive ? void 0 : band.max;
15135
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15541
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15136
15542
  OptionLink,
15137
15543
  {
15138
15544
  href: hrefs.price(nextMin, nextMax),
@@ -15144,7 +15550,7 @@ function CourseCatalogFilters({
15144
15550
  );
15145
15551
  })
15146
15552
  ] }),
15147
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15553
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15148
15554
  "a",
15149
15555
  {
15150
15556
  href: hrefs.clearAll(),
@@ -15166,16 +15572,44 @@ function CourseCatalogFilters({
15166
15572
  }
15167
15573
 
15168
15574
  // src/components/cart-line-list.tsx
15169
- var import_utils17 = require("@reblu/site-ui/utils");
15170
- var import_jsx_runtime21 = require("react/jsx-runtime");
15575
+ var import_utils18 = require("@reblu/site-ui/utils");
15576
+ var import_jsx_runtime22 = (
15577
+ // eslint-disable-next-line react/no-array-index-key -- entries are positional, SITE-built rows
15578
+ require("react/jsx-runtime")
15579
+ );
15171
15580
  var DEFAULT_LABELS2 = {
15172
15581
  quantityLabel: "Cantidad",
15173
15582
  decrease: "Reducir cantidad",
15174
15583
  increase: "Aumentar cantidad",
15175
15584
  remove: "Eliminar",
15176
15585
  unitPriceSuffix: "/ ud.",
15177
- cancelledNotice: "Pago cancelado: tu carrito sigue aqu\xED"
15586
+ cancelledNotice: "Pago cancelado: tu carrito sigue aqu\xED",
15587
+ includesSummary: "Qu\xE9 incluye"
15178
15588
  };
15589
+ function CartLineIncludes({ entries, note, className }) {
15590
+ const hasNote = note != null && note !== false && note !== "";
15591
+ if (entries.length === 0 && !hasNote) return null;
15592
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15593
+ "div",
15594
+ {
15595
+ className: (0, import_utils18.cn)("mt-2 space-y-2 rounded-lg bg-muted px-4 py-3 text-sm", className),
15596
+ "data-slot": "cart-line-includes",
15597
+ children: [
15598
+ entries.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dl", { className: "grid grid-cols-[max-content_1fr] gap-x-4 gap-y-1.5", children: entries.map((entry, idx) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "contents", children: [
15599
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { className: "font-semibold text-muted-foreground", children: entry.label }),
15600
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dd", { className: "m-0", children: entry.value })
15601
+ ] }, idx)) }),
15602
+ hasNote && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-muted-foreground", children: note })
15603
+ ]
15604
+ }
15605
+ );
15606
+ }
15607
+ function bundleComponentsToIncludes(components) {
15608
+ return components.map(({ quantity, component }) => ({
15609
+ label: component.name,
15610
+ value: `x${quantity}`
15611
+ }));
15612
+ }
15179
15613
  function lineKey(productId, variantId) {
15180
15614
  return `${productId}-${variantId ?? "no-variant"}`;
15181
15615
  }
@@ -15186,6 +15620,7 @@ function CartLineList({
15186
15620
  liveMessage,
15187
15621
  notice,
15188
15622
  lineMessage,
15623
+ lineIncludes,
15189
15624
  labels,
15190
15625
  currencyCode,
15191
15626
  locale,
@@ -15193,9 +15628,9 @@ function CartLineList({
15193
15628
  }) {
15194
15629
  const t = { ...DEFAULT_LABELS2, ...labels };
15195
15630
  const noticeContent = notice === true ? t.cancelledNotice : notice;
15196
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: (0, import_utils17.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
15197
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
15198
- noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15631
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: (0, import_utils18.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
15632
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
15633
+ noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15199
15634
  "div",
15200
15635
  {
15201
15636
  role: "status",
@@ -15204,33 +15639,34 @@ function CartLineList({
15204
15639
  children: noticeContent
15205
15640
  }
15206
15641
  ),
15207
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
15642
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
15208
15643
  const maxQty = item.maxStock ?? Infinity;
15209
15644
  const atMax = item.quantity >= maxQty;
15210
15645
  const atMin = item.quantity <= 1;
15211
15646
  const message = lineMessage?.(item);
15212
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15647
+ const includes = lineIncludes?.(item);
15648
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15213
15649
  "li",
15214
15650
  {
15215
15651
  className: "flex gap-4 rounded-xl border border-border bg-card p-4",
15216
15652
  children: [
15217
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
15218
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "min-w-0 flex-1", children: [
15219
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
15220
- item.variantName && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
15221
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
15653
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
15654
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "min-w-0 flex-1", children: [
15655
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
15656
+ item.variantName && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
15657
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
15222
15658
  formatPrice(item.unitPrice, currencyCode, locale),
15223
15659
  " ",
15224
15660
  t.unitPriceSuffix
15225
15661
  ] }),
15226
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15662
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15227
15663
  "div",
15228
15664
  {
15229
15665
  role: "group",
15230
15666
  "aria-label": t.quantityLabel,
15231
15667
  className: "mt-3 flex items-center gap-3",
15232
15668
  children: [
15233
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15669
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15234
15670
  "button",
15235
15671
  {
15236
15672
  type: "button",
@@ -15241,8 +15677,8 @@ function CartLineList({
15241
15677
  children: "\u2212"
15242
15678
  }
15243
15679
  ),
15244
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
15245
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15680
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
15681
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15246
15682
  "button",
15247
15683
  {
15248
15684
  type: "button",
@@ -15253,7 +15689,7 @@ function CartLineList({
15253
15689
  children: "+"
15254
15690
  }
15255
15691
  ),
15256
- onRemove && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15692
+ onRemove && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15257
15693
  "button",
15258
15694
  {
15259
15695
  type: "button",
@@ -15266,16 +15702,20 @@ function CartLineList({
15266
15702
  ]
15267
15703
  }
15268
15704
  ),
15269
- message != null && message !== false && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15705
+ message != null && message !== false && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15270
15706
  "p",
15271
15707
  {
15272
15708
  className: "mt-2 text-sm text-destructive",
15273
15709
  "data-slot": "cart-line-list-line-message",
15274
15710
  children: message
15275
15711
  }
15276
- )
15712
+ ),
15713
+ includes != null && includes !== false && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("details", { className: "mt-2", "data-slot": "cart-line-list-includes", children: [
15714
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("summary", { className: "cursor-pointer text-sm font-semibold text-primary", children: t.includesSummary }),
15715
+ includes
15716
+ ] })
15277
15717
  ] }),
15278
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
15718
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
15279
15719
  ]
15280
15720
  },
15281
15721
  lineKey(item.productId, item.variantId)
@@ -15285,8 +15725,8 @@ function CartLineList({
15285
15725
  }
15286
15726
 
15287
15727
  // src/components/cart-summary.tsx
15288
- var import_utils18 = require("@reblu/site-ui/utils");
15289
- var import_jsx_runtime22 = require("react/jsx-runtime");
15728
+ var import_utils19 = require("@reblu/site-ui/utils");
15729
+ var import_jsx_runtime23 = require("react/jsx-runtime");
15290
15730
  var DEFAULT_LABELS3 = {
15291
15731
  subtotal: "Subtotal",
15292
15732
  discountPrefix: "Descuento",
@@ -15316,37 +15756,37 @@ function CartSummary({
15316
15756
  const hasDiscount = Boolean(discountAmount && discountAmount > 0);
15317
15757
  const noticeContent = notice === true ? t.cancelledNotice : notice;
15318
15758
  const hasNotice = noticeContent != null && noticeContent !== false;
15319
- const breakdown = /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15759
+ const breakdown = /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
15320
15760
  "dl",
15321
15761
  {
15322
- className: (0, import_utils18.cn)("space-y-2 text-sm", !hasNotice && className),
15762
+ className: (0, import_utils19.cn)("space-y-2 text-sm", !hasNotice && className),
15323
15763
  "data-slot": "cart-summary",
15324
15764
  children: [
15325
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
15326
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: t.subtotal }),
15327
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
15765
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
15766
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("dt", { children: t.subtotal }),
15767
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
15328
15768
  ] }),
15329
- hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
15330
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: autoDiscount ? t.staffDiscountApplied : `${t.discountPrefix}${discountCode ? ` (${discountCode})` : ""}` }),
15331
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("dd", { children: [
15769
+ hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
15770
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("dt", { children: autoDiscount ? t.staffDiscountApplied : `${t.discountPrefix}${discountCode ? ` (${discountCode})` : ""}` }),
15771
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("dd", { children: [
15332
15772
  "-",
15333
15773
  formatPrice(discountAmount, currencyCode, locale)
15334
15774
  ] })
15335
15775
  ] }),
15336
- shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
15337
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: t.shipping }),
15338
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
15776
+ shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
15777
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("dt", { children: t.shipping }),
15778
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
15339
15779
  ] }),
15340
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
15341
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: t.total }),
15342
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
15780
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
15781
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("dt", { children: t.total }),
15782
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
15343
15783
  ] })
15344
15784
  ]
15345
15785
  }
15346
15786
  );
15347
15787
  if (!hasNotice) return breakdown;
15348
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: (0, import_utils18.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
15349
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15788
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: (0, import_utils19.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
15789
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15350
15790
  "div",
15351
15791
  {
15352
15792
  role: "status",
@@ -15360,8 +15800,8 @@ function CartSummary({
15360
15800
  }
15361
15801
 
15362
15802
  // src/components/cart-adjustments-notice.tsx
15363
- var import_utils19 = require("@reblu/site-ui/utils");
15364
- var import_jsx_runtime23 = require("react/jsx-runtime");
15803
+ var import_utils20 = require("@reblu/site-ui/utils");
15804
+ var import_jsx_runtime24 = require("react/jsx-runtime");
15365
15805
  var DEFAULT_LABELS4 = {
15366
15806
  removed: (names) => names.length === 1 ? `Hemos quitado del carrito: ${names[0]}, ya no est\xE1 disponible.` : `Hemos quitado del carrito: ${names.join(", ")}, ya no est\xE1n disponibles.`,
15367
15807
  quantityChanged: (name, quantity) => `Hemos ajustado la cantidad de ${name} a ${quantity} por el stock disponible.`,
@@ -15395,20 +15835,20 @@ function CartAdjustmentsNotice({
15395
15835
  );
15396
15836
  }
15397
15837
  if (messages.length === 0) return null;
15398
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15838
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15399
15839
  "div",
15400
15840
  {
15401
15841
  role: "status",
15402
- className: (0, import_utils19.cn)("rounded-lg border border-border bg-muted px-3 py-2 text-sm", className),
15842
+ className: (0, import_utils20.cn)("rounded-lg border border-border bg-muted px-3 py-2 text-sm", className),
15403
15843
  "data-slot": "cart-adjustments-notice",
15404
- children: messages.length === 1 ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { children: messages[0] }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("ul", { className: "list-disc space-y-1 pl-4", children: messages.map((message, index) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { children: message }, index)) })
15844
+ children: messages.length === 1 ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { children: messages[0] }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("ul", { className: "list-disc space-y-1 pl-4", children: messages.map((message, index) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("li", { children: message }, index)) })
15405
15845
  }
15406
15846
  );
15407
15847
  }
15408
15848
 
15409
15849
  // src/components/added-to-cart-toast.tsx
15410
- var import_utils20 = require("@reblu/site-ui/utils");
15411
- var import_jsx_runtime24 = (
15850
+ var import_utils21 = require("@reblu/site-ui/utils");
15851
+ var import_jsx_runtime25 = (
15412
15852
  // eslint-disable-next-line @next/next/no-img-element -- toast content, not a Next <Image> layout context
15413
15853
  require("react/jsx-runtime")
15414
15854
  );
@@ -15431,32 +15871,32 @@ function AddedToCartToast({
15431
15871
  const message = status === "error" ? t.error : status === "outOfStock" ? t.outOfStock : t.success;
15432
15872
  const hasThumbnail = Boolean(imageUrl && imageUrl.trim().length > 0);
15433
15873
  const variant = status === "success" ? "success" : "error";
15434
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
15874
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
15435
15875
  "div",
15436
15876
  {
15437
15877
  "data-slot": "added-to-cart-toast",
15438
15878
  "data-variant": variant,
15439
- className: (0, import_utils20.cn)(
15879
+ className: (0, import_utils21.cn)(
15440
15880
  "flex items-center gap-3 rounded-xl border border-border bg-card p-3 text-sm shadow-lg",
15441
15881
  variant === "success" && "border-green-600/30 dark:border-green-400/30",
15442
15882
  variant === "error" && "border-destructive/30",
15443
15883
  className
15444
15884
  ),
15445
15885
  children: [
15446
- hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
15447
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "min-w-0 flex-1", children: [
15448
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
15449
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
15886
+ hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
15887
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "min-w-0 flex-1", children: [
15888
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
15889
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
15450
15890
  ] }),
15451
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
15891
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
15452
15892
  ]
15453
15893
  }
15454
15894
  );
15455
15895
  }
15456
15896
 
15457
15897
  // src/components/checkout-login-prompt.tsx
15458
- var import_utils21 = require("@reblu/site-ui/utils");
15459
- var import_jsx_runtime25 = require("react/jsx-runtime");
15898
+ var import_utils22 = require("@reblu/site-ui/utils");
15899
+ var import_jsx_runtime26 = require("react/jsx-runtime");
15460
15900
  var DEFAULT_LABELS6 = {
15461
15901
  title: "Identificaci\xF3n",
15462
15902
  description: "Introduce tu email para agilizar el proceso o contin\xFAa como invitado.",
@@ -15483,26 +15923,26 @@ function CheckoutLoginPrompt({
15483
15923
  if (!open) return null;
15484
15924
  const t = { ...DEFAULT_LABELS6, ...labels };
15485
15925
  const isValidEmail = EMAIL_PATTERN.test(email.trim());
15486
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
15487
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
15488
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
15926
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
15927
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
15928
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
15489
15929
  "div",
15490
15930
  {
15491
15931
  role: "dialog",
15492
15932
  "aria-modal": "true",
15493
15933
  "aria-labelledby": "checkout-login-prompt-title",
15494
15934
  "data-slot": "checkout-login-prompt",
15495
- className: (0, import_utils21.cn)(
15935
+ className: (0, import_utils22.cn)(
15496
15936
  "fixed left-1/2 top-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 space-y-5 rounded-2xl border border-border bg-background p-6 shadow-2xl",
15497
15937
  className
15498
15938
  ),
15499
15939
  children: [
15500
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
15501
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { children: [
15502
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
15503
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
15940
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
15941
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { children: [
15942
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
15943
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
15504
15944
  ] }),
15505
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15945
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
15506
15946
  "button",
15507
15947
  {
15508
15948
  type: "button",
@@ -15513,9 +15953,9 @@ function CheckoutLoginPrompt({
15513
15953
  }
15514
15954
  )
15515
15955
  ] }),
15516
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-2", children: [
15517
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
15518
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15956
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "space-y-2", children: [
15957
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
15958
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
15519
15959
  "input",
15520
15960
  {
15521
15961
  id: "checkout-login-prompt-email",
@@ -15524,29 +15964,29 @@ function CheckoutLoginPrompt({
15524
15964
  value: email,
15525
15965
  onChange: (e) => onEmailChange(e.target.value),
15526
15966
  placeholder: t.emailPlaceholder,
15527
- className: (0, import_utils21.cn)(
15967
+ className: (0, import_utils22.cn)(
15528
15968
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
15529
15969
  error ? "border-destructive" : "border-border focus:border-primary"
15530
15970
  )
15531
15971
  }
15532
15972
  ),
15533
- error && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "text-xs text-destructive", children: error })
15973
+ error && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "text-xs text-destructive", children: error })
15534
15974
  ] }),
15535
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-2", children: [
15536
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15975
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "space-y-2", children: [
15976
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
15537
15977
  "button",
15538
15978
  {
15539
15979
  type: "button",
15540
15980
  onClick: onSubmitEmail,
15541
15981
  disabled: checking || !isValidEmail,
15542
- className: (0, import_utils21.cn)(
15982
+ className: (0, import_utils22.cn)(
15543
15983
  "flex w-full cursor-pointer items-center justify-center gap-2 rounded-xl px-4 py-2.5 text-sm font-semibold transition-all",
15544
15984
  checking || !isValidEmail ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
15545
15985
  ),
15546
15986
  children: checking ? t.checking : t.continueWithEmail
15547
15987
  }
15548
15988
  ),
15549
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15989
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
15550
15990
  "button",
15551
15991
  {
15552
15992
  type: "button",
@@ -15563,9 +16003,9 @@ function CheckoutLoginPrompt({
15563
16003
  }
15564
16004
 
15565
16005
  // src/components/checkout-form.tsx
15566
- var import_utils22 = require("@reblu/site-ui/utils");
16006
+ var import_utils23 = require("@reblu/site-ui/utils");
15567
16007
  var import_phone_input = require("@reblu/site-ui/phone-input");
15568
- var import_jsx_runtime26 = require("react/jsx-runtime");
16008
+ var import_jsx_runtime27 = require("react/jsx-runtime");
15569
16009
  var DEFAULT_LABELS7 = {
15570
16010
  contactTitle: "Datos de contacto",
15571
16011
  nameLabel: "Nombre completo",
@@ -15621,22 +16061,22 @@ function CheckoutForm({
15621
16061
  event.preventDefault();
15622
16062
  if (discountCode.trim() && !discountApplying) onApplyDiscount();
15623
16063
  }
15624
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_jsx_runtime26.Fragment, { children: [
16064
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_jsx_runtime27.Fragment, { children: [
15625
16065
  loginPrompt,
15626
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
16066
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
15627
16067
  "form",
15628
16068
  {
15629
16069
  "data-testid": "checkout-form",
15630
16070
  onSubmit,
15631
- className: (0, import_utils22.cn)("space-y-8", className),
16071
+ className: (0, import_utils23.cn)("space-y-8", className),
15632
16072
  "data-slot": "checkout-form",
15633
16073
  children: [
15634
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("section", { className: "space-y-4", children: [
15635
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
15636
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15637
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "space-y-1", children: [
15638
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
15639
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16074
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("section", { className: "space-y-4", children: [
16075
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
16076
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
16077
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "space-y-1", children: [
16078
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
16079
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15640
16080
  "input",
15641
16081
  {
15642
16082
  id: "checkout-form-name",
@@ -15645,17 +16085,17 @@ function CheckoutForm({
15645
16085
  value: contact.name,
15646
16086
  onChange: (e) => patchContact({ name: e.target.value }),
15647
16087
  placeholder: t.namePlaceholder,
15648
- className: (0, import_utils22.cn)(
16088
+ className: (0, import_utils23.cn)(
15649
16089
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
15650
16090
  contactErrors?.name ? "border-destructive" : "border-border focus:border-primary"
15651
16091
  )
15652
16092
  }
15653
16093
  ),
15654
- contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
16094
+ contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
15655
16095
  ] }),
15656
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "space-y-1", children: [
15657
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
15658
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16096
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "space-y-1", children: [
16097
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
16098
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15659
16099
  "input",
15660
16100
  {
15661
16101
  id: "checkout-form-email",
@@ -15664,15 +16104,15 @@ function CheckoutForm({
15664
16104
  value: contact.email,
15665
16105
  onChange: (e) => patchContact({ email: e.target.value }),
15666
16106
  placeholder: t.emailPlaceholder,
15667
- className: (0, import_utils22.cn)(
16107
+ className: (0, import_utils23.cn)(
15668
16108
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
15669
16109
  contactErrors?.email ? "border-destructive" : "border-border focus:border-primary"
15670
16110
  )
15671
16111
  }
15672
16112
  ),
15673
- contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
16113
+ contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
15674
16114
  ] }),
15675
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16115
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15676
16116
  import_phone_input.PhoneInput,
15677
16117
  {
15678
16118
  id: "checkout-form-phone",
@@ -15686,26 +16126,26 @@ function CheckoutForm({
15686
16126
  ] })
15687
16127
  ] }),
15688
16128
  children2,
15689
- generalError ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
15690
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("section", { className: "space-y-3", children: [
15691
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
15692
- autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
16129
+ generalError ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
16130
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("section", { className: "space-y-3", children: [
16131
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
16132
+ autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
15693
16133
  "div",
15694
16134
  {
15695
16135
  className: "flex items-center gap-2 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm text-green-700 dark:border-green-800 dark:bg-green-900/20 dark:text-green-400",
15696
16136
  "data-slot": "checkout-staff-discount",
15697
16137
  children: [
15698
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "font-semibold", children: t.staffDiscountApplied }),
15699
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(autoDiscount.amount, currencyCode, locale)) })
16138
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "font-semibold", children: t.staffDiscountApplied }),
16139
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(autoDiscount.amount, currencyCode, locale)) })
15700
16140
  ]
15701
16141
  }
15702
16142
  ) : null,
15703
- appliedDiscount && !autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-center justify-between rounded-lg border border-green-200 bg-green-50 px-4 py-3 dark:border-green-800 dark:bg-green-900/20", children: [
15704
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
15705
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
15706
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
16143
+ appliedDiscount && !autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex items-center justify-between rounded-lg border border-green-200 bg-green-50 px-4 py-3 dark:border-green-800 dark:bg-green-900/20", children: [
16144
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
16145
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
16146
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
15707
16147
  ] }),
15708
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16148
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15709
16149
  "button",
15710
16150
  {
15711
16151
  type: "button",
@@ -15715,9 +16155,9 @@ function CheckoutForm({
15715
16155
  children: t.removeDiscount
15716
16156
  }
15717
16157
  )
15718
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex gap-2", children: [
15719
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
15720
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16158
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: "flex gap-2", children: [
16159
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
16160
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15721
16161
  "input",
15722
16162
  {
15723
16163
  id: "checkout-form-discount-code",
@@ -15729,7 +16169,7 @@ function CheckoutForm({
15729
16169
  className: "flex-1 rounded-lg border border-border bg-background px-3 py-2 text-sm uppercase transition focus:border-primary focus:outline-none focus:ring-2 focus:ring-primary/20"
15730
16170
  }
15731
16171
  ),
15732
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16172
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15733
16173
  "button",
15734
16174
  {
15735
16175
  type: "button",
@@ -15740,14 +16180,14 @@ function CheckoutForm({
15740
16180
  }
15741
16181
  )
15742
16182
  ] }),
15743
- discountError && /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "text-xs text-destructive", children: discountError })
16183
+ discountError && /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "text-xs text-destructive", children: discountError })
15744
16184
  ] }),
15745
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16185
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15746
16186
  "button",
15747
16187
  {
15748
16188
  type: "submit",
15749
16189
  disabled: submitting || submitDisabled,
15750
- className: (0, import_utils22.cn)(
16190
+ className: (0, import_utils23.cn)(
15751
16191
  "flex w-full cursor-pointer items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold transition-all",
15752
16192
  submitting || submitDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
15753
16193
  ),
@@ -15761,11 +16201,11 @@ function CheckoutForm({
15761
16201
  }
15762
16202
 
15763
16203
  // src/components/order-confirmation.tsx
15764
- var import_utils24 = require("@reblu/site-ui/utils");
16204
+ var import_utils25 = require("@reblu/site-ui/utils");
15765
16205
 
15766
16206
  // src/components/order-invoice-link.tsx
15767
- var import_utils23 = require("@reblu/site-ui/utils");
15768
- var import_jsx_runtime27 = require("react/jsx-runtime");
16207
+ var import_utils24 = require("@reblu/site-ui/utils");
16208
+ var import_jsx_runtime28 = require("react/jsx-runtime");
15769
16209
  var DEFAULT_LABELS8 = {
15770
16210
  linkLabel: "Descargar la factura {number}",
15771
16211
  signInHint: "Te pediremos que inicies sesi\xF3n para abrirla."
@@ -15773,8 +16213,8 @@ var DEFAULT_LABELS8 = {
15773
16213
  function OrderInvoiceLink({ invoice, labels, className }) {
15774
16214
  if (!invoice) return null;
15775
16215
  const t = { ...DEFAULT_LABELS8, ...labels };
15776
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: (0, import_utils23.cn)("space-y-1 text-sm", className), "data-slot": "order-invoice-link", children: [
15777
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
16216
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: (0, import_utils24.cn)("space-y-1 text-sm", className), "data-slot": "order-invoice-link", children: [
16217
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
15778
16218
  "a",
15779
16219
  {
15780
16220
  href: invoice.url,
@@ -15782,19 +16222,21 @@ function OrderInvoiceLink({ invoice, labels, className }) {
15782
16222
  children: t.linkLabel.replace("{number}", invoice.number)
15783
16223
  }
15784
16224
  ),
15785
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "text-muted-foreground", children: t.signInHint })
16225
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "text-muted-foreground", children: t.signInHint })
15786
16226
  ] });
15787
16227
  }
15788
16228
 
15789
16229
  // src/components/order-confirmation.tsx
15790
- var import_jsx_runtime28 = require("react/jsx-runtime");
16230
+ var import_jsx_runtime29 = require("react/jsx-runtime");
15791
16231
  var DEFAULT_LABELS9 = {
15792
16232
  pollingTitle: "Confirmando tu pedido\u2026",
15793
16233
  pollingDescription: "Estamos procesando el pago, un momento\u2026",
15794
16234
  foundTitle: "\xA1Pedido confirmado!",
15795
- // REB-1085: every buyer gets a customer account; the order email carries
15796
- // the access link. Files are never served from this page.
15797
- foundDescription: "Te hemos enviado un email con tu acceso.",
16235
+ // REB-1200 (owner OK 6-Nov): no «con tu acceso» sentence — buyers who
16236
+ // already have an account (staff, returning clients) get no new access.
16237
+ // `{number}` and `{email}` come from the order. Files are never served here.
16238
+ foundDescription: "Tu pedido {number} est\xE1 confirmado. Te hemos enviado el resumen a {email}.",
16239
+ foundWithoutOrderDescription: "Tu pedido est\xE1 confirmado.",
15798
16240
  timeoutTitle: "Pago recibido",
15799
16241
  timeoutDescription: "Tu pago se ha procesado. Recibir\xE1s un email de confirmaci\xF3n en breve.",
15800
16242
  orderNumberLabel: "Pedido confirmado",
@@ -15820,6 +16262,12 @@ var DEFAULT_LABELS9 = {
15820
16262
  invoiceLinkLabel: "Descargar la factura {number}",
15821
16263
  invoiceSignInHint: "Te pediremos que inicies sesi\xF3n para abrirla."
15822
16264
  };
16265
+ function foundDescription(t, order) {
16266
+ const template = t.foundDescription;
16267
+ if (!/\{(number|email)\}/.test(template)) return template;
16268
+ if (!order) return t.foundWithoutOrderDescription;
16269
+ return template.replaceAll("{number}", order.orderNumber).replaceAll("{email}", order.customerEmail);
16270
+ }
15823
16271
  function OrderConfirmation({
15824
16272
  status,
15825
16273
  order,
@@ -15846,50 +16294,50 @@ function OrderConfirmation({
15846
16294
  }
15847
16295
  if (status === "not_found") return { title: t.notFoundTitle, description: t.notFoundDescription };
15848
16296
  if (status === "error") return { title: t.errorTitle, description: t.errorDescription };
15849
- if (isFound || order) return { title: t.foundTitle, description: t.foundDescription };
16297
+ if (isFound || order) return { title: t.foundTitle, description: foundDescription(t, order) };
15850
16298
  return { title: t.timeoutTitle, description: t.timeoutDescription };
15851
16299
  })();
15852
16300
  const showFullOrderSummary = Boolean(order) && (isFound || status === "timeout");
15853
16301
  const showOrderReference = Boolean(order) && !showFullOrderSummary && (status === "refunded" || status === "partially_refunded" || status === "pending_timeout");
15854
16302
  const showSessionReference = !order && sessionId && (status === "timeout" || status === "not_found" || status === "pending_timeout");
15855
16303
  const showRecheck = (status === "pending_timeout" || status === "error") && onRecheck;
15856
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: (0, import_utils24.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
15857
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("h1", { className: "text-3xl font-bold", children: title }),
15858
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
15859
- showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "space-y-6", children: [
15860
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15861
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
15862
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
16304
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: (0, import_utils25.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
16305
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("h1", { className: "text-3xl font-bold", children: title }),
16306
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
16307
+ showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-6", children: [
16308
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
16309
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
16310
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15863
16311
  ] }),
15864
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
15865
- order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
16312
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
16313
+ order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
15866
16314
  "div",
15867
16315
  {
15868
16316
  className: "flex justify-between gap-4 text-sm",
15869
16317
  children: [
15870
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
16318
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
15871
16319
  item.product.name,
15872
16320
  item.variant ? ` (${item.variant.name})` : "",
15873
16321
  " x",
15874
16322
  item.quantity
15875
16323
  ] }),
15876
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
16324
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
15877
16325
  ]
15878
16326
  },
15879
16327
  idx
15880
16328
  )),
15881
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
15882
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { children: t.totalLabel }),
15883
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
16329
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
16330
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { children: t.totalLabel }),
16331
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
15884
16332
  ] }) })
15885
16333
  ] }),
15886
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
16334
+ t.foundDescription.includes("{email}") ? null : /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
15887
16335
  t.confirmationEmailPrefix,
15888
16336
  " ",
15889
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
16337
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
15890
16338
  "."
15891
16339
  ] }),
15892
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
16340
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
15893
16341
  OrderInvoiceLink,
15894
16342
  {
15895
16343
  invoice: order.invoice,
@@ -15897,11 +16345,11 @@ function OrderConfirmation({
15897
16345
  }
15898
16346
  )
15899
16347
  ] }),
15900
- showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15901
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
15902
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
16348
+ showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
16349
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
16350
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15903
16351
  ] }),
15904
- status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
16352
+ status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
15905
16353
  "a",
15906
16354
  {
15907
16355
  href: cartHref,
@@ -15909,7 +16357,7 @@ function OrderConfirmation({
15909
16357
  children: t.backToCartLabel
15910
16358
  }
15911
16359
  ),
15912
- showRecheck && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
16360
+ showRecheck && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
15913
16361
  "button",
15914
16362
  {
15915
16363
  type: "button",
@@ -15918,16 +16366,16 @@ function OrderConfirmation({
15918
16366
  children: t.recheckLabel
15919
16367
  }
15920
16368
  ),
15921
- showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15922
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
15923
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
16369
+ showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
16370
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
16371
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
15924
16372
  ] })
15925
16373
  ] });
15926
16374
  }
15927
16375
 
15928
16376
  // src/components/full-invoice-fields.tsx
15929
- var import_utils25 = require("@reblu/site-ui/utils");
15930
- var import_jsx_runtime29 = require("react/jsx-runtime");
16377
+ var import_utils26 = require("@reblu/site-ui/utils");
16378
+ var import_jsx_runtime30 = require("react/jsx-runtime");
15931
16379
  var EMPTY_FULL_INVOICE_VALUE = {
15932
16380
  wantsFullInvoice: false,
15933
16381
  billingIdType: "NIF",
@@ -16044,12 +16492,12 @@ function FullInvoiceFields({
16044
16492
  const showFields = value.wantsFullInvoice || overCap;
16045
16493
  const isSpanishNif = value.billingIdType === "NIF";
16046
16494
  const set = (key2, next2) => onChange({ ...value, [key2]: next2 });
16047
- const error = (key2) => errors[key2] ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { id: `full-invoice-${key2}-error`, className: "text-sm text-destructive", children: errors[key2] }) : null;
16495
+ const error = (key2) => errors[key2] ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { id: `full-invoice-${key2}-error`, className: "text-sm text-destructive", children: errors[key2] }) : null;
16048
16496
  const invalid2 = (key2) => errors[key2] ? { "aria-invalid": true, "aria-describedby": `full-invoice-${key2}-error` } : {};
16049
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("section", { className: (0, import_utils25.cn)("space-y-4", className), "data-slot": "full-invoice-fields", children: [
16050
- overCap ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { role: "note", className: "rounded-lg border border-border p-4 text-sm", children: t.overCapNotice }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16051
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
16052
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16497
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("section", { className: (0, import_utils26.cn)("space-y-4", className), "data-slot": "full-invoice-fields", children: [
16498
+ overCap ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { role: "note", className: "rounded-lg border border-border p-4 text-sm", children: t.overCapNotice }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16499
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
16500
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16053
16501
  "input",
16054
16502
  {
16055
16503
  type: "checkbox",
@@ -16059,12 +16507,12 @@ function FullInvoiceFields({
16059
16507
  ),
16060
16508
  t.toggle
16061
16509
  ] }),
16062
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("p", { className: "text-sm text-muted-foreground", children: t.underCapNotice })
16510
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { className: "text-sm text-muted-foreground", children: t.underCapNotice })
16063
16511
  ] }),
16064
- showFields && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
16065
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16066
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-id-type", className: "text-sm font-medium", children: t.idType }),
16067
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16512
+ showFields && /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
16513
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16514
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-id-type", className: "text-sm font-medium", children: t.idType }),
16515
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16068
16516
  "select",
16069
16517
  {
16070
16518
  id: "full-invoice-id-type",
@@ -16073,14 +16521,14 @@ function FullInvoiceFields({
16073
16521
  value: value.billingIdType,
16074
16522
  onChange: (e) => set("billingIdType", e.target.value),
16075
16523
  ...invalid2("billingIdType"),
16076
- children: ID_TYPES.map((type) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("option", { value: type, children: t.idTypeOptions[type] }, type))
16524
+ children: ID_TYPES.map((type) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("option", { value: type, children: t.idTypeOptions[type] }, type))
16077
16525
  }
16078
16526
  ),
16079
16527
  error("billingIdType")
16080
16528
  ] }),
16081
- !isSpanishNif && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16082
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-id-country", className: "text-sm font-medium", children: t.idCountry }),
16083
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
16529
+ !isSpanishNif && /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16530
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-id-country", className: "text-sm font-medium", children: t.idCountry }),
16531
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
16084
16532
  "select",
16085
16533
  {
16086
16534
  id: "full-invoice-id-country",
@@ -16090,16 +16538,16 @@ function FullInvoiceFields({
16090
16538
  onChange: (e) => set("billingIdCountry", e.target.value),
16091
16539
  ...invalid2("billingIdCountry"),
16092
16540
  children: [
16093
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("option", { value: "", disabled: true, children: t.chooseCountry }),
16094
- countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("option", { value: c.code, children: c.name }, c.code))
16541
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("option", { value: "", disabled: true, children: t.chooseCountry }),
16542
+ countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("option", { value: c.code, children: c.name }, c.code))
16095
16543
  ]
16096
16544
  }
16097
16545
  ),
16098
16546
  error("billingIdCountry")
16099
16547
  ] }),
16100
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16101
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-nif", className: "text-sm font-medium", children: isSpanishNif ? t.spanishNif : t.documentNumber }),
16102
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16548
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16549
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-nif", className: "text-sm font-medium", children: isSpanishNif ? t.spanishNif : t.documentNumber }),
16550
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16103
16551
  "input",
16104
16552
  {
16105
16553
  id: "full-invoice-nif",
@@ -16112,9 +16560,9 @@ function FullInvoiceFields({
16112
16560
  ),
16113
16561
  error("billingNif")
16114
16562
  ] }),
16115
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16116
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-name", className: "text-sm font-medium", children: t.name }),
16117
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16563
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16564
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-name", className: "text-sm font-medium", children: t.name }),
16565
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16118
16566
  "input",
16119
16567
  {
16120
16568
  id: "full-invoice-name",
@@ -16127,9 +16575,9 @@ function FullInvoiceFields({
16127
16575
  ),
16128
16576
  error("billingName")
16129
16577
  ] }),
16130
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1 sm:col-span-2", children: [
16131
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-street", className: "text-sm font-medium", children: t.street }),
16132
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16578
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1 sm:col-span-2", children: [
16579
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-street", className: "text-sm font-medium", children: t.street }),
16580
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16133
16581
  "input",
16134
16582
  {
16135
16583
  id: "full-invoice-street",
@@ -16141,9 +16589,9 @@ function FullInvoiceFields({
16141
16589
  }
16142
16590
  )
16143
16591
  ] }),
16144
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16145
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-postal-code", className: "text-sm font-medium", children: t.postalCode }),
16146
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16592
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16593
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-postal-code", className: "text-sm font-medium", children: t.postalCode }),
16594
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16147
16595
  "input",
16148
16596
  {
16149
16597
  id: "full-invoice-postal-code",
@@ -16154,9 +16602,9 @@ function FullInvoiceFields({
16154
16602
  }
16155
16603
  )
16156
16604
  ] }),
16157
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16158
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-city", className: "text-sm font-medium", children: t.city }),
16159
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16605
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16606
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-city", className: "text-sm font-medium", children: t.city }),
16607
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16160
16608
  "input",
16161
16609
  {
16162
16610
  id: "full-invoice-city",
@@ -16167,9 +16615,9 @@ function FullInvoiceFields({
16167
16615
  }
16168
16616
  )
16169
16617
  ] }),
16170
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16171
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-country", className: "text-sm font-medium", children: t.country }),
16172
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
16618
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "space-y-1", children: [
16619
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: "full-invoice-country", className: "text-sm font-medium", children: t.country }),
16620
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16173
16621
  "select",
16174
16622
  {
16175
16623
  id: "full-invoice-country",
@@ -16177,18 +16625,18 @@ function FullInvoiceFields({
16177
16625
  required: true,
16178
16626
  value: value.country,
16179
16627
  onChange: (e) => set("country", e.target.value),
16180
- children: countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("option", { value: c.code, children: c.name }, c.code))
16628
+ children: countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("option", { value: c.code, children: c.name }, c.code))
16181
16629
  }
16182
16630
  )
16183
16631
  ] }),
16184
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "sm:col-span-2", children: error("address") })
16632
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "sm:col-span-2", children: error("address") })
16185
16633
  ] })
16186
16634
  ] });
16187
16635
  }
16188
16636
 
16189
16637
  // src/components/checkout-delivery-choice.tsx
16190
- var import_utils26 = require("@reblu/site-ui/utils");
16191
- var import_jsx_runtime30 = require("react/jsx-runtime");
16638
+ var import_utils27 = require("@reblu/site-ui/utils");
16639
+ var import_jsx_runtime31 = require("react/jsx-runtime");
16192
16640
  var EMPTY_CHECKOUT_ADDRESS = {
16193
16641
  firstName: "",
16194
16642
  lastName: "",
@@ -16251,17 +16699,17 @@ function CheckoutDeliveryChoice({
16251
16699
  const isPickup = value?.type === "PICKUP";
16252
16700
  const isShipping = value?.type === "SHIPPING";
16253
16701
  const errorId = `${uid}-delivery-error`;
16254
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
16702
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
16255
16703
  "fieldset",
16256
16704
  {
16257
16705
  "data-slot": "checkout-delivery",
16258
16706
  "aria-describedby": error ? errorId : void 0,
16259
- className: (0, import_utils26.cn)("space-y-4", className),
16707
+ className: (0, import_utils27.cn)("space-y-4", className),
16260
16708
  children: [
16261
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("legend", { className: "mb-2 text-lg font-semibold", children: t.legend }),
16262
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "grid gap-3 sm:grid-cols-2", children: [
16263
- homeDelivery ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("label", { className: "flex cursor-pointer items-start gap-3 rounded-xl border border-border p-4 has-[:checked]:border-primary", children: [
16264
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16709
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("legend", { className: "mb-2 text-lg font-semibold", children: t.legend }),
16710
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "grid gap-3 sm:grid-cols-2", children: [
16711
+ homeDelivery ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("label", { className: "flex cursor-pointer items-start gap-3 rounded-xl border border-border p-4 has-[:checked]:border-primary", children: [
16712
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16265
16713
  "input",
16266
16714
  {
16267
16715
  type: "radio",
@@ -16271,42 +16719,42 @@ function CheckoutDeliveryChoice({
16271
16719
  className: "mt-0.5 size-4 accent-primary"
16272
16720
  }
16273
16721
  ),
16274
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "flex-1 space-y-1", children: [
16275
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "flex justify-between gap-2 font-medium", children: [
16276
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: copy.shippingOptionLabel }),
16277
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "tabular-nums", children: homeCost })
16722
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: "flex-1 space-y-1", children: [
16723
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: "flex justify-between gap-2 font-medium", children: [
16724
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: copy.shippingOptionLabel }),
16725
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "tabular-nums", children: homeCost })
16278
16726
  ] }),
16279
- delivery.estimatedDeliveryText ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "block text-sm text-muted-foreground", children: delivery.estimatedDeliveryText }) : null
16727
+ delivery.estimatedDeliveryText ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "block text-sm text-muted-foreground", children: delivery.estimatedDeliveryText }) : null
16280
16728
  ] })
16281
16729
  ] }) : null,
16282
- pickup ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("label", { className: "flex cursor-pointer items-start gap-3 rounded-xl border border-border p-4 has-[:checked]:border-primary", children: [
16283
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16730
+ pickup ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("label", { className: "flex cursor-pointer items-start gap-3 rounded-xl border border-border p-4 has-[:checked]:border-primary", children: [
16731
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16284
16732
  "input",
16285
16733
  {
16286
16734
  type: "radio",
16287
16735
  name: `${uid}-method`,
16288
16736
  checked: isPickup,
16289
- onChange: () => onChange({ type: "PICKUP" }),
16737
+ onChange: () => onChange(pickupFulfillment(delivery)),
16290
16738
  className: "mt-0.5 size-4 accent-primary"
16291
16739
  }
16292
16740
  ),
16293
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "flex flex-1 justify-between gap-2 font-medium", children: [
16294
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: copy.pickupOptionLabel }),
16295
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: t.free })
16741
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: "flex flex-1 justify-between gap-2 font-medium", children: [
16742
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: copy.pickupOptionLabel }),
16743
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: t.free })
16296
16744
  ] })
16297
16745
  ] }) : null
16298
16746
  ] }),
16299
- error ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { id: errorId, role: "alert", className: "text-sm text-destructive", children: error }) : null,
16300
- isPickup ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { role: "radiogroup", "aria-labelledby": `${uid}-points`, className: "space-y-2", children: [
16301
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { id: `${uid}-points`, className: "text-sm font-medium", children: t.pickupPointsLegend }),
16747
+ error ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { id: errorId, role: "alert", className: "text-sm text-destructive", children: error }) : null,
16748
+ isPickup ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { role: "radiogroup", "aria-labelledby": `${uid}-points`, className: "space-y-2", children: [
16749
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { id: `${uid}-points`, className: "text-sm font-medium", children: t.pickupPointsLegend }),
16302
16750
  delivery.pickupLocations.map((location2) => {
16303
16751
  const descId = `${uid}-point-${location2.id}`;
16304
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
16752
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
16305
16753
  "label",
16306
16754
  {
16307
16755
  className: "flex cursor-pointer items-start gap-3 rounded-lg border border-border p-3 has-[:checked]:border-primary",
16308
16756
  children: [
16309
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16757
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16310
16758
  "input",
16311
16759
  {
16312
16760
  type: "radio",
@@ -16317,9 +16765,9 @@ function CheckoutDeliveryChoice({
16317
16765
  className: "mt-0.5 size-4 accent-primary"
16318
16766
  }
16319
16767
  ),
16320
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "space-y-0.5 text-sm", children: [
16321
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "block font-medium", children: location2.name }),
16322
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { id: descId, className: "block text-muted-foreground", children: pickupDescription(location2) })
16768
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("span", { className: "space-y-0.5 text-sm", children: [
16769
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "block font-medium", children: location2.name }),
16770
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { id: descId, className: "block text-muted-foreground", children: pickupDescription(location2) })
16323
16771
  ] })
16324
16772
  ]
16325
16773
  },
@@ -16327,14 +16775,14 @@ function CheckoutDeliveryChoice({
16327
16775
  );
16328
16776
  })
16329
16777
  ] }) : null,
16330
- isShipping ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("fieldset", { className: "space-y-3", children: [
16331
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("legend", { className: "mb-2 text-sm font-medium", children: t.addressLegend }),
16332
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: ADDRESS_FIELDS.map(({ key: key2, autoComplete, required, wide }) => {
16778
+ isShipping ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("fieldset", { className: "space-y-3", children: [
16779
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("legend", { className: "mb-2 text-sm font-medium", children: t.addressLegend }),
16780
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: ADDRESS_FIELDS.map(({ key: key2, autoComplete, required, wide }) => {
16333
16781
  const fieldId = `${uid}-${key2}`;
16334
16782
  const fieldError = addressErrors?.[key2];
16335
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: (0, import_utils26.cn)("space-y-1", wide && "sm:col-span-2"), children: [
16336
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: fieldId, className: "text-sm font-medium", children: t[key2] }),
16337
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16783
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: (0, import_utils27.cn)("space-y-1", wide && "sm:col-span-2"), children: [
16784
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("label", { htmlFor: fieldId, className: "text-sm font-medium", children: t[key2] }),
16785
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16338
16786
  "input",
16339
16787
  {
16340
16788
  id: fieldId,
@@ -16345,13 +16793,13 @@ function CheckoutDeliveryChoice({
16345
16793
  onChange: (e) => onAddressChange({ ...address, [key2]: e.target.value }),
16346
16794
  "aria-invalid": fieldError ? true : void 0,
16347
16795
  "aria-describedby": fieldError ? `${fieldId}-error` : void 0,
16348
- className: (0, import_utils26.cn)(
16796
+ className: (0, import_utils27.cn)(
16349
16797
  INPUT_CLASS,
16350
16798
  fieldError ? "border-destructive" : "border-border focus:border-primary"
16351
16799
  )
16352
16800
  }
16353
16801
  ),
16354
- fieldError ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { id: `${fieldId}-error`, className: "text-sm text-destructive", children: fieldError }) : null
16802
+ fieldError ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { id: `${fieldId}-error`, className: "text-sm text-destructive", children: fieldError }) : null
16355
16803
  ] }, key2);
16356
16804
  }) })
16357
16805
  ] }) : null
@@ -16359,12 +16807,19 @@ function CheckoutDeliveryChoice({
16359
16807
  }
16360
16808
  );
16361
16809
  }
16810
+ function pickupFulfillment(delivery) {
16811
+ const [only, ...rest] = delivery.pickupLocations;
16812
+ return only && rest.length === 0 ? { type: "PICKUP", pickupLocationId: only.id } : { type: "PICKUP" };
16813
+ }
16362
16814
  function defaultCheckoutFulfillment(delivery) {
16363
16815
  if (!delivery) return null;
16364
16816
  if (delivery.methods.homeDelivery) return { type: "SHIPPING" };
16365
16817
  if (!delivery.methods.pickup) return null;
16366
- const [only, ...rest] = delivery.pickupLocations;
16367
- return only && rest.length === 0 ? { type: "PICKUP", pickupLocationId: only.id } : { type: "PICKUP" };
16818
+ return pickupFulfillment(delivery);
16819
+ }
16820
+ function isCheckoutDeliveryComplete(value, requiresDelivery = true) {
16821
+ if (!value || !requiresDelivery) return true;
16822
+ return value.type !== "PICKUP" || Boolean(value.pickupLocationId);
16368
16823
  }
16369
16824
  function quoteRequiresDelivery(quote) {
16370
16825
  return quote ? quote.lines.some((line) => line.isShippable) : true;
@@ -16386,8 +16841,8 @@ function toCheckoutFulfillmentFields(value, address, requiresDelivery = true) {
16386
16841
  }
16387
16842
 
16388
16843
  // src/components/checkout-quote-summary.tsx
16389
- var import_utils27 = require("@reblu/site-ui/utils");
16390
- var import_jsx_runtime31 = require("react/jsx-runtime");
16844
+ var import_utils28 = require("@reblu/site-ui/utils");
16845
+ var import_jsx_runtime32 = require("react/jsx-runtime");
16391
16846
  var DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS = {
16392
16847
  subtotal: "Subtotal",
16393
16848
  discount: (codeOrLabel, isAutomatic) => isAutomatic ? codeOrLabel : `Descuento (${codeOrLabel})`,
@@ -16404,9 +16859,9 @@ function Row({
16404
16859
  value,
16405
16860
  className
16406
16861
  }) {
16407
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { "data-slot": "checkout-quote-row", className: (0, import_utils27.cn)("flex justify-between gap-4", className), children: [
16408
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("dt", { children: name }),
16409
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("dd", { className: "shrink-0 tabular-nums", children: value })
16862
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { "data-slot": "checkout-quote-row", className: (0, import_utils28.cn)("flex justify-between gap-4", className), children: [
16863
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("dt", { children: name }),
16864
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("dd", { className: "shrink-0 tabular-nums", children: value })
16410
16865
  ] });
16411
16866
  }
16412
16867
  function CheckoutQuoteSummary({
@@ -16422,22 +16877,22 @@ function CheckoutQuoteSummary({
16422
16877
  const price = (cents) => formatPrice(cents, currencyCode, locale);
16423
16878
  const { fulfillment, shipping, tax, discount } = quote;
16424
16879
  const Tag = `h${headingLevel}`;
16425
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("section", { "data-slot": "checkout-quote-summary", className: slotClassName("space-y-4", "", className), children: [
16426
- heading ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Tag, { className: "text-lg font-semibold", children: heading }) : null,
16427
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("ul", { className: "space-y-3 text-sm", children: quote.lines.map((line) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("li", { className: "flex justify-between gap-4", children: [
16428
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "min-w-0 space-y-0.5", children: [
16429
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "font-medium", children: line.name }),
16430
- line.variantName ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-muted-foreground", children: line.variantName }) : null,
16431
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("p", { className: "flex flex-wrap items-center gap-2 text-muted-foreground", children: [
16432
- line.kindLabel ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { "data-slot": "checkout-quote-kind", className: "rounded-full border border-border px-2 py-0.5 text-xs font-medium text-foreground", children: line.kindLabel }) : null,
16433
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: t.quantityTimesUnit(line.quantity, price(line.unitPrice)) })
16880
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("section", { "data-slot": "checkout-quote-summary", className: slotClassName("space-y-4", "", className), children: [
16881
+ heading ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Tag, { className: "text-lg font-semibold", children: heading }) : null,
16882
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("ul", { className: "space-y-3 text-sm", children: quote.lines.map((line) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("li", { className: "flex justify-between gap-4", children: [
16883
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "min-w-0 space-y-0.5", children: [
16884
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { className: "font-medium", children: line.name }),
16885
+ line.variantName ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { className: "text-muted-foreground", children: line.variantName }) : null,
16886
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("p", { className: "flex flex-wrap items-center gap-2 text-muted-foreground", children: [
16887
+ line.kindLabel ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { "data-slot": "checkout-quote-kind", className: "rounded-full border border-border px-2 py-0.5 text-xs font-medium text-foreground", children: line.kindLabel }) : null,
16888
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: t.quantityTimesUnit(line.quantity, price(line.unitPrice)) })
16434
16889
  ] })
16435
16890
  ] }),
16436
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "shrink-0 tabular-nums", children: price(line.total) })
16891
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "shrink-0 tabular-nums", children: price(line.total) })
16437
16892
  ] }, `${line.productId}-${line.variantId ?? ""}`)) }),
16438
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("dl", { className: "space-y-2 border-t border-border pt-3 text-sm", children: [
16439
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Row, { name: t.subtotal, value: price(quote.subtotal) }),
16440
- discount && discount.amount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16893
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("dl", { className: "space-y-2 border-t border-border pt-3 text-sm", children: [
16894
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Row, { name: t.subtotal, value: price(quote.subtotal) }),
16895
+ discount && discount.amount > 0 ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
16441
16896
  Row,
16442
16897
  {
16443
16898
  className: "text-green-700 dark:text-green-400",
@@ -16445,17 +16900,17 @@ function CheckoutQuoteSummary({
16445
16900
  value: `\u2212${price(discount.amount)}`
16446
16901
  }
16447
16902
  ) : null,
16448
- fulfillment.type ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16903
+ fulfillment.type ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
16449
16904
  Row,
16450
16905
  {
16451
- name: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
16906
+ name: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_jsx_runtime32.Fragment, { children: [
16452
16907
  fulfillment.label ?? t.delivery,
16453
- fulfillment.type === "PICKUP" && fulfillment.pickupLocation ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "block text-muted-foreground", children: fulfillment.pickupLocation.name }) : null
16908
+ fulfillment.type === "PICKUP" && fulfillment.pickupLocation ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "block text-muted-foreground", children: fulfillment.pickupLocation.name }) : null
16454
16909
  ] }),
16455
16910
  value: fulfillment.type === "PICKUP" || shipping.isFree ? t.free : price(shipping.cost)
16456
16911
  }
16457
16912
  ) : null,
16458
- tax.isLineVisible ? tax.breakdown.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16913
+ tax.isLineVisible ? tax.breakdown.map((entry) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
16459
16914
  Row,
16460
16915
  {
16461
16916
  className: tax.isIncluded ? "text-muted-foreground" : void 0,
@@ -16464,19 +16919,44 @@ function CheckoutQuoteSummary({
16464
16919
  },
16465
16920
  entry.label
16466
16921
  )) : null,
16467
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Row, { className: "border-t border-border pt-2 text-base font-bold", name: t.total, value: price(quote.total) })
16922
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Row, { className: "border-t border-border pt-2 text-base font-bold", name: t.total, value: price(quote.total) })
16468
16923
  ] }),
16469
- tax.isIncluded ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-sm text-muted-foreground", children: t.taxesIncludedNote }) : null,
16470
- fulfillment.type === "SHIPPING" && !shipping.isFree && shipping.remainingForFree ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-sm text-muted-foreground", children: t.remainingForFree(price(shipping.remainingForFree)) }) : null,
16471
- fulfillment.type && quote.deliveryEstimateText ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { "data-slot": "checkout-quote-estimate", className: "text-sm text-muted-foreground", children: quote.deliveryEstimateText }) : null,
16472
- quote.discountError ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { role: "status", className: "text-sm text-destructive", children: quote.discountError.message }) : null,
16473
- quote.blockingReason ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { role: "alert", className: "rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive", children: quote.blockingReason.message }) : null
16924
+ tax.isIncluded ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { className: "text-sm text-muted-foreground", children: t.taxesIncludedNote }) : null,
16925
+ fulfillment.type === "SHIPPING" && !shipping.isFree && shipping.remainingForFree ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { className: "text-sm text-muted-foreground", children: t.remainingForFree(price(shipping.remainingForFree)) }) : null,
16926
+ fulfillment.type && quote.deliveryEstimateText ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { "data-slot": "checkout-quote-estimate", className: "text-sm text-muted-foreground", children: quote.deliveryEstimateText }) : null,
16927
+ quote.discountError ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { role: "status", className: "text-sm text-destructive", children: quote.discountError.message }) : null,
16928
+ quote.blockingReason ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { role: "alert", className: "rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive", children: quote.blockingReason.message }) : null
16474
16929
  ] });
16475
16930
  }
16931
+ var DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS = {
16932
+ pickupLocationRequired: "Elige un punto de recogida"
16933
+ };
16934
+ function checkoutQuoteNotice({
16935
+ fulfillment,
16936
+ requiresDelivery = true,
16937
+ error
16938
+ }) {
16939
+ if (!isCheckoutDeliveryComplete(fulfillment, requiresDelivery)) return "PICKUP_LOCATION_REQUIRED";
16940
+ if (error?.code === "PICKUP_LOCATION_INVALID") return "PICKUP_LOCATION_REQUIRED";
16941
+ return null;
16942
+ }
16943
+ function CheckoutQuoteNotice({ reason, labels, className }) {
16944
+ if (!reason) return null;
16945
+ const t = { ...DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS, ...labels };
16946
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
16947
+ "p",
16948
+ {
16949
+ role: "status",
16950
+ "data-slot": "checkout-quote-notice",
16951
+ className: slotClassName("rounded-lg border border-border bg-muted p-3 text-sm", "", className),
16952
+ children: t.pickupLocationRequired
16953
+ }
16954
+ );
16955
+ }
16476
16956
 
16477
16957
  // src/components/checkout-terms-acceptance.tsx
16478
- var import_utils28 = require("@reblu/site-ui/utils");
16479
- var import_jsx_runtime32 = require("react/jsx-runtime");
16958
+ var import_utils29 = require("@reblu/site-ui/utils");
16959
+ var import_jsx_runtime33 = require("react/jsx-runtime");
16480
16960
  function splitTermsLabel(label) {
16481
16961
  const at = label.indexOf("{terms}");
16482
16962
  return at === -1 ? [`${label} `, ""] : [label.slice(0, at), label.slice(at + "{terms}".length)];
@@ -16498,9 +16978,9 @@ function CheckoutTermsAcceptance({
16498
16978
  (part) => part.replaceAll("{tenant}", copy.tenantName)
16499
16979
  );
16500
16980
  const newTab = copy.isTermsLinkNewTab;
16501
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { "data-slot": "checkout-terms", className: (0, import_utils28.cn)("space-y-1", className), children: [
16502
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-start gap-3", children: [
16503
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
16981
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { "data-slot": "checkout-terms", className: (0, import_utils29.cn)("space-y-1", className), children: [
16982
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: "flex items-start gap-3", children: [
16983
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
16504
16984
  "input",
16505
16985
  {
16506
16986
  id: boxId,
@@ -16513,9 +16993,9 @@ function CheckoutTermsAcceptance({
16513
16993
  className: "mt-0.5 size-5 shrink-0 cursor-pointer accent-primary"
16514
16994
  }
16515
16995
  ),
16516
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("label", { htmlFor: boxId, className: "text-sm leading-relaxed", children: [
16996
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("label", { htmlFor: boxId, className: "text-sm leading-relaxed", children: [
16517
16997
  before,
16518
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
16998
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
16519
16999
  "a",
16520
17000
  {
16521
17001
  href: copy.termsLinkUrl ?? termsHref,
@@ -16523,9 +17003,9 @@ function CheckoutTermsAcceptance({
16523
17003
  className: "font-medium underline underline-offset-2 hover:text-primary",
16524
17004
  children: [
16525
17005
  copy.termsLinkText,
16526
- newTab ? /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_jsx_runtime32.Fragment, { children: [
17006
+ newTab ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
16527
17007
  " ",
16528
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "sr-only", children: newTabHint })
17008
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "sr-only", children: newTabHint })
16529
17009
  ] }) : null
16530
17010
  ]
16531
17011
  }
@@ -16533,7 +17013,7 @@ function CheckoutTermsAcceptance({
16533
17013
  after
16534
17014
  ] })
16535
17015
  ] }),
16536
- error ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("p", { id: errorId, className: "pl-8 text-sm text-destructive", children: error }) : null
17016
+ error ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("p", { id: errorId, className: "pl-8 text-sm text-destructive", children: error }) : null
16537
17017
  ] });
16538
17018
  }
16539
17019
  function toCheckoutTermsFields(copy, accepted) {
@@ -16542,8 +17022,8 @@ function toCheckoutTermsFields(copy, accepted) {
16542
17022
  }
16543
17023
 
16544
17024
  // src/components/checkout-pay-action.tsx
16545
- var import_utils29 = require("@reblu/site-ui/utils");
16546
- var import_jsx_runtime33 = require("react/jsx-runtime");
17025
+ var import_utils30 = require("@reblu/site-ui/utils");
17026
+ var import_jsx_runtime34 = require("react/jsx-runtime");
16547
17027
  function CheckoutPayAction({
16548
17028
  label,
16549
17029
  notice,
@@ -16557,28 +17037,50 @@ function CheckoutPayAction({
16557
17037
  }) {
16558
17038
  const noticeId = `${id}-notice`;
16559
17039
  const isDisabled = submitting || disabled;
16560
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { "data-slot": "checkout-pay-action", className: (0, import_utils29.cn)("space-y-3", className), children: [
16561
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
17040
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { "data-slot": "checkout-pay-action", className: (0, import_utils30.cn)("space-y-3", className), children: [
17041
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
16562
17042
  "button",
16563
17043
  {
16564
17044
  type: "submit",
16565
17045
  disabled: isDisabled,
16566
17046
  "aria-busy": submitting || void 0,
16567
17047
  "aria-describedby": notice ? noticeId : void 0,
16568
- className: buttonClassName ?? (0, import_utils29.cn)(
17048
+ className: buttonClassName ?? (0, import_utils30.cn)(
16569
17049
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 text-base font-semibold transition-all",
16570
17050
  isDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "cursor-pointer bg-primary text-primary-foreground hover:bg-primary/90"
16571
17051
  ),
16572
17052
  children: submitting ? submittingLabel : label
16573
17053
  }
16574
17054
  ),
16575
- notice ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("p", { id: noticeId, "data-slot": "checkout-pay-notice", className: noticeClassName ?? "text-sm text-muted-foreground", children: notice }) : null
17055
+ notice ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("p", { id: noticeId, "data-slot": "checkout-pay-notice", className: noticeClassName ?? "text-sm text-muted-foreground", children: notice }) : null
16576
17056
  ] });
16577
17057
  }
16578
17058
 
17059
+ // src/lib/course-guest-checkout.ts
17060
+ function courseSellsAsGuest(course) {
17061
+ return course.salesEnabled && !course.requiresValidation && course.priceCents > 0;
17062
+ }
17063
+ function toAcademyCheckoutInvoiceFields(value, overCap, issuesInvoices = true) {
17064
+ if (!issuesInvoices) return {};
17065
+ if (!value.wantsFullInvoice && !overCap) return {};
17066
+ const billing = {
17067
+ billingName: value.billingName.trim(),
17068
+ billingNif: value.billingNif.trim(),
17069
+ billingIdType: value.billingIdType,
17070
+ ...value.billingIdType === "NIF" ? {} : { billingIdCountry: value.billingIdCountry },
17071
+ billingAddress: {
17072
+ street: value.street.trim(),
17073
+ postalCode: value.postalCode.trim(),
17074
+ city: value.city.trim(),
17075
+ country: value.country
17076
+ }
17077
+ };
17078
+ return { ...value.wantsFullInvoice ? { wantsFullInvoice: true } : {}, billing };
17079
+ }
17080
+
16579
17081
  // src/components/contact-interest-field.tsx
16580
- var import_utils30 = require("@reblu/site-ui/utils");
16581
- var import_jsx_runtime34 = require("react/jsx-runtime");
17082
+ var import_utils31 = require("@reblu/site-ui/utils");
17083
+ var import_jsx_runtime35 = require("react/jsx-runtime");
16582
17084
  function ContactInterestField({
16583
17085
  interest,
16584
17086
  value,
@@ -16595,18 +17097,18 @@ function ContactInterestField({
16595
17097
  else next2.delete(option2);
16596
17098
  onChange(interest.options.filter((candidate) => next2.has(candidate)));
16597
17099
  };
16598
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("fieldset", { "data-slot": "contact-interest", className: (0, import_utils30.cn)("space-y-2", className), children: [
16599
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("legend", { className: "text-sm font-medium", children: interest.label }),
16600
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: "flex flex-col gap-2", children: interest.options.map((option2, index) => {
17100
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("fieldset", { "data-slot": "contact-interest", className: (0, import_utils31.cn)("space-y-2", className), children: [
17101
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("legend", { className: "text-sm font-medium", children: interest.label }),
17102
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "flex flex-col gap-2", children: interest.options.map((option2, index) => {
16601
17103
  const id = `${idPrefix}-${index}`;
16602
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
17104
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
16603
17105
  "label",
16604
17106
  {
16605
17107
  htmlFor: id,
16606
17108
  "data-slot": "contact-interest-option",
16607
17109
  className: "flex items-center gap-2 text-sm",
16608
17110
  children: [
16609
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
17111
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
16610
17112
  "input",
16611
17113
  {
16612
17114
  id,
@@ -16632,21 +17134,29 @@ var import_site_contracts = require("@reblu/site-contracts");
16632
17134
  ALLOWED_YOUTUBE_HOSTS,
16633
17135
  AddedToCartToast,
16634
17136
  ArbitrationBadge,
17137
+ BeforeAfterPairs,
17138
+ CARD_ICON_NAMES,
17139
+ CardIconSvg,
16635
17140
  CartAdjustmentsNotice,
17141
+ CartLineIncludes,
16636
17142
  CartLineList,
16637
17143
  CartSummary,
16638
17144
  CheckoutDeliveryChoice,
16639
17145
  CheckoutForm,
16640
17146
  CheckoutLoginPrompt,
16641
17147
  CheckoutPayAction,
17148
+ CheckoutQuoteNotice,
16642
17149
  CheckoutQuoteSummary,
16643
17150
  CheckoutTermsAcceptance,
17151
+ ChipList,
16644
17152
  ContactInterestField,
16645
17153
  CourseCatalogFilters,
16646
17154
  CourseDescription,
16647
17155
  CoursePurchaseTerms,
16648
17156
  DATA_REQUEST_TYPES,
17157
+ DEFAULT_BEFORE_AFTER_LABELS,
16649
17158
  DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS,
17159
+ DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS,
16650
17160
  DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS,
16651
17161
  DEFAULT_COURSE_CATALOG_FILTERS_LABELS,
16652
17162
  DEFAULT_COURSE_PRICE_BANDS,
@@ -16663,6 +17173,8 @@ var import_site_contracts = require("@reblu/site-contracts");
16663
17173
  EMPTY_FULL_INVOICE_VALUE,
16664
17174
  FaqAccordion,
16665
17175
  FullInvoiceFields,
17176
+ IconCardGrid,
17177
+ ImageTextSplit,
16666
17178
  LegalDocument,
16667
17179
  LessonPreview,
16668
17180
  MarkdownRenderer,
@@ -16682,11 +17194,15 @@ var import_site_contracts = require("@reblu/site-contracts");
16682
17194
  TrustBadges,
16683
17195
  buildFaqPageJsonLd,
16684
17196
  buildShareUrls,
17197
+ bundleComponentsToIncludes,
17198
+ checkoutQuoteNotice,
16685
17199
  collectFaqItems,
17200
+ courseSellsAsGuest,
16686
17201
  defaultCheckoutFulfillment,
16687
17202
  formatPrice,
16688
17203
  getShopErrorMessage,
16689
17204
  isAllowedYouTubeHost,
17205
+ isCheckoutDeliveryComplete,
16690
17206
  isOverSimplifiedInvoiceCap,
16691
17207
  markdownToPlainText,
16692
17208
  markdownToSafeHtml,
@@ -16695,6 +17211,7 @@ var import_site_contracts = require("@reblu/site-contracts");
16695
17211
  sanitizeHtml,
16696
17212
  shopIssuesInvoices,
16697
17213
  shouldRenderShopFilters,
17214
+ toAcademyCheckoutInvoiceFields,
16698
17215
  toCheckoutFulfillmentFields,
16699
17216
  toCheckoutInvoiceFields,
16700
17217
  toCheckoutTermsFields