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