@reblu/site-blocks 0.20.0 → 0.21.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
@@ -30,6 +30,7 @@ __export(src_exports, {
30
30
  CourseDescription: () => CourseDescription,
31
31
  DATA_REQUEST_TYPES: () => import_site_contracts.DATA_REQUEST_TYPES,
32
32
  DEFAULT_INVOICE_COUNTRIES: () => DEFAULT_INVOICE_COUNTRIES,
33
+ DEFAULT_LESSON_PREVIEW_LABELS: () => DEFAULT_LESSON_PREVIEW_LABELS,
33
34
  DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE: () => DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
34
35
  DEFAULT_SHOP_ERROR_MESSAGES: () => DEFAULT_SHOP_ERROR_MESSAGES,
35
36
  DEFAULT_SHOP_PRICE_BANDS: () => DEFAULT_SHOP_PRICE_BANDS,
@@ -39,6 +40,7 @@ __export(src_exports, {
39
40
  EMPTY_FULL_INVOICE_VALUE: () => EMPTY_FULL_INVOICE_VALUE,
40
41
  FaqAccordion: () => FaqAccordion,
41
42
  FullInvoiceFields: () => FullInvoiceFields,
43
+ LessonPreview: () => LessonPreview,
42
44
  MarkdownRenderer: () => MarkdownRenderer,
43
45
  OrderConfirmation: () => OrderConfirmation,
44
46
  OrderInvoiceLink: () => OrderInvoiceLink,
@@ -13523,13 +13525,129 @@ function CourseDescription({
13523
13525
  );
13524
13526
  }
13525
13527
 
13528
+ // src/components/lesson-preview.tsx
13529
+ var import_jsx_runtime3 = require("react/jsx-runtime");
13530
+ var DEFAULT_LESSON_PREVIEW_LABELS = {
13531
+ badge: "Vista previa gratuita",
13532
+ player: "V\xEDdeo",
13533
+ duration: "Duraci\xF3n"
13534
+ };
13535
+ function isEmbeddable(url) {
13536
+ try {
13537
+ return new URL(url).protocol === "https:";
13538
+ } catch {
13539
+ return false;
13540
+ }
13541
+ }
13542
+ function clock(seconds) {
13543
+ const whole = Math.round(seconds);
13544
+ const h2 = Math.floor(whole / 3600);
13545
+ const m2 = Math.floor(whole % 3600 / 60);
13546
+ const s2 = whole % 60;
13547
+ const ss = String(s2).padStart(2, "0");
13548
+ return {
13549
+ text: h2 > 0 ? `${h2}:${String(m2).padStart(2, "0")}:${ss}` : `${m2}:${ss}`,
13550
+ iso: `PT${h2 > 0 ? `${h2}H` : ""}${m2}M${s2}S`
13551
+ };
13552
+ }
13553
+ function isVisiblyEmpty2(html5) {
13554
+ if (/<(img|iframe|hr)\b/i.test(html5)) return false;
13555
+ return html5.replace(/<[^>]*>/g, "").trim() === "";
13556
+ }
13557
+ function LessonPreview({
13558
+ lesson,
13559
+ labels: labelOverrides,
13560
+ headingLevel = 2,
13561
+ headingId = "lesson-preview-heading",
13562
+ headingClassName,
13563
+ contentClassName,
13564
+ className
13565
+ }) {
13566
+ const labels = { ...DEFAULT_LESSON_PREVIEW_LABELS, ...labelOverrides };
13567
+ const Tag = `h${headingLevel}`;
13568
+ const video = lesson.video && isEmbeddable(lesson.video.embedUrl) ? lesson.video : null;
13569
+ const html5 = markdownToSafeHtml(lesson.content);
13570
+ const hasBody = html5 !== null && html5 !== "" && !isVisiblyEmpty2(html5);
13571
+ const duration = typeof lesson.durationSeconds === "number" && lesson.durationSeconds > 0 ? clock(lesson.durationSeconds) : null;
13572
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
13573
+ "article",
13574
+ {
13575
+ "data-slot": "lesson-preview",
13576
+ "aria-labelledby": headingId,
13577
+ className: slotClassName("space-y-6", "", className),
13578
+ children: [
13579
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("header", { className: "space-y-2", children: [
13580
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13581
+ "span",
13582
+ {
13583
+ "data-slot": "lesson-preview-badge",
13584
+ className: "inline-flex items-center rounded-full bg-primary/10 px-3 py-1 text-xs font-semibold text-primary",
13585
+ children: labels.badge
13586
+ }
13587
+ ),
13588
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13589
+ Tag,
13590
+ {
13591
+ id: headingId,
13592
+ className: slotClassName("", "text-2xl font-semibold leading-tight", headingClassName),
13593
+ children: lesson.title
13594
+ }
13595
+ ),
13596
+ duration && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("p", { className: "text-sm text-muted-foreground", children: [
13597
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("span", { className: "sr-only", children: [
13598
+ labels.duration,
13599
+ ": "
13600
+ ] }),
13601
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13602
+ "time",
13603
+ {
13604
+ "data-slot": "lesson-preview-duration",
13605
+ dateTime: duration.iso,
13606
+ className: "tabular-nums",
13607
+ children: duration.text
13608
+ }
13609
+ )
13610
+ ] })
13611
+ ] }),
13612
+ video && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13613
+ "div",
13614
+ {
13615
+ "data-slot": "lesson-preview-player",
13616
+ className: "aspect-video w-full overflow-hidden rounded-xl border border-border bg-black",
13617
+ children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13618
+ "iframe",
13619
+ {
13620
+ src: video.embedUrl,
13621
+ title: `${labels.player}: ${lesson.title}`,
13622
+ allow: "accelerometer; gyroscope; autoplay; encrypted-media; picture-in-picture; fullscreen",
13623
+ allowFullScreen: true,
13624
+ loading: "lazy",
13625
+ referrerPolicy: "strict-origin-when-cross-origin",
13626
+ className: "size-full border-0"
13627
+ }
13628
+ )
13629
+ }
13630
+ ),
13631
+ hasBody && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { "data-slot": "lesson-preview-content", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13632
+ SafeHtml,
13633
+ {
13634
+ html: html5,
13635
+ headingOffset: headingLevel,
13636
+ className: slotClassName("", "text-muted-foreground", contentClassName)
13637
+ }
13638
+ ) })
13639
+ ]
13640
+ }
13641
+ );
13642
+ }
13643
+
13526
13644
  // src/components/treatment.tsx
13527
13645
  var import_utils3 = require("@reblu/site-ui/utils");
13528
13646
 
13529
13647
  // src/components/_page-parts.tsx
13530
13648
  var import_utils2 = require("@reblu/site-ui/utils");
13531
13649
  var import_button_variants = require("@reblu/site-ui/button-variants");
13532
- var import_jsx_runtime3 = require("react/jsx-runtime");
13650
+ var import_jsx_runtime4 = require("react/jsx-runtime");
13533
13651
  var KNOWN_BUTTON_VARIANTS = /* @__PURE__ */ new Set([
13534
13652
  "default",
13535
13653
  "destructive",
@@ -13542,11 +13660,11 @@ function toButtonVariant(variant) {
13542
13660
  return variant && KNOWN_BUTTON_VARIANTS.has(variant) ? variant : "default";
13543
13661
  }
13544
13662
  function PageHero({ page }) {
13545
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("header", { className: "space-y-4", children: [
13546
- page.category && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "inline-flex items-center rounded-full bg-secondary px-3 py-1 text-sm font-medium text-secondary-foreground", children: page.category.name }),
13547
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h1", { className: "text-4xl font-bold tracking-tight", children: page.title }),
13548
- page.subtitle && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-lg text-muted-foreground", children: page.subtitle }),
13549
- page.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13663
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("header", { className: "space-y-4", children: [
13664
+ page.category && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { className: "inline-flex items-center rounded-full bg-secondary px-3 py-1 text-sm font-medium text-secondary-foreground", children: page.category.name }),
13665
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h1", { className: "text-4xl font-bold tracking-tight", children: page.title }),
13666
+ page.subtitle && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "text-lg text-muted-foreground", children: page.subtitle }),
13667
+ page.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
13550
13668
  "img",
13551
13669
  {
13552
13670
  src: page.coverImageUrl,
@@ -13560,7 +13678,7 @@ function PageHero({ page }) {
13560
13678
  function SectionCta({ section }) {
13561
13679
  if (!section.ctaLabel || !section.ctaUrl) return null;
13562
13680
  const variant = toButtonVariant(section.ctaVariant);
13563
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13681
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
13564
13682
  "a",
13565
13683
  {
13566
13684
  href: section.ctaUrl,
@@ -13575,46 +13693,46 @@ function SectionCta({ section }) {
13575
13693
  }
13576
13694
  function SectionImages({ section }) {
13577
13695
  if (section.images.length === 0) return null;
13578
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: (0, import_utils2.cn)("grid gap-4", section.images.length > 1 ? "sm:grid-cols-2" : "grid-cols-1"), children: section.images.map((img) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("figure", { className: "space-y-1", children: [
13579
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("img", { src: img.url, alt: img.alt, loading: "lazy", className: "h-full w-full object-cover" }) }),
13580
- img.caption && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("figcaption", { className: "text-sm text-muted-foreground", children: img.caption })
13696
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: (0, import_utils2.cn)("grid gap-4", section.images.length > 1 ? "sm:grid-cols-2" : "grid-cols-1"), children: section.images.map((img) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("figure", { className: "space-y-1", children: [
13697
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("img", { src: img.url, alt: img.alt, loading: "lazy", className: "h-full w-full object-cover" }) }),
13698
+ img.caption && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("figcaption", { className: "text-sm text-muted-foreground", children: img.caption })
13581
13699
  ] }, `${img.url}-${img.order}`)) });
13582
13700
  }
13583
13701
  function PageSectionBlock({ section }) {
13584
13702
  const imageFirst = section.layout === "IMAGE_TEXT";
13585
13703
  const sideBySide = section.layout === "TEXT_IMAGE" || section.layout === "IMAGE_TEXT";
13586
13704
  const hasImages = section.images.length > 0;
13587
- const body3 = /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "space-y-4", children: [
13588
- section.heading && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h2", { className: "text-2xl font-bold", children: section.heading }),
13589
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SafeHtml, { html: sanitizeHtml(section.contentHtml), headingOffset: 2 }),
13590
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionCta, { section })
13705
+ const body3 = /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "space-y-4", children: [
13706
+ section.heading && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h2", { className: "text-2xl font-bold", children: section.heading }),
13707
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SafeHtml, { html: sanitizeHtml(section.contentHtml), headingOffset: 2 }),
13708
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionCta, { section })
13591
13709
  ] });
13592
13710
  if (sideBySide && hasImages) {
13593
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("section", { className: "grid items-center gap-8 md:grid-cols-2", children: imageFirst ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
13594
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionImages, { section }),
13711
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("section", { className: "grid items-center gap-8 md:grid-cols-2", children: imageFirst ? /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
13712
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionImages, { section }),
13595
13713
  body3
13596
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
13714
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
13597
13715
  body3,
13598
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionImages, { section })
13716
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionImages, { section })
13599
13717
  ] }) });
