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