@reblu/site-blocks 0.13.0 → 0.15.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
@@ -22,14 +22,18 @@ var src_exports = {};
22
22
  __export(src_exports, {
23
23
  ALLOWED_YOUTUBE_HOSTS: () => ALLOWED_YOUTUBE_HOSTS,
24
24
  AddedToCartToast: () => AddedToCartToast,
25
+ CartAdjustmentsNotice: () => CartAdjustmentsNotice,
25
26
  CartLineList: () => CartLineList,
26
27
  CartSummary: () => CartSummary,
27
28
  CheckoutForm: () => CheckoutForm,
28
29
  CheckoutLoginPrompt: () => CheckoutLoginPrompt,
30
+ CourseDescription: () => CourseDescription,
29
31
  DEFAULT_INVOICE_COUNTRIES: () => DEFAULT_INVOICE_COUNTRIES,
30
32
  DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE: () => DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
31
33
  DEFAULT_SHOP_ERROR_MESSAGES: () => DEFAULT_SHOP_ERROR_MESSAGES,
32
34
  DEFAULT_SHOP_PRICE_BANDS: () => DEFAULT_SHOP_PRICE_BANDS,
35
+ DEFAULT_TRUST_BADGE_HEADINGS: () => DEFAULT_TRUST_BADGE_HEADINGS,
36
+ DEFAULT_TRUST_BADGE_TYPE_ORDER: () => DEFAULT_TRUST_BADGE_TYPE_ORDER,
33
37
  DEFAULT_TRUST_ICONS: () => DEFAULT_TRUST_ICONS,
34
38
  EMPTY_FULL_INVOICE_VALUE: () => EMPTY_FULL_INVOICE_VALUE,
35
39
  FaqAccordion: () => FaqAccordion,
@@ -47,6 +51,7 @@ __export(src_exports, {
47
51
  ShopFilters: () => ShopFilters,
48
52
  Specialty: () => Specialty,
49
53
  Treatment: () => Treatment,
54
+ TrustBadges: () => TrustBadges,
50
55
  buildFaqPageJsonLd: () => buildFaqPageJsonLd,
51
56
  buildShareUrls: () => buildShareUrls,
52
57
  collectFaqItems: () => collectFaqItems,
@@ -54,6 +59,7 @@ __export(src_exports, {
54
59
  getShopErrorMessage: () => getShopErrorMessage,
55
60
  isAllowedYouTubeHost: () => isAllowedYouTubeHost,
56
61
  isOverSimplifiedInvoiceCap: () => isOverSimplifiedInvoiceCap,
62
+ markdownToPlainText: () => markdownToPlainText,
57
63
  markdownToSafeHtml: () => markdownToSafeHtml,
58
64
  readingTime: () => readingTime,
59
65
  sanitizeHtml: () => sanitizeHtml,
@@ -13119,9 +13125,71 @@ function markdownToSafeHtml(markdown) {
13119
13125
  return sanitizeHtml(rawHtml);
13120
13126
  }
13121
13127
 
13128
+ // src/lib/markdown-plain-text.ts
13129
+ var INLINE_TAGS = /* @__PURE__ */ new Set([
13130
+ "a",
13131
+ "abbr",
13132
+ "b",
13133
+ "code",
13134
+ "del",
13135
+ "em",
13136
+ "i",
13137
+ "ins",
13138
+ "kbd",
13139
+ "mark",
13140
+ "s",
13141
+ "small",
13142
+ "span",
13143
+ "strong",
13144
+ "sub",
13145
+ "sup",
13146
+ "u"
13147
+ ]);
13148
+ function collectText(nodes, out) {
13149
+ for (const node of nodes) {
13150
+ if (node.type === "text") {
13151
+ out.push(node.value);
13152
+ } else if (node.type === "element") {
13153
+ const block = !INLINE_TAGS.has(node.tagName);
13154
+ if (block) out.push(" ");
13155
+ collectText(node.children, out);
13156
+ if (block) out.push(" ");
13157
+ }
13158
+ }
13159
+ }
13160
+ function markdownToPlainText(markdown, { maxLength } = {}) {
13161
+ const html5 = markdownToSafeHtml(markdown);
13162
+ if (!html5) return "";
13163
+ const tree = fromParse5(parseFragment(html5));
13164
+ const parts = [];
13165
+ collectText(tree.children, parts);
13166
+ const text3 = parts.join("").replace(/\s+/g, " ").trim();
13167
+ if (maxLength === void 0 || text3.length <= maxLength) return text3;
13168
+ let cut = text3.slice(0, Math.max(0, maxLength - 1));
13169
+ const lastSpace = cut.lastIndexOf(" ");
13170
+ if (lastSpace > 0) cut = cut.slice(0, lastSpace);
13171
+ return `${cut.trimEnd()}\u2026`;
13172
+ }
13173
+
13122
13174
  // src/components/markdown-renderer.tsx
13123
- var import_utils = require("@reblu/site-ui/utils");
13124
13175
  var import_html_react_parser = require("html-react-parser");
13176
+
13177
+ // src/lib/slot-class-name.ts
13178
+ var import_utils = require("@reblu/site-ui/utils");
13179
+ var MERGE_SAFE_TEXT = /(?:^|:)!?text-(?:left|center|right|justify|start|end|wrap|nowrap|balance|pretty|ellipsis|clip)$/;
13180
+ var TEXT_UTILITY = /(?:^|:)!?-?text-/;
13181
+ function bypassesMerge(token) {
13182
+ return TEXT_UTILITY.test(token) && !MERGE_SAFE_TEXT.test(token);
13183
+ }
13184
+ function slotClassName(structural, defaults, consumer) {
13185
+ if (consumer === void 0 || consumer.trim() === "") return (0, import_utils.cn)(structural, defaults);
13186
+ const tokens = consumer.split(/\s+/).filter(Boolean);
13187
+ const verbatim = tokens.filter(bypassesMerge);
13188
+ const merged = (0, import_utils.cn)(structural, tokens.filter((token) => !bypassesMerge(token)));
13189
+ return [merged, ...verbatim].filter(Boolean).join(" ");
13190
+ }
13191
+
13192
+ // src/components/markdown-renderer.tsx
13125
13193
  var import_jsx_runtime = require("react/jsx-runtime");
13126
13194
  var HTML_TO_DOM_OPTIONS = { lowerCaseAttributeNames: false };
13127
13195
  function parse3(html5, options) {
@@ -13284,11 +13352,57 @@ function buildOptions(headingOffset) {
13284
13352
  function MarkdownRenderer({ content, className, headingOffset = 0 }) {
13285
13353
  const html5 = markdownToSafeHtml(content);
13286
13354
  if (!html5) return null;
13287
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_utils.cn)("max-w-none", className), "data-slot": "markdown", children: parse3(html5, buildOptions(headingOffset)) });
13355
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: slotClassName("max-w-none", "", className), "data-slot": "markdown", children: parse3(html5, buildOptions(headingOffset)) });
13288
13356
  }
13289
13357
  function SafeHtml({ html: html5, className, headingOffset = 0 }) {
13290
13358
  if (!html5) return null;
13291
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: (0, import_utils.cn)("max-w-none", className), "data-slot": "safe-html", children: parse3(html5, buildOptions(headingOffset)) });
13359
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: slotClassName("max-w-none", "", className), "data-slot": "safe-html", children: parse3(html5, buildOptions(headingOffset)) });
13360
+ }
13361
+
13362
+ // src/components/course-description.tsx
13363
+ var import_jsx_runtime2 = require("react/jsx-runtime");
13364
+ function isVisiblyEmpty(html5) {
13365
+ if (/<(img|iframe|hr)\b/i.test(html5)) return false;
13366
+ return html5.replace(/<[^>]*>/g, "").trim() === "";
13367
+ }
13368
+ function CourseDescription({
13369
+ description,
13370
+ heading,
13371
+ headingLevel = 2,
13372
+ headingId = "course-description-heading",
13373
+ headingOffset,
13374
+ className,
13375
+ headingClassName,
13376
+ contentClassName
13377
+ }) {
13378
+ const html5 = markdownToSafeHtml(typeof description === "string" ? description : null);
13379
+ if (!html5 || isVisiblyEmpty(html5)) return null;
13380
+ const hasHeading = heading !== void 0 && heading !== null && heading !== "";
13381
+ const offset = headingOffset ?? (hasHeading ? headingLevel - 1 : 0);
13382
+ const body3 = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
13383
+ SafeHtml,
13384
+ {
13385
+ html: html5,
13386
+ headingOffset: offset,
13387
+ className: slotClassName("", "text-muted-foreground", contentClassName)
13388
+ }
13389
+ );
13390
+ if (!hasHeading) {
13391
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { "data-slot": "course-description", className, children: body3 });
13392
+ }
13393
+ const Tag = `h${headingLevel}`;
13394
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
13395
+ "section",
13396
+ {
13397
+ "data-slot": "course-description",
13398
+ "aria-labelledby": headingId,
13399
+ className: slotClassName("space-y-3", "", className),
13400
+ children: [
13401
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Tag, { id: headingId, className: slotClassName("", "text-xl font-semibold", headingClassName), children: heading }),
13402
+ body3
13403
+ ]
13404
+ }
13405
+ );
13292
13406
  }
13293
13407
 
13294
13408
  // src/components/treatment.tsx
@@ -13297,7 +13411,7 @@ var import_utils3 = require("@reblu/site-ui/utils");
13297
13411
  // src/components/_page-parts.tsx
13298
13412
  var import_utils2 = require("@reblu/site-ui/utils");
13299
13413
  var import_button_variants = require("@reblu/site-ui/button-variants");