13600
13718
  }
13601
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("section", { className: "space-y-4", children: [
13719
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: "space-y-4", children: [
13602
13720
  body3,
13603
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionImages, { section })
13721
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(SectionImages, { section })
13604
13722
  ] });
13605
13723
  }
13606
13724
  function PageSectionList({ sections }) {
13607
13725
  if (sections.length === 0) return null;
13608
13726
  const ordered = sections.slice().sort((a, b2) => a.order - b2.order);
13609
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "space-y-12", children: ordered.map((section) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PageSectionBlock, { section }, section.id)) });
13727
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "space-y-12", children: ordered.map((section) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PageSectionBlock, { section }, section.id)) });
13610
13728
  }
13611
13729
 
13612
13730
  // src/components/treatment.tsx
13613
- var import_jsx_runtime4 = require("react/jsx-runtime");
13731
+ var import_jsx_runtime5 = require("react/jsx-runtime");
13614
13732
  function Treatment({ page, className }) {
13615
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("article", { className: (0, import_utils3.cn)("space-y-12", className), "data-slot": "treatment", children: [
13616
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PageHero, { page }),
13617
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PageSectionList, { sections: page.sections })
13733
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("article", { className: (0, import_utils3.cn)("space-y-12", className), "data-slot": "treatment", children: [
13734
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageHero, { page }),
13735
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageSectionList, { sections: page.sections })
13618
13736
  ] });
13619
13737
  }
13620
13738
 
@@ -13623,11 +13741,11 @@ var import_utils5 = require("@reblu/site-ui/utils");
13623
13741
 
13624
13742
  // src/components/page-card-grid.tsx
13625
13743
  var import_utils4 = require("@reblu/site-ui/utils");
13626
- var import_jsx_runtime5 = require("react/jsx-runtime");
13744
+ var import_jsx_runtime6 = require("react/jsx-runtime");
13627
13745
  var defaultPageHref = (page) => `/${page.slug}`;
13628
13746
  var pageKey = (page) => `${page.category?.slug ?? ""}/${page.slug}`;
13629
13747
  function PageCardGrid(props) {
13630
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageCardGridSection, { ...props });
13748
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PageCardGridSection, { ...props });
13631
13749
  }
13632
13750
  function PageCardGridSection({
13633
13751
  pages,
@@ -13638,15 +13756,15 @@ function PageCardGridSection({
13638
13756
  }) {
13639
13757
  if (pages.length === 0) return null;
13640
13758
  const showHeading = keepEmptyHeading ? heading !== void 0 : !!heading;
13641
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: (0, import_utils4.cn)("space-y-6", className), children: [
13642
- showHeading && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "text-2xl font-bold", children: heading }),
13643
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("ul", { className: "grid list-none grid-cols-1 gap-6 p-0 sm:grid-cols-2 lg:grid-cols-3", children: pages.map((page) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
13759
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("section", { className: (0, import_utils4.cn)("space-y-6", className), children: [
13760
+ showHeading && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h2", { className: "text-2xl font-bold", children: heading }),
13761
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "grid list-none grid-cols-1 gap-6 p-0 sm:grid-cols-2 lg:grid-cols-3", children: pages.map((page) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
13644
13762
  "a",
13645
13763
  {
13646
13764
  href: pageHref(page),
13647
13765
  className: "group flex h-full flex-col overflow-hidden rounded-lg border bg-card transition-shadow hover:shadow-lg",
13648
13766
  children: [
13649
- page.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "relative aspect-video overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
13767
+ page.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "relative aspect-video overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
13650
13768
  "img",
13651
13769
  {
13652
13770
  src: page.coverImageUrl,
@@ -13655,9 +13773,9 @@ function PageCardGridSection({
13655
13773
  className: "h-full w-full object-cover transition-transform group-hover:scale-105"
13656
13774
  }
13657
13775
  ) }),
13658
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13659
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "font-semibold leading-tight transition-colors group-hover:text-primary", children: page.title }),
13660
- page.excerpt && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: page.excerpt })
13776
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13777
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "font-semibold leading-tight transition-colors group-hover:text-primary", children: page.title }),
13778
+ page.excerpt && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: page.excerpt })
13661
13779
  ] })
13662
13780
  ]
13663
13781
  }
