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