@thorprovider/blocks 3.0.2 → 4.1.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/README.md +61 -21
- package/dist/blocks/designs/checkout-commerce-v1/block.d.ts +49 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.d.ts.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.js +2487 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.js.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.mjs +2467 -0
- package/dist/blocks/designs/checkout-commerce-v1/block.mjs.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.d.ts +8 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.d.ts.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.js +44 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.js.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.mjs +19 -0
- package/dist/blocks/designs/checkout-commerce-v1/data-context.mjs.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.d.ts +3 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.d.ts.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.js +36 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.js.map +1 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.mjs +6 -0
- package/dist/blocks/designs/checkout-commerce-v1/index.mjs.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/block.d.ts +12 -0
- package/dist/blocks/designs/marketplace-product-card/block.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/block.js +243 -0
- package/dist/blocks/designs/marketplace-product-card/block.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/block.mjs +233 -0
- package/dist/blocks/designs/marketplace-product-card/block.mjs.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/index.d.ts +3 -0
- package/dist/blocks/designs/marketplace-product-card/index.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/index.js +36 -0
- package/dist/blocks/designs/marketplace-product-card/index.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/index.mjs +6 -0
- package/dist/blocks/designs/marketplace-product-card/index.mjs.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.d.ts +13 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.js +36 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.mjs +12 -0
- package/dist/blocks/designs/marketplace-product-card/normalize.mjs.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/variants.d.ts +72 -0
- package/dist/blocks/designs/marketplace-product-card/variants.d.ts.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/variants.js +123 -0
- package/dist/blocks/designs/marketplace-product-card/variants.js.map +1 -0
- package/dist/blocks/designs/marketplace-product-card/variants.mjs +89 -0
- package/dist/blocks/designs/marketplace-product-card/variants.mjs.map +1 -0
- package/dist/blocks/e-commerce/account/account-frame.d.ts +38 -0
- package/dist/blocks/e-commerce/account/account-frame.d.ts.map +1 -0
- package/dist/blocks/e-commerce/account/account-frame.js +102 -0
- package/dist/blocks/e-commerce/account/account-frame.js.map +1 -0
- package/dist/blocks/e-commerce/account/account-frame.mjs +78 -0
- package/dist/blocks/e-commerce/account/account-frame.mjs.map +1 -0
- package/dist/blocks/e-commerce/account/address-book.d.ts +79 -0
- package/dist/blocks/e-commerce/account/address-book.d.ts.map +1 -0
- package/dist/blocks/e-commerce/account/address-book.js +250 -0
- package/dist/blocks/e-commerce/account/address-book.js.map +1 -0
- package/dist/blocks/e-commerce/account/address-book.mjs +225 -0
- package/dist/blocks/e-commerce/account/address-book.mjs.map +1 -0
- package/dist/blocks/e-commerce/account/profile-form.d.ts +35 -0
- package/dist/blocks/e-commerce/account/profile-form.d.ts.map +1 -0
- package/dist/blocks/e-commerce/account/profile-form.js +100 -0
- package/dist/blocks/e-commerce/account/profile-form.js.map +1 -0
- package/dist/blocks/e-commerce/account/profile-form.mjs +76 -0
- package/dist/blocks/e-commerce/account/profile-form.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts +11 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js +46 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs +22 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-equality.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts +28 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js +278 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs +260 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-address-fields.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts +12 -9
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js +49 -71
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs +50 -72
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js +6 -3
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs +6 -3
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts +7 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js +41 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs +16 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-id-context.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts +24 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js +75 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs +58 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-location-select.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts +3 -2
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js +9 -2
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs +9 -2
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts +23 -8
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js +136 -31
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs +143 -32
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts +13 -7
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js +179 -28
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs +180 -29
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts +20 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js +199 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs +175 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-saved-addresses.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts +14 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js +136 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs +109 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-section-nav.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts +32 -10
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js +265 -147
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs +272 -148
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts +13 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js +74 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs +50 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-header.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts +7 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js +91 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs +65 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-step-summary.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts +174 -44
- package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout.js +532 -108
- package/dist/blocks/e-commerce/checkout-forms/checkout.js.map +1 -1
- package/dist/blocks/e-commerce/checkout-forms/checkout.mjs +542 -109
- package/dist/blocks/e-commerce/checkout-forms/checkout.mjs.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js +44 -20
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs +44 -20
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar.js +21 -10
- package/dist/blocks/e-commerce/navigation/storefront-navbar.js.map +1 -1
- package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs +21 -10
- package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-card.d.ts.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-card.js +36 -9
- package/dist/blocks/e-commerce/product-list/product-card.js.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-card.mjs +36 -9
- package/dist/blocks/e-commerce/product-list/product-card.mjs.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-showcase-1.js +7 -2
- package/dist/blocks/e-commerce/product-list/product-showcase-1.js.map +1 -1
- package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs +7 -2
- package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs.map +1 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts.map +1 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js +5 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js.map +1 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs +5 -1
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs.map +1 -1
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts.map +1 -1
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js +71 -51
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js.map +1 -1
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs +71 -51
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs.map +1 -1
- package/dist/blocks/marketing/banners/banner-1.d.ts.map +1 -1
- package/dist/blocks/marketing/banners/banner-1.js +15 -27
- package/dist/blocks/marketing/banners/banner-1.js.map +1 -1
- package/dist/blocks/marketing/banners/banner-1.mjs +16 -28
- package/dist/blocks/marketing/banners/banner-1.mjs.map +1 -1
- package/dist/index.d.ts +16 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -0
- package/dist/index.mjs.map +1 -1
- package/dist/lib/contracts/checkout-commerce-v1.d.ts +2350 -0
- package/dist/lib/contracts/checkout-commerce-v1.d.ts.map +1 -0
- package/dist/lib/contracts/checkout-commerce-v1.js +417 -0
- package/dist/lib/contracts/checkout-commerce-v1.js.map +1 -0
- package/dist/lib/contracts/checkout-commerce-v1.mjs +392 -0
- package/dist/lib/contracts/checkout-commerce-v1.mjs.map +1 -0
- package/dist/lib/contracts/marketplace-product-card.d.ts +324 -0
- package/dist/lib/contracts/marketplace-product-card.d.ts.map +1 -0
- package/dist/lib/contracts/marketplace-product-card.js +85 -0
- package/dist/lib/contracts/marketplace-product-card.js.map +1 -0
- package/dist/lib/contracts/marketplace-product-card.mjs +61 -0
- package/dist/lib/contracts/marketplace-product-card.mjs.map +1 -0
- package/dist/lib/contracts.d.ts +2289 -178
- package/dist/lib/contracts.d.ts.map +1 -1
- package/dist/lib/contracts.js +332 -25
- package/dist/lib/contracts.js.map +1 -1
- package/dist/lib/contracts.mjs +278 -5
- package/dist/lib/contracts.mjs.map +1 -1
- package/dist/lib/money-schema.d.ts +19 -0
- package/dist/lib/money-schema.d.ts.map +1 -0
- package/dist/lib/money-schema.js +33 -0
- package/dist/lib/money-schema.js.map +1 -0
- package/dist/lib/money-schema.mjs +9 -0
- package/dist/lib/money-schema.mjs.map +1 -0
- package/dist/lib/motion.d.ts +29 -0
- package/dist/lib/motion.d.ts.map +1 -0
- package/dist/lib/motion.js +65 -0
- package/dist/lib/motion.js.map +1 -0
- package/dist/lib/motion.mjs +41 -0
- package/dist/lib/motion.mjs.map +1 -0
- package/dist/ui/accordion.d.ts +3 -1
- package/dist/ui/accordion.d.ts.map +1 -1
- package/dist/ui/accordion.js +21 -5
- package/dist/ui/accordion.js.map +1 -1
- package/dist/ui/accordion.mjs +21 -5
- package/dist/ui/accordion.mjs.map +1 -1
- package/dist/ui/input-group.d.ts +1 -1
- package/package.json +18 -3
- package/dist/.tsbuildinfo +0 -1
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useRef } from "react";
|
|
4
|
+
import { cn } from "../../../lib/utils.mjs";
|
|
5
|
+
const defaultLabels = {
|
|
6
|
+
title: "Mi cuenta",
|
|
7
|
+
navLabel: "Secciones de la cuenta"
|
|
8
|
+
};
|
|
9
|
+
function AccountFrame({
|
|
10
|
+
displayName,
|
|
11
|
+
email,
|
|
12
|
+
modules,
|
|
13
|
+
activeModule,
|
|
14
|
+
presentation = "stack",
|
|
15
|
+
labels,
|
|
16
|
+
onSelectModule,
|
|
17
|
+
className
|
|
18
|
+
}) {
|
|
19
|
+
if (presentation !== "stack" && presentation !== "tabs") {
|
|
20
|
+
throw new Error(
|
|
21
|
+
`AccountFrame does not support presentation "${String(presentation)}". Use "stack" or "tabs".`
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
const copy = { ...defaultLabels, ...labels };
|
|
25
|
+
const tabRefs = useRef([]);
|
|
26
|
+
const moveSelection = (event) => {
|
|
27
|
+
if (!["ArrowRight", "ArrowLeft", "Home", "End"].includes(event.key)) return;
|
|
28
|
+
event.preventDefault();
|
|
29
|
+
const current = Math.max(
|
|
30
|
+
0,
|
|
31
|
+
modules.findIndex((module) => module.id === activeModule)
|
|
32
|
+
);
|
|
33
|
+
const next = event.key === "Home" ? 0 : event.key === "End" ? modules.length - 1 : event.key === "ArrowRight" ? (current + 1) % modules.length : (current - 1 + modules.length) % modules.length;
|
|
34
|
+
onSelectModule?.(modules[next].id);
|
|
35
|
+
tabRefs.current[next]?.focus();
|
|
36
|
+
};
|
|
37
|
+
return /* @__PURE__ */ jsxs("header", { className: cn("border-b pb-6", className), children: [
|
|
38
|
+
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: copy.title }),
|
|
39
|
+
/* @__PURE__ */ jsx("h1", { className: "mt-1 text-2xl font-bold tracking-tight sm:text-3xl", children: displayName }),
|
|
40
|
+
email ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: email }) : null,
|
|
41
|
+
modules.length > 0 ? presentation === "stack" ? /* @__PURE__ */ jsx("nav", { "aria-label": copy.navLabel, className: "mt-6", children: /* @__PURE__ */ jsx("ul", { className: "flex flex-wrap gap-x-6 gap-y-2", children: modules.map((module) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
|
|
42
|
+
"a",
|
|
43
|
+
{
|
|
44
|
+
href: module.href ?? `#${module.id}`,
|
|
45
|
+
"aria-current": module.id === activeModule ? "true" : void 0,
|
|
46
|
+
className: "hover:text-foreground text-muted-foreground text-sm font-medium underline-offset-4 hover:underline",
|
|
47
|
+
children: module.label
|
|
48
|
+
}
|
|
49
|
+
) }, module.id)) }) }) : /* @__PURE__ */ jsx("div", { role: "tablist", "aria-label": copy.navLabel, className: "mt-6 flex flex-wrap gap-2", onKeyDown: moveSelection, children: modules.map((module) => {
|
|
50
|
+
const selected = module.id === activeModule;
|
|
51
|
+
return /* @__PURE__ */ jsx(
|
|
52
|
+
"button",
|
|
53
|
+
{
|
|
54
|
+
ref: (node) => {
|
|
55
|
+
tabRefs.current[modules.indexOf(module)] = node;
|
|
56
|
+
},
|
|
57
|
+
type: "button",
|
|
58
|
+
role: "tab",
|
|
59
|
+
id: `account-tab-${module.id}`,
|
|
60
|
+
"aria-selected": selected,
|
|
61
|
+
"aria-controls": `account-panel-${module.id}`,
|
|
62
|
+
tabIndex: selected ? 0 : -1,
|
|
63
|
+
onClick: () => onSelectModule?.(module.id),
|
|
64
|
+
className: cn(
|
|
65
|
+
"rounded-md border px-3 py-2 text-sm font-medium transition-colors",
|
|
66
|
+
selected ? "bg-foreground text-background border-transparent" : "hover:bg-muted border-border bg-transparent"
|
|
67
|
+
),
|
|
68
|
+
children: module.label
|
|
69
|
+
},
|
|
70
|
+
module.id
|
|
71
|
+
);
|
|
72
|
+
}) }) : null
|
|
73
|
+
] });
|
|
74
|
+
}
|
|
75
|
+
export {
|
|
76
|
+
AccountFrame
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=account-frame.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/e-commerce/account/account-frame.tsx"],"sourcesContent":["'use client'\n\nimport { useRef } from 'react'\nimport type { KeyboardEvent } from 'react'\nimport { cn } from '../../../lib/utils'\n\n/** The bounded account page shapes. `sidebar` is deliberately not offered. */\nexport type AccountFramePresentation = 'stack' | 'tabs'\n\n/** One account module the host has installed and mounted. */\nexport interface AccountModule {\n /** Stable module id; used as the anchor/tab id and reported on selection. */\n id: string\n /** Visible navigation label. */\n label: string\n /** Optional explicit destination; the stacked shape defaults to `#<id>`. */\n href?: string\n}\n\n/** Every user-facing string the frame renders. */\nexport interface AccountFrameLabels {\n title: string\n navLabel: string\n}\n\nconst defaultLabels: AccountFrameLabels = {\n title: 'Mi cuenta',\n navLabel: 'Secciones de la cuenta',\n}\n\nexport interface AccountFrameProps {\n /** Display name supplied by the host (never fetched by the block). */\n displayName: string\n /** Optional email; omitted when absent, never rendered as an empty element. */\n email?: string\n /** Installed modules, in render order. */\n modules: AccountModule[]\n /** The module currently shown in the tabbed shape. */\n activeModule?: string\n presentation?: AccountFramePresentation\n labels?: Partial<AccountFrameLabels>\n /** Report a module selection; the host owns the active module. */\n onSelectModule?: (id: string) => void\n className?: string\n}\n\n/**\n * The account surface header: shopper identity plus module navigation. The block\n * renders exactly what the host supplies — no order counts, rewards, or other\n * invented metrics — and owns no state: the active module is host-controlled.\n */\nexport function AccountFrame({\n displayName,\n email,\n modules,\n activeModule,\n presentation = 'stack',\n labels,\n onSelectModule,\n className,\n}: AccountFrameProps) {\n if (presentation !== 'stack' && presentation !== 'tabs') {\n throw new Error(\n `AccountFrame does not support presentation \"${String(presentation)}\". Use \"stack\" or \"tabs\".`,\n )\n }\n const copy = { ...defaultLabels, ...labels }\n const tabRefs = useRef<Array<HTMLButtonElement | null>>([])\n\n const moveSelection = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!['ArrowRight', 'ArrowLeft', 'Home', 'End'].includes(event.key)) return\n event.preventDefault()\n const current = Math.max(\n 0,\n modules.findIndex((module) => module.id === activeModule),\n )\n const next =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? modules.length - 1\n : event.key === 'ArrowRight'\n ? (current + 1) % modules.length\n : (current - 1 + modules.length) % modules.length\n onSelectModule?.(modules[next].id)\n tabRefs.current[next]?.focus()\n }\n\n return (\n <header className={cn('border-b pb-6', className)}>\n <p className=\"text-muted-foreground text-sm\">{copy.title}</p>\n <h1 className=\"mt-1 text-2xl font-bold tracking-tight sm:text-3xl\">{displayName}</h1>\n {email ? <p className=\"text-muted-foreground mt-1 text-sm\">{email}</p> : null}\n\n {modules.length > 0 ? (\n presentation === 'stack' ? (\n <nav aria-label={copy.navLabel} className=\"mt-6\">\n <ul className=\"flex flex-wrap gap-x-6 gap-y-2\">\n {modules.map((module) => (\n <li key={module.id}>\n <a\n href={module.href ?? `#${module.id}`}\n aria-current={module.id === activeModule ? 'true' : undefined}\n className=\"hover:text-foreground text-muted-foreground text-sm font-medium underline-offset-4 hover:underline\"\n >\n {module.label}\n </a>\n </li>\n ))}\n </ul>\n </nav>\n ) : (\n <div role=\"tablist\" aria-label={copy.navLabel} className=\"mt-6 flex flex-wrap gap-2\" onKeyDown={moveSelection}>\n {modules.map((module) => {\n const selected = module.id === activeModule\n return (\n <button\n key={module.id}\n ref={(node) => {\n tabRefs.current[modules.indexOf(module)] = node\n }}\n type=\"button\"\n role=\"tab\"\n id={`account-tab-${module.id}`}\n aria-selected={selected}\n aria-controls={`account-panel-${module.id}`}\n tabIndex={selected ? 0 : -1}\n onClick={() => onSelectModule?.(module.id)}\n className={cn(\n 'rounded-md border px-3 py-2 text-sm font-medium transition-colors',\n selected\n ? 'bg-foreground text-background border-transparent'\n : 'hover:bg-muted border-border bg-transparent',\n )}\n >\n {module.label}\n </button>\n )\n })}\n </div>\n )\n ) : null}\n </header>\n )\n}\n"],"mappings":";AAyFI,SACE,KADF;AAvFJ,SAAS,cAAc;AAEvB,SAAS,UAAU;AAqBnB,MAAM,gBAAoC;AAAA,EACxC,OAAO;AAAA,EACP,UAAU;AACZ;AAuBO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,MAAI,iBAAiB,WAAW,iBAAiB,QAAQ;AACvD,UAAM,IAAI;AAAA,MACR,+CAA+C,OAAO,YAAY,CAAC;AAAA,IACrE;AAAA,EACF;AACA,QAAM,OAAO,EAAE,GAAG,eAAe,GAAG,OAAO;AAC3C,QAAM,UAAU,OAAwC,CAAC,CAAC;AAE1D,QAAM,gBAAgB,CAAC,UAAyC;AAC9D,QAAI,CAAC,CAAC,cAAc,aAAa,QAAQ,KAAK,EAAE,SAAS,MAAM,GAAG,EAAG;AACrE,UAAM,eAAe;AACrB,UAAM,UAAU,KAAK;AAAA,MACnB;AAAA,MACA,QAAQ,UAAU,CAAC,WAAW,OAAO,OAAO,YAAY;AAAA,IAC1D;AACA,UAAM,OACJ,MAAM,QAAQ,SACV,IACA,MAAM,QAAQ,QACZ,QAAQ,SAAS,IACjB,MAAM,QAAQ,gBACX,UAAU,KAAK,QAAQ,UACvB,UAAU,IAAI,QAAQ,UAAU,QAAQ;AACnD,qBAAiB,QAAQ,IAAI,EAAE,EAAE;AACjC,YAAQ,QAAQ,IAAI,GAAG,MAAM;AAAA,EAC/B;AAEA,SACE,qBAAC,YAAO,WAAW,GAAG,iBAAiB,SAAS,GAC9C;AAAA,wBAAC,OAAE,WAAU,iCAAiC,eAAK,OAAM;AAAA,IACzD,oBAAC,QAAG,WAAU,sDAAsD,uBAAY;AAAA,IAC/E,QAAQ,oBAAC,OAAE,WAAU,sCAAsC,iBAAM,IAAO;AAAA,IAExE,QAAQ,SAAS,IAChB,iBAAiB,UACf,oBAAC,SAAI,cAAY,KAAK,UAAU,WAAU,QACxC,8BAAC,QAAG,WAAU,kCACX,kBAAQ,IAAI,CAAC,WACZ,oBAAC,QACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,OAAO,QAAQ,IAAI,OAAO,EAAE;AAAA,QAClC,gBAAc,OAAO,OAAO,eAAe,SAAS;AAAA,QACpD,WAAU;AAAA,QAET,iBAAO;AAAA;AAAA,IACV,KAPO,OAAO,EAQhB,CACD,GACH,GACF,IAEA,oBAAC,SAAI,MAAK,WAAU,cAAY,KAAK,UAAU,WAAU,6BAA4B,WAAW,eAC7F,kBAAQ,IAAI,CAAC,WAAW;AACvB,YAAM,WAAW,OAAO,OAAO;AAC/B,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,KAAK,CAAC,SAAS;AACb,oBAAQ,QAAQ,QAAQ,QAAQ,MAAM,CAAC,IAAI;AAAA,UAC7C;AAAA,UACA,MAAK;AAAA,UACL,MAAK;AAAA,UACL,IAAI,eAAe,OAAO,EAAE;AAAA,UAC5B,iBAAe;AAAA,UACf,iBAAe,iBAAiB,OAAO,EAAE;AAAA,UACzC,UAAU,WAAW,IAAI;AAAA,UACzB,SAAS,MAAM,iBAAiB,OAAO,EAAE;AAAA,UACzC,WAAW;AAAA,YACT;AAAA,YACA,WACI,qDACA;AAAA,UACN;AAAA,UAEC,iBAAO;AAAA;AAAA,QAlBH,OAAO;AAAA,MAmBd;AAAA,IAEJ,CAAC,GACH,IAEA;AAAA,KACN;AAEJ;","names":[]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** One address exactly as the host supplies it; the block formats no fields. */
|
|
2
|
+
export interface AccountAddress {
|
|
3
|
+
id: string;
|
|
4
|
+
recipientName: string;
|
|
5
|
+
/** Address lines in display order (street, city, region, postal code, country). */
|
|
6
|
+
lines: string[];
|
|
7
|
+
isDefaultShipping?: boolean;
|
|
8
|
+
isDefaultBilling?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface AddressBookLabels {
|
|
11
|
+
title: string;
|
|
12
|
+
description: string;
|
|
13
|
+
emptyLabel: string;
|
|
14
|
+
addLabel: string;
|
|
15
|
+
editLabel: string;
|
|
16
|
+
deleteLabel: string;
|
|
17
|
+
confirmDeleteLabel: string;
|
|
18
|
+
cancelLabel: string;
|
|
19
|
+
defaultShippingLabel: string;
|
|
20
|
+
defaultBillingLabel: string;
|
|
21
|
+
setDefaultShippingLabel: string;
|
|
22
|
+
setDefaultBillingLabel: string;
|
|
23
|
+
}
|
|
24
|
+
export interface AddressBookProps {
|
|
25
|
+
addresses: AccountAddress[];
|
|
26
|
+
labels?: Partial<AddressBookLabels>;
|
|
27
|
+
onCreate?: () => void;
|
|
28
|
+
onEdit?: (id: string) => void;
|
|
29
|
+
onDelete?: (id: string) => void;
|
|
30
|
+
onSetDefaultShipping?: (id: string) => void;
|
|
31
|
+
onSetDefaultBilling?: (id: string) => void;
|
|
32
|
+
className?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The address book: renders the host's addresses verbatim, in the supplied
|
|
36
|
+
* order, and reports every action. Deletion is a two-step inline confirmation
|
|
37
|
+
* and the entry stays until the host supplies a refreshed list — the block never
|
|
38
|
+
* removes it optimistically.
|
|
39
|
+
*/
|
|
40
|
+
export declare function AddressBook({ addresses, labels, onCreate, onEdit, onDelete, onSetDefaultShipping, onSetDefaultBilling, className, }: AddressBookProps): import("react").JSX.Element;
|
|
41
|
+
/** One field of the address form, declared by the host. */
|
|
42
|
+
export interface AddressFormField {
|
|
43
|
+
name: string;
|
|
44
|
+
label: string;
|
|
45
|
+
value?: string;
|
|
46
|
+
type?: 'text' | 'tel' | 'email' | 'select';
|
|
47
|
+
required?: boolean;
|
|
48
|
+
autoComplete?: string;
|
|
49
|
+
/** Required for `select`; a select without options is not rendered. */
|
|
50
|
+
options?: {
|
|
51
|
+
value: string;
|
|
52
|
+
label: string;
|
|
53
|
+
}[];
|
|
54
|
+
}
|
|
55
|
+
export interface AddressFormLabels {
|
|
56
|
+
title: string;
|
|
57
|
+
submit: string;
|
|
58
|
+
saving: string;
|
|
59
|
+
cancel: string;
|
|
60
|
+
requiredError: string;
|
|
61
|
+
}
|
|
62
|
+
export interface AddressFormProps {
|
|
63
|
+
fields: AddressFormField[];
|
|
64
|
+
labels?: Partial<AddressFormLabels>;
|
|
65
|
+
pending?: boolean;
|
|
66
|
+
error?: string | null;
|
|
67
|
+
/** Host-supplied field errors, keyed by field name. */
|
|
68
|
+
fieldErrors?: Record<string, string>;
|
|
69
|
+
onSubmit: (values: Record<string, string>) => void;
|
|
70
|
+
onCancel?: () => void;
|
|
71
|
+
className?: string;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The address editor. It validates only the constraints the host declares (a
|
|
75
|
+
* required field), never invents country or postal rules, and omits a select
|
|
76
|
+
* the host supplied without options.
|
|
77
|
+
*/
|
|
78
|
+
export declare function AddressForm({ fields, labels, pending, error, fieldErrors, onSubmit, onCancel, className, }: AddressFormProps): import("react").JSX.Element;
|
|
79
|
+
//# sourceMappingURL=address-book.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address-book.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/account/address-book.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var address_book_exports = {};
|
|
21
|
+
__export(address_book_exports, {
|
|
22
|
+
AddressBook: () => AddressBook,
|
|
23
|
+
AddressForm: () => AddressForm
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(address_book_exports);
|
|
26
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
27
|
+
var import_react = require("react");
|
|
28
|
+
var import_badge = require("../../../ui/badge.js");
|
|
29
|
+
var import_button = require("../../../ui/button.js");
|
|
30
|
+
var import_card = require("../../../ui/card.js");
|
|
31
|
+
var import_field = require("../../../ui/field.js");
|
|
32
|
+
var import_input = require("../../../ui/input.js");
|
|
33
|
+
var import_utils = require("../../../lib/utils.js");
|
|
34
|
+
const defaultLabels = {
|
|
35
|
+
title: "Direcciones",
|
|
36
|
+
description: "Direcciones guardadas para tus pedidos.",
|
|
37
|
+
emptyLabel: "A\xFAn no tienes direcciones guardadas.",
|
|
38
|
+
addLabel: "A\xF1adir direcci\xF3n",
|
|
39
|
+
editLabel: "Editar",
|
|
40
|
+
deleteLabel: "Eliminar",
|
|
41
|
+
confirmDeleteLabel: "\xBFEliminar esta direcci\xF3n?",
|
|
42
|
+
cancelLabel: "Cancelar",
|
|
43
|
+
defaultShippingLabel: "Env\xEDo predeterminado",
|
|
44
|
+
defaultBillingLabel: "Facturaci\xF3n predeterminada",
|
|
45
|
+
setDefaultShippingLabel: "Usar para env\xEDo",
|
|
46
|
+
setDefaultBillingLabel: "Usar para facturaci\xF3n"
|
|
47
|
+
};
|
|
48
|
+
function AddressEntry({
|
|
49
|
+
address,
|
|
50
|
+
copy,
|
|
51
|
+
onEdit,
|
|
52
|
+
onDelete,
|
|
53
|
+
onSetDefaultShipping,
|
|
54
|
+
onSetDefaultBilling
|
|
55
|
+
}) {
|
|
56
|
+
const [confirming, setConfirming] = (0, import_react.useState)(false);
|
|
57
|
+
const containerRef = (0, import_react.useRef)(null);
|
|
58
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
59
|
+
"li",
|
|
60
|
+
{
|
|
61
|
+
ref: containerRef,
|
|
62
|
+
tabIndex: -1,
|
|
63
|
+
"data-slot": "address-book-entry",
|
|
64
|
+
className: "focus-visible:ring-ring rounded-lg outline-none focus-visible:ring-2",
|
|
65
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_card.Card, { children: [
|
|
66
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_card.CardHeader, { className: "flex flex-row items-start justify-between gap-4", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
67
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_card.CardTitle, { className: "text-base", children: address.recipientName }),
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-2 flex flex-wrap gap-2", children: [
|
|
69
|
+
address.isDefaultShipping ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_badge.Badge, { variant: "secondary", children: copy.defaultShippingLabel }) : null,
|
|
70
|
+
address.isDefaultBilling ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_badge.Badge, { variant: "outline", children: copy.defaultBillingLabel }) : null
|
|
71
|
+
] })
|
|
72
|
+
] }) }),
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_card.CardContent, { children: [
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("address", { className: "text-muted-foreground text-sm not-italic", children: address.lines.map((line, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "block", children: line }, `${address.id}:${index}`)) }),
|
|
75
|
+
confirming ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-4 flex flex-wrap items-center gap-2", role: "group", "aria-label": copy.confirmDeleteLabel, children: [
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-sm", children: copy.confirmDeleteLabel }),
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
78
|
+
import_button.Button,
|
|
79
|
+
{
|
|
80
|
+
type: "button",
|
|
81
|
+
variant: "destructive",
|
|
82
|
+
size: "sm",
|
|
83
|
+
onClick: () => {
|
|
84
|
+
onDelete?.(address.id);
|
|
85
|
+
setConfirming(false);
|
|
86
|
+
containerRef.current?.focus();
|
|
87
|
+
},
|
|
88
|
+
children: copy.deleteLabel
|
|
89
|
+
}
|
|
90
|
+
),
|
|
91
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "outline", size: "sm", onClick: () => setConfirming(false), children: copy.cancelLabel })
|
|
92
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-4 flex flex-wrap gap-2", children: [
|
|
93
|
+
onEdit ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "outline", size: "sm", onClick: () => onEdit(address.id), children: copy.editLabel }) : null,
|
|
94
|
+
onDelete ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "outline", size: "sm", onClick: () => setConfirming(true), children: copy.deleteLabel }) : null,
|
|
95
|
+
onSetDefaultShipping && !address.isDefaultShipping ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
96
|
+
import_button.Button,
|
|
97
|
+
{
|
|
98
|
+
type: "button",
|
|
99
|
+
variant: "ghost",
|
|
100
|
+
size: "sm",
|
|
101
|
+
onClick: () => onSetDefaultShipping(address.id),
|
|
102
|
+
children: copy.setDefaultShippingLabel
|
|
103
|
+
}
|
|
104
|
+
) : null,
|
|
105
|
+
onSetDefaultBilling && !address.isDefaultBilling ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
106
|
+
import_button.Button,
|
|
107
|
+
{
|
|
108
|
+
type: "button",
|
|
109
|
+
variant: "ghost",
|
|
110
|
+
size: "sm",
|
|
111
|
+
onClick: () => onSetDefaultBilling(address.id),
|
|
112
|
+
children: copy.setDefaultBillingLabel
|
|
113
|
+
}
|
|
114
|
+
) : null
|
|
115
|
+
] })
|
|
116
|
+
] })
|
|
117
|
+
] })
|
|
118
|
+
}
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
function AddressBook({
|
|
122
|
+
addresses,
|
|
123
|
+
labels,
|
|
124
|
+
onCreate,
|
|
125
|
+
onEdit,
|
|
126
|
+
onDelete,
|
|
127
|
+
onSetDefaultShipping,
|
|
128
|
+
onSetDefaultBilling,
|
|
129
|
+
className
|
|
130
|
+
}) {
|
|
131
|
+
const copy = { ...defaultLabels, ...labels };
|
|
132
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: (0, import_utils.cn)("rounded-lg border p-6", className), children: [
|
|
133
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-wrap items-start justify-between gap-4", children: [
|
|
134
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
135
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-lg font-semibold", children: copy.title }),
|
|
136
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground mt-1 text-sm", children: copy.description })
|
|
137
|
+
] }),
|
|
138
|
+
onCreate ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", onClick: onCreate, children: copy.addLabel }) : null
|
|
139
|
+
] }),
|
|
140
|
+
addresses.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground mt-6 text-sm", "data-slot": "address-book-empty", children: copy.emptyLabel }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", { className: "mt-6 grid list-none grid-cols-1 gap-4 p-0 md:grid-cols-2", children: addresses.map((address) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
141
|
+
AddressEntry,
|
|
142
|
+
{
|
|
143
|
+
address,
|
|
144
|
+
copy,
|
|
145
|
+
onEdit,
|
|
146
|
+
onDelete,
|
|
147
|
+
onSetDefaultShipping,
|
|
148
|
+
onSetDefaultBilling
|
|
149
|
+
},
|
|
150
|
+
address.id
|
|
151
|
+
)) })
|
|
152
|
+
] });
|
|
153
|
+
}
|
|
154
|
+
const defaultFormLabels = {
|
|
155
|
+
title: "Direcci\xF3n",
|
|
156
|
+
submit: "Guardar direcci\xF3n",
|
|
157
|
+
saving: "Guardando\u2026",
|
|
158
|
+
cancel: "Cancelar",
|
|
159
|
+
requiredError: "Este campo es obligatorio."
|
|
160
|
+
};
|
|
161
|
+
function AddressForm({
|
|
162
|
+
fields,
|
|
163
|
+
labels,
|
|
164
|
+
pending = false,
|
|
165
|
+
error,
|
|
166
|
+
fieldErrors,
|
|
167
|
+
onSubmit,
|
|
168
|
+
onCancel,
|
|
169
|
+
className
|
|
170
|
+
}) {
|
|
171
|
+
const copy = { ...defaultFormLabels, ...labels };
|
|
172
|
+
const visibleFields = fields.filter(
|
|
173
|
+
(field) => field.type !== "select" || Array.isArray(field.options) && field.options.length > 0
|
|
174
|
+
);
|
|
175
|
+
const signature = visibleFields.map((field) => `${field.name}:${field.value ?? ""}`).join("|");
|
|
176
|
+
const [values, setValues] = (0, import_react.useState)(
|
|
177
|
+
() => Object.fromEntries(visibleFields.map((field) => [field.name, field.value ?? ""]))
|
|
178
|
+
);
|
|
179
|
+
const [localErrors, setLocalErrors] = (0, import_react.useState)({});
|
|
180
|
+
(0, import_react.useEffect)(() => {
|
|
181
|
+
setValues(Object.fromEntries(visibleFields.map((field) => [field.name, field.value ?? ""])));
|
|
182
|
+
setLocalErrors({});
|
|
183
|
+
}, [signature]);
|
|
184
|
+
const submit = (event) => {
|
|
185
|
+
event.preventDefault();
|
|
186
|
+
const nextErrors = {};
|
|
187
|
+
for (const field of visibleFields) {
|
|
188
|
+
if (field.required && (values[field.name] ?? "").trim() === "") {
|
|
189
|
+
nextErrors[field.name] = copy.requiredError;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
setLocalErrors(nextErrors);
|
|
193
|
+
if (Object.keys(nextErrors).length > 0) return;
|
|
194
|
+
onSubmit(Object.fromEntries(visibleFields.map((field) => [field.name, values[field.name] ?? ""])));
|
|
195
|
+
};
|
|
196
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", { className: (0, import_utils.cn)("rounded-lg border p-6", className), children: [
|
|
197
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "text-lg font-semibold", children: copy.title }),
|
|
198
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", { className: "mt-6", noValidate: true, onSubmit: submit, children: [
|
|
199
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("fieldset", { disabled: pending, "aria-busy": pending, className: "contents", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldGroup, { className: "grid grid-cols-1 gap-5 sm:grid-cols-2", children: visibleFields.map((field) => {
|
|
200
|
+
const id = `address-${field.name}`;
|
|
201
|
+
const message = localErrors[field.name] ?? fieldErrors?.[field.name];
|
|
202
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_field.Field, { children: [
|
|
203
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_field.FieldLabel, { htmlFor: id, children: field.label }),
|
|
204
|
+
field.type === "select" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
205
|
+
"select",
|
|
206
|
+
{
|
|
207
|
+
id,
|
|
208
|
+
name: field.name,
|
|
209
|
+
value: values[field.name] ?? "",
|
|
210
|
+
required: field.required,
|
|
211
|
+
"aria-invalid": message ? true : void 0,
|
|
212
|
+
"aria-describedby": message ? `${id}-error` : void 0,
|
|
213
|
+
className: "border-input bg-background h-9 w-full rounded-md border px-3 text-sm",
|
|
214
|
+
onChange: (event) => setValues((current) => ({ ...current, [field.name]: event.target.value })),
|
|
215
|
+
children: [
|
|
216
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "", children: "\u2014" }),
|
|
217
|
+
(field.options ?? []).map((option) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: option.value, children: option.label }, option.value))
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
221
|
+
import_input.Input,
|
|
222
|
+
{
|
|
223
|
+
id,
|
|
224
|
+
name: field.name,
|
|
225
|
+
type: field.type ?? "text",
|
|
226
|
+
value: values[field.name] ?? "",
|
|
227
|
+
required: field.required,
|
|
228
|
+
autoComplete: field.autoComplete,
|
|
229
|
+
"aria-invalid": message ? true : void 0,
|
|
230
|
+
"aria-describedby": message ? `${id}-error` : void 0,
|
|
231
|
+
onChange: (event) => setValues((current) => ({ ...current, [field.name]: event.target.value }))
|
|
232
|
+
}
|
|
233
|
+
),
|
|
234
|
+
message ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { id: `${id}-error`, className: "text-destructive text-sm", children: message }) : null
|
|
235
|
+
] }, field.name);
|
|
236
|
+
}) }) }),
|
|
237
|
+
error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { role: "alert", className: "text-destructive mt-4 text-sm", children: error }) : null,
|
|
238
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-6 flex flex-wrap gap-2", children: [
|
|
239
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "submit", disabled: pending, children: pending ? copy.saving : copy.submit }),
|
|
240
|
+
onCancel ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { type: "button", variant: "outline", disabled: pending, onClick: onCancel, children: copy.cancel }) : null
|
|
241
|
+
] })
|
|
242
|
+
] })
|
|
243
|
+
] });
|
|
244
|
+
}
|
|
245
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
246
|
+
0 && (module.exports = {
|
|
247
|
+
AddressBook,
|
|
248
|
+
AddressForm
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=address-book.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/blocks/e-commerce/account/address-book.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useRef, useState } from 'react'\nimport type { FormEvent } from 'react'\nimport { Badge } from '../../../ui/badge'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '../../../ui/card'\nimport { Field, FieldGroup, FieldLabel } from '../../../ui/field'\nimport { Input } from '../../../ui/input'\nimport { cn } from '../../../lib/utils'\n\n/** One address exactly as the host supplies it; the block formats no fields. */\nexport interface AccountAddress {\n id: string\n recipientName: string\n /** Address lines in display order (street, city, region, postal code, country). */\n lines: string[]\n isDefaultShipping?: boolean\n isDefaultBilling?: boolean\n}\n\nexport interface AddressBookLabels {\n title: string\n description: string\n emptyLabel: string\n addLabel: string\n editLabel: string\n deleteLabel: string\n confirmDeleteLabel: string\n cancelLabel: string\n defaultShippingLabel: string\n defaultBillingLabel: string\n setDefaultShippingLabel: string\n setDefaultBillingLabel: string\n}\n\nconst defaultLabels: AddressBookLabels = {\n title: 'Direcciones',\n description: 'Direcciones guardadas para tus pedidos.',\n emptyLabel: 'Aún no tienes direcciones guardadas.',\n addLabel: 'Añadir dirección',\n editLabel: 'Editar',\n deleteLabel: 'Eliminar',\n confirmDeleteLabel: '¿Eliminar esta dirección?',\n cancelLabel: 'Cancelar',\n defaultShippingLabel: 'Envío predeterminado',\n defaultBillingLabel: 'Facturación predeterminada',\n setDefaultShippingLabel: 'Usar para envío',\n setDefaultBillingLabel: 'Usar para facturación',\n}\n\nexport interface AddressBookProps {\n addresses: AccountAddress[]\n labels?: Partial<AddressBookLabels>\n onCreate?: () => void\n onEdit?: (id: string) => void\n onDelete?: (id: string) => void\n onSetDefaultShipping?: (id: string) => void\n onSetDefaultBilling?: (id: string) => void\n className?: string\n}\n\nfunction AddressEntry({\n address,\n copy,\n onEdit,\n onDelete,\n onSetDefaultShipping,\n onSetDefaultBilling,\n}: {\n address: AccountAddress\n copy: AddressBookLabels\n onEdit?: (id: string) => void\n onDelete?: (id: string) => void\n onSetDefaultShipping?: (id: string) => void\n onSetDefaultBilling?: (id: string) => void\n}) {\n const [confirming, setConfirming] = useState(false)\n const containerRef = useRef<HTMLLIElement | null>(null)\n\n return (\n <li\n ref={containerRef}\n tabIndex={-1}\n data-slot=\"address-book-entry\"\n className=\"focus-visible:ring-ring rounded-lg outline-none focus-visible:ring-2\"\n >\n <Card>\n <CardHeader className=\"flex flex-row items-start justify-between gap-4\">\n <div>\n <CardTitle className=\"text-base\">{address.recipientName}</CardTitle>\n <div className=\"mt-2 flex flex-wrap gap-2\">\n {address.isDefaultShipping ? (\n <Badge variant=\"secondary\">{copy.defaultShippingLabel}</Badge>\n ) : null}\n {address.isDefaultBilling ? (\n <Badge variant=\"outline\">{copy.defaultBillingLabel}</Badge>\n ) : null}\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <address className=\"text-muted-foreground text-sm not-italic\">\n {address.lines.map((line, index) => (\n <span key={`${address.id}:${index}`} className=\"block\">\n {line}\n </span>\n ))}\n </address>\n\n {confirming ? (\n <div className=\"mt-4 flex flex-wrap items-center gap-2\" role=\"group\" aria-label={copy.confirmDeleteLabel}>\n <span className=\"text-sm\">{copy.confirmDeleteLabel}</span>\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n onDelete?.(address.id)\n setConfirming(false)\n containerRef.current?.focus()\n }}\n >\n {copy.deleteLabel}\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setConfirming(false)}>\n {copy.cancelLabel}\n </Button>\n </div>\n ) : (\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {onEdit ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => onEdit(address.id)}>\n {copy.editLabel}\n </Button>\n ) : null}\n {onDelete ? (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => setConfirming(true)}>\n {copy.deleteLabel}\n </Button>\n ) : null}\n {onSetDefaultShipping && !address.isDefaultShipping ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSetDefaultShipping(address.id)}\n >\n {copy.setDefaultShippingLabel}\n </Button>\n ) : null}\n {onSetDefaultBilling && !address.isDefaultBilling ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => onSetDefaultBilling(address.id)}\n >\n {copy.setDefaultBillingLabel}\n </Button>\n ) : null}\n </div>\n )}\n </CardContent>\n </Card>\n </li>\n )\n}\n\n/**\n * The address book: renders the host's addresses verbatim, in the supplied\n * order, and reports every action. Deletion is a two-step inline confirmation\n * and the entry stays until the host supplies a refreshed list — the block never\n * removes it optimistically.\n */\nexport function AddressBook({\n addresses,\n labels,\n onCreate,\n onEdit,\n onDelete,\n onSetDefaultShipping,\n onSetDefaultBilling,\n className,\n}: AddressBookProps) {\n const copy = { ...defaultLabels, ...labels }\n return (\n <section className={cn('rounded-lg border p-6', className)}>\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <h2 className=\"text-lg font-semibold\">{copy.title}</h2>\n <p className=\"text-muted-foreground mt-1 text-sm\">{copy.description}</p>\n </div>\n {onCreate ? (\n <Button type=\"button\" onClick={onCreate}>\n {copy.addLabel}\n </Button>\n ) : null}\n </div>\n\n {addresses.length === 0 ? (\n <p className=\"text-muted-foreground mt-6 text-sm\" data-slot=\"address-book-empty\">\n {copy.emptyLabel}\n </p>\n ) : (\n <ul className=\"mt-6 grid list-none grid-cols-1 gap-4 p-0 md:grid-cols-2\">\n {addresses.map((address) => (\n <AddressEntry\n key={address.id}\n address={address}\n copy={copy}\n onEdit={onEdit}\n onDelete={onDelete}\n onSetDefaultShipping={onSetDefaultShipping}\n onSetDefaultBilling={onSetDefaultBilling}\n />\n ))}\n </ul>\n )}\n </section>\n )\n}\n\n/** One field of the address form, declared by the host. */\nexport interface AddressFormField {\n name: string\n label: string\n value?: string\n type?: 'text' | 'tel' | 'email' | 'select'\n required?: boolean\n autoComplete?: string\n /** Required for `select`; a select without options is not rendered. */\n options?: { value: string; label: string }[]\n}\n\nexport interface AddressFormLabels {\n title: string\n submit: string\n saving: string\n cancel: string\n requiredError: string\n}\n\nconst defaultFormLabels: AddressFormLabels = {\n title: 'Dirección',\n submit: 'Guardar dirección',\n saving: 'Guardando…',\n cancel: 'Cancelar',\n requiredError: 'Este campo es obligatorio.',\n}\n\nexport interface AddressFormProps {\n fields: AddressFormField[]\n labels?: Partial<AddressFormLabels>\n pending?: boolean\n error?: string | null\n /** Host-supplied field errors, keyed by field name. */\n fieldErrors?: Record<string, string>\n onSubmit: (values: Record<string, string>) => void\n onCancel?: () => void\n className?: string\n}\n\n/**\n * The address editor. It validates only the constraints the host declares (a\n * required field), never invents country or postal rules, and omits a select\n * the host supplied without options.\n */\nexport function AddressForm({\n fields,\n labels,\n pending = false,\n error,\n fieldErrors,\n onSubmit,\n onCancel,\n className,\n}: AddressFormProps) {\n const copy = { ...defaultFormLabels, ...labels }\n const visibleFields = fields.filter(\n (field) => field.type !== 'select' || (Array.isArray(field.options) && field.options.length > 0),\n )\n const signature = visibleFields.map((field) => `${field.name}:${field.value ?? ''}`).join('|')\n const [values, setValues] = useState<Record<string, string>>(() =>\n Object.fromEntries(visibleFields.map((field) => [field.name, field.value ?? ''])),\n )\n const [localErrors, setLocalErrors] = useState<Record<string, string>>({})\n\n // Re-seed when the host supplies new values (e.g. opening a different address).\n useEffect(() => {\n setValues(Object.fromEntries(visibleFields.map((field) => [field.name, field.value ?? ''])))\n setLocalErrors({})\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [signature])\n\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault()\n const nextErrors: Record<string, string> = {}\n for (const field of visibleFields) {\n if (field.required && (values[field.name] ?? '').trim() === '') {\n nextErrors[field.name] = copy.requiredError\n }\n }\n setLocalErrors(nextErrors)\n if (Object.keys(nextErrors).length > 0) return\n onSubmit(Object.fromEntries(visibleFields.map((field) => [field.name, values[field.name] ?? ''])))\n }\n\n return (\n <section className={cn('rounded-lg border p-6', className)}>\n <h2 className=\"text-lg font-semibold\">{copy.title}</h2>\n <form className=\"mt-6\" noValidate onSubmit={submit}>\n <fieldset disabled={pending} aria-busy={pending} className=\"contents\">\n <FieldGroup className=\"grid grid-cols-1 gap-5 sm:grid-cols-2\">\n {visibleFields.map((field) => {\n const id = `address-${field.name}`\n const message = localErrors[field.name] ?? fieldErrors?.[field.name]\n return (\n <Field key={field.name}>\n <FieldLabel htmlFor={id}>{field.label}</FieldLabel>\n {field.type === 'select' ? (\n <select\n id={id}\n name={field.name}\n value={values[field.name] ?? ''}\n required={field.required}\n aria-invalid={message ? true : undefined}\n aria-describedby={message ? `${id}-error` : undefined}\n className=\"border-input bg-background h-9 w-full rounded-md border px-3 text-sm\"\n onChange={(event) =>\n setValues((current) => ({ ...current, [field.name]: event.target.value }))\n }\n >\n <option value=\"\">—</option>\n {(field.options ?? []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : (\n <Input\n id={id}\n name={field.name}\n type={field.type ?? 'text'}\n value={values[field.name] ?? ''}\n required={field.required}\n autoComplete={field.autoComplete}\n aria-invalid={message ? true : undefined}\n aria-describedby={message ? `${id}-error` : undefined}\n onChange={(event) =>\n setValues((current) => ({ ...current, [field.name]: event.target.value }))\n }\n />\n )}\n {message ? (\n <p id={`${id}-error`} className=\"text-destructive text-sm\">\n {message}\n </p>\n ) : null}\n </Field>\n )\n })}\n </FieldGroup>\n </fieldset>\n\n {error ? (\n <p role=\"alert\" className=\"text-destructive mt-4 text-sm\">\n {error}\n </p>\n ) : null}\n\n <div className=\"mt-6 flex flex-wrap gap-2\">\n <Button type=\"submit\" disabled={pending}>\n {pending ? copy.saving : copy.submit}\n </Button>\n {onCancel ? (\n <Button type=\"button\" variant=\"outline\" disabled={pending} onClick={onCancel}>\n {copy.cancel}\n </Button>\n ) : null}\n </div>\n </form>\n </section>\n )\n}\n"],"mappings":"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","names":[]}
|