@reblu/site-blocks 0.8.0 → 0.9.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
@@ -29,15 +29,19 @@ __export(src_exports, {
29
29
  DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE: () => DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
30
30
  DEFAULT_SHOP_ERROR_MESSAGES: () => DEFAULT_SHOP_ERROR_MESSAGES,
31
31
  DEFAULT_SHOP_PRICE_BANDS: () => DEFAULT_SHOP_PRICE_BANDS,
32
+ FaqAccordion: () => FaqAccordion,
32
33
  MarkdownRenderer: () => MarkdownRenderer,
33
34
  OrderConfirmation: () => OrderConfirmation,
35
+ PageBlocks: () => PageBlocks,
34
36
  ProductCard: () => ProductCard,
35
37
  ProfileCard: () => ProfileCard,
36
38
  SafeHtml: () => SafeHtml,
37
39
  ShopFilters: () => ShopFilters,
38
40
  Specialty: () => Specialty,
39
41
  Treatment: () => Treatment,
42
+ buildFaqPageJsonLd: () => buildFaqPageJsonLd,
40
43
  buildShareUrls: () => buildShareUrls,
44
+ collectFaqItems: () => collectFaqItems,
41
45
  formatPrice: () => formatPrice,
42
46
  getShopErrorMessage: () => getShopErrorMessage,
43
47
  isAllowedYouTubeHost: () => isAllowedYouTubeHost,
@@ -99,6 +103,33 @@ function getShopErrorMessage(code, overrides, fallback = DEFAULT_SHOP_ERROR_FALL
99
103
  return messages[code] ?? fallback;
100
104
  }
101
105
 
106
+ // src/lib/block-order.ts
107
+ function sortBlocksByOrder(blocks) {
108
+ return [...blocks].sort((a, b2) => a.order - b2.order);
109
+ }
110
+
111
+ // src/lib/faq-json-ld.ts
112
+ function normaliseText(value) {
113
+ return value.replace(/\s+/g, " ").trim();
114
+ }
115
+ function buildFaqPageJsonLd(items) {
116
+ const mainEntity = [];
117
+ for (const item of items) {
118
+ const name = normaliseText(item.q);
119
+ const text3 = normaliseText(item.a);
120
+ if (!name || !text3) continue;
121
+ mainEntity.push({ "@type": "Question", name, acceptedAnswer: { "@type": "Answer", text: text3 } });
122
+ }
123
+ if (mainEntity.length === 0) return null;
124
+ return { "@context": "https://schema.org", "@type": "FAQPage", mainEntity };
125
+ }
126
+ function collectFaqItems(blocks) {
127
+ if (!blocks) return [];
128
+ return sortBlocksByOrder(blocks).flatMap(
129
+ (block) => block.blockType === "faq" ? block.data.items : []
130
+ );
131
+ }
132
+
102
133
  // ../../node_modules/.pnpm/devlop@1.1.0/node_modules/devlop/lib/default.js
103
134
  function ok() {
104
135
  }
@@ -13461,9 +13492,302 @@ function ProductCard({ product, href, currencyCode = "EUR", locale, className })
13461
13492
  );
13462
13493
  }
13463
13494
 
13464
- // src/components/shop-filters.tsx
13495
+ // src/components/faq-accordion.tsx
13465
13496
  var import_utils7 = require("@reblu/site-ui/utils");
13497
+
13498
+ // src/components/_heading.tsx
13466
13499
  var import_jsx_runtime7 = require("react/jsx-runtime");