13300
- var import_jsx_runtime2 = require("react/jsx-runtime");
13414
+ var import_jsx_runtime3 = require("react/jsx-runtime");
13301
13415
  var KNOWN_BUTTON_VARIANTS = /* @__PURE__ */ new Set([
13302
13416
  "default",
13303
13417
  "destructive",
@@ -13310,11 +13424,11 @@ function toButtonVariant(variant) {
13310
13424
  return variant && KNOWN_BUTTON_VARIANTS.has(variant) ? variant : "default";
13311
13425
  }
13312
13426
  function PageHero({ page }) {
13313
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("header", { className: "space-y-4", children: [
13314
- page.category && /* @__PURE__ */ (0, import_jsx_runtime2.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 }),
13315
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h1", { className: "text-4xl font-bold tracking-tight", children: page.title }),
13316
- page.subtitle && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-lg text-muted-foreground", children: page.subtitle }),
13317
- page.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
13427
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("header", { className: "space-y-4", children: [
13428
+ 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 }),
13429
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h1", { className: "text-4xl font-bold tracking-tight", children: page.title }),
13430
+ page.subtitle && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "text-lg text-muted-foreground", children: page.subtitle }),
13431
+ 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)(
13318
13432
  "img",
13319
13433
  {
13320
13434
  src: page.coverImageUrl,
@@ -13328,7 +13442,7 @@ function PageHero({ page }) {
13328
13442
  function SectionCta({ section }) {
13329
13443
  if (!section.ctaLabel || !section.ctaUrl) return null;
13330
13444
  const variant = toButtonVariant(section.ctaVariant);
13331
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
13445
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
13332
13446
  "a",
13333
13447
  {
13334
13448
  href: section.ctaUrl,
@@ -13343,46 +13457,46 @@ function SectionCta({ section }) {
13343
13457
  }
13344
13458
  function SectionImages({ section }) {
13345
13459
  if (section.images.length === 0) return null;
13346
- return /* @__PURE__ */ (0, import_jsx_runtime2.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_runtime2.jsxs)("figure", { className: "space-y-1", children: [
13347
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("img", { src: img.url, alt: img.alt, loading: "lazy", className: "h-full w-full object-cover" }) }),
13348
- img.caption && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("figcaption", { className: "text-sm text-muted-foreground", children: img.caption })
13460
+ 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: [
13461
+ /* @__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" }) }),
13462
+ img.caption && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("figcaption", { className: "text-sm text-muted-foreground", children: img.caption })
13349
13463
  ] }, `${img.url}-${img.order}`)) });
13350
13464
  }
13351
13465
  function PageSectionBlock({ section }) {
13352
13466
  const imageFirst = section.layout === "IMAGE_TEXT";
13353
13467
  const sideBySide = section.layout === "TEXT_IMAGE" || section.layout === "IMAGE_TEXT";
13354
13468
  const hasImages = section.images.length > 0;
13355
- const body3 = /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "space-y-4", children: [
13356
- section.heading && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("h2", { className: "text-2xl font-bold", children: section.heading }),
13357
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SafeHtml, { html: sanitizeHtml(section.contentHtml), headingOffset: 2 }),
13358
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SectionCta, { section })
13469
+ const body3 = /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "space-y-4", children: [
13470
+ section.heading && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h2", { className: "text-2xl font-bold", children: section.heading }),
13471
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SafeHtml, { html: sanitizeHtml(section.contentHtml), headingOffset: 2 }),
13472
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionCta, { section })
13359
13473
  ] });
13360
13474
  if (sideBySide && hasImages) {
13361
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("section", { className: "grid items-center gap-8 md:grid-cols-2", children: imageFirst ? /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
13362
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SectionImages, { section }),
13475
+ 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: [
13476
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionImages, { section }),
13363
13477
  body3
13364
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
13478
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
13365
13479
  body3,
13366
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SectionImages, { section })
13480
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionImages, { section })
13367
13481
  ] }) });
13368
13482
  }
13369
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("section", { className: "space-y-4", children: [
13483
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("section", { className: "space-y-4", children: [
13370
13484
  body3,
13371
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(SectionImages, { section })
13485
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(SectionImages, { section })
13372
13486
  ] });
13373
13487
  }
13374
13488
  function PageSectionList({ sections }) {
13375
13489
  if (sections.length === 0) return null;
13376
13490
  const ordered = sections.slice().sort((a, b2) => a.order - b2.order);
13377
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { className: "space-y-12", children: ordered.map((section) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PageSectionBlock, { section }, section.id)) });
13491
+ 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)) });
13378
13492
  }
13379
13493
 
13380
13494
  // src/components/treatment.tsx
13381
- var import_jsx_runtime3 = require("react/jsx-runtime");
13495
+ var import_jsx_runtime4 = require("react/jsx-runtime");
13382
13496
  function Treatment({ page, className }) {
13383
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("article", { className: (0, import_utils3.cn)("space-y-12", className), "data-slot": "treatment", children: [
13384
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PageHero, { page }),
13385
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PageSectionList, { sections: page.sections })
13497
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("article", { className: (0, import_utils3.cn)("space-y-12", className), "data-slot": "treatment", children: [
13498
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PageHero, { page }),
13499
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PageSectionList, { sections: page.sections })
13386
13500
  ] });
13387
13501
  }
13388
13502
 
@@ -13391,11 +13505,11 @@ var import_utils5 = require("@reblu/site-ui/utils");
13391
13505
 
13392
13506
  // src/components/page-card-grid.tsx
13393
13507
  var import_utils4 = require("@reblu/site-ui/utils");
13394
- var import_jsx_runtime4 = require("react/jsx-runtime");
13508
+ var import_jsx_runtime5 = require("react/jsx-runtime");
13395
13509
  var defaultPageHref = (page) => `/${page.slug}`;
13396
13510
  var pageKey = (page) => `${page.category?.slug ?? ""}/${page.slug}`;
13397
13511
  function PageCardGrid(props) {
13398
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(PageCardGridSection, { ...props });
13512
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageCardGridSection, { ...props });
13399
13513
  }
13400
13514
  function PageCardGridSection({
13401
13515
  pages,
@@ -13406,15 +13520,15 @@ function PageCardGridSection({
13406
13520
  }) {
13407
13521
  if (pages.length === 0) return null;
13408
13522
  const showHeading = keepEmptyHeading ? heading !== void 0 : !!heading;
13409
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("section", { className: (0, import_utils4.cn)("space-y-6", className), children: [
13410
- showHeading && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h2", { className: "text-2xl font-bold", children: heading }),
13411
- /* @__PURE__ */ (0, import_jsx_runtime4.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_runtime4.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
13523
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("section", { className: (0, import_utils4.cn)("space-y-6", className), children: [
13524
+ showHeading && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h2", { className: "text-2xl font-bold", children: heading }),
13525
+ /* @__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)(
13412
13526
  "a",
13413
13527
  {
13414
13528
  href: pageHref(page),
13415
13529
  className: "group flex h-full flex-col overflow-hidden rounded-lg border bg-card transition-shadow hover:shadow-lg",
13416
13530
  children: [
13417
- page.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "relative aspect-video overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
13531
+ page.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { className: "relative aspect-video overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
13418
13532
  "img",
13419
13533
  {
13420
13534
  src: page.coverImageUrl,
@@ -13423,9 +13537,9 @@ function PageCardGridSection({
13423
13537
  className: "h-full w-full object-cover transition-transform group-hover:scale-105"
13424
13538
  }
13425
13539
  ) }),
13426
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13427
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h3", { className: "font-semibold leading-tight transition-colors group-hover:text-primary", children: page.title }),
13428
- page.excerpt && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: page.excerpt })
13540
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13541
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("h3", { className: "font-semibold leading-tight transition-colors group-hover:text-primary", children: page.title }),
13542
+ page.excerpt && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: page.excerpt })
13429
13543
  ] })
13430
13544
  ]
13431
13545
  }
@@ -13434,7 +13548,7 @@ function PageCardGridSection({
13434
13548
  }
13435
13549
 
13436
13550
  // src/components/parent-page.tsx
13437
- var import_jsx_runtime5 = require("react/jsx-runtime");
13551
+ var import_jsx_runtime6 = require("react/jsx-runtime");
13438
13552
  var defaultChildPageHref = (slug) => `/${slug}`;
13439
13553
  function ParentPage({
13440
13554
  page,
@@ -13449,10 +13563,10 @@ function ParentPage({
13449
13563
  const pages = childPages ?? treatments ?? [];
13450
13564
  const hrefFor = childPageHref ?? treatmentHref ?? defaultChildPageHref;
13451
13565
  const label = childPagesLabel ?? treatmentsLabel ?? "Treatments";
13452
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("article", { className: (0, import_utils5.cn)("space-y-12", className), "data-slot": "specialty", children: [
13453
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageHero, { page }),
13454
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(PageSectionList, { sections: page.sections }),
13455
- /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
13566
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("article", { className: (0, import_utils5.cn)("space-y-12", className), "data-slot": "specialty", children: [
13567
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PageHero, { page }),
13568
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(PageSectionList, { sections: page.sections }),
13569
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
13456
13570
  PageCardGridSection,
13457
13571
  {
13458
13572
  pages,
@@ -13469,13 +13583,13 @@ var Specialty = ParentPage;
13469
13583
 
13470
13584
  // src/components/profile-card.tsx
13471
13585
  var import_utils6 = require("@reblu/site-ui/utils");
13472
- var import_jsx_runtime6 = require("react/jsx-runtime");
13586
+ var import_jsx_runtime7 = require("react/jsx-runtime");
13473
13587
  function initials(name) {
13474
13588
  return name.split(/\s+/).filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("");
13475
13589
  }
13476
13590
  function ProfileCard({ name, role, imageUrl, specialties = [], bio, href, className }) {
13477
13591
  const NameTag = href ? "a" : "span";
13478
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
13592
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
13479
13593
  "article",
13480
13594
  {
13481
13595
  className: (0, import_utils6.cn)(
@@ -13484,18 +13598,18 @@ function ProfileCard({ name, role, imageUrl, specialties = [], bio, href, classN
13484
13598
  ),
13485
13599
  "data-slot": "profile-card",
13486
13600
  children: [
13487
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: "relative h-24 w-24 overflow-hidden rounded-full bg-muted", children: imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("img", { src: imageUrl, alt: name, loading: "lazy", className: "h-full w-full object-cover" }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "flex h-full w-full items-center justify-center text-2xl font-semibold text-muted-foreground", "aria-hidden": "true", children: initials(name) }) }),
13488
- /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "space-y-1", children: [
13489
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("h3", { className: "text-lg font-semibold leading-tight", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
13601
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "relative h-24 w-24 overflow-hidden rounded-full bg-muted", children: imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("img", { src: imageUrl, alt: name, loading: "lazy", className: "h-full w-full object-cover" }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "flex h-full w-full items-center justify-center text-2xl font-semibold text-muted-foreground", "aria-hidden": "true", children: initials(name) }) }),
13602
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "space-y-1", children: [
13603
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h3", { className: "text-lg font-semibold leading-tight", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13490
13604
  NameTag,
13491
13605
  {
13492
13606
  ...href ? { href, className: "transition-colors hover:text-primary" } : {},
13493
13607
  children: name
13494
13608
  }
13495
13609
  ) }),
13496
- role && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: role })
13610
+ role && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-sm text-muted-foreground", children: role })
13497
13611
  ] }),
13498
- specialties.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("ul", { className: "flex flex-wrap justify-center gap-1.5 p-0", children: specialties.map((s2) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
13612
+ specialties.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("ul", { className: "flex flex-wrap justify-center gap-1.5 p-0", children: specialties.map((s2) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13499
13613
  "li",
13500
13614
  {
13501
13615
  className: "inline-flex items-center rounded-full bg-secondary px-2.5 py-0.5 text-xs font-medium text-secondary-foreground",
@@ -13503,7 +13617,7 @@ function ProfileCard({ name, role, imageUrl, specialties = [], bio, href, classN
13503
13617
  },
13504
13618
  s2
13505
13619
  )) }),
13506
- bio && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("p", { className: "text-sm text-muted-foreground", children: bio })
13620
+ bio && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "text-sm text-muted-foreground", children: bio })
13507
13621
  ]
13508
13622
  }
13509
13623
  );
@@ -13511,11 +13625,11 @@ function ProfileCard({ name, role, imageUrl, specialties = [], bio, href, classN
13511
13625
 
13512
13626
  // src/components/product-card.tsx
13513
13627
  var import_utils7 = require("@reblu/site-ui/utils");
13514
- var import_jsx_runtime7 = require("react/jsx-runtime");
13628
+ var import_jsx_runtime8 = require("react/jsx-runtime");
13515
13629
  function ProductCard({ product, href, currencyCode = "EUR", locale, className }) {
13516
13630
  const image = product.images.find((i) => i.isPrimary) ?? product.images[0];
13517
13631
  const hasDiscount = product.comparePrice != null && product.comparePrice > product.price;
13518
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
13632
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
13519
13633
  "article",
13520
13634
  {
13521
13635
  className: (0, import_utils7.cn)(
@@ -13524,7 +13638,7 @@ function ProductCard({ product, href, currencyCode = "EUR", locale, className })
13524
13638
  ),
13525
13639
  "data-slot": "product-card",
13526
13640
  children: [
13527
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "relative aspect-square overflow-hidden bg-muted", children: image ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
13641
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "relative aspect-square overflow-hidden bg-muted", children: image ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
13528
13642
  "img",
13529
13643
  {
13530
13644
  src: image.url,
@@ -13532,14 +13646,14 @@ function ProductCard({ product, href, currencyCode = "EUR", locale, className })
13532
13646
  loading: "lazy",
13533
13647
  className: "h-full w-full object-cover transition-transform group-hover:scale-105"
13534
13648
  }
13535
- ) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "flex h-full items-center justify-center text-4xl text-muted-foreground/30", "aria-hidden": "true", children: "\u{1F6CD}\uFE0F" }) }),
13536
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13537
- product.category && /* @__PURE__ */ (0, import_jsx_runtime7.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 }),
13538
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h3", { className: "text-base font-semibold leading-tight", children: href ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("a", { href, className: "transition-colors hover:text-primary", children: product.name }) : product.name }),
13539
- product.shortDescription && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: product.shortDescription }),
13540
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "mt-auto flex items-baseline gap-2 pt-2", children: [
13541
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-lg font-bold text-foreground", children: formatPrice(product.price, currencyCode, locale) }),
13542
- hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: "text-sm text-muted-foreground line-through", children: formatPrice(product.comparePrice, currencyCode, locale) })
13649
+ ) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "flex h-full items-center justify-center text-4xl text-muted-foreground/30", "aria-hidden": "true", children: "\u{1F6CD}\uFE0F" }) }),
13650
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "flex flex-1 flex-col gap-2 p-4", children: [
13651
+ product.category && /* @__PURE__ */ (0, import_jsx_runtime8.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 }),
13652
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h3", { className: "text-base font-semibold leading-tight", children: href ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("a", { href, className: "transition-colors hover:text-primary", children: product.name }) : product.name }),
13653
+ product.shortDescription && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("p", { className: "line-clamp-2 text-sm text-muted-foreground", children: product.shortDescription }),
13654
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "mt-auto flex items-baseline gap-2 pt-2", children: [
13655
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "text-lg font-bold text-foreground", children: formatPrice(product.price, currencyCode, locale) }),
13656
+ hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { className: "text-sm text-muted-foreground line-through", children: formatPrice(product.comparePrice, currencyCode, locale) })
13543
13657
  ] })
13544
13658
  ] })
