@reblu/site-blocks 0.8.0 → 0.10.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.js CHANGED
@@ -55,6 +55,33 @@ function getShopErrorMessage(code, overrides, fallback = DEFAULT_SHOP_ERROR_FALL
55
55
  return messages[code] ?? fallback;
56
56
  }
57
57
 
58
+ // src/lib/block-order.ts
59
+ function sortBlocksByOrder(blocks) {
60
+ return [...blocks].sort((a, b2) => a.order - b2.order);
61
+ }
62
+
63
+ // src/lib/faq-json-ld.ts
64
+ function normaliseText(value) {
65
+ return value.replace(/\s+/g, " ").trim();
66
+ }
67
+ function buildFaqPageJsonLd(items) {
68
+ const mainEntity = [];
69
+ for (const item of items) {
70
+ const name = normaliseText(item.q);
71
+ const text3 = normaliseText(item.a);
72
+ if (!name || !text3) continue;
73
+ mainEntity.push({ "@type": "Question", name, acceptedAnswer: { "@type": "Answer", text: text3 } });
74
+ }
75
+ if (mainEntity.length === 0) return null;
76
+ return { "@context": "https://schema.org", "@type": "FAQPage", mainEntity };
77
+ }
78
+ function collectFaqItems(blocks) {
79
+ if (!blocks) return [];
80
+ return sortBlocksByOrder(blocks).flatMap(
81
+ (block) => block.blockType === "faq" ? block.data.items : []
82
+ );
83
+ }
84
+
58
85
  // ../../node_modules/.pnpm/devlop@1.1.0/node_modules/devlop/lib/default.js
59
86
  function ok() {
60
87
  }
@@ -13300,25 +13327,32 @@ function Treatment({ page, className }) {
13300
13327
  ] });
13301
13328
  }
13302
13329
 
13303
- // src/components/specialty.tsx
13330
+ // src/components/parent-page.tsx
13304
13331
  import { cn as cn4 } from "@reblu/site-ui/utils";
13305
13332
  import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
