@thorprovider/blocks 0.1.3 → 2.0.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.
Files changed (178) hide show
  1. package/CHANGELOG.md +155 -0
  2. package/README.md +228 -68
  3. package/docs/standards/data-contracts.md +13 -2
  4. package/package.json +26 -10
  5. package/scripts/fix-esm-extensions.mjs +40 -0
  6. package/src/blocks/application/login-forms/login-page.test.tsx +190 -0
  7. package/src/blocks/application/login-forms/login-page.tsx +240 -0
  8. package/src/blocks/application/password-recovery/forgot-password-page-1.tsx +6 -8
  9. package/src/blocks/application/signup-forms/signup-page-1.tsx +127 -129
  10. package/src/blocks/application/verification/verify-1.tsx +2 -2
  11. package/src/blocks/application/viewport-ownership.test.tsx +41 -0
  12. package/src/blocks/e-commerce/category-filters/category-listing-filter-fields.tsx +218 -0
  13. package/src/blocks/e-commerce/category-filters/{category-filter-2.test.tsx → category-listing.test.tsx} +287 -199
  14. package/src/blocks/e-commerce/category-filters/category-listing.tsx +934 -0
  15. package/src/blocks/e-commerce/checkout-forms/checkout-contact-step.tsx +149 -0
  16. package/src/blocks/e-commerce/checkout-forms/{checkout-form-1-country-field.tsx → checkout-country-field.tsx} +10 -8
  17. package/src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx +230 -0
  18. package/src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx +100 -0
  19. package/src/blocks/e-commerce/checkout-forms/checkout-progress.tsx +62 -0
  20. package/src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx +59 -0
  21. package/src/blocks/e-commerce/checkout-forms/{checkout-form-1-shipping-step.tsx → checkout-shipping-step.tsx} +65 -41
  22. package/src/blocks/e-commerce/checkout-forms/checkout.test.tsx +478 -0
  23. package/src/blocks/e-commerce/checkout-forms/checkout.tsx +550 -0
  24. package/src/blocks/e-commerce/navigation/storefront-navbar-account-menu.test.tsx +56 -0
  25. package/src/blocks/{marketing/navbars/navbar-4-account-menu.tsx → e-commerce/navigation/storefront-navbar-account-menu.tsx} +3 -3
  26. package/src/blocks/{marketing/navbars/navbar-4-cart-sheet.test.tsx → e-commerce/navigation/storefront-navbar-cart-sheet.test.tsx} +22 -22
  27. package/src/blocks/{marketing/navbars/navbar-4-cart-sheet.tsx → e-commerce/navigation/storefront-navbar-cart-sheet.tsx} +3 -3
  28. package/src/blocks/{marketing/navbars/navbar-4-mobile-nav.tsx → e-commerce/navigation/storefront-navbar-mobile-nav.tsx} +4 -12
  29. package/src/blocks/{marketing/navbars/navbar-4-search-bar.tsx → e-commerce/navigation/storefront-navbar-search-bar.tsx} +3 -3
  30. package/src/blocks/{marketing/navbars/navbar-4.test.tsx → e-commerce/navigation/storefront-navbar.test.tsx} +67 -36
  31. package/src/blocks/{marketing/navbars/navbar-4.tsx → e-commerce/navigation/storefront-navbar.tsx} +43 -25
  32. package/src/blocks/e-commerce/product-categories/category-card-grid.test.tsx +122 -0
  33. package/src/blocks/e-commerce/product-categories/category-card.test.tsx +68 -0
  34. package/src/blocks/e-commerce/product-categories/category-card.tsx +172 -0
  35. package/src/blocks/e-commerce/product-categories/category-grid.test.tsx +67 -0
  36. package/src/blocks/e-commerce/product-categories/category-shared.tsx +109 -0
  37. package/src/blocks/e-commerce/product-categories/product-category-grid.tsx +170 -0
  38. package/src/blocks/e-commerce/product-categories/product-category.test.tsx +266 -0
  39. package/src/blocks/e-commerce/product-categories/product-category.tsx +462 -0
  40. package/src/blocks/e-commerce/product-list/product-card.test.tsx +263 -0
  41. package/src/blocks/e-commerce/product-list/product-card.tsx +447 -0
  42. package/src/blocks/e-commerce/product-list/product-grid.test.tsx +162 -0
  43. package/src/blocks/e-commerce/product-list/product-grid.tsx +114 -0
  44. package/src/blocks/e-commerce/product-overview/product-overview-gallery.tsx +71 -0
  45. package/src/blocks/e-commerce/product-overview/{product-overview-5-lightbox-tab.tsx → product-overview-lightbox-tab.tsx} +35 -23
  46. package/src/blocks/e-commerce/product-overview/{product-overview-5-reviews-tab.tsx → product-overview-reviews-tab.tsx} +40 -17
  47. package/src/blocks/e-commerce/product-overview/{product-overview-5-tabs.tsx → product-overview-tabs.tsx} +8 -7
  48. package/src/blocks/e-commerce/product-overview/product-overview.test.tsx +283 -0
  49. package/src/blocks/e-commerce/product-overview/product-overview.tsx +1186 -0
  50. package/src/blocks/e-commerce/reviews/review-rating-2.tsx +5 -6
  51. package/src/blocks/e-commerce/shopping-carts/shopping-cart.test.tsx +399 -0
  52. package/src/blocks/e-commerce/shopping-carts/{shopping-cart-4.tsx → shopping-cart.tsx} +119 -85
  53. package/src/blocks/e-commerce/storefront-hero/storefront-hero.test.tsx +412 -0
  54. package/src/blocks/e-commerce/storefront-hero/storefront-hero.tsx +1283 -0
  55. package/src/blocks/marketing/features/feature.test.tsx +153 -0
  56. package/src/blocks/marketing/features/feature.tsx +195 -0
  57. package/src/blocks/marketing/footers/footer-section-accessibility.test.tsx +118 -0
  58. package/src/blocks/marketing/footers/footer-section-actions.test.tsx +131 -0
  59. package/src/blocks/marketing/footers/footer-section-data.test.tsx +127 -0
  60. package/src/blocks/marketing/footers/footer-section-native-links.test.tsx +100 -0
  61. package/src/blocks/marketing/footers/footer-section-public-api.test.tsx +11 -0
  62. package/src/blocks/marketing/footers/footer-section.test.tsx +46 -0
  63. package/src/blocks/marketing/footers/footer-section.tsx +532 -0
  64. package/src/blocks/marketing/navbars/navbar-public-api.test.tsx +57 -0
  65. package/src/blocks/marketing/navbars/navbar.mega.test.tsx +149 -0
  66. package/src/blocks/marketing/navbars/navbar.test.tsx +155 -0
  67. package/src/blocks/marketing/navbars/navbar.tsx +735 -0
  68. package/src/blocks/marketing/testimonials/testimonial-section.test.tsx +171 -0
  69. package/src/blocks/marketing/testimonials/testimonial-section.tsx +237 -0
  70. package/src/index.ts +156 -128
  71. package/src/lib/contracts-curated.test.ts +47 -29
  72. package/src/lib/contracts.test.ts +198 -2
  73. package/src/lib/contracts.ts +410 -16
  74. package/src/ui/button-group.tsx +1 -1
  75. package/src/ui/carousel.tsx +1 -1
  76. package/src/ui/dialog.tsx +1 -1
  77. package/src/ui/field.tsx +2 -2
  78. package/src/ui/input-group.tsx +3 -3
  79. package/src/ui/pagination.tsx +1 -1
  80. package/src/ui/sidebar.tsx +7 -7
  81. package/src/ui/toggle-group.tsx +1 -1
  82. package/tsconfig.build.json +12 -0
  83. package/tsup.config.ts +11 -7
  84. package/.turbo/turbo-build.log +0 -24
  85. package/.turbo/turbo-test.log +0 -47
  86. package/.turbo/turbo-type-check.log +0 -0
  87. package/dist/.tsbuildinfo +0 -1
  88. package/dist/contracts.d.mts +0 -1732
  89. package/dist/contracts.d.ts +0 -1732
  90. package/dist/contracts.js +0 -423
  91. package/dist/contracts.js.map +0 -1
  92. package/dist/contracts.mjs +0 -365
  93. package/dist/contracts.mjs.map +0 -1
  94. package/dist/index.d.mts +0 -3068
  95. package/dist/index.d.ts +0 -3068
  96. package/dist/index.js +0 -17834
  97. package/dist/index.js.map +0 -1
  98. package/dist/index.mjs +0 -17740
  99. package/dist/index.mjs.map +0 -1
  100. package/src/blocks/application/login-forms/login-page-1.tsx +0 -246
  101. package/src/blocks/application/login-forms/login-page-2.tsx +0 -207
  102. package/src/blocks/e-commerce/category-filters/category-filter-1.tsx +0 -260
  103. package/src/blocks/e-commerce/category-filters/category-filter-2-filter-panel.tsx +0 -222
  104. package/src/blocks/e-commerce/category-filters/category-filter-2.tsx +0 -921
  105. package/src/blocks/e-commerce/category-filters/category-filter-4-chip-rail.tsx +0 -57
  106. package/src/blocks/e-commerce/category-filters/category-filter-4-drawer.tsx +0 -124
  107. package/src/blocks/e-commerce/category-filters/category-filter-4-fields.tsx +0 -170
  108. package/src/blocks/e-commerce/category-filters/category-filter-4-sidebar.tsx +0 -52
  109. package/src/blocks/e-commerce/category-filters/category-filter-4-sort-sheet.tsx +0 -57
  110. package/src/blocks/e-commerce/category-filters/category-filter-4-state.ts +0 -68
  111. package/src/blocks/e-commerce/category-filters/category-filter-4.tsx +0 -298
  112. package/src/blocks/e-commerce/checkout-forms/card-formatting.test.ts +0 -47
  113. package/src/blocks/e-commerce/checkout-forms/card-formatting.ts +0 -9
  114. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-contact-step.tsx +0 -96
  115. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-order-summary.tsx +0 -252
  116. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-payment-step.tsx +0 -188
  117. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-progress.tsx +0 -36
  118. package/src/blocks/e-commerce/checkout-forms/checkout-form-1.test.tsx +0 -216
  119. package/src/blocks/e-commerce/checkout-forms/checkout-form-1.tsx +0 -338
  120. package/src/blocks/e-commerce/checkout-forms/checkout-form-2-order-summary.tsx +0 -130
  121. package/src/blocks/e-commerce/checkout-forms/checkout-form-2-payment-card.tsx +0 -175
  122. package/src/blocks/e-commerce/checkout-forms/checkout-form-2-shipping-card.tsx +0 -190
  123. package/src/blocks/e-commerce/checkout-forms/checkout-form-2.tsx +0 -312
  124. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-information-step.tsx +0 -91
  125. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-order-summary.tsx +0 -110
  126. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-payment-step.tsx +0 -137
  127. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-progress.tsx +0 -68
  128. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-review-step.tsx +0 -79
  129. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-shipping-step.tsx +0 -172
  130. package/src/blocks/e-commerce/checkout-forms/checkout-form-3.tsx +0 -392
  131. package/src/blocks/e-commerce/product-categories/avatar-group.tsx +0 -86
  132. package/src/blocks/e-commerce/product-categories/product-category-1.tsx +0 -126
  133. package/src/blocks/e-commerce/product-categories/product-category-2.test.tsx +0 -51
  134. package/src/blocks/e-commerce/product-categories/product-category-2.tsx +0 -120
  135. package/src/blocks/e-commerce/product-categories/product-category-4.tsx +0 -129
  136. package/src/blocks/e-commerce/product-categories/product-category-5.tsx +0 -218
  137. package/src/blocks/e-commerce/product-list/product-card-1.test.tsx +0 -88
  138. package/src/blocks/e-commerce/product-list/product-card-1.tsx +0 -192
  139. package/src/blocks/e-commerce/product-list/product-card-2.tsx +0 -71
  140. package/src/blocks/e-commerce/product-list/product-card-3-reaction-toggle.tsx +0 -166
  141. package/src/blocks/e-commerce/product-list/product-card-3.tsx +0 -215
  142. package/src/blocks/e-commerce/product-list/product-card-5-checkbox-check.tsx +0 -98
  143. package/src/blocks/e-commerce/product-list/product-card-5-reaction-toggle.tsx +0 -171
  144. package/src/blocks/e-commerce/product-list/product-card-5.tsx +0 -367
  145. package/src/blocks/e-commerce/product-overview/product-overview-1.test.tsx +0 -182
  146. package/src/blocks/e-commerce/product-overview/product-overview-1.tsx +0 -370
  147. package/src/blocks/e-commerce/product-overview/product-overview-2.tsx +0 -272
  148. package/src/blocks/e-commerce/product-overview/product-overview-5-gallery.tsx +0 -59
  149. package/src/blocks/e-commerce/product-overview/product-overview-5.tsx +0 -274
  150. package/src/blocks/e-commerce/shopping-carts/shopping-cart-1-spinning-counter.tsx +0 -142
  151. package/src/blocks/e-commerce/shopping-carts/shopping-cart-1.tsx +0 -291
  152. package/src/blocks/e-commerce/shopping-carts/shopping-cart-2-item-row.tsx +0 -110
  153. package/src/blocks/e-commerce/shopping-carts/shopping-cart-2-recommendations.tsx +0 -51
  154. package/src/blocks/e-commerce/shopping-carts/shopping-cart-2-spinning-counter.tsx +0 -146
  155. package/src/blocks/e-commerce/shopping-carts/shopping-cart-2.tsx +0 -295
  156. package/src/blocks/e-commerce/shopping-carts/shopping-cart-3-spinning-counter.tsx +0 -142
  157. package/src/blocks/e-commerce/shopping-carts/shopping-cart-3.tsx +0 -342
  158. package/src/blocks/e-commerce/shopping-carts/shopping-cart-4-spinning-counter.tsx +0 -146
  159. package/src/blocks/e-commerce/shopping-carts/shopping-cart-4.test.tsx +0 -229
  160. package/src/blocks/e-commerce/storefront-hero/storefront-hero-1.test.tsx +0 -72
  161. package/src/blocks/e-commerce/storefront-hero/storefront-hero-1.tsx +0 -263
  162. package/src/blocks/e-commerce/storefront-hero/storefront-hero-2.tsx +0 -283
  163. package/src/blocks/e-commerce/storefront-hero/storefront-hero-5.tsx +0 -318
  164. package/src/blocks/e-commerce/storefront-hero/storefront-hero-6.tsx +0 -205
  165. package/src/blocks/marketing/features/feature-1.tsx +0 -97
  166. package/src/blocks/marketing/features/feature-2.tsx +0 -82
  167. package/src/blocks/marketing/footers/footer-section-1.test.tsx +0 -117
  168. package/src/blocks/marketing/footers/footer-section-1.tsx +0 -178
  169. package/src/blocks/marketing/footers/footer-section-3.tsx +0 -192
  170. package/src/blocks/marketing/footers/footer-section-4.tsx +0 -355
  171. package/src/blocks/marketing/navbars/navbar-1.tsx +0 -267
  172. package/src/blocks/marketing/navbars/navbar-2.tsx +0 -351
  173. package/src/blocks/marketing/navbars/navbar-3.tsx +0 -303
  174. package/src/blocks/marketing/navbars/navbar-4-account-menu.test.tsx +0 -38
  175. package/src/blocks/marketing/navbars/navbar-4-like-button.tsx +0 -177
  176. package/src/blocks/marketing/navbars/navbar-4-product-grid.tsx +0 -219
  177. package/src/blocks/marketing/testimonials/testimonial-1.tsx +0 -141
  178. package/src/blocks/marketing/testimonials/testimonial-2.tsx +0 -108