@@ -13666,7 +13784,7 @@ function PageCardGridSection({
13666
13784
  }
13667
13785
 
13668
13786
  // src/components/parent-page.tsx
13669
- var import_jsx_runtime6 = require("react/jsx-runtime");
13787
+ var import_jsx_runtime7 = require("react/jsx-runtime");
13670
13788
  var defaultChildPageHref = (slug) => `/${slug}`;
13671
13789
  function ParentPage({
13672
13790
  page,
@@ -13681,10 +13799,10 @@ function ParentPage({
13681
13799
  const pages = childPages ?? treatments ?? [];
13682
13800
  const hrefFor = childPageHref ?? treatmentHref ?? defaultChildPageHref;
13683
13801
  const label = childPagesLabel ?? treatmentsLabel ?? "Treatments";
13684
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("article", { className: (0, import_utils5.cn)("space-y-12", className), "data-slot": "specialty", children: [
13685
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PageHero, { page }),
13686
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PageSectionList, { sections: page.sections }),
13687
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
13802
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("article", { className: (0, import_utils5.cn)("space-y-12", className), "data-slot": "specialty", children: [
13803
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(PageHero, { page }),
13804
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(PageSectionList, { sections: page.sections }),
13805
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13688
13806
  PageCardGridSection,
13689
13807
  {
13690
13808
  pages,
@@ -13704,7 +13822,7 @@ var import_utils7 = require("@reblu/site-ui/utils");
13704
13822
 
13705
13823
  // src/components/professional-fields.tsx
13706
13824
  var import_utils6 = require("@reblu/site-ui/utils");
13707
- var import_jsx_runtime7 = require("react/jsx-runtime");
13825
+ var import_jsx_runtime8 = require("react/jsx-runtime");
13708
13826
  function ProfessionalFields({
13709
13827
  fields,
13710
13828
  variant = "profile",
@@ -13712,7 +13830,7 @@ function ProfessionalFields({
13712
13830
  }) {
13713
13831
  const shown = (fields ?? []).filter((f) => variant !== "card" || f.showOnCard);
13714
13832
  if (shown.length === 0) return null;
13715
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13833
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
13716
13834
  "dl",
13717
13835
  {
13718
13836
  className: (0, import_utils6.cn)(
@@ -13722,13 +13840,13 @@ function ProfessionalFields({
13722
13840
  ),
13723
13841
  "data-slot": "professional-fields",
13724
13842
  "data-variant": variant,
13725
- children: shown.map((field, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
13843
+ children: shown.map((field, index) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
13726
13844
  "div",
13727
13845
  {
13728
13846
  className: variant === "card" ? "flex justify-center gap-1" : "contents",
13729
13847
  children: [
13730
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("dt", { className: "text-muted-foreground", children: field.label }),
13731
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("dd", { className: "m-0 font-medium", children: field.value })
13848
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("dt", { className: "text-muted-foreground", children: field.label }),
13849
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("dd", { className: "m-0 font-medium", children: field.value })
13732
13850
  ]
13733
13851
  },
13734
13852
  `${field.label}-${index}`
@@ -13738,7 +13856,7 @@ function ProfessionalFields({
13738
13856
  }
13739
13857
 
13740
13858
  // src/components/profile-card.tsx
13741
- var import_jsx_runtime8 = require("react/jsx-runtime");
13859
+ var import_jsx_runtime9 = require("react/jsx-runtime");
13742
13860
  function initials(name) {
13743
13861
  return name.split(/\s+/).filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("");
13744
13862
  }
@@ -13753,7 +13871,7 @@ function ProfileCard({
13753
13871
  className
13754
13872
  }) {
13755
13873
  const NameTag = href ? "a" : "span";
13756
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
13874
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
13757
13875
  "article",
13758
13876
  {
13759
13877
  className: (0, import_utils7.cn)(
@@ -13762,7 +13880,7 @@ function ProfileCard({
13762
13880
  ),
13763
13881
  "data-slot": "profile-card",
13764
13882
  children: [
13765
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "relative h-24 w-24 overflow-hidden rounded-full bg-muted", children: imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("img", { src: imageUrl, alt: name, loading: "lazy", className: "h-full w-full object-cover" }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
13883
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "relative h-24 w-24 overflow-hidden rounded-full bg-muted", children: imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("img", { src: imageUrl, alt: name, loading: "lazy", className: "h-full w-full object-cover" }) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13766
13884
  "span",
13767
13885
  {
13768
13886
  className: "flex h-full w-full items-center justify-center text-2xl font-semibold text-muted-foreground",
@@ -13770,12 +13888,12 @@ function ProfileCard({
13770
13888
  children: initials(name)
13771
13889
  }
13772
13890
  ) }),
13773
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "space-y-1", children: [
13774
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: "text-lg font-semibold leading-tight", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(NameTag, { ...href ? { href, className: "transition-colors hover:text-primary" } : {}, children: name }) }),
13775
- role && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-sm text-muted-foreground", children: role })
13891
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "space-y-1", children: [
13892
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h3", { className: "text-lg font-semibold leading-tight", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(NameTag, { ...href ? { href, className: "transition-colors hover:text-primary" } : {}, children: name }) }),
13893
+ role && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-sm text-muted-foreground", children: role })
13776
13894
  ] }),
13777
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(ProfessionalFields, { fields, variant: "card" }),
13778
- specialties.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("ul", { className: "flex flex-wrap justify-center gap-1.5 p-0", children: specialties.map((s2) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
13895
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ProfessionalFields, { fields, variant: "card" }),
13896
+ specialties.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("ul", { className: "flex flex-wrap justify-center gap-1.5 p-0", children: specialties.map((s2) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13779
13897
  "li",
13780
13898
  {
13781
13899
  className: "inline-flex items-center rounded-full bg-secondary px-2.5 py-0.5 text-xs font-medium text-secondary-foreground",
@@ -13783,7 +13901,7 @@ function ProfileCard({
13783
13901
  },
13784
13902
  s2
13785
13903
  )) }),
13786
- bio && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "text-sm text-muted-foreground", children: bio })
13904
+ bio && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "text-sm text-muted-foreground", children: bio })
13787
13905
  ]
13788
13906
  }
13789
13907
  );
@@ -13791,11 +13909,11 @@ function ProfileCard({
13791
13909
 
13792
13910
  // src/components/product-card.tsx
13793
13911
  var import_utils8 = require("@reblu/site-ui/utils");
13794
- var import_jsx_runtime9 = require("react/jsx-runtime");
13912
+ var import_jsx_runtime10 = require("react/jsx-runtime");
13795
13913
  function ProductCard({ product, href, currencyCode = "EUR", locale, className }) {
13796
13914
  const image = product.images.find((i) => i.isPrimary) ?? product.images[0];
13797
13915
  const hasDiscount = product.comparePrice != null && product.comparePrice > product.price;
13798
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
13916
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
13799
13917
  "article",
13800
13918
  {
13801
13919
  className: (0, import_utils8.cn)(
@@ -13804,7 +13922,7 @@ function ProductCard({ product, href, currencyCode = "EUR", locale, className })
13804
13922
  ),
13805
13923
  "data-slot": "product-card",
13806
13924
  children: [
13807
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "relative aspect-square overflow-hidden bg-muted", children: image ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
13925
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "relative aspect-square overflow-hidden bg-muted", children: image ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13808
13926
  "img",
13809
13927
  {
13810
13928
  src: image.url,
@@ -13812,14 +13930,14 @@ function ProductCard({ product, href, currencyCode = "EUR", locale, className })
13812
13930
  loading: "lazy",
13813
13931
  className: "h-full w-full object-cover transition-transform group-hover:scale-105"
13814
13932
  }
13815
- ) : /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "flex h-full items-center justify-center text-4xl text-muted-foreground/30", "aria-hidden": "true", children: "\u{1F6CD}\uFE0F" }) }),
13816
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13817
- product.category && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "inline-flex w-fit items-center rounded-full bg-secondary px-2.5 py-0.5 text-xs font-medium text-secondary-foreground", children: product.category.name }),
13818
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("h3", { className: "text-base font-semibold leading-tight", children: href ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("a", { href, className: "transition-colors hover:text-primary", children: product.name }) : product.name }),
13819
- product.shortDescription && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: product.shortDescription }),
13820
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "mt-auto flex items-baseline gap-2 pt-2", children: [
13821
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-lg font-bold text-foreground", children: formatPrice(product.price, currencyCode, locale) }),
13822
- hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { className: "text-sm text-muted-foreground line-through", children: formatPrice(product.comparePrice, currencyCode, locale) })
13933
+ ) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "flex h-full items-center justify-center text-4xl text-muted-foreground/30", "aria-hidden": "true", children: "\u{1F6CD}\uFE0F" }) }),
13934
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13935
+ product.category && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "inline-flex w-fit items-center rounded-full bg-secondary px-2.5 py-0.5 text-xs font-medium text-secondary-foreground", children: product.category.name }),
13936
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h3", { className: "text-base font-semibold leading-tight", children: href ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("a", { href, className: "transition-colors hover:text-primary", children: product.name }) : product.name }),
13937
+ product.shortDescription && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: product.shortDescription }),
13938
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "mt-auto flex items-baseline gap-2 pt-2", children: [
13939
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-lg font-bold text-foreground", children: formatPrice(product.price, currencyCode, locale) }),
13940
+ hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "text-sm text-muted-foreground line-through", children: formatPrice(product.comparePrice, currencyCode, locale) })
13823
13941
  ] })
13824
13942
  ] })
13825
13943
  ]