13306
- function Specialty({
13333
+ var defaultChildPageHref = (slug) => `/${slug}`;
13334
+ function ParentPage({
13307
13335
  page,
13308
- treatments = [],
13309
- treatmentHref = (slug) => `/${slug}`,
13310
- treatmentsLabel = "Treatments",
13336
+ childPages,
13337
+ childPageHref,
13338
+ childPagesLabel,
13339
+ treatments,
13340
+ treatmentHref,
13341
+ treatmentsLabel,
13311
13342
  className
13312
13343
  }) {
13344
+ const pages = childPages ?? treatments ?? [];
13345
+ const hrefFor = childPageHref ?? treatmentHref ?? defaultChildPageHref;
13346
+ const label = childPagesLabel ?? treatmentsLabel ?? "Treatments";
13313
13347
  return /* @__PURE__ */ jsxs3("article", { className: cn4("space-y-12", className), "data-slot": "specialty", children: [
13314
13348
  /* @__PURE__ */ jsx4(PageHero, { page }),
13315
13349
  /* @__PURE__ */ jsx4(PageSectionList, { sections: page.sections }),
13316
- treatments.length > 0 && /* @__PURE__ */ jsxs3("section", { className: "space-y-6", children: [
13317
- /* @__PURE__ */ jsx4("h2", { className: "text-2xl font-bold", children: treatmentsLabel }),
13318
- /* @__PURE__ */ jsx4("ul", { className: "grid list-none grid-cols-1 gap-6 p-0 sm:grid-cols-2 lg:grid-cols-3", children: treatments.map((t) => /* @__PURE__ */ jsx4("li", { children: /* @__PURE__ */ jsxs3(
13350
+ pages.length > 0 && /* @__PURE__ */ jsxs3("section", { className: "space-y-6", children: [
13351
+ /* @__PURE__ */ jsx4("h2", { className: "text-2xl font-bold", children: label }),
13352
+ /* @__PURE__ */ jsx4("ul", { className: "grid list-none grid-cols-1 gap-6 p-0 sm:grid-cols-2 lg:grid-cols-3", children: pages.map((t) => /* @__PURE__ */ jsx4("li", { children: /* @__PURE__ */ jsxs3(
13319
13353
  "a",
13320
13354
  {
13321
- href: treatmentHref(t.slug),
13355
+ href: hrefFor(t.slug),
13322
13356
  className: "group flex h-full flex-col overflow-hidden rounded-lg border bg-card transition-shadow hover:shadow-lg",
13323
13357
  children: [
13324
13358
  t.coverImageUrl && /* @__PURE__ */ jsx4("div", { className: "relative aspect-video overflow-hidden bg-muted", children: /* @__PURE__ */ jsx4(
@@ -13341,6 +13375,9 @@ function Specialty({
13341
13375
  ] });
13342
13376
  }
13343
13377
 
13378
+ // src/components/specialty.tsx
13379
+ var Specialty = ParentPage;
13380
+
13344
13381
  // src/components/profile-card.tsx
13345
13382
  import { cn as cn5 } from "@reblu/site-ui/utils";
13346
13383
  import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
@@ -13421,9 +13458,302 @@ function ProductCard({ product, href, currencyCode = "EUR", locale, className })
13421
13458
  );
13422
13459
  }
13423
13460
 
13424
- // src/components/shop-filters.tsx
13461
+ // src/components/faq-accordion.tsx
13425
13462
  import { cn as cn7 } from "@reblu/site-ui/utils";
13426
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
13463
+
13464
+ // src/components/_heading.tsx
13465
+ import { jsx as jsx7 } from "react/jsx-runtime";
13466
+ function nextHeadingLevel(level) {
13467
+ return Math.min(level + 1, 6);
13468
+ }
13469
+ function Heading({
13470
+ level,
13471
+ className,
13472
+ children: children2
13473
+ }) {
13474
+ const Tag = `h${level}`;
13475
+ return /* @__PURE__ */ jsx7(Tag, { className, children: children2 });
13476
+ }
13477
+
13478
+ // src/components/faq-accordion.tsx
13479
+ import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
13480
+ function FaqAccordion({
13481
+ items,
13482
+ heading,
13483
+ headingLevel = 2,
13484
+ questionHeadingLevel,
13485
+ defaultOpen = [],
13486
+ className
13487
+ }) {
13488
+ const visible = items.map((item, index) => ({ item, index })).filter(({ item }) => item.q.trim() !== "");
13489
+ if (visible.length === 0) return null;
13490
+ return /* @__PURE__ */ jsxs6("div", { className: cn7("space-y-4", className), "data-slot": "faq-accordion", children: [
13491
+ heading && /* @__PURE__ */ jsx8(Heading, { level: headingLevel, className: "text-2xl font-semibold tracking-tight", children: heading }),
13492
+ /* @__PURE__ */ jsx8("div", { className: "divide-y divide-border rounded-xl border border-border", children: visible.map(({ item, index }) => /* @__PURE__ */ jsxs6(
13493
+ "details",
13494
+ {
13495
+ className: "group px-4",
13496
+ "data-slot": "faq-item",
13497
+ ...defaultOpen.includes(index) ? { open: true } : {},
13498
+ children: [
13499
+ /* @__PURE__ */ jsxs6("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: [
13500
+ questionHeadingLevel ? /* @__PURE__ */ jsx8(Heading, { level: questionHeadingLevel, className: "text-base font-medium", children: item.q }) : /* @__PURE__ */ jsx8("span", { children: item.q }),
13501
+ /* @__PURE__ */ jsx8(
13502
+ "span",
13503
+ {
13504
+ "aria-hidden": "true",
13505
+ className: "shrink-0 text-muted-foreground transition-transform group-open:rotate-45",
13506
+ children: "+"
13507
+ }
13508
+ )
13509
+ ] }),
13510
+ /* @__PURE__ */ jsx8("p", { className: "whitespace-pre-line pb-4 text-muted-foreground", children: item.a })
13511
+ ]
13512
+ },
13513
+ index
13514
+ )) })
13515
+ ] });
13516
+ }
13517
+
13518
+ // src/components/page-blocks.tsx
13519
+ import { cn as cn8 } from "@reblu/site-ui/utils";
13520
+ import { buttonVariants as buttonVariants2 } from "@reblu/site-ui/button-variants";
13521
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
13522
+ var ALIASES = {
13523
+ doctor_embed: "profile_embed",
13524
+ specialty_embed: "page_embed"
13525
+ };
13526
+ function HeroBlock({ block, headingLevel }) {
13527
+ const { title, subtitle, imageUrl } = block.data;
13528
+ return /* @__PURE__ */ jsxs7("div", { className: "space-y-4", children: [
13529
+ /* @__PURE__ */ jsx9(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
13530
+ subtitle && /* @__PURE__ */ jsx9("p", { className: "text-lg opacity-80", children: subtitle }),
13531
+ imageUrl && /* @__PURE__ */ jsx9("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ jsx9("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
13532
+ ] });
13533
+ }
13534
+ function RichtextBlock({ block, headingLevel }) {
13535
+ return /* @__PURE__ */ jsx9(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
13536
+ }
13537
+ function FaqBlock({ block }) {
13538
+ return /* @__PURE__ */ jsx9(FaqAccordion, { items: block.data.items });
13539
+ }
13540
+ function StatsBlock({ block }) {
13541
+ return /* @__PURE__ */ jsx9("dl", { className: "grid gap-6 sm:grid-cols-2 lg:grid-cols-4", children: block.data.items.map((item, i) => /* @__PURE__ */ jsxs7("div", { className: "flex flex-col-reverse gap-1", children: [
13542
+ /* @__PURE__ */ jsx9("dt", { className: "text-sm opacity-80", children: item.label }),
13543
+ /* @__PURE__ */ jsx9("dd", { className: "text-3xl font-bold", children: item.value })
13544
+ ] }, i)) });
13545
+ }
13546
+ function TestimonialBlock({ block }) {
13547
+ const { quote, author, role, avatarUrl } = block.data;
13548
+ return /* @__PURE__ */ jsxs7("figure", { className: "space-y-4", children: [
13549
+ /* @__PURE__ */ jsx9("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ jsx9("p", { children: quote }) }),
13550
+ /* @__PURE__ */ jsxs7("figcaption", { className: "flex items-center gap-3", children: [
13551
+ avatarUrl && // eslint-disable-next-line @next/next/no-img-element
13552
+ /* @__PURE__ */ jsx9(
13553
+ "img",
13554
+ {
13555
+ src: avatarUrl,
13556
+ alt: "",
13557
+ loading: "lazy",
13558
+ className: "h-10 w-10 rounded-full object-cover"
13559
+ }
13560
+ ),
13561
+ /* @__PURE__ */ jsxs7("span", { children: [
13562
+ /* @__PURE__ */ jsx9("span", { className: "font-semibold", children: author }),
13563
+ role && /* @__PURE__ */ jsx9("span", { className: "block text-sm opacity-80", children: role })
13564
+ ] })
13565
+ ] })
13566
+ ] });
13567
+ }
13568
+ function CtaSlotBlock(_props) {
13569
+ return null;
13570
+ }
13571
+ function FeatureListBlock({ block }) {
13572
+ return /* @__PURE__ */ jsx9("ul", { className: "grid list-disc gap-2 pl-5 sm:grid-cols-2", children: block.data.items.map((item, i) => /* @__PURE__ */ jsx9("li", { children: item.text }, i)) });
13573
+ }
13574
+ function GalleryBlock({ block }) {
13575
+ const { images } = block.data;
13576
+ return /* @__PURE__ */ jsx9(
13577
+ "div",
13578
+ {
13579
+ className: cn8(
13580
+ "grid gap-4",
13581
+ images.length > 1 ? "sm:grid-cols-2 lg:grid-cols-3" : "grid-cols-1"
13582
+ ),
13583
+ children: images.map((img, i) => /* @__PURE__ */ jsxs7("figure", { className: "space-y-1", children: [
13584
+ /* @__PURE__ */ jsx9("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ jsx9(
13585
+ "img",
13586
+ {
13587
+ src: img.url,
13588
+ alt: img.alt ?? "",
13589
+ loading: "lazy",
13590
+ className: "h-full w-full object-cover"
13591
+ }
13592
+ ) }),
13593
+ img.caption && /* @__PURE__ */ jsx9("figcaption", { className: "text-sm opacity-80", children: img.caption })
13594
+ ] }, `${img.url}-${i}`))
13595
+ }
13596
+ );
13597
+ }
13598
+ function EmbedCard({
13599
+ resolved,
13600
+ headingLevel,
13601
+ embedHref
13602
+ }) {
13603
+ return /* @__PURE__ */ jsxs7(
13604
+ "a",
13605
+ {
13606
+ href: embedHref(resolved),
13607
+ 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",
13608
+ children: [
13609
+ resolved.coverImageUrl && /* @__PURE__ */ jsx9("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ jsx9(
13610
+ "img",
13611
+ {
13612
+ src: resolved.coverImageUrl,
13613
+ alt: "",
13614
+ loading: "lazy",
13615
+ className: "h-full w-full object-cover"
13616
+ }
13617
+ ) }),
13618
+ /* @__PURE__ */ jsxs7("div", { className: "space-y-1 p-4", children: [
13619
+ /* @__PURE__ */ jsx9(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
13620
+ resolved.role && /* @__PURE__ */ jsx9("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
13621
+ resolved.excerpt && /* @__PURE__ */ jsx9("p", { className: "text-muted-foreground", children: resolved.excerpt })
13622
+ ] })
13623
+ ]
13624
+ }
13625
+ );
13626
+ }
13627
+ function PageEmbedBlock({ block, headingLevel, embedHref }) {
13628
+ return /* @__PURE__ */ jsx9(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
13629
+ }
13630
+ function ProfileEmbedBlock({
13631
+ block,
13632
+ headingLevel,
13633
+ embedHref
13634
+ }) {
13635
+ return /* @__PURE__ */ jsx9(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
13636
+ }
13637
+ var DEFAULT_RENDERERS = {
13638
+ hero: HeroBlock,
13639
+ richtext: RichtextBlock,
13640
+ faq: FaqBlock,
13641
+ stats: StatsBlock,
13642
+ testimonial: TestimonialBlock,
13643
+ cta: CtaSlotBlock,
13644
+ feature_list: FeatureListBlock,
13645
+ gallery: GalleryBlock,
13646
+ page_embed: PageEmbedBlock,
13647
+ profile_embed: ProfileEmbedBlock
13648
+ };
13649
+ var EMBED_TYPES = /* @__PURE__ */ new Set([
13650
+ "page_embed",
13651
+ "profile_embed"
13652
+ ]);
13653
+ function canonicalTypeOf(blockType) {
13654
+ if (Object.prototype.hasOwnProperty.call(ALIASES, blockType))
13655
+ return ALIASES[blockType];
13656
+ if (Object.prototype.hasOwnProperty.call(DEFAULT_RENDERERS, blockType))
13657
+ return blockType;
13658
+ return null;
13659
+ }
13660
+ var TOKEN_FOREGROUND = {
13661
+ "var(--primary)": "var(--primary-foreground)",
13662
+ "var(--secondary)": "var(--secondary-foreground)",
13663
+ "var(--accent)": "var(--accent-foreground)"
13664
+ };
13665
+ function hexLuminance(color2) {
13666
+ const match = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(color2.trim());
13667
+ if (!match) return null;
13668
+ const hex = match[1].length === 3 ? [...match[1]].map((c) => c + c).join("") : match[1];
13669
+ const [r, g, b2] = [0, 2, 4].map((i) => {
13670
+ const s2 = parseInt(hex.slice(i, i + 2), 16) / 255;
13671
+ return s2 <= 0.03928 ? s2 / 12.92 : Math.pow((s2 + 0.055) / 1.055, 2.4);
13672
+ });
13673
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b2;
13674
+ }
13675
+ function surfaceStyle(background) {
13676
+ if (!background) return void 0;
13677
+ const token = TOKEN_FOREGROUND[background];
13678
+ if (token) return { backgroundColor: background, color: token };
13679
+ const luminance = hexLuminance(background);
13680
+ if (luminance === null) return { backgroundColor: background };
13681
+ return { backgroundColor: background, color: luminance < 0.179 ? "#ffffff" : "#111827" };
13682
+ }
13683
+ function hasUsableCta(cta) {
13684
+ return !!cta && !!cta.label && !!cta.url;
13685
+ }
13686
+ function toIdFragment(value) {
13687
+ return value.replace(/[^A-Za-z0-9_-]/g, "-");
13688
+ }
13689
+ function SectionCta2({ cta }) {
13690
+ if (!hasUsableCta(cta)) return null;
13691
+ const variant = toButtonVariant(cta.variant);
13692
+ return /* @__PURE__ */ jsx9("div", { className: "pt-2", children: /* @__PURE__ */ jsx9(
13693
+ "a",
13694
+ {
13695
+ href: cta.url,
13696
+ "data-slot": "button",
13697
+ "data-variant": variant,
13698
+ "data-size": "default",
13699
+ className: cn8(buttonVariants2({ variant, size: "default" })),
13700
+ ...cta.isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {},
13701
+ children: cta.label
13702
+ }
13703
+ ) });
13704
+ }
13705
+ function PageBlocks({
13706
+ blocks,
13707
+ components,
13708
+ headingLevel = 2,
13709
+ embedHref = (resolved) => `/${resolved.slug}`,
13710
+ idPrefix = "page-block",
13711
+ className,
13712
+ sectionClassName
13713
+ }) {
13714
+ if (!blocks || blocks.length === 0) return null;
13715
+ const safePrefix = `pb-${toIdFragment(idPrefix)}`;
13716
+ const sections = sortBlocksByOrder(blocks).flatMap((block) => {
13717
+ const type = canonicalTypeOf(block.blockType);
13718
+ if (type === null) return [];
13719
+ if (EMBED_TYPES.has(type) && !block.resolved) return [];
13720
+ if (type === "cta" && !components?.cta && !block.heading && !hasUsableCta(block.cta)) return [];
13721
+ const Renderer = components?.[type] ?? DEFAULT_RENDERERS[type];
13722
+ const headingId = block.heading ? `${safePrefix}-${toIdFragment(block.id)}-heading` : void 0;
13723
+ const background = block.backgroundColor;
13724
+ return [
13725
+ /* @__PURE__ */ jsxs7(
13726
+ "section",
13727
+ {
13728
+ "data-slot": "page-block",
13729
+ "data-block-type": type,
13730
+ "aria-labelledby": headingId,
13731
+ style: surfaceStyle(background),
13732
+ className: cn8("space-y-6", background && "rounded-xl px-6 py-10", sectionClassName),
13733
+ children: [
13734
+ block.heading && /* @__PURE__ */ jsx9(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ jsx9("span", { id: headingId, children: block.heading }) }),
13735
+ /* @__PURE__ */ jsx9(
13736
+ Renderer,
13737
+ {
13738
+ block,
13739
+ headingLevel: block.heading ? nextHeadingLevel(headingLevel) : headingLevel,
13740
+ embedHref
13741
+ }
13742
+ ),
13743
+ /* @__PURE__ */ jsx9(SectionCta2, { cta: block.cta })
13744
+ ]
13745
+ },
13746
+ block.id
13747
+ )
13748
+ ];
13749
+ });
13750
+ if (sections.length === 0) return null;
13751
+ return /* @__PURE__ */ jsx9("div", { className: cn8("space-y-12", className), "data-slot": "page-blocks", children: sections });
13752
+ }
13753
+
13754
+ // src/components/shop-filters.tsx
13755
+ import { cn as cn9 } from "@reblu/site-ui/utils";
13756
+ import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
13427
13757
  var DEFAULT_SHOP_PRICE_BANDS = [
13428
13758
  { max: 2500 },
13429
13759
  { min: 2500, max: 5e3 },
@@ -13467,7 +13797,7 @@ function priceBandLabel(band, t, currencyCode, locale) {
13467
13797
  return "";
13468
13798
  }
13469
13799
  function OptionLink({ href, active, label, onActivate }) {
13470
- return /* @__PURE__ */ jsx7(
13800
+ return /* @__PURE__ */ jsx10(
13471
13801
  "a",
13472
13802
  {
13473
13803
  href,
@@ -13476,7 +13806,7 @@ function OptionLink({ href, active, label, onActivate }) {
13476
13806
  event.preventDefault();
13477
13807
  onActivate();
13478
13808
  } : void 0,
13479
- className: cn7(
13809
+ className: cn9(
13480
13810
  "inline-flex items-center rounded-full border px-3 py-1 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
13481
13811
  active ? "border-transparent bg-primary text-primary-foreground" : "border-border text-muted-foreground hover:bg-muted hover:text-foreground"
13482
13812
  ),
@@ -13485,9 +13815,9 @@ function OptionLink({ href, active, label, onActivate }) {
13485
13815
  );
13486
13816
  }
13487
13817
  function FilterFieldset({ legend, children: children2 }) {
13488
- return /* @__PURE__ */ jsxs6("fieldset", { className: "space-y-2", children: [
13489
- /* @__PURE__ */ jsx7("legend", { className: "text-sm font-medium text-foreground", children: legend }),
13490
- /* @__PURE__ */ jsx7("div", { className: "flex flex-wrap gap-2", children: children2 })
13818
+ return /* @__PURE__ */ jsxs8("fieldset", { className: "space-y-2", children: [
13819
+ /* @__PURE__ */ jsx10("legend", { className: "text-sm font-medium text-foreground", children: legend }),
13820
+ /* @__PURE__ */ jsx10("div", { className: "flex flex-wrap gap-2", children: children2 })
13491
13821
  ] });
13492
13822
  }
13493
13823
  function ShopFilters({
@@ -13510,11 +13840,11 @@ function ShopFilters({
13510
13840
  if (!shouldRenderShopFilters(facets, active)) {
13511
13841
  return null;
13512
13842
  }
13513
- return /* @__PURE__ */ jsxs6("div", { className: cn7("space-y-6", className), "data-slot": "shop-filters", children: [
13843
+ return /* @__PURE__ */ jsxs8("div", { className: cn9("space-y-6", className), "data-slot": "shop-filters", children: [
13514
13844
  visibleTaxonomies.map((axis) => {
13515
13845
  const activeSlug = active.taxonomy?.[axis.key];
13516
- return /* @__PURE__ */ jsxs6(FilterFieldset, { legend: axis.label, children: [
13517
- /* @__PURE__ */ jsx7(
13846
+ return /* @__PURE__ */ jsxs8(FilterFieldset, { legend: axis.label, children: [
13847
+ /* @__PURE__ */ jsx10(
13518
13848
  OptionLink,
13519
13849
  {
13520
13850
  href: hrefs.taxonomy(axis.key, void 0),
@@ -13529,7 +13859,7 @@ function ShopFilters({
13529
13859
  ),
13530
13860
  axis.terms.map((term) => {
13531
13861
  const isActive = activeSlug === term.slug;
13532
- return /* @__PURE__ */ jsx7(
13862
+ return /* @__PURE__ */ jsx10(
13533
13863
  OptionLink,
13534
13864
  {
13535
13865
  href: hrefs.taxonomy(axis.key, isActive ? void 0 : term.slug),
@@ -13549,9 +13879,9 @@ function ShopFilters({
13549
13879
  }),
13550
13880
  visibleAttributes.map((attr) => {
13551
13881
  const activeValues = toValueArray(active.attr?.[attr.key]);
13552
- return /* @__PURE__ */ jsx7(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
13882
+ return /* @__PURE__ */ jsx10(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
13553
13883
  const isActive = activeValues.includes(opt.value);
13554
- return /* @__PURE__ */ jsx7(
13884
+ return /* @__PURE__ */ jsx10(
13555
13885
  OptionLink,
13556
13886
  {
13557
13887
  href: hrefs.attr(attr.key, opt.value),
@@ -13569,11 +13899,11 @@ function ShopFilters({
13569
13899
  );
13570
13900
  }) }, attr.key);
13571
13901
  }),
13572
- showPriceGroup && /* @__PURE__ */ jsx7(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
13902
+ showPriceGroup && /* @__PURE__ */ jsx10(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
13573
13903
  const isActive = active.priceMin === band.min && active.priceMax === band.max;
13574
13904
  const nextMin = isActive ? void 0 : band.min;
13575
13905
  const nextMax = isActive ? void 0 : band.max;
13576
- return /* @__PURE__ */ jsx7(
13906
+ return /* @__PURE__ */ jsx10(
13577
13907
  OptionLink,
13578
13908
  {
13579
13909
  href: hrefs.price(nextMin, nextMax),
@@ -13584,7 +13914,7 @@ function ShopFilters({
13584
13914
  i
13585
13915
  );
13586
13916
  }) }),
13587
- hasOnSale && /* @__PURE__ */ jsx7(
13917
+ hasOnSale && /* @__PURE__ */ jsx10(
13588
13918
  OptionLink,
13589
13919
  {
13590
13920
  href: hrefs.onSale(!active.onSale),
@@ -13593,7 +13923,7 @@ function ShopFilters({
13593
13923
  onActivate: onChange ? () => onChange({ onSale: !active.onSale }) : void 0
13594
13924
  }
13595
13925
  ),
13596
- /* @__PURE__ */ jsx7(
13926
+ /* @__PURE__ */ jsx10(
13597
13927
  "a",
13598
13928
  {
13599
13929
  href: hrefs.clearAll(),
@@ -13609,8 +13939,8 @@ function ShopFilters({
13609
13939
  }
13610
13940
 
13611
13941
  // src/components/cart-line-list.tsx
13612
- import { cn as cn8 } from "@reblu/site-ui/utils";
13613
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
13942
+ import { cn as cn10 } from "@reblu/site-ui/utils";
13943
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
13614
13944
  var DEFAULT_LABELS2 = {
13615
13945
  quantityLabel: "Cantidad",
13616
13946
  decrease: "Reducir cantidad",
@@ -13635,9 +13965,9 @@ function CartLineList({
13635
13965
  }) {
13636
13966
  const t = { ...DEFAULT_LABELS2, ...labels };
13637
13967
  const noticeContent = notice === true ? t.cancelledNotice : notice;
13638
- return /* @__PURE__ */ jsxs7("div", { className: cn8("space-y-4", className), "data-slot": "cart-line-list", children: [
13639
- /* @__PURE__ */ jsx8("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
13640
- noticeContent != null && noticeContent !== false && /* @__PURE__ */ jsx8(
13968
+ return /* @__PURE__ */ jsxs9("div", { className: cn10("space-y-4", className), "data-slot": "cart-line-list", children: [
13969
+ /* @__PURE__ */ jsx11("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
13970
+ noticeContent != null && noticeContent !== false && /* @__PURE__ */ jsx11(
13641
13971
  "div",
13642
13972
  {
13643
13973
  role: "status",
@@ -13646,32 +13976,32 @@ function CartLineList({
13646
13976
  children: noticeContent
13647
13977
  }
13648
13978
  ),
13649
- /* @__PURE__ */ jsx8("ul", { className: "space-y-4", children: items.map((item) => {
13979
+ /* @__PURE__ */ jsx11("ul", { className: "space-y-4", children: items.map((item) => {
13650
13980
  const maxQty = item.maxStock ?? Infinity;
13651
13981
  const atMax = item.quantity >= maxQty;
13652
13982
  const atMin = item.quantity <= 1;
13653
- return /* @__PURE__ */ jsxs7(
13983
+ return /* @__PURE__ */ jsxs9(
13654
13984
  "li",
13655
13985
  {
13656
13986
  className: "flex gap-4 rounded-xl border border-border bg-card p-4",
13657
13987
  children: [
13658
- /* @__PURE__ */ jsx8("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ jsx8("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
13659
- /* @__PURE__ */ jsxs7("div", { className: "min-w-0 flex-1", children: [
13660
- /* @__PURE__ */ jsx8("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
13661
- item.variantName && /* @__PURE__ */ jsx8("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
13662
- /* @__PURE__ */ jsxs7("p", { className: "mt-1 text-sm text-muted-foreground", children: [
13988
+ /* @__PURE__ */ jsx11("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ jsx11("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
13989
+ /* @__PURE__ */ jsxs9("div", { className: "min-w-0 flex-1", children: [
13990
+ /* @__PURE__ */ jsx11("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
13991
+ item.variantName && /* @__PURE__ */ jsx11("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
13992
+ /* @__PURE__ */ jsxs9("p", { className: "mt-1 text-sm text-muted-foreground", children: [
13663
13993
  formatPrice(item.unitPrice, currencyCode, locale),
13664
13994
  " ",
13665
13995
  t.unitPriceSuffix
13666
13996
  ] }),
13667
- /* @__PURE__ */ jsxs7(
13997
+ /* @__PURE__ */ jsxs9(
13668
13998
  "div",
13669
13999
  {
13670
14000
  role: "group",
13671
14001
  "aria-label": t.quantityLabel,
13672
14002
  className: "mt-3 flex items-center gap-3",
13673
14003
  children: [
13674
- /* @__PURE__ */ jsx8(
14004
+ /* @__PURE__ */ jsx11(
13675
14005
  "button",
13676
14006
  {
13677
14007
  type: "button",
@@ -13682,8 +14012,8 @@ function CartLineList({
13682
14012
  children: "\u2212"
13683
14013
  }
13684
14014
  ),
13685
- /* @__PURE__ */ jsx8("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
13686
- /* @__PURE__ */ jsx8(
14015
+ /* @__PURE__ */ jsx11("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
14016
+ /* @__PURE__ */ jsx11(
13687
14017
  "button",
13688
14018
  {
13689
14019
  type: "button",
@@ -13694,7 +14024,7 @@ function CartLineList({
13694
14024
  children: "+"
13695
14025
  }
13696
14026
  ),
13697
- onRemove && /* @__PURE__ */ jsx8(
14027
+ onRemove && /* @__PURE__ */ jsx11(
13698
14028
  "button",
13699
14029
  {
13700
14030
  type: "button",
@@ -13708,7 +14038,7 @@ function CartLineList({
13708
14038
  }
13709
14039
  )
13710
14040
  ] }),
13711
- /* @__PURE__ */ jsx8("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ jsx8("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
14041
+ /* @__PURE__ */ jsx11("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ jsx11("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
13712
14042
  ]
13713
14043
  },
13714
14044
  lineKey(item.productId, item.variantId)
@@ -13718,8 +14048,8 @@ function CartLineList({
13718
14048
  }
13719
14049
 
13720
14050
  // src/components/cart-summary.tsx
13721
- import { cn as cn9 } from "@reblu/site-ui/utils";
13722
- import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
14051
+ import { cn as cn11 } from "@reblu/site-ui/utils";
14052
+ import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
13723
14053
  var DEFAULT_LABELS3 = {
13724
14054
  subtotal: "Subtotal",
13725
14055
  discountPrefix: "Descuento",
@@ -13746,40 +14076,40 @@ function CartSummary({
13746
14076
  const hasDiscount = Boolean(discount && discount > 0);
13747
14077
  const noticeContent = notice === true ? t.cancelledNotice : notice;
13748
14078
  const hasNotice = noticeContent != null && noticeContent !== false;
13749
- const breakdown = /* @__PURE__ */ jsxs8(
14079
+ const breakdown = /* @__PURE__ */ jsxs10(
13750
14080
  "dl",
13751
14081
  {
13752
- className: cn9("space-y-2 text-sm", !hasNotice && className),
14082
+ className: cn11("space-y-2 text-sm", !hasNotice && className),
13753
14083
  "data-slot": "cart-summary",
13754
14084
  children: [
13755
- /* @__PURE__ */ jsxs8("div", { className: "flex justify-between text-muted-foreground", children: [
13756
- /* @__PURE__ */ jsx9("dt", { children: t.subtotal }),
13757
- /* @__PURE__ */ jsx9("dd", { children: formatPrice(subtotal, currencyCode, locale) })
14085
+ /* @__PURE__ */ jsxs10("div", { className: "flex justify-between text-muted-foreground", children: [
14086
+ /* @__PURE__ */ jsx12("dt", { children: t.subtotal }),
14087
+ /* @__PURE__ */ jsx12("dd", { children: formatPrice(subtotal, currencyCode, locale) })
13758
14088
  ] }),
13759
- hasDiscount && /* @__PURE__ */ jsxs8("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
13760
- /* @__PURE__ */ jsxs8("dt", { children: [
14089
+ hasDiscount && /* @__PURE__ */ jsxs10("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
14090
+ /* @__PURE__ */ jsxs10("dt", { children: [
13761
14091
  t.discountPrefix,
13762
14092
  discountCode ? ` (${discountCode})` : ""
13763
14093
  ] }),
13764
- /* @__PURE__ */ jsxs8("dd", { children: [
14094
+ /* @__PURE__ */ jsxs10("dd", { children: [
13765
14095
  "-",
13766
14096
  formatPrice(discount, currencyCode, locale)
13767
14097
  ] })
13768
14098
  ] }),
13769
- shippingEnabled && /* @__PURE__ */ jsxs8("div", { className: "flex justify-between text-muted-foreground", children: [
13770
- /* @__PURE__ */ jsx9("dt", { children: t.shipping }),
13771
- /* @__PURE__ */ jsx9("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
14099
+ shippingEnabled && /* @__PURE__ */ jsxs10("div", { className: "flex justify-between text-muted-foreground", children: [
14100
+ /* @__PURE__ */ jsx12("dt", { children: t.shipping }),
14101
+ /* @__PURE__ */ jsx12("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
13772
14102
  ] }),
13773
- /* @__PURE__ */ jsxs8("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
13774
- /* @__PURE__ */ jsx9("dt", { children: t.total }),
13775
- /* @__PURE__ */ jsx9("dd", { children: formatPrice(total, currencyCode, locale) })
14103
+ /* @__PURE__ */ jsxs10("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
14104
+ /* @__PURE__ */ jsx12("dt", { children: t.total }),
14105
+ /* @__PURE__ */ jsx12("dd", { children: formatPrice(total, currencyCode, locale) })
13776
14106
  ] })
13777
14107
  ]
13778
14108
  }
13779
14109
  );
13780
14110
  if (!hasNotice) return breakdown;
13781
- return /* @__PURE__ */ jsxs8("div", { className: cn9("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
13782
- /* @__PURE__ */ jsx9(
14111
+ return /* @__PURE__ */ jsxs10("div", { className: cn11("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
14112
+ /* @__PURE__ */ jsx12(
13783
14113
  "div",
13784
14114
  {
13785
14115
  role: "status",
@@ -13793,8 +14123,8 @@ function CartSummary({
13793
14123
  }
13794
14124
 
13795
14125
  // src/components/added-to-cart-toast.tsx
13796
- import { cn as cn10 } from "@reblu/site-ui/utils";
13797
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
14126
+ import { cn as cn12 } from "@reblu/site-ui/utils";
14127
+ import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
13798
14128
  var DEFAULT_LABELS4 = {
13799
14129
  success: "A\xF1adido al carrito",
13800
14130
  error: "No se pudo a\xF1adir al carrito",
@@ -13814,12 +14144,12 @@ function AddedToCartToast({
13814
14144
  const message = status === "error" ? t.error : status === "outOfStock" ? t.outOfStock : t.success;
13815
14145
  const hasThumbnail = Boolean(imageUrl && imageUrl.trim().length > 0);
13816
14146
  const variant = status === "success" ? "success" : "error";
13817
- return /* @__PURE__ */ jsxs9(
14147
+ return /* @__PURE__ */ jsxs11(
13818
14148
  "div",
13819
14149
  {
13820
14150
  "data-slot": "added-to-cart-toast",
13821
14151
  "data-variant": variant,
13822
- className: cn10(
14152
+ className: cn12(
13823
14153
  "flex items-center gap-3 rounded-xl border border-border bg-card p-3 text-sm shadow-lg",
13824
14154
  variant === "success" && "border-green-600/30 dark:border-green-400/30",
13825
14155
  variant === "error" && "border-destructive/30",
@@ -13827,20 +14157,20 @@ function AddedToCartToast({
13827
14157
  ),
13828
14158
  children: [
13829
14159
  hasThumbnail && // eslint-disable-next-line @next/next/no-img-element -- toast content, not a Next <Image> layout context
13830
- /* @__PURE__ */ jsx10("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
13831
- /* @__PURE__ */ jsxs9("div", { className: "min-w-0 flex-1", children: [
13832
- /* @__PURE__ */ jsx10("p", { className: "truncate font-semibold text-foreground", children: productName }),
13833
- /* @__PURE__ */ jsx10("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
14160
+ /* @__PURE__ */ jsx13("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
14161
+ /* @__PURE__ */ jsxs11("div", { className: "min-w-0 flex-1", children: [
14162
+ /* @__PURE__ */ jsx13("p", { className: "truncate font-semibold text-foreground", children: productName }),
14163
+ /* @__PURE__ */ jsx13("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
13834
14164
  ] }),
13835
- /* @__PURE__ */ jsx10("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx10("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
14165
+ /* @__PURE__ */ jsx13("div", { className: "flex-shrink-0", children: /* @__PURE__ */ jsx13("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
13836
14166
  ]
13837
14167
  }
13838
14168
  );
13839
14169
  }
13840
14170
 
13841
14171
  // src/components/checkout-login-prompt.tsx
13842
- import { cn as cn11 } from "@reblu/site-ui/utils";
13843
- import { Fragment as Fragment3, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
14172
+ import { cn as cn13 } from "@reblu/site-ui/utils";
14173
+ import { Fragment as Fragment3, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
13844
14174
  var DEFAULT_LABELS5 = {
13845
14175
  title: "Identificaci\xF3n",
13846
14176
  description: "Introduce tu email para agilizar el proceso o contin\xFAa como invitado.",
@@ -13867,26 +14197,26 @@ function CheckoutLoginPrompt({
13867
14197
  if (!open) return null;
13868
14198
  const t = { ...DEFAULT_LABELS5, ...labels };
13869
14199
  const isValidEmail = EMAIL_PATTERN.test(email.trim());
13870
- return /* @__PURE__ */ jsxs10(Fragment3, { children: [
13871
- /* @__PURE__ */ jsx11("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
13872
- /* @__PURE__ */ jsxs10(
14200
+ return /* @__PURE__ */ jsxs12(Fragment3, { children: [
14201
+ /* @__PURE__ */ jsx14("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
14202
+ /* @__PURE__ */ jsxs12(
13873
14203
  "div",
13874
14204
  {
13875
14205
  role: "dialog",
13876
14206
  "aria-modal": "true",
13877
14207
  "aria-labelledby": "checkout-login-prompt-title",
13878
14208
  "data-slot": "checkout-login-prompt",
13879
- className: cn11(
14209
+ className: cn13(
13880
14210
  "fixed left-1/2 top-1/2 z-50 w-full max-w-md -translate-x-1/2 -translate-y-1/2 space-y-5 rounded-2xl border border-border bg-background p-6 shadow-2xl",
13881
14211
  className
13882
14212
  ),
13883
14213
  children: [
13884
- /* @__PURE__ */ jsxs10("div", { className: "flex items-start justify-between gap-3", children: [
13885
- /* @__PURE__ */ jsxs10("div", { children: [
13886
- /* @__PURE__ */ jsx11("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
13887
- /* @__PURE__ */ jsx11("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
14214
+ /* @__PURE__ */ jsxs12("div", { className: "flex items-start justify-between gap-3", children: [
14215
+ /* @__PURE__ */ jsxs12("div", { children: [
14216
+ /* @__PURE__ */ jsx14("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
14217
+ /* @__PURE__ */ jsx14("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
13888
14218
  ] }),
13889
- /* @__PURE__ */ jsx11(
14219
+ /* @__PURE__ */ jsx14(
13890
14220
  "button",
13891
14221
  {
13892
14222
  type: "button",
@@ -13897,9 +14227,9 @@ function CheckoutLoginPrompt({
13897
14227
  }
13898
14228
  )
13899
14229
  ] }),
13900
- /* @__PURE__ */ jsxs10("div", { className: "space-y-2", children: [
13901
- /* @__PURE__ */ jsx11("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
13902
- /* @__PURE__ */ jsx11(
14230
+ /* @__PURE__ */ jsxs12("div", { className: "space-y-2", children: [
14231
+ /* @__PURE__ */ jsx14("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
14232
+ /* @__PURE__ */ jsx14(
13903
14233
  "input",
13904
14234
  {
13905
14235
  id: "checkout-login-prompt-email",
@@ -13908,29 +14238,29 @@ function CheckoutLoginPrompt({
13908
14238
  value: email,
13909
14239
  onChange: (e) => onEmailChange(e.target.value),
13910
14240
  placeholder: t.emailPlaceholder,
13911
- className: cn11(
14241
+ className: cn13(
13912
14242
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
13913
14243
  error ? "border-destructive" : "border-border focus:border-primary"
13914
14244
  )
13915
14245
  }
13916
14246
  ),
13917
- error && /* @__PURE__ */ jsx11("p", { className: "text-xs text-destructive", children: error })
14247
+ error && /* @__PURE__ */ jsx14("p", { className: "text-xs text-destructive", children: error })
13918
14248
  ] }),
13919
- /* @__PURE__ */ jsxs10("div", { className: "space-y-2", children: [
13920
- /* @__PURE__ */ jsx11(
14249
+ /* @__PURE__ */ jsxs12("div", { className: "space-y-2", children: [
14250
+ /* @__PURE__ */ jsx14(
13921
14251
  "button",
13922
14252
  {
13923
14253
  type: "button",
13924
14254
  onClick: onSubmitEmail,
13925
14255
  disabled: checking || !isValidEmail,
13926
- className: cn11(
14256
+ className: cn13(
13927
14257
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-2.5 text-sm font-semibold transition-all",
13928
14258
  checking || !isValidEmail ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
13929
14259
  ),
13930
14260
  children: checking ? t.checking : t.continueWithEmail
13931
14261
  }
13932
14262
  ),
13933
- /* @__PURE__ */ jsx11(
14263
+ /* @__PURE__ */ jsx14(
13934
14264
  "button",
13935
14265
  {
13936
14266
  type: "button",
@@ -13947,9 +14277,9 @@ function CheckoutLoginPrompt({
13947
14277
  }
13948
14278
 
13949
14279
  // src/components/checkout-form.tsx
13950
- import { cn as cn12 } from "@reblu/site-ui/utils";
14280
+ import { cn as cn14 } from "@reblu/site-ui/utils";
13951
14281
  import { PhoneInput } from "@reblu/site-ui/phone-input";
13952
- import { Fragment as Fragment4, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
14282
+ import { Fragment as Fragment4, jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
13953
14283
  var DEFAULT_LABELS6 = {
13954
14284
  contactTitle: "Datos de contacto",
13955
14285
  nameLabel: "Nombre completo",
@@ -14003,22 +14333,22 @@ function CheckoutForm({
14003
14333
  event.preventDefault();
14004
14334
  if (discountCode.trim() && !discountApplying) onApplyDiscount();
14005
14335
  }
14006
- return /* @__PURE__ */ jsxs11(Fragment4, { children: [
14336
+ return /* @__PURE__ */ jsxs13(Fragment4, { children: [
14007
14337
  loginPrompt,
14008
- /* @__PURE__ */ jsxs11(
14338
+ /* @__PURE__ */ jsxs13(
14009
14339
  "form",
14010
14340
  {
14011
14341
  "data-testid": "checkout-form",
14012
14342
  onSubmit,
14013
- className: cn12("space-y-8", className),
14343
+ className: cn14("space-y-8", className),
14014
14344
  "data-slot": "checkout-form",
14015
14345
  children: [
14016
- /* @__PURE__ */ jsxs11("section", { className: "space-y-4", children: [
14017
- /* @__PURE__ */ jsx12("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
14018
- /* @__PURE__ */ jsxs11("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
14019
- /* @__PURE__ */ jsxs11("div", { className: "space-y-1", children: [
14020
- /* @__PURE__ */ jsx12("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
14021
- /* @__PURE__ */ jsx12(
14346
+ /* @__PURE__ */ jsxs13("section", { className: "space-y-4", children: [
14347
+ /* @__PURE__ */ jsx15("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
14348
+ /* @__PURE__ */ jsxs13("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
14349
+ /* @__PURE__ */ jsxs13("div", { className: "space-y-1", children: [
14350
+ /* @__PURE__ */ jsx15("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
14351
+ /* @__PURE__ */ jsx15(
14022
14352
  "input",
14023
14353
  {
14024
14354
  id: "checkout-form-name",
@@ -14027,17 +14357,17 @@ function CheckoutForm({
14027
14357
  value: contact.name,
14028
14358
  onChange: (e) => patchContact({ name: e.target.value }),
14029
14359
  placeholder: t.namePlaceholder,
14030
- className: cn12(
14360
+ className: cn14(
14031
14361
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
14032
14362
  contactErrors?.name ? "border-destructive" : "border-border focus:border-primary"
14033
14363
  )
14034
14364
  }
14035
14365
  ),
14036
- contactErrors?.name && /* @__PURE__ */ jsx12("p", { className: "text-xs text-destructive", children: contactErrors.name })
14366
+ contactErrors?.name && /* @__PURE__ */ jsx15("p", { className: "text-xs text-destructive", children: contactErrors.name })
14037
14367
  ] }),
14038
- /* @__PURE__ */ jsxs11("div", { className: "space-y-1", children: [
14039
- /* @__PURE__ */ jsx12("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
14040
- /* @__PURE__ */ jsx12(
14368
+ /* @__PURE__ */ jsxs13("div", { className: "space-y-1", children: [
14369
+ /* @__PURE__ */ jsx15("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
14370
+ /* @__PURE__ */ jsx15(
14041
14371
  "input",
14042
14372
  {
14043
14373
  id: "checkout-form-email",
@@ -14046,15 +14376,15 @@ function CheckoutForm({
14046
14376
  value: contact.email,
14047
14377
  onChange: (e) => patchContact({ email: e.target.value }),
14048
14378
  placeholder: t.emailPlaceholder,
14049
- className: cn12(
14379
+ className: cn14(
14050
14380
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
14051
14381
  contactErrors?.email ? "border-destructive" : "border-border focus:border-primary"
14052
14382
  )
14053
14383
  }
14054
14384
  ),
14055
- contactErrors?.email && /* @__PURE__ */ jsx12("p", { className: "text-xs text-destructive", children: contactErrors.email })
14385
+ contactErrors?.email && /* @__PURE__ */ jsx15("p", { className: "text-xs text-destructive", children: contactErrors.email })
14056
14386
  ] }),
14057
- /* @__PURE__ */ jsx12("div", { className: "space-y-1", children: /* @__PURE__ */ jsx12(
14387
+ /* @__PURE__ */ jsx15("div", { className: "space-y-1", children: /* @__PURE__ */ jsx15(
14058
14388
  PhoneInput,
14059
14389
  {
14060
14390
  id: "checkout-form-phone",
@@ -14068,15 +14398,15 @@ function CheckoutForm({
14068
14398
  ] })
14069
14399
  ] }),
14070
14400
  children2,
14071
- generalError ? /* @__PURE__ */ jsx12("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
14072
- /* @__PURE__ */ jsxs11("section", { className: "space-y-3", children: [
14073
- /* @__PURE__ */ jsx12("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
14074
- appliedDiscount ? /* @__PURE__ */ jsxs11("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: [
14075
- /* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
14076
- /* @__PURE__ */ jsx12("span", { className: "font-semibold", children: appliedDiscount.code }),
14077
- /* @__PURE__ */ jsx12("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
14401
+ generalError ? /* @__PURE__ */ jsx15("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
14402
+ /* @__PURE__ */ jsxs13("section", { className: "space-y-3", children: [
14403
+ /* @__PURE__ */ jsx15("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
14404
+ appliedDiscount ? /* @__PURE__ */ jsxs13("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: [
14405
+ /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
14406
+ /* @__PURE__ */ jsx15("span", { className: "font-semibold", children: appliedDiscount.code }),
14407
+ /* @__PURE__ */ jsx15("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
14078
14408
  ] }),
14079
- /* @__PURE__ */ jsx12(
14409
+ /* @__PURE__ */ jsx15(
14080
14410
  "button",
14081
14411
  {
14082
14412
  type: "button",
@@ -14086,9 +14416,9 @@ function CheckoutForm({
14086
14416
  children: t.removeDiscount
14087
14417
  }
14088
14418
  )
14089
- ] }) : /* @__PURE__ */ jsxs11("div", { className: "flex gap-2", children: [
14090
- /* @__PURE__ */ jsx12("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
14091
- /* @__PURE__ */ jsx12(
14419
+ ] }) : /* @__PURE__ */ jsxs13("div", { className: "flex gap-2", children: [
14420
+ /* @__PURE__ */ jsx15("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
14421
+ /* @__PURE__ */ jsx15(
14092
14422
  "input",
14093
14423
  {
14094
14424
  id: "checkout-form-discount-code",
@@ -14100,7 +14430,7 @@ function CheckoutForm({
14100
14430
  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"
14101
14431
  }
14102
14432
  ),
14103
- /* @__PURE__ */ jsx12(
14433
+ /* @__PURE__ */ jsx15(
14104
14434
  "button",
14105
14435
  {
14106
14436
  type: "button",
@@ -14111,14 +14441,14 @@ function CheckoutForm({
14111
14441
  }
14112
14442
  )
14113
14443
  ] }),
14114
- discountError && /* @__PURE__ */ jsx12("p", { className: "text-xs text-destructive", children: discountError })
14444
+ discountError && /* @__PURE__ */ jsx15("p", { className: "text-xs text-destructive", children: discountError })
14115
14445
  ] }),
14116
- /* @__PURE__ */ jsx12(
14446
+ /* @__PURE__ */ jsx15(
14117
14447
  "button",
14118
14448
  {
14119
14449
  type: "submit",
14120
14450
  disabled: submitting || submitDisabled,
14121
- className: cn12(
14451
+ className: cn14(
14122
14452
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold transition-all",
14123
14453
  submitting || submitDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
14124
14454
  ),
@@ -14132,8 +14462,8 @@ function CheckoutForm({
14132
14462
  }
14133
14463
 
14134
14464
  // src/components/order-confirmation.tsx
14135
- import { cn as cn13 } from "@reblu/site-ui/utils";
14136
- import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
14465
+ import { cn as cn15 } from "@reblu/site-ui/utils";
14466
+ import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
14137
14467
  var DEFAULT_LABELS7 = {
14138
14468
  pollingTitle: "Confirmando tu pedido\u2026",
14139
14469
  pollingDescription: "Estamos procesando el pago, un momento\u2026",
@@ -14195,48 +14525,48 @@ function OrderConfirmation({
14195
14525
  const showOrderReference = Boolean(order) && !showFullOrderSummary && (status === "refunded" || status === "partially_refunded" || status === "pending_timeout");
14196
14526
  const showSessionReference = !order && sessionId && (status === "timeout" || status === "not_found" || status === "pending_timeout");
14197
14527
  const showRecheck = (status === "pending_timeout" || status === "error") && onRecheck;
14198
- return /* @__PURE__ */ jsxs12("div", { className: cn13("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
14199
- /* @__PURE__ */ jsx13("h1", { className: "text-3xl font-bold", children: title }),
14200
- /* @__PURE__ */ jsx13("p", { className: "text-lg text-muted-foreground", children: description }),
14201
- showFullOrderSummary && order && /* @__PURE__ */ jsxs12("div", { className: "space-y-6", children: [
14202
- /* @__PURE__ */ jsxs12("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14203
- /* @__PURE__ */ jsx13("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
14204
- /* @__PURE__ */ jsx13("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14528
+ return /* @__PURE__ */ jsxs14("div", { className: cn15("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
14529
+ /* @__PURE__ */ jsx16("h1", { className: "text-3xl font-bold", children: title }),
14530
+ /* @__PURE__ */ jsx16("p", { className: "text-lg text-muted-foreground", children: description }),
14531
+ showFullOrderSummary && order && /* @__PURE__ */ jsxs14("div", { className: "space-y-6", children: [
14532
+ /* @__PURE__ */ jsxs14("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14533
+ /* @__PURE__ */ jsx16("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
14534
+ /* @__PURE__ */ jsx16("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14205
14535
  ] }),
14206
- /* @__PURE__ */ jsxs12("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
14207
- order.items.map((item, idx) => /* @__PURE__ */ jsxs12(
14536
+ /* @__PURE__ */ jsxs14("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
14537
+ order.items.map((item, idx) => /* @__PURE__ */ jsxs14(
14208
14538
  "div",
14209
14539
  {
14210
14540
  className: "flex justify-between gap-4 text-sm",
14211
14541
  children: [
14212
- /* @__PURE__ */ jsxs12("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
14542
+ /* @__PURE__ */ jsxs14("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
14213
14543
  item.product.name,
14214
14544
  item.variant ? ` (${item.variant.name})` : "",
14215
14545
  " x",
14216
14546
  item.quantity
14217
14547
  ] }),
14218
- /* @__PURE__ */ jsx13("span", { children: formatPrice(item.total, currencyCode, locale) })
14548
+ /* @__PURE__ */ jsx16("span", { children: formatPrice(item.total, currencyCode, locale) })
14219
14549
  ]
14220
14550
  },
14221
14551
  idx
14222
14552
  )),
14223
- /* @__PURE__ */ jsx13("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ jsxs12("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
14224
- /* @__PURE__ */ jsx13("span", { children: t.totalLabel }),
14225
- /* @__PURE__ */ jsx13("span", { children: formatPrice(order.total, currencyCode, locale) })
14553
+ /* @__PURE__ */ jsx16("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ jsxs14("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
14554
+ /* @__PURE__ */ jsx16("span", { children: t.totalLabel }),
14555
+ /* @__PURE__ */ jsx16("span", { children: formatPrice(order.total, currencyCode, locale) })
14226
14556
  ] }) })
14227
14557
  ] }),
14228
- /* @__PURE__ */ jsxs12("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
14558
+ /* @__PURE__ */ jsxs14("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
14229
14559
  t.confirmationEmailPrefix,
14230
14560
  " ",
14231
- /* @__PURE__ */ jsx13("span", { className: "font-medium text-foreground", children: order.customerEmail }),
14561
+ /* @__PURE__ */ jsx16("span", { className: "font-medium text-foreground", children: order.customerEmail }),
14232
14562
  "."
14233
14563
  ] })
14234
14564
  ] }),
14235
- showOrderReference && order && /* @__PURE__ */ jsxs12("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14236
- /* @__PURE__ */ jsx13("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
14237
- /* @__PURE__ */ jsx13("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14565
+ showOrderReference && order && /* @__PURE__ */ jsxs14("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14566
+ /* @__PURE__ */ jsx16("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
14567
+ /* @__PURE__ */ jsx16("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14238
14568
  ] }),
14239
- status === "failed" && cartHref && /* @__PURE__ */ jsx13(
14569
+ status === "failed" && cartHref && /* @__PURE__ */ jsx16(
14240
14570
  "a",
14241
14571
  {
14242
14572
  href: cartHref,
@@ -14244,7 +14574,7 @@ function OrderConfirmation({
14244
14574
  children: t.backToCartLabel
14245
14575
  }
14246
14576
  ),
14247
- showRecheck && /* @__PURE__ */ jsx13(
14577
+ showRecheck && /* @__PURE__ */ jsx16(
14248
14578
  "button",
14249
14579
  {
14250
14580
  type: "button",
@@ -14253,9 +14583,9 @@ function OrderConfirmation({
14253
14583
  children: t.recheckLabel
14254
14584
  }
14255
14585
  ),
14256
- showSessionReference && /* @__PURE__ */ jsxs12("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14257
- /* @__PURE__ */ jsx13("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
14258
- /* @__PURE__ */ jsx13("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
14586
+ showSessionReference && /* @__PURE__ */ jsxs14("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14587
+ /* @__PURE__ */ jsx16("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
14588
+ /* @__PURE__ */ jsx16("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
14259
14589
  ] })
14260
14590
  ] });
14261
14591
  }
@@ -14269,15 +14599,20 @@ export {
14269
14599
  DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
14270
14600
  DEFAULT_SHOP_ERROR_MESSAGES,
14271
14601
  DEFAULT_SHOP_PRICE_BANDS,
14602
+ FaqAccordion,
14272
14603
  MarkdownRenderer,
14273
14604
  OrderConfirmation,
14605
+ PageBlocks,
14606
+ ParentPage,
14274
14607
  ProductCard,
14275
14608
  ProfileCard,
14276
14609
  SafeHtml,
14277
14610
  ShopFilters,
14278
14611
  Specialty,
14279
14612
  Treatment,
14613
+ buildFaqPageJsonLd,
14280
14614
  buildShareUrls,
14615
+ collectFaqItems,
14281
14616
  formatPrice,
14282
14617
  getShopErrorMessage,
14283
14618
  isAllowedYouTubeHost,