13545
13659
  ]
@@ -13741,8 +13855,7 @@ var __iconNode8 = [
13741
13855
  var Truck = createLucideIcon("truck", __iconNode8);
13742
13856
 
13743
13857
  // src/components/product-trust-items.tsx
13744
- var import_utils10 = require("@reblu/site-ui/utils");
13745
- var import_jsx_runtime8 = require("react/jsx-runtime");
13858
+ var import_jsx_runtime9 = require("react/jsx-runtime");
13746
13859
  var DEFAULT_TRUST_ICONS = Object.freeze({
13747
13860
  shipping: Truck,
13748
13861
  returns: RotateCcw,
@@ -13776,17 +13889,17 @@ function ProductTrustItems({
13776
13889
  return [{ key: `${index}-${icon}`, Icon: Icon2, text: text3 }];
13777
13890
  });
13778
13891
  if (rows.length === 0) return null;
13779
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(List, { "data-slot": "product-trust-items", className: (0, import_utils10.cn)("space-y-2.5", className), children: rows.map(({ key: key2, Icon: Icon2, text: text3 }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("li", { className: (0, import_utils10.cn)("flex items-center gap-3 text-sm text-muted-foreground", itemClassName), children: [
13780
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Icon2, { "aria-hidden": "true", className: "h-4 w-4 shrink-0 text-foreground/60" }),
13781
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", { children: text3 })
13892
+ return /* @__PURE__ */ (0, import_jsx_runtime9.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_runtime9.jsxs)("li", { className: slotClassName("flex items-center gap-3", "text-sm text-muted-foreground", itemClassName), children: [
13893
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Icon2, { "aria-hidden": "true", className: "h-4 w-4 shrink-0 text-foreground/60" }),
13894
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { children: text3 })
13782
13895
  ] }, key2)) });
13783
13896
  }
13784
13897
 
13785
13898
  // src/components/faq-accordion.tsx
13786
- var import_utils11 = require("@reblu/site-ui/utils");
13899
+ var import_utils10 = require("@reblu/site-ui/utils");
13787
13900
 
13788
13901
  // src/components/_heading.tsx
13789
- var import_jsx_runtime9 = require("react/jsx-runtime");
13902
+ var import_jsx_runtime10 = require("react/jsx-runtime");
13790
13903
  function nextHeadingLevel(level) {
13791
13904
  return Math.min(level + 1, 6);
13792
13905
  }
@@ -13796,11 +13909,11 @@ function Heading({
13796
13909
  children: children2
13797
13910
  }) {
13798
13911
  const Tag = `h${level}`;
13799
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Tag, { className, children: children2 });
13912
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Tag, { className, children: children2 });
13800
13913
  }
13801
13914
 
13802
13915
  // src/components/faq-accordion.tsx
13803
- var import_jsx_runtime10 = require("react/jsx-runtime");
13916
+ var import_jsx_runtime11 = require("react/jsx-runtime");
13804
13917
  function FaqAccordion({
13805
13918
  items,
13806
13919
  heading,
@@ -13811,18 +13924,18 @@ function FaqAccordion({
13811
13924
  }) {
13812
13925
  const visible = items.map((item, index) => ({ item, index })).filter(({ item }) => item.q.trim() !== "");
13813
13926
  if (visible.length === 0) return null;
13814
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: (0, import_utils11.cn)("space-y-4", className), "data-slot": "faq-accordion", children: [
13815
- heading && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Heading, { level: headingLevel, className: "text-2xl font-semibold tracking-tight", children: heading }),
13816
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "divide-y divide-border rounded-xl border border-border", children: visible.map(({ item, index }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
13927
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: (0, import_utils10.cn)("space-y-4", className), "data-slot": "faq-accordion", children: [
13928
+ heading && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Heading, { level: headingLevel, className: "text-2xl font-semibold tracking-tight", children: heading }),
13929
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "divide-y divide-border rounded-xl border border-border", children: visible.map(({ item, index }) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
13817
13930
  "details",
13818
13931
  {
13819
13932
  className: "group px-4",
13820
13933
  "data-slot": "faq-item",
13821
13934
  ...defaultOpen.includes(index) ? { open: true } : {},
13822
13935
  children: [
13823
- /* @__PURE__ */ (0, import_jsx_runtime10.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: [
13824
- questionHeadingLevel ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Heading, { level: questionHeadingLevel, className: "text-base font-medium", children: item.q }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: item.q }),
13825
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
13936
+ /* @__PURE__ */ (0, import_jsx_runtime11.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: [
13937
+ questionHeadingLevel ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Heading, { level: questionHeadingLevel, className: "text-base font-medium", children: item.q }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { children: item.q }),
13938
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
13826
13939
  "span",
13827
13940
  {
13828
13941
  "aria-hidden": "true",
@@ -13831,7 +13944,7 @@ function FaqAccordion({
13831
13944
  }
13832
13945
  )
13833
13946
  ] }),
13834
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "whitespace-pre-line pb-4 text-muted-foreground", children: item.a })
13947
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "whitespace-pre-line pb-4 text-muted-foreground", children: item.a })
13835
13948
  ]
13836
13949
  },
13837
13950
  index
@@ -13839,41 +13952,151 @@ function FaqAccordion({
13839
13952
  ] });
13840
13953
  }
13841
13954
 
13955
+ // src/components/trust-badges.tsx
13956
+ var import_utils11 = require("@reblu/site-ui/utils");
13957
+ var import_jsx_runtime12 = (
13958
+ // eslint-disable-next-line @next/next/no-img-element -- framework-agnostic SDK; the SITE owns image optimisation
13959
+ require("react/jsx-runtime")
13960
+ );
13961
+ var DEFAULT_TRUST_BADGE_HEADINGS = Object.freeze(
13962
+ {
13963
+ PARTNER: "Colaboradores",
13964
+ INSURANCE: "Aseguradoras",
13965
+ SUBVENTION: "Financiaci\xF3n",
13966
+ CERTIFICATION: "Certificaciones",
13967
+ AWARD: "Premios"
13968
+ }
13969
+ );
13970
+ var DEFAULT_TRUST_BADGE_TYPE_ORDER = Object.freeze([
13971
+ "SUBVENTION",
13972
+ "CERTIFICATION",
13973
+ "AWARD",
13974
+ "PARTNER",
13975
+ "INSURANCE"
13976
+ ]);
13977
+ var KNOWN_TYPES = new Set(DEFAULT_TRUST_BADGE_TYPE_ORDER);
13978
+ function isUsable(value) {
13979
+ if (typeof value !== "object" || value === null) return false;
13980
+ const entry = value;
13981
+ return typeof entry.type === "string" && KNOWN_TYPES.has(entry.type) && typeof entry.name === "string" && entry.name.trim() !== "";
13982
+ }
13983
+ function safeHref(url) {
13984
+ if (typeof url !== "string") return null;
13985
+ try {
13986
+ const parsed = new URL(url);
13987
+ return parsed.protocol === "https:" || parsed.protocol === "http:" ? url : null;
13988
+ } catch {
13989
+ return null;
13990
+ }
13991
+ }
13992
+ function BadgeContent({ badge, logoClassName }) {
13993
+ if (badge.logoUrl) {
13994
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
13995
+ "img",
13996
+ {
13997
+ src: badge.logoUrl,
13998
+ alt: badge.name,
13999
+ loading: "lazy",
14000
+ className: (0, import_utils11.cn)("h-12 w-auto object-contain", logoClassName)
14001
+ }
14002
+ );
14003
+ }
14004
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "text-sm font-medium", children: badge.name });
14005
+ }
14006
+ function TrustBadges({
14007
+ badges,
14008
+ headings,
14009
+ types = DEFAULT_TRUST_BADGE_TYPE_ORDER,
14010
+ headingLevel = 2,
14011
+ newWindowLabel = "(se abre en una ventana nueva)",
14012
+ className,
14013
+ groupClassName,
14014
+ headingClassName,
14015
+ listClassName,
14016
+ logoClassName
14017
+ }) {
14018
+ if (!Array.isArray(badges) || badges.length === 0) return null;
14019
+ const usable = badges.filter(isUsable);
14020
+ const groups = types.flatMap((type) => {
14021
+ const items = usable.filter((b2) => b2.type === type).map((b2, index) => ({ b: b2, index })).sort((x2, y2) => (x2.b.sortOrder ?? 0) - (y2.b.sortOrder ?? 0) || x2.index - y2.index).map(({ b: b2 }) => b2);
14022
+ if (items.length === 0) return [];
14023
+ const heading = headings && Object.prototype.hasOwnProperty.call(headings, type) ? headings[type] : DEFAULT_TRUST_BADGE_HEADINGS[type];
14024
+ return [{ type, heading, items }];
14025
+ });
14026
+ if (groups.length === 0) return null;
14027
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { "data-slot": "trust-badges", className: (0, import_utils11.cn)("space-y-6", className), children: groups.map(({ type, heading, items }) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
14028
+ "div",
14029
+ {
14030
+ "data-slot": "trust-badge-group",
14031
+ "data-type": type,
14032
+ className: (0, import_utils11.cn)("space-y-3", groupClassName),
14033
+ children: [
14034
+ heading ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14035
+ Heading,
14036
+ {
14037
+ level: headingLevel,
14038
+ className: (0, import_utils11.cn)("text-sm font-semibold uppercase tracking-widest", headingClassName),
14039
+ children: heading
14040
+ }
14041
+ ) : null,
14042
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("ul", { className: (0, import_utils11.cn)("flex flex-wrap items-center gap-6", listClassName), children: items.map((badge) => {
14043
+ const href = safeHref(badge.url);
14044
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("li", { children: href ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
14045
+ "a",
14046
+ {
14047
+ href,
14048
+ target: "_blank",
14049
+ rel: "noopener noreferrer",
14050
+ className: "inline-flex",
14051
+ children: [
14052
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(BadgeContent, { badge, logoClassName }),
14053
+ " ",
14054
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "sr-only", children: newWindowLabel })
14055
+ ]
14056
+ }
14057
+ ) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(BadgeContent, { badge, logoClassName }) }, badge.id);
14058
+ }) })
14059
+ ]
14060
+ },
14061
+ type
14062
+ )) });
14063
+ }
14064
+
13842
14065
  // src/components/page-blocks.tsx