@@ -14021,7 +14139,7 @@ var __iconNode8 = [
14021
14139
  var Truck = createLucideIcon("truck", __iconNode8);
14022
14140
 
14023
14141
  // src/components/product-trust-items.tsx
14024
- var import_jsx_runtime10 = require("react/jsx-runtime");
14142
+ var import_jsx_runtime11 = require("react/jsx-runtime");
14025
14143
  var DEFAULT_TRUST_ICONS = Object.freeze({
14026
14144
  shipping: Truck,
14027
14145
  returns: RotateCcw,
@@ -14055,9 +14173,9 @@ function ProductTrustItems({
14055
14173
  return [{ key: `${index}-${icon}`, Icon: Icon2, text: text3 }];
14056
14174
  });
14057
14175
  if (rows.length === 0) return null;
14058
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(List, { "data-slot": "product-trust-items", className: slotClassName("space-y-2.5", "", className), children: rows.map(({ key: key2, Icon: Icon2, text: text3 }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { className: slotClassName("flex items-center gap-3", "text-sm text-muted-foreground", itemClassName), children: [
14059
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Icon2, { "aria-hidden": "true", className: "h-4 w-4 shrink-0 text-foreground/60" }),
14060
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: text3 })
14176
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(List, { "data-slot": "product-trust-items", className: slotClassName("space-y-2.5", "", className), children: rows.map(({ key: key2, Icon: Icon2, text: text3 }) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("li", { className: slotClassName("flex items-center gap-3", "text-sm text-muted-foreground", itemClassName), children: [
14177
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Icon2, { "aria-hidden": "true", className: "h-4 w-4 shrink-0 text-foreground/60" }),
14178
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: text3 })
14061
14179
  ] }, key2)) });
14062
14180
  }
14063
14181
 
@@ -14065,7 +14183,7 @@ function ProductTrustItems({
14065
14183
  var import_utils11 = require("@reblu/site-ui/utils");
14066
14184
 
14067
14185
  // src/components/_heading.tsx
14068
- var import_jsx_runtime11 = require("react/jsx-runtime");
14186
+ var import_jsx_runtime12 = require("react/jsx-runtime");
14069
14187
  function nextHeadingLevel(level) {
14070
14188
  return Math.min(level + 1, 6);
14071
14189
  }
@@ -14075,11 +14193,11 @@ function Heading({
14075
14193
  children: children2
14076
14194
  }) {
14077
14195
  const Tag = `h${level}`;
14078
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Tag, { className, children: children2 });
14196
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Tag, { className, children: children2 });
14079
14197
  }
14080
14198
 
14081
14199
  // src/components/faq-accordion.tsx
14082
- var import_jsx_runtime12 = require("react/jsx-runtime");
14200
+ var import_jsx_runtime13 = require("react/jsx-runtime");
14083
14201
  function FaqAccordion({
14084
14202
  items,
14085
14203
  heading,
@@ -14090,18 +14208,18 @@ function FaqAccordion({
14090
14208
  }) {
14091
14209
  const visible = items.map((item, index) => ({ item, index })).filter(({ item }) => item.q.trim() !== "");
14092
14210
  if (visible.length === 0) return null;
14093
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: (0, import_utils11.cn)("space-y-4", className), "data-slot": "faq-accordion", children: [
14094
- heading && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Heading, { level: headingLevel, className: "text-2xl font-semibold tracking-tight", children: heading }),
14095
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "divide-y divide-border rounded-xl border border-border", children: visible.map(({ item, index }) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
14211
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: (0, import_utils11.cn)("space-y-4", className), "data-slot": "faq-accordion", children: [
14212
+ heading && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Heading, { level: headingLevel, className: "text-2xl font-semibold tracking-tight", children: heading }),
14213
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "divide-y divide-border rounded-xl border border-border", children: visible.map(({ item, index }) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
14096
14214
  "details",
14097
14215
  {
14098
14216
  className: "group px-4",
14099
14217
  "data-slot": "faq-item",
14100
14218
  ...defaultOpen.includes(index) ? { open: true } : {},
14101
14219
  children: [
14102
- /* @__PURE__ */ (0, import_jsx_runtime12.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: [
14103
- questionHeadingLevel ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Heading, { level: questionHeadingLevel, className: "text-base font-medium", children: item.q }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { children: item.q }),
14104
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14220
+ /* @__PURE__ */ (0, import_jsx_runtime13.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: [
14221
+ questionHeadingLevel ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Heading, { level: questionHeadingLevel, className: "text-base font-medium", children: item.q }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: item.q }),
14222
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14105
14223
  "span",
14106
14224
  {
14107
14225
  "aria-hidden": "true",
@@ -14110,7 +14228,7 @@ function FaqAccordion({
14110
14228
  }
14111
14229
  )
14112
14230
  ] }),
14113
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "whitespace-pre-line pb-4 text-muted-foreground", children: item.a })
14231
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "whitespace-pre-line pb-4 text-muted-foreground", children: item.a })
14114
14232
  ]
14115
14233
  },
14116
14234
  index
@@ -14120,7 +14238,7 @@ function FaqAccordion({
14120
14238
 
14121
14239
  // src/components/trust-badges.tsx
14122
14240
  var import_utils12 = require("@reblu/site-ui/utils");
14123
- var import_jsx_runtime13 = (
14241
+ var import_jsx_runtime14 = (
14124
14242
  // eslint-disable-next-line @next/next/no-img-element -- framework-agnostic SDK; the SITE owns image optimisation
14125
14243
  require("react/jsx-runtime")
14126
14244
  );
@@ -14163,7 +14281,7 @@ function safeLogoSrc(url) {
14163
14281
  function BadgeContent({ badge, logoClassName }) {
14164
14282
  const src = safeLogoSrc(badge.logoUrl);
14165
14283
  if (src) {
14166
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14284
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14167
14285
  "img",
14168
14286
  {
14169
14287
  src,
@@ -14173,7 +14291,7 @@ function BadgeContent({ badge, logoClassName }) {
14173
14291
  }
14174
14292
  );
14175
14293
  }
14176
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-sm font-medium", children: badge.name });
14294
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "text-sm font-medium", children: badge.name });
14177
14295
  }
14178
14296
  function TrustBadges({
14179
14297
  badges,
@@ -14201,14 +14319,14 @@ function TrustBadges({
14201
14319
  if (groups.length === 0) return null;
14202
14320
  const hasHeading = heading !== void 0 && heading !== null && heading !== "";
14203
14321
  const groupHeadingLevel = hasHeading ? nextHeadingLevel(headingLevel) : headingLevel;
14204
- const content = groups.map(({ type, groupHeading, items }) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
14322
+ const content = groups.map(({ type, groupHeading, items }) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
14205
14323
  "div",
14206
14324
  {
14207
14325
  "data-slot": "trust-badge-group",
14208
14326
  "data-type": type,
14209
14327
  className: (0, import_utils12.cn)("space-y-3", groupClassName),
14210
14328
  children: [
14211
- groupHeading ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14329
+ groupHeading ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14212
14330
  Heading,
14213
14331
  {
14214
14332
  level: groupHeadingLevel,
@@ -14220,30 +14338,30 @@ function TrustBadges({
14220
14338
  children: groupHeading
14221
14339
  }
14222
14340
  ) : null,
14223
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("ul", { className: (0, import_utils12.cn)("flex flex-wrap items-center gap-6", listClassName), children: items.map((badge) => {
14341
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("ul", { className: (0, import_utils12.cn)("flex flex-wrap items-center gap-6", listClassName), children: items.map((badge) => {
14224
14342
  const href = safeHref(badge.url);
14225
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("li", { children: href ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("a", { href, target: "_blank", rel: "noopener noreferrer", className: "inline-flex", children: [
14226
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(BadgeContent, { badge, logoClassName }),
14343
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("li", { children: href ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("a", { href, target: "_blank", rel: "noopener noreferrer", className: "inline-flex", children: [
14344
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(BadgeContent, { badge, logoClassName }),
14227
14345
  " ",
14228
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "sr-only", children: newWindowLabel })
14229
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(BadgeContent, { badge, logoClassName }) }, badge.id);
14346
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "sr-only", children: newWindowLabel })
14347
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(BadgeContent, { badge, logoClassName }) }, badge.id);
14230
14348
  }) })
14231
14349
  ]
14232
14350
  },
14233
14351
  type
14234
14352
  ));
14235
14353
  if (!hasHeading) {
14236
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { "data-slot": "trust-badges", className: (0, import_utils12.cn)("space-y-6", className), children: content });
14354
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { "data-slot": "trust-badges", className: (0, import_utils12.cn)("space-y-6", className), children: content });
14237
14355
  }
14238
14356
  const Tag = `h${headingLevel}`;
14239
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
14357
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
14240
14358
  "section",
14241
14359
  {
14242
14360
  "data-slot": "trust-badges",
14243
14361
  "aria-labelledby": headingId,
14244
14362
  className: (0, import_utils12.cn)("space-y-6", className),
14245
14363
  children: [
14246
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14364
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14247
14365
  Tag,
14248
14366
  {
14249
14367
  id: headingId,
@@ -14260,38 +14378,38 @@ function TrustBadges({
14260
14378
  // src/components/page-blocks.tsx
14261
14379
  var import_utils13 = require("@reblu/site-ui/utils");
14262
14380
  var import_button_variants2 = require("@reblu/site-ui/button-variants");
14263
- var import_jsx_runtime14 = require("react/jsx-runtime");
14381
+ var import_jsx_runtime15 = require("react/jsx-runtime");
14264
14382
  var ALIASES = {
14265
14383
  doctor_embed: "profile_embed",
14266
14384
  specialty_embed: "page_embed"
14267
14385
  };
14268
14386
  function HeroBlock({ block, headingLevel }) {
14269
14387
  const { title, subtitle, imageUrl } = block.data;
14270
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "space-y-4", children: [
14271
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
14272
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
14273
- imageUrl && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
14388
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "space-y-4", children: [
14389
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
14390
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
14391
+ imageUrl && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
14274
14392
  ] });
14275
14393
  }
14276
14394
  function RichtextBlock({ block, headingLevel }) {
14277
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
14395
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
14278
14396
  }
14279
14397
  function FaqBlock({ block }) {
14280
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(FaqAccordion, { items: block.data.items });
14398
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(FaqAccordion, { items: block.data.items });
14281
14399
  }
14282
14400
  function StatsBlock({ block }) {
14283
- return /* @__PURE__ */ (0, import_jsx_runtime14.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_runtime14.jsxs)("div", { className: "flex flex-col-reverse gap-1", children: [
14284
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
14285
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dd", { className: "text-3xl font-bold", children: item.value })
14401
+ return /* @__PURE__ */ (0, import_jsx_runtime15.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_runtime15.jsxs)("div", { className: "flex flex-col-reverse gap-1", children: [
14402
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
14403
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("dd", { className: "text-3xl font-bold", children: item.value })
14286
14404
  ] }, i)) });
14287
14405
  }
14288
14406
  function TestimonialBlock({ block }) {
14289
14407
  const { quote, author, role, avatarUrl } = block.data;
14290
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("figure", { className: "space-y-4", children: [
14291
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { children: quote }) }),
14292
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("figcaption", { className: "flex items-center gap-3", children: [
14408
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("figure", { className: "space-y-4", children: [
14409
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { children: quote }) }),
14410
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("figcaption", { className: "flex items-center gap-3", children: [
14293
14411
  avatarUrl && // eslint-disable-next-line @next/next/no-img-element
14294
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14412
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14295
14413
  "img",
14296
14414
  {
14297
14415
  src: avatarUrl,
@@ -14300,9 +14418,9 @@ function TestimonialBlock({ block }) {
14300
14418
  className: "h-10 w-10 rounded-full object-cover"
14301
14419
  }
14302
14420
  ),
14303
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { children: [
14304
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "font-semibold", children: author }),
14305
- role && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "block text-sm opacity-80", children: role })
14421
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
14422
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "font-semibold", children: author }),
14423
+ role && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "block text-sm opacity-80", children: role })
14306
14424
  ] })
14307
14425
  ] })
14308
14426
  ] });
@@ -14311,19 +14429,19 @@ function CtaSlotBlock(_props) {
14311
14429
  return null;
14312
14430
  }
14313
14431
  function FeatureListBlock({ block }) {
14314
- return /* @__PURE__ */ (0, import_jsx_runtime14.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_runtime14.jsx)("li", { children: item.text }, i)) });
14432
+ return /* @__PURE__ */ (0, import_jsx_runtime15.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_runtime15.jsx)("li", { children: item.text }, i)) });
14315
14433
  }
14316
14434
  function GalleryBlock({ block }) {
14317
14435
  const { images } = block.data;
14318
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14436
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14319
14437
  "div",
14320
14438
  {
14321
14439
  className: (0, import_utils13.cn)(
14322
14440
  "grid gap-4",
14323
14441
  images.length > 1 ? "sm:grid-cols-2 lg:grid-cols-3" : "grid-cols-1"
14324
14442
  ),
14325
- children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("figure", { className: "space-y-1", children: [
14326
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14443
+ children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("figure", { className: "space-y-1", children: [
14444
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14327
14445
  "img",
14328
14446
  {
14329
14447
  src: img.url,
@@ -14332,7 +14450,7 @@ function GalleryBlock({ block }) {
14332
14450
  className: "h-full w-full object-cover"
14333
14451
  }
14334
14452
  ) }),
14335
- img.caption && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("figcaption", { className: "text-sm opacity-80", children: img.caption })
14453
+ img.caption && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("figcaption", { className: "text-sm opacity-80", children: img.caption })
14336
14454
  ] }, `${img.url}-${i}`))
14337
14455
  }
14338
14456
  );
@@ -14342,13 +14460,13 @@ function EmbedCard({
14342
14460
  headingLevel,
14343
14461
  embedHref
14344
14462
  }) {
14345
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
14463
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
14346
14464
  "a",
14347
14465
  {
14348
14466
  href: embedHref(resolved),
14349
14467
  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",
14350
14468
  children: [
14351
- resolved.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14469
+ resolved.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14352
14470
  "img",
14353
14471
  {
14354
14472
  src: resolved.coverImageUrl,
@@ -14357,24 +14475,24 @@ function EmbedCard({
14357
14475
  className: "h-full w-full object-cover"
14358
14476
  }
14359
14477
  ) }),
14360
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "space-y-1 p-4", children: [
14361
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
14362
- resolved.role && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
14363
- resolved.excerpt && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("p", { className: "text-muted-foreground", children: resolved.excerpt })
14478
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "space-y-1 p-4", children: [
14479
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
14480
+ resolved.role && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
14481
+ resolved.excerpt && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-muted-foreground", children: resolved.excerpt })
14364
14482
  ] })
14365
14483
  ]
14366
14484
  }
14367
14485
  );
14368
14486
  }