13500
+ function nextHeadingLevel(level) {
13501
+ return Math.min(level + 1, 6);
13502
+ }
13503
+ function Heading({
13504
+ level,
13505
+ className,
13506
+ children: children2
13507
+ }) {
13508
+ const Tag = `h${level}`;
13509
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Tag, { className, children: children2 });
13510
+ }
13511
+
13512
+ // src/components/faq-accordion.tsx
13513
+ var import_jsx_runtime8 = require("react/jsx-runtime");
13514
+ function FaqAccordion({
13515
+ items,
13516
+ heading,
13517
+ headingLevel = 2,
13518
+ questionHeadingLevel,
13519
+ defaultOpen = [],
13520
+ className
13521
+ }) {
13522
+ const visible = items.map((item, index) => ({ item, index })).filter(({ item }) => item.q.trim() !== "");
13523
+ if (visible.length === 0) return null;
13524
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: (0, import_utils7.cn)("space-y-4", className), "data-slot": "faq-accordion", children: [
13525
+ heading && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Heading, { level: headingLevel, className: "text-2xl font-semibold tracking-tight", children: heading }),
13526
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "divide-y divide-border rounded-xl border border-border", children: visible.map(({ item, index }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
13527
+ "details",
13528
+ {
13529
+ className: "group px-4",
13530
+ "data-slot": "faq-item",
13531
+ ...defaultOpen.includes(index) ? { open: true } : {},
13532
+ children: [
13533
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("summary", { className: "flex cursor-pointer list-none items-center justify-between gap-4 py-4 font-medium focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring [&::-webkit-details-marker]:hidden", children: [
13534
+ questionHeadingLevel ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Heading, { level: questionHeadingLevel, className: "text-base font-medium", children: item.q }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: item.q }),
13535
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
13536
+ "span",
13537
+ {
13538
+ "aria-hidden": "true",
13539
+ className: "shrink-0 text-muted-foreground transition-transform group-open:rotate-45",
13540
+ children: "+"
13541
+ }
13542
+ )
13543
+ ] }),
13544
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "whitespace-pre-line pb-4 text-muted-foreground", children: item.a })
13545
+ ]
13546
+ },
13547
+ index
13548
+ )) })
13549
+ ] });
13550
+ }
13551
+
13552
+ // src/components/page-blocks.tsx
13553
+ var import_utils8 = require("@reblu/site-ui/utils");
13554
+ var import_button_variants2 = require("@reblu/site-ui/button-variants");
13555
+ var import_jsx_runtime9 = require("react/jsx-runtime");
13556
+ var ALIASES = {
13557
+ doctor_embed: "profile_embed",
13558
+ specialty_embed: "page_embed"
13559
+ };
13560
+ function HeroBlock({ block, headingLevel }) {
13561
+ const { title, subtitle, imageUrl } = block.data;
13562
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "space-y-4", children: [
13563
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
13564
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
13565
+ imageUrl && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
13566
+ ] });
13567
+ }
13568
+ function RichtextBlock({ block, headingLevel }) {
13569
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
13570
+ }
13571
+ function FaqBlock({ block }) {
13572
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(FaqAccordion, { items: block.data.items });
13573
+ }
13574
+ function StatsBlock({ block }) {
13575
+ return /* @__PURE__ */ (0, import_jsx_runtime9.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_runtime9.jsxs)("div", { className: "flex flex-col-reverse gap-1", children: [
13576
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
13577
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dd", { className: "text-3xl font-bold", children: item.value })
13578
+ ] }, i)) });
13579
+ }
13580
+ function TestimonialBlock({ block }) {
13581
+ const { quote, author, role, avatarUrl } = block.data;
13582
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("figure", { className: "space-y-4", children: [
13583
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { children: quote }) }),
13584
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("figcaption", { className: "flex items-center gap-3", children: [
13585
+ avatarUrl && // eslint-disable-next-line @next/next/no-img-element
13586
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13587
+ "img",
13588
+ {
13589
+ src: avatarUrl,
13590
+ alt: "",
13591
+ loading: "lazy",
13592
+ className: "h-10 w-10 rounded-full object-cover"
13593
+ }
13594
+ ),
13595
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("span", { children: [
13596
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "font-semibold", children: author }),
13597
+ role && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "block text-sm opacity-80", children: role })
13598
+ ] })
13599
+ ] })
13600
+ ] });
13601
+ }
13602
+ function CtaSlotBlock(_props) {
13603
+ return null;
13604
+ }
13605
+ function FeatureListBlock({ block }) {
13606
+ return /* @__PURE__ */ (0, import_jsx_runtime9.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_runtime9.jsx)("li", { children: item.text }, i)) });
13607
+ }
13608
+ function GalleryBlock({ block }) {
13609
+ const { images } = block.data;
13610
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13611
+ "div",
13612
+ {
13613
+ className: (0, import_utils8.cn)(
13614
+ "grid gap-4",
13615
+ images.length > 1 ? "sm:grid-cols-2 lg:grid-cols-3" : "grid-cols-1"
13616
+ ),
13617
+ children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("figure", { className: "space-y-1", children: [
13618
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13619
+ "img",
13620
+ {
13621
+ src: img.url,
13622
+ alt: img.alt ?? "",
13623
+ loading: "lazy",
13624
+ className: "h-full w-full object-cover"
13625
+ }
13626
+ ) }),
13627
+ img.caption && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("figcaption", { className: "text-sm opacity-80", children: img.caption })
13628
+ ] }, `${img.url}-${i}`))
13629
+ }
13630
+ );
13631
+ }
13632
+ function EmbedCard({
13633
+ resolved,
13634
+ headingLevel,
13635
+ embedHref
13636
+ }) {
13637
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
13638
+ "a",
13639
+ {
13640
+ href: embedHref(resolved),
13641
+ 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",
13642
+ children: [
13643
+ resolved.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13644
+ "img",
13645
+ {
13646
+ src: resolved.coverImageUrl,
13647
+ alt: "",
13648
+ loading: "lazy",
13649
+ className: "h-full w-full object-cover"
13650
+ }
13651
+ ) }),
13652
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "space-y-1 p-4", children: [
13653
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
13654
+ resolved.role && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
13655
+ resolved.excerpt && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-muted-foreground", children: resolved.excerpt })
13656
+ ] })
13657
+ ]
13658
+ }
13659
+ );
13660
+ }
13661
+ function PageEmbedBlock({ block, headingLevel, embedHref }) {
13662
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
13663
+ }
13664
+ function ProfileEmbedBlock({
13665
+ block,
13666
+ headingLevel,
13667
+ embedHref
13668
+ }) {
13669
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
13670
+ }
13671
+ var DEFAULT_RENDERERS = {
13672
+ hero: HeroBlock,
13673
+ richtext: RichtextBlock,
13674
+ faq: FaqBlock,
13675
+ stats: StatsBlock,
13676
+ testimonial: TestimonialBlock,
13677
+ cta: CtaSlotBlock,
13678
+ feature_list: FeatureListBlock,
13679
+ gallery: GalleryBlock,
13680
+ page_embed: PageEmbedBlock,
13681
+ profile_embed: ProfileEmbedBlock
13682
+ };
13683
+ var EMBED_TYPES = /* @__PURE__ */ new Set([
13684
+ "page_embed",
13685
+ "profile_embed"
13686
+ ]);
13687
+ function canonicalTypeOf(blockType) {
13688
+ if (Object.prototype.hasOwnProperty.call(ALIASES, blockType))
13689
+ return ALIASES[blockType];
13690
+ if (Object.prototype.hasOwnProperty.call(DEFAULT_RENDERERS, blockType))
13691
+ return blockType;
13692
+ return null;
13693
+ }
13694
+ var TOKEN_FOREGROUND = {
13695
+ "var(--primary)": "var(--primary-foreground)",
13696
+ "var(--secondary)": "var(--secondary-foreground)",
13697
+ "var(--accent)": "var(--accent-foreground)"
13698
+ };
13699
+ function hexLuminance(color2) {
13700
+ const match = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(color2.trim());
13701
+ if (!match) return null;
13702
+ const hex = match[1].length === 3 ? [...match[1]].map((c) => c + c).join("") : match[1];
13703
+ const [r, g, b2] = [0, 2, 4].map((i) => {
13704
+ const s2 = parseInt(hex.slice(i, i + 2), 16) / 255;
13705
+ return s2 <= 0.03928 ? s2 / 12.92 : Math.pow((s2 + 0.055) / 1.055, 2.4);
13706
+ });
13707
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b2;
13708
+ }
13709
+ function surfaceStyle(background) {
13710
+ if (!background) return void 0;
13711
+ const token = TOKEN_FOREGROUND[background];
13712
+ if (token) return { backgroundColor: background, color: token };
13713
+ const luminance = hexLuminance(background);
13714
+ if (luminance === null) return { backgroundColor: background };
13715
+ return { backgroundColor: background, color: luminance < 0.179 ? "#ffffff" : "#111827" };
13716
+ }
13717
+ function hasUsableCta(cta) {
13718
+ return !!cta && !!cta.label && !!cta.url;
13719
+ }
13720
+ function toIdFragment(value) {
13721
+ return value.replace(/[^A-Za-z0-9_-]/g, "-");
13722
+ }
13723
+ function SectionCta2({ cta }) {
13724
+ if (!hasUsableCta(cta)) return null;
13725
+ const variant = toButtonVariant(cta.variant);
13726
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13727
+ "a",
13728
+ {
13729
+ href: cta.url,
13730
+ "data-slot": "button",
13731
+ "data-variant": variant,
13732
+ "data-size": "default",
13733
+ className: (0, import_utils8.cn)((0, import_button_variants2.buttonVariants)({ variant, size: "default" })),
13734
+ ...cta.isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {},
13735
+ children: cta.label
13736
+ }
13737
+ ) });
13738
+ }
13739
+ function PageBlocks({
13740
+ blocks,
13741
+ components,
13742
+ headingLevel = 2,
13743
+ embedHref = (resolved) => `/${resolved.slug}`,
13744
+ idPrefix = "page-block",
13745
+ className,
13746
+ sectionClassName
13747
+ }) {
13748
+ if (!blocks || blocks.length === 0) return null;
13749
+ const safePrefix = `pb-${toIdFragment(idPrefix)}`;
13750
+ const sections = sortBlocksByOrder(blocks).flatMap((block) => {
13751
+ const type = canonicalTypeOf(block.blockType);
13752
+ if (type === null) return [];
13753
+ if (EMBED_TYPES.has(type) && !block.resolved) return [];
13754
+ if (type === "cta" && !components?.cta && !block.heading && !hasUsableCta(block.cta)) return [];
13755
+ const Renderer = components?.[type] ?? DEFAULT_RENDERERS[type];
13756
+ const headingId = block.heading ? `${safePrefix}-${toIdFragment(block.id)}-heading` : void 0;
13757
+ const background = block.backgroundColor;
13758
+ return [
13759
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
13760
+ "section",
13761
+ {
13762
+ "data-slot": "page-block",
13763
+ "data-block-type": type,
13764
+ "aria-labelledby": headingId,
13765
+ style: surfaceStyle(background),
13766
+ className: (0, import_utils8.cn)("space-y-6", background && "rounded-xl px-6 py-10", sectionClassName),
13767
+ children: [
13768
+ block.heading && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { id: headingId, children: block.heading }) }),
13769
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13770
+ Renderer,
13771
+ {
13772
+ block,
13773
+ headingLevel: block.heading ? nextHeadingLevel(headingLevel) : headingLevel,
13774
+ embedHref
13775
+ }
13776
+ ),
13777
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(SectionCta2, { cta: block.cta })
13778
+ ]
13779
+ },
13780
+ block.id
13781
+ )
13782
+ ];
13783
+ });
13784
+ if (sections.length === 0) return null;
13785
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: (0, import_utils8.cn)("space-y-12", className), "data-slot": "page-blocks", children: sections });
13786
+ }
13787
+
13788
+ // src/components/shop-filters.tsx
13789
+ var import_utils9 = require("@reblu/site-ui/utils");
13790
+ var import_jsx_runtime10 = require("react/jsx-runtime");
13467
13791
  var DEFAULT_SHOP_PRICE_BANDS = [
13468
13792
  { max: 2500 },
13469
13793
  { min: 2500, max: 5e3 },
@@ -13507,7 +13831,7 @@ function priceBandLabel(band, t, currencyCode, locale) {
13507
13831
  return "";
13508
13832
  }
13509
13833
  function OptionLink({ href, active, label, onActivate }) {
13510
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13834
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13511
13835
  "a",
13512
13836
  {
13513
13837
  href,
@@ -13516,7 +13840,7 @@ function OptionLink({ href, active, label, onActivate }) {
13516
13840
  event.preventDefault();
13517
13841
  onActivate();
13518
13842
  } : void 0,
13519
- className: (0, import_utils7.cn)(
13843
+ className: (0, import_utils9.cn)(
13520
13844
  "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",
13521
13845
  active ? "border-transparent bg-primary text-primary-foreground" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"
13522
13846
  ),
@@ -13525,9 +13849,9 @@ function OptionLink({ href, active, label, onActivate }) {
13525
13849
  );
13526
13850
  }
13527
13851
  function FilterFieldset({ legend, children: children2 }) {
13528
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("fieldset", { className: "space-y-2", children: [
13529
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
13530
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
13852
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("fieldset", { className: "space-y-2", children: [
13853
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
13854
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
13531
13855
  ] });
13532
13856
  }
13533
13857
  function ShopFilters({
@@ -13550,11 +13874,11 @@ function ShopFilters({
13550
13874
  if (!shouldRenderShopFilters(facets, active)) {
13551
13875
  return null;
13552
13876
  }
13553
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: (0, import_utils7.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
13877
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: (0, import_utils9.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
13554
13878
  visibleTaxonomies.map((axis) => {
13555
13879
  const activeSlug = active.taxonomy?.[axis.key];
13556
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(FilterFieldset, { legend: axis.label, children: [
13557
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13880
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(FilterFieldset, { legend: axis.label, children: [
13881
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13558
13882
  OptionLink,
13559
13883
  {
13560
13884
  href: hrefs.taxonomy(axis.key, void 0),
@@ -13569,7 +13893,7 @@ function ShopFilters({
13569
13893
  ),
13570
13894
  axis.terms.map((term) => {
13571
13895
  const isActive = activeSlug === term.slug;
13572
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13896
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13573
13897
  OptionLink,
13574
13898
  {
13575
13899
  href: hrefs.taxonomy(axis.key, isActive ? void 0 : term.slug),
@@ -13589,9 +13913,9 @@ function ShopFilters({
13589
13913
  }),
13590
13914
  visibleAttributes.map((attr) => {
13591
13915
  const activeValues = toValueArray(active.attr?.[attr.key]);
13592
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
13916
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
13593
13917
  const isActive = activeValues.includes(opt.value);
13594
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13918
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13595
13919
  OptionLink,
13596
13920
  {
13597
13921
  href: hrefs.attr(attr.key, opt.value),
@@ -13609,11 +13933,11 @@ function ShopFilters({
13609
13933
  );
13610
13934
  }) }, attr.key);
13611
13935
  }),
13612
- showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
13936
+ showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
13613
13937
  const isActive = active.priceMin === band.min && active.priceMax === band.max;
13614
13938
  const nextMin = isActive ? void 0 : band.min;
13615
13939
  const nextMax = isActive ? void 0 : band.max;
13616
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13940
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13617
13941
  OptionLink,
13618
13942
  {
13619
13943
  href: hrefs.price(nextMin, nextMax),
@@ -13624,7 +13948,7 @@ function ShopFilters({
13624
13948
  i
13625
13949
  );
13626
13950
  }) }),
13627
- hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13951
+ hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13628
13952
  OptionLink,
13629
13953
  {
13630
13954
  href: hrefs.onSale(!active.onSale),
@@ -13633,7 +13957,7 @@ function ShopFilters({
13633
13957
  onActivate: onChange ? () => onChange({ onSale: !active.onSale }) : void 0
13634
13958
  }
13635
13959
  ),
13636
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13960
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13637
13961
  "a",
13638
13962
  {
13639
13963
  href: hrefs.clearAll(),
@@ -13649,8 +13973,8 @@ function ShopFilters({
13649
13973
  }
13650
13974
 
13651
13975
  // src/components/cart-line-list.tsx
13652
- var import_utils8 = require("@reblu/site-ui/utils");
13653
- var import_jsx_runtime8 = require("react/jsx-runtime");
13976
+ var import_utils10 = require("@reblu/site-ui/utils");
13977
+ var import_jsx_runtime11 = require("react/jsx-runtime");
13654
13978
  var DEFAULT_LABELS2 = {
13655
13979
  quantityLabel: "Cantidad",
13656
13980
  decrease: "Reducir cantidad",
@@ -13675,9 +13999,9 @@ function CartLineList({
13675
13999
  }) {
13676
14000
  const t = { ...DEFAULT_LABELS2, ...labels };
13677
14001
  const noticeContent = notice === true ? t.cancelledNotice : notice;
13678
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: (0, import_utils8.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
13679
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
13680
- noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
14002
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: (0, import_utils10.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
14003
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
14004
+ noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
13681
14005
  "div",
13682
14006
  {
13683
14007
  role: "status",
@@ -13686,32 +14010,32 @@ function CartLineList({
13686
14010
  children: noticeContent
13687
14011
  }
13688
14012
  ),
13689
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
14013
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
13690
14014
  const maxQty = item.maxStock ?? Infinity;
13691
14015
  const atMax = item.quantity >= maxQty;
13692
14016
  const atMin = item.quantity <= 1;
13693
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
14017
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
13694
14018
  "li",
13695
14019
  {
13696
14020
  className: "flex gap-4 rounded-xl border border-border bg-card p-4",
13697
14021
  children: [
13698
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
13699
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "min-w-0 flex-1", children: [
13700
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
13701
- item.variantName && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
13702
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
14022
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
14023
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "min-w-0 flex-1", children: [
14024
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
14025
+ item.variantName && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
14026
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
13703
14027
  formatPrice(item.unitPrice, currencyCode, locale),
13704
14028
  " ",
13705
14029
  t.unitPriceSuffix
13706
14030
  ] }),
13707
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
14031
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
13708
14032
  "div",
13709
14033
  {
13710
14034
  role: "group",
13711
14035
  "aria-label": t.quantityLabel,
13712
14036
  className: "mt-3 flex items-center gap-3",
13713
14037
  children: [
13714
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
14038
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
13715
14039
  "button",
13716
14040
  {
13717
14041
  type: "button",
@@ -13722,8 +14046,8 @@ function CartLineList({
13722
14046
  children: "\u2212"
13723
14047
  }
13724
14048
  ),
13725
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
13726
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
14049
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
14050
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
13727
14051
  "button",
13728
14052
  {
13729
14053
  type: "button",
@@ -13734,7 +14058,7 @@ function CartLineList({
13734
14058
  children: "+"
13735
14059
  }
13736
14060
  ),
13737
- onRemove && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
14061
+ onRemove && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
13738
14062
  "button",
13739
14063
  {
13740
14064
  type: "button",
@@ -13748,7 +14072,7 @@ function CartLineList({
13748
14072
  }
13749
14073
  )
13750
14074
  ] }),
13751
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
14075
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
13752
14076
  ]
13753
14077
  },
13754
14078
  lineKey(item.productId, item.variantId)
@@ -13758,8 +14082,8 @@ function CartLineList({
13758
14082
  }
13759
14083
 
13760
14084
  // src/components/cart-summary.tsx
13761
- var import_utils9 = require("@reblu/site-ui/utils");
13762
- var import_jsx_runtime9 = require("react/jsx-runtime");
14085
+ var import_utils11 = require("@reblu/site-ui/utils");
14086
+ var import_jsx_runtime12 = require("react/jsx-runtime");
13763
14087
  var DEFAULT_LABELS3 = {
13764
14088
  subtotal: "Subtotal",
13765
14089
  discountPrefix: "Descuento",
@@ -13786,40 +14110,40 @@ function CartSummary({
13786
14110
  const hasDiscount = Boolean(discount && discount > 0);
13787
14111
  const noticeContent = notice === true ? t.cancelledNotice : notice;
13788
14112
  const hasNotice = noticeContent != null && noticeContent !== false;
13789
- const breakdown = /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
14113
+ const breakdown = /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
13790
14114
  "dl",
13791
14115
  {
13792
- className: (0, import_utils9.cn)("space-y-2 text-sm", !hasNotice && className),
14116
+ className: (0, import_utils11.cn)("space-y-2 text-sm", !hasNotice && className),
13793
14117
  "data-slot": "cart-summary",
13794
14118
  children: [
13795
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
13796
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dt", { children: t.subtotal }),
13797
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
14119
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14120
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dt", { children: t.subtotal }),
14121
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
13798
14122
  ] }),
13799
- hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
13800
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("dt", { children: [
14123
+ hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
14124
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("dt", { children: [
13801
14125
  t.discountPrefix,
13802
14126
  discountCode ? ` (${discountCode})` : ""
13803
14127
  ] }),
13804
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("dd", { children: [
14128
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("dd", { children: [
13805
14129
  "-",
13806
14130
  formatPrice(discount, currencyCode, locale)
13807
14131
  ] })
13808
14132
  ] }),
13809
- shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
13810
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dt", { children: t.shipping }),
13811
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
14133
+ shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14134
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dt", { children: t.shipping }),
14135
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
13812
14136
  ] }),
13813
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
13814
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dt", { children: t.total }),
13815
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
14137
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
14138
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dt", { children: t.total }),
14139
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
13816
14140
  ] })
13817
14141
  ]
13818
14142
  }
13819
14143
  );
13820
14144
  if (!hasNotice) return breakdown;
13821
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: (0, import_utils9.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
13822
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
14145
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: (0, import_utils11.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
14146
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
13823
14147
  "div",
13824
14148
  {
13825
14149
  role: "status",
@@ -13833,8 +14157,8 @@ function CartSummary({
13833
14157
  }
13834
14158
 
13835
14159
  // src/components/added-to-cart-toast.tsx
13836
- var import_utils10 = require("@reblu/site-ui/utils");
13837
- var import_jsx_runtime10 = (
14160
+ var import_utils12 = require("@reblu/site-ui/utils");
14161
+ var import_jsx_runtime13 = (
13838
14162
  // eslint-disable-next-line @next/next/no-img-element -- toast content, not a Next <Image> layout context
13839
14163
  require("react/jsx-runtime")
13840
14164
  );
@@ -13857,32 +14181,32 @@ function AddedToCartToast({
13857
14181
  const message = status === "error" ? t.error : status === "outOfStock" ? t.outOfStock : t.success;
13858
14182
  const hasThumbnail = Boolean(imageUrl && imageUrl.trim().length > 0);
13859
14183
  const variant = status === "success" ? "success" : "error";
13860
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
14184
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
13861
14185
  "div",
13862
14186
  {
13863
14187
  "data-slot": "added-to-cart-toast",
13864
14188
  "data-variant": variant,
13865
- className: (0, import_utils10.cn)(
14189
+ className: (0, import_utils12.cn)(
13866
14190
  "flex items-center gap-3 rounded-xl border border-border bg-card p-3 text-sm shadow-lg",
13867
14191
  variant === "success" && "border-green-600/30 dark:border-green-400/30",
13868
14192
  variant === "error" && "border-destructive/30",
13869
14193
  className
13870
14194
  ),
13871
14195
  children: [
13872
- hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
13873
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "min-w-0 flex-1", children: [
13874
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
13875
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
14196
+ hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
14197
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "min-w-0 flex-1", children: [
14198
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
14199
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
13876
14200
  ] }),
13877
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
14201
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
13878
14202
  ]
13879
14203
  }
13880
14204
  );
13881
14205
  }
13882
14206
 
13883
14207
  // src/components/checkout-login-prompt.tsx
13884
- var import_utils11 = require("@reblu/site-ui/utils");
13885
- var import_jsx_runtime11 = require("react/jsx-runtime");
14208
+ var import_utils13 = require("@reblu/site-ui/utils");
14209
+ var import_jsx_runtime14 = require("react/jsx-runtime");
13886
14210
  var DEFAULT_LABELS5 = {
13887
14211
  title: "Identificaci\xF3n",
13888
14212
  description: "Introduce tu email para agilizar el proceso o contin\xFAa como invitado.",
@@ -13909,26 +14233,26 @@ function CheckoutLoginPrompt({
13909
14233
  if (!open) return null;
13910
14234
  const t = { ...DEFAULT_LABELS5, ...labels };
13911
14235
  const isValidEmail = EMAIL_PATTERN.test(email.trim());
13912
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
13913
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
13914
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
14236
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
14237
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
14238
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
13915
14239
  "div",
13916
14240
  {
13917
14241
  role: "dialog",
13918
14242
  "aria-modal": "true",
13919
14243
  "aria-labelledby": "checkout-login-prompt-title",
13920
14244
  "data-slot": "checkout-login-prompt",
13921
- className: (0, import_utils11.cn)(
14245
+ className: (0, import_utils13.cn)(
13922
14246
  "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",
13923
14247
  className
13924
14248
  ),
13925
14249
  children: [
13926
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
13927
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { children: [
13928
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
13929
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
14250
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
14251
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { children: [
14252
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
14253
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
13930
14254
  ] }),
13931
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14255
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
13932
14256
  "button",
13933
14257
  {
13934
14258
  type: "button",
@@ -13939,9 +14263,9 @@ function CheckoutLoginPrompt({
13939
14263
  }
13940
14264
  )
13941
14265
  ] }),
13942
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "space-y-2", children: [
13943
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
13944
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14266
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "space-y-2", children: [
14267
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
14268
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
13945
14269
  "input",
13946
14270
  {
13947
14271
  id: "checkout-login-prompt-email",
@@ -13950,29 +14274,29 @@ function CheckoutLoginPrompt({
13950
14274
  value: email,
13951
14275
  onChange: (e) => onEmailChange(e.target.value),
13952
14276
  placeholder: t.emailPlaceholder,
13953
- className: (0, import_utils11.cn)(
14277
+ className: (0, import_utils13.cn)(
13954
14278
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
13955
14279
  error ? "border-destructive" : "border-border focus:border-primary"
13956
14280
  )
13957
14281
  }
13958
14282
  ),
13959
- error && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "text-xs text-destructive", children: error })
14283
+ error && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-xs text-destructive", children: error })
13960
14284
  ] }),
13961
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "space-y-2", children: [
13962
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14285
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "space-y-2", children: [
14286
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
13963
14287
  "button",
13964
14288
  {
13965
14289
  type: "button",
13966
14290
  onClick: onSubmitEmail,
13967
14291
  disabled: checking || !isValidEmail,
13968
- className: (0, import_utils11.cn)(
14292
+ className: (0, import_utils13.cn)(
13969
14293
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-2.5 text-sm font-semibold transition-all",
13970
14294
  checking || !isValidEmail ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
13971
14295
  ),
13972
14296
  children: checking ? t.checking : t.continueWithEmail
13973
14297
  }
13974
14298
  ),
13975
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14299
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
13976
14300
  "button",
13977
14301
  {
13978
14302
  type: "button",
@@ -13989,9 +14313,9 @@ function CheckoutLoginPrompt({
13989
14313
  }
13990
14314
 
13991
14315
  // src/components/checkout-form.tsx
13992
- var import_utils12 = require("@reblu/site-ui/utils");
14316
+ var import_utils14 = require("@reblu/site-ui/utils");
13993
14317
  var import_phone_input = require("@reblu/site-ui/phone-input");
13994
- var import_jsx_runtime12 = require("react/jsx-runtime");
14318
+ var import_jsx_runtime15 = require("react/jsx-runtime");
13995
14319
  var DEFAULT_LABELS6 = {
13996
14320
  contactTitle: "Datos de contacto",
13997
14321
  nameLabel: "Nombre completo",
@@ -14045,22 +14369,22 @@ function CheckoutForm({
14045
14369
  event.preventDefault();
14046
14370
  if (discountCode.trim() && !discountApplying) onApplyDiscount();
14047
14371
  }
14048
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
14372
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
14049
14373
  loginPrompt,
14050
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
14374
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
14051
14375
  "form",
14052
14376
  {
14053
14377
  "data-testid": "checkout-form",
14054
14378
  onSubmit,
14055
- className: (0, import_utils12.cn)("space-y-8", className),
14379
+ className: (0, import_utils14.cn)("space-y-8", className),
14056
14380
  "data-slot": "checkout-form",
14057
14381
  children: [
14058
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("section", { className: "space-y-4", children: [
14059
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
14060
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
14061
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "space-y-1", children: [
14062
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
14063
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14382
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("section", { className: "space-y-4", children: [
14383
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
14384
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
14385
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "space-y-1", children: [
14386
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
14387
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14064
14388
  "input",
14065
14389
  {
14066
14390
  id: "checkout-form-name",
@@ -14069,17 +14393,17 @@ function CheckoutForm({
14069
14393
  value: contact.name,
14070
14394
  onChange: (e) => patchContact({ name: e.target.value }),
14071
14395
  placeholder: t.namePlaceholder,
14072
- className: (0, import_utils12.cn)(
14396
+ className: (0, import_utils14.cn)(
14073
14397
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
14074
14398
  contactErrors?.name ? "border-destructive" : "border-border focus:border-primary"
14075
14399
  )
14076
14400
  }
14077
14401
  ),
14078
- contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
14402
+ contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
14079
14403
  ] }),
14080
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "space-y-1", children: [
14081
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
14082
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14404
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "space-y-1", children: [
14405
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
14406
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14083
14407
  "input",
14084
14408
  {
14085
14409
  id: "checkout-form-email",
@@ -14088,15 +14412,15 @@ function CheckoutForm({
14088
14412
  value: contact.email,
14089
14413
  onChange: (e) => patchContact({ email: e.target.value }),
14090
14414
  placeholder: t.emailPlaceholder,
14091
- className: (0, import_utils12.cn)(
14415
+ className: (0, import_utils14.cn)(
14092
14416
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
14093
14417
  contactErrors?.email ? "border-destructive" : "border-border focus:border-primary"
14094
14418
  )
14095
14419
  }
14096
14420
  ),
14097
- contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
14421
+ contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
14098
14422
  ] }),
14099
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14423
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14100
14424
  import_phone_input.PhoneInput,
14101
14425
  {
14102
14426
  id: "checkout-form-phone",
@@ -14110,15 +14434,15 @@ function CheckoutForm({
14110
14434
  ] })
14111
14435
  ] }),
14112
14436
  children2,
14113
- generalError ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
14114
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("section", { className: "space-y-3", children: [
14115
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
14116
- appliedDiscount ? /* @__PURE__ */ (0, import_jsx_runtime12.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: [
14117
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
14118
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
14119
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
14437
+ generalError ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
14438
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("section", { className: "space-y-3", children: [
14439
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
14440
+ appliedDiscount ? /* @__PURE__ */ (0, import_jsx_runtime15.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: [
14441
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
14442
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
14443
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
14120
14444
  ] }),
14121
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14445
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14122
14446
  "button",
14123
14447
  {
14124
14448
  type: "button",
@@ -14128,9 +14452,9 @@ function CheckoutForm({
14128
14452
  children: t.removeDiscount
14129
14453
  }
14130
14454
  )
14131
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: "flex gap-2", children: [
14132
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
14133
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14455
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex gap-2", children: [
14456
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
14457
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14134
14458
  "input",
14135
14459
  {
14136
14460
  id: "checkout-form-discount-code",
@@ -14142,7 +14466,7 @@ function CheckoutForm({
14142
14466
  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"
14143
14467
  }
14144
14468
  ),
14145
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14469
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14146
14470
  "button",
14147
14471
  {
14148
14472
  type: "button",
@@ -14153,14 +14477,14 @@ function CheckoutForm({
14153
14477
  }
14154
14478
  )
14155
14479
  ] }),
14156
- discountError && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-xs text-destructive", children: discountError })
14480
+ discountError && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-xs text-destructive", children: discountError })
14157
14481
  ] }),
14158
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14482
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14159
14483
  "button",
14160
14484
  {
14161
14485
  type: "submit",
14162
14486
  disabled: submitting || submitDisabled,
14163
- className: (0, import_utils12.cn)(
14487
+ className: (0, import_utils14.cn)(
14164
14488
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold transition-all",
14165
14489
  submitting || submitDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
14166
14490
  ),
@@ -14174,8 +14498,8 @@ function CheckoutForm({
14174
14498
  }
14175
14499
 
14176
14500
  // src/components/order-confirmation.tsx
14177
- var import_utils13 = require("@reblu/site-ui/utils");
14178
- var import_jsx_runtime13 = require("react/jsx-runtime");
14501
+ var import_utils15 = require("@reblu/site-ui/utils");
14502
+ var import_jsx_runtime16 = require("react/jsx-runtime");
14179
14503
  var DEFAULT_LABELS7 = {
14180
14504
  pollingTitle: "Confirmando tu pedido\u2026",
14181
14505
  pollingDescription: "Estamos procesando el pago, un momento\u2026",
@@ -14237,48 +14561,48 @@ function OrderConfirmation({
14237
14561
  const showOrderReference = Boolean(order) && !showFullOrderSummary && (status === "refunded" || status === "partially_refunded" || status === "pending_timeout");
14238
14562
  const showSessionReference = !order && sessionId && (status === "timeout" || status === "not_found" || status === "pending_timeout");
14239
14563
  const showRecheck = (status === "pending_timeout" || status === "error") && onRecheck;
14240
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: (0, import_utils13.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
14241
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("h1", { className: "text-3xl font-bold", children: title }),
14242
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
14243
- showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "space-y-6", children: [
14244
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14245
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
14246
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14564
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: (0, import_utils15.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
14565
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h1", { className: "text-3xl font-bold", children: title }),
14566
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
14567
+ showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "space-y-6", children: [
14568
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14569
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
14570
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14247
14571
  ] }),
14248
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
14249
- order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
14572
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
14573
+ order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
14250
14574
  "div",
14251
14575
  {
14252
14576
  className: "flex justify-between gap-4 text-sm",
14253
14577
  children: [
14254
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
14578
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
14255
14579
  item.product.name,
14256
14580
  item.variant ? ` (${item.variant.name})` : "",
14257
14581
  " x",
14258
14582
  item.quantity
14259
14583
  ] }),
14260
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
14584
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
14261
14585
  ]
14262
14586
  },
14263
14587
  idx
14264
14588
  )),
14265
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
14266
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: t.totalLabel }),
14267
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
14589
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
14590
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: t.totalLabel }),
14591
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
14268
14592
  ] }) })
14269
14593
  ] }),
14270
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
14594
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
14271
14595
  t.confirmationEmailPrefix,
14272
14596
  " ",
14273
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
14597
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
14274
14598
  "."
14275
14599
  ] })
14276
14600
  ] }),
14277
- showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14278
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
14279
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14601
+ showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14602
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
14603
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14280
14604
  ] }),
14281
- status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14605
+ status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14282
14606
  "a",
14283
14607
  {
14284
14608
  href: cartHref,
@@ -14286,7 +14610,7 @@ function OrderConfirmation({
14286
14610
  children: t.backToCartLabel
14287
14611
  }
14288
14612
  ),
14289
- showRecheck && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14613
+ showRecheck && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14290
14614
  "button",
14291
14615
  {
14292
14616
  type: "button",
@@ -14295,9 +14619,9 @@ function OrderConfirmation({
14295
14619
  children: t.recheckLabel
14296
14620
  }
14297
14621
  ),
14298
- showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14299
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
14300
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
14622
+ showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14623
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
14624
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
14301
14625
  ] })
14302
14626
  ] });
14303
14627
  }
@@ -14312,15 +14636,19 @@ function OrderConfirmation({
14312
14636
  DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
14313
14637
  DEFAULT_SHOP_ERROR_MESSAGES,
14314
14638
  DEFAULT_SHOP_PRICE_BANDS,
14639
+ FaqAccordion,
14315
14640
  MarkdownRenderer,
14316
14641
  OrderConfirmation,
14642
+ PageBlocks,
14317
14643
  ProductCard,
14318
14644
  ProfileCard,
14319
14645
  SafeHtml,
14320
14646
  ShopFilters,
14321
14647
  Specialty,
14322
14648
  Treatment,
14649
+ buildFaqPageJsonLd,
14323
14650
  buildShareUrls,
14651
+ collectFaqItems,
14324
14652
  formatPrice,
14325
14653
  getShopErrorMessage,
14326
14654
  isAllowedYouTubeHost,