package/dist/index.d.mts DELETED
@@ -1,3068 +0,0 @@
1
- import { ClassValue } from 'clsx';
2
- import * as class_variance_authority_types from 'class-variance-authority/types';
3
- import * as react from 'react';
4
- import { ReactNode, JSX } from 'react';
5
- import { VariantProps } from 'class-variance-authority';
6
- import { Avatar as Avatar$1 } from 'radix-ui';
7
- import { LucideIcon } from 'lucide-react';
8
- import { Money, ProductOption, SelectedOption, Image, PaymentMethod } from '@thorprovider/types';
9
- import { StoreCategory, ProductPresentation } from './contracts.mjs';
10
- export { AccountMenuItem, ButtonSpecProps, CanonMoney, CanonProduct, CardProduct, CartItem, CartTotals, NavCartItem, Navbar4SpecProps, PRODUCT_IMAGE_FALLBACK, ProductCard1SpecProps, ProductDetailProductSpec, ProductDetailVariantSpec, ProductOverview1SpecProps, ProductShowcase1SpecProps, Promotion, ShoppingCart4SpecProps, StoreContainer1SpecProps, StoreUser, UtilityLink, accountMenuItemSchema, buttonPropsSchema, cardProductSchema, cartItemSchema, cartTotalsSchema, formatMoney, isAvailableMoney, isCompleteFiniteDecimal, moneySchema, navCartItemSchema, navbar4PropsSchema, paymentMethodSchema, productCard1PropsSchema, productDetailProductSchema, productDetailVariantSchema, productOverview1PropsSchema, productPresentationSchema, productShowcase1PropsSchema, promotionSchema, resolveAbsoluteQuantity, shoppingCart4PropsSchema, storeCategorySchema, storeContainer1PropsSchema, storeUserSchema, utilityLinkSchema } from './contracts.mjs';
11
- import { z } from 'zod';
12
-
13
- /**
14
- * Merge Tailwind CSS class names safely.
15
- * Deduplicates conflicting utilities (e.g. `p-4` vs `p-2` → keeps last).
16
- */
17
- declare function cn(...inputs: ClassValue[]): string;
18
-
19
- interface CTA {
20
- label: string;
21
- href?: string;
22
- }
23
-
24
- declare const badgeVariants: (props?: ({
25
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
26
- } & class_variance_authority_types.ClassProp) | undefined) => string;
27
- declare function Badge({ className, variant, asChild, ...props }: react.ComponentProps<"span"> & VariantProps<typeof badgeVariants> & {
28
- asChild?: boolean;
29
- }): react.JSX.Element;
30
-
31
- declare const buttonVariants: (props?: ({
32
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
33
- size?: "icon" | "default" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
34
- } & class_variance_authority_types.ClassProp) | undefined) => string;
35
- declare function Button({ className, variant, size, asChild, ...props }: react.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
36
- asChild?: boolean;
37
- }): react.JSX.Element;
38
-
39
- declare function Avatar({ className, size, ...props }: react.ComponentProps<typeof Avatar$1.Root> & {
40
- size?: "default" | "sm" | "lg";
41
- }): react.JSX.Element;
42
- declare function AvatarImage({ className, ...props }: react.ComponentProps<typeof Avatar$1.Image>): react.JSX.Element;
43
- declare function AvatarFallback({ className, ...props }: react.ComponentProps<typeof Avatar$1.Fallback>): react.JSX.Element;
44
-
45
- declare function Card({ className, ...props }: react.ComponentProps<"div">): react.JSX.Element;
46
- declare function CardHeader({ className, ...props }: react.ComponentProps<"div">): react.JSX.Element;
47
- declare function CardTitle({ className, ...props }: react.ComponentProps<"div">): react.JSX.Element;
48
- declare function CardDescription({ className, ...props }: react.ComponentProps<"div">): react.JSX.Element;
49
- declare function CardAction({ className, ...props }: react.ComponentProps<"div">): react.JSX.Element;
50
- declare function CardContent({ className, ...props }: react.ComponentProps<"div">): react.JSX.Element;
51
- declare function CardFooter({ className, ...props }: react.ComponentProps<"div">): react.JSX.Element;
52
-
53
- interface NavLink$2 {
54
- label: string;
55
- href?: string;
56
- }
57
- interface Navbar1Props {
58
- navLinks: NavLink$2[];
59
- logoText: string;
60
- logoHref?: string;
61
- currentPath?: string;
62
- signIn?: CTA;
63
- cta?: CTA;
64
- /** Number of items in the cart. When provided, a cart button with badge is shown. */
65
- cartCount?: number;
66
- /** Fired when the user opens the cart. */
67
- onOpenCart?: () => void;
68
- }
69
- declare function Navbar1({ navLinks, logoText, logoHref, currentPath, signIn, cta, cartCount, onOpenCart, }: Navbar1Props): react.JSX.Element;
70
-
71
- interface MenuItem$1 {
72
- /** Icon rendered inside the item tile. */
73
- icon: LucideIcon;
74
- label: string;
75
- description: string;
76
- href: string;
77
- }
78
- interface MenuGroup {
79
- trigger: string;
80
- /** Two columns at `lg` when `items.length > 4`, single column otherwise. */
81
- items: MenuItem$1[];
82
- }
83
- interface FeaturedLink {
84
- eyebrow: string;
85
- title: string;
86
- description: string;
87
- href: string;
88
- linkLabel: string;
89
- /** Featured image URL. */
90
- image: string;
91
- imageAlt: string;
92
- }
93
- interface NavLink$1 {
94
- label: string;
95
- href: string;
96
- }
97
- interface Navbar2Props {
98
- /** Grouped menu entries rendered as flyout panels on desktop and accordions on mobile. */
99
- menuGroups: MenuGroup[];
100
- logoText: string;
101
- logoHref?: string;
102
- /** Simple top-level links rendered after the menu groups. */
103
- plainLinks?: NavLink$1[];
104
- /** Optional sign-in entry. Rendered as a link when `href` is set, otherwise as a button. */
105
- signIn?: CTA;
106
- /** Optional primary call to action. Rendered as a link when `href` is set, otherwise as a button. */
107
- cta?: CTA;
108
- /** Promo card shown on the right of wide flyout panels (groups with more than four items). */
109
- featured?: FeaturedLink;
110
- }
111
- declare function Navbar2({ menuGroups, logoText, logoHref, plainLinks, signIn, cta, featured, }: Navbar2Props): react.JSX.Element;
112
-
113
- interface NavLink {
114
- label: string;
115
- href?: string;
116
- }
117
- interface Navbar3Props {
118
- navLinks: NavLink[];
119
- /** Brand text shown next to the logo mark. */
120
- logoText: string;
121
- logoHref?: string;
122
- /** Current path used to highlight the active nav link. */
123
- currentPath?: string;
124
- /** Sign-in action. Rendered as a link when `href` is set, otherwise as a button. */
125
- signIn?: CTA;
126
- /** Primary call-to-action. Rendered as a link when `href` is set, otherwise as a button. */
127
- cta?: CTA;
128
- /**
129
- * When `true` (default), the header condenses into a floating rounded pill once scrolled.
130
- * Set to `false` for a plain solid bar instead of the condensing pill.
131
- */
132
- floatingPill?: boolean;
133
- /** Fired when the sign-in button (no `href`) is clicked. */
134
- onSignIn?: () => void;
135
- /** Fired when the CTA button (no `href`) is clicked. */
136
- onCtaClick?: () => void;
137
- }
138
- declare function Navbar3({ navLinks, logoText, logoHref, currentPath, signIn, cta, floatingPill, onSignIn, onCtaClick, }: Navbar3Props): react.JSX.Element;
139
-
140
- interface StoreUser {
141
- name: string;
142
- email: string;
143
- avatar?: string;
144
- initials: string;
145
- }
146
- interface AccountMenuItem {
147
- label: string;
148
- href: string;
149
- description?: string;
150
- icon?: 'orders' | 'wishlist' | 'addresses' | 'settings';
151
- }
152
-
153
- interface CartItem {
154
- /** Backend cart line-item id — the stable identity for update/removal. */
155
- id: string;
156
- name: string;
157
- variant?: string;
158
- price: number;
159
- qty: number;
160
- /** Optional; an absent image is omitted rather than serialized as `""`. */
161
- image?: string;
162
- /**
163
- * Canonical backend line amount. Required for truthful rendering in
164
- * `canonical` mode; when absent/invalid the line shows the unavailable
165
- * label rather than a numeric fallback.
166
- */
167
- lineTotal?: Money;
168
- }
169
- type CartSheetState = 'idle' | 'pending' | 'error';
170
-
171
- interface UtilityLink {
172
- label: string;
173
- href: string;
174
- }
175
-
176
- interface LogoAccent {
177
- /** Trailing segment of `logoText` to render with the accent styling. */
178
- text: string;
179
- /** Consumer-supplied classes for the accent span (e.g. a brand color token). */
180
- className?: string;
181
- }
182
- interface Navbar4Props {
183
- storeCategories: StoreCategory[];
184
- /**
185
- * Optional note shown in the desktop utility strip. When omitted (or empty)
186
- * and there are no `utilityLinks`, the strip is not rendered at all, so a
187
- * block with no optional content paints no empty decorative chrome.
188
- */
189
- shippingNote?: string;
190
- utilityLinks: UtilityLink[];
191
- logoText: string;
192
- logoHref?: string;
193
- /**
194
- * Optional accent for a trailing segment of `logoText` (e.g. the "Cuba" in
195
- * "ElectroCuba"). When omitted, or when `text` is not a trailing segment of
196
- * `logoText`, the wordmark renders unchanged.
197
- */
198
- logoAccent?: LogoAccent;
199
- /** Account destination for anonymous shoppers on every viewport. */
200
- accountHref?: string;
201
- /**
202
- * When `false`, no search control is rendered at all — neither the desktop
203
- * input, the mobile trigger, nor the mobile panel. Defaults to `true` so
204
- * legacy consumers keep the existing self-contained search. The generated
205
- * storefront passes `false` while no verified global search contract exists
206
- * (E2 task 5.4), so no global search is presented as working.
207
- */
208
- /**
209
- * The storefront's current route path. When it matches a destination the link
210
- * is marked as the current page (accessibly, beyond color alone).
211
- */
212
- currentPath?: string;
213
- showSearch?: boolean;
214
- searchQuery?: string;
215
- onSearchChange?: (value: string) => void;
216
- items?: CartItem[];
217
- /**
218
- * Quantity DELTA for a backend cart line-item id. The boundary converts the
219
- * delta into an absolute quantity against the authoritative current line
220
- * quantity before mutating the cart.
221
- */
222
- onQtyChange?: (id: string, delta: number) => void;
223
- /** Remove the backend cart line-item id. */
224
- onRemove?: (id: string) => void;
225
- /** Authoritative backend subtotal for the mini-cart. */
226
- subtotal?: Money;
227
- /** Shown when an authoritative subtotal is supplied but absent/malformed. */
228
- subtotalUnavailableLabel?: string;
229
- /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */
230
- formatMoney?: (money: Money) => string;
231
- user?: StoreUser;
232
- accountMenuItems?: AccountMenuItem[];
233
- onHelp?: () => void;
234
- onSignOut?: () => void;
235
- accountPending?: boolean;
236
- accountUnavailable?: boolean;
237
- onAccountRetry?: () => void;
238
- onCheckout?: () => void;
239
- onViewCart?: () => void;
240
- /**
241
- * Controlled visibility for the cart sheet. When provided, the sheet opens
242
- * and closes from this value and `onCartOpenChange` instead of internal
243
- * state, so a host can share one cart surface across the navbar trigger and
244
- * successful add-to-cart. Omit both to keep the legacy uncontrolled sheet.
245
- */
246
- cartOpen?: boolean;
247
- /** Change handler paired with `cartOpen` for a controlled sheet. */
248
- onCartOpenChange?: (open: boolean) => void;
249
- /**
250
- * Backend-authoritative cart rendering for the sheet. When `true`, line
251
- * amounts use each item's canonical `lineTotal` Money and never fall back to
252
- * numeric `price * qty`. Omit for the legacy numeric rendering.
253
- */
254
- canonicalCart?: boolean;
255
- /** Cart read/mutation lifecycle for the sheet. */
256
- cartState?: CartSheetState;
257
- /** Message shown when `cartState` is `error`. */
258
- cartErrorLabel?: string;
259
- /** Recovery action label for the error state. */
260
- cartRetryLabel?: string;
261
- /** Recovery action invoked from the error state. */
262
- onCartRetry?: () => void;
263
- /** When `true`, the sheet's checkout action is suppressed (checkout not installed). */
264
- checkoutUnavailable?: boolean;
265
- /** When `true`, the sheet's checkout action is disabled (cart not ready). */
266
- checkoutDisabled?: boolean;
267
- /** When `true`, the sheet's review action is suppressed (cart view not installed). */
268
- viewCartUnavailable?: boolean;
269
- /**
270
- * Consumer-supplied classes merged onto the outer `<header>` as the final
271
- * argument, so a semantic surface such as `bg-brand-nav
272
- * text-brand-nav-foreground` overrides the default `bg-background`. Purely
273
- * presentational: no layout, structure, or behavior changes.
274
- */
275
- className?: string;
276
- }
277
- declare function Navbar4({ storeCategories, shippingNote, utilityLinks, logoText, logoHref, logoAccent, accountHref, currentPath, showSearch, searchQuery: searchQueryProp, onSearchChange, items: itemsProp, onQtyChange: onQtyChangeProp, onRemove: onRemoveProp, subtotal, subtotalUnavailableLabel, formatMoney, user, accountMenuItems, onHelp, onSignOut, accountPending, accountUnavailable, onAccountRetry, onCheckout, onViewCart, cartOpen, onCartOpenChange, canonicalCart, cartState, cartErrorLabel, cartRetryLabel, onCartRetry, checkoutUnavailable, checkoutDisabled, viewCartUnavailable, className, }: Navbar4Props): react.JSX.Element;
278
-
279
- type Banner1Shape = 'bar' | 'pill';
280
- interface Banner1Props {
281
- /**
282
- * 'bar' — full-width strip above the header (the default).
283
- * 'pill' — floating rounded card pinned to the bottom of the viewport, with an avatar stack.
284
- */
285
- shape?: Banner1Shape;
286
- badge?: string;
287
- message: string;
288
- href: string;
289
- linkLabel: string;
290
- /** Used by the 'pill' shape only; decorative avatars of the announcement's authors. */
291
- avatars?: string[];
292
- /**
293
- * 'bar' only. When true, the inner content spans the full width of its parent
294
- * (skips the centered `max-w-7xl` container) so badge/message/CTA reach the edges.
295
- */
296
- fullWidth?: boolean;
297
- /** Fired when the user clicks the banner CTA. When provided, the CTA renders as a button instead of a link. */
298
- onCtaClick?: () => void;
299
- /** Fired when the user dismisses the banner. */
300
- onDismiss?: () => void;
301
- }
302
- declare function Banner1({ shape, badge, message, href, linkLabel, avatars, fullWidth, onCtaClick, onDismiss, }: Banner1Props): react.JSX.Element | null;
303
-
304
- interface AvatarItem {
305
- id: string | number;
306
- avatarUrl: string;
307
- fallback: string;
308
- alt?: string;
309
- }
310
- interface Rating {
311
- value: number;
312
- count: number;
313
- }
314
- interface HeroSection1Props {
315
- title: string;
316
- description: string;
317
- badge?: string;
318
- cta?: CTA;
319
- reviewers?: AvatarItem[];
320
- rating?: Rating;
321
- trustedBy?: string;
322
- image?: {
323
- src: string;
324
- alt: string;
325
- };
326
- }
327
- declare function HeroSection1({ title, description, badge, cta, reviewers, rating, trustedBy, image, }: HeroSection1Props): react.JSX.Element;
328
-
329
- interface CtaSection1Props {
330
- badgeText?: string;
331
- title?: string;
332
- description?: string;
333
- primaryCta?: CTA;
334
- secondaryCta?: CTA;
335
- onPrimaryClick?: () => void;
336
- onSecondaryClick?: () => void;
337
- }
338
- declare function CtaSection1({ badgeText, title, description, primaryCta, secondaryCta, onPrimaryClick, onSecondaryClick, }: CtaSection1Props): react.JSX.Element;
339
-
340
- interface Feature1Item {
341
- id: string;
342
- title: string;
343
- description: string;
344
- icon: LucideIcon;
345
- }
346
- interface Feature1Props {
347
- items: Feature1Item[];
348
- badge?: string;
349
- title?: string;
350
- description?: string;
351
- learnMoreLabel?: string;
352
- ctaLabel?: string;
353
- onCtaClick?: () => void;
354
- onLearnMore?: (item: Feature1Item) => void;
355
- }
356
- declare function Feature1({ items, badge, title, description, learnMoreLabel, ctaLabel, onCtaClick, onLearnMore, }: Feature1Props): react.JSX.Element;
357
-
358
- interface Feature2Item {
359
- id: string;
360
- title: string;
361
- description: string;
362
- icon: LucideIcon;
363
- }
364
- interface Feature2Props {
365
- items: Feature2Item[];
366
- title?: string;
367
- description?: string;
368
- image?: {
369
- src: string;
370
- alt: string;
371
- };
372
- className?: string;
373
- }
374
- declare function Feature2({ items, title, description, image, className, }: Feature2Props): react.JSX.Element;
375
-
376
- interface Testimonial1Item {
377
- id: string;
378
- name: string;
379
- role: string;
380
- avatar: string;
381
- content: string;
382
- rating: number;
383
- }
384
- interface Testimonial1Props {
385
- items: Testimonial1Item[];
386
- title?: string;
387
- prevLabel?: string;
388
- nextLabel?: string;
389
- slideAriaLabel?: string;
390
- }
391
- declare function Testimonial1({ items, title, prevLabel, nextLabel, slideAriaLabel, }: Testimonial1Props): react.JSX.Element;
392
-
393
- interface Testimonial2Item {
394
- id: string;
395
- name: string;
396
- role: string;
397
- avatar: string;
398
- content: string;
399
- }
400
- interface Testimonial2Props {
401
- items: Testimonial2Item[];
402
- title?: string;
403
- description?: string;
404
- }
405
- declare function Testimonial2({ items, title, description, }: Testimonial2Props): react.JSX.Element;
406
-
407
- interface FaqItem {
408
- value: string;
409
- question: string;
410
- answer: string;
411
- }
412
- interface FaqBlock1Props {
413
- /** Preguntas y respuestas del bloque. Cada item necesita un `value` único. */
414
- items: FaqItem[];
415
- title?: string;
416
- description?: string;
417
- /** Permite abrir varios items a la vez (`'multiple'`) o solo uno (`'single'`). */
418
- accordionType?: 'single' | 'multiple';
419
- }
420
- declare function FaqBlock1({ items, title, description, accordionType, }: FaqBlock1Props): react.JSX.Element;
421
-
422
- interface PricingTier {
423
- id: string;
424
- name: string;
425
- description: string;
426
- /** Precio sin símbolo de moneda; el símbolo se pasa aparte en `currencySymbol`. */
427
- price: string;
428
- /** Frecuencia de facturación, p. ej. '/mes'. */
429
- frequency: string;
430
- features: string[];
431
- popular?: boolean;
432
- }
433
- interface PricingSection1Props {
434
- tiers: PricingTier[];
435
- currencySymbol?: string;
436
- sectionTitle?: string;
437
- sectionLabel?: string;
438
- popularBadgeLabel?: string;
439
- getStartedLabel?: string;
440
- onSelectTier?: (tier: PricingTier) => void;
441
- }
442
- declare function PricingSection1({ tiers, currencySymbol, sectionTitle, sectionLabel, popularBadgeLabel, getStartedLabel, onSelectTier, }: PricingSection1Props): react.JSX.Element;
443
-
444
- interface LogoCloud1Platform {
445
- name: string;
446
- id: string;
447
- }
448
- interface LogoCloud1Props {
449
- platforms: LogoCloud1Platform[];
450
- title?: string;
451
- description?: string;
452
- moreLabel?: string;
453
- }
454
- declare function LogoCloud1({ platforms, title, description, moreLabel }: LogoCloud1Props): react.JSX.Element;
455
-
456
- interface StatisticItem {
457
- id: string;
458
- title: string;
459
- value: string;
460
- description: string;
461
- progress: number;
462
- progressLabel: string;
463
- icon: LucideIcon;
464
- }
465
- interface Statistic1Props {
466
- items: StatisticItem[];
467
- badge?: string;
468
- title?: string;
469
- description?: string;
470
- }
471
- declare function Statistic1({ items, badge, title, description }: Statistic1Props): react.JSX.Element;
472
-
473
- interface FooterLink$1 {
474
- label: string;
475
- href?: string;
476
- }
477
- interface FooterLinkColumn$1 {
478
- title: string;
479
- links: FooterLink$1[];
480
- }
481
- interface FooterNewsletter {
482
- placeholder?: string;
483
- buttonLabel: string;
484
- /**
485
- * Submit handler. The interactive form (input + submit button) renders only
486
- * when this is supplied. A newsletter without `onSubmit` renders no form,
487
- * input, or button — never a fake form.
488
- */
489
- onSubmit?: (email: string) => void;
490
- }
491
- interface BrandAccent {
492
- /** Trailing segment of `brandName` to render with the accent styling. */
493
- text: string;
494
- /** Consumer-supplied classes for the accent span (e.g. a brand color token). */
495
- className?: string;
496
- }
497
- interface FooterSection1Props {
498
- brandName: string;
499
- /**
500
- * Optional accent for a trailing segment of `brandName` (e.g. the "Cuba" in
501
- * "ElectroCuba"). When omitted, or when `text` is not a trailing segment of
502
- * `brandName`, the brand name renders unchanged.
503
- */
504
- brandAccent?: BrandAccent;
505
- brandDescription?: string;
506
- linkColumns: FooterLinkColumn$1[];
507
- newsletter?: FooterNewsletter;
508
- /**
509
- * Consumer-supplied classes merged onto the outer `<footer>` as the final
510
- * argument, so a semantic surface such as `bg-brand-nav
511
- * text-brand-nav-foreground` overrides the default `bg-secondary`. Purely
512
- * presentational: no layout, structure, or behavior changes.
513
- */
514
- className?: string;
515
- }
516
- declare function FooterSection1({ brandName, brandAccent, brandDescription, linkColumns, newsletter, className, }: FooterSection1Props): react.JSX.Element;
517
-
518
- interface FooterLink {
519
- label: string;
520
- href?: string;
521
- }
522
- interface FooterLinkColumn {
523
- title: string;
524
- links: FooterLink[];
525
- }
526
- interface SocialLink {
527
- label: string;
528
- href?: string;
529
- icon: LucideIcon;
530
- }
531
- interface FooterSection3Props {
532
- /** Texto del logo (identidad del bloque). Requerido. */
533
- logoText: string;
534
- /** Descripción corta de la marca. Requerida. */
535
- description: string;
536
- /** Columnas de enlaces (máximo recomendado 4). Requerido. */
537
- linkColumns: FooterLinkColumn[];
538
- /** Enlaces legales de la barra inferior. Por defecto []. */
539
- legalLinks?: FooterLink[];
540
- /** Redes sociales (cada una con su icono lucide). Por defecto []. */
541
- socialLinks?: SocialLink[];
542
- /** Título del bloque newsletter. Por defecto 'Suscríbete a nuestro boletín'. */
543
- newsletterTitle?: string;
544
- /** Placeholder del input de email. Por defecto 'Tu correo electrónico'. */
545
- newsletterPlaceholder?: string;
546
- /** aria-label del botón de envío (icon-only). Por defecto 'Suscribirse'. */
547
- newsletterLabel?: string;
548
- /** Callback al enviar el formulario newsletter. Recibe el email. */
549
- onSubscribe?: (email: string) => void;
550
- }
551
- declare function FooterSection3({ logoText, description, linkColumns, legalLinks, socialLinks, newsletterTitle, newsletterPlaceholder, newsletterLabel, onSubscribe, }: FooterSection3Props): react.JSX.Element;
552
-
553
- type FooterSection4SocialIcon = 'facebook' | 'twitter' | 'instagram';
554
- interface FooterSection4Link {
555
- label: string;
556
- href?: string;
557
- }
558
- interface FooterSection4LinkColumn {
559
- title: string;
560
- links: FooterSection4Link[];
561
- }
562
- interface FooterSection4Contact {
563
- /** Título de la columna de contacto. Requerido. */
564
- heading: string;
565
- /** Dirección del negocio. Por defecto undefined. */
566
- address?: string;
567
- /** href del enlace de dirección. Por defecto undefined. */
568
- addressHref?: string;
569
- /** Teléfono de contacto. Por defecto undefined. */
570
- phone?: string;
571
- /** href del enlace de teléfono (p. ej. tel:). Por defecto undefined. */
572
- phoneHref?: string;
573
- /** Email de contacto. Por defecto undefined. */
574
- email?: string;
575
- /** href del enlace de email (p. ej. mailto:). Por defecto undefined. */
576
- emailHref?: string;
577
- }
578
- interface FooterSection4SocialLink {
579
- label: string;
580
- href?: string;
581
- icon: FooterSection4SocialIcon;
582
- }
583
- interface FooterSection4Props {
584
- /** Nombre de la marca mostrado junto al logo. Requerido. */
585
- brandName: string;
586
- /** Descripción corta de la marca bajo el logo. Requerida. */
587
- tagline: string;
588
- /** Placeholder del input de email del newsletter. Por defecto 'Tu correo electrónico'. */
589
- newsletterPlaceholder?: string;
590
- /** Texto del botón de suscripción. Por defecto 'Suscribirse'. */
591
- newsletterSubmitLabel?: string;
592
- /** Datos de la columna de contacto (dirección, teléfono, email). Requerido. */
593
- contact: FooterSection4Contact;
594
- /** Columnas de enlaces (Quick Links, Resources, Legal...). Requerido. */
595
- linkColumns: FooterSection4LinkColumn[];
596
- /** Texto de copyright de la barra inferior (incluye año). Requerido. */
597
- copyright: string;
598
- /** Redes sociales con su icono serializable por nombre. Por defecto []. */
599
- socialLinks?: FooterSection4SocialLink[];
600
- /** Logo personalizado; si se omite se usa el SVG interno del bloque. Por defecto undefined. */
601
- logo?: ReactNode;
602
- /** Callback al enviar el formulario newsletter. Recibe el email. */
603
- onNewsletterSubmit?: (email: string) => void;
604
- /** Callback al hacer clic en un enlace de columna o contacto. Recibe el enlace. */
605
- onLinkClick?: (link: FooterSection4Link) => void;
606
- /** Callback al hacer clic en una red social. Recibe el label. */
607
- onSocialClick?: (label: string) => void;
608
- }
609
- declare function FooterSection4({ brandName, tagline, newsletterPlaceholder, newsletterSubmitLabel, contact, linkColumns, copyright, socialLinks, logo, onNewsletterSubmit, onLinkClick, onSocialClick, }: FooterSection4Props): react.JSX.Element;
610
-
611
- interface Product {
612
- id: string | number;
613
- title: string;
614
- price: number;
615
- originalPrice?: number;
616
- image: string;
617
- badge?: string;
618
- }
619
- /**
620
- * A card entry is either the legacy numeric-price product or the canonical
621
- * `Money`-price presentation. The block renders both without breaking legacy
622
- * consumers: a numeric `price` keeps the legacy `$` output unchanged, while a
623
- * canonical `Money` price is formatted in its own currency and locale.
624
- */
625
- type ProductCard1Product = Product | ProductPresentation;
626
- interface ProductCard1Props {
627
- products: ProductCard1Product[];
628
- heading?: string;
629
- maxItems?: number;
630
- onAddToCart?: (product: ProductCard1Product) => void;
631
- onProductClick?: (product: ProductCard1Product) => void;
632
- addToCartLabel?: string;
633
- /** Shown when a canonical price is present but unavailable (never `$0`). */
634
- unavailablePriceLabel?: string;
635
- }
636
- declare function ProductCard1({ products, heading, maxItems, onAddToCart, onProductClick, addToCartLabel, unavailablePriceLabel, }: ProductCard1Props): react.JSX.Element;
637
-
638
- interface ProductCard2Product {
639
- id: string | number;
640
- title: string;
641
- image: string;
642
- price: number;
643
- rating: number;
644
- }
645
- interface ProductCard2Props {
646
- products: ProductCard2Product[];
647
- heading?: string;
648
- description?: string;
649
- }
650
- declare function ProductCard2({ products, heading, description }: ProductCard2Props): react.JSX.Element;
651
-
652
- interface ProductCard3Product {
653
- id: string | number;
654
- title: string;
655
- subtitle: string;
656
- image: string;
657
- price: number;
658
- originalPrice: number;
659
- rating: number;
660
- reviewCount: number;
661
- discountPercentage: number;
662
- isLowStock?: boolean;
663
- badge?: {
664
- text: string;
665
- variant: 'trending' | 'bestseller' | 'new';
666
- };
667
- }
668
- interface ProductCard3Props {
669
- products: ProductCard3Product[];
670
- currencySymbol?: string;
671
- onViewSimilar?: (product: ProductCard3Product) => void;
672
- onToggleWishlist?: (product: ProductCard3Product) => void;
673
- onProductClick?: (product: ProductCard3Product) => void;
674
- }
675
- declare function ProductCard3({ products, currencySymbol, onViewSimilar, onToggleWishlist, onProductClick, }: ProductCard3Props): JSX.Element;
676
-
677
- interface ProductCard5Product {
678
- id: string;
679
- name: string;
680
- category: string;
681
- price: number;
682
- rating: number;
683
- reviews: number;
684
- image: string;
685
- stock: string;
686
- specifications: string;
687
- brand: string;
688
- }
689
- interface ProductCard5Props {
690
- products: ProductCard5Product[];
691
- onToggleWishlist?: (product: ProductCard5Product) => void;
692
- onAddToCart?: (product: ProductCard5Product) => void;
693
- onQuickView?: (product: ProductCard5Product) => void;
694
- onCompare?: (products: ProductCard5Product[]) => void;
695
- onExport?: (products: ProductCard5Product[]) => void;
696
- }
697
- declare function ProductCard5({ products, onToggleWishlist, onAddToCart, onQuickView, onCompare, onExport, }: ProductCard5Props): react.JSX.Element;
698
-
699
- interface ProductShowcase1Props {
700
- products: ProductPresentation[];
701
- heading?: string;
702
- description?: string;
703
- pageSize?: number;
704
- prevLabel?: string;
705
- nextLabel?: string;
706
- /** Label for the current-page status, e.g. "Página". */
707
- pageLabel?: string;
708
- unavailablePriceLabel?: string;
709
- emptyLabel?: string;
710
- addToCartLabel?: string;
711
- onAddToCart?: (product: ProductPresentation) => void;
712
- onProductClick?: (product: ProductPresentation) => void;
713
- }
714
- /**
715
- * Combined grid-and-carousel product presentation: fixed-size grid pages
716
- * navigated manually (prev/next) with a visible current-page indication. There
717
- * is no autoplay, no auto-advance, and no infinite loop. Controls are real
718
- * buttons (keyboard operable and visible at every breakpoint); touch swipe is an
719
- * addition, never the only way to navigate. Below-fold images are lazy.
720
- *
721
- * Data access lives in the host: this block only renders the props it receives
722
- * and reports interactions through callbacks (no backend/router/measurement
723
- * imports).
724
- */
725
- declare function ProductShowcase1({ products, heading, description, pageSize, prevLabel, nextLabel, pageLabel, unavailablePriceLabel, emptyLabel, addToCartLabel, onAddToCart, onProductClick, }: ProductShowcase1Props): react.JSX.Element;
726
-
727
- /**
728
- * Canonical product-detail projection.
729
- *
730
- * The block consumes the canonical `@thorprovider/types` shapes (`Money`,
731
- * `ProductOption`, `SelectedOption`, `Image`) so adapter output maps without a
732
- * second, drifting product type. The only deviation is `price`: the canon marks
733
- * it required, but a missing/unresolved backend price is a real, distinct state
734
- * that must disable purchase — so the projection allows `price` to be absent
735
- * and the block treats absence as "unavailable", never as zero.
736
- */
737
- interface ProductDetailVariant {
738
- id: string;
739
- title: string;
740
- sku?: string;
741
- availableForSale: boolean;
742
- selectedOptions: SelectedOption[];
743
- /** Canonical Money; omit/null when the backend has no resolved price. */
744
- price?: Money | null;
745
- compareAtPrice?: Money;
746
- image?: Image;
747
- }
748
- interface ProductDetailProduct {
749
- id: string;
750
- handle?: string;
751
- title: string;
752
- description?: string;
753
- vendor?: string;
754
- options: ProductOption[];
755
- variants: ProductDetailVariant[];
756
- images: Image[];
757
- featuredImage?: Image;
758
- }
759
- interface ProductOverview1Rating {
760
- value: number;
761
- count: number;
762
- }
763
- interface ProductOverview1Props {
764
- product: ProductDetailProduct;
765
- /** Controlled selection: the backend variant id, or null/undefined when nothing is explicitly selected. */
766
- selectedVariantId?: string | null;
767
- onSelectVariant?: (variantId: string) => void;
768
- /** Controlled quantity for the add-to-cart action; defaults to 1 when omitted. */
769
- quantity?: number;
770
- onQuantityChange?: (quantity: number) => void;
771
- /** Add-to-cart identity is the selected backend variant id, with the requested quantity. */
772
- onAddToCart?: (variantId: string, quantity: number) => void;
773
- isWishlisted?: boolean;
774
- onToggleWishlist?: (variantId: string, isWishlisted: boolean) => void;
775
- /** Rendered only when the backend supplies it. */
776
- rating?: ProductOverview1Rating;
777
- /** Rendered only when the backend supplies it. */
778
- deliveryEstimate?: string;
779
- /** Rendered only when the backend supplies it. */
780
- shipping?: Money;
781
- formatPrice?: (money: Money) => string;
782
- sizesLabel?: string;
783
- variantLabel?: string;
784
- reviewsLabel?: string;
785
- addToCartLabel?: string;
786
- outOfStockLabel?: string;
787
- unavailablePriceLabel?: string;
788
- selectVariantLabel?: string;
789
- quantityLabel?: string;
790
- deliveryEstimateLabel?: string;
791
- shippingLabel?: string;
792
- removeFromWishlistLabel?: string;
793
- addToWishlistLabel?: string;
794
- imageFallback?: string;
795
- }
796
- declare function ProductOverview1({ product, selectedVariantId, onSelectVariant, quantity, onQuantityChange, onAddToCart, isWishlisted, onToggleWishlist, rating, deliveryEstimate, shipping, formatPrice, sizesLabel, variantLabel, reviewsLabel, addToCartLabel, outOfStockLabel, unavailablePriceLabel, selectVariantLabel, quantityLabel, deliveryEstimateLabel, shippingLabel, removeFromWishlistLabel, addToWishlistLabel, imageFallback, }: ProductOverview1Props): react.JSX.Element;
797
-
798
- interface ProductOverview2ProductImage {
799
- src: string;
800
- alt: string;
801
- }
802
- interface ProductOverview2ProductColor {
803
- name: string;
804
- value: string;
805
- }
806
- interface ProductOverview2ProductSize {
807
- eu: number;
808
- uk: number;
809
- us: number;
810
- }
811
- interface ProductOverview2Product {
812
- id: string;
813
- brand: string;
814
- name: string;
815
- sku: string;
816
- price: number;
817
- currency: string;
818
- rating: number;
819
- reviews: number;
820
- images: ProductOverview2ProductImage[];
821
- sizes: ProductOverview2ProductSize[];
822
- colors: ProductOverview2ProductColor[];
823
- }
824
- interface ProductOverview2Props {
825
- product: ProductOverview2Product;
826
- sizesLabel?: string;
827
- colorLabel?: string;
828
- reviewsLabel?: string;
829
- addToCartLabel?: string;
830
- removeFromWishlistLabel?: string;
831
- addToWishlistLabel?: string;
832
- sizeGuideLabel?: string;
833
- freeDeliveryLabel?: string;
834
- onAddToCart?: (product: ProductOverview2Product) => void;
835
- onToggleWishlist?: (product: ProductOverview2Product, isWishlisted: boolean) => void;
836
- }
837
- declare function ProductOverview2({ product, sizesLabel, colorLabel, reviewsLabel, addToCartLabel, removeFromWishlistLabel, addToWishlistLabel, sizeGuideLabel, freeDeliveryLabel, onAddToCart, onToggleWishlist, }: ProductOverview2Props): react.JSX.Element;
838
-
839
- interface ProductOverview5Review {
840
- id: number;
841
- author: string;
842
- rating: number;
843
- comment: string;
844
- date: string;
845
- helpful: number;
846
- }
847
- interface ProductOverview5Product {
848
- name: string;
849
- price: number;
850
- originalPrice: null | number;
851
- rating: number;
852
- reviewCount: number;
853
- sku: string;
854
- mainImages: string[];
855
- galleryImages: string[];
856
- description: string;
857
- features: string[];
858
- specifications: Record<string, string>;
859
- userReviews: ProductOverview5Review[];
860
- }
861
- interface ProductOverview5Props {
862
- product: ProductOverview5Product;
863
- badgeLabel?: string;
864
- availabilityLabel?: string;
865
- currencySymbol?: string;
866
- skuLabel?: string;
867
- overviewLabel?: string;
868
- specsLabel?: string;
869
- featuresLabel?: string;
870
- specificationsLabel?: string;
871
- reviewsLabel?: string;
872
- galleryLabel?: string;
873
- saveLabel?: string;
874
- savedLabel?: string;
875
- shareLabel?: string;
876
- addToCartLabel?: string;
877
- basedOnReviewsLabel?: string;
878
- foundHelpfulLabel?: string;
879
- ofCounterLabel?: string;
880
- photosLabel?: string;
881
- onAddToCart?: (product: ProductOverview5Product) => void;
882
- onToggleWishlist?: (product: ProductOverview5Product, isWishlisted: boolean) => void;
883
- onShare?: (product: ProductOverview5Product) => void;
884
- }
885
- declare function ProductOverview5({ product, badgeLabel, availabilityLabel, currencySymbol, skuLabel, overviewLabel, specsLabel, featuresLabel, specificationsLabel, reviewsLabel, galleryLabel, saveLabel, savedLabel, shareLabel, addToCartLabel, basedOnReviewsLabel, foundHelpfulLabel, ofCounterLabel, photosLabel, onAddToCart, onToggleWishlist, onShare, }: ProductOverview5Props): react.JSX.Element;
886
-
887
- interface QuickViewOption {
888
- value: string;
889
- label: string;
890
- available: boolean;
891
- /**
892
- * A literal colour for a swatch, when the option is one.
893
- *
894
- * Finish colours are product data, not theme data: brass has to stay brass whatever preset the
895
- * customizer is on. It is the one place in the block that is not a token, and the option's
896
- * label always carries the same information in words.
897
- */
898
- swatch?: string;
899
- }
900
- interface QuickViewVariant {
901
- key: string;
902
- label: string;
903
- /**
904
- * Which option a product opens on.
905
- *
906
- * Not simply the first available one: sizes are listed smallest first, and the sofa is sold as
907
- * the size its name promises, so the panel would otherwise open on an option that disagrees
908
- * with the card the reader just pressed.
909
- */
910
- defaultValue?: string;
911
- options: QuickViewOption[];
912
- }
913
- interface QuickViewProduct {
914
- id: string;
915
- name: string;
916
- /** The one line that says what it is, under the name on the card and in the panel. */
917
- tagline: string;
918
- category: string;
919
- price: number;
920
- compareAt?: number;
921
- rating: number;
922
- reviewCount: number;
923
- /** In stock, and low enough to be worth saying. Omitted when there is plenty. */
924
- unitsLeft?: number;
925
- image: string;
926
- imageAlt: string;
927
- description: string;
928
- /** The panel shows these as a list, not as a specification table. */
929
- details: string[];
930
- variants: QuickViewVariant[];
931
- /** Where the full product page lives. The panel only links to it when set. */
932
- href?: string;
933
- }
934
- interface ProductQuickViewProps {
935
- products: QuickViewProduct[];
936
- eyebrow?: string;
937
- heading?: string;
938
- lede?: string;
939
- /**
940
- * Called with the chosen options when the reader adds to cart. When absent the button still
941
- * shows and keeps its added-to-cart confirmation; it just has nowhere to report to.
942
- */
943
- onAddToCart?: (product: QuickViewProduct, quantity: number, selection: Record<string, string>) => void;
944
- }
945
- /**
946
- * A product grid whose point is the panel that opens over it.
947
- *
948
- * One dialog serves the whole catalogue rather than one per card: the panel steps between
949
- * products from inside, the card it is showing stays lit underneath, and closing puts the reader
950
- * back exactly where the grid says they are.
951
- */
952
- declare function ProductQuickView({ products, eyebrow, heading, lede, onAddToCart, }: ProductQuickViewProps): react.JSX.Element;
953
-
954
- interface ReviewRating1ReviewFormProps {
955
- title: string;
956
- description?: string;
957
- nameLabel: string;
958
- emailLabel: string;
959
- reviewLabel: string;
960
- namePlaceholder: string;
961
- emailPlaceholder: string;
962
- reviewPlaceholder: string;
963
- submitButtonText: string;
964
- submittingButtonText: string;
965
- }
966
- interface ReviewRating1ReviewFormData {
967
- name: string;
968
- email: string;
969
- review: string;
970
- rating: number;
971
- }
972
-
973
- interface ReviewRating1Review {
974
- id: number;
975
- userName: string;
976
- userAvatar?: string;
977
- date: string;
978
- rating: number;
979
- content: string;
980
- likes?: number;
981
- comments?: number;
982
- }
983
- interface ReviewRating1Props {
984
- pageTitle: string;
985
- pageDescription?: string;
986
- reviews: ReviewRating1Review[];
987
- form?: ReviewRating1ReviewFormProps;
988
- reviewsPerPage?: number;
989
- onToggleReviewLike?: (review: ReviewRating1Review, liked: boolean) => void;
990
- onSubmitReview?: (data: ReviewRating1ReviewFormData) => void;
991
- }
992
- declare function ReviewRating1({ pageTitle, pageDescription, reviews, form, reviewsPerPage, onToggleReviewLike, onSubmitReview, }: ReviewRating1Props): react.JSX.Element;
993
-
994
- interface Review {
995
- id: string;
996
- userName: string;
997
- userAvatar?: string;
998
- date: string;
999
- rating: number;
1000
- content: string;
1001
- likes?: number;
1002
- comments?: number;
1003
- }
1004
- interface ReviewRating2Props {
1005
- reviews: Review[];
1006
- pageTitle?: string;
1007
- pageDescription?: string;
1008
- averageRating?: number;
1009
- totalReviews?: number;
1010
- ratingDistribution?: Record<string, number>;
1011
- basedOnLabel?: string;
1012
- likesLabel?: string;
1013
- commentsLabel?: string;
1014
- onLike?: (review: Review) => void;
1015
- onComment?: (review: Review) => void;
1016
- }
1017
- /**
1018
- * ReviewRating2 — resumen de valoración (media, estrellas y distribución de
1019
- * notas) junto a un carrusel de reseñas con acciones de "me gusta" y
1020
- * comentarios. 100% prop-driven: ningún contenido demo embebido.
1021
- */
1022
- declare function ReviewRating2({ reviews, pageTitle, pageDescription, averageRating, totalReviews, ratingDistribution, basedOnLabel, likesLabel, commentsLabel, onLike, onComment, }: ReviewRating2Props): react.JSX.Element;
1023
-
1024
- type ProductCategory1CategoryIcon = 'Smartphone' | 'BatteryCharging' | 'Wrench' | 'Camera' | 'Cable' | 'ShieldCheck' | 'Sparkles' | 'Lightbulb';
1025
- interface ProductCategory1Category {
1026
- id: string;
1027
- name: string;
1028
- subtitle: string;
1029
- icon: ProductCategory1CategoryIcon;
1030
- }
1031
- interface ProductCategory1Props {
1032
- badge?: string;
1033
- title: string;
1034
- description?: string;
1035
- cta?: CTA;
1036
- categories: ProductCategory1Category[];
1037
- className?: string;
1038
- }
1039
- declare function ProductCategory1({ badge, title, description, cta, categories, className, }: ProductCategory1Props): react.JSX.Element;
1040
-
1041
- interface ProductCategory2Category {
1042
- id: string;
1043
- handle?: string;
1044
- name: string;
1045
- description: string;
1046
- /**
1047
- * Number of items in the category. Optional: when omitted, or when it is not
1048
- * a finite non-negative number, no count is rendered — an unknown projection
1049
- * must not be shown as a fabricated `0`. A real `0` is preserved.
1050
- */
1051
- itemCount?: number;
1052
- image: string;
1053
- trending: boolean;
1054
- }
1055
- interface ProductCategory2Props {
1056
- title?: string;
1057
- description?: string;
1058
- categories: ProductCategory2Category[];
1059
- cta?: CTA;
1060
- onBrowse?: (category: ProductCategory2Category) => void;
1061
- }
1062
- declare function ProductCategory2({ title, description, categories, cta, onBrowse, }: ProductCategory2Props): react.JSX.Element;
1063
-
1064
- interface ProductCategory4Category {
1065
- id: string;
1066
- title: string;
1067
- description: string;
1068
- icon: LucideIcon;
1069
- customers: string;
1070
- products: number;
1071
- avatarImages?: string[];
1072
- }
1073
- interface ProductCategory4Props {
1074
- title?: string;
1075
- description?: string;
1076
- categories: ProductCategory4Category[];
1077
- productsLabel?: string;
1078
- customersLabel?: string;
1079
- onCategoryClick?: (category: ProductCategory4Category) => void;
1080
- }
1081
- declare function ProductCategory4({ title, description, categories, productsLabel, customersLabel, onCategoryClick, }: ProductCategory4Props): react.JSX.Element;
1082
-
1083
- type CategoryIcon$1 = 'electronics' | 'fashion' | 'home' | 'sports' | 'books' | 'beauty' | 'automotive' | 'food' | 'gaming' | 'baby' | 'gifts' | 'tools';
1084
- interface ProductCategory5Category {
1085
- id: string;
1086
- name: string;
1087
- icon: CategoryIcon$1;
1088
- description: string;
1089
- itemCount: number;
1090
- subcategories: string[];
1091
- featured?: boolean;
1092
- }
1093
- interface ProductCategory5Props {
1094
- title?: string;
1095
- description?: string;
1096
- categories: ProductCategory5Category[];
1097
- searchPlaceholder?: string;
1098
- productsLabel?: string;
1099
- featuredLabel?: string;
1100
- browseLabel?: string;
1101
- viewAllLabel?: string;
1102
- notFoundLabel?: string;
1103
- onBrowse?: (category: ProductCategory5Category) => void;
1104
- onViewAll?: () => void;
1105
- }
1106
- declare function ProductCategory5({ title, description, categories, searchPlaceholder, productsLabel, featuredLabel, browseLabel, viewAllLabel, notFoundLabel, onBrowse, onViewAll, }: ProductCategory5Props): react.JSX.Element;
1107
-
1108
- /**
1109
- * Canonical navigation types: recursive menu item and collection item.
1110
- *
1111
- * Ported from the legacy `@thorprovider/components` navigation library
1112
- * (source: branch `feat/storefronts`) into the blocks catalog so any
1113
- * consumer can feed a multi-level category tree to the navigation blocks.
1114
- */
1115
- declare const menuItemSchema: z.ZodType<{
1116
- id: string;
1117
- label: string;
1118
- icon?: string;
1119
- image?: string;
1120
- href?: string;
1121
- badge?: string;
1122
- featured?: boolean;
1123
- children?: MenuItem[];
1124
- }>;
1125
- type MenuItem = z.infer<typeof menuItemSchema>;
1126
- declare const collectionItemSchema: z.ZodObject<{
1127
- id: z.ZodString;
1128
- label: z.ZodString;
1129
- description: z.ZodOptional<z.ZodString>;
1130
- image: z.ZodOptional<z.ZodString>;
1131
- href: z.ZodOptional<z.ZodString>;
1132
- }, "strip", z.ZodTypeAny, {
1133
- id: string;
1134
- label: string;
1135
- image?: string | undefined;
1136
- description?: string | undefined;
1137
- href?: string | undefined;
1138
- }, {
1139
- id: string;
1140
- label: string;
1141
- image?: string | undefined;
1142
- description?: string | undefined;
1143
- href?: string | undefined;
1144
- }>;
1145
- type CollectionItem = z.infer<typeof collectionItemSchema>;
1146
-
1147
- /**
1148
- * Three-level category flyout: L1 categories, L2 subcategories, L3 sub-sub
1149
- * categories, plus a right panel with a featured image and collection links.
1150
- *
1151
- * Framework-agnostic and prop-driven: plain anchors replace router links,
1152
- * `loading="lazy"` images replace next/image, and Spanish copy/hrefs are
1153
- * optional props with ES defaults. `onNavigate` lets the tenant close the
1154
- * flyout on navigation; `collectionsHref` controls the "view all" link
1155
- * (pass `''` to hide it).
1156
- *
1157
- * Ported from the legacy `@thorprovider/components` navigation library
1158
- * (source: branch `feat/storefronts`).
1159
- */
1160
- declare const megaMenuPropsSchema: z.ZodObject<{
1161
- categories: z.ZodArray<z.ZodType<{
1162
- id: string;
1163
- label: string;
1164
- icon?: string;
1165
- image?: string;
1166
- href?: string;
1167
- badge?: string;
1168
- featured?: boolean;
1169
- children?: MenuItem[];
1170
- }, z.ZodTypeDef, {
1171
- id: string;
1172
- label: string;
1173
- icon?: string;
1174
- image?: string;
1175
- href?: string;
1176
- badge?: string;
1177
- featured?: boolean;
1178
- children?: MenuItem[];
1179
- }>, "many">;
1180
- collections: z.ZodArray<z.ZodObject<{
1181
- id: z.ZodString;
1182
- label: z.ZodString;
1183
- description: z.ZodOptional<z.ZodString>;
1184
- image: z.ZodOptional<z.ZodString>;
1185
- href: z.ZodOptional<z.ZodString>;
1186
- }, "strip", z.ZodTypeAny, {
1187
- id: string;
1188
- label: string;
1189
- image?: string | undefined;
1190
- description?: string | undefined;
1191
- href?: string | undefined;
1192
- }, {
1193
- id: string;
1194
- label: string;
1195
- image?: string | undefined;
1196
- description?: string | undefined;
1197
- href?: string | undefined;
1198
- }>, "many">;
1199
- onNavigate: z.ZodOptional<z.ZodType<() => void, z.ZodTypeDef, () => void>>;
1200
- categoryColumnTitle: z.ZodOptional<z.ZodString>;
1201
- collectionsTitle: z.ZodOptional<z.ZodString>;
1202
- viewAllLabel: z.ZodOptional<z.ZodString>;
1203
- collectionsHref: z.ZodOptional<z.ZodString>;
1204
- ariaLabel: z.ZodOptional<z.ZodString>;
1205
- }, "strip", z.ZodTypeAny, {
1206
- categories: {
1207
- id: string;
1208
- label: string;
1209
- icon?: string;
1210
- image?: string;
1211
- href?: string;
1212
- badge?: string;
1213
- featured?: boolean;
1214
- children?: MenuItem[];
1215
- }[];
1216
- collections: {
1217
- id: string;
1218
- label: string;
1219
- image?: string | undefined;
1220
- description?: string | undefined;
1221
- href?: string | undefined;
1222
- }[];
1223
- onNavigate?: (() => void) | undefined;
1224
- categoryColumnTitle?: string | undefined;
1225
- collectionsTitle?: string | undefined;
1226
- viewAllLabel?: string | undefined;
1227
- collectionsHref?: string | undefined;
1228
- ariaLabel?: string | undefined;
1229
- }, {
1230
- categories: {
1231
- id: string;
1232
- label: string;
1233
- icon?: string;
1234
- image?: string;
1235
- href?: string;
1236
- badge?: string;
1237
- featured?: boolean;
1238
- children?: MenuItem[];
1239
- }[];
1240
- collections: {
1241
- id: string;
1242
- label: string;
1243
- image?: string | undefined;
1244
- description?: string | undefined;
1245
- href?: string | undefined;
1246
- }[];
1247
- onNavigate?: (() => void) | undefined;
1248
- categoryColumnTitle?: string | undefined;
1249
- collectionsTitle?: string | undefined;
1250
- viewAllLabel?: string | undefined;
1251
- collectionsHref?: string | undefined;
1252
- ariaLabel?: string | undefined;
1253
- }>;
1254
- type MegaMenuProps = z.infer<typeof megaMenuPropsSchema>;
1255
- declare function MegaMenu({ categories, collections, onNavigate, categoryColumnTitle, collectionsTitle, viewAllLabel, collectionsHref, ariaLabel, }: MegaMenuProps): react.JSX.Element;
1256
-
1257
- /**
1258
- * Slide-in drill-down category drawer: a stack-based menu where selecting a
1259
- * category with children pushes a new level, and a back control pops it.
1260
- *
1261
- * Framework-agnostic: plain anchors (no router), `<img>` (no image
1262
- * optimization), copy + hrefs as optional props with ES defaults. The drawer
1263
- * stays MOUNTED while closed and slides in/out with a 200ms transform
1264
- * (reproducing the original behavior); the backdrop renders only while open.
1265
- * Locks body scroll while open. No focus trap (out of scope).
1266
- *
1267
- * Ported from the legacy `@thorprovider/components` navigation library
1268
- * (source: branch `feat/storefronts`).
1269
- */
1270
- declare const mobileCategoryDrawerPropsSchema: z.ZodObject<{
1271
- categories: z.ZodArray<z.ZodType<{
1272
- id: string;
1273
- label: string;
1274
- icon?: string;
1275
- image?: string;
1276
- href?: string;
1277
- badge?: string;
1278
- featured?: boolean;
1279
- children?: MenuItem[];
1280
- }, z.ZodTypeDef, {
1281
- id: string;
1282
- label: string;
1283
- icon?: string;
1284
- image?: string;
1285
- href?: string;
1286
- badge?: string;
1287
- featured?: boolean;
1288
- children?: MenuItem[];
1289
- }>, "many">;
1290
- collections: z.ZodArray<z.ZodObject<{
1291
- id: z.ZodString;
1292
- label: z.ZodString;
1293
- description: z.ZodOptional<z.ZodString>;
1294
- image: z.ZodOptional<z.ZodString>;
1295
- href: z.ZodOptional<z.ZodString>;
1296
- }, "strip", z.ZodTypeAny, {
1297
- id: string;
1298
- label: string;
1299
- image?: string | undefined;
1300
- description?: string | undefined;
1301
- href?: string | undefined;
1302
- }, {
1303
- id: string;
1304
- label: string;
1305
- image?: string | undefined;
1306
- description?: string | undefined;
1307
- href?: string | undefined;
1308
- }>, "many">;
1309
- open: z.ZodBoolean;
1310
- onClose: z.ZodFunction<z.ZodTuple<[], z.ZodUnknown>, z.ZodVoid>;
1311
- rootTitle: z.ZodOptional<z.ZodString>;
1312
- collectionsTitle: z.ZodOptional<z.ZodString>;
1313
- viewAllLabel: z.ZodOptional<z.ZodString>;
1314
- viewAllHref: z.ZodOptional<z.ZodString>;
1315
- closeAriaLabel: z.ZodOptional<z.ZodString>;
1316
- backAriaLabel: z.ZodOptional<z.ZodString>;
1317
- menuAriaLabel: z.ZodOptional<z.ZodString>;
1318
- }, "strip", z.ZodTypeAny, {
1319
- open: boolean;
1320
- categories: {
1321
- id: string;
1322
- label: string;
1323
- icon?: string;
1324
- image?: string;
1325
- href?: string;
1326
- badge?: string;
1327
- featured?: boolean;
1328
- children?: MenuItem[];
1329
- }[];
1330
- collections: {
1331
- id: string;
1332
- label: string;
1333
- image?: string | undefined;
1334
- description?: string | undefined;
1335
- href?: string | undefined;
1336
- }[];
1337
- onClose: (...args: unknown[]) => void;
1338
- collectionsTitle?: string | undefined;
1339
- viewAllLabel?: string | undefined;
1340
- rootTitle?: string | undefined;
1341
- viewAllHref?: string | undefined;
1342
- closeAriaLabel?: string | undefined;
1343
- backAriaLabel?: string | undefined;
1344
- menuAriaLabel?: string | undefined;
1345
- }, {
1346
- open: boolean;
1347
- categories: {
1348
- id: string;
1349
- label: string;
1350
- icon?: string;
1351
- image?: string;
1352
- href?: string;
1353
- badge?: string;
1354
- featured?: boolean;
1355
- children?: MenuItem[];
1356
- }[];
1357
- collections: {
1358
- id: string;
1359
- label: string;
1360
- image?: string | undefined;
1361
- description?: string | undefined;
1362
- href?: string | undefined;
1363
- }[];
1364
- onClose: (...args: unknown[]) => void;
1365
- collectionsTitle?: string | undefined;
1366
- viewAllLabel?: string | undefined;
1367
- rootTitle?: string | undefined;
1368
- viewAllHref?: string | undefined;
1369
- closeAriaLabel?: string | undefined;
1370
- backAriaLabel?: string | undefined;
1371
- menuAriaLabel?: string | undefined;
1372
- }>;
1373
- type MobileCategoryDrawerProps = z.infer<typeof mobileCategoryDrawerPropsSchema>;
1374
- declare function MobileCategoryDrawer({ categories, collections, open, onClose, rootTitle, collectionsTitle, viewAllLabel, viewAllHref, closeAriaLabel, backAriaLabel, menuAriaLabel, }: MobileCategoryDrawerProps): react.JSX.Element;
1375
-
1376
- /**
1377
- * The explicit vocabulary of known category icon names. Kept as a Zod enum so
1378
- * the union type derives from the schema and never drifts.
1379
- */
1380
- declare const categoryIconNameSchema: z.ZodEnum<["wrench", "bolt", "tree", "refrigerator", "wind", "droplet", "zap", "hard-hat", "car", "utensils", "boxes", "sofa", "shield", "sun", "chef-hat", "tractor", "store", "home"]>;
1381
- type CategoryIconName = z.infer<typeof categoryIconNameSchema>;
1382
- declare const categoryIconPropsSchema: z.ZodObject<{
1383
- name: z.ZodOptional<z.ZodEnum<["wrench", "bolt", "tree", "refrigerator", "wind", "droplet", "zap", "hard-hat", "car", "utensils", "boxes", "sofa", "shield", "sun", "chef-hat", "tractor", "store", "home"]>>;
1384
- className: z.ZodOptional<z.ZodString>;
1385
- }, "strip", z.ZodTypeAny, {
1386
- name?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1387
- className?: string | undefined;
1388
- }, {
1389
- name?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1390
- className?: string | undefined;
1391
- }>;
1392
- type CategoryIconProps = z.infer<typeof categoryIconPropsSchema>;
1393
- /**
1394
- * Category icon by name: maps a string icon-name to a Lucide icon.
1395
- *
1396
- * Framework-agnostic and prop-driven. Unknown or absent names render null
1397
- * (graceful fallback); the schema validates names at the boundary, so a
1398
- * non-vocabulary value fails `parse` but the component still renders null
1399
- * instead of throwing.
1400
- */
1401
- declare function CategoryIcon({ name, className }: CategoryIconProps): react.JSX.Element | null;
1402
-
1403
- declare const breadcrumbItemSchema: z.ZodObject<{
1404
- label: z.ZodString;
1405
- href: z.ZodOptional<z.ZodString>;
1406
- }, "strip", z.ZodTypeAny, {
1407
- label: string;
1408
- href?: string | undefined;
1409
- }, {
1410
- label: string;
1411
- href?: string | undefined;
1412
- }>;
1413
- type BreadcrumbItemData = z.infer<typeof breadcrumbItemSchema>;
1414
- declare const breadcrumbPropsSchema: z.ZodObject<{
1415
- items: z.ZodArray<z.ZodObject<{
1416
- label: z.ZodString;
1417
- href: z.ZodOptional<z.ZodString>;
1418
- }, "strip", z.ZodTypeAny, {
1419
- label: string;
1420
- href?: string | undefined;
1421
- }, {
1422
- label: string;
1423
- href?: string | undefined;
1424
- }>, "many">;
1425
- maxItems: z.ZodOptional<z.ZodNumber>;
1426
- ariaLabel: z.ZodOptional<z.ZodString>;
1427
- backLabel: z.ZodOptional<z.ZodString>;
1428
- className: z.ZodOptional<z.ZodString>;
1429
- }, "strip", z.ZodTypeAny, {
1430
- items: {
1431
- label: string;
1432
- href?: string | undefined;
1433
- }[];
1434
- className?: string | undefined;
1435
- maxItems?: number | undefined;
1436
- ariaLabel?: string | undefined;
1437
- backLabel?: string | undefined;
1438
- }, {
1439
- items: {
1440
- label: string;
1441
- href?: string | undefined;
1442
- }[];
1443
- className?: string | undefined;
1444
- maxItems?: number | undefined;
1445
- ariaLabel?: string | undefined;
1446
- backLabel?: string | undefined;
1447
- }>;
1448
- type BreadcrumbProps = z.infer<typeof breadcrumbPropsSchema>;
1449
- /**
1450
- * Breadcrumb trail for a real navigation path (Home → … → current).
1451
- *
1452
- * Framework-agnostic and prop-driven: plain anchors (no router) and the shared
1453
- * shadcn breadcrumb primitives. The last item is the current page and is never
1454
- * a link (`aria-current="page"`); earlier items link only when an `href` is
1455
- * given. Long labels truncate, and trails longer than `maxItems` collapse the
1456
- * intermediate levels behind an ellipsis. On mobile the full list is replaced
1457
- * by a single back link to the parent, so a wide trail never overflows.
1458
- *
1459
- * Renders nothing when there are no labelled items.
1460
- */
1461
- declare function Breadcrumb({ items, maxItems, ariaLabel, backLabel, className, }: BreadcrumbProps): react.JSX.Element | null;
1462
-
1463
- declare const skipToContentPropsSchema: z.ZodObject<{
1464
- targetId: z.ZodString;
1465
- label: z.ZodOptional<z.ZodString>;
1466
- className: z.ZodOptional<z.ZodString>;
1467
- }, "strip", z.ZodTypeAny, {
1468
- targetId: string;
1469
- label?: string | undefined;
1470
- className?: string | undefined;
1471
- }, {
1472
- targetId: string;
1473
- label?: string | undefined;
1474
- className?: string | undefined;
1475
- }>;
1476
- type SkipToContentProps = z.infer<typeof skipToContentPropsSchema>;
1477
- /**
1478
- * Skip-to-content link (WCAG 2.4.1 Bypass Blocks).
1479
- *
1480
- * Framework-agnostic and prop-driven: a plain anchor to the main content id,
1481
- * visually hidden until it receives focus, then pinned at the top-left with
1482
- * visible contrast. The target element is responsible for carrying the id (and
1483
- * being focusable); this block only renders the bypass affordance.
1484
- */
1485
- declare function SkipToContent({ targetId, label, className, }: SkipToContentProps): react.JSX.Element;
1486
-
1487
- declare const backToTopPropsSchema: z.ZodObject<{
1488
- threshold: z.ZodOptional<z.ZodNumber>;
1489
- label: z.ZodOptional<z.ZodString>;
1490
- className: z.ZodOptional<z.ZodString>;
1491
- }, "strip", z.ZodTypeAny, {
1492
- threshold?: number | undefined;
1493
- label?: string | undefined;
1494
- className?: string | undefined;
1495
- }, {
1496
- threshold?: number | undefined;
1497
- label?: string | undefined;
1498
- className?: string | undefined;
1499
- }>;
1500
- type BackToTopProps = z.infer<typeof backToTopPropsSchema>;
1501
- /**
1502
- * Resolve the scroll behavior for a back-to-top activation. Pure so it can be
1503
- * unit-tested without a DOM: reduced motion yields an instant jump.
1504
- */
1505
- declare function resolveScrollBehavior(prefersReducedMotion: boolean): 'auto' | 'smooth';
1506
- /**
1507
- * Back-to-top control that appears once the page is scrolled past `threshold`
1508
- * and returns the viewport to the top. Honors `prefers-reduced-motion` (instant
1509
- * jump instead of a smooth scroll). Framework-agnostic; icon-only with an
1510
- * accessible label.
1511
- */
1512
- declare function BackToTop({ threshold, label, className, }: BackToTopProps): react.JSX.Element | null;
1513
-
1514
- declare const mobileBottomNavItemSchema: z.ZodObject<{
1515
- id: z.ZodOptional<z.ZodString>;
1516
- label: z.ZodString;
1517
- href: z.ZodString;
1518
- icon: z.ZodOptional<z.ZodEnum<["wrench", "bolt", "tree", "refrigerator", "wind", "droplet", "zap", "hard-hat", "car", "utensils", "boxes", "sofa", "shield", "sun", "chef-hat", "tractor", "store", "home"]>>;
1519
- }, "strip", z.ZodTypeAny, {
1520
- label: string;
1521
- href: string;
1522
- id?: string | undefined;
1523
- icon?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1524
- }, {
1525
- label: string;
1526
- href: string;
1527
- id?: string | undefined;
1528
- icon?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1529
- }>;
1530
- type MobileBottomNavItem = z.infer<typeof mobileBottomNavItemSchema>;
1531
- declare const mobileBottomNavPropsSchema: z.ZodObject<{
1532
- items: z.ZodArray<z.ZodObject<{
1533
- id: z.ZodOptional<z.ZodString>;
1534
- label: z.ZodString;
1535
- href: z.ZodString;
1536
- icon: z.ZodOptional<z.ZodEnum<["wrench", "bolt", "tree", "refrigerator", "wind", "droplet", "zap", "hard-hat", "car", "utensils", "boxes", "sofa", "shield", "sun", "chef-hat", "tractor", "store", "home"]>>;
1537
- }, "strip", z.ZodTypeAny, {
1538
- label: string;
1539
- href: string;
1540
- id?: string | undefined;
1541
- icon?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1542
- }, {
1543
- label: string;
1544
- href: string;
1545
- id?: string | undefined;
1546
- icon?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1547
- }>, "many">;
1548
- currentHref: z.ZodOptional<z.ZodString>;
1549
- ariaLabel: z.ZodOptional<z.ZodString>;
1550
- className: z.ZodOptional<z.ZodString>;
1551
- }, "strip", z.ZodTypeAny, {
1552
- items: {
1553
- label: string;
1554
- href: string;
1555
- id?: string | undefined;
1556
- icon?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1557
- }[];
1558
- className?: string | undefined;
1559
- ariaLabel?: string | undefined;
1560
- currentHref?: string | undefined;
1561
- }, {
1562
- items: {
1563
- label: string;
1564
- href: string;
1565
- id?: string | undefined;
1566
- icon?: "tree" | "home" | "wrench" | "bolt" | "refrigerator" | "wind" | "droplet" | "zap" | "hard-hat" | "car" | "utensils" | "boxes" | "sofa" | "shield" | "sun" | "chef-hat" | "tractor" | "store" | undefined;
1567
- }[];
1568
- className?: string | undefined;
1569
- ariaLabel?: string | undefined;
1570
- currentHref?: string | undefined;
1571
- }>;
1572
- type MobileBottomNavProps = z.infer<typeof mobileBottomNavPropsSchema>;
1573
- /**
1574
- * Mobile-only bottom navigation offering the primary destinations.
1575
- *
1576
- * Framework-agnostic and prop-driven: plain anchors (no router). Hidden at
1577
- * `md` and up; offsets the iOS home indicator via `env(safe-area-inset-bottom)`;
1578
- * each destination meets the 44px minimum touch target. The current
1579
- * destination is marked with `aria-current="page"` and a non-colour cue (weight
1580
- * + indicator bar), never colour alone.
1581
- */
1582
- declare function MobileBottomNav({ items, currentHref, ariaLabel, className, }: MobileBottomNavProps): react.JSX.Element | null;
1583
-
1584
- interface CategoryFilter1Category {
1585
- id: string;
1586
- name: string;
1587
- count: number;
1588
- }
1589
- interface CategoryFilter1PriceRange {
1590
- id: string;
1591
- label: string;
1592
- min: number;
1593
- max: number | null;
1594
- }
1595
- interface CategoryFilter1SortOption {
1596
- id: string;
1597
- label: string;
1598
- }
1599
- interface CategoryFilter1Filters {
1600
- category: string;
1601
- priceRange: string;
1602
- sort: string;
1603
- search: string;
1604
- }
1605
- interface CategoryFilter1Props {
1606
- title?: string;
1607
- description?: string;
1608
- categories: CategoryFilter1Category[];
1609
- priceRanges: CategoryFilter1PriceRange[];
1610
- sortOptions: CategoryFilter1SortOption[];
1611
- onFilterChange?: (filters: CategoryFilter1Filters) => void;
1612
- }
1613
- declare function CategoryFilter1({ title, description, categories, priceRanges, sortOptions, onFilterChange, }: CategoryFilter1Props): react.JSX.Element;
1614
-
1615
- interface FilterProduct {
1616
- id: string;
1617
- name: string;
1618
- price: string;
1619
- /** Optional: an absent image is omitted so the block never renders `src=""`. */
1620
- image?: string;
1621
- /**
1622
- * Optional product-detail link. When present the card renders as a real
1623
- * `<a href>` (keyboard focus, middle-click, crawlers); when absent the block
1624
- * falls back to the `onProductClick` path. The href is produced by the
1625
- * presentation layer — the block never builds a route.
1626
- */
1627
- href?: string;
1628
- }
1629
- interface CategoryFilter2Category {
1630
- id: string;
1631
- label: string;
1632
- }
1633
- interface CategoryFilter2Collection {
1634
- id: string;
1635
- label: string;
1636
- }
1637
- interface CategoryFilter2Color {
1638
- id: string;
1639
- color: string;
1640
- }
1641
- interface CategoryFilter2PriceRange {
1642
- min: number;
1643
- max: number;
1644
- step: number;
1645
- }
1646
- interface CategoryFilter2SortOption {
1647
- value: string;
1648
- label: string;
1649
- }
1650
- interface CategoryFilter2Filters {
1651
- categories: string[];
1652
- /** Collections requested by the `category-filters` feature (E2). */
1653
- collections?: string[];
1654
- priceRange: number[];
1655
- size: string | null;
1656
- color: string | null;
1657
- }
1658
- /**
1659
- * A typed catalog-query error the listing renders for repair. It is a structural
1660
- * mirror of the runtime boundary error (`CatalogQueryError`/`CatalogQueryFailure`):
1661
- * `fields` names the exact raw parameters to remove and `feature` is present only
1662
- * for `unmounted-capability`. The block never builds a host URL — it emits the
1663
- * fields through `onRepair` (E2 task 4.5).
1664
- */
1665
- interface CategoryFilter2QueryError {
1666
- code: 'invalid-query' | 'unsupported-query' | 'unmounted-capability';
1667
- /** Exact raw URL parameter names that must be removed to repair the query. */
1668
- fields: string[];
1669
- message?: string;
1670
- feature?: 'catalog-search' | 'category-filters';
1671
- }
1672
- /**
1673
- * The observable listing status. The host derives it from the URL boundary and
1674
- * the provider outcome (`mapCatalogOutcomeToStatus`) and passes it down; the
1675
- * block only renders it. `loading` is in flight; `ready` shows products; `empty`
1676
- * is a valid zero-result query; `invalid-query`/`unsupported-query`/
1677
- * `unmounted-capability` are typed repair states; `error` is a query/network
1678
- * failure with retry. Distinct states stay distinct — a valid empty result is
1679
- * never shown as an error and a raw failure is never swallowed as empty.
1680
- */
1681
- type CategoryFilter2Status = {
1682
- state: 'loading';
1683
- } | {
1684
- state: 'ready';
1685
- } | {
1686
- state: 'empty';
1687
- } | {
1688
- state: 'invalid-query';
1689
- error: CategoryFilter2QueryError;
1690
- } | {
1691
- state: 'unsupported-query';
1692
- error: CategoryFilter2QueryError;
1693
- } | {
1694
- state: 'unmounted-capability';
1695
- error: CategoryFilter2QueryError;
1696
- } | {
1697
- state: 'error';
1698
- message?: string;
1699
- };
1700
- /** The kind of canonical filter an active chip represents. */
1701
- type CategoryFilter2ActiveFilterKind = 'text' | 'category' | 'collection' | 'price' | 'attribute';
1702
- /**
1703
- * A removable active-filter chip. Built only from the actual canonical query
1704
- * (never from claimed provider filtering): `params` are the raw URL parameter
1705
- * names carrying the filter and `value` is the specific list value to drop.
1706
- */
1707
- interface CategoryFilter2ActiveFilter {
1708
- /** Stable identity for React keys and removal callbacks. */
1709
- id: string;
1710
- kind: CategoryFilter2ActiveFilterKind;
1711
- /** Human-readable label shown on the chip. */
1712
- label: string;
1713
- /** Raw URL parameter names that carry this filter. */
1714
- params: string[];
1715
- /** The specific list value this chip removes; absent for scalar filters. */
1716
- value?: string;
1717
- }
1718
- interface CategoryFilter2Props {
1719
- products: FilterProduct[];
1720
- categories?: CategoryFilter2Category[];
1721
- collections?: CategoryFilter2Collection[];
1722
- sizes?: string[];
1723
- colors?: CategoryFilter2Color[];
1724
- /**
1725
- * Real backend-provided price range only. When absent the price control is
1726
- * omitted; the block never falls back to a fabricated `0..1000` default
1727
- * (E2 design Decision 8 / spec "Price controls require real price metadata").
1728
- */
1729
- priceRange?: CategoryFilter2PriceRange;
1730
- viewOptions?: (number | string)[];
1731
- /** Adapter-advertised sort options only. When absent/empty no sort control is rendered. */
1732
- sortOptions?: CategoryFilter2SortOption[];
1733
- pagination?: (number | string)[];
1734
- searchValue?: string;
1735
- selectedCategories?: string[];
1736
- selectedCollections?: string[];
1737
- selectedPriceRange?: number[];
1738
- selectedSort?: string;
1739
- selectedPage?: number | string;
1740
- selectedPageSize?: number | string;
1741
- showSearch?: boolean;
1742
- showFilters?: boolean;
1743
- showPrice?: boolean;
1744
- showSort?: boolean;
1745
- filtersTitle?: string;
1746
- selectedText?: string;
1747
- clearAllLabel?: string;
1748
- priceRangeTitle?: string;
1749
- minLabel?: string;
1750
- maxLabel?: string;
1751
- categoriesTitle?: string;
1752
- collectionsTitle?: string;
1753
- sizesTitle?: string;
1754
- colorsTitle?: string;
1755
- viewLabel?: string;
1756
- viewPlaceholder?: string;
1757
- sortPlaceholder?: string;
1758
- productsTitle?: string;
1759
- currentLabel?: string;
1760
- searchLabel?: string;
1761
- searchPlaceholder?: string;
1762
- onProductClick?: (product: FilterProduct) => void;
1763
- onPageChange?: (page: number | string) => void;
1764
- onViewChange?: (view: number | string) => void;
1765
- onPageSizeChange?: (pageSize: number | string) => void;
1766
- onSortChange?: (sort: string) => void;
1767
- onFilterChange?: (filters: CategoryFilter2Filters) => void;
1768
- onSearchChange?: (text: string) => void;
1769
- /** Observable listing status. Defaults to `ready` so legacy consumers are unchanged. */
1770
- status?: CategoryFilter2Status;
1771
- /** Removable active-filter chips built from the canonical query. */
1772
- activeFilters?: CategoryFilter2ActiveFilter[];
1773
- loadingLabel?: string;
1774
- emptyTitle?: string;
1775
- emptyDescription?: string;
1776
- clearFiltersLabel?: string;
1777
- invalidQueryTitle?: string;
1778
- unsupportedQueryTitle?: string;
1779
- unmountedCapabilityTitle?: string;
1780
- errorTitle?: string;
1781
- errorDescription?: string;
1782
- repairLabel?: string;
1783
- retryLabel?: string;
1784
- activeFiltersTitle?: string;
1785
- removeFilterLabel?: string;
1786
- /** Empty-state clear: drops the active filters but never base scope/sort/pageSize. */
1787
- onClearFilters?: () => void;
1788
- /** Invalid/unsupported/unmounted repair: receives the exact bad fields to remove. */
1789
- onRepair?: (remove: string[]) => void;
1790
- /** Query/network failure retry: preserves the current query/input. */
1791
- onRetry?: () => void;
1792
- /** Removes a single active-filter chip. */
1793
- onRemoveFilter?: (filter: CategoryFilter2ActiveFilter) => void;
1794
- }
1795
- interface CategoryFilter2StatusViewProps {
1796
- status: CategoryFilter2Status;
1797
- activeFilters?: CategoryFilter2ActiveFilter[];
1798
- activeFiltersTitle?: string;
1799
- removeFilterLabel?: string;
1800
- loadingLabel?: string;
1801
- emptyTitle?: string;
1802
- emptyDescription?: string;
1803
- clearFiltersLabel?: string;
1804
- invalidQueryTitle?: string;
1805
- unsupportedQueryTitle?: string;
1806
- unmountedCapabilityTitle?: string;
1807
- errorTitle?: string;
1808
- errorDescription?: string;
1809
- repairLabel?: string;
1810
- retryLabel?: string;
1811
- onClearFilters?: () => void;
1812
- onRepair?: (remove: string[]) => void;
1813
- onRetry?: () => void;
1814
- onRemoveFilter?: (filter: CategoryFilter2ActiveFilter) => void;
1815
- }
1816
- /**
1817
- * Hooks-free presentation of the observable listing states and the removable
1818
- * active-filter chips (E2 task 4.5). Kept separate from `CategoryFilter2` so the
1819
- * interaction contract (clear / repair / retry / chip removal) is testable by
1820
- * invoking the rendered handlers without a DOM (this package's tests render with
1821
- * `react-dom/server`). It renders no products and performs no fetch — it only
1822
- * emits the host callbacks. When `ready` with no chips it renders nothing.
1823
- */
1824
- declare function CategoryFilter2StatusView({ status, activeFilters, activeFiltersTitle, removeFilterLabel, loadingLabel, emptyTitle, emptyDescription, clearFiltersLabel, invalidQueryTitle, unsupportedQueryTitle, unmountedCapabilityTitle, errorTitle, errorDescription, repairLabel, retryLabel, onClearFilters, onRepair, onRetry, onRemoveFilter, }: CategoryFilter2StatusViewProps): react.JSX.Element | null;
1825
- declare function CategoryFilter2({ products, categories, collections, sizes, colors, priceRange: priceRangeConfig, viewOptions, sortOptions, pagination, searchValue, selectedCategories, selectedCollections, selectedPriceRange, selectedSort, selectedPage, selectedPageSize, showSearch, showFilters, showPrice, showSort, filtersTitle, selectedText, clearAllLabel, priceRangeTitle, minLabel, maxLabel, categoriesTitle, collectionsTitle, sizesTitle, colorsTitle, viewLabel, viewPlaceholder, sortPlaceholder, productsTitle, currentLabel, searchLabel, searchPlaceholder, onProductClick, onPageChange, onViewChange, onPageSizeChange, onSortChange, onFilterChange, onSearchChange, status, activeFilters, loadingLabel, emptyTitle, emptyDescription, clearFiltersLabel, invalidQueryTitle, unsupportedQueryTitle, unmountedCapabilityTitle, errorTitle, errorDescription, repairLabel, retryLabel, activeFiltersTitle, removeFilterLabel, onClearFilters, onRepair, onRetry, onRemoveFilter, }: CategoryFilter2Props): react.JSX.Element;
1826
-
1827
- interface CategoryFilter4SortOption {
1828
- value: string;
1829
- label: string;
1830
- }
1831
- interface CategoryFilter4FacetOption {
1832
- value: string;
1833
- label: string;
1834
- }
1835
- interface CategoryFilter4RangeBand {
1836
- value: string;
1837
- label: string;
1838
- min: number;
1839
- max: number;
1840
- }
1841
- interface CategoryFilter4Facets {
1842
- sortOptions: CategoryFilter4SortOption[];
1843
- frameSizes: string[];
1844
- modelTypes: CategoryFilter4FacetOption[];
1845
- rangeBands: CategoryFilter4RangeBand[];
1846
- featureOptions: CategoryFilter4FacetOption[];
1847
- }
1848
- interface CategoryFilter4FilterState {
1849
- modelTypes: string[];
1850
- priceMax: number;
1851
- rangeBands: string[];
1852
- frameSizes: string[];
1853
- colourways: string[];
1854
- features: string[];
1855
- }
1856
- interface CategoryFilter4Product {
1857
- id: string;
1858
- name: string;
1859
- modelType: string;
1860
- price: number;
1861
- rangeKm: number;
1862
- frameSize: string;
1863
- colourway: string;
1864
- features: string[];
1865
- rating: number;
1866
- }
1867
- interface CategoryFilter4Props {
1868
- products: CategoryFilter4Product[];
1869
- facets: CategoryFilter4Facets;
1870
- colourNames: Record<string, string>;
1871
- fallbackImage: string;
1872
- maxPrice: number;
1873
- filtersLabel?: string;
1874
- sortLabel?: string;
1875
- sortByLabel?: string;
1876
- modelTypeLabel?: string;
1877
- rangeLabel?: string;
1878
- frameSizeLabel?: string;
1879
- colourLabel?: string;
1880
- featuresLabel?: string;
1881
- resultsCountLabel?: (count: number) => string;
1882
- clearAllLabel?: string;
1883
- showResultsLabel?: (count: number) => string;
1884
- noResultsLabel?: string;
1885
- noResultsTitle?: string;
1886
- noResultsDescription?: string;
1887
- noResultsCtaLabel?: string;
1888
- onFiltersChange?: (filters: CategoryFilter4FilterState) => void;
1889
- onSortChange?: (sort: string) => void;
1890
- onProductSelect?: (product: CategoryFilter4Product) => void;
1891
- }
1892
- declare function CategoryFilter4({ products, facets, colourNames, fallbackImage, maxPrice, filtersLabel, sortLabel, sortByLabel, modelTypeLabel, rangeLabel, frameSizeLabel, colourLabel, featuresLabel, resultsCountLabel, clearAllLabel, showResultsLabel, noResultsLabel, noResultsTitle, noResultsDescription, noResultsCtaLabel, onFiltersChange, onSortChange, onProductSelect, }: CategoryFilter4Props): react.JSX.Element;
1893
-
1894
- interface ShoppingCart1CartItem {
1895
- id: string;
1896
- name: string;
1897
- color: string;
1898
- size: string;
1899
- price: number;
1900
- originalPrice: number;
1901
- quantity: number;
1902
- image: string;
1903
- estimatedDelivery: string;
1904
- }
1905
- interface ShoppingCart1Shipping {
1906
- freeThreshold?: number;
1907
- cost?: number;
1908
- }
1909
- interface ShoppingCart1Props {
1910
- items: ShoppingCart1CartItem[];
1911
- shipping?: ShoppingCart1Shipping;
1912
- title?: string;
1913
- itemCountLabel?: (count: number) => string;
1914
- emptyTitle?: string;
1915
- emptyDescription?: string;
1916
- continueShoppingLabel?: string;
1917
- removeItemLabel?: (name: string) => string;
1918
- decreaseQuantityLabel?: (name: string) => string;
1919
- increaseQuantityLabel?: (name: string) => string;
1920
- estimatedDeliveryLabel?: string;
1921
- orderSummaryLabel?: string;
1922
- subtotalLabel?: string;
1923
- shippingLabel?: string;
1924
- freeShippingLabel?: string;
1925
- youSaveLabel?: string;
1926
- totalLabel?: string;
1927
- taxNoteLabel?: string;
1928
- checkoutLabel?: string;
1929
- securePaymentLabel?: string;
1930
- secureCheckoutLabel?: string;
1931
- secureCheckoutDescription?: string;
1932
- onUpdateQuantity?: (id: string, quantity: number) => void;
1933
- onRemoveItem?: (id: string) => void;
1934
- onCheckout?: () => void;
1935
- onContinueShopping?: () => void;
1936
- }
1937
- declare function ShoppingCart1({ items, shipping, title, itemCountLabel, emptyTitle, emptyDescription, continueShoppingLabel, removeItemLabel, decreaseQuantityLabel, increaseQuantityLabel, estimatedDeliveryLabel, orderSummaryLabel, subtotalLabel, shippingLabel, freeShippingLabel, youSaveLabel, totalLabel, taxNoteLabel, checkoutLabel, securePaymentLabel, secureCheckoutLabel, secureCheckoutDescription, onUpdateQuantity, onRemoveItem, onCheckout, onContinueShopping, }: ShoppingCart1Props): react.JSX.Element;
1938
-
1939
- interface ShoppingCart2Item {
1940
- id: string;
1941
- name: string;
1942
- brand?: string;
1943
- price: number;
1944
- originalPrice?: number;
1945
- quantity: number;
1946
- image: string;
1947
- color?: string;
1948
- size?: string;
1949
- }
1950
- interface ShoppingCart2Recommendation {
1951
- id: string;
1952
- name: string;
1953
- price: number;
1954
- image: string;
1955
- }
1956
- interface ShoppingCart2Props {
1957
- items: ShoppingCart2Item[];
1958
- recommendations?: ShoppingCart2Recommendation[];
1959
- taxRate?: number;
1960
- shippingCost?: number;
1961
- freeShippingThreshold?: number;
1962
- validatePromo?: (code: string) => number | null;
1963
- titleLabel?: string;
1964
- itemsCountLabel?: string;
1965
- cartItemsLabel?: string;
1966
- orderSummaryLabel?: string;
1967
- subtotalLabel?: string;
1968
- savingsLabel?: string;
1969
- shippingLabel?: string;
1970
- freeShippingLabel?: string;
1971
- taxLabel?: string;
1972
- totalLabel?: string;
1973
- promoPlaceholder?: string;
1974
- applyPromoLabel?: string;
1975
- promoAppliedLabel?: string;
1976
- continueShoppingLabel?: string;
1977
- emptyCartTitleLabel?: string;
1978
- emptyCartDescriptionLabel?: string;
1979
- checkoutLabel?: string;
1980
- freeShippingNoteLabel?: string;
1981
- freeShippingThresholdNoteLabel?: string;
1982
- secureCheckoutLabel?: string;
1983
- recommendationsLabel?: string;
1984
- onQuantityChange?: (id: string, quantity: number) => void;
1985
- onRemove?: (id: string) => void;
1986
- onAddToWishlist?: (item: ShoppingCart2Item) => void;
1987
- onCheckout?: () => void;
1988
- onContinueShopping?: () => void;
1989
- onRecommendationClick?: (product: ShoppingCart2Recommendation) => void;
1990
- }
1991
- declare function ShoppingCart2({ items, recommendations, taxRate, shippingCost, freeShippingThreshold, validatePromo, titleLabel, itemsCountLabel, cartItemsLabel, orderSummaryLabel, subtotalLabel, savingsLabel, shippingLabel, freeShippingLabel, taxLabel, totalLabel, promoPlaceholder, applyPromoLabel, promoAppliedLabel, continueShoppingLabel, emptyCartTitleLabel, emptyCartDescriptionLabel, checkoutLabel, freeShippingNoteLabel, freeShippingThresholdNoteLabel, secureCheckoutLabel, recommendationsLabel, onQuantityChange, onRemove, onAddToWishlist, onCheckout, onContinueShopping, onRecommendationClick, }: ShoppingCart2Props): react.JSX.Element;
1992
-
1993
- interface ShoppingCart4Item {
1994
- /** Backend cart line-item id — the stable identity for update/removal. */
1995
- id: string;
1996
- name: string;
1997
- price: number;
1998
- quantity: number;
1999
- /** Optional; an absent image is omitted rather than serialized as `""`. */
2000
- image?: string;
2001
- variant?: string;
2002
- /** Canonical backend per-unit price; preferred for display when present. */
2003
- unitPrice?: Money;
2004
- /** Canonical backend line total; preferred over `price * quantity`. */
2005
- lineTotal?: Money;
2006
- }
2007
- interface ShoppingCart4Totals {
2008
- subtotal: Money;
2009
- discount?: Money;
2010
- tax?: Money;
2011
- shipping?: Money;
2012
- total: Money;
2013
- }
2014
- type ShoppingCart4TotalsState = 'idle' | 'pending' | 'error';
2015
- interface ShoppingCart4Promotion {
2016
- threshold: number;
2017
- reward: string;
2018
- icon: LucideIcon;
2019
- }
2020
- interface ShoppingCart4RecentlyViewed {
2021
- id: string;
2022
- name: string;
2023
- price: number;
2024
- image?: string;
2025
- }
2026
- type ShoppingCart4Presentation = 'compact' | 'page';
2027
- interface ShoppingCart4Props {
2028
- items: ShoppingCart4Item[];
2029
- promotions: ShoppingCart4Promotion[];
2030
- recentlyViewed?: ShoppingCart4RecentlyViewed[];
2031
- /**
2032
- * Layout presentation. `compact` (default) is the collapsible quick-cart
2033
- * card; `page` is a wide, always-expanded review layout with a primary
2034
- * heading, no collapse control, and normal page scrolling. Both use the same
2035
- * line controls and authoritative monetary rendering.
2036
- */
2037
- presentation?: ShoppingCart4Presentation;
2038
- /**
2039
- * Backend-authoritative totals. The curated cart renders these verbatim; it
2040
- * never computes subtotal/tax/shipping/total locally.
2041
- */
2042
- totals?: ShoppingCart4Totals;
2043
- /** Controlled state of the totals fetch/mutation. */
2044
- totalsState?: ShoppingCart4TotalsState;
2045
- totalsErrorLabel?: string;
2046
- /** Shown when a required total amount is absent or malformed (never as zero). */
2047
- totalsUnavailableLabel?: string;
2048
- /** Shown for a line whose supplied line total is absent or malformed. */
2049
- amountUnavailableLabel?: string;
2050
- retryLabel?: string;
2051
- onRetryTotals?: () => void;
2052
- /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */
2053
- formatMoney?: (money: Money) => string;
2054
- /** @deprecated legacy numeric formatter, used only when `totals` is absent. */
2055
- formatPrice?: (value: number) => string;
2056
- /** @deprecated legacy local tax rate, used only when `totals` is absent. */
2057
- taxRate?: number;
2058
- titleLabel?: string;
2059
- subtotalLabel?: string;
2060
- discountLabel?: string;
2061
- taxLabel?: string;
2062
- shippingLabel?: string;
2063
- shippingFreeLabel?: string;
2064
- totalLabel?: string;
2065
- totalsPendingLabel?: string;
2066
- awayFromLabel?: string;
2067
- activatedLabel?: string;
2068
- itemsLabel?: string;
2069
- expressCheckoutLabel?: string;
2070
- expressLabel?: string;
2071
- standardLabel?: string;
2072
- estimatedDeliveryLabel?: string;
2073
- secureCheckoutLabel?: string;
2074
- recentlyViewedLabel?: string;
2075
- collapseLabel?: string;
2076
- expandLabel?: string;
2077
- checkoutLabel?: string;
2078
- quickCheckoutLabel?: string;
2079
- checkoutNowLabel?: string;
2080
- emptyLabel?: string;
2081
- removeLabel?: string;
2082
- decreaseLabel?: string;
2083
- increaseLabel?: string;
2084
- continueShoppingLabel?: string;
2085
- /** Suppress the checkout action (e.g. the checkout feature is not installed). */
2086
- checkoutUnavailable?: boolean;
2087
- /** Disable checkout while the cart is not ready (pending/error/invalid totals). */
2088
- checkoutDisabled?: boolean;
2089
- /**
2090
- * ABSOLUTE quantity for a backend cart line-item id (distinct from the
2091
- * Navbar's DELTA). The boundary mutates the cart by line-item id.
2092
- */
2093
- onQuantityChange?: (id: string, quantity: number) => void;
2094
- /** Remove the backend cart line-item id. */
2095
- onRemove?: (id: string) => void;
2096
- onCheckout?: () => void;
2097
- onQuickCheckout?: () => void;
2098
- onPayWithApple?: () => void;
2099
- onPayWithGoogle?: () => void;
2100
- onRecentlyViewedClick?: (id: string) => void;
2101
- /** Page presentation only: navigate back to browsing. */
2102
- onContinueShopping?: () => void;
2103
- }
2104
- declare function ShoppingCart4({ items, promotions, recentlyViewed, presentation, totals, totalsState, totalsErrorLabel, totalsUnavailableLabel, amountUnavailableLabel, retryLabel, onRetryTotals, formatMoney: formatMoneyProp, formatPrice, titleLabel, subtotalLabel, discountLabel, taxLabel, shippingLabel, shippingFreeLabel, totalLabel, totalsPendingLabel, awayFromLabel, activatedLabel, itemsLabel, expressCheckoutLabel, expressLabel, standardLabel, estimatedDeliveryLabel, secureCheckoutLabel, recentlyViewedLabel, collapseLabel, expandLabel, checkoutLabel, quickCheckoutLabel, checkoutNowLabel, emptyLabel, removeLabel, decreaseLabel, increaseLabel, continueShoppingLabel, checkoutUnavailable, checkoutDisabled, onQuantityChange, onRemove, onCheckout, onQuickCheckout, onPayWithApple, onPayWithGoogle, onRecentlyViewedClick, onContinueShopping, }: ShoppingCart4Props): react.JSX.Element;
2105
-
2106
- type ShoppingCart3Tag = 'Limited Edition' | 'Best Seller' | 'New Arrival';
2107
- interface ShoppingCart3CartItem {
2108
- id: string;
2109
- name: string;
2110
- color: string;
2111
- size: string;
2112
- price: number;
2113
- originalPrice: number;
2114
- quantity: number;
2115
- image: string;
2116
- selected: boolean;
2117
- tag: ShoppingCart3Tag;
2118
- estimatedDelivery: string;
2119
- }
2120
- interface ShoppingCart3Feature {
2121
- icon: LucideIcon;
2122
- title: string;
2123
- description: string;
2124
- }
2125
- interface ShoppingCart3Props {
2126
- items: ShoppingCart3CartItem[];
2127
- freeShippingThreshold?: number;
2128
- features?: ShoppingCart3Feature[];
2129
- title?: string;
2130
- itemCountLabel?: (count: number) => string;
2131
- selectAllLabel?: string;
2132
- saveForLaterLabel?: string;
2133
- removeItemLabel?: (name: string) => string;
2134
- decreaseQuantityLabel?: (name: string) => string;
2135
- increaseQuantityLabel?: (name: string) => string;
2136
- estimatedDeliveryLabel?: string;
2137
- orderSummaryLabel?: string;
2138
- subtotalLabel?: string;
2139
- shippingLabel?: string;
2140
- freeShippingLabel?: string;
2141
- youSaveLabel?: string;
2142
- totalLabel?: string;
2143
- taxNoteLabel?: string;
2144
- checkoutLabel?: string;
2145
- securePaymentLabel?: string;
2146
- freeShippingProgressLabel?: (remaining: number) => string;
2147
- freeShippingReachedLabel?: string;
2148
- tagLabels?: Partial<Record<ShoppingCart3Tag, string>>;
2149
- onUpdateQuantity?: (id: string, quantity: number) => void;
2150
- onRemoveItem?: (id: string) => void;
2151
- onCheckout?: () => void;
2152
- onSaveForLater?: (ids: string[]) => void;
2153
- onToggleSelect?: (id: string, selected: boolean) => void;
2154
- }
2155
- declare function ShoppingCart3({ items, freeShippingThreshold, features, title, itemCountLabel, selectAllLabel, saveForLaterLabel, removeItemLabel, decreaseQuantityLabel, increaseQuantityLabel, estimatedDeliveryLabel, orderSummaryLabel, subtotalLabel, shippingLabel, freeShippingLabel, youSaveLabel, totalLabel, taxNoteLabel, checkoutLabel, securePaymentLabel, freeShippingProgressLabel, freeShippingReachedLabel, tagLabels, onUpdateQuantity, onRemoveItem, onCheckout, onSaveForLater, onToggleSelect, }: ShoppingCart3Props): react.JSX.Element;
2156
-
2157
- interface StoreContainer1Props {
2158
- size?: 'default' | 'narrow' | 'wide' | 'full';
2159
- className?: string;
2160
- children?: ReactNode;
2161
- }
2162
- /**
2163
- * Trivial presentational layout container used as the root of spec-driven
2164
- * storefront pages. Constrains content width; children render as-is.
2165
- */
2166
- declare function StoreContainer1({ size, className, children, }: StoreContainer1Props): react.JSX.Element;
2167
-
2168
- interface CheckoutFieldError {
2169
- message?: string;
2170
- }
2171
- type CheckoutFieldErrors<T extends string> = Partial<Record<T, CheckoutFieldError[]>>;
2172
-
2173
- interface CheckoutForm1FormData {
2174
- email: string;
2175
- firstName: string;
2176
- lastName: string;
2177
- phone: string;
2178
- address: string;
2179
- city: string;
2180
- state: string;
2181
- zipCode: string;
2182
- country: string;
2183
- paymentMethod: string;
2184
- cardNumber: string;
2185
- expiryDate: string;
2186
- cvv: string;
2187
- cardName: string;
2188
- saveInfo: boolean;
2189
- sameAsBilling: boolean;
2190
- newsletter: boolean;
2191
- promoCode: string;
2192
- }
2193
- type CheckoutForm1FieldErrors = CheckoutFieldErrors<keyof CheckoutForm1FormData>;
2194
- type CheckoutForm1FieldDescriptions = Partial<Record<keyof CheckoutForm1FormData, string>>;
2195
- interface CheckoutForm1OrderSummaryItem {
2196
- id: string | number;
2197
- name: string;
2198
- variant?: string;
2199
- quantity: number;
2200
- /** Canonical backend line total; preferred over `price * quantity`. */
2201
- lineTotal?: Money;
2202
- /** @deprecated legacy numeric price, used only when `lineTotal` is absent. */
2203
- price?: number;
2204
- /** Optional; an absent image is omitted rather than serialized as `""`. */
2205
- image?: string;
2206
- }
2207
- interface CheckoutForm1Totals {
2208
- subtotal: Money;
2209
- discount?: Money;
2210
- tax?: Money;
2211
- shipping?: Money;
2212
- total: Money;
2213
- }
2214
- type CheckoutForm1TotalsState = 'idle' | 'pending' | 'error';
2215
- interface CheckoutForm1OrderSummary {
2216
- items: CheckoutForm1OrderSummaryItem[];
2217
- /** Backend-authoritative totals; rendered verbatim when present. */
2218
- totals?: CheckoutForm1Totals;
2219
- /** @deprecated legacy numeric amounts, used only when `totals` is absent. */
2220
- shipping?: number;
2221
- /** @deprecated */
2222
- tax?: number;
2223
- /** @deprecated */
2224
- discount?: number;
2225
- /** @deprecated */
2226
- promoDiscount?: number;
2227
- }
2228
- interface CheckoutForm1CountryOption {
2229
- value: string;
2230
- label: string;
2231
- }
2232
- interface CheckoutForm1ShippingOption {
2233
- /** Backend shipping method id — the controlled selection identity. */
2234
- id: string;
2235
- name: string;
2236
- price?: Money;
2237
- description?: string;
2238
- estimatedDays?: string;
2239
- }
2240
- type CheckoutForm1ChangeHandler = (field: keyof CheckoutForm1FormData, value: string | boolean) => void;
2241
- interface CheckoutForm1Props {
2242
- title?: string;
2243
- description?: string;
2244
- orderSummary?: CheckoutForm1OrderSummary;
2245
- /** Controlled state of the totals fetch/mutation. */
2246
- totalsState?: CheckoutForm1TotalsState;
2247
- totalsErrorLabel?: string;
2248
- retryLabel?: string;
2249
- onRetryTotals?: () => void;
2250
- countries?: CheckoutForm1CountryOption[];
2251
- /** Eligible shipping options for the cart's region/address. */
2252
- shippingOptions?: CheckoutForm1ShippingOption[];
2253
- /** Controlled selection of a shipping option id. */
2254
- selectedShippingOptionId?: string;
2255
- onSelectShippingOption?: (id: string) => void;
2256
- paymentMethods?: PaymentMethod[];
2257
- noPaymentMethodsLabel?: string;
2258
- /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */
2259
- formatMoney?: (money: Money) => string;
2260
- /**
2261
- * Raw card fields are legacy-only and never collected in the launch flow.
2262
- * Defaults to `false`: the curated surface renders no card inputs.
2263
- */
2264
- collectCardFields?: boolean;
2265
- onApplyPromo?: (code: string) => void;
2266
- promoPending?: boolean;
2267
- promoApplyLabel?: string;
2268
- promoPlaceholder?: string;
2269
- /** Optional trust copy; rendered only when supplied (never fabricated). */
2270
- trustNotes?: string[];
2271
- backLabel?: string;
2272
- completeOrderLabel?: string;
2273
- processingLabel?: string;
2274
- continueLabel?: string;
2275
- values: CheckoutForm1FormData;
2276
- onChange: CheckoutForm1ChangeHandler;
2277
- fieldErrors?: CheckoutForm1FieldErrors;
2278
- fieldDescriptions?: CheckoutForm1FieldDescriptions;
2279
- validateStep?: (step: number) => boolean;
2280
- onSubmit?: (data: CheckoutForm1FormData) => void;
2281
- /** Disables the submit button while the order is being placed. */
2282
- submitting?: boolean;
2283
- /** Order-level error surfaced above the footer actions. */
2284
- submitError?: string;
2285
- /** Optional recovery action for a failed submission. */
2286
- onRetrySubmit?: () => void;
2287
- submitErrorActionLabel?: string;
2288
- }
2289
- declare function CheckoutForm1({ title, description, orderSummary, totalsState, totalsErrorLabel, retryLabel, onRetryTotals, countries, shippingOptions, selectedShippingOptionId, onSelectShippingOption, paymentMethods, noPaymentMethodsLabel, formatMoney, collectCardFields, onApplyPromo, promoPending, promoApplyLabel, promoPlaceholder, trustNotes, backLabel, completeOrderLabel, processingLabel, continueLabel, values, onChange, fieldErrors, fieldDescriptions, validateStep, onSubmit, submitting, submitError, onRetrySubmit, submitErrorActionLabel, }: CheckoutForm1Props): react.JSX.Element;
2290
-
2291
- interface CheckoutForm2Item {
2292
- id: string;
2293
- name: string;
2294
- price: number;
2295
- quantity: number;
2296
- image: string;
2297
- }
2298
- interface CheckoutForm2CountryOption {
2299
- value: string;
2300
- label: string;
2301
- }
2302
- interface CheckoutForm2Data {
2303
- email: string;
2304
- firstName: string;
2305
- lastName: string;
2306
- address: string;
2307
- city: string;
2308
- zipCode: string;
2309
- country: string;
2310
- saveInfo: boolean;
2311
- newsletter: boolean;
2312
- cardNumber: string;
2313
- expiryDate: string;
2314
- cvv: string;
2315
- cardName: string;
2316
- }
2317
- type CheckoutForm2FieldErrors = CheckoutFieldErrors<keyof CheckoutForm2Data>;
2318
- type CheckoutForm2FieldDescriptions = Partial<Record<keyof CheckoutForm2Data, string>>;
2319
- interface CheckoutForm2Totals {
2320
- subtotal: number;
2321
- shipping: number;
2322
- tax: number;
2323
- total: number;
2324
- }
2325
- interface CheckoutForm2Props {
2326
- items: CheckoutForm2Item[];
2327
- countryOptions?: CheckoutForm2CountryOption[];
2328
- paymentMethods?: PaymentMethod[];
2329
- noMethodsLabel?: string;
2330
- taxRate?: number;
2331
- shippingCost?: number;
2332
- freeShippingThreshold?: number;
2333
- currencySymbol?: string;
2334
- titleLabel?: string;
2335
- descriptionLabel?: string;
2336
- backToCartLabel?: string;
2337
- completeOrderLabel?: string;
2338
- contactLabel?: string;
2339
- emailLabel?: string;
2340
- emailPlaceholder?: string;
2341
- newsletterLabel?: string;
2342
- shippingAddressLabel?: string;
2343
- firstNameLabel?: string;
2344
- lastNameLabel?: string;
2345
- addressLabel?: string;
2346
- cityLabel?: string;
2347
- zipCodeLabel?: string;
2348
- countryLabel?: string;
2349
- saveInfoLabel?: string;
2350
- paymentLabel?: string;
2351
- cardNumberLabel?: string;
2352
- expiryLabel?: string;
2353
- cvvLabel?: string;
2354
- cardNameLabel?: string;
2355
- encryptedNoteLabel?: string;
2356
- orderSummaryLabel?: string;
2357
- subtotalLabel?: string;
2358
- shippingLineLabel?: string;
2359
- freeShippingLineLabel?: string;
2360
- taxLabel?: string;
2361
- totalLabel?: string;
2362
- freeShippingNoteLabel?: string;
2363
- estimatedDeliveryLabel?: string;
2364
- values: CheckoutForm2Data;
2365
- onChange: (field: keyof CheckoutForm2Data, value: string | boolean) => void;
2366
- fieldErrors?: CheckoutForm2FieldErrors;
2367
- fieldDescriptions?: CheckoutForm2FieldDescriptions;
2368
- onBackToCart?: () => void;
2369
- onCompleteOrder?: (data: CheckoutForm2Data, totals: CheckoutForm2Totals) => void;
2370
- }
2371
- declare function CheckoutForm2({ items, countryOptions, paymentMethods, noMethodsLabel, taxRate, shippingCost, freeShippingThreshold, currencySymbol, titleLabel, descriptionLabel, backToCartLabel, completeOrderLabel, contactLabel, emailLabel, emailPlaceholder, newsletterLabel, shippingAddressLabel, firstNameLabel, lastNameLabel, addressLabel, cityLabel, zipCodeLabel, countryLabel, saveInfoLabel, paymentLabel, cardNumberLabel, expiryLabel, cvvLabel, cardNameLabel, encryptedNoteLabel, orderSummaryLabel, subtotalLabel, shippingLineLabel, freeShippingLineLabel, taxLabel, totalLabel, freeShippingNoteLabel, estimatedDeliveryLabel, values, onChange, fieldErrors, fieldDescriptions, onBackToCart, onCompleteOrder, }: CheckoutForm2Props): react.JSX.Element;
2372
-
2373
- interface CheckoutForm3CartItem {
2374
- id: number;
2375
- name: string;
2376
- price: number;
2377
- quantity: number;
2378
- image: string;
2379
- }
2380
- interface CheckoutForm3ShippingMethod {
2381
- id: string;
2382
- name: string;
2383
- description: string;
2384
- cost: number;
2385
- }
2386
- interface CheckoutForm3CountryOption {
2387
- value: string;
2388
- label: string;
2389
- }
2390
- interface CheckoutForm3Step {
2391
- id: number;
2392
- name: string;
2393
- }
2394
- interface CheckoutForm3FormData {
2395
- email: string;
2396
- firstName: string;
2397
- lastName: string;
2398
- phone: string;
2399
- address: string;
2400
- apartment: string;
2401
- city: string;
2402
- state: string;
2403
- zipCode: string;
2404
- country: string;
2405
- shippingMethod: string;
2406
- paymentMethod: string;
2407
- cardNumber: string;
2408
- expiryDate: string;
2409
- cvv: string;
2410
- cardName: string;
2411
- billingAddress: string;
2412
- newsletter: boolean;
2413
- saveInfo: boolean;
2414
- }
2415
- type CheckoutForm3ChangeHandler = (field: keyof CheckoutForm3FormData, value: string | boolean) => void;
2416
- interface CheckoutForm3Props {
2417
- cartItems: CheckoutForm3CartItem[];
2418
- shippingMethods: CheckoutForm3ShippingMethod[];
2419
- paymentMethods?: PaymentMethod[];
2420
- taxRate?: number;
2421
- countryOptions?: CheckoutForm3CountryOption[];
2422
- steps?: CheckoutForm3Step[];
2423
- currencySymbol?: string;
2424
- titleLabel?: string;
2425
- subtitleLabel?: string;
2426
- backLabel?: string;
2427
- continueLabel?: string;
2428
- placeOrderLabel?: string;
2429
- shippingAddressLabel?: string;
2430
- shippingMethodLabel?: string;
2431
- paymentLabel?: string;
2432
- noMethodsLabel?: string;
2433
- securePaymentLabel?: string;
2434
- emailLabel?: string;
2435
- firstNameLabel?: string;
2436
- lastNameLabel?: string;
2437
- phoneLabel?: string;
2438
- addressLabel?: string;
2439
- apartmentLabel?: string;
2440
- cityLabel?: string;
2441
- stateLabel?: string;
2442
- zipCodeLabel?: string;
2443
- countryLabel?: string;
2444
- cardNumberLabel?: string;
2445
- expiryLabel?: string;
2446
- cvvLabel?: string;
2447
- cardNameLabel?: string;
2448
- newsletterLabel?: string;
2449
- saveInfoLabel?: string;
2450
- orderSummaryLabel?: string;
2451
- subtotalLabel?: string;
2452
- shippingLabel?: string;
2453
- taxLabel?: string;
2454
- totalLabel?: string;
2455
- freeLabel?: string;
2456
- orderReviewLabel?: string;
2457
- contactReviewLabel?: string;
2458
- shipToReviewLabel?: string;
2459
- paymentReviewLabel?: string;
2460
- shippingReviewLabel?: string;
2461
- onComplete?: (data: CheckoutForm3FormData) => void;
2462
- onNextStep?: (step: number) => void;
2463
- onPreviousStep?: (step: number) => void;
2464
- onFieldChange?: CheckoutForm3ChangeHandler;
2465
- }
2466
- declare function CheckoutForm3({ cartItems, shippingMethods, paymentMethods, taxRate, countryOptions, steps, currencySymbol, titleLabel, subtitleLabel, backLabel, continueLabel, placeOrderLabel, shippingAddressLabel, shippingMethodLabel, paymentLabel, noMethodsLabel, securePaymentLabel, emailLabel, firstNameLabel, lastNameLabel, phoneLabel, addressLabel, apartmentLabel, cityLabel, stateLabel, zipCodeLabel, countryLabel, cardNumberLabel, expiryLabel, cvvLabel, cardNameLabel, newsletterLabel, saveInfoLabel, orderSummaryLabel, subtotalLabel, shippingLabel, taxLabel, totalLabel, freeLabel, orderReviewLabel, contactReviewLabel, shipToReviewLabel, paymentReviewLabel, shippingReviewLabel, onComplete, onNextStep, onPreviousStep, onFieldChange, }: CheckoutForm3Props): react.JSX.Element;
2467
-
2468
- type FulfilmentStage = 'Confirmed' | 'Packed' | 'Shipped' | 'Delivered';
2469
- interface OrderLine {
2470
- id: string;
2471
- name: string;
2472
- variant?: string;
2473
- quantity: number;
2474
- /** Canonical backend line total. */
2475
- lineTotal: Money;
2476
- unitPrice?: Money;
2477
- /** Optional; an absent image is omitted rather than serialized as `""`. */
2478
- image?: string;
2479
- }
2480
- interface FulfilmentStageDetail {
2481
- stage: FulfilmentStage;
2482
- /** What happened, in a sentence. Present tense for a stage that has not arrived yet. */
2483
- summary: string;
2484
- /** Where it happened, or where it will. */
2485
- location: string;
2486
- /**
2487
- * When it happened. `null` for a stage still ahead, which the panel renders as an
2488
- * expectation rather than as a fact — a date with no event behind it is a promise, and
2489
- * printing it in the same voice as a completed step is how a tracker starts lying.
2490
- */
2491
- at: string | null;
2492
- }
2493
- interface OrderAddress {
2494
- name: string;
2495
- lines: string[];
2496
- method?: string;
2497
- }
2498
- interface OrderTotals {
2499
- subtotal?: Money;
2500
- discount?: Money;
2501
- shipping?: Money;
2502
- tax?: Money;
2503
- total?: Money;
2504
- }
2505
- interface Order$1 {
2506
- number: string;
2507
- /** ISO date */
2508
- placedAt: string;
2509
- email?: string;
2510
- /** Present only when the backend reports a fulfilment stage. */
2511
- currentStage?: FulfilmentStage;
2512
- /** ISO date. Rendered only when supplied; no delivery estimate is fabricated. */
2513
- estimatedDelivery?: string | null;
2514
- trackingHref?: string;
2515
- shipping?: OrderAddress;
2516
- billing?: OrderAddress;
2517
- totals: OrderTotals;
2518
- }
2519
- interface CheckoutConfirmationProps {
2520
- order: Order$1;
2521
- orderLines: OrderLine[];
2522
- /**
2523
- * Keyed by `FulfilmentStage`. Rendered only when supplied; the stage strip is
2524
- * ordered by `Object.keys`, so define the record in the canonical
2525
- * `Confirmed → Packed → Shipped → Delivered` order.
2526
- */
2527
- fulfilmentDetails?: Record<FulfilmentStage, FulfilmentStageDetail>;
2528
- /** Override money formatting (locale, currency). Defaults to `Money.currencyCode`. */
2529
- formatPrice?: (money: Money) => string;
2530
- titleLabel?: string;
2531
- /** Template with `{number}`/`{date}`/`{email}` placeholders, resolved internally. */
2532
- orderPlacedLabel?: string;
2533
- /** Used when the order carries no email. */
2534
- orderPlacedNoEmailLabel?: string;
2535
- itemsLabel?: string;
2536
- quantityLabel?: string;
2537
- subtotalLabel?: string;
2538
- discountLabel?: string;
2539
- shippingLabel?: string;
2540
- taxLabel?: string;
2541
- totalLabel?: string;
2542
- freeLabel?: string;
2543
- /** Shown for a line whose supplied line total is absent or malformed. */
2544
- amountUnavailableLabel?: string;
2545
- shippingAddressLabel?: string;
2546
- billingAddressLabel?: string;
2547
- continueShoppingLabel?: string;
2548
- /** Prefix of the support line; the `supportLabel` link renders right after it. */
2549
- contactSupportLabel?: string;
2550
- supportLabel?: string;
2551
- progressLabel?: string;
2552
- estimatedDeliveryLabel?: string;
2553
- currentStageLabel?: string;
2554
- inProgressLabel?: string;
2555
- expectedByLabel?: string;
2556
- completedLabel?: string;
2557
- statusLabel?: string;
2558
- locationLabel?: string;
2559
- trackOrderLabel?: string;
2560
- continueShoppingHref?: string;
2561
- supportHref?: string;
2562
- onContinueShopping?: () => void;
2563
- }
2564
- /**
2565
- * The screen that closes the purchase journey the checkout blocks open.
2566
- *
2567
- * This file has no hooks or handlers, so it still renders as a server component straight from
2568
- * your order record. Only the progress tabs are interactive, and they carry their own
2569
- * `'use client'` — the boundary is one child rather than the whole page.
2570
- */
2571
- declare function CheckoutConfirmation({ order, orderLines, fulfilmentDetails, formatPrice, titleLabel, orderPlacedLabel, orderPlacedNoEmailLabel, itemsLabel, quantityLabel, subtotalLabel, discountLabel, shippingLabel, taxLabel, totalLabel, freeLabel, amountUnavailableLabel, shippingAddressLabel, billingAddressLabel, continueShoppingLabel, contactSupportLabel, supportLabel, progressLabel, estimatedDeliveryLabel, currentStageLabel, inProgressLabel, expectedByLabel, completedLabel, statusLabel, locationLabel, trackOrderLabel, continueShoppingHref, supportHref, onContinueShopping, }: CheckoutConfirmationProps): react.JSX.Element;
2572
-
2573
- interface OrderHistory1Order {
2574
- name: string;
2575
- image: string;
2576
- color: string;
2577
- size: string;
2578
- quantity: number;
2579
- price: number;
2580
- orderDate: string;
2581
- }
2582
- interface OrderHistory1Props {
2583
- orders: OrderHistory1Order[];
2584
- title?: string;
2585
- description?: string;
2586
- totalOrdersLabel?: string;
2587
- lastOrderLabel?: string;
2588
- itemLabel?: string;
2589
- orderDateLabel?: string;
2590
- quantityLabel?: string;
2591
- priceLabel?: string;
2592
- colorLabel?: string;
2593
- sizeLabel?: string;
2594
- viewDetailsLabel?: string;
2595
- downloadInvoiceLabel?: string;
2596
- onViewDetails?: () => void;
2597
- onDownloadInvoice?: () => void;
2598
- }
2599
- declare function OrderHistory1({ orders, title, description, totalOrdersLabel, lastOrderLabel, itemLabel, orderDateLabel, quantityLabel, priceLabel, colorLabel, sizeLabel, viewDetailsLabel, downloadInvoiceLabel, onViewDetails, onDownloadInvoice, }: OrderHistory1Props): react.JSX.Element;
2600
-
2601
- interface OrderItem {
2602
- id: string;
2603
- name: string;
2604
- image: string;
2605
- details: string;
2606
- price: string;
2607
- quantity: number;
2608
- }
2609
- interface Order {
2610
- id: string;
2611
- date: string;
2612
- status: string;
2613
- total: string;
2614
- items: OrderItem[];
2615
- }
2616
- interface OrderHistory2Props {
2617
- orders: Order[];
2618
- titleLabel?: string;
2619
- descriptionLabel?: string;
2620
- totalOrdersLabel?: string;
2621
- lastOrderLabel?: string;
2622
- orderLabel?: string;
2623
- placedOnLabel?: string;
2624
- trackOrderLabel?: string;
2625
- viewDetailsLabel?: string;
2626
- qtyLabel?: string;
2627
- orderTotalLabel?: string;
2628
- onTrackOrder?: (order: Order) => void;
2629
- onViewDetails?: (order: Order) => void;
2630
- }
2631
- declare function OrderHistory2({ orders, titleLabel, descriptionLabel, totalOrdersLabel, lastOrderLabel, orderLabel, placedOnLabel, trackOrderLabel, viewDetailsLabel, qtyLabel, orderTotalLabel, onTrackOrder, onViewDetails, }: OrderHistory2Props): react.JSX.Element;
2632
-
2633
- interface FeaturedProduct$1 {
2634
- id: string;
2635
- name: string;
2636
- brand: string;
2637
- price: number;
2638
- originalPrice: number;
2639
- rating: number;
2640
- reviewCount: number;
2641
- inStock: boolean;
2642
- isNew: boolean;
2643
- isOnSale: boolean;
2644
- image: string;
2645
- colors: string[];
2646
- }
2647
- interface HeroImage {
2648
- src: string;
2649
- alt: string;
2650
- }
2651
- interface StorefrontHero1Props {
2652
- title: string;
2653
- description: string;
2654
- products: FeaturedProduct$1[];
2655
- titleAccent?: string;
2656
- badge?: string;
2657
- primaryCta?: CTA;
2658
- secondaryCta?: CTA;
2659
- /**
2660
- * Optional editorial image. Rendered as a native `<img>` when `src` is a
2661
- * non-empty string; omitted entirely when absent or blank (never an empty
2662
- * `src`). The product grid is unaffected.
2663
- */
2664
- heroImage?: HeroImage;
2665
- onAddToCart?: (product: FeaturedProduct$1) => void;
2666
- onBuyNow?: (product: FeaturedProduct$1) => void;
2667
- onSelectColor?: (product: FeaturedProduct$1, index: number, color: string) => void;
2668
- addToCartLabel?: string;
2669
- buyNowLabel?: string;
2670
- newLabel?: string;
2671
- outOfStockLabel?: string;
2672
- colorsLabel?: string;
2673
- }
2674
- declare function StorefrontHero1({ title, description, products, titleAccent, badge, primaryCta, secondaryCta, heroImage, onAddToCart, onBuyNow, onSelectColor, addToCartLabel, buyNowLabel, newLabel, outOfStockLabel, colorsLabel, }: StorefrontHero1Props): react.JSX.Element;
2675
-
2676
- interface FeaturedProduct {
2677
- /** Unique identifier for the product. */
2678
- id: string;
2679
- /** Product display name. */
2680
- name: string;
2681
- /** Image URL or path for the product. */
2682
- image: string;
2683
- /** Current selling price in the store currency. */
2684
- price: number;
2685
- /** Average rating from 0 to 5. */
2686
- rating: number;
2687
- /** Number of reviews the product has received. */
2688
- reviews: number;
2689
- /** Whether the product is flagged as trending. */
2690
- trending: boolean;
2691
- /** Badge label shown on the slide, e.g. "Best Seller". */
2692
- tag: string;
2693
- }
2694
- interface StorefrontHero2Props {
2695
- /** Main heading displayed in the hero. */
2696
- title: string;
2697
- /** Supporting description under the heading. */
2698
- description: string;
2699
- /** Products rendered in the auto-rotating carousel. */
2700
- products: FeaturedProduct[];
2701
- /** Small pill badge above the heading. */
2702
- badge?: string;
2703
- /** Placeholder text for the search input. */
2704
- searchPlaceholder?: string;
2705
- /** Label of the search submit button. */
2706
- searchLabel?: string;
2707
- /** Primary call to action; rendered as a link when it has an href. */
2708
- primaryCta?: CTA;
2709
- /** Secondary call to action; rendered as a link when it has an href. */
2710
- secondaryCta?: CTA;
2711
- /** Copy shown inside each product slide below the product name. */
2712
- featuredDescription?: string;
2713
- /** Label of the call to action inside each product slide. */
2714
- productCtaLabel?: string;
2715
- /** Label shown next to the review count. */
2716
- reviewsLabel?: string;
2717
- /** Label of the trending badge on product slides. */
2718
- trendingLabel?: string;
2719
- /** Called with the current query when the search is submitted. */
2720
- onSearch?: (query: string) => void;
2721
- /** Called when a product slide call to action is clicked. */
2722
- onProductClick?: (product: FeaturedProduct) => void;
2723
- }
2724
- declare function StorefrontHero2({ title, description, products, badge, searchPlaceholder, searchLabel, primaryCta, secondaryCta, featuredDescription, productCtaLabel, reviewsLabel, trendingLabel, onSearch, onProductClick, }: StorefrontHero2Props): react.JSX.Element;
2725
-
2726
- interface Department {
2727
- /** Unique identifier */
2728
- id: string;
2729
- /** Department name */
2730
- name: string;
2731
- /** Image URL for the department chip */
2732
- image: string;
2733
- /** Accessible image description (falls back to `name`) */
2734
- imageAlt?: string;
2735
- /** Product count label shown under the name */
2736
- count?: string;
2737
- /** Link destination when the department is a link */
2738
- href?: string;
2739
- }
2740
- interface FeaturedDeal {
2741
- /** Unique identifier */
2742
- id: string;
2743
- /** Deal title */
2744
- name: string;
2745
- /** Short supporting description */
2746
- description: string;
2747
- /** Image URL */
2748
- image: string;
2749
- /** Accessible image description (falls back to `name`) */
2750
- imageAlt?: string;
2751
- /** Current price */
2752
- price: number;
2753
- /** Original price, rendered struck-through when present */
2754
- originalPrice?: number;
2755
- /** Optional call to action shown on the card */
2756
- cta?: CTA;
2757
- }
2758
- interface StoreLocator {
2759
- /** Locator section title */
2760
- title: string;
2761
- /** Locator section description */
2762
- description: string;
2763
- /** Locator button label */
2764
- ctaLabel: string;
2765
- /** Optional link destination for the locator button */
2766
- ctaHref?: string;
2767
- }
2768
- interface StorefrontHero5Props {
2769
- /** Small pill shown above the title */
2770
- badge?: string;
2771
- /** Main headline */
2772
- title: string;
2773
- /** Accent text appended to the headline */
2774
- titleAccent?: string;
2775
- /** Supporting paragraph under the headline */
2776
- description: string;
2777
- /** Primary call to action */
2778
- primaryCta?: CTA;
2779
- /** Secondary call to action */
2780
- secondaryCta?: CTA;
2781
- /** Shipping banner text shown under the CTAs */
2782
- shippingInfo?: string;
2783
- /** Department categories rendered as a grid */
2784
- departments: Department[];
2785
- /** Featured deals rendered as cards */
2786
- featuredDeals: FeaturedDeal[];
2787
- /** Store locator strip rendered at the bottom */
2788
- storeLocator?: StoreLocator;
2789
- /** Invoked when a department is clicked (departments without `href`) */
2790
- onDepartmentClick?: (department: Department) => void;
2791
- /** Invoked when a deal CTA is clicked (deals whose `cta` has no `href`) */
2792
- onShopNow?: (deal: FeaturedDeal) => void;
2793
- /** Invoked when the locator button is clicked (when `ctaHref` is absent) */
2794
- onLocateStores?: () => void;
2795
- /** Label for the deal call-to-action button */
2796
- shopNowLabel?: string;
2797
- }
2798
- declare function StorefrontHero5({ badge, title, titleAccent, description, primaryCta, secondaryCta, shippingInfo, departments, featuredDeals, storeLocator, onDepartmentClick, onShopNow, onLocateStores, shopNowLabel, }: StorefrontHero5Props): react.JSX.Element;
2799
-
2800
- interface HeroDeal {
2801
- /** Unique identifier for the deal. */
2802
- id: string;
2803
- /** Deal name shown in the badge, e.g. "Summer Sale". */
2804
- title: string;
2805
- /** Discount label, e.g. "50% OFF". */
2806
- discount: string;
2807
- /** Countdown text, e.g. "2d : 15h : 30m". */
2808
- endTime: string;
2809
- }
2810
- interface HeroCategory {
2811
- /** Unique identifier for the category. */
2812
- id: string;
2813
- /** Category name. */
2814
- name: string;
2815
- /** Product count label, e.g. "2.5k+". */
2816
- count: string;
2817
- /** Image URL for the category card. */
2818
- image: string;
2819
- /** Accessible image description (falls back to `name`). */
2820
- imageAlt?: string;
2821
- /** Optional link destination; renders the card arrow as a link when present. */
2822
- href?: string;
2823
- }
2824
- interface StorefrontHero6Props {
2825
- /** Small pill shown above the headline. */
2826
- badge?: string;
2827
- /** Main headline. */
2828
- title: string;
2829
- /** Accent line rendered on a new line after the headline. */
2830
- subtitle?: string;
2831
- /** Supporting paragraph under the headline. */
2832
- description: string;
2833
- /** Deals rendered in the sticky auto-rotating top bar. */
2834
- deals: HeroDeal[];
2835
- /** Product categories rendered as a card grid. */
2836
- categories: HeroCategory[];
2837
- /** Milliseconds between auto-rotating deals (default 3000). */
2838
- rotationInterval?: number;
2839
- /** Label shown before the deal countdown, e.g. "Ends in". */
2840
- endsInLabel?: string;
2841
- /** Label of the shop-now button in the deals bar. */
2842
- shopNowLabel?: string;
2843
- /** Unit appended to each category product count. */
2844
- productsLabel?: string;
2845
- /** Prefix for the category arrow accessible label. */
2846
- viewLabel?: string;
2847
- /** Called when the shop-now button in the deals bar is clicked. */
2848
- onShopNow?: (deal: HeroDeal) => void;
2849
- /** Called when a category arrow is clicked (categories without `href`). */
2850
- onCategoryClick?: (category: HeroCategory) => void;
2851
- }
2852
- declare function StorefrontHero6({ badge, title, subtitle, description, deals, categories, rotationInterval, endsInLabel, shopNowLabel, productsLabel, viewLabel, onShopNow, onCategoryClick, }: StorefrontHero6Props): react.JSX.Element;
2853
-
2854
- type AppShell1NavIcon = 'layout-dashboard' | 'package' | 'user' | 'settings' | 'home' | 'shopping-cart' | 'bar-chart-3' | 'users' | 'folder-kanban';
2855
- interface AppShell1NavItem {
2856
- label: string;
2857
- href: string;
2858
- icon: AppShell1NavIcon;
2859
- active?: boolean;
2860
- }
2861
- interface AppShell1User {
2862
- name: string;
2863
- email: string;
2864
- initials: string;
2865
- }
2866
-
2867
- interface AppShell1BreadcrumbItem {
2868
- label: string;
2869
- href?: string;
2870
- }
2871
- interface AppShell1Stat {
2872
- label: string;
2873
- value: string;
2874
- }
2875
- interface AppShell1Props {
2876
- brandName?: string;
2877
- navGroupLabel?: string;
2878
- navItems?: AppShell1NavItem[];
2879
- user?: AppShell1User;
2880
- breadcrumb?: AppShell1BreadcrumbItem[];
2881
- pageTitle?: string;
2882
- pageDescription?: string;
2883
- action?: CTA;
2884
- stats?: AppShell1Stat[];
2885
- children?: ReactNode;
2886
- className?: string;
2887
- }
2888
- declare function AppShell1({ brandName, navGroupLabel, navItems, user, breadcrumb, pageTitle, pageDescription, action, stats, children, className, }: AppShell1Props): react.JSX.Element;
2889
-
2890
- interface LoginPage1SocialButton {
2891
- name: string;
2892
- icon: LucideIcon;
2893
- }
2894
- interface LoginPage1FormData {
2895
- email: string;
2896
- password: string;
2897
- remember: boolean;
2898
- }
2899
- interface LoginPage1Props {
2900
- logoText?: string;
2901
- welcomeTitleLabel?: string;
2902
- welcomeDescriptionLabel?: string;
2903
- emailLabel?: string;
2904
- emailPlaceholder?: string;
2905
- passwordLabel?: string;
2906
- passwordPlaceholder?: string;
2907
- rememberMeLabel?: string;
2908
- forgotPasswordLabel?: string;
2909
- signInLabel?: string;
2910
- orContinueWithLabel?: string;
2911
- dontHaveAccountLabel?: string;
2912
- createAccountLabel?: string;
2913
- /** Template with a `{provider}` placeholder for the social login buttons' aria-labels. */
2914
- socialAriaLabelTemplate?: string;
2915
- showPasswordAriaLabel?: string;
2916
- hidePasswordAriaLabel?: string;
2917
- socialButtons?: LoginPage1SocialButton[];
2918
- onSubmit?: (data: LoginPage1FormData) => void;
2919
- onForgotPassword?: () => void;
2920
- onCreateAccount?: () => void;
2921
- onSocialLogin?: (providerName: string) => void;
2922
- }
2923
- declare function LoginPage1({ logoText, welcomeTitleLabel, welcomeDescriptionLabel, emailLabel, emailPlaceholder, passwordLabel, passwordPlaceholder, rememberMeLabel, forgotPasswordLabel, signInLabel, orContinueWithLabel, dontHaveAccountLabel, createAccountLabel, socialAriaLabelTemplate, showPasswordAriaLabel, hidePasswordAriaLabel, socialButtons, onSubmit, onForgotPassword, onCreateAccount, onSocialLogin, }: LoginPage1Props): react.JSX.Element;
2924
-
2925
- interface LoginPage2SocialButton {
2926
- name: string;
2927
- icon: LucideIcon;
2928
- }
2929
- interface LoginPage2Props {
2930
- /** Brand text rendered next to the block logo. Omit to hide the logo. */
2931
- logoText?: string;
2932
- welcomeTitleLabel?: string;
2933
- welcomeDescriptionLabel?: string;
2934
- emailLabel?: string;
2935
- emailPlaceholder?: string;
2936
- passwordLabel?: string;
2937
- passwordPlaceholder?: string;
2938
- rememberMeLabel?: string;
2939
- forgotPasswordLabel?: string;
2940
- signInLabel?: string;
2941
- orContinueWithLabel?: string;
2942
- /** Social login buttons rendered in a 2-column grid. Pass an empty array to hide. */
2943
- socialButtons?: LoginPage2SocialButton[];
2944
- dontHaveAccountLabel?: string;
2945
- signUpLabel?: string;
2946
- showPasswordLabel?: string;
2947
- hidePasswordLabel?: string;
2948
- onSubmit?: (email: string, password: string) => void;
2949
- onForgotPassword?: () => void;
2950
- onSignUp?: () => void;
2951
- }
2952
- declare function LoginPage2({ logoText, welcomeTitleLabel, welcomeDescriptionLabel, emailLabel, emailPlaceholder, passwordLabel, passwordPlaceholder, rememberMeLabel, forgotPasswordLabel, signInLabel, orContinueWithLabel, socialButtons, dontHaveAccountLabel, signUpLabel, showPasswordLabel, hidePasswordLabel, onSubmit, onForgotPassword, onSignUp, }: LoginPage2Props): react.JSX.Element;
2953
-
2954
- interface SignUpPage1SocialButton {
2955
- name: string;
2956
- icon: LucideIcon;
2957
- }
2958
- interface SignUpPage1Data {
2959
- fullName: string;
2960
- email: string;
2961
- password: string;
2962
- }
2963
- interface SignUpPage1Props {
2964
- /** Brand text shown under the logo mark. Omit to hide it. */
2965
- logoText?: string;
2966
- createAccountTitleLabel?: string;
2967
- createAccountDescriptionLabel?: string;
2968
- fullNameLabel?: string;
2969
- fullNamePlaceholder?: string;
2970
- emailLabel?: string;
2971
- emailPlaceholder?: string;
2972
- passwordLabel?: string;
2973
- passwordPlaceholder?: string;
2974
- createAccountLabel?: string;
2975
- orSignUpWithLabel?: string;
2976
- /** aria-label template for each social button. Use `{name}` as the button name placeholder. */
2977
- socialAriaLabel?: string;
2978
- /** Social sign-up buttons rendered in a 3-column grid. Pass an empty array to hide. */
2979
- socialButtons?: SignUpPage1SocialButton[];
2980
- alreadyHaveAccountLabel?: string;
2981
- signInLabel?: string;
2982
- termsLabel?: string;
2983
- termsLinkLabel?: string;
2984
- termsHref?: string;
2985
- termsAndLabel?: string;
2986
- privacyLinkLabel?: string;
2987
- privacyHref?: string;
2988
- onSubmit?: (data: SignUpPage1Data) => void;
2989
- onSignIn?: () => void;
2990
- }
2991
- declare function SignUpPage1({ logoText, createAccountTitleLabel, createAccountDescriptionLabel, fullNameLabel, fullNamePlaceholder, emailLabel, emailPlaceholder, passwordLabel, passwordPlaceholder, createAccountLabel, orSignUpWithLabel, socialAriaLabel, socialButtons, alreadyHaveAccountLabel, signInLabel, termsLabel, termsLinkLabel, termsHref, termsAndLabel, privacyLinkLabel, privacyHref, onSubmit, onSignIn, }: SignUpPage1Props): react.JSX.Element;
2992
-
2993
- interface ForgotPasswordPage1Props {
2994
- /** Callback fired with the email when the user submits the reset-code step. */
2995
- onSendResetCode?: (email: string) => void;
2996
- /** Callback fired with the 6-digit code when the user verifies it. */
2997
- onVerifyCode?: (code: string) => void;
2998
- /** Callback fired when the user requests a new code. */
2999
- onResendCode?: () => void;
3000
- /** Callback fired with the new password when the user sets it. */
3001
- onSetNewPassword?: (password: string) => void;
3002
- /** Callback fired when the user goes back to login from the success step. */
3003
- onBackToLogin?: () => void;
3004
- step1TitleLabel?: string;
3005
- step1DescriptionLabel?: string;
3006
- emailLabel?: string;
3007
- emailPlaceholder?: string;
3008
- sendResetCodeLabel?: string;
3009
- step2TitleLabel?: string;
3010
- step2DescriptionLabel?: string;
3011
- codeLabel?: string;
3012
- verifyCodeLabel?: string;
3013
- resendCodeLabel?: string;
3014
- resendCodeCooldownLabel?: string;
3015
- didNotReceiveLabel?: string;
3016
- step3TitleLabel?: string;
3017
- step3DescriptionLabel?: string;
3018
- newPasswordLabel?: string;
3019
- setNewPasswordLabel?: string;
3020
- strengthWeakLabel?: string;
3021
- strengthMediumLabel?: string;
3022
- strengthStrongLabel?: string;
3023
- strengthIndicatorLabel?: string;
3024
- step4TitleLabel?: string;
3025
- step4DescriptionLabel?: string;
3026
- backToLoginLabel?: string;
3027
- dontHaveAccountLabel?: string;
3028
- signUpLabel?: string;
3029
- showPasswordLabel?: string;
3030
- hidePasswordLabel?: string;
3031
- }
3032
- declare function ForgotPasswordPage1({ onSendResetCode, onVerifyCode, onResendCode, onSetNewPassword, onBackToLogin, step1TitleLabel, step1DescriptionLabel, emailLabel, emailPlaceholder, sendResetCodeLabel, step2TitleLabel, step2DescriptionLabel, codeLabel, verifyCodeLabel, resendCodeLabel, resendCodeCooldownLabel, didNotReceiveLabel, step3TitleLabel, step3DescriptionLabel, newPasswordLabel, setNewPasswordLabel, strengthWeakLabel, strengthMediumLabel, strengthStrongLabel, strengthIndicatorLabel, step4TitleLabel, step4DescriptionLabel, backToLoginLabel, dontHaveAccountLabel, signUpLabel, showPasswordLabel, hidePasswordLabel, }: ForgotPasswordPage1Props): react.JSX.Element;
3033
-
3034
- interface Verify1Props {
3035
- verifyTitleLabel?: string;
3036
- verifyDescriptionLabel?: string;
3037
- backupCodeTitleLabel?: string;
3038
- backupCodeDescriptionLabel?: string;
3039
- backupCodeLabel?: string;
3040
- backupCodePlaceholder?: string;
3041
- otpAriaLabel?: string;
3042
- verifyLabel?: string;
3043
- resendCodeLabel?: string;
3044
- /** Plantilla con {n} sustituido por los segundos restantes. */
3045
- resendCooldownLabel?: string;
3046
- useBackupCodeLabel?: string;
3047
- useAuthenticatorLabel?: string;
3048
- tooManyAttemptsLabel?: string;
3049
- /** Plantilla con {n} sustituido por los intentos restantes. */
3050
- attemptsLeftLabel?: string;
3051
- verifiedTitleLabel?: string;
3052
- verifiedDescriptionLabel?: string;
3053
- continueLabel?: string;
3054
- demoOtpHintLabel?: string;
3055
- /** Plantilla con {code} sustituido por el código de respaldo de la demo. */
3056
- demoBackupHintLabel?: string;
3057
- /** Verificación real del código OTP. Devuelve true si es correcto. */
3058
- onVerify?: (code: string) => Promise<boolean>;
3059
- /** Verificación real del código de respaldo. Devuelve true si es correcto. */
3060
- onVerifyBackup?: (code: string) => Promise<boolean>;
3061
- /** Se dispara al pedir reenviar el código. */
3062
- onResend?: () => void;
3063
- /** Se dispara al continuar tras la verificación. */
3064
- onContinue?: () => void;
3065
- }
3066
- declare function Verify1({ verifyTitleLabel, verifyDescriptionLabel, backupCodeTitleLabel, backupCodeDescriptionLabel, backupCodeLabel, backupCodePlaceholder, otpAriaLabel, verifyLabel, resendCodeLabel, resendCooldownLabel, useBackupCodeLabel, useAuthenticatorLabel, tooManyAttemptsLabel, attemptsLeftLabel, verifiedTitleLabel, verifiedDescriptionLabel, continueLabel, demoOtpHintLabel, demoBackupHintLabel, onVerify, onVerifyBackup, onResend, onContinue, }: Verify1Props): react.JSX.Element;
3067
-
3068
- export { AppShell1, Avatar, AvatarFallback, AvatarImage, BackToTop, type BackToTopProps, Badge, Banner1, Breadcrumb, type BreadcrumbItemData, type BreadcrumbProps, Button, type CTA, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryFilter1, type CategoryFilter1Category, type CategoryFilter1PriceRange, type CategoryFilter1SortOption, CategoryFilter2, type CategoryFilter2ActiveFilter, type CategoryFilter2ActiveFilterKind, type CategoryFilter2Category, type CategoryFilter2Collection, type CategoryFilter2Color, type CategoryFilter2Filters, type CategoryFilter2PriceRange, type CategoryFilter2Props, type CategoryFilter2QueryError, type CategoryFilter2SortOption, type CategoryFilter2Status, CategoryFilter2StatusView, type CategoryFilter2StatusViewProps, CategoryFilter4, type CategoryFilter4Facets, type CategoryFilter4Product, type CategoryFilter4Props, CategoryIcon, type CategoryIconName, type CategoryIconProps, CheckoutConfirmation, type CheckoutConfirmationProps, type CheckoutFieldError, type CheckoutFieldErrors, CheckoutForm1, type CheckoutForm1ChangeHandler, type CheckoutForm1CountryOption, type CheckoutForm1FieldDescriptions, type CheckoutForm1FieldErrors, type CheckoutForm1FormData, type CheckoutForm1OrderSummary, type CheckoutForm1OrderSummaryItem, type CheckoutForm1Props, type CheckoutForm1ShippingOption, type CheckoutForm1Totals, type CheckoutForm1TotalsState, CheckoutForm2, type CheckoutForm2Data, type CheckoutForm2FieldDescriptions, type CheckoutForm2FieldErrors, type CheckoutForm2Item, type CheckoutForm2Props, type CheckoutForm2Totals, CheckoutForm3, type CheckoutForm3CartItem, type CheckoutForm3CountryOption, type CheckoutForm3FormData, type CheckoutForm3Props, type CheckoutForm3ShippingMethod, type CollectionItem, CtaSection1, type CtaSection1Props, FaqBlock1, type FaqBlock1Props, type FaqItem, Feature1, type Feature1Item, type Feature1Props, Feature2, type Feature2Item, type Feature2Props, type FeaturedProduct$1 as FeaturedProduct, type FilterProduct, type FooterLink, type FooterLinkColumn, FooterSection1, FooterSection3, type FooterSection3Props, FooterSection4, type FooterSection4Contact, type FooterSection4Link, type FooterSection4LinkColumn, type FooterSection4Props, type FooterSection4SocialIcon, type FooterSection4SocialLink, ForgotPasswordPage1, type ForgotPasswordPage1Props, type FulfilmentStage, type FulfilmentStageDetail, HeroSection1, LoginPage1, type LoginPage1FormData, type LoginPage1Props, type LoginPage1SocialButton, LoginPage2, type LoginPage2Props, type LoginPage2SocialButton, LogoCloud1, type LogoCloud1Platform, type LogoCloud1Props, MegaMenu, type MegaMenuProps, type MenuItem, MobileBottomNav, type MobileBottomNavItem, type MobileBottomNavProps, MobileCategoryDrawer, type MobileCategoryDrawerProps, Navbar1, Navbar2, Navbar3, Navbar4, type Order$1 as Order, type OrderAddress, OrderHistory1, OrderHistory2, type OrderLine, type OrderTotals, PricingSection1, type PricingSection1Props, type PricingTier, ProductCard1, type ProductCard1Product, type ProductCard1Props, ProductCard2, ProductCard3, ProductCard5, ProductCategory1, type ProductCategory1Category, type ProductCategory1CategoryIcon, type ProductCategory1Props, ProductCategory2, type ProductCategory2Category, type ProductCategory2Props, ProductCategory4, ProductCategory5, type ProductDetailProduct, type ProductDetailVariant, ProductOverview1, type ProductOverview1Props, type ProductOverview1Rating, ProductOverview2, type ProductOverview2Product, type ProductOverview2Props, ProductOverview5, type ProductOverview5Product, type ProductOverview5Props, type ProductOverview5Review, ProductPresentation, ProductQuickView, ProductShowcase1, type ProductShowcase1Props, ReviewRating1, type ReviewRating1Review, ReviewRating2, ShoppingCart1, ShoppingCart2, type ShoppingCart2Item, type ShoppingCart2Props, ShoppingCart3, type ShoppingCart3CartItem, type ShoppingCart3Props, ShoppingCart4, type ShoppingCart4Item, type ShoppingCart4Props, SignUpPage1, type SignUpPage1Data, type SignUpPage1Props, type SignUpPage1SocialButton, SkipToContent, type SkipToContentProps, type SocialLink, Statistic1, type Statistic1Props, type StatisticItem, StoreCategory, StoreContainer1, type StoreContainer1Props, StorefrontHero1, type StorefrontHero1Props, StorefrontHero2, StorefrontHero5, StorefrontHero6, Testimonial1, type Testimonial1Item, type Testimonial1Props, Testimonial2, type Testimonial2Item, type Testimonial2Props, Verify1, type Verify1Props, backToTopPropsSchema, badgeVariants, breadcrumbItemSchema, breadcrumbPropsSchema, buttonVariants, categoryIconNameSchema, categoryIconPropsSchema, cn, collectionItemSchema, megaMenuPropsSchema, menuItemSchema, mobileBottomNavItemSchema, mobileBottomNavPropsSchema, mobileCategoryDrawerPropsSchema, resolveScrollBehavior, skipToContentPropsSchema };