14369
14487
  function PageEmbedBlock({ block, headingLevel, embedHref }) {
14370
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
14488
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
14371
14489
  }
14372
14490
  function ProfileEmbedBlock({
14373
14491
  block,
14374
14492
  headingLevel,
14375
14493
  embedHref
14376
14494
  }) {
14377
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
14495
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
14378
14496
  }
14379
14497
  var DEFAULT_RENDERERS = {
14380
14498
  hero: HeroBlock,
@@ -14431,7 +14549,7 @@ function toIdFragment(value) {
14431
14549
  function SectionCta2({ cta }) {
14432
14550
  if (!hasUsableCta(cta)) return null;
14433
14551
  const variant = toButtonVariant(cta.variant);
14434
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14552
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14435
14553
  "a",
14436
14554
  {
14437
14555
  href: cta.url,
@@ -14464,7 +14582,7 @@ function PageBlocks({
14464
14582
  const headingId = block.heading ? `${safePrefix}-${toIdFragment(block.id)}-heading` : void 0;
14465
14583
  const background = block.backgroundColor;
14466
14584
  return [
14467
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
14585
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
14468
14586
  "section",
14469
14587
  {
14470
14588
  "data-slot": "page-block",
@@ -14473,8 +14591,8 @@ function PageBlocks({
14473
14591
  style: surfaceStyle(background),
14474
14592
  className: (0, import_utils13.cn)("space-y-6", background && "rounded-xl px-6 py-10", sectionClassName),
14475
14593
  children: [
14476
- block.heading && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { id: headingId, children: block.heading }) }),
14477
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14594
+ block.heading && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { id: headingId, children: block.heading }) }),
14595
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14478
14596
  Renderer,
14479
14597
  {
14480
14598
  block,
@@ -14482,7 +14600,7 @@ function PageBlocks({
14482
14600
  embedHref
14483
14601
  }
14484
14602
  ),
14485
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SectionCta2, { cta: block.cta })
14603
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(SectionCta2, { cta: block.cta })
14486
14604
  ]
14487
14605
  },
14488
14606
  block.id
@@ -14490,12 +14608,12 @@ function PageBlocks({
14490
14608
  ];
14491
14609
  });
14492
14610
  if (sections.length === 0) return null;
14493
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: (0, import_utils13.cn)("space-y-12", className), "data-slot": "page-blocks", children: sections });
14611
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: (0, import_utils13.cn)("space-y-12", className), "data-slot": "page-blocks", children: sections });
14494
14612
  }
14495
14613
 
14496
14614
  // src/components/shop-filters.tsx
14497
14615
  var import_utils14 = require("@reblu/site-ui/utils");
