@reblu/site-blocks 0.30.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,6 +23,9 @@ __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,
27
30
  CartLineIncludes: () => CartLineIncludes,
28
31
  CartLineList: () => CartLineList,
@@ -31,14 +34,18 @@ __export(src_exports, {
31
34
  CheckoutForm: () => CheckoutForm,
32
35
  CheckoutLoginPrompt: () => CheckoutLoginPrompt,
33
36
  CheckoutPayAction: () => CheckoutPayAction,
37
+ CheckoutQuoteNotice: () => CheckoutQuoteNotice,
34
38
  CheckoutQuoteSummary: () => CheckoutQuoteSummary,
35
39
  CheckoutTermsAcceptance: () => CheckoutTermsAcceptance,
40
+ ChipList: () => ChipList,
36
41
  ContactInterestField: () => ContactInterestField,
37
42
  CourseCatalogFilters: () => CourseCatalogFilters,
38
43
  CourseDescription: () => CourseDescription,
39
44
  CoursePurchaseTerms: () => CoursePurchaseTerms,
40
45
  DATA_REQUEST_TYPES: () => import_site_contracts.DATA_REQUEST_TYPES,
46
+ DEFAULT_BEFORE_AFTER_LABELS: () => DEFAULT_BEFORE_AFTER_LABELS,
41
47
  DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS: () => DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS,
48
+ DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS: () => DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS,
42
49
  DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS: () => DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS,
43
50
  DEFAULT_COURSE_CATALOG_FILTERS_LABELS: () => DEFAULT_COURSE_CATALOG_FILTERS_LABELS,
44
51
  DEFAULT_COURSE_PRICE_BANDS: () => DEFAULT_COURSE_PRICE_BANDS,
@@ -55,6 +62,8 @@ __export(src_exports, {
55
62
  EMPTY_FULL_INVOICE_VALUE: () => EMPTY_FULL_INVOICE_VALUE,
56
63
  FaqAccordion: () => FaqAccordion,
57
64
  FullInvoiceFields: () => FullInvoiceFields,
65
+ IconCardGrid: () => IconCardGrid,
66
+ ImageTextSplit: () => ImageTextSplit,
58
67
  LegalDocument: () => LegalDocument,
59
68
  LessonPreview: () => LessonPreview,
60
69
  MarkdownRenderer: () => MarkdownRenderer,
@@ -75,11 +84,14 @@ __export(src_exports, {
75
84
  buildFaqPageJsonLd: () => buildFaqPageJsonLd,
76
85
  buildShareUrls: () => buildShareUrls,
77
86
  bundleComponentsToIncludes: () => bundleComponentsToIncludes,
87
+ checkoutQuoteNotice: () => checkoutQuoteNotice,
78
88
  collectFaqItems: () => collectFaqItems,
89
+ courseSellsAsGuest: () => courseSellsAsGuest,
79
90
  defaultCheckoutFulfillment: () => defaultCheckoutFulfillment,
80
91
  formatPrice: () => formatPrice,
81
92
  getShopErrorMessage: () => getShopErrorMessage,
82
93
  isAllowedYouTubeHost: () => isAllowedYouTubeHost,
94
+ isCheckoutDeliveryComplete: () => isCheckoutDeliveryComplete,
83
95
  isOverSimplifiedInvoiceCap: () => isOverSimplifiedInvoiceCap,
84
96
  markdownToPlainText: () => markdownToPlainText,
85
97
  markdownToSafeHtml: () => markdownToSafeHtml,
@@ -88,6 +100,7 @@ __export(src_exports, {
88
100
  sanitizeHtml: () => sanitizeHtml,
89
101
  shopIssuesInvoices: () => shopIssuesInvoices,
90
102
  shouldRenderShopFilters: () => shouldRenderShopFilters,
103
+ toAcademyCheckoutInvoiceFields: () => toAcademyCheckoutInvoiceFields,
91
104
  toCheckoutFulfillmentFields: () => toCheckoutFulfillmentFields,
92
105
  toCheckoutInvoiceFields: () => toCheckoutInvoiceFields,
93
106
  toCheckoutTermsFields: () => toCheckoutTermsFields
@@ -14590,40 +14603,376 @@ function ArbitrationBadge({
14590
14603
  }
14591
14604
 
14592
14605
  // src/components/page-blocks.tsx
14593
- var import_utils14 = require("@reblu/site-ui/utils");
14606
+ var import_utils15 = require("@reblu/site-ui/utils");
14594
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
14595
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");
14596
14945
  var ALIASES = {
14597
14946
  doctor_embed: "profile_embed",
14598
14947
  specialty_embed: "page_embed"
14599
14948
  };
14600
14949
  function HeroBlock({ block, headingLevel }) {
14601
14950
  const { title, subtitle, imageUrl } = block.data;
14602
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "space-y-4", children: [
14603
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
14604
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
14605
- 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" }) })
14606
14955
  ] });
14607
14956
  }
14608
14957
  function RichtextBlock({ block, headingLevel }) {
14609
- 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 });
14610
14959
  }
14611
14960
  function FaqBlock({ block }) {
14612
- 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 });
14613
14962
  }
14614
14963
  function StatsBlock({ block }) {
14615
- 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: [
14616
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
14617
- /* @__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 })
14618
14967
  ] }, i)) });
14619
14968
  }
14620
14969
  function TestimonialBlock({ block }) {
14621
14970
  const { quote, author, role, avatarUrl } = block.data;
14622
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("figure", { className: "space-y-4", children: [
14623
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { children: quote }) }),
14624
- /* @__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: [
14625
14974
  avatarUrl && // eslint-disable-next-line @next/next/no-img-element
14626
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14975
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14627
14976
  "img",
14628
14977
  {
14629
14978
  src: avatarUrl,
@@ -14632,9 +14981,9 @@ function TestimonialBlock({ block }) {
14632
14981
  className: "h-10 w-10 rounded-full object-cover"
14633
14982
  }
14634
14983
  ),
14635
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { children: [
14636
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "font-semibold", children: author }),
14637
- 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 })
14638
14987
  ] })
14639
14988
  ] })
14640
14989
  ] });
@@ -14643,19 +14992,19 @@ function CtaSlotBlock(_props) {
14643
14992
  return null;
14644
14993
  }
14645
14994
  function FeatureListBlock({ block }) {
14646
- 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)) });
14647
14996
  }
14648
14997
  function GalleryBlock({ block }) {
14649
14998
  const { images } = block.data;
14650
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14999
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14651
15000
  "div",
14652
15001
  {
14653
- className: (0, import_utils14.cn)(
15002
+ className: (0, import_utils15.cn)(
14654
15003
  "grid gap-4",
14655
15004
  images.length > 1 ? "sm:grid-cols-2 lg:grid-cols-3" : "grid-cols-1"
14656
15005
  ),
14657
- children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("figure", { className: "space-y-1", children: [
14658
- /* @__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)(
14659
15008
  "img",
14660
15009
  {
14661
15010
  src: img.url,
@@ -14664,7 +15013,7 @@ function GalleryBlock({ block }) {
14664
15013
  className: "h-full w-full object-cover"
14665
15014
  }
14666
15015
  ) }),
14667
- 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 })
14668
15017
  ] }, `${img.url}-${i}`))
14669
15018
  }
14670
15019
  );
@@ -14674,13 +15023,13 @@ function EmbedCard({
14674
15023
  headingLevel,
14675
15024
  embedHref
14676
15025
  }) {
14677
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
15026
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
14678
15027
  "a",
14679
15028
  {
14680
15029
  href: embedHref(resolved),
14681
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",
14682
15031
  children: [
14683
- 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)(
14684
15033
  "img",
14685
15034
  {
14686
15035
  src: resolved.coverImageUrl,
@@ -14689,24 +15038,51 @@ function EmbedCard({
14689
15038
  className: "h-full w-full object-cover"
14690
15039
  }
14691
15040
  ) }),
14692
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "space-y-1 p-4", children: [
14693
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
14694
- resolved.role && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
14695
- 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 })
14696
15045
  ] })
14697
15046
  ]
14698
15047
  }
14699
15048
  );
14700
15049
  }
14701
15050
  function PageEmbedBlock({ block, headingLevel, embedHref }) {
14702
- 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 });
14703
15052
  }
14704
15053
  function ProfileEmbedBlock({
14705
15054
  block,
14706
15055
  headingLevel,
14707
15056
  embedHref
14708
15057
  }) {
14709
- 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 });
14710
15086
  }
14711
15087
  var DEFAULT_RENDERERS = {
14712
15088
  hero: HeroBlock,
@@ -14718,8 +15094,25 @@ var DEFAULT_RENDERERS = {
14718
15094
  feature_list: FeatureListBlock,
14719
15095
  gallery: GalleryBlock,
14720
15096
  page_embed: PageEmbedBlock,
14721
- profile_embed: ProfileEmbedBlock
15097
+ profile_embed: ProfileEmbedBlock,
15098
+ before_after: BeforeAfterBlock,
15099
+ chips: ChipsBlock,
15100
+ icon_cards: IconCardsBlock,
15101
+ image_text: ImageTextBlock
14722
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
+ }
14723
15116
  var EMBED_TYPES = /* @__PURE__ */ new Set([
14724
15117
  "page_embed",
14725
15118
  "profile_embed"
@@ -14763,14 +15156,14 @@ function toIdFragment(value) {
14763
15156
  function SectionCta2({ cta }) {
14764
15157
  if (!hasUsableCta(cta)) return null;
14765
15158
  const variant = toButtonVariant(cta.variant);
14766
- 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)(
14767
15160
  "a",
14768
15161
  {
14769
15162
  href: cta.url,
14770
15163
  "data-slot": "button",
14771
15164
  "data-variant": variant,
14772
15165
  "data-size": "default",
14773
- 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" })),
14774
15167
  ...cta.isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {},
14775
15168
  children: cta.label
14776
15169
  }
@@ -14795,18 +15188,29 @@ function PageBlocks({
14795
15188
  const Renderer = components?.[type] ?? DEFAULT_RENDERERS[type];
14796
15189
  const headingId = block.heading ? `${safePrefix}-${toIdFragment(block.id)}-heading` : void 0;
14797
15190
  const background = block.backgroundColor;
15191
+ const kicker = kickerOf(type, block);
15192
+ const ownsHeading = OWN_HEADING_TYPES.has(type);
14798
15193
  return [
14799
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
15194
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
14800
15195
  "section",
14801
15196
  {
14802
15197
  "data-slot": "page-block",
14803
15198
  "data-block-type": type,
14804
15199
  "aria-labelledby": headingId,
14805
15200
  style: surfaceStyle(background),
14806
- 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),
14807
15202
  children: [
14808
- 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 }) }),
14809
- /* @__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)(
14810
15214
  Renderer,
14811
15215
  {
14812
15216
  block,
@@ -14814,7 +15218,7 @@ function PageBlocks({
14814
15218
  embedHref
14815
15219
  }
14816
15220
  ),
14817
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(SectionCta2, { cta: block.cta })
15221
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(SectionCta2, { cta: block.cta })
14818
15222
  ]
14819
15223
  },
14820
15224
  block.id
@@ -14822,12 +15226,12 @@ function PageBlocks({
14822
15226
  ];
14823
15227
  });
14824
15228
  if (sections.length === 0) return null;
14825
- 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 });
14826
15230
  }
14827
15231
 
14828
15232
  // src/components/shop-filters.tsx
14829
- var import_utils15 = require("@reblu/site-ui/utils");
14830
- 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");
14831
15235
  var DEFAULT_SHOP_PRICE_BANDS = [
14832
15236
  { max: 2500 },
14833
15237
  { min: 2500, max: 5e3 },
@@ -14871,7 +15275,7 @@ function priceBandLabel(band, t, currencyCode, locale) {
14871
15275
  return "";
14872
15276
  }
14873
15277
  function OptionLink({ href, active, label, onActivate }) {
14874
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15278
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14875
15279
  "a",
14876
15280
  {
14877
15281
  href,
@@ -14880,7 +15284,7 @@ function OptionLink({ href, active, label, onActivate }) {
14880
15284
  event.preventDefault();
14881
15285
  onActivate();
14882
15286
  } : void 0,
14883
- className: (0, import_utils15.cn)(
15287
+ className: (0, import_utils16.cn)(
14884
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",
14885
15289
  active ? "border-transparent bg-primary text-primary-foreground" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"
14886
15290
  ),
@@ -14889,9 +15293,9 @@ function OptionLink({ href, active, label, onActivate }) {
14889
15293
  );
14890
15294
  }
14891
15295
  function FilterFieldset({ legend, children: children2 }) {
14892
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("fieldset", { className: "space-y-2", children: [
14893
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
14894
- /* @__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 })
14895
15299
  ] });
14896
15300
  }
14897
15301
  function ShopFilters({
@@ -14914,11 +15318,11 @@ function ShopFilters({
14914
15318
  if (!shouldRenderShopFilters(facets, active)) {
14915
15319
  return null;
14916
15320
  }
14917
- 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: [
14918
15322
  visibleTaxonomies.map((axis) => {
14919
15323
  const activeSlug = active.taxonomy?.[axis.key];
14920
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(FilterFieldset, { legend: axis.label, children: [
14921
- /* @__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)(
14922
15326
  OptionLink,
14923
15327
  {
14924
15328
  href: hrefs.taxonomy(axis.key, void 0),
@@ -14933,7 +15337,7 @@ function ShopFilters({
14933
15337
  ),
14934
15338
  axis.terms.map((term) => {
14935
15339
  const isActive = activeSlug === term.slug;
14936
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15340
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14937
15341
  OptionLink,
14938
15342
  {
14939
15343
  href: hrefs.taxonomy(axis.key, isActive ? void 0 : term.slug),
@@ -14953,9 +15357,9 @@ function ShopFilters({
14953
15357
  }),
14954
15358
  visibleAttributes.map((attr) => {
14955
15359
  const activeValues = toValueArray(active.attr?.[attr.key]);
14956
- 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) => {
14957
15361
  const isActive = activeValues.includes(opt.value);
14958
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15362
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14959
15363
  OptionLink,
14960
15364
  {
14961
15365
  href: hrefs.attr(attr.key, opt.value),
@@ -14973,11 +15377,11 @@ function ShopFilters({
14973
15377
  );
14974
15378
  }) }, attr.key);
14975
15379
  }),
14976
- 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) => {
14977
15381
  const isActive = active.priceMin === band.min && active.priceMax === band.max;
14978
15382
  const nextMin = isActive ? void 0 : band.min;
14979
15383
  const nextMax = isActive ? void 0 : band.max;
14980
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15384
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14981
15385
  OptionLink,
14982
15386
  {
14983
15387
  href: hrefs.price(nextMin, nextMax),
@@ -14988,7 +15392,7 @@ function ShopFilters({
14988
15392
  i
14989
15393
  );
14990
15394
  }) }),
14991
- hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15395
+ hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14992
15396
  OptionLink,
14993
15397
  {
14994
15398
  href: hrefs.onSale(!active.onSale),
@@ -14997,7 +15401,7 @@ function ShopFilters({
14997
15401
  onActivate: onChange ? () => onChange({ onSale: !active.onSale }) : void 0
14998
15402
  }
14999
15403
  ),
15000
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15404
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15001
15405
  "a",
15002
15406
  {
15003
15407
  href: hrefs.clearAll(),
@@ -15013,8 +15417,8 @@ function ShopFilters({
15013
15417
  }
15014
15418
 
15015
15419
  // src/components/course-catalog-filters.tsx
15016
- var import_utils16 = require("@reblu/site-ui/utils");
15017
- 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");
15018
15422
  var DEFAULT_COURSE_PRICE_BANDS = [
15019
15423
  { max: 5e3 },
15020
15424
  { min: 5e3, max: 15e3 },
@@ -15067,9 +15471,9 @@ function CourseCatalogFilters({
15067
15471
  const showPrice = enabled.price !== false;
15068
15472
  const isFree = Boolean(active.free);
15069
15473
  if (!showCategories && !showInstructors && !showPrice) return null;
15070
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: (0, import_utils16.cn)("space-y-6", className), "data-slot": "course-catalog-filters", children: [
15071
- showCategories && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(FilterFieldset, { legend: t.category, children: [
15072
- /* @__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)(
15073
15477
  OptionLink,
15074
15478
  {
15075
15479
  href: categoryHref(void 0),
@@ -15081,7 +15485,7 @@ function CourseCatalogFilters({
15081
15485
  sortedCategories.map((category) => {
15082
15486
  const isActive = active.category === category.slug;
15083
15487
  const next2 = isActive ? void 0 : category.slug;
15084
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15488
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15085
15489
  OptionLink,
15086
15490
  {
15087
15491
  href: categoryHref(next2),
@@ -15093,8 +15497,8 @@ function CourseCatalogFilters({
15093
15497
  );
15094
15498
  })
15095
15499
  ] }),
15096
- showInstructors && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(FilterFieldset, { legend: t.instructor, children: [
15097
- /* @__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)(
15098
15502
  OptionLink,
15099
15503
  {
15100
15504
  href: hrefs.instructor(void 0),
@@ -15106,7 +15510,7 @@ function CourseCatalogFilters({
15106
15510
  named.map((instructor) => {
15107
15511
  const isActive = active.instructor === instructor.id;
15108
15512
  const next2 = isActive ? void 0 : instructor.id;
15109
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15513
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15110
15514
  OptionLink,
15111
15515
  {
15112
15516
  href: hrefs.instructor(next2),
@@ -15118,8 +15522,8 @@ function CourseCatalogFilters({
15118
15522
  );
15119
15523
  })
15120
15524
  ] }),
15121
- showPrice && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(FilterFieldset, { legend: t.price, children: [
15122
- /* @__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)(
15123
15527
  OptionLink,
15124
15528
  {
15125
15529
  href: hrefs.free(!isFree),
@@ -15134,7 +15538,7 @@ function CourseCatalogFilters({
15134
15538
  const isActive = !isFree && active.priceMin === band.min && active.priceMax === band.max;
15135
15539
  const nextMin = isActive ? void 0 : band.min;
15136
15540
  const nextMax = isActive ? void 0 : band.max;
15137
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15541
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15138
15542
  OptionLink,
15139
15543
  {
15140
15544
  href: hrefs.price(nextMin, nextMax),
@@ -15146,7 +15550,7 @@ function CourseCatalogFilters({
15146
15550
  );
15147
15551
  })
15148
15552
  ] }),
15149
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15553
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15150
15554
  "a",
15151
15555
  {
15152
15556
  href: hrefs.clearAll(),
@@ -15168,8 +15572,8 @@ function CourseCatalogFilters({
15168
15572
  }
15169
15573
 
15170
15574
  // src/components/cart-line-list.tsx
15171
- var import_utils17 = require("@reblu/site-ui/utils");
15172
- var import_jsx_runtime21 = (
15575
+ var import_utils18 = require("@reblu/site-ui/utils");
15576
+ var import_jsx_runtime22 = (
15173
15577
  // eslint-disable-next-line react/no-array-index-key -- entries are positional, SITE-built rows
15174
15578
  require("react/jsx-runtime")
15175
15579
  );
@@ -15185,17 +15589,17 @@ var DEFAULT_LABELS2 = {
15185
15589
  function CartLineIncludes({ entries, note, className }) {
15186
15590
  const hasNote = note != null && note !== false && note !== "";
15187
15591
  if (entries.length === 0 && !hasNote) return null;
15188
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15592
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15189
15593
  "div",
15190
15594
  {
15191
- className: (0, import_utils17.cn)("mt-2 space-y-2 rounded-lg bg-muted px-4 py-3 text-sm", className),
15595
+ className: (0, import_utils18.cn)("mt-2 space-y-2 rounded-lg bg-muted px-4 py-3 text-sm", className),
15192
15596
  "data-slot": "cart-line-includes",
15193
15597
  children: [
15194
- entries.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime21.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_runtime21.jsxs)("div", { className: "contents", children: [
15195
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("dt", { className: "font-semibold text-muted-foreground", children: entry.label }),
15196
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("dd", { className: "m-0", children: entry.value })
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 })
15197
15601
  ] }, idx)) }),
15198
- hasNote && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-muted-foreground", children: note })
15602
+ hasNote && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-muted-foreground", children: note })
15199
15603
  ]
15200
15604
  }
15201
15605
  );
@@ -15224,9 +15628,9 @@ function CartLineList({
15224
15628
  }) {
15225
15629
  const t = { ...DEFAULT_LABELS2, ...labels };
15226
15630
  const noticeContent = notice === true ? t.cancelledNotice : notice;
15227
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: (0, import_utils17.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
15228
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
15229
- 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)(
15230
15634
  "div",
15231
15635
  {
15232
15636
  role: "status",
@@ -15235,34 +15639,34 @@ function CartLineList({
15235
15639
  children: noticeContent
15236
15640
  }
15237
15641
  ),
15238
- /* @__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) => {
15239
15643
  const maxQty = item.maxStock ?? Infinity;
15240
15644
  const atMax = item.quantity >= maxQty;
15241
15645
  const atMin = item.quantity <= 1;
15242
15646
  const message = lineMessage?.(item);
15243
15647
  const includes = lineIncludes?.(item);
15244
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15648
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15245
15649
  "li",
15246
15650
  {
15247
15651
  className: "flex gap-4 rounded-xl border border-border bg-card p-4",
15248
15652
  children: [
15249
- /* @__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 }),
15250
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "min-w-0 flex-1", children: [
15251
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
15252
- item.variantName && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
15253
- /* @__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: [
15254
15658
  formatPrice(item.unitPrice, currencyCode, locale),
15255
15659
  " ",
15256
15660
  t.unitPriceSuffix
15257
15661
  ] }),
15258
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15662
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15259
15663
  "div",
15260
15664
  {
15261
15665
  role: "group",
15262
15666
  "aria-label": t.quantityLabel,
15263
15667
  className: "mt-3 flex items-center gap-3",
15264
15668
  children: [
15265
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15669
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15266
15670
  "button",
15267
15671
  {
15268
15672
  type: "button",
@@ -15273,8 +15677,8 @@ function CartLineList({
15273
15677
  children: "\u2212"
15274
15678
  }
15275
15679
  ),
15276
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
15277
- /* @__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)(
15278
15682
  "button",
15279
15683
  {
15280
15684
  type: "button",
@@ -15285,7 +15689,7 @@ function CartLineList({
15285
15689
  children: "+"
15286
15690
  }
15287
15691
  ),
15288
- onRemove && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15692
+ onRemove && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15289
15693
  "button",
15290
15694
  {
15291
15695
  type: "button",
@@ -15298,7 +15702,7 @@ function CartLineList({
15298
15702
  ]
15299
15703
  }
15300
15704
  ),
15301
- message != null && message !== false && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15705
+ message != null && message !== false && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15302
15706
  "p",
15303
15707
  {
15304
15708
  className: "mt-2 text-sm text-destructive",
@@ -15306,12 +15710,12 @@ function CartLineList({
15306
15710
  children: message
15307
15711
  }
15308
15712
  ),
15309
- includes != null && includes !== false && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("details", { className: "mt-2", "data-slot": "cart-line-list-includes", children: [
15310
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("summary", { className: "cursor-pointer text-sm font-semibold text-primary", children: t.includesSummary }),
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 }),
15311
15715
  includes
15312
15716
  ] })
15313
15717
  ] }),
15314
- /* @__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) }) })
15315
15719
  ]
15316
15720
  },
15317
15721
  lineKey(item.productId, item.variantId)
@@ -15321,8 +15725,8 @@ function CartLineList({
15321
15725
  }
15322
15726
 
15323
15727
  // src/components/cart-summary.tsx
15324
- var import_utils18 = require("@reblu/site-ui/utils");
15325
- 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");
15326
15730
  var DEFAULT_LABELS3 = {
15327
15731
  subtotal: "Subtotal",
15328
15732
  discountPrefix: "Descuento",
@@ -15352,37 +15756,37 @@ function CartSummary({
15352
15756
  const hasDiscount = Boolean(discountAmount && discountAmount > 0);
15353
15757
  const noticeContent = notice === true ? t.cancelledNotice : notice;
15354
15758
  const hasNotice = noticeContent != null && noticeContent !== false;
15355
- const breakdown = /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15759
+ const breakdown = /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
15356
15760
  "dl",
15357
15761
  {
15358
- 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),
15359
15763
  "data-slot": "cart-summary",
15360
15764
  children: [
15361
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
15362
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: t.subtotal }),
15363
- /* @__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) })
15364
15768
  ] }),
15365
- hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
15366
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: autoDiscount ? t.staffDiscountApplied : `${t.discountPrefix}${discountCode ? ` (${discountCode})` : ""}` }),
15367
- /* @__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: [
15368
15772
  "-",
15369
15773
  formatPrice(discountAmount, currencyCode, locale)
15370
15774
  ] })
15371
15775
  ] }),
15372
- shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
15373
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: t.shipping }),
15374
- /* @__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) })
15375
15779
  ] }),
15376
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
15377
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("dt", { children: t.total }),
15378
- /* @__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) })
15379
15783
  ] })
15380
15784
  ]
15381
15785
  }
15382
15786
  );
15383
15787
  if (!hasNotice) return breakdown;
15384
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: (0, import_utils18.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
15385
- /* @__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)(
15386
15790
  "div",
15387
15791
  {
15388
15792
  role: "status",
@@ -15396,8 +15800,8 @@ function CartSummary({
15396
15800
  }
15397
15801
 
15398
15802
  // src/components/cart-adjustments-notice.tsx
15399
- var import_utils19 = require("@reblu/site-ui/utils");
15400
- 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");
15401
15805
  var DEFAULT_LABELS4 = {
15402
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.`,
15403
15807
  quantityChanged: (name, quantity) => `Hemos ajustado la cantidad de ${name} a ${quantity} por el stock disponible.`,
@@ -15431,20 +15835,20 @@ function CartAdjustmentsNotice({
15431
15835
  );
15432
15836
  }
15433
15837
  if (messages.length === 0) return null;
15434
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15838
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15435
15839
  "div",
15436
15840
  {
15437
15841
  role: "status",
15438
- 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),
15439
15843
  "data-slot": "cart-adjustments-notice",
15440
- 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)) })
15441
15845
  }
15442
15846
  );
15443
15847
  }
15444
15848
 
15445
15849
  // src/components/added-to-cart-toast.tsx
15446
- var import_utils20 = require("@reblu/site-ui/utils");
15447
- var import_jsx_runtime24 = (
15850
+ var import_utils21 = require("@reblu/site-ui/utils");
15851
+ var import_jsx_runtime25 = (
15448
15852
  // eslint-disable-next-line @next/next/no-img-element -- toast content, not a Next <Image> layout context
15449
15853
  require("react/jsx-runtime")
15450
15854
  );
@@ -15467,32 +15871,32 @@ function AddedToCartToast({
15467
15871
  const message = status === "error" ? t.error : status === "outOfStock" ? t.outOfStock : t.success;
15468
15872
  const hasThumbnail = Boolean(imageUrl && imageUrl.trim().length > 0);
15469
15873
  const variant = status === "success" ? "success" : "error";
15470
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
15874
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
15471
15875
  "div",
15472
15876
  {
15473
15877
  "data-slot": "added-to-cart-toast",
15474
15878
  "data-variant": variant,
15475
- className: (0, import_utils20.cn)(
15879
+ className: (0, import_utils21.cn)(
15476
15880
  "flex items-center gap-3 rounded-xl border border-border bg-card p-3 text-sm shadow-lg",
15477
15881
  variant === "success" && "border-green-600/30 dark:border-green-400/30",
15478
15882
  variant === "error" && "border-destructive/30",
15479
15883
  className
15480
15884
  ),
15481
15885
  children: [
15482
- hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
15483
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "min-w-0 flex-1", children: [
15484
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
15485
- /* @__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 })
15486
15890
  ] }),
15487
- /* @__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 }) })
15488
15892
  ]
15489
15893
  }
15490
15894
  );
15491
15895
  }
15492
15896
 
15493
15897
  // src/components/checkout-login-prompt.tsx
15494
- var import_utils21 = require("@reblu/site-ui/utils");
15495
- 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");
15496
15900
  var DEFAULT_LABELS6 = {
15497
15901
  title: "Identificaci\xF3n",
15498
15902
  description: "Introduce tu email para agilizar el proceso o contin\xFAa como invitado.",
@@ -15519,26 +15923,26 @@ function CheckoutLoginPrompt({
15519
15923
  if (!open) return null;
15520
15924
  const t = { ...DEFAULT_LABELS6, ...labels };
15521
15925
  const isValidEmail = EMAIL_PATTERN.test(email.trim());
15522
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
15523
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
15524
- /* @__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)(
15525
15929
  "div",
15526
15930
  {
15527
15931
  role: "dialog",
15528
15932
  "aria-modal": "true",
15529
15933
  "aria-labelledby": "checkout-login-prompt-title",
15530
15934
  "data-slot": "checkout-login-prompt",
15531
- className: (0, import_utils21.cn)(
15935
+ className: (0, import_utils22.cn)(
15532
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",
15533
15937
  className
15534
15938
  ),
15535
15939
  children: [
15536
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
15537
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { children: [
15538
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
15539
- /* @__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 })
15540
15944
  ] }),
15541
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15945
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
15542
15946
  "button",
15543
15947
  {
15544
15948
  type: "button",
@@ -15549,9 +15953,9 @@ function CheckoutLoginPrompt({
15549
15953
  }
15550
15954
  )
15551
15955
  ] }),
15552
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-2", children: [
15553
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
15554
- /* @__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)(
15555
15959
  "input",
15556
15960
  {
15557
15961
  id: "checkout-login-prompt-email",
@@ -15560,29 +15964,29 @@ function CheckoutLoginPrompt({
15560
15964
  value: email,
15561
15965
  onChange: (e) => onEmailChange(e.target.value),
15562
15966
  placeholder: t.emailPlaceholder,
15563
- className: (0, import_utils21.cn)(
15967
+ className: (0, import_utils22.cn)(
15564
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",
15565
15969
  error ? "border-destructive" : "border-border focus:border-primary"
15566
15970
  )
15567
15971
  }
15568
15972
  ),
15569
- 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 })
15570
15974
  ] }),
15571
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-2", children: [
15572
- /* @__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)(
15573
15977
  "button",
15574
15978
  {
15575
15979
  type: "button",
15576
15980
  onClick: onSubmitEmail,
15577
15981
  disabled: checking || !isValidEmail,
15578
- className: (0, import_utils21.cn)(
15982
+ className: (0, import_utils22.cn)(
15579
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",
15580
15984
  checking || !isValidEmail ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
15581
15985
  ),
15582
15986
  children: checking ? t.checking : t.continueWithEmail
15583
15987
  }
15584
15988
  ),
15585
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15989
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
15586
15990
  "button",
15587
15991
  {
15588
15992
  type: "button",
@@ -15599,9 +16003,9 @@ function CheckoutLoginPrompt({
15599
16003
  }
15600
16004
 
15601
16005
  // src/components/checkout-form.tsx
15602
- var import_utils22 = require("@reblu/site-ui/utils");
16006
+ var import_utils23 = require("@reblu/site-ui/utils");
15603
16007
  var import_phone_input = require("@reblu/site-ui/phone-input");
15604
- var import_jsx_runtime26 = require("react/jsx-runtime");
16008
+ var import_jsx_runtime27 = require("react/jsx-runtime");
15605
16009
  var DEFAULT_LABELS7 = {
15606
16010
  contactTitle: "Datos de contacto",
15607
16011
  nameLabel: "Nombre completo",
@@ -15657,22 +16061,22 @@ function CheckoutForm({
15657
16061
  event.preventDefault();
15658
16062
  if (discountCode.trim() && !discountApplying) onApplyDiscount();
15659
16063
  }
15660
- 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: [
15661
16065
  loginPrompt,
15662
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
16066
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
15663
16067
  "form",
15664
16068
  {
15665
16069
  "data-testid": "checkout-form",
15666
16070
  onSubmit,
15667
- className: (0, import_utils22.cn)("space-y-8", className),
16071
+ className: (0, import_utils23.cn)("space-y-8", className),
15668
16072
  "data-slot": "checkout-form",
15669
16073
  children: [
15670
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("section", { className: "space-y-4", children: [
15671
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
15672
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15673
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "space-y-1", children: [
15674
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
15675
- /* @__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)(
15676
16080
  "input",
15677
16081
  {
15678
16082
  id: "checkout-form-name",
@@ -15681,17 +16085,17 @@ function CheckoutForm({
15681
16085
  value: contact.name,
15682
16086
  onChange: (e) => patchContact({ name: e.target.value }),
15683
16087
  placeholder: t.namePlaceholder,
15684
- className: (0, import_utils22.cn)(
16088
+ className: (0, import_utils23.cn)(
15685
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",
15686
16090
  contactErrors?.name ? "border-destructive" : "border-border focus:border-primary"
15687
16091
  )
15688
16092
  }
15689
16093
  ),
15690
- 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 })
15691
16095
  ] }),
15692
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "space-y-1", children: [
15693
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
15694
- /* @__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)(
15695
16099
  "input",
15696
16100
  {
15697
16101
  id: "checkout-form-email",
@@ -15700,15 +16104,15 @@ function CheckoutForm({
15700
16104
  value: contact.email,
15701
16105
  onChange: (e) => patchContact({ email: e.target.value }),
15702
16106
  placeholder: t.emailPlaceholder,
15703
- className: (0, import_utils22.cn)(
16107
+ className: (0, import_utils23.cn)(
15704
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",
15705
16109
  contactErrors?.email ? "border-destructive" : "border-border focus:border-primary"
15706
16110
  )
15707
16111
  }
15708
16112
  ),
15709
- 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 })
15710
16114
  ] }),
15711
- /* @__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)(
15712
16116
  import_phone_input.PhoneInput,
15713
16117
  {
15714
16118
  id: "checkout-form-phone",
@@ -15722,26 +16126,26 @@ function CheckoutForm({
15722
16126
  ] })
15723
16127
  ] }),
15724
16128
  children2,
15725
- generalError ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
15726
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("section", { className: "space-y-3", children: [
15727
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
15728
- 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)(
15729
16133
  "div",
15730
16134
  {
15731
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",
15732
16136
  "data-slot": "checkout-staff-discount",
15733
16137
  children: [
15734
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "font-semibold", children: t.staffDiscountApplied }),
15735
- /* @__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)) })
15736
16140
  ]
15737
16141
  }
15738
16142
  ) : null,
15739
- 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: [
15740
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
15741
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
15742
- /* @__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)) })
15743
16147
  ] }),
15744
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16148
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15745
16149
  "button",
15746
16150
  {
15747
16151
  type: "button",
@@ -15751,9 +16155,9 @@ function CheckoutForm({
15751
16155
  children: t.removeDiscount
15752
16156
  }
15753
16157
  )
15754
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "flex gap-2", children: [
15755
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
15756
- /* @__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)(
15757
16161
  "input",
15758
16162
  {
15759
16163
  id: "checkout-form-discount-code",
@@ -15765,7 +16169,7 @@ function CheckoutForm({
15765
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"
15766
16170
  }
15767
16171
  ),
15768
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16172
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15769
16173
  "button",
15770
16174
  {
15771
16175
  type: "button",
@@ -15776,14 +16180,14 @@ function CheckoutForm({
15776
16180
  }
15777
16181
  )
15778
16182
  ] }),
15779
- 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 })
15780
16184
  ] }),
15781
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
16185
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
15782
16186
  "button",
15783
16187
  {
15784
16188
  type: "submit",
15785
16189
  disabled: submitting || submitDisabled,
15786
- className: (0, import_utils22.cn)(
16190
+ className: (0, import_utils23.cn)(
15787
16191
  "flex w-full cursor-pointer items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold transition-all",
15788
16192
  submitting || submitDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
15789
16193
  ),
@@ -15797,11 +16201,11 @@ function CheckoutForm({
15797
16201
  }
15798
16202
 
15799
16203
  // src/components/order-confirmation.tsx
15800
- var import_utils24 = require("@reblu/site-ui/utils");
16204
+ var import_utils25 = require("@reblu/site-ui/utils");
15801
16205
 
15802
16206
  // src/components/order-invoice-link.tsx
15803
- var import_utils23 = require("@reblu/site-ui/utils");
15804
- 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");
15805
16209
  var DEFAULT_LABELS8 = {
15806
16210
  linkLabel: "Descargar la factura {number}",
15807
16211
  signInHint: "Te pediremos que inicies sesi\xF3n para abrirla."
@@ -15809,8 +16213,8 @@ var DEFAULT_LABELS8 = {
15809
16213
  function OrderInvoiceLink({ invoice, labels, className }) {
15810
16214
  if (!invoice) return null;
15811
16215
  const t = { ...DEFAULT_LABELS8, ...labels };
15812
- 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: [
15813
- /* @__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)(
15814
16218
  "a",
15815
16219
  {
15816
16220
  href: invoice.url,
@@ -15818,19 +16222,21 @@ function OrderInvoiceLink({ invoice, labels, className }) {
15818
16222
  children: t.linkLabel.replace("{number}", invoice.number)
15819
16223
  }
15820
16224
  ),
15821
- /* @__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 })
15822
16226
  ] });
15823
16227
  }
15824
16228
 
15825
16229
  // src/components/order-confirmation.tsx
15826
- var import_jsx_runtime28 = require("react/jsx-runtime");
16230
+ var import_jsx_runtime29 = require("react/jsx-runtime");
15827
16231
  var DEFAULT_LABELS9 = {
15828
16232
  pollingTitle: "Confirmando tu pedido\u2026",
15829
16233
  pollingDescription: "Estamos procesando el pago, un momento\u2026",
15830
16234
  foundTitle: "\xA1Pedido confirmado!",
15831
- // REB-1085: every buyer gets a customer account; the order email carries
15832
- // the access link. Files are never served from this page.
15833
- 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.",
15834
16240
  timeoutTitle: "Pago recibido",
15835
16241
  timeoutDescription: "Tu pago se ha procesado. Recibir\xE1s un email de confirmaci\xF3n en breve.",
15836
16242
  orderNumberLabel: "Pedido confirmado",
@@ -15856,6 +16262,12 @@ var DEFAULT_LABELS9 = {
15856
16262
  invoiceLinkLabel: "Descargar la factura {number}",
15857
16263
  invoiceSignInHint: "Te pediremos que inicies sesi\xF3n para abrirla."
15858
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
+ }
15859
16271
  function OrderConfirmation({
15860
16272
  status,
15861
16273
  order,
@@ -15882,50 +16294,50 @@ function OrderConfirmation({
15882
16294
  }
15883
16295
  if (status === "not_found") return { title: t.notFoundTitle, description: t.notFoundDescription };
15884
16296
  if (status === "error") return { title: t.errorTitle, description: t.errorDescription };
15885
- if (isFound || order) return { title: t.foundTitle, description: t.foundDescription };
16297
+ if (isFound || order) return { title: t.foundTitle, description: foundDescription(t, order) };
15886
16298
  return { title: t.timeoutTitle, description: t.timeoutDescription };
15887
16299
  })();
15888
16300
  const showFullOrderSummary = Boolean(order) && (isFound || status === "timeout");
15889
16301
  const showOrderReference = Boolean(order) && !showFullOrderSummary && (status === "refunded" || status === "partially_refunded" || status === "pending_timeout");
15890
16302
  const showSessionReference = !order && sessionId && (status === "timeout" || status === "not_found" || status === "pending_timeout");
15891
16303
  const showRecheck = (status === "pending_timeout" || status === "error") && onRecheck;
15892
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: (0, import_utils24.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
15893
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("h1", { className: "text-3xl font-bold", children: title }),
15894
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
15895
- showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "space-y-6", children: [
15896
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15897
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
15898
- /* @__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 })
15899
16311
  ] }),
15900
- /* @__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: [
15901
- 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)(
15902
16314
  "div",
15903
16315
  {
15904
16316
  className: "flex justify-between gap-4 text-sm",
15905
16317
  children: [
15906
- /* @__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: [
15907
16319
  item.product.name,
15908
16320
  item.variant ? ` (${item.variant.name})` : "",
15909
16321
  " x",
15910
16322
  item.quantity
15911
16323
  ] }),
15912
- /* @__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) })
15913
16325
  ]
15914
16326
  },
15915
16327
  idx
15916
16328
  )),
15917
- /* @__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: [
15918
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { children: t.totalLabel }),
15919
- /* @__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) })
15920
16332
  ] }) })
15921
16333
  ] }),
15922
- /* @__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: [
15923
16335
  t.confirmationEmailPrefix,
15924
16336
  " ",
15925
- /* @__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 }),
15926
16338
  "."
15927
16339
  ] }),
15928
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
16340
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
15929
16341
  OrderInvoiceLink,
15930
16342
  {
15931
16343
  invoice: order.invoice,
@@ -15933,11 +16345,11 @@ function OrderConfirmation({
15933
16345
  }
15934
16346
  )
15935
16347
  ] }),
15936
- showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15937
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
15938
- /* @__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 })
15939
16351
  ] }),
15940
- status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
16352
+ status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
15941
16353
  "a",
15942
16354
  {
15943
16355
  href: cartHref,
@@ -15945,7 +16357,7 @@ function OrderConfirmation({
15945
16357
  children: t.backToCartLabel
15946
16358
  }
15947
16359
  ),
15948
- showRecheck && /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
16360
+ showRecheck && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
15949
16361
  "button",
15950
16362
  {
15951
16363
  type: "button",
@@ -15954,16 +16366,16 @@ function OrderConfirmation({
15954
16366
  children: t.recheckLabel
15955
16367
  }
15956
16368
  ),
15957
- showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15958
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
15959
- /* @__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 })
15960
16372
  ] })
15961
16373
  ] });
15962
16374
  }
15963
16375
 
15964
16376
  // src/components/full-invoice-fields.tsx
15965
- var import_utils25 = require("@reblu/site-ui/utils");
15966
- 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");
15967
16379
  var EMPTY_FULL_INVOICE_VALUE = {
15968
16380
  wantsFullInvoice: false,
15969
16381
  billingIdType: "NIF",
@@ -16080,12 +16492,12 @@ function FullInvoiceFields({
16080
16492
  const showFields = value.wantsFullInvoice || overCap;
16081
16493
  const isSpanishNif = value.billingIdType === "NIF";
16082
16494
  const set = (key2, next2) => onChange({ ...value, [key2]: next2 });
16083
- 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;
16084
16496
  const invalid2 = (key2) => errors[key2] ? { "aria-invalid": true, "aria-describedby": `full-invoice-${key2}-error` } : {};
16085
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("section", { className: (0, import_utils25.cn)("space-y-4", className), "data-slot": "full-invoice-fields", children: [
16086
- 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: [
16087
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
16088
- /* @__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)(
16089
16501
  "input",
16090
16502
  {
16091
16503
  type: "checkbox",
@@ -16095,12 +16507,12 @@ function FullInvoiceFields({
16095
16507
  ),
16096
16508
  t.toggle
16097
16509
  ] }),
16098
- /* @__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 })
16099
16511
  ] }),
16100
- showFields && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
16101
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16102
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-id-type", className: "text-sm font-medium", children: t.idType }),
16103
- /* @__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)(
16104
16516
  "select",
16105
16517
  {
16106
16518
  id: "full-invoice-id-type",
@@ -16109,14 +16521,14 @@ function FullInvoiceFields({
16109
16521
  value: value.billingIdType,
16110
16522
  onChange: (e) => set("billingIdType", e.target.value),
16111
16523
  ...invalid2("billingIdType"),
16112
- 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))
16113
16525
  }
16114
16526
  ),
16115
16527
  error("billingIdType")
16116
16528
  ] }),
16117
- !isSpanishNif && /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16118
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-id-country", className: "text-sm font-medium", children: t.idCountry }),
16119
- /* @__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)(
16120
16532
  "select",
16121
16533
  {
16122
16534
  id: "full-invoice-id-country",
@@ -16126,16 +16538,16 @@ function FullInvoiceFields({
16126
16538
  onChange: (e) => set("billingIdCountry", e.target.value),
16127
16539
  ...invalid2("billingIdCountry"),
16128
16540
  children: [
16129
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("option", { value: "", disabled: true, children: t.chooseCountry }),
16130
- 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))
16131
16543
  ]
16132
16544
  }
16133
16545
  ),
16134
16546
  error("billingIdCountry")
16135
16547
  ] }),
16136
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16137
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-nif", className: "text-sm font-medium", children: isSpanishNif ? t.spanishNif : t.documentNumber }),
16138
- /* @__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)(
16139
16551
  "input",
16140
16552
  {
16141
16553
  id: "full-invoice-nif",
@@ -16148,9 +16560,9 @@ function FullInvoiceFields({
16148
16560
  ),
16149
16561
  error("billingNif")
16150
16562
  ] }),
16151
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16152
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-name", className: "text-sm font-medium", children: t.name }),
16153
- /* @__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)(
16154
16566
  "input",
16155
16567
  {
16156
16568
  id: "full-invoice-name",
@@ -16163,9 +16575,9 @@ function FullInvoiceFields({
16163
16575
  ),
16164
16576
  error("billingName")
16165
16577
  ] }),
16166
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1 sm:col-span-2", children: [
16167
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-street", className: "text-sm font-medium", children: t.street }),
16168
- /* @__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)(
16169
16581
  "input",
16170
16582
  {
16171
16583
  id: "full-invoice-street",
@@ -16177,9 +16589,9 @@ function FullInvoiceFields({
16177
16589
  }
16178
16590
  )
16179
16591
  ] }),
16180
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16181
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-postal-code", className: "text-sm font-medium", children: t.postalCode }),
16182
- /* @__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)(
16183
16595
  "input",
16184
16596
  {
16185
16597
  id: "full-invoice-postal-code",
@@ -16190,9 +16602,9 @@ function FullInvoiceFields({
16190
16602
  }
16191
16603
  )
16192
16604
  ] }),
16193
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16194
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-city", className: "text-sm font-medium", children: t.city }),
16195
- /* @__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)(
16196
16608
  "input",
16197
16609
  {
16198
16610
  id: "full-invoice-city",
@@ -16203,9 +16615,9 @@ function FullInvoiceFields({
16203
16615
  }
16204
16616
  )
16205
16617
  ] }),
16206
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "space-y-1", children: [
16207
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("label", { htmlFor: "full-invoice-country", className: "text-sm font-medium", children: t.country }),
16208
- /* @__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)(
16209
16621
  "select",
16210
16622
  {
16211
16623
  id: "full-invoice-country",
@@ -16213,18 +16625,18 @@ function FullInvoiceFields({
16213
16625
  required: true,
16214
16626
  value: value.country,
16215
16627
  onChange: (e) => set("country", e.target.value),
16216
- 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))
16217
16629
  }
16218
16630
  )
16219
16631
  ] }),
16220
- /* @__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") })
16221
16633
  ] })
16222
16634
  ] });
16223
16635
  }
16224
16636
 
16225
16637
  // src/components/checkout-delivery-choice.tsx
16226
- var import_utils26 = require("@reblu/site-ui/utils");
16227
- 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");
16228
16640
  var EMPTY_CHECKOUT_ADDRESS = {
16229
16641
  firstName: "",
16230
16642
  lastName: "",
@@ -16287,17 +16699,17 @@ function CheckoutDeliveryChoice({
16287
16699
  const isPickup = value?.type === "PICKUP";
16288
16700
  const isShipping = value?.type === "SHIPPING";
16289
16701
  const errorId = `${uid}-delivery-error`;
16290
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
16702
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
16291
16703
  "fieldset",
16292
16704
  {
16293
16705
  "data-slot": "checkout-delivery",
16294
16706
  "aria-describedby": error ? errorId : void 0,
16295
- className: (0, import_utils26.cn)("space-y-4", className),
16707
+ className: (0, import_utils27.cn)("space-y-4", className),
16296
16708
  children: [
16297
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("legend", { className: "mb-2 text-lg font-semibold", children: t.legend }),
16298
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: "grid gap-3 sm:grid-cols-2", children: [
16299
- 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: [
16300
- /* @__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)(
16301
16713
  "input",
16302
16714
  {
16303
16715
  type: "radio",
@@ -16307,42 +16719,42 @@ function CheckoutDeliveryChoice({
16307
16719
  className: "mt-0.5 size-4 accent-primary"
16308
16720
  }
16309
16721
  ),
16310
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "flex-1 space-y-1", children: [
16311
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "flex justify-between gap-2 font-medium", children: [
16312
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: copy.shippingOptionLabel }),
16313
- /* @__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 })
16314
16726
  ] }),
16315
- 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
16316
16728
  ] })
16317
16729
  ] }) : null,
16318
- 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: [
16319
- /* @__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)(
16320
16732
  "input",
16321
16733
  {
16322
16734
  type: "radio",
16323
16735
  name: `${uid}-method`,
16324
16736
  checked: isPickup,
16325
- onChange: () => onChange({ type: "PICKUP" }),
16737
+ onChange: () => onChange(pickupFulfillment(delivery)),
16326
16738
  className: "mt-0.5 size-4 accent-primary"
16327
16739
  }
16328
16740
  ),
16329
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "flex flex-1 justify-between gap-2 font-medium", children: [
16330
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { children: copy.pickupOptionLabel }),
16331
- /* @__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 })
16332
16744
  ] })
16333
16745
  ] }) : null
16334
16746
  ] }),
16335
- error ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("p", { id: errorId, role: "alert", className: "text-sm text-destructive", children: error }) : null,
16336
- isPickup ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { role: "radiogroup", "aria-labelledby": `${uid}-points`, className: "space-y-2", children: [
16337
- /* @__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 }),
16338
16750
  delivery.pickupLocations.map((location2) => {
16339
16751
  const descId = `${uid}-point-${location2.id}`;
16340
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
16752
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
16341
16753
  "label",
16342
16754
  {
16343
16755
  className: "flex cursor-pointer items-start gap-3 rounded-lg border border-border p-3 has-[:checked]:border-primary",
16344
16756
  children: [
16345
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
16757
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16346
16758
  "input",
16347
16759
  {
16348
16760
  type: "radio",
@@ -16353,9 +16765,9 @@ function CheckoutDeliveryChoice({
16353
16765
  className: "mt-0.5 size-4 accent-primary"
16354
16766
  }
16355
16767
  ),
16356
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { className: "space-y-0.5 text-sm", children: [
16357
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "block font-medium", children: location2.name }),
16358
- /* @__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) })
16359
16771
  ] })
16360
16772
  ]
16361
16773
  },
@@ -16363,14 +16775,14 @@ function CheckoutDeliveryChoice({
16363
16775
  );
16364
16776
  })
16365
16777
  ] }) : null,
16366
- isShipping ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("fieldset", { className: "space-y-3", children: [
16367
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("legend", { className: "mb-2 text-sm font-medium", children: t.addressLegend }),
16368
- /* @__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 }) => {
16369
16781
  const fieldId = `${uid}-${key2}`;
16370
16782
  const fieldError = addressErrors?.[key2];
16371
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: (0, import_utils26.cn)("space-y-1", wide && "sm:col-span-2"), children: [
16372
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("label", { htmlFor: fieldId, className: "text-sm font-medium", children: t[key2] }),
16373
- /* @__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)(
16374
16786
  "input",
16375
16787
  {
16376
16788
  id: fieldId,
@@ -16381,13 +16793,13 @@ function CheckoutDeliveryChoice({
16381
16793
  onChange: (e) => onAddressChange({ ...address, [key2]: e.target.value }),
16382
16794
  "aria-invalid": fieldError ? true : void 0,
16383
16795
  "aria-describedby": fieldError ? `${fieldId}-error` : void 0,
16384
- className: (0, import_utils26.cn)(
16796
+ className: (0, import_utils27.cn)(
16385
16797
  INPUT_CLASS,
16386
16798
  fieldError ? "border-destructive" : "border-border focus:border-primary"
16387
16799
  )
16388
16800
  }
16389
16801
  ),
16390
- 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
16391
16803
  ] }, key2);
16392
16804
  }) })
16393
16805
  ] }) : null
@@ -16395,12 +16807,19 @@ function CheckoutDeliveryChoice({
16395
16807
  }
16396
16808
  );
16397
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
+ }
16398
16814
  function defaultCheckoutFulfillment(delivery) {
16399
16815
  if (!delivery) return null;
16400
16816
  if (delivery.methods.homeDelivery) return { type: "SHIPPING" };
16401
16817
  if (!delivery.methods.pickup) return null;
16402
- const [only, ...rest] = delivery.pickupLocations;
16403
- 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);
16404
16823
  }
16405
16824
  function quoteRequiresDelivery(quote) {
16406
16825
  return quote ? quote.lines.some((line) => line.isShippable) : true;
@@ -16422,8 +16841,8 @@ function toCheckoutFulfillmentFields(value, address, requiresDelivery = true) {
16422
16841
  }
16423
16842
 
16424
16843
  // src/components/checkout-quote-summary.tsx
16425
- var import_utils27 = require("@reblu/site-ui/utils");
16426
- 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");
16427
16846
  var DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS = {
16428
16847
  subtotal: "Subtotal",
16429
16848
  discount: (codeOrLabel, isAutomatic) => isAutomatic ? codeOrLabel : `Descuento (${codeOrLabel})`,
@@ -16440,9 +16859,9 @@ function Row({
16440
16859
  value,
16441
16860
  className
16442
16861
  }) {
16443
- 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: [
16444
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("dt", { children: name }),
16445
- /* @__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 })
16446
16865
  ] });
16447
16866
  }
16448
16867
  function CheckoutQuoteSummary({
@@ -16458,22 +16877,22 @@ function CheckoutQuoteSummary({
16458
16877
  const price = (cents) => formatPrice(cents, currencyCode, locale);
16459
16878
  const { fulfillment, shipping, tax, discount } = quote;
16460
16879
  const Tag = `h${headingLevel}`;
16461
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("section", { "data-slot": "checkout-quote-summary", className: slotClassName("space-y-4", "", className), children: [
16462
- heading ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Tag, { className: "text-lg font-semibold", children: heading }) : null,
16463
- /* @__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: [
16464
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "min-w-0 space-y-0.5", children: [
16465
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "font-medium", children: line.name }),
16466
- line.variantName ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-muted-foreground", children: line.variantName }) : null,
16467
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("p", { className: "flex flex-wrap items-center gap-2 text-muted-foreground", children: [
16468
- 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,
16469
- /* @__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)) })
16470
16889
  ] })
16471
16890
  ] }),
16472
- /* @__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) })
16473
16892
  ] }, `${line.productId}-${line.variantId ?? ""}`)) }),
16474
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("dl", { className: "space-y-2 border-t border-border pt-3 text-sm", children: [
16475
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Row, { name: t.subtotal, value: price(quote.subtotal) }),
16476
- 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)(
16477
16896
  Row,
16478
16897
  {
16479
16898
  className: "text-green-700 dark:text-green-400",
@@ -16481,17 +16900,17 @@ function CheckoutQuoteSummary({
16481
16900
  value: `\u2212${price(discount.amount)}`
16482
16901
  }
16483
16902
  ) : null,
16484
- fulfillment.type ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
16903
+ fulfillment.type ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
16485
16904
  Row,
16486
16905
  {
16487
- 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: [
16488
16907
  fulfillment.label ?? t.delivery,
16489
- 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
16490
16909
  ] }),
16491
16910
  value: fulfillment.type === "PICKUP" || shipping.isFree ? t.free : price(shipping.cost)
16492
16911
  }
16493
16912
  ) : null,
16494
- 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)(
16495
16914
  Row,
16496
16915
  {
16497
16916
  className: tax.isIncluded ? "text-muted-foreground" : void 0,
@@ -16500,19 +16919,44 @@ function CheckoutQuoteSummary({
16500
16919
  },
16501
16920
  entry.label
16502
16921
  )) : null,
16503
- /* @__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) })
16504
16923
  ] }),
16505
- tax.isIncluded ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { className: "text-sm text-muted-foreground", children: t.taxesIncludedNote }) : null,
16506
- 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,
16507
- 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,
16508
- quote.discountError ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("p", { role: "status", className: "text-sm text-destructive", children: quote.discountError.message }) : null,
16509
- 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
16510
16929
  ] });
16511
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
+ }
16512
16956
 
16513
16957
  // src/components/checkout-terms-acceptance.tsx
16514
- var import_utils28 = require("@reblu/site-ui/utils");
16515
- 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");
16516
16960
  function splitTermsLabel(label) {
16517
16961
  const at = label.indexOf("{terms}");
16518
16962
  return at === -1 ? [`${label} `, ""] : [label.slice(0, at), label.slice(at + "{terms}".length)];
@@ -16534,9 +16978,9 @@ function CheckoutTermsAcceptance({
16534
16978
  (part) => part.replaceAll("{tenant}", copy.tenantName)
16535
16979
  );
16536
16980
  const newTab = copy.isTermsLinkNewTab;
16537
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { "data-slot": "checkout-terms", className: (0, import_utils28.cn)("space-y-1", className), children: [
16538
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "flex items-start gap-3", children: [
16539
- /* @__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)(
16540
16984
  "input",
16541
16985
  {
16542
16986
  id: boxId,
@@ -16549,9 +16993,9 @@ function CheckoutTermsAcceptance({
16549
16993
  className: "mt-0.5 size-5 shrink-0 cursor-pointer accent-primary"
16550
16994
  }
16551
16995
  ),
16552
- /* @__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: [
16553
16997
  before,
16554
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
16998
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
16555
16999
  "a",
16556
17000
  {
16557
17001
  href: copy.termsLinkUrl ?? termsHref,
@@ -16559,9 +17003,9 @@ function CheckoutTermsAcceptance({
16559
17003
  className: "font-medium underline underline-offset-2 hover:text-primary",
16560
17004
  children: [
16561
17005
  copy.termsLinkText,
16562
- 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: [
16563
17007
  " ",
16564
- /* @__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 })
16565
17009
  ] }) : null
16566
17010
  ]
16567
17011
  }
@@ -16569,7 +17013,7 @@ function CheckoutTermsAcceptance({
16569
17013
  after
16570
17014
  ] })
16571
17015
  ] }),
16572
- 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
16573
17017
  ] });
16574
17018
  }
16575
17019
  function toCheckoutTermsFields(copy, accepted) {
@@ -16578,8 +17022,8 @@ function toCheckoutTermsFields(copy, accepted) {
16578
17022
  }
16579
17023
 
16580
17024
  // src/components/checkout-pay-action.tsx
16581
- var import_utils29 = require("@reblu/site-ui/utils");
16582
- 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");
16583
17027
  function CheckoutPayAction({
16584
17028
  label,
16585
17029
  notice,
@@ -16593,28 +17037,50 @@ function CheckoutPayAction({
16593
17037
  }) {
16594
17038
  const noticeId = `${id}-notice`;
16595
17039
  const isDisabled = submitting || disabled;
16596
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { "data-slot": "checkout-pay-action", className: (0, import_utils29.cn)("space-y-3", className), children: [
16597
- /* @__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)(
16598
17042
  "button",
16599
17043
  {
16600
17044
  type: "submit",
16601
17045
  disabled: isDisabled,
16602
17046
  "aria-busy": submitting || void 0,
16603
17047
  "aria-describedby": notice ? noticeId : void 0,
16604
- className: buttonClassName ?? (0, import_utils29.cn)(
17048
+ className: buttonClassName ?? (0, import_utils30.cn)(
16605
17049
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 text-base font-semibold transition-all",
16606
17050
  isDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "cursor-pointer bg-primary text-primary-foreground hover:bg-primary/90"
16607
17051
  ),
16608
17052
  children: submitting ? submittingLabel : label
16609
17053
  }
16610
17054
  ),
16611
- 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
16612
17056
  ] });
16613
17057
  }
16614
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
+
16615
17081
  // src/components/contact-interest-field.tsx
16616
- var import_utils30 = require("@reblu/site-ui/utils");
16617
- 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");
16618
17084
  function ContactInterestField({
16619
17085
  interest,
16620
17086
  value,
@@ -16631,18 +17097,18 @@ function ContactInterestField({
16631
17097
  else next2.delete(option2);
16632
17098
  onChange(interest.options.filter((candidate) => next2.has(candidate)));
16633
17099
  };
16634
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("fieldset", { "data-slot": "contact-interest", className: (0, import_utils30.cn)("space-y-2", className), children: [
16635
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("legend", { className: "text-sm font-medium", children: interest.label }),
16636
- /* @__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) => {
16637
17103
  const id = `${idPrefix}-${index}`;
16638
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(
17104
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
16639
17105
  "label",
16640
17106
  {
16641
17107
  htmlFor: id,
16642
17108
  "data-slot": "contact-interest-option",
16643
17109
  className: "flex items-center gap-2 text-sm",
16644
17110
  children: [
16645
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
17111
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
16646
17112
  "input",
16647
17113
  {
16648
17114
  id,
@@ -16668,6 +17134,9 @@ var import_site_contracts = require("@reblu/site-contracts");
16668
17134
  ALLOWED_YOUTUBE_HOSTS,
16669
17135
  AddedToCartToast,
16670
17136
  ArbitrationBadge,
17137
+ BeforeAfterPairs,
17138
+ CARD_ICON_NAMES,
17139
+ CardIconSvg,
16671
17140
  CartAdjustmentsNotice,
16672
17141
  CartLineIncludes,
16673
17142
  CartLineList,
@@ -16676,14 +17145,18 @@ var import_site_contracts = require("@reblu/site-contracts");
16676
17145
  CheckoutForm,
16677
17146
  CheckoutLoginPrompt,
16678
17147
  CheckoutPayAction,
17148
+ CheckoutQuoteNotice,
16679
17149
  CheckoutQuoteSummary,
16680
17150
  CheckoutTermsAcceptance,
17151
+ ChipList,
16681
17152
  ContactInterestField,
16682
17153
  CourseCatalogFilters,
16683
17154
  CourseDescription,
16684
17155
  CoursePurchaseTerms,
16685
17156
  DATA_REQUEST_TYPES,
17157
+ DEFAULT_BEFORE_AFTER_LABELS,
16686
17158
  DEFAULT_CHECKOUT_DELIVERY_CHOICE_LABELS,
17159
+ DEFAULT_CHECKOUT_QUOTE_NOTICE_LABELS,
16687
17160
  DEFAULT_CHECKOUT_QUOTE_SUMMARY_LABELS,
16688
17161
  DEFAULT_COURSE_CATALOG_FILTERS_LABELS,
16689
17162
  DEFAULT_COURSE_PRICE_BANDS,
@@ -16700,6 +17173,8 @@ var import_site_contracts = require("@reblu/site-contracts");
16700
17173
  EMPTY_FULL_INVOICE_VALUE,
16701
17174
  FaqAccordion,
16702
17175
  FullInvoiceFields,
17176
+ IconCardGrid,
17177
+ ImageTextSplit,
16703
17178
  LegalDocument,
16704
17179
  LessonPreview,
16705
17180
  MarkdownRenderer,
@@ -16720,11 +17195,14 @@ var import_site_contracts = require("@reblu/site-contracts");
16720
17195
  buildFaqPageJsonLd,
16721
17196
  buildShareUrls,
16722
17197
  bundleComponentsToIncludes,
17198
+ checkoutQuoteNotice,
16723
17199
  collectFaqItems,
17200
+ courseSellsAsGuest,
16724
17201
  defaultCheckoutFulfillment,
16725
17202
  formatPrice,
16726
17203
  getShopErrorMessage,
16727
17204
  isAllowedYouTubeHost,
17205
+ isCheckoutDeliveryComplete,
16728
17206
  isOverSimplifiedInvoiceCap,
16729
17207
  markdownToPlainText,
16730
17208
  markdownToSafeHtml,
@@ -16733,6 +17211,7 @@ var import_site_contracts = require("@reblu/site-contracts");
16733
17211
  sanitizeHtml,
16734
17212
  shopIssuesInvoices,
16735
17213
  shouldRenderShopFilters,
17214
+ toAcademyCheckoutInvoiceFields,
16736
17215
  toCheckoutFulfillmentFields,
16737
17216
  toCheckoutInvoiceFields,
16738
17217
  toCheckoutTermsFields