@reblu/site-blocks 0.7.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 +35 -0
- package/README.md +172 -43
- package/dist/index.cjs +486 -157
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +110 -4
- package/dist/index.d.ts +110 -4
- package/dist/index.js +483 -158
- 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 +15 -4
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,8 +14313,9 @@ function CheckoutLoginPrompt({
|
|
|
13989
14313
|
}
|
|
13990
14314
|
|
|
13991
14315
|
// src/components/checkout-form.tsx
|
|
13992
|
-
var
|
|
13993
|
-
var
|
|
14316
|
+
var import_utils14 = require("@reblu/site-ui/utils");
|
|
14317
|
+
var import_phone_input = require("@reblu/site-ui/phone-input");
|
|
14318
|
+
var import_jsx_runtime15 = require("react/jsx-runtime");
|
|
13994
14319
|
var DEFAULT_LABELS6 = {
|
|
13995
14320
|
contactTitle: "Datos de contacto",
|
|
13996
14321
|
nameLabel: "Nombre completo",
|
|
@@ -14011,6 +14336,8 @@ function CheckoutForm({
|
|
|
14011
14336
|
contact,
|
|
14012
14337
|
onContactChange,
|
|
14013
14338
|
contactErrors,
|
|
14339
|
+
phoneRegion,
|
|
14340
|
+
checkoutError,
|
|
14014
14341
|
discountCode,
|
|
14015
14342
|
onDiscountCodeChange,
|
|
14016
14343
|
onApplyDiscount,
|
|
@@ -14029,6 +14356,10 @@ function CheckoutForm({
|
|
|
14029
14356
|
className
|
|
14030
14357
|
}) {
|
|
14031
14358
|
const t = { ...DEFAULT_LABELS6, ...labels };
|
|
14359
|
+
const details = checkoutError?.details;
|
|
14360
|
+
const rejectedPhone = checkoutError?.code === "INVALID_INPUT" && typeof details === "object" && details !== null && !Array.isArray(details) && "field" in details && details.field === "customerPhone" && typeof checkoutError.error === "string" && checkoutError.error.trim().length > 0;
|
|
14361
|
+
const phoneError = contactErrors?.phone ?? (rejectedPhone ? checkoutError.error : void 0);
|
|
14362
|
+
const generalError = checkoutError && !rejectedPhone ? getShopErrorMessage(typeof checkoutError.code === "string" ? checkoutError.code : void 0) : null;
|
|
14032
14363
|
function patchContact(patch3) {
|
|
14033
14364
|
onContactChange({ ...contact, ...patch3 });
|
|
14034
14365
|
}
|
|
@@ -14038,22 +14369,22 @@ function CheckoutForm({
|
|
|
14038
14369
|
event.preventDefault();
|
|
14039
14370
|
if (discountCode.trim() && !discountApplying) onApplyDiscount();
|
|
14040
14371
|
}
|
|
14041
|
-
return /* @__PURE__ */ (0,
|
|
14372
|
+
return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_jsx_runtime15.Fragment, { children: [
|
|
14042
14373
|
loginPrompt,
|
|
14043
|
-
/* @__PURE__ */ (0,
|
|
14374
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
|
|
14044
14375
|
"form",
|
|
14045
14376
|
{
|
|
14046
14377
|
"data-testid": "checkout-form",
|
|
14047
14378
|
onSubmit,
|
|
14048
|
-
className: (0,
|
|
14379
|
+
className: (0, import_utils14.cn)("space-y-8", className),
|
|
14049
14380
|
"data-slot": "checkout-form",
|
|
14050
14381
|
children: [
|
|
14051
|
-
/* @__PURE__ */ (0,
|
|
14052
|
-
/* @__PURE__ */ (0,
|
|
14053
|
-
/* @__PURE__ */ (0,
|
|
14054
|
-
/* @__PURE__ */ (0,
|
|
14055
|
-
/* @__PURE__ */ (0,
|
|
14056
|
-
/* @__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)(
|
|
14057
14388
|
"input",
|
|
14058
14389
|
{
|
|
14059
14390
|
id: "checkout-form-name",
|
|
@@ -14062,17 +14393,17 @@ function CheckoutForm({
|
|
|
14062
14393
|
value: contact.name,
|
|
14063
14394
|
onChange: (e) => patchContact({ name: e.target.value }),
|
|
14064
14395
|
placeholder: t.namePlaceholder,
|
|
14065
|
-
className: (0,
|
|
14396
|
+
className: (0, import_utils14.cn)(
|
|
14066
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",
|
|
14067
14398
|
contactErrors?.name ? "border-destructive" : "border-border focus:border-primary"
|
|
14068
14399
|
)
|
|
14069
14400
|
}
|
|
14070
14401
|
),
|
|
14071
|
-
contactErrors?.name && /* @__PURE__ */ (0,
|
|
14402
|
+
contactErrors?.name && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.name })
|
|
14072
14403
|
] }),
|
|
14073
|
-
/* @__PURE__ */ (0,
|
|
14074
|
-
/* @__PURE__ */ (0,
|
|
14075
|
-
/* @__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)(
|
|
14076
14407
|
"input",
|
|
14077
14408
|
{
|
|
14078
14409
|
id: "checkout-form-email",
|
|
@@ -14081,43 +14412,37 @@ function CheckoutForm({
|
|
|
14081
14412
|
value: contact.email,
|
|
14082
14413
|
onChange: (e) => patchContact({ email: e.target.value }),
|
|
14083
14414
|
placeholder: t.emailPlaceholder,
|
|
14084
|
-
className: (0,
|
|
14415
|
+
className: (0, import_utils14.cn)(
|
|
14085
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",
|
|
14086
14417
|
contactErrors?.email ? "border-destructive" : "border-border focus:border-primary"
|
|
14087
14418
|
)
|
|
14088
14419
|
}
|
|
14089
14420
|
),
|
|
14090
|
-
contactErrors?.email && /* @__PURE__ */ (0,
|
|
14421
|
+
contactErrors?.email && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.email })
|
|
14091
14422
|
] }),
|
|
14092
|
-
/* @__PURE__ */ (0,
|
|
14093
|
-
|
|
14094
|
-
|
|
14095
|
-
"
|
|
14096
|
-
|
|
14097
|
-
|
|
14098
|
-
|
|
14099
|
-
|
|
14100
|
-
|
|
14101
|
-
|
|
14102
|
-
|
|
14103
|
-
"w-full rounded-lg border bg-background px-3 py-2 text-sm transition focus:outline-none focus:ring-2 focus:ring-primary/20",
|
|
14104
|
-
contactErrors?.phone ? "border-destructive" : "border-border focus:border-primary"
|
|
14105
|
-
)
|
|
14106
|
-
}
|
|
14107
|
-
),
|
|
14108
|
-
contactErrors?.phone && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "text-xs text-destructive", children: contactErrors.phone })
|
|
14109
|
-
] })
|
|
14423
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "space-y-1", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
14424
|
+
import_phone_input.PhoneInput,
|
|
14425
|
+
{
|
|
14426
|
+
id: "checkout-form-phone",
|
|
14427
|
+
label: t.phoneLabel,
|
|
14428
|
+
region: phoneRegion,
|
|
14429
|
+
value: contact.phone ?? "",
|
|
14430
|
+
onChange: (phone) => patchContact({ phone }),
|
|
14431
|
+
error: phoneError
|
|
14432
|
+
}
|
|
14433
|
+
) })
|
|
14110
14434
|
] })
|
|
14111
14435
|
] }),
|
|
14112
14436
|
children2,
|
|
14113
|
-
/* @__PURE__ */ (0,
|
|
14114
|
-
|
|
14115
|
-
|
|
14116
|
-
|
|
14117
|
-
|
|
14118
|
-
/* @__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)) })
|
|
14119
14444
|
] }),
|
|
14120
|
-
/* @__PURE__ */ (0,
|
|
14445
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
14121
14446
|
"button",
|
|
14122
14447
|
{
|
|
14123
14448
|
type: "button",
|
|
@@ -14127,9 +14452,9 @@ function CheckoutForm({
|
|
|
14127
14452
|
children: t.removeDiscount
|
|
14128
14453
|
}
|
|
14129
14454
|
)
|
|
14130
|
-
] }) : /* @__PURE__ */ (0,
|
|
14131
|
-
/* @__PURE__ */ (0,
|
|
14132
|
-
/* @__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)(
|
|
14133
14458
|
"input",
|
|
14134
14459
|
{
|
|
14135
14460
|
id: "checkout-form-discount-code",
|
|
@@ -14141,7 +14466,7 @@ function CheckoutForm({
|
|
|
14141
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"
|
|
14142
14467
|
}
|
|
14143
14468
|
),
|
|
14144
|
-
/* @__PURE__ */ (0,
|
|
14469
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
14145
14470
|
"button",
|
|
14146
14471
|
{
|
|
14147
14472
|
type: "button",
|
|
@@ -14152,14 +14477,14 @@ function CheckoutForm({
|
|
|
14152
14477
|
}
|
|
14153
14478
|
)
|
|
14154
14479
|
] }),
|
|
14155
|
-
discountError && /* @__PURE__ */ (0,
|
|
14480
|
+
discountError && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-xs text-destructive", children: discountError })
|
|
14156
14481
|
] }),
|
|
14157
|
-
/* @__PURE__ */ (0,
|
|
14482
|
+
/* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
|
|
14158
14483
|
"button",
|
|
14159
14484
|
{
|
|
14160
14485
|
type: "submit",
|
|
14161
14486
|
disabled: submitting || submitDisabled,
|
|
14162
|
-
className: (0,
|
|
14487
|
+
className: (0, import_utils14.cn)(
|
|
14163
14488
|
"flex w-full items-center justify-center gap-2 rounded-xl px-4 py-3 font-semibold transition-all",
|
|
14164
14489
|
submitting || submitDisabled ? "cursor-not-allowed bg-muted text-muted-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90"
|
|
14165
14490
|
),
|
|
@@ -14173,8 +14498,8 @@ function CheckoutForm({
|
|
|
14173
14498
|
}
|
|
14174
14499
|
|
|
14175
14500
|
// src/components/order-confirmation.tsx
|
|
14176
|
-
var
|
|
14177
|
-
var
|
|
14501
|
+
var import_utils15 = require("@reblu/site-ui/utils");
|
|
14502
|
+
var import_jsx_runtime16 = require("react/jsx-runtime");
|
|
14178
14503
|
var DEFAULT_LABELS7 = {
|
|
14179
14504
|
pollingTitle: "Confirmando tu pedido\u2026",
|
|
14180
14505
|
pollingDescription: "Estamos procesando el pago, un momento\u2026",
|
|
@@ -14236,48 +14561,48 @@ function OrderConfirmation({
|
|
|
14236
14561
|
const showOrderReference = Boolean(order) && !showFullOrderSummary && (status === "refunded" || status === "partially_refunded" || status === "pending_timeout");
|
|
14237
14562
|
const showSessionReference = !order && sessionId && (status === "timeout" || status === "not_found" || status === "pending_timeout");
|
|
14238
14563
|
const showRecheck = (status === "pending_timeout" || status === "error") && onRecheck;
|
|
14239
|
-
return /* @__PURE__ */ (0,
|
|
14240
|
-
/* @__PURE__ */ (0,
|
|
14241
|
-
/* @__PURE__ */ (0,
|
|
14242
|
-
showFullOrderSummary && order && /* @__PURE__ */ (0,
|
|
14243
|
-
/* @__PURE__ */ (0,
|
|
14244
|
-
/* @__PURE__ */ (0,
|
|
14245
|
-
/* @__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 })
|
|
14246
14571
|
] }),
|
|
14247
|
-
/* @__PURE__ */ (0,
|
|
14248
|
-
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)(
|
|
14249
14574
|
"div",
|
|
14250
14575
|
{
|
|
14251
14576
|
className: "flex justify-between gap-4 text-sm",
|
|
14252
14577
|
children: [
|
|
14253
|
-
/* @__PURE__ */ (0,
|
|
14578
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { className: "max-w-[60%] truncate text-muted-foreground", children: [
|
|
14254
14579
|
item.product.name,
|
|
14255
14580
|
item.variant ? ` (${item.variant.name})` : "",
|
|
14256
14581
|
" x",
|
|
14257
14582
|
item.quantity
|
|
14258
14583
|
] }),
|
|
14259
|
-
/* @__PURE__ */ (0,
|
|
14584
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: formatPrice(item.total, currencyCode, locale) })
|
|
14260
14585
|
]
|
|
14261
14586
|
},
|
|
14262
14587
|
idx
|
|
14263
14588
|
)),
|
|
14264
|
-
/* @__PURE__ */ (0,
|
|
14265
|
-
/* @__PURE__ */ (0,
|
|
14266
|
-
/* @__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) })
|
|
14267
14592
|
] }) })
|
|
14268
14593
|
] }),
|
|
14269
|
-
/* @__PURE__ */ (0,
|
|
14594
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("p", { className: "mx-auto max-w-sm text-sm text-muted-foreground", children: [
|
|
14270
14595
|
t.confirmationEmailPrefix,
|
|
14271
14596
|
" ",
|
|
14272
|
-
/* @__PURE__ */ (0,
|
|
14597
|
+
/* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "font-medium text-foreground", children: order.customerEmail }),
|
|
14273
14598
|
"."
|
|
14274
14599
|
] })
|
|
14275
14600
|
] }),
|
|
14276
|
-
showOrderReference && order && /* @__PURE__ */ (0,
|
|
14277
|
-
/* @__PURE__ */ (0,
|
|
14278
|
-
/* @__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 })
|
|
14279
14604
|
] }),
|
|
14280
|
-
status === "failed" && cartHref && /* @__PURE__ */ (0,
|
|
14605
|
+
status === "failed" && cartHref && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
14281
14606
|
"a",
|
|
14282
14607
|
{
|
|
14283
14608
|
href: cartHref,
|
|
@@ -14285,7 +14610,7 @@ function OrderConfirmation({
|
|
|
14285
14610
|
children: t.backToCartLabel
|
|
14286
14611
|
}
|
|
14287
14612
|
),
|
|
14288
|
-
showRecheck && /* @__PURE__ */ (0,
|
|
14613
|
+
showRecheck && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
|
|
14289
14614
|
"button",
|
|
14290
14615
|
{
|
|
14291
14616
|
type: "button",
|
|
@@ -14294,9 +14619,9 @@ function OrderConfirmation({
|
|
|
14294
14619
|
children: t.recheckLabel
|
|
14295
14620
|
}
|
|
14296
14621
|
),
|
|
14297
|
-
showSessionReference && /* @__PURE__ */ (0,
|
|
14298
|
-
/* @__PURE__ */ (0,
|
|
14299
|
-
/* @__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 })
|
|
14300
14625
|
] })
|
|
14301
14626
|
] });
|
|
14302
14627
|
}
|
|
@@ -14311,15 +14636,19 @@ function OrderConfirmation({
|
|
|
14311
14636
|
DEFAULT_SHOP_ERROR_FALLBACK_MESSAGE,
|
|
14312
14637
|
DEFAULT_SHOP_ERROR_MESSAGES,
|
|
14313
14638
|
DEFAULT_SHOP_PRICE_BANDS,
|
|
14639
|
+
FaqAccordion,
|
|
14314
14640
|
MarkdownRenderer,
|
|
14315
14641
|
OrderConfirmation,
|
|
14642
|
+
PageBlocks,
|
|
14316
14643
|
ProductCard,
|
|
14317
14644
|
ProfileCard,
|
|
14318
14645
|
SafeHtml,
|
|
14319
14646
|
ShopFilters,
|
|
14320
14647
|
Specialty,
|
|
14321
14648
|
Treatment,
|
|
14649
|
+
buildFaqPageJsonLd,
|
|
14322
14650
|
buildShareUrls,
|
|
14651
|
+
collectFaqItems,
|
|
14323
14652
|
formatPrice,
|
|
14324
14653
|
getShopErrorMessage,
|
|
14325
14654
|
isAllowedYouTubeHost,
|