14498
- var import_jsx_runtime15 = require("react/jsx-runtime");
14616
+ var import_jsx_runtime16 = require("react/jsx-runtime");
14499
14617
  var DEFAULT_SHOP_PRICE_BANDS = [
14500
14618
  { max: 2500 },
14501
14619
  { min: 2500, max: 5e3 },
@@ -14539,7 +14657,7 @@ function priceBandLabel(band, t, currencyCode, locale) {
14539
14657
  return "";
14540
14658
  }
14541
14659
  function OptionLink({ href, active, label, onActivate }) {
14542
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14660
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14543
14661
  "a",
14544
14662
  {
14545
14663
  href,
@@ -14557,9 +14675,9 @@ function OptionLink({ href, active, label, onActivate }) {
14557
14675
  );
14558
14676
  }
14559
14677
  function FilterFieldset({ legend, children: children2 }) {
14560
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("fieldset", { className: "space-y-2", children: [
14561
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
14562
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
14678
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("fieldset", { className: "space-y-2", children: [
14679
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
14680
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
14563
14681
  ] });
14564
14682
  }
14565
14683
  function ShopFilters({
@@ -14582,11 +14700,11 @@ function ShopFilters({
14582
14700
  if (!shouldRenderShopFilters(facets, active)) {
14583
14701
  return null;
14584
14702
  }
14585
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: (0, import_utils14.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
14703
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: (0, import_utils14.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
14586
14704
  visibleTaxonomies.map((axis) => {
14587
14705
  const activeSlug = active.taxonomy?.[axis.key];
14588
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(FilterFieldset, { legend: axis.label, children: [
14589
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14706
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(FilterFieldset, { legend: axis.label, children: [
14707
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14590
14708
  OptionLink,
14591
14709
  {
14592
14710
  href: hrefs.taxonomy(axis.key, void 0),
@@ -14601,7 +14719,7 @@ function ShopFilters({
14601
14719
  ),
14602
14720
  axis.terms.map((term) => {
14603
14721
  const isActive = activeSlug === term.slug;
14604
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14722
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14605
14723
  OptionLink,
14606
14724
  {
14607
14725
  href: hrefs.taxonomy(axis.key, isActive ? void 0 : term.slug),
@@ -14621,9 +14739,9 @@ function ShopFilters({
14621
14739
  }),
14622
14740
  visibleAttributes.map((attr) => {
14623
14741
  const activeValues = toValueArray(active.attr?.[attr.key]);
14624
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
14742
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
14625
14743
  const isActive = activeValues.includes(opt.value);
14626
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14744
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14627
14745
  OptionLink,
14628
14746
  {
14629
14747
  href: hrefs.attr(attr.key, opt.value),
@@ -14641,11 +14759,11 @@ function ShopFilters({
14641
14759
  );
14642
14760
  }) }, attr.key);
14643
14761
  }),
14644
- showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
14762
+ showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
14645
14763
  const isActive = active.priceMin === band.min && active.priceMax === band.max;
14646
14764
  const nextMin = isActive ? void 0 : band.min;
14647
14765
  const nextMax = isActive ? void 0 : band.max;
14648
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14766
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14649
14767
  OptionLink,
14650
14768
  {
14651
14769
  href: hrefs.price(nextMin, nextMax),
@@ -14656,7 +14774,7 @@ function ShopFilters({
14656
14774
  i
14657
14775
  );
14658
14776
  }) }),
14659
- hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14777
+ hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14660
14778
  OptionLink,
14661
14779
  {
14662
14780
  href: hrefs.onSale(!active.onSale),
@@ -14665,7 +14783,7 @@ function ShopFilters({
14665
14783
  onActivate: onChange ? () => onChange({ onSale: !active.onSale }) : void 0
14666
14784
  }
14667
14785
  ),
14668
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14786
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14669
14787
  "a",
14670
14788
  {
14671
14789
  href: hrefs.clearAll(),
@@ -14682,7 +14800,7 @@ function ShopFilters({
14682
14800
 
14683
14801
  // src/components/cart-line-list.tsx
14684
14802
  var import_utils15 = require("@reblu/site-ui/utils");
14685
- var import_jsx_runtime16 = require("react/jsx-runtime");
14803
+ var import_jsx_runtime17 = require("react/jsx-runtime");
14686
14804
  var DEFAULT_LABELS2 = {
14687
14805
  quantityLabel: "Cantidad",
14688
14806
  decrease: "Reducir cantidad",
@@ -14708,9 +14826,9 @@ function CartLineList({
14708
14826
  }) {
14709
14827
  const t = { ...DEFAULT_LABELS2, ...labels };
14710
14828
  const noticeContent = notice === true ? t.cancelledNotice : notice;
14711
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: (0, import_utils15.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
14712
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
14713
- noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14829
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: (0, import_utils15.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
14830
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
14831
+ noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14714
14832
  "div",
14715
14833
  {
14716
14834
  role: "status",
@@ -14719,33 +14837,33 @@ function CartLineList({
14719
14837
  children: noticeContent
14720
14838
  }
14721
14839
  ),
14722
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
14840
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
14723
14841
  const maxQty = item.maxStock ?? Infinity;
14724
14842
  const atMax = item.quantity >= maxQty;
14725
14843
  const atMin = item.quantity <= 1;
14726
14844
  const message = lineMessage?.(item);
14727
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
14845
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
14728
14846
  "li",
14729
14847
  {
14730
14848
  className: "flex gap-4 rounded-xl border border-border bg-card p-4",
14731
14849
  children: [
14732
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
14733
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "min-w-0 flex-1", children: [
14734
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
14735
- item.variantName && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
14736
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
14850
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
14851
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "min-w-0 flex-1", children: [
14852
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
14853
+ item.variantName && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
14854
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
14737
14855
  formatPrice(item.unitPrice, currencyCode, locale),
14738
14856
  " ",
14739
14857
  t.unitPriceSuffix
14740
14858
  ] }),
14741
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
14859
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
14742
14860
  "div",
14743
14861
  {
14744
14862
  role: "group",
14745
14863
  "aria-label": t.quantityLabel,
14746
14864
  className: "mt-3 flex items-center gap-3",
14747
14865
  children: [
14748
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14866
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14749
14867
  "button",
14750
14868
  {
14751
14869
  type: "button",
@@ -14756,8 +14874,8 @@ function CartLineList({
14756
14874
  children: "\u2212"
14757
14875
  }
14758
14876
  ),
14759
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
14760
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14877
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
14878
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14761
14879
  "button",
14762
14880
  {
14763
14881
  type: "button",
@@ -14768,7 +14886,7 @@ function CartLineList({
14768
14886
  children: "+"
14769
14887
  }
14770
14888
  ),
14771
- onRemove && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14889
+ onRemove && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14772
14890
  "button",
14773
14891
  {
14774
14892
  type: "button",
@@ -14781,7 +14899,7 @@ function CartLineList({
14781
14899
  ]
14782
14900
  }
14783
14901
  ),
14784
- message != null && message !== false && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14902
+ message != null && message !== false && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14785
14903
  "p",
14786
14904
  {
14787
14905
  className: "mt-2 text-sm text-destructive",
@@ -14790,7 +14908,7 @@ function CartLineList({
14790
14908
  }
14791
14909
  )
14792
14910
  ] }),
14793
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
14911
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
14794
14912
  ]
14795
14913
  },
14796
14914
  lineKey(item.productId, item.variantId)
@@ -14801,7 +14919,7 @@ function CartLineList({
14801
14919
 
14802
14920
  // src/components/cart-summary.tsx
14803
14921
  var import_utils16 = require("@reblu/site-ui/utils");
14804
- var import_jsx_runtime17 = require("react/jsx-runtime");
14922
+ var import_jsx_runtime18 = require("react/jsx-runtime");
14805
14923
  var DEFAULT_LABELS3 = {
14806
14924
  subtotal: "Subtotal",
14807
14925
  discountPrefix: "Descuento",
@@ -14831,37 +14949,37 @@ function CartSummary({
14831
14949
  const hasDiscount = Boolean(discountAmount && discountAmount > 0);
14832
14950
  const noticeContent = notice === true ? t.cancelledNotice : notice;
14833
14951
  const hasNotice = noticeContent != null && noticeContent !== false;
14834
- const breakdown = /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
14952
+ const breakdown = /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
14835
14953
  "dl",
14836
14954
  {
14837
14955
  className: (0, import_utils16.cn)("space-y-2 text-sm", !hasNotice && className),
14838
14956
  "data-slot": "cart-summary",
14839
14957
  children: [
14840
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14841
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("dt", { children: t.subtotal }),
14842
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
14958
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14959
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dt", { children: t.subtotal }),
14960
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
14843
14961
  ] }),
14844
- hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
14845
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("dt", { children: autoDiscount ? t.staffDiscountApplied : `${t.discountPrefix}${discountCode ? ` (${discountCode})` : ""}` }),
14846
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("dd", { children: [
14962
+ hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
14963
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dt", { children: autoDiscount ? t.staffDiscountApplied : `${t.discountPrefix}${discountCode ? ` (${discountCode})` : ""}` }),
14964
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("dd", { children: [
14847
14965
  "-",
14848
14966
  formatPrice(discountAmount, currencyCode, locale)
14849
14967
  ] })
14850
14968
  ] }),
14851
- shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14852
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("dt", { children: t.shipping }),
14853
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
14969
+ shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14970
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dt", { children: t.shipping }),
14971
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
14854
14972
  ] }),
14855
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
14856
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("dt", { children: t.total }),
14857
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
14973
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
14974
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dt", { children: t.total }),
14975
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
14858
14976
  ] })
14859
14977
  ]
14860
14978
  }
14861
14979
  );
14862
14980
  if (!hasNotice) return breakdown;
14863
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: (0, import_utils16.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
14864
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14981
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: (0, import_utils16.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
14982
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
14865
14983
  "div",
14866
14984
  {
14867
14985
  role: "status",
@@ -14876,7 +14994,7 @@ function CartSummary({
14876
14994
 
14877
14995
  // src/components/cart-adjustments-notice.tsx
14878
14996
  var import_utils17 = require("@reblu/site-ui/utils");
14879
- var import_jsx_runtime18 = require("react/jsx-runtime");
14997
+ var import_jsx_runtime19 = require("react/jsx-runtime");
14880
14998
  var DEFAULT_LABELS4 = {
14881
14999
  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.`,
14882
15000
  quantityChanged: (name, quantity) => `Hemos ajustado la cantidad de ${name} a ${quantity} por el stock disponible.`,
@@ -14910,20 +15028,20 @@ function CartAdjustmentsNotice({
14910
15028
  );
14911
15029
  }
14912
15030
  if (messages.length === 0) return null;
14913
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
15031
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14914
15032
  "div",
14915
15033
  {
14916
15034
  role: "status",
14917
15035
  className: (0, import_utils17.cn)("rounded-lg border border-border bg-muted px-3 py-2 text-sm", className),
14918
15036
  "data-slot": "cart-adjustments-notice",
14919
- children: messages.length === 1 ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { children: messages[0] }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("ul", { className: "list-disc space-y-1 pl-4", children: messages.map((message, index) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("li", { children: message }, index)) })
15037
+ children: messages.length === 1 ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { children: messages[0] }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("ul", { className: "list-disc space-y-1 pl-4", children: messages.map((message, index) => /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("li", { children: message }, index)) })
14920
15038
  }
14921
15039
  );
14922
15040
  }
14923
15041
 
14924
15042
  // src/components/added-to-cart-toast.tsx
14925
15043
  var import_utils18 = require("@reblu/site-ui/utils");
14926
- var import_jsx_runtime19 = (
15044
+ var import_jsx_runtime20 = (
14927
15045
  // eslint-disable-next-line @next/next/no-img-element -- toast content, not a Next <Image> layout context
14928
15046
  require("react/jsx-runtime")
14929
15047
  );
@@ -14946,7 +15064,7 @@ function AddedToCartToast({
14946
15064
  const message = status === "error" ? t.error : status === "outOfStock" ? t.outOfStock : t.success;
14947
15065
  const hasThumbnail = Boolean(imageUrl && imageUrl.trim().length > 0);
14948
15066
  const variant = status === "success" ? "success" : "error";
14949
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
15067
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
14950
15068
  "div",
14951
15069
  {
14952
15070
  "data-slot": "added-to-cart-toast",
@@ -14958,12 +15076,12 @@ function AddedToCartToast({
14958
15076
  className
14959
15077
  ),
14960
15078
  children: [
14961
- hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
14962
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "min-w-0 flex-1", children: [
14963
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
14964
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
15079
+ hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
15080
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "min-w-0 flex-1", children: [
15081
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
15082
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
14965
15083
  ] }),
14966
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
15084
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
14967
15085
  ]
14968
15086
  }
14969
15087
  );
@@ -14971,7 +15089,7 @@ function AddedToCartToast({
14971
15089
 
14972
15090
  // src/components/checkout-login-prompt.tsx
14973
15091
  var import_utils19 = require("@reblu/site-ui/utils");
14974
- var import_jsx_runtime20 = require("react/jsx-runtime");
15092
+ var import_jsx_runtime21 = require("react/jsx-runtime");
14975
15093
  var DEFAULT_LABELS6 = {
14976
15094
  title: "Identificaci\xF3n",
14977
15095
  description: "Introduce tu email para agilizar el proceso o contin\xFAa como invitado.",
@@ -14998,9 +15116,9 @@ function CheckoutLoginPrompt({
14998
15116
  if (!open) return null;
14999
15117
  const t = { ...DEFAULT_LABELS6, ...labels };
15000
15118
  const isValidEmail = EMAIL_PATTERN.test(email.trim());
15001
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
15002
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
15003
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
15119
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
15120
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
15121
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15004
15122
  "div",
15005
15123
  {
15006
15124
  role: "dialog",
@@ -15012,12 +15130,12 @@ function CheckoutLoginPrompt({
15012
15130
  className
15013
15131
  ),
15014
15132
  children: [
15015
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
15016
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { children: [
15017
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
15018
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
15133
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
15134
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { children: [
15135
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
15136
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
15019
15137
  ] }),
15020
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15138
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15021
15139
  "button",
15022
15140
  {
15023
15141
  type: "button",
@@ -15028,9 +15146,9 @@ function CheckoutLoginPrompt({
15028
15146
  }
15029
15147
  )
15030
15148
  ] }),
15031
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-2", children: [
15032
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
15033
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15149
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-2", children: [
15150
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
15151
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15034
15152
  "input",
15035
15153
  {
15036
15154
  id: "checkout-login-prompt-email",
@@ -15045,10 +15163,10 @@ function CheckoutLoginPrompt({
15045
15163
  )
15046
15164
  }
15047
15165
  ),
15048
- error && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-xs text-destructive", children: error })
15166
+ error && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-xs text-destructive", children: error })
15049
15167
  ] }),
15050
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-2", children: [
15051
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15168
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-2", children: [
15169
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15052
15170
  "button",
15053
15171
  {
15054
15172
  type: "button",
@@ -15061,7 +15179,7 @@ function CheckoutLoginPrompt({
15061
15179
  children: checking ? t.checking : t.continueWithEmail
15062
15180
  }
15063
15181
  ),
15064
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15182
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15065
15183
  "button",
15066
15184
  {
15067
15185
  type: "button",
@@ -15080,7 +15198,7 @@ function CheckoutLoginPrompt({
15080
15198
  // src/components/checkout-form.tsx
15081
15199
  var import_utils20 = require("@reblu/site-ui/utils");
15082
15200
  var import_phone_input = require("@reblu/site-ui/phone-input");
15083
- var import_jsx_runtime21 = require("react/jsx-runtime");
15201
+ var import_jsx_runtime22 = require("react/jsx-runtime");
15084
15202
  var DEFAULT_LABELS7 = {
15085
15203
  contactTitle: "Datos de contacto",
15086
15204
  nameLabel: "Nombre completo",
@@ -15136,9 +15254,9 @@ function CheckoutForm({
15136
15254
  event.preventDefault();
15137
15255
  if (discountCode.trim() && !discountApplying) onApplyDiscount();
15138
15256
  }
15139
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_jsx_runtime21.Fragment, { children: [
15257
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
15140
15258
  loginPrompt,
15141
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15259
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15142
15260
  "form",
15143
15261
  {
15144
15262
  "data-testid": "checkout-form",
@@ -15146,12 +15264,12 @@ function CheckoutForm({
15146
15264
  className: (0, import_utils20.cn)("space-y-8", className),
15147
15265
  "data-slot": "checkout-form",
15148
15266
  children: [
15149
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("section", { className: "space-y-4", children: [
15150
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
15151
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15152
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-1", children: [
15153
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
15154
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15267
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("section", { className: "space-y-4", children: [
15268
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
15269
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15270
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-1", children: [
15271
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
15272
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15155
15273
  "input",
15156
15274
  {
15157
15275
  id: "checkout-form-name",
@@ -15166,11 +15284,11 @@ function CheckoutForm({
15166
15284
  )
15167
15285
  }
15168
15286
  ),
15169
- contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
15287
+ contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
15170
15288
  ] }),
15171
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "space-y-1", children: [
15172
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
15173
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15289
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-1", children: [
15290
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
15291
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15174
15292
  "input",
15175
15293
  {
15176
15294
  id: "checkout-form-email",
@@ -15185,9 +15303,9 @@ function CheckoutForm({
15185
15303
  )
15186
15304
  }
15187
15305
  ),
15188
- contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
15306
+ contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
15189
15307
  ] }),
15190
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15308
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15191
15309
  import_phone_input.PhoneInput,
15192
15310
  {
15193
15311
  id: "checkout-form-phone",
@@ -15201,26 +15319,26 @@ function CheckoutForm({
15201
15319
  ] })
15202
15320
  ] }),
15203
15321
  children2,
15204
- generalError ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
15205
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("section", { className: "space-y-3", children: [
15206
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
15207
- autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
15322
+ generalError ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
15323
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("section", { className: "space-y-3", children: [
15324
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
15325
+ autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
15208
15326
  "div",
15209
15327
  {
15210
15328
  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",
15211
15329
  "data-slot": "checkout-staff-discount",
15212
15330
  children: [
15213
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "font-semibold", children: t.staffDiscountApplied }),
15214
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(autoDiscount.amount, currencyCode, locale)) })
15331
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "font-semibold", children: t.staffDiscountApplied }),
15332
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(autoDiscount.amount, currencyCode, locale)) })
15215
15333
  ]
15216
15334
  }
15217
15335
  ) : null,
15218
- appliedDiscount && !autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime21.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: [
15219
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
15220
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
15221
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
15336
+ appliedDiscount && !autoDiscount ? /* @__PURE__ */ (0, import_jsx_runtime22.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: [
15337
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
15338
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
15339
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
15222
15340
  ] }),
15223
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15341
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15224
15342
  "button",
15225
15343
  {
15226
15344
  type: "button",
@@ -15230,9 +15348,9 @@ function CheckoutForm({
15230
15348
  children: t.removeDiscount
15231
15349
  }
15232
15350
  )
15233
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "flex gap-2", children: [
15234
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
15235
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15351
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex gap-2", children: [
15352
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
15353
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15236
15354
  "input",
15237
15355
  {
15238
15356
  id: "checkout-form-discount-code",
@@ -15244,7 +15362,7 @@ function CheckoutForm({
15244
15362
  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"
15245
15363
  }
15246
15364
  ),
15247
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15365
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15248
15366
  "button",
15249
15367
  {
15250
15368
  type: "button",
@@ -15255,9 +15373,9 @@ function CheckoutForm({
15255
15373
  }
15256
15374
  )
15257
15375
  ] }),
15258
- discountError && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-xs text-destructive", children: discountError })
15376
+ discountError && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-xs text-destructive", children: discountError })
15259
15377
  ] }),
15260
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
15378
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15261
15379
  "button",
15262
15380
  {
15263
15381
  type: "submit",
@@ -15280,7 +15398,7 @@ var import_utils22 = require("@reblu/site-ui/utils");
15280
15398
 
15281
15399
  // src/components/order-invoice-link.tsx
15282
15400
  var import_utils21 = require("@reblu/site-ui/utils");
15283
- var import_jsx_runtime22 = require("react/jsx-runtime");
15401
+ var import_jsx_runtime23 = require("react/jsx-runtime");
15284
15402
  var DEFAULT_LABELS8 = {
15285
15403
  linkLabel: "Descargar la factura {number}",
15286
15404
  signInHint: "Te pediremos que inicies sesi\xF3n para abrirla."
@@ -15288,8 +15406,8 @@ var DEFAULT_LABELS8 = {
15288
15406
  function OrderInvoiceLink({ invoice, labels, className }) {
15289
15407
  if (!invoice) return null;
15290
15408
  const t = { ...DEFAULT_LABELS8, ...labels };
15291
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: (0, import_utils21.cn)("space-y-1 text-sm", className), "data-slot": "order-invoice-link", children: [
15292
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
15409
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: (0, import_utils21.cn)("space-y-1 text-sm", className), "data-slot": "order-invoice-link", children: [
15410
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15293
15411
  "a",
15294
15412
  {
15295
15413
  href: invoice.url,
@@ -15297,12 +15415,12 @@ function OrderInvoiceLink({ invoice, labels, className }) {
15297
15415
  children: t.linkLabel.replace("{number}", invoice.number)
15298
15416
  }
15299
15417
  ),
15300
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-muted-foreground", children: t.signInHint })
15418
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-muted-foreground", children: t.signInHint })
15301
15419
  ] });
15302
15420
  }
15303
15421
 
15304
15422
  // src/components/order-confirmation.tsx
15305
- var import_jsx_runtime23 = require("react/jsx-runtime");
15423
+ var import_jsx_runtime24 = require("react/jsx-runtime");
15306
15424
  var DEFAULT_LABELS9 = {
15307
15425
  pollingTitle: "Confirmando tu pedido\u2026",
15308
15426
  pollingDescription: "Estamos procesando el pago, un momento\u2026",
@@ -15368,43 +15486,43 @@ function OrderConfirmation({
15368
15486
  const showOrderReference = Boolean(order) && !showFullOrderSummary && (status === "refunded" || status === "partially_refunded" || status === "pending_timeout");
15369
15487
  const showSessionReference = !order && sessionId && (status === "timeout" || status === "not_found" || status === "pending_timeout");
15370
15488
  const showRecheck = (status === "pending_timeout" || status === "error") && onRecheck;
15371
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: (0, import_utils22.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
15372
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("h1", { className: "text-3xl font-bold", children: title }),
15373
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
15374
- showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-6", children: [
15375
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15376
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
15377
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15489
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: (0, import_utils22.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
15490
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("h1", { className: "text-3xl font-bold", children: title }),
15491
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
15492
+ showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-6", children: [
15493
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15494
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
15495
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15378
15496
  ] }),
15379
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
15380
- order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
15497
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
15498
+ order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
15381
15499
  "div",
15382
15500
  {
15383
15501
  className: "flex justify-between gap-4 text-sm",
15384
15502
  children: [
15385
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
15503
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
15386
15504
  item.product.name,
15387
15505
  item.variant ? ` (${item.variant.name})` : "",
15388
15506
  " x",
15389
15507
  item.quantity
15390
15508
  ] }),
15391
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
15509
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
15392
15510
  ]
15393
15511
  },
15394
15512
  idx
15395
15513
  )),
15396
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
15397
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: t.totalLabel }),
15398
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
15514
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
15515
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: t.totalLabel }),
15516
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
15399
15517
  ] }) })
15400
15518
  ] }),
15401
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
15519
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
15402
15520
  t.confirmationEmailPrefix,
15403
15521
  " ",
15404
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
15522
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
15405
15523
  "."
15406
15524
  ] }),
15407
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15525
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15408
15526
  OrderInvoiceLink,
15409
15527
  {
15410
15528
  invoice: order.invoice,
@@ -15412,11 +15530,11 @@ function OrderConfirmation({
15412
15530
  }
15413
15531
  )
15414
15532
  ] }),
15415
- showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15416
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
15417
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15533
+ showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15534
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
15535
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15418
15536
  ] }),
15419
- status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15537
+ status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15420
15538
  "a",
15421
15539
  {
15422
15540
  href: cartHref,
@@ -15424,7 +15542,7 @@ function OrderConfirmation({
15424
15542
  children: t.backToCartLabel
15425
15543
  }
15426
15544
  ),
15427
- showRecheck && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15545
+ showRecheck && /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15428
15546
  "button",
15429
15547
  {
15430
15548
  type: "button",
@@ -15433,16 +15551,16 @@ function OrderConfirmation({
15433
15551
  children: t.recheckLabel
15434
15552
  }
15435
15553
  ),
15436
- showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15437
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
15438
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
15554
+ showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15555
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
15556
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
15439
15557
  ] })
15440
15558
  ] });
15441
15559
  }
15442
15560
 
15443
15561
  // src/components/full-invoice-fields.tsx
15444
15562
  var import_utils23 = require("@reblu/site-ui/utils");
15445
- var import_jsx_runtime24 = require("react/jsx-runtime");
15563
+ var import_jsx_runtime25 = require("react/jsx-runtime");
15446
15564
  var EMPTY_FULL_INVOICE_VALUE = {
15447
15565
  wantsFullInvoice: false,
15448
15566
  billingIdType: "NIF",
@@ -15559,12 +15677,12 @@ function FullInvoiceFields({
15559
15677
  const showFields = value.wantsFullInvoice || overCap;
15560
15678
  const isSpanishNif = value.billingIdType === "NIF";
15561
15679
  const set = (key2, next2) => onChange({ ...value, [key2]: next2 });
15562
- const error = (key2) => errors[key2] ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { id: `full-invoice-${key2}-error`, className: "text-sm text-destructive", children: errors[key2] }) : null;
15680
+ const error = (key2) => errors[key2] ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { id: `full-invoice-${key2}-error`, className: "text-sm text-destructive", children: errors[key2] }) : null;
15563
15681
  const invalid2 = (key2) => errors[key2] ? { "aria-invalid": true, "aria-describedby": `full-invoice-${key2}-error` } : {};
15564
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("section", { className: (0, import_utils23.cn)("space-y-4", className), "data-slot": "full-invoice-fields", children: [
15565
- overCap ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { role: "note", className: "rounded-lg border border-border p-4 text-sm", children: t.overCapNotice }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15566
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
15567
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15682
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("section", { className: (0, import_utils23.cn)("space-y-4", className), "data-slot": "full-invoice-fields", children: [
15683
+ overCap ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { role: "note", className: "rounded-lg border border-border p-4 text-sm", children: t.overCapNotice }) : /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15684
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
15685
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15568
15686
  "input",
15569
15687
  {
15570
15688
  type: "checkbox",
@@ -15574,12 +15692,12 @@ function FullInvoiceFields({
15574
15692
  ),
15575
15693
  t.toggle
15576
15694
  ] }),
15577
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("p", { className: "text-sm text-muted-foreground", children: t.underCapNotice })
15695
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("p", { className: "text-sm text-muted-foreground", children: t.underCapNotice })
15578
15696
  ] }),
15579
- showFields && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15580
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15581
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-id-type", className: "text-sm font-medium", children: t.idType }),
15582
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15697
+ showFields && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15698
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15699
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-id-type", className: "text-sm font-medium", children: t.idType }),
15700
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15583
15701
  "select",
15584
15702
  {
15585
15703
  id: "full-invoice-id-type",
@@ -15588,14 +15706,14 @@ function FullInvoiceFields({
15588
15706
  value: value.billingIdType,
15589
15707
  onChange: (e) => set("billingIdType", e.target.value),
15590
15708
  ...invalid2("billingIdType"),
15591
- children: ID_TYPES.map((type) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("option", { value: type, children: t.idTypeOptions[type] }, type))
15709
+ children: ID_TYPES.map((type) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("option", { value: type, children: t.idTypeOptions[type] }, type))
15592
15710
  }
15593
15711
  ),
15594
15712
  error("billingIdType")
15595
15713
  ] }),
15596
- !isSpanishNif && /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15597
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-id-country", className: "text-sm font-medium", children: t.idCountry }),
15598
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
15714
+ !isSpanishNif && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15715
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-id-country", className: "text-sm font-medium", children: t.idCountry }),
15716
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
15599
15717
  "select",
15600
15718
  {
15601
15719
  id: "full-invoice-id-country",
@@ -15605,16 +15723,16 @@ function FullInvoiceFields({
15605
15723
  onChange: (e) => set("billingIdCountry", e.target.value),
15606
15724
  ...invalid2("billingIdCountry"),
15607
15725
  children: [
15608
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("option", { value: "", disabled: true, children: t.chooseCountry }),
15609
- countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("option", { value: c.code, children: c.name }, c.code))
15726
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("option", { value: "", disabled: true, children: t.chooseCountry }),
15727
+ countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("option", { value: c.code, children: c.name }, c.code))
15610
15728
  ]
15611
15729
  }
15612
15730
  ),
15613
15731
  error("billingIdCountry")
15614
15732
  ] }),
15615
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15616
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-nif", className: "text-sm font-medium", children: isSpanishNif ? t.spanishNif : t.documentNumber }),
15617
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15733
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15734
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-nif", className: "text-sm font-medium", children: isSpanishNif ? t.spanishNif : t.documentNumber }),
15735
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15618
15736
  "input",
15619
15737
  {
15620
15738
  id: "full-invoice-nif",
@@ -15627,9 +15745,9 @@ function FullInvoiceFields({
15627
15745
  ),
15628
15746
  error("billingNif")
15629
15747
  ] }),
15630
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15631
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-name", className: "text-sm font-medium", children: t.name }),
15632
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15748
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15749
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-name", className: "text-sm font-medium", children: t.name }),
15750
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15633
15751
  "input",
15634
15752
  {
15635
15753
  id: "full-invoice-name",
@@ -15642,9 +15760,9 @@ function FullInvoiceFields({
15642
15760
  ),
15643
15761
  error("billingName")
15644
15762
  ] }),
15645
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1 sm:col-span-2", children: [
15646
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-street", className: "text-sm font-medium", children: t.street }),
15647
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15763
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1 sm:col-span-2", children: [
15764
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-street", className: "text-sm font-medium", children: t.street }),
15765
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15648
15766
  "input",
15649
15767
  {
15650
15768
  id: "full-invoice-street",
@@ -15656,9 +15774,9 @@ function FullInvoiceFields({
15656
15774
  }
15657
15775
  )
15658
15776
  ] }),
15659
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15660
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-postal-code", className: "text-sm font-medium", children: t.postalCode }),
15661
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15777
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15778
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-postal-code", className: "text-sm font-medium", children: t.postalCode }),
15779
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15662
15780
  "input",
15663
15781
  {
15664
15782
  id: "full-invoice-postal-code",
@@ -15669,9 +15787,9 @@ function FullInvoiceFields({
15669
15787
  }
15670
15788
  )
15671
15789
  ] }),
15672
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15673
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-city", className: "text-sm font-medium", children: t.city }),
15674
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15790
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15791
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-city", className: "text-sm font-medium", children: t.city }),
15792
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15675
15793
  "input",
15676
15794
  {
15677
15795
  id: "full-invoice-city",
@@ -15682,9 +15800,9 @@ function FullInvoiceFields({
15682
15800
  }
15683
15801
  )
15684
15802
  ] }),
15685
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "space-y-1", children: [
15686
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("label", { htmlFor: "full-invoice-country", className: "text-sm font-medium", children: t.country }),
15687
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
15803
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "space-y-1", children: [
15804
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("label", { htmlFor: "full-invoice-country", className: "text-sm font-medium", children: t.country }),
15805
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
15688
15806
  "select",
15689
15807
  {
15690
15808
  id: "full-invoice-country",
@@ -15692,11 +15810,11 @@ function FullInvoiceFields({
15692
15810
  required: true,
15693
15811
  value: value.country,
15694
15812
  onChange: (e) => set("country", e.target.value),
15695
- children: countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("option", { value: c.code, children: c.name }, c.code))
15813
+ children: countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("option", { value: c.code, children: c.name }, c.code))
15696
15814
  }
15697
15815
  )
15698
15816
  ] }),
15699
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("div", { className: "sm:col-span-2", children: error("address") })
15817
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "sm:col-span-2", children: error("address") })
15700
15818
  ] })
15701
15819
  ] });
15702
15820
  }
@@ -15715,6 +15833,7 @@ var import_site_contracts = require("@reblu/site-contracts");
15715
15833
  CourseDescription,
15716
15834
  DATA_REQUEST_TYPES,
15717
15835
  DEFAULT_INVOICE_COUNTRIES,
15836
+ DEFAULT_LESSON_PREVIEW_LABELS,
15718
15837
  DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
15719
15838
  DEFAULT_SHOP_ERROR_MESSAGES,
15720
15839
  DEFAULT_SHOP_PRICE_BANDS,
@@ -15724,6 +15843,7 @@ var import_site_contracts = require("@reblu/site-contracts");
15724
15843
  EMPTY_FULL_INVOICE_VALUE,
15725
15844
  FaqAccordion,
15726
15845
  FullInvoiceFields,
15846
+ LessonPreview,
15727
15847
  MarkdownRenderer,
15728
15848
  OrderConfirmation,
15729
15849
  OrderInvoiceLink,