13843
14066
  var import_utils12 = require("@reblu/site-ui/utils");
13844
14067
  var import_button_variants2 = require("@reblu/site-ui/button-variants");
13845
- var import_jsx_runtime11 = require("react/jsx-runtime");
14068
+ var import_jsx_runtime13 = require("react/jsx-runtime");
13846
14069
  var ALIASES = {
13847
14070
  doctor_embed: "profile_embed",
13848
14071
  specialty_embed: "page_embed"
13849
14072
  };
13850
14073
  function HeroBlock({ block, headingLevel }) {
13851
14074
  const { title, subtitle, imageUrl } = block.data;
13852
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "space-y-4", children: [
13853
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
13854
- subtitle && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
13855
- imageUrl && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
14075
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "space-y-4", children: [
14076
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Heading, { level: headingLevel, className: "text-3xl font-bold tracking-tight md:text-4xl", children: title }),
14077
+ subtitle && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-lg opacity-80", children: subtitle }),
14078
+ imageUrl && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "relative aspect-[21/9] w-full overflow-hidden rounded-xl bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("img", { src: imageUrl, alt: "", loading: "lazy", className: "h-full w-full object-cover" }) })
13856
14079
  ] });
13857
14080
  }
13858
14081
  function RichtextBlock({ block, headingLevel }) {
13859
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
14082
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SafeHtml, { html: sanitizeHtml(block.data.html), headingOffset: headingLevel - 1 });
13860
14083
  }
13861
14084
  function FaqBlock({ block }) {
13862
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(FaqAccordion, { items: block.data.items });
14085
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(FaqAccordion, { items: block.data.items });
13863
14086
  }
13864
14087
  function StatsBlock({ block }) {
13865
- return /* @__PURE__ */ (0, import_jsx_runtime11.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_runtime11.jsxs)("div", { className: "flex flex-col-reverse gap-1", children: [
13866
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
13867
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("dd", { className: "text-3xl font-bold", children: item.value })
14088
+ return /* @__PURE__ */ (0, import_jsx_runtime13.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_runtime13.jsxs)("div", { className: "flex flex-col-reverse gap-1", children: [
14089
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("dt", { className: "text-sm opacity-80", children: item.label }),
14090
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("dd", { className: "text-3xl font-bold", children: item.value })
13868
14091
  ] }, i)) });
13869
14092
  }
13870
14093
  function TestimonialBlock({ block }) {
13871
14094
  const { quote, author, role, avatarUrl } = block.data;
13872
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("figure", { className: "space-y-4", children: [
13873
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { children: quote }) }),
13874
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("figcaption", { className: "flex items-center gap-3", children: [
14095
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("figure", { className: "space-y-4", children: [
14096
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("blockquote", { className: "text-xl italic", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { children: quote }) }),
14097
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("figcaption", { className: "flex items-center gap-3", children: [
13875
14098
  avatarUrl && // eslint-disable-next-line @next/next/no-img-element
13876
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14099
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
13877
14100
  "img",
13878
14101
  {
13879
14102
  src: avatarUrl,
@@ -13882,9 +14105,9 @@ function TestimonialBlock({ block }) {
13882
14105
  className: "h-10 w-10 rounded-full object-cover"
13883
14106
  }
13884
14107
  ),
13885
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { children: [
13886
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "font-semibold", children: author }),
13887
- role && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "block text-sm opacity-80", children: role })
14108
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("span", { children: [
14109
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "font-semibold", children: author }),
14110
+ role && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "block text-sm opacity-80", children: role })
13888
14111
  ] })
13889
14112
  ] })
13890
14113
  ] });
@@ -13893,19 +14116,19 @@ function CtaSlotBlock(_props) {
13893
14116
  return null;
13894
14117
  }
13895
14118
  function FeatureListBlock({ block }) {
13896
- return /* @__PURE__ */ (0, import_jsx_runtime11.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_runtime11.jsx)("li", { children: item.text }, i)) });
14119
+ return /* @__PURE__ */ (0, import_jsx_runtime13.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_runtime13.jsx)("li", { children: item.text }, i)) });
13897
14120
  }
13898
14121
  function GalleryBlock({ block }) {
13899
14122
  const { images } = block.data;
13900
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14123
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
13901
14124
  "div",
13902
14125
  {
13903
14126
  className: (0, import_utils12.cn)(
13904
14127
  "grid gap-4",
13905
14128
  images.length > 1 ? "sm:grid-cols-2 lg:grid-cols-3" : "grid-cols-1"
13906
14129
  ),
13907
- children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("figure", { className: "space-y-1", children: [
13908
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14130
+ children: images.map((img, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("figure", { className: "space-y-1", children: [
14131
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "relative aspect-video w-full overflow-hidden rounded-lg bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
13909
14132
  "img",
13910
14133
  {
13911
14134
  src: img.url,
@@ -13914,7 +14137,7 @@ function GalleryBlock({ block }) {
13914
14137
  className: "h-full w-full object-cover"
13915
14138
  }
13916
14139
  ) }),
13917
- img.caption && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("figcaption", { className: "text-sm opacity-80", children: img.caption })
14140
+ img.caption && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("figcaption", { className: "text-sm opacity-80", children: img.caption })
13918
14141
  ] }, `${img.url}-${i}`))
13919
14142
  }
13920
14143
  );
@@ -13924,13 +14147,13 @@ function EmbedCard({
13924
14147
  headingLevel,
13925
14148
  embedHref
13926
14149
  }) {
13927
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
14150
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
13928
14151
  "a",
13929
14152
  {
13930
14153
  href: embedHref(resolved),
13931
14154
  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",
13932
14155
  children: [
13933
- resolved.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14156
+ resolved.coverImageUrl && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "aspect-video w-full overflow-hidden bg-muted", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
13934
14157
  "img",
13935
14158
  {
13936
14159
  src: resolved.coverImageUrl,
@@ -13939,24 +14162,24 @@ function EmbedCard({
13939
14162
  className: "h-full w-full object-cover"
13940
14163
  }
13941
14164
  ) }),
13942
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "space-y-1 p-4", children: [
13943
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
13944
- resolved.role && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
13945
- resolved.excerpt && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("p", { className: "text-muted-foreground", children: resolved.excerpt })
14165
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "space-y-1 p-4", children: [
14166
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Heading, { level: headingLevel, className: "text-lg font-semibold", children: resolved.title }),
14167
+ resolved.role && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-sm text-muted-foreground", children: resolved.role }),
14168
+ resolved.excerpt && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-muted-foreground", children: resolved.excerpt })
13946
14169
  ] })
13947
14170
  ]
13948
14171
  }
13949
14172
  );
13950
14173
  }
13951
14174
  function PageEmbedBlock({ block, headingLevel, embedHref }) {
13952
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
14175
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
13953
14176
  }
13954
14177
  function ProfileEmbedBlock({
13955
14178
  block,
13956
14179
  headingLevel,
13957
14180
  embedHref
13958
14181
  }) {
13959
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
14182
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(EmbedCard, { resolved: block.resolved, headingLevel, embedHref });
13960
14183
  }
13961
14184
  var DEFAULT_RENDERERS = {
13962
14185
  hero: HeroBlock,
@@ -14013,7 +14236,7 @@ function toIdFragment(value) {
14013
14236
  function SectionCta2({ cta }) {
14014
14237
  if (!hasUsableCta(cta)) return null;
14015
14238
  const variant = toButtonVariant(cta.variant);
14016
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14239
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "pt-2", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14017
14240
  "a",
14018
14241
  {
14019
14242
  href: cta.url,
@@ -14046,7 +14269,7 @@ function PageBlocks({
14046
14269
  const headingId = block.heading ? `${safePrefix}-${toIdFragment(block.id)}-heading` : void 0;
14047
14270
  const background = block.backgroundColor;
14048
14271
  return [
14049
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
14272
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
14050
14273
  "section",
14051
14274
  {
14052
14275
  "data-slot": "page-block",
@@ -14055,8 +14278,8 @@ function PageBlocks({
14055
14278
  style: surfaceStyle(background),
14056
14279
  className: (0, import_utils12.cn)("space-y-6", background && "rounded-xl px-6 py-10", sectionClassName),
14057
14280
  children: [
14058
- block.heading && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { id: headingId, children: block.heading }) }),
14059
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
14281
+ block.heading && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Heading, { level: headingLevel, className: "text-2xl font-bold tracking-tight", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { id: headingId, children: block.heading }) }),
14282
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14060
14283
  Renderer,
14061
14284
  {
14062
14285
  block,
@@ -14064,7 +14287,7 @@ function PageBlocks({
14064
14287
  embedHref
14065
14288
  }
14066
14289
  ),
14067
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SectionCta2, { cta: block.cta })
14290
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(SectionCta2, { cta: block.cta })
14068
14291
  ]
14069
14292
  },
14070
14293
  block.id
@@ -14072,12 +14295,12 @@ function PageBlocks({
14072
14295
  ];
14073
14296
  });
14074
14297
  if (sections.length === 0) return null;
14075
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: (0, import_utils12.cn)("space-y-12", className), "data-slot": "page-blocks", children: sections });
14298
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: (0, import_utils12.cn)("space-y-12", className), "data-slot": "page-blocks", children: sections });
14076
14299
  }
14077
14300
 
14078
14301
  // src/components/shop-filters.tsx
14079
14302
  var import_utils13 = require("@reblu/site-ui/utils");
14080
- var import_jsx_runtime12 = require("react/jsx-runtime");
14303
+ var import_jsx_runtime14 = require("react/jsx-runtime");
14081
14304
  var DEFAULT_SHOP_PRICE_BANDS = [
14082
14305
  { max: 2500 },
14083
14306
  { min: 2500, max: 5e3 },
@@ -14121,7 +14344,7 @@ function priceBandLabel(band, t, currencyCode, locale) {
14121
14344
  return "";
14122
14345
  }
14123
14346
  function OptionLink({ href, active, label, onActivate }) {
14124
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14347
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14125
14348
  "a",
14126
14349
  {
14127
14350
  href,
@@ -14139,9 +14362,9 @@ function OptionLink({ href, active, label, onActivate }) {
14139
14362
  );
14140
14363
  }
14141
14364
  function FilterFieldset({ legend, children: children2 }) {
14142
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("fieldset", { className: "space-y-2", children: [
14143
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
14144
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
14365
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("fieldset", { className: "space-y-2", children: [
14366
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("legend", { className: "text-sm font-medium text-foreground", children: legend }),
14367
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "flex flex-wrap gap-2", children: children2 })
14145
14368
  ] });
14146
14369
  }
14147
14370
  function ShopFilters({
@@ -14164,11 +14387,11 @@ function ShopFilters({
14164
14387
  if (!shouldRenderShopFilters(facets, active)) {
14165
14388
  return null;
14166
14389
  }
14167
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: (0, import_utils13.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
14390
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: (0, import_utils13.cn)("space-y-6", className), "data-slot": "shop-filters", children: [
14168
14391
  visibleTaxonomies.map((axis) => {
14169
14392
  const activeSlug = active.taxonomy?.[axis.key];
14170
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(FilterFieldset, { legend: axis.label, children: [
14171
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14393
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(FilterFieldset, { legend: axis.label, children: [
14394
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14172
14395
  OptionLink,
14173
14396
  {
14174
14397
  href: hrefs.taxonomy(axis.key, void 0),
@@ -14183,7 +14406,7 @@ function ShopFilters({
14183
14406
  ),
14184
14407
  axis.terms.map((term) => {
14185
14408
  const isActive = activeSlug === term.slug;
14186
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14409
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14187
14410
  OptionLink,
14188
14411
  {
14189
14412
  href: hrefs.taxonomy(axis.key, isActive ? void 0 : term.slug),
@@ -14203,9 +14426,9 @@ function ShopFilters({
14203
14426
  }),
14204
14427
  visibleAttributes.map((attr) => {
14205
14428
  const activeValues = toValueArray(active.attr?.[attr.key]);
14206
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
14429
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(FilterFieldset, { legend: attr.label, children: attr.options.map((opt) => {
14207
14430
  const isActive = activeValues.includes(opt.value);
14208
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14431
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14209
14432
  OptionLink,
14210
14433
  {
14211
14434
  href: hrefs.attr(attr.key, opt.value),
@@ -14223,11 +14446,11 @@ function ShopFilters({
14223
14446
  );
14224
14447
  }) }, attr.key);
14225
14448
  }),
14226
- showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
14449
+ showPriceGroup && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(FilterFieldset, { legend: t.price, children: priceBands.map((band, i) => {
14227
14450
  const isActive = active.priceMin === band.min && active.priceMax === band.max;
14228
14451
  const nextMin = isActive ? void 0 : band.min;
14229
14452
  const nextMax = isActive ? void 0 : band.max;
14230
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14453
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14231
14454
  OptionLink,
14232
14455
  {
14233
14456
  href: hrefs.price(nextMin, nextMax),
@@ -14238,7 +14461,7 @@ function ShopFilters({
14238
14461
  i
14239
14462
  );
14240
14463
  }) }),
14241
- hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14464
+ hasOnSale && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14242
14465
  OptionLink,
14243
14466
  {
14244
14467
  href: hrefs.onSale(!active.onSale),
@@ -14247,7 +14470,7 @@ function ShopFilters({
14247
14470
  onActivate: onChange ? () => onChange({ onSale: !active.onSale }) : void 0
14248
14471
  }
14249
14472
  ),
14250
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
14473
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14251
14474
  "a",
14252
14475
  {
14253
14476
  href: hrefs.clearAll(),
@@ -14264,7 +14487,7 @@ function ShopFilters({
14264
14487
 
14265
14488
  // src/components/cart-line-list.tsx
14266
14489
  var import_utils14 = require("@reblu/site-ui/utils");
14267
- var import_jsx_runtime13 = require("react/jsx-runtime");
14490
+ var import_jsx_runtime15 = require("react/jsx-runtime");
14268
14491
  var DEFAULT_LABELS2 = {
14269
14492
  quantityLabel: "Cantidad",
14270
14493
  decrease: "Reducir cantidad",
@@ -14282,6 +14505,7 @@ function CartLineList({
14282
14505
  onRemove,
14283
14506
  liveMessage,
14284
14507
  notice,
14508
+ lineMessage,
14285
14509
  labels,
14286
14510
  currencyCode,
14287
14511
  locale,
@@ -14289,9 +14513,9 @@ function CartLineList({
14289
14513
  }) {
14290
14514
  const t = { ...DEFAULT_LABELS2, ...labels };
14291
14515
  const noticeContent = notice === true ? t.cancelledNotice : notice;
14292
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: (0, import_utils14.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
14293
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
14294
- noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14516
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: (0, import_utils14.cn)("space-y-4", className), "data-slot": "cart-line-list", children: [
14517
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { "aria-live": "polite", className: "sr-only", children: liveMessage }),
14518
+ noticeContent != null && noticeContent !== false && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14295
14519
  "div",
14296
14520
  {
14297
14521
  role: "status",
@@ -14300,32 +14524,33 @@ function CartLineList({
14300
14524
  children: noticeContent
14301
14525
  }
14302
14526
  ),
14303
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
14527
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("ul", { className: "space-y-4", children: items.map((item) => {
14304
14528
  const maxQty = item.maxStock ?? Infinity;
14305
14529
  const atMax = item.quantity >= maxQty;
14306
14530
  const atMin = item.quantity <= 1;
14307
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
14531
+ const message = lineMessage?.(item);
14532
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
14308
14533
  "li",
14309
14534
  {
14310
14535
  className: "flex gap-4 rounded-xl border border-border bg-card p-4",
14311
14536
  children: [
14312
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
14313
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "min-w-0 flex-1", children: [
14314
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
14315
- item.variantName && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
14316
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
14537
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "h-20 w-20 flex-shrink-0 overflow-hidden rounded-lg bg-muted", children: item.imageUrl ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("img", { src: item.imageUrl, alt: item.name, className: "h-full w-full object-cover" }) : null }),
14538
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "min-w-0 flex-1", children: [
14539
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "truncate text-sm font-semibold leading-tight", children: item.name }),
14540
+ item.variantName && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "mt-0.5 text-xs text-muted-foreground", children: item.variantName }),
14541
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("p", { className: "mt-1 text-sm text-muted-foreground", children: [
14317
14542
  formatPrice(item.unitPrice, currencyCode, locale),
14318
14543
  " ",
14319
14544
  t.unitPriceSuffix
14320
14545
  ] }),
14321
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
14546
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
14322
14547
  "div",
14323
14548
  {
14324
14549
  role: "group",
14325
14550
  "aria-label": t.quantityLabel,
14326
14551
  className: "mt-3 flex items-center gap-3",
14327
14552
  children: [
14328
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14553
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14329
14554
  "button",
14330
14555
  {
14331
14556
  type: "button",
@@ -14336,8 +14561,8 @@ function CartLineList({
14336
14561
  children: "\u2212"
14337
14562
  }
14338
14563
  ),
14339
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
14340
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14564
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "w-8 text-center text-sm font-semibold tabular-nums", children: item.quantity }),
14565
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14341
14566
  "button",
14342
14567
  {
14343
14568
  type: "button",
@@ -14348,7 +14573,7 @@ function CartLineList({
14348
14573
  children: "+"
14349
14574
  }
14350
14575
  ),
14351
- onRemove && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
14576
+ onRemove && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14352
14577
  "button",
14353
14578
  {
14354
14579
  type: "button",
@@ -14360,9 +14585,17 @@ function CartLineList({
14360
14585
  )
14361
14586
  ]
14362
14587
  }
14588
+ ),
14589
+ message != null && message !== false && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
14590
+ "p",
14591
+ {
14592
+ className: "mt-2 text-sm text-destructive",
14593
+ "data-slot": "cart-line-list-line-message",
14594
+ children: message
14595
+ }
14363
14596
  )
14364
14597
  ] }),
14365
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
14598
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "flex-shrink-0 text-right", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-base font-bold", children: formatPrice(item.unitPrice * item.quantity, currencyCode, locale) }) })
14366
14599
  ]
14367
14600
  },
14368
14601
  lineKey(item.productId, item.variantId)
@@ -14373,7 +14606,7 @@ function CartLineList({
14373
14606
 
14374
14607
  // src/components/cart-summary.tsx
14375
14608
  var import_utils15 = require("@reblu/site-ui/utils");
14376
- var import_jsx_runtime14 = require("react/jsx-runtime");
14609
+ var import_jsx_runtime16 = require("react/jsx-runtime");
14377
14610
  var DEFAULT_LABELS3 = {
14378
14611
  subtotal: "Subtotal",
14379
14612
  discountPrefix: "Descuento",
@@ -14400,40 +14633,40 @@ function CartSummary({
14400
14633
  const hasDiscount = Boolean(discount && discount > 0);
14401
14634
  const noticeContent = notice === true ? t.cancelledNotice : notice;
14402
14635
  const hasNotice = noticeContent != null && noticeContent !== false;
14403
- const breakdown = /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
14636
+ const breakdown = /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
14404
14637
  "dl",
14405
14638
  {
14406
14639
  className: (0, import_utils15.cn)("space-y-2 text-sm", !hasNotice && className),
14407
14640
  "data-slot": "cart-summary",
14408
14641
  children: [
14409
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14410
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dt", { children: t.subtotal }),
14411
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
14642
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14643
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("dt", { children: t.subtotal }),
14644
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("dd", { children: formatPrice(subtotal, currencyCode, locale) })
14412
14645
  ] }),
14413
- hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
14414
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("dt", { children: [
14646
+ hasDiscount && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex justify-between text-green-600 dark:text-green-400", children: [
14647
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("dt", { children: [
14415
14648
  t.discountPrefix,
14416
14649
  discountCode ? ` (${discountCode})` : ""
14417
14650
  ] }),
14418
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("dd", { children: [
14651
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("dd", { children: [
14419
14652
  "-",
14420
14653
  formatPrice(discount, currencyCode, locale)
14421
14654
  ] })
14422
14655
  ] }),
14423
- shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14424
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dt", { children: t.shipping }),
14425
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
14656
+ shippingEnabled && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex justify-between text-muted-foreground", children: [
14657
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("dt", { children: t.shipping }),
14658
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("dd", { children: shipping == null || !Number.isFinite(shipping) ? t.shippingCalculated : shipping === 0 ? t.freeShipping : formatPrice(shipping, currencyCode, locale) })
14426
14659
  ] }),
14427
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
14428
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dt", { children: t.total }),
14429
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
14660
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex justify-between border-t border-border pt-2 text-base font-bold", children: [
14661
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("dt", { children: t.total }),
14662
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("dd", { children: formatPrice(total, currencyCode, locale) })
14430
14663
  ] })
14431
14664
  ]
14432
14665
  }
14433
14666
  );
14434
14667
  if (!hasNotice) return breakdown;
14435
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: (0, import_utils15.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
14436
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
14668
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: (0, import_utils15.cn)("space-y-3", className), "data-slot": "cart-summary-wrapper", children: [
14669
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14437
14670
  "div",
14438
14671
  {
14439
14672
  role: "status",
@@ -14446,13 +14679,60 @@ function CartSummary({
14446
14679
  ] });
14447
14680
  }
14448
14681
 
14449
- // src/components/added-to-cart-toast.tsx
14682
+ // src/components/cart-adjustments-notice.tsx
14450
14683
  var import_utils16 = require("@reblu/site-ui/utils");
14451
- var import_jsx_runtime15 = (
14684
+ var import_jsx_runtime17 = require("react/jsx-runtime");
14685
+ var DEFAULT_LABELS4 = {
14686
+ 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.`,
14687
+ quantityChanged: (name, quantity) => `Hemos ajustado la cantidad de ${name} a ${quantity} por el stock disponible.`,
14688
+ priceChanged: (name, from, to) => `El precio de ${name} ha cambiado: antes ${from}, ahora ${to}.`
14689
+ };
14690
+ function displayName(line) {
14691
+ return line.variantName ? `${line.name} (${line.variantName})` : line.name;
14692
+ }
14693
+ function CartAdjustmentsNotice({
14694
+ removed = [],
14695
+ quantityChanges = [],
14696
+ priceChanges = [],
14697
+ labels,
14698
+ currencyCode,
14699
+ locale,
14700
+ className
14701
+ }) {
14702
+ const t = { ...DEFAULT_LABELS4, ...labels };
14703
+ const messages = [];
14704
+ if (removed.length > 0) messages.push(t.removed(removed.map(displayName)));
14705
+ for (const change of quantityChanges) {
14706
+ messages.push(t.quantityChanged(displayName(change), change.to));
14707
+ }
14708
+ for (const change of priceChanges) {
14709
+ messages.push(
14710
+ t.priceChanged(
14711
+ displayName(change),
14712
+ formatPrice(change.from, currencyCode, locale),
14713
+ formatPrice(change.to, currencyCode, locale)
14714
+ )
14715
+ );
14716
+ }
14717
+ if (messages.length === 0) return null;
14718
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14719
+ "div",
14720
+ {
14721
+ role: "status",
14722
+ className: (0, import_utils16.cn)("rounded-lg border border-border bg-muted px-3 py-2 text-sm", className),
14723
+ "data-slot": "cart-adjustments-notice",
14724
+ children: messages.length === 1 ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { children: messages[0] }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ul", { className: "list-disc space-y-1 pl-4", children: messages.map((message, index) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("li", { children: message }, index)) })
14725
+ }
14726
+ );
14727
+ }
14728
+
14729
+ // src/components/added-to-cart-toast.tsx
14730
+ var import_utils17 = require("@reblu/site-ui/utils");
14731
+ var import_jsx_runtime18 = (
14452
14732
  // eslint-disable-next-line @next/next/no-img-element -- toast content, not a Next <Image> layout context
14453
14733
  require("react/jsx-runtime")
14454
14734
  );
14455
- var DEFAULT_LABELS4 = {
14735
+ var DEFAULT_LABELS5 = {
14456
14736
  success: "A\xF1adido al carrito",
14457
14737
  error: "No se pudo a\xF1adir al carrito",
14458
14738
  outOfStock: "Producto agotado",
@@ -14467,37 +14747,37 @@ function AddedToCartToast({
14467
14747
  labels,
14468
14748
  className
14469
14749
  }) {
14470
- const t = { ...DEFAULT_LABELS4, ...labels };
14750
+ const t = { ...DEFAULT_LABELS5, ...labels };
14471
14751
  const message = status === "error" ? t.error : status === "outOfStock" ? t.outOfStock : t.success;
14472
14752
  const hasThumbnail = Boolean(imageUrl && imageUrl.trim().length > 0);
14473
14753
  const variant = status === "success" ? "success" : "error";
14474
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
14754
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
14475
14755
  "div",
14476
14756
  {
14477
14757
  "data-slot": "added-to-cart-toast",
14478
14758
  "data-variant": variant,
14479
- className: (0, import_utils16.cn)(
14759
+ className: (0, import_utils17.cn)(
14480
14760
  "flex items-center gap-3 rounded-xl border border-border bg-card p-3 text-sm shadow-lg",
14481
14761
  variant === "success" && "border-green-600/30 dark:border-green-400/30",
14482
14762
  variant === "error" && "border-destructive/30",
14483
14763
  className
14484
14764
  ),
14485
14765
  children: [
14486
- hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
14487
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "min-w-0 flex-1", children: [
14488
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
14489
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
14766
+ hasThumbnail && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("img", { src: imageUrl, alt: productName, className: "h-10 w-10 flex-shrink-0 rounded-lg object-cover" }),
14767
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "min-w-0 flex-1", children: [
14768
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "truncate font-semibold text-foreground", children: productName }),
14769
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "truncate text-muted-foreground", children: quantity && quantity > 1 ? `${message} \xB7 x${quantity}` : message })
14490
14770
  ] }),
14491
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
14771
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("a", { href: cartHref, className: "text-sm font-semibold text-primary underline-offset-2 hover:underline", children: t.viewCart }) })
14492
14772
  ]
14493
14773
  }
14494
14774
  );
14495
14775
  }
14496
14776
 
14497
14777
  // src/components/checkout-login-prompt.tsx
14498
- var import_utils17 = require("@reblu/site-ui/utils");
14499
- var import_jsx_runtime16 = require("react/jsx-runtime");
14500
- var DEFAULT_LABELS5 = {
14778
+ var import_utils18 = require("@reblu/site-ui/utils");
14779
+ var import_jsx_runtime19 = require("react/jsx-runtime");
14780
+ var DEFAULT_LABELS6 = {
14501
14781
  title: "Identificaci\xF3n",
14502
14782
  description: "Introduce tu email para agilizar el proceso o contin\xFAa como invitado.",
14503
14783
  emailLabel: "Email",
@@ -14521,28 +14801,28 @@ function CheckoutLoginPrompt({
14521
14801
  className
14522
14802
  }) {
14523
14803
  if (!open) return null;
14524
- const t = { ...DEFAULT_LABELS5, ...labels };
14804
+ const t = { ...DEFAULT_LABELS6, ...labels };
14525
14805
  const isValidEmail = EMAIL_PATTERN.test(email.trim());
14526
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
14527
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
14528
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
14806
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_jsx_runtime19.Fragment, { children: [
14807
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "fixed inset-0 z-50 bg-black/50", onClick: onClose, "aria-hidden": "true" }),
14808
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
14529
14809
  "div",
14530
14810
  {
14531
14811
  role: "dialog",
14532
14812
  "aria-modal": "true",
14533
14813
  "aria-labelledby": "checkout-login-prompt-title",
14534
14814
  "data-slot": "checkout-login-prompt",
14535
- className: (0, import_utils17.cn)(
14815
+ className: (0, import_utils18.cn)(
14536
14816
  "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",
14537
14817
  className
14538
14818
  ),
14539
14819
  children: [
14540
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
14541
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
14542
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
14543
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
14820
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
14821
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { children: [
14822
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { id: "checkout-login-prompt-title", className: "text-xl font-bold", children: t.title }),
14823
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "mt-1 text-sm text-muted-foreground", children: t.description })
14544
14824
  ] }),
14545
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14825
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14546
14826
  "button",
14547
14827
  {
14548
14828
  type: "button",
@@ -14553,9 +14833,9 @@ function CheckoutLoginPrompt({
14553
14833
  }
14554
14834
  )
14555
14835
  ] }),
14556
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "space-y-2", children: [
14557
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
14558
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14836
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "space-y-2", children: [
14837
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("label", { htmlFor: "checkout-login-prompt-email", className: "text-sm font-medium", children: t.emailLabel }),
14838
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14559
14839
  "input",
14560
14840
  {
14561
14841
  id: "checkout-login-prompt-email",
@@ -14564,29 +14844,29 @@ function CheckoutLoginPrompt({
14564
14844
  value: email,
14565
14845
  onChange: (e) => onEmailChange(e.target.value),
14566
14846
  placeholder: t.emailPlaceholder,
14567
- className: (0, import_utils17.cn)(
14847
+ className: (0, import_utils18.cn)(
14568
14848
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
14569
14849
  error ? "border-destructive" : "border-border focus:border-primary"
14570
14850
  )
14571
14851
  }
14572
14852
  ),
14573
- error && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "text-xs text-destructive", children: error })
14853
+ error && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-xs text-destructive", children: error })
14574
14854
  ] }),
14575
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "space-y-2", children: [
14576
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14855
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "space-y-2", children: [
14856
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14577
14857
  "button",
14578
14858
  {
14579
14859
  type: "button",
14580
14860
  onClick: onSubmitEmail,
14581
14861
  disabled: checking || !isValidEmail,
14582
- className: (0, import_utils17.cn)(
14862
+ className: (0, import_utils18.cn)(
14583
14863
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-2.5 text-sm font-semibold transition-all",
14584
14864
  checking || !isValidEmail ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
14585
14865
  ),
14586
14866
  children: checking ? t.checking : t.continueWithEmail
14587
14867
  }
14588
14868
  ),
14589
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
14869
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
14590
14870
  "button",
14591
14871
  {
14592
14872
  type: "button",
@@ -14603,10 +14883,10 @@ function CheckoutLoginPrompt({
14603
14883
  }
14604
14884
 
14605
14885
  // src/components/checkout-form.tsx
14606
- var import_utils18 = require("@reblu/site-ui/utils");
14886
+ var import_utils19 = require("@reblu/site-ui/utils");
14607
14887
  var import_phone_input = require("@reblu/site-ui/phone-input");
14608
- var import_jsx_runtime17 = require("react/jsx-runtime");
14609
- var DEFAULT_LABELS6 = {
14888
+ var import_jsx_runtime20 = require("react/jsx-runtime");
14889
+ var DEFAULT_LABELS7 = {
14610
14890
  contactTitle: "Datos de contacto",
14611
14891
  nameLabel: "Nombre completo",
14612
14892
  namePlaceholder: "Tu nombre",
@@ -14645,7 +14925,7 @@ function CheckoutForm({
14645
14925
  locale,
14646
14926
  className
14647
14927
  }) {
14648
- const t = { ...DEFAULT_LABELS6, ...labels };
14928
+ const t = { ...DEFAULT_LABELS7, ...labels };
14649
14929
  const details = checkoutError?.details;
14650
14930
  const rejectedPhone = checkoutError?.code === "INVALID_INPUT" && typeof details === "object" && details !== null && !Array.isArray(details) && "field" in details && details.field === "customerPhone" && typeof checkoutError.error === "string" && checkoutError.error.trim().length > 0;
14651
14931
  const phoneError = contactErrors?.phone ?? (rejectedPhone ? checkoutError.error : void 0);
@@ -14659,22 +14939,22 @@ function CheckoutForm({
14659
14939
  event.preventDefault();
14660
14940
  if (discountCode.trim() && !discountApplying) onApplyDiscount();
14661
14941
  }
14662
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
14942
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_jsx_runtime20.Fragment, { children: [
14663
14943
  loginPrompt,
14664
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
14944
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
14665
14945
  "form",
14666
14946
  {
14667
14947
  "data-testid": "checkout-form",
14668
14948
  onSubmit,
14669
- className: (0, import_utils18.cn)("space-y-8", className),
14949
+ className: (0, import_utils19.cn)("space-y-8", className),
14670
14950
  "data-slot": "checkout-form",
14671
14951
  children: [
14672
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("section", { className: "space-y-4", children: [
14673
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
14674
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
14675
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "space-y-1", children: [
14676
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
14677
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14952
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("section", { className: "space-y-4", children: [
14953
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.contactTitle }),
14954
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
14955
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
14956
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "checkout-form-name", className: "text-sm font-medium", children: t.nameLabel }),
14957
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14678
14958
  "input",
14679
14959
  {
14680
14960
  id: "checkout-form-name",
@@ -14683,17 +14963,17 @@ function CheckoutForm({
14683
14963
  value: contact.name,
14684
14964
  onChange: (e) => patchContact({ name: e.target.value }),
14685
14965
  placeholder: t.namePlaceholder,
14686
- className: (0, import_utils18.cn)(
14966
+ className: (0, import_utils19.cn)(
14687
14967
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
14688
14968
  contactErrors?.name ? "border-destructive" : "border-border focus:border-primary"
14689
14969
  )
14690
14970
  }
14691
14971
  ),
14692
- contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
14972
+ contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
14693
14973
  ] }),
14694
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "space-y-1", children: [
14695
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
14696
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14974
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
14975
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "checkout-form-email", className: "text-sm font-medium", children: t.emailLabel }),
14976
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14697
14977
  "input",
14698
14978
  {
14699
14979
  id: "checkout-form-email",
@@ -14702,15 +14982,15 @@ function CheckoutForm({
14702
14982
  value: contact.email,
14703
14983
  onChange: (e) => patchContact({ email: e.target.value }),
14704
14984
  placeholder: t.emailPlaceholder,
14705
- className: (0, import_utils18.cn)(
14985
+ className: (0, import_utils19.cn)(
14706
14986
  "w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
14707
14987
  contactErrors?.email ? "border-destructive" : "border-border focus:border-primary"
14708
14988
  )
14709
14989
  }
14710
14990
  ),
14711
- contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
14991
+ contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
14712
14992
  ] }),
14713
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
14993
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14714
14994
  import_phone_input.PhoneInput,
14715
14995
  {
14716
14996
  id: "checkout-form-phone",
@@ -14724,15 +15004,15 @@ function CheckoutForm({
14724
15004
  ] })
14725
15005
  ] }),
14726
15006
  children2,
14727
- generalError ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
14728
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("section", { className: "space-y-3", children: [
14729
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
14730
- appliedDiscount ? /* @__PURE__ */ (0, import_jsx_runtime17.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: [
14731
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
14732
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
14733
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
15007
+ generalError ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { role: "alert", className: "text-sm text-destructive", children: generalError }) : null,
15008
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("section", { className: "space-y-3", children: [
15009
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h2", { className: "border-b border-border pb-2 text-lg font-semibold", children: t.discountTitle }),
15010
+ appliedDiscount ? /* @__PURE__ */ (0, import_jsx_runtime20.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: [
15011
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex items-center gap-2 text-sm text-green-700 dark:text-green-400", children: [
15012
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "font-semibold", children: appliedDiscount.code }),
15013
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: t.discountAppliedSuffix(formatPrice(appliedDiscount.amount, currencyCode, locale)) })
14734
15014
  ] }),
14735
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
15015
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14736
15016
  "button",
14737
15017
  {
14738
15018
  type: "button",
@@ -14742,9 +15022,9 @@ function CheckoutForm({
14742
15022
  children: t.removeDiscount
14743
15023
  }
14744
15024
  )
14745
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex gap-2", children: [
14746
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
14747
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
15025
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "flex gap-2", children: [
15026
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "checkout-form-discount-code", className: "sr-only", children: t.discountTitle }),
15027
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14748
15028
  "input",
14749
15029
  {
14750
15030
  id: "checkout-form-discount-code",
@@ -14756,7 +15036,7 @@ function CheckoutForm({
14756
15036
  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"
14757
15037
  }
14758
15038
  ),
14759
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
15039
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14760
15040
  "button",
14761
15041
  {
14762
15042
  type: "button",
@@ -14767,14 +15047,14 @@ function CheckoutForm({
14767
15047
  }
14768
15048
  )
14769
15049
  ] }),
14770
- discountError && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-xs text-destructive", children: discountError })
15050
+ discountError && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-xs text-destructive", children: discountError })
14771
15051
  ] }),
14772
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
15052
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
14773
15053
  "button",
14774
15054
  {
14775
15055
  type: "submit",
14776
15056
  disabled: submitting || submitDisabled,
14777
- className: (0, import_utils18.cn)(
15057
+ className: (0, import_utils19.cn)(
14778
15058
  "flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold transition-all",
14779
15059
  submitting || submitDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
14780
15060
  ),
@@ -14788,20 +15068,20 @@ function CheckoutForm({
14788
15068
  }
14789
15069
 
14790
15070
  // src/components/order-confirmation.tsx
14791
- var import_utils20 = require("@reblu/site-ui/utils");
15071
+ var import_utils21 = require("@reblu/site-ui/utils");
14792
15072
 
14793
15073
  // src/components/order-invoice-link.tsx
14794
- var import_utils19 = require("@reblu/site-ui/utils");
14795
- var import_jsx_runtime18 = require("react/jsx-runtime");
14796
- var DEFAULT_LABELS7 = {
15074
+ var import_utils20 = require("@reblu/site-ui/utils");
15075
+ var import_jsx_runtime21 = require("react/jsx-runtime");
15076
+ var DEFAULT_LABELS8 = {
14797
15077
  linkLabel: "Descargar la factura {number}",
14798
15078
  signInHint: "Te pediremos que inicies sesi\xF3n para abrirla."
14799
15079
  };
14800
15080
  function OrderInvoiceLink({ invoice, labels, className }) {
14801
15081
  if (!invoice) return null;
14802
- const t = { ...DEFAULT_LABELS7, ...labels };
14803
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: (0, import_utils19.cn)("space-y-1 text-sm", className), "data-slot": "order-invoice-link", children: [
14804
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
15082
+ const t = { ...DEFAULT_LABELS8, ...labels };
15083
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: (0, import_utils20.cn)("space-y-1 text-sm", className), "data-slot": "order-invoice-link", children: [
15084
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
14805
15085
  "a",
14806
15086
  {
14807
15087
  href: invoice.url,
@@ -14809,13 +15089,13 @@ function OrderInvoiceLink({ invoice, labels, className }) {
14809
15089
  children: t.linkLabel.replace("{number}", invoice.number)
14810
15090
  }
14811
15091
  ),
14812
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-muted-foreground", children: t.signInHint })
15092
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-muted-foreground", children: t.signInHint })
14813
15093
  ] });
14814
15094
  }
14815
15095
 
14816
15096
  // src/components/order-confirmation.tsx
14817
- var import_jsx_runtime19 = require("react/jsx-runtime");
14818
- var DEFAULT_LABELS8 = {
15097
+ var import_jsx_runtime22 = require("react/jsx-runtime");
15098
+ var DEFAULT_LABELS9 = {
14819
15099
  pollingTitle: "Confirmando tu pedido\u2026",
14820
15100
  pollingDescription: "Estamos procesando el pago, un momento\u2026",
14821
15101
  foundTitle: "\xA1Pedido confirmado!",
@@ -14856,7 +15136,7 @@ function OrderConfirmation({
14856
15136
  locale,
14857
15137
  className
14858
15138
  }) {
14859
- const t = { ...DEFAULT_LABELS8, ...labels };
15139
+ const t = { ...DEFAULT_LABELS9, ...labels };
14860
15140
  const isPolling = status === "polling" || status === "loading";
14861
15141
  const isFound = status === "found" || status === "paid";
14862
15142
  const { title, description } = (() => {
@@ -14878,43 +15158,43 @@ function OrderConfirmation({
14878
15158
  const showOrderReference = Boolean(order) && !showFullOrderSummary && (status === "refunded" || status === "partially_refunded" || status === "pending_timeout");
14879
15159
  const showSessionReference = !order && sessionId && (status === "timeout" || status === "not_found" || status === "pending_timeout");
14880
15160
  const showRecheck = (status === "pending_timeout" || status === "error") && onRecheck;
14881
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: (0, import_utils20.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
14882
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h1", { className: "text-3xl font-bold", children: title }),
14883
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
14884
- showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "space-y-6", children: [
14885
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14886
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
14887
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15161
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: (0, import_utils21.cn)("space-y-6 text-center", className), "data-slot": "order-confirmation", children: [
15162
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("h1", { className: "text-3xl font-bold", children: title }),
15163
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "text-lg text-muted-foreground", children: description }),
15164
+ showFullOrderSummary && order && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "space-y-6", children: [
15165
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15166
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderNumberLabel }),
15167
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14888
15168
  ] }),
14889
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
14890
- order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
15169
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "mx-auto max-w-sm space-y-3 rounded-xl border border-border bg-card p-5 text-left", children: [
15170
+ order.items.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
14891
15171
  "div",
14892
15172
  {
14893
15173
  className: "flex justify-between gap-4 text-sm",
14894
15174
  children: [
14895
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
15175
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
14896
15176
  item.product.name,
14897
15177
  item.variant ? ` (${item.variant.name})` : "",
14898
15178
  " x",
14899
15179
  item.quantity
14900
15180
  ] }),
14901
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
15181
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
14902
15182
  ]
14903
15183
  },
14904
15184
  idx
14905
15185
  )),
14906
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
14907
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { children: t.totalLabel }),
14908
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
15186
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "space-y-1 border-t border-border pt-3 text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "flex justify-between pt-1 text-base font-bold", children: [
15187
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: t.totalLabel }),
15188
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: formatPrice(order.total, currencyCode, locale) })
14909
15189
  ] }) })
14910
15190
  ] }),
14911
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
15191
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
14912
15192
  t.confirmationEmailPrefix,
14913
15193
  " ",
14914
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
15194
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
14915
15195
  "."
14916
15196
  ] }),
14917
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15197
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
14918
15198
  OrderInvoiceLink,
14919
15199
  {
14920
15200
  invoice: order.invoice,
@@ -14922,11 +15202,11 @@ function OrderConfirmation({
14922
15202
  }
14923
15203
  )
14924
15204
  ] }),
14925
- showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14926
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
14927
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
15205
+ showOrderReference && order && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15206
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.orderReferenceLabel }),
15207
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "font-mono text-lg font-semibold", children: order.orderNumber })
14928
15208
  ] }),
14929
- status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15209
+ status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
14930
15210
  "a",
14931
15211
  {
14932
15212
  href: cartHref,
@@ -14934,7 +15214,7 @@ function OrderConfirmation({
14934
15214
  children: t.backToCartLabel
14935
15215
  }
14936
15216
  ),
14937
- showRecheck && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
15217
+ showRecheck && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
14938
15218
  "button",
14939
15219
  {
14940
15220
  type: "button",
@@ -14943,16 +15223,16 @@ function OrderConfirmation({
14943
15223
  children: t.recheckLabel
14944
15224
  }
14945
15225
  ),
14946
- showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
14947
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
14948
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
15226
+ showSessionReference && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "inline-block rounded-xl bg-muted px-6 py-4", children: [
15227
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "mb-1 text-xs uppercase tracking-widest text-muted-foreground", children: t.sessionReferenceLabel }),
15228
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("p", { className: "break-all font-mono text-sm font-semibold", children: sessionId })
14949
15229
  ] })
14950
15230
  ] });
14951
15231
  }
14952
15232
 
14953
15233
  // src/components/full-invoice-fields.tsx
14954
- var import_utils21 = require("@reblu/site-ui/utils");
14955
- var import_jsx_runtime20 = require("react/jsx-runtime");
15234
+ var import_utils22 = require("@reblu/site-ui/utils");
15235
+ var import_jsx_runtime23 = require("react/jsx-runtime");
14956
15236
  var EMPTY_FULL_INVOICE_VALUE = {
14957
15237
  wantsFullInvoice: false,
14958
15238
  billingIdType: "NIF",
@@ -14964,7 +15244,7 @@ var EMPTY_FULL_INVOICE_VALUE = {
14964
15244
  city: "",
14965
15245
  country: "ES"
14966
15246
  };
14967
- var DEFAULT_LABELS9 = {
15247
+ var DEFAULT_LABELS10 = {
14968
15248
  toggle: "\xBFQuieres factura completa?",
14969
15249
  underCapNotice: "Para una factura completa necesitas tu NIF/NIE o un documento de identificaci\xF3n. Si no, recibir\xE1s una factura simplificada.",
14970
15250
  overCapNotice: "El importe del pedido supera el m\xE1ximo de la factura simplificada: para completar la compra, indica tu NIF/NIE o un documento de identificaci\xF3n, tu nombre y tu direcci\xF3n de facturaci\xF3n.",
@@ -15065,16 +15345,16 @@ function FullInvoiceFields({
15065
15345
  className
15066
15346
  }) {
15067
15347
  if (!issuesInvoices) return null;
15068
- const t = { ...DEFAULT_LABELS9, ...labels };
15348
+ const t = { ...DEFAULT_LABELS10, ...labels };
15069
15349
  const showFields = value.wantsFullInvoice || overCap;
15070
15350
  const isSpanishNif = value.billingIdType === "NIF";
15071
15351
  const set = (key2, next2) => onChange({ ...value, [key2]: next2 });
15072
- const error = (key2) => errors[key2] ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { id: `full-invoice-${key2}-error`, className: "text-sm text-destructive", children: errors[key2] }) : null;
15352
+ const error = (key2) => errors[key2] ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { id: `full-invoice-${key2}-error`, className: "text-sm text-destructive", children: errors[key2] }) : null;
15073
15353
  const invalid2 = (key2) => errors[key2] ? { "aria-invalid": true, "aria-describedby": `full-invoice-${key2}-error` } : {};
15074
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("section", { className: (0, import_utils21.cn)("space-y-4", className), "data-slot": "full-invoice-fields", children: [
15075
- overCap ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { role: "note", className: "rounded-lg border border-border p-4 text-sm", children: t.overCapNotice }) : /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15076
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
15077
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15354
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("section", { className: (0, import_utils22.cn)("space-y-4", className), "data-slot": "full-invoice-fields", children: [
15355
+ overCap ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { role: "note", className: "rounded-lg border border-border p-4 text-sm", children: t.overCapNotice }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15356
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
15357
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15078
15358
  "input",
15079
15359
  {
15080
15360
  type: "checkbox",
@@ -15084,12 +15364,12 @@ function FullInvoiceFields({
15084
15364
  ),
15085
15365
  t.toggle
15086
15366
  ] }),
15087
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-sm text-muted-foreground", children: t.underCapNotice })
15367
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("p", { className: "text-sm text-muted-foreground", children: t.underCapNotice })
15088
15368
  ] }),
15089
- showFields && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15090
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15091
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-id-type", className: "text-sm font-medium", children: t.idType }),
15092
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15369
+ showFields && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [
15370
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15371
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-id-type", className: "text-sm font-medium", children: t.idType }),
15372
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15093
15373
  "select",
15094
15374
  {
15095
15375
  id: "full-invoice-id-type",
@@ -15098,14 +15378,14 @@ function FullInvoiceFields({
15098
15378
  value: value.billingIdType,
15099
15379
  onChange: (e) => set("billingIdType", e.target.value),
15100
15380
  ...invalid2("billingIdType"),
15101
- children: ID_TYPES.map((type) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("option", { value: type, children: t.idTypeOptions[type] }, type))
15381
+ children: ID_TYPES.map((type) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("option", { value: type, children: t.idTypeOptions[type] }, type))
15102
15382
  }
15103
15383
  ),
15104
15384
  error("billingIdType")
15105
15385
  ] }),
15106
- !isSpanishNif && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15107
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-id-country", className: "text-sm font-medium", children: t.idCountry }),
15108
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
15386
+ !isSpanishNif && /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15387
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-id-country", className: "text-sm font-medium", children: t.idCountry }),
15388
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
15109
15389
  "select",
15110
15390
  {
15111
15391
  id: "full-invoice-id-country",
@@ -15115,16 +15395,16 @@ function FullInvoiceFields({
15115
15395
  onChange: (e) => set("billingIdCountry", e.target.value),
15116
15396
  ...invalid2("billingIdCountry"),
15117
15397
  children: [
15118
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("option", { value: "", disabled: true, children: t.chooseCountry }),
15119
- countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("option", { value: c.code, children: c.name }, c.code))
15398
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("option", { value: "", disabled: true, children: t.chooseCountry }),
15399
+ countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("option", { value: c.code, children: c.name }, c.code))
15120
15400
  ]
15121
15401
  }
15122
15402
  ),
15123
15403
  error("billingIdCountry")
15124
15404
  ] }),
15125
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15126
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-nif", className: "text-sm font-medium", children: isSpanishNif ? t.spanishNif : t.documentNumber }),
15127
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15405
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15406
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-nif", className: "text-sm font-medium", children: isSpanishNif ? t.spanishNif : t.documentNumber }),
15407
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15128
15408
  "input",
15129
15409
  {
15130
15410
  id: "full-invoice-nif",
@@ -15137,9 +15417,9 @@ function FullInvoiceFields({
15137
15417
  ),
15138
15418
  error("billingNif")
15139
15419
  ] }),
15140
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15141
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-name", className: "text-sm font-medium", children: t.name }),
15142
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15420
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15421
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-name", className: "text-sm font-medium", children: t.name }),
15422
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15143
15423
  "input",
15144
15424
  {
15145
15425
  id: "full-invoice-name",
@@ -15152,9 +15432,9 @@ function FullInvoiceFields({
15152
15432
  ),
15153
15433
  error("billingName")
15154
15434
  ] }),
15155
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1 sm:col-span-2", children: [
15156
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-street", className: "text-sm font-medium", children: t.street }),
15157
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15435
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1 sm:col-span-2", children: [
15436
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-street", className: "text-sm font-medium", children: t.street }),
15437
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15158
15438
  "input",
15159
15439
  {
15160
15440
  id: "full-invoice-street",
@@ -15166,9 +15446,9 @@ function FullInvoiceFields({
15166
15446
  }
15167
15447
  )
15168
15448
  ] }),
15169
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15170
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-postal-code", className: "text-sm font-medium", children: t.postalCode }),
15171
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15449
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15450
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-postal-code", className: "text-sm font-medium", children: t.postalCode }),
15451
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15172
15452
  "input",
15173
15453
  {
15174
15454
  id: "full-invoice-postal-code",
@@ -15179,9 +15459,9 @@ function FullInvoiceFields({
15179
15459
  }
15180
15460
  )
15181
15461
  ] }),
15182
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15183
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-city", className: "text-sm font-medium", children: t.city }),
15184
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15462
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15463
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-city", className: "text-sm font-medium", children: t.city }),
15464
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15185
15465
  "input",
15186
15466
  {
15187
15467
  id: "full-invoice-city",
@@ -15192,9 +15472,9 @@ function FullInvoiceFields({
15192
15472
  }
15193
15473
  )
15194
15474
  ] }),
15195
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "space-y-1", children: [
15196
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("label", { htmlFor: "full-invoice-country", className: "text-sm font-medium", children: t.country }),
15197
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
15475
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "space-y-1", children: [
15476
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("label", { htmlFor: "full-invoice-country", className: "text-sm font-medium", children: t.country }),
15477
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
15198
15478
  "select",
15199
15479
  {
15200
15480
  id: "full-invoice-country",
@@ -15202,11 +15482,11 @@ function FullInvoiceFields({
15202
15482
  required: true,
15203
15483
  value: value.country,
15204
15484
  onChange: (e) => set("country", e.target.value),
15205
- children: countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("option", { value: c.code, children: c.name }, c.code))
15485
+ children: countries.map((c) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("option", { value: c.code, children: c.name }, c.code))
15206
15486
  }
15207
15487
  )
15208
15488
  ] }),
15209
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "sm:col-span-2", children: error("address") })
15489
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("div", { className: "sm:col-span-2", children: error("address") })
15210
15490
  ] })
15211
15491
  ] });
15212
15492
  }
@@ -15214,14 +15494,18 @@ function FullInvoiceFields({
15214
15494
  0 && (module.exports = {
15215
15495
  ALLOWED_YOUTUBE_HOSTS,
15216
15496
  AddedToCartToast,
15497
+ CartAdjustmentsNotice,
15217
15498
  CartLineList,
15218
15499
  CartSummary,
15219
15500
  CheckoutForm,
15220
15501
  CheckoutLoginPrompt,
15502
+ CourseDescription,
15221
15503
  DEFAULT_INVOICE_COUNTRIES,
15222
15504
  DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
15223
15505
  DEFAULT_SHOP_ERROR_MESSAGES,
15224
15506
  DEFAULT_SHOP_PRICE_BANDS,
15507
+ DEFAULT_TRUST_BADGE_HEADINGS,
15508
+ DEFAULT_TRUST_BADGE_TYPE_ORDER,
15225
15509
  DEFAULT_TRUST_ICONS,
15226
15510
  EMPTY_FULL_INVOICE_VALUE,
15227
15511
  FaqAccordion,
@@ -15239,6 +15523,7 @@ function FullInvoiceFields({
15239
15523
  ShopFilters,
15240
15524
  Specialty,
15241
15525
  Treatment,
15526
+ TrustBadges,
15242
15527
  buildFaqPageJsonLd,
15243
15528
  buildShareUrls,
15244
15529
  collectFaqItems,
@@ -15246,6 +15531,7 @@ function FullInvoiceFields({
15246
15531
  getShopErrorMessage,
15247
15532
  isAllowedYouTubeHost,
15248
15533
  isOverSimplifiedInvoiceCap,
15534
+ markdownToPlainText,
15249
15535
  markdownToSafeHtml,
15250
15536
  readingTime,
15251
15537
  sanitizeHtml,