@thorprovider/blocks 0.1.0 → 0.1.2

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 (57) hide show
  1. package/.turbo/turbo-build.log +15 -15
  2. package/.turbo/turbo-test.log +32 -5
  3. package/AGENTS.md +1 -1
  4. package/README.md +52 -0
  5. package/dist/.tsbuildinfo +1 -1
  6. package/dist/contracts.d.mts +1111 -90
  7. package/dist/contracts.d.ts +1111 -90
  8. package/dist/contracts.js +189 -6
  9. package/dist/contracts.js.map +1 -1
  10. package/dist/contracts.mjs +173 -7
  11. package/dist/contracts.mjs.map +1 -1
  12. package/dist/index.d.mts +467 -89
  13. package/dist/index.d.ts +467 -89
  14. package/dist/index.js +2967 -2250
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +2989 -2282
  17. package/dist/index.mjs.map +1 -1
  18. package/docs/standards/theming.md +32 -5
  19. package/package.json +4 -3
  20. package/src/blocks/e-commerce/category-filters/category-filter-2-filter-panel.tsx +136 -93
  21. package/src/blocks/e-commerce/category-filters/category-filter-2.test.tsx +513 -0
  22. package/src/blocks/e-commerce/category-filters/category-filter-2.tsx +728 -148
  23. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.tsx +14 -8
  24. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.test.tsx +136 -0
  25. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.tsx +145 -99
  26. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-order-summary.tsx +215 -102
  27. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-payment-step.tsx +6 -2
  28. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-shipping-step.tsx +51 -2
  29. package/src/blocks/e-commerce/checkout-forms/checkout-form-1.test.tsx +216 -0
  30. package/src/blocks/e-commerce/checkout-forms/checkout-form-1.tsx +114 -11
  31. package/src/blocks/e-commerce/navigation/mobile-category-drawer.test.tsx +42 -2
  32. package/src/blocks/e-commerce/navigation/mobile-category-drawer.tsx +10 -8
  33. package/src/blocks/e-commerce/product-categories/product-category-2.test.tsx +51 -0
  34. package/src/blocks/e-commerce/product-categories/product-category-2.tsx +56 -36
  35. package/src/blocks/e-commerce/product-overview/product-overview-1.test.tsx +182 -0
  36. package/src/blocks/e-commerce/product-overview/product-overview-1.tsx +298 -129
  37. package/src/blocks/e-commerce/shopping-carts/shopping-cart-4.test.tsx +137 -0
  38. package/src/blocks/e-commerce/shopping-carts/shopping-cart-4.tsx +231 -89
  39. package/src/blocks/e-commerce/storefront-hero/storefront-hero-1.test.tsx +65 -0
  40. package/src/blocks/e-commerce/storefront-hero/storefront-hero-1.tsx +19 -0
  41. package/src/blocks/marketing/footers/footer-section-1.test.tsx +117 -0
  42. package/src/blocks/marketing/footers/footer-section-1.tsx +46 -9
  43. package/src/blocks/marketing/navbars/navbar-4-cart-sheet.test.tsx +54 -0
  44. package/src/blocks/marketing/navbars/navbar-4-cart-sheet.tsx +43 -13
  45. package/src/blocks/marketing/navbars/navbar-4.test.tsx +112 -0
  46. package/src/blocks/marketing/navbars/navbar-4.tsx +101 -28
  47. package/src/index.ts +38 -0
  48. package/src/lib/cart.test.ts +15 -0
  49. package/src/lib/cart.ts +11 -0
  50. package/src/lib/contracts-curated.test.ts +207 -0
  51. package/src/lib/contracts-server-boundary.test.ts +52 -0
  52. package/src/lib/contracts.ts +182 -4
  53. package/src/lib/money.test.ts +64 -0
  54. package/src/lib/money.ts +65 -0
  55. package/styles.css +1 -0
  56. package/tsup.config.ts +0 -1
  57. package/vitest.config.ts +9 -1
@@ -1,6 +1,43 @@
1
1
  import { z } from 'zod';
2
2
  import { Money, ProductPreview, PaymentMethod } from '@thorprovider/types';
3
3
 
4
+ /**
5
+ * True only for a complete, finite decimal string (`"0"`, `"69.99"`, `"-3.5"`).
6
+ * Rejects `""`, `" "`, `"1."`, `".5"`, `"1e3"`, `"abc"`, and non-strings.
7
+ */
8
+ declare function isCompleteFiniteDecimal(value: unknown): value is string;
9
+ /**
10
+ * True when a `Money` value is safe to display and price a purchase with: a
11
+ * complete finite decimal amount and a non-empty currency code. A valid zero
12
+ * (`{ amount: '0', currencyCode: 'USD' }`) is available — zero alone does not
13
+ * make a price unavailable.
14
+ */
15
+ declare function isAvailableMoney(money: Money | null | undefined): money is Money;
16
+ /**
17
+ * Formats a `Money` for display, or `null` when the value is unavailable.
18
+ *
19
+ * This is the safety gate the whole curated surface relies on: an absent or
20
+ * malformed amount (`""`, `" "`, `"abc"`, a non-string, a missing currency)
21
+ * MUST NOT reach `Intl.NumberFormat`, because `Number("")` is `0` and would
22
+ * render a fake `$0.00` for missing data. A backend-resolved valid zero
23
+ * (`{ amount: "0", currencyCode: "USD" }`) is available and formats as zero.
24
+ *
25
+ * When no `formatter` is supplied the currency comes from
26
+ * `money.currencyCode`, so no currency is hardcoded. Callers render their own
27
+ * unavailable/pending/recovery state when this returns `null`.
28
+ */
29
+ declare function formatMoney(money: Money | null | undefined, formatter?: (money: Money) => string): string | null;
30
+
31
+ /**
32
+ * Cart line quantity normalization shared by the curated cart surfaces.
33
+ *
34
+ * The Navbar mini-cart expresses a quantity DELTA while the cart page reports
35
+ * an ABSOLUTE quantity. The boundary normalizes the delta against the
36
+ * authoritative current line quantity (from the backend cart) before mutating;
37
+ * it must never reinterpret one as the other.
38
+ */
39
+ declare function resolveAbsoluteQuantity(currentQuantity: number, delta: number): number;
40
+
4
41
  /**
5
42
  * Serialization contracts for spec-driven storefronts.
6
43
  *
@@ -30,6 +67,689 @@ type CanonProduct = ProductPreview;
30
67
  * one so direct consumers are safe by default.
31
68
  */
32
69
  declare const PRODUCT_IMAGE_FALLBACK: string;
70
+ /**
71
+ * Canonical `Money` (`@thorprovider/types`): a decimal string in major units
72
+ * (`"69.99"`), never cents. A missing price is represented by omitting the
73
+ * field (or `null` on a nullable field), not by an empty string.
74
+ *
75
+ * The amount stays a permissive `z.string()` on purpose: an unresolved backend
76
+ * price may arrive as the canonical sentinel `""`, and tightening the schema
77
+ * would reject the whole view instead of letting the presentation layer render
78
+ * an unavailable state. Validity is enforced at render time by
79
+ * `isAvailableMoney`/`formatMoney` (a `""`/malformed amount never becomes `$0`).
80
+ */
81
+ declare const moneySchema: z.ZodType<Money>;
82
+ declare const productDetailVariantSchema: z.ZodObject<{
83
+ id: z.ZodString;
84
+ title: z.ZodString;
85
+ sku: z.ZodOptional<z.ZodString>;
86
+ availableForSale: z.ZodBoolean;
87
+ selectedOptions: z.ZodArray<z.ZodObject<{
88
+ name: z.ZodString;
89
+ value: z.ZodString;
90
+ }, "strip", z.ZodTypeAny, {
91
+ value: string;
92
+ name: string;
93
+ }, {
94
+ value: string;
95
+ name: string;
96
+ }>, "many">;
97
+ /** Omit or null when the backend has no resolved price (purchase disabled). */
98
+ price: z.ZodOptional<z.ZodNullable<z.ZodType<Money, z.ZodTypeDef, Money>>>;
99
+ compareAtPrice: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
100
+ image: z.ZodOptional<z.ZodObject<{
101
+ id: z.ZodOptional<z.ZodString>;
102
+ url: z.ZodString;
103
+ altText: z.ZodString;
104
+ width: z.ZodOptional<z.ZodNumber>;
105
+ height: z.ZodOptional<z.ZodNumber>;
106
+ }, "strip", z.ZodTypeAny, {
107
+ url: string;
108
+ altText: string;
109
+ id?: string | undefined;
110
+ width?: number | undefined;
111
+ height?: number | undefined;
112
+ }, {
113
+ url: string;
114
+ altText: string;
115
+ id?: string | undefined;
116
+ width?: number | undefined;
117
+ height?: number | undefined;
118
+ }>>;
119
+ }, "strip", z.ZodTypeAny, {
120
+ id: string;
121
+ title: string;
122
+ availableForSale: boolean;
123
+ selectedOptions: {
124
+ value: string;
125
+ name: string;
126
+ }[];
127
+ sku?: string | undefined;
128
+ price?: Money | null | undefined;
129
+ compareAtPrice?: Money | undefined;
130
+ image?: {
131
+ url: string;
132
+ altText: string;
133
+ id?: string | undefined;
134
+ width?: number | undefined;
135
+ height?: number | undefined;
136
+ } | undefined;
137
+ }, {
138
+ id: string;
139
+ title: string;
140
+ availableForSale: boolean;
141
+ selectedOptions: {
142
+ value: string;
143
+ name: string;
144
+ }[];
145
+ sku?: string | undefined;
146
+ price?: Money | null | undefined;
147
+ compareAtPrice?: Money | undefined;
148
+ image?: {
149
+ url: string;
150
+ altText: string;
151
+ id?: string | undefined;
152
+ width?: number | undefined;
153
+ height?: number | undefined;
154
+ } | undefined;
155
+ }>;
156
+ type ProductDetailVariantSpec = z.infer<typeof productDetailVariantSchema>;
157
+ declare const productDetailProductSchema: z.ZodObject<{
158
+ id: z.ZodString;
159
+ handle: z.ZodOptional<z.ZodString>;
160
+ title: z.ZodString;
161
+ description: z.ZodOptional<z.ZodString>;
162
+ vendor: z.ZodOptional<z.ZodString>;
163
+ options: z.ZodArray<z.ZodObject<{
164
+ id: z.ZodString;
165
+ name: z.ZodString;
166
+ values: z.ZodArray<z.ZodString, "many">;
167
+ }, "strip", z.ZodTypeAny, {
168
+ values: string[];
169
+ id: string;
170
+ name: string;
171
+ }, {
172
+ values: string[];
173
+ id: string;
174
+ name: string;
175
+ }>, "many">;
176
+ variants: z.ZodArray<z.ZodObject<{
177
+ id: z.ZodString;
178
+ title: z.ZodString;
179
+ sku: z.ZodOptional<z.ZodString>;
180
+ availableForSale: z.ZodBoolean;
181
+ selectedOptions: z.ZodArray<z.ZodObject<{
182
+ name: z.ZodString;
183
+ value: z.ZodString;
184
+ }, "strip", z.ZodTypeAny, {
185
+ value: string;
186
+ name: string;
187
+ }, {
188
+ value: string;
189
+ name: string;
190
+ }>, "many">;
191
+ /** Omit or null when the backend has no resolved price (purchase disabled). */
192
+ price: z.ZodOptional<z.ZodNullable<z.ZodType<Money, z.ZodTypeDef, Money>>>;
193
+ compareAtPrice: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
194
+ image: z.ZodOptional<z.ZodObject<{
195
+ id: z.ZodOptional<z.ZodString>;
196
+ url: z.ZodString;
197
+ altText: z.ZodString;
198
+ width: z.ZodOptional<z.ZodNumber>;
199
+ height: z.ZodOptional<z.ZodNumber>;
200
+ }, "strip", z.ZodTypeAny, {
201
+ url: string;
202
+ altText: string;
203
+ id?: string | undefined;
204
+ width?: number | undefined;
205
+ height?: number | undefined;
206
+ }, {
207
+ url: string;
208
+ altText: string;
209
+ id?: string | undefined;
210
+ width?: number | undefined;
211
+ height?: number | undefined;
212
+ }>>;
213
+ }, "strip", z.ZodTypeAny, {
214
+ id: string;
215
+ title: string;
216
+ availableForSale: boolean;
217
+ selectedOptions: {
218
+ value: string;
219
+ name: string;
220
+ }[];
221
+ sku?: string | undefined;
222
+ price?: Money | null | undefined;
223
+ compareAtPrice?: Money | undefined;
224
+ image?: {
225
+ url: string;
226
+ altText: string;
227
+ id?: string | undefined;
228
+ width?: number | undefined;
229
+ height?: number | undefined;
230
+ } | undefined;
231
+ }, {
232
+ id: string;
233
+ title: string;
234
+ availableForSale: boolean;
235
+ selectedOptions: {
236
+ value: string;
237
+ name: string;
238
+ }[];
239
+ sku?: string | undefined;
240
+ price?: Money | null | undefined;
241
+ compareAtPrice?: Money | undefined;
242
+ image?: {
243
+ url: string;
244
+ altText: string;
245
+ id?: string | undefined;
246
+ width?: number | undefined;
247
+ height?: number | undefined;
248
+ } | undefined;
249
+ }>, "many">;
250
+ images: z.ZodArray<z.ZodObject<{
251
+ id: z.ZodOptional<z.ZodString>;
252
+ url: z.ZodString;
253
+ altText: z.ZodString;
254
+ width: z.ZodOptional<z.ZodNumber>;
255
+ height: z.ZodOptional<z.ZodNumber>;
256
+ }, "strip", z.ZodTypeAny, {
257
+ url: string;
258
+ altText: string;
259
+ id?: string | undefined;
260
+ width?: number | undefined;
261
+ height?: number | undefined;
262
+ }, {
263
+ url: string;
264
+ altText: string;
265
+ id?: string | undefined;
266
+ width?: number | undefined;
267
+ height?: number | undefined;
268
+ }>, "many">;
269
+ featuredImage: z.ZodOptional<z.ZodObject<{
270
+ id: z.ZodOptional<z.ZodString>;
271
+ url: z.ZodString;
272
+ altText: z.ZodString;
273
+ width: z.ZodOptional<z.ZodNumber>;
274
+ height: z.ZodOptional<z.ZodNumber>;
275
+ }, "strip", z.ZodTypeAny, {
276
+ url: string;
277
+ altText: string;
278
+ id?: string | undefined;
279
+ width?: number | undefined;
280
+ height?: number | undefined;
281
+ }, {
282
+ url: string;
283
+ altText: string;
284
+ id?: string | undefined;
285
+ width?: number | undefined;
286
+ height?: number | undefined;
287
+ }>>;
288
+ }, "strip", z.ZodTypeAny, {
289
+ options: {
290
+ values: string[];
291
+ id: string;
292
+ name: string;
293
+ }[];
294
+ id: string;
295
+ title: string;
296
+ variants: {
297
+ id: string;
298
+ title: string;
299
+ availableForSale: boolean;
300
+ selectedOptions: {
301
+ value: string;
302
+ name: string;
303
+ }[];
304
+ sku?: string | undefined;
305
+ price?: Money | null | undefined;
306
+ compareAtPrice?: Money | undefined;
307
+ image?: {
308
+ url: string;
309
+ altText: string;
310
+ id?: string | undefined;
311
+ width?: number | undefined;
312
+ height?: number | undefined;
313
+ } | undefined;
314
+ }[];
315
+ images: {
316
+ url: string;
317
+ altText: string;
318
+ id?: string | undefined;
319
+ width?: number | undefined;
320
+ height?: number | undefined;
321
+ }[];
322
+ handle?: string | undefined;
323
+ description?: string | undefined;
324
+ vendor?: string | undefined;
325
+ featuredImage?: {
326
+ url: string;
327
+ altText: string;
328
+ id?: string | undefined;
329
+ width?: number | undefined;
330
+ height?: number | undefined;
331
+ } | undefined;
332
+ }, {
333
+ options: {
334
+ values: string[];
335
+ id: string;
336
+ name: string;
337
+ }[];
338
+ id: string;
339
+ title: string;
340
+ variants: {
341
+ id: string;
342
+ title: string;
343
+ availableForSale: boolean;
344
+ selectedOptions: {
345
+ value: string;
346
+ name: string;
347
+ }[];
348
+ sku?: string | undefined;
349
+ price?: Money | null | undefined;
350
+ compareAtPrice?: Money | undefined;
351
+ image?: {
352
+ url: string;
353
+ altText: string;
354
+ id?: string | undefined;
355
+ width?: number | undefined;
356
+ height?: number | undefined;
357
+ } | undefined;
358
+ }[];
359
+ images: {
360
+ url: string;
361
+ altText: string;
362
+ id?: string | undefined;
363
+ width?: number | undefined;
364
+ height?: number | undefined;
365
+ }[];
366
+ handle?: string | undefined;
367
+ description?: string | undefined;
368
+ vendor?: string | undefined;
369
+ featuredImage?: {
370
+ url: string;
371
+ altText: string;
372
+ id?: string | undefined;
373
+ width?: number | undefined;
374
+ height?: number | undefined;
375
+ } | undefined;
376
+ }>;
377
+ type ProductDetailProductSpec = z.infer<typeof productDetailProductSchema>;
378
+ declare const productOverview1PropsSchema: z.ZodObject<{
379
+ product: z.ZodObject<{
380
+ id: z.ZodString;
381
+ handle: z.ZodOptional<z.ZodString>;
382
+ title: z.ZodString;
383
+ description: z.ZodOptional<z.ZodString>;
384
+ vendor: z.ZodOptional<z.ZodString>;
385
+ options: z.ZodArray<z.ZodObject<{
386
+ id: z.ZodString;
387
+ name: z.ZodString;
388
+ values: z.ZodArray<z.ZodString, "many">;
389
+ }, "strip", z.ZodTypeAny, {
390
+ values: string[];
391
+ id: string;
392
+ name: string;
393
+ }, {
394
+ values: string[];
395
+ id: string;
396
+ name: string;
397
+ }>, "many">;
398
+ variants: z.ZodArray<z.ZodObject<{
399
+ id: z.ZodString;
400
+ title: z.ZodString;
401
+ sku: z.ZodOptional<z.ZodString>;
402
+ availableForSale: z.ZodBoolean;
403
+ selectedOptions: z.ZodArray<z.ZodObject<{
404
+ name: z.ZodString;
405
+ value: z.ZodString;
406
+ }, "strip", z.ZodTypeAny, {
407
+ value: string;
408
+ name: string;
409
+ }, {
410
+ value: string;
411
+ name: string;
412
+ }>, "many">;
413
+ /** Omit or null when the backend has no resolved price (purchase disabled). */
414
+ price: z.ZodOptional<z.ZodNullable<z.ZodType<Money, z.ZodTypeDef, Money>>>;
415
+ compareAtPrice: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
416
+ image: z.ZodOptional<z.ZodObject<{
417
+ id: z.ZodOptional<z.ZodString>;
418
+ url: z.ZodString;
419
+ altText: z.ZodString;
420
+ width: z.ZodOptional<z.ZodNumber>;
421
+ height: z.ZodOptional<z.ZodNumber>;
422
+ }, "strip", z.ZodTypeAny, {
423
+ url: string;
424
+ altText: string;
425
+ id?: string | undefined;
426
+ width?: number | undefined;
427
+ height?: number | undefined;
428
+ }, {
429
+ url: string;
430
+ altText: string;
431
+ id?: string | undefined;
432
+ width?: number | undefined;
433
+ height?: number | undefined;
434
+ }>>;
435
+ }, "strip", z.ZodTypeAny, {
436
+ id: string;
437
+ title: string;
438
+ availableForSale: boolean;
439
+ selectedOptions: {
440
+ value: string;
441
+ name: string;
442
+ }[];
443
+ sku?: string | undefined;
444
+ price?: Money | null | undefined;
445
+ compareAtPrice?: Money | undefined;
446
+ image?: {
447
+ url: string;
448
+ altText: string;
449
+ id?: string | undefined;
450
+ width?: number | undefined;
451
+ height?: number | undefined;
452
+ } | undefined;
453
+ }, {
454
+ id: string;
455
+ title: string;
456
+ availableForSale: boolean;
457
+ selectedOptions: {
458
+ value: string;
459
+ name: string;
460
+ }[];
461
+ sku?: string | undefined;
462
+ price?: Money | null | undefined;
463
+ compareAtPrice?: Money | undefined;
464
+ image?: {
465
+ url: string;
466
+ altText: string;
467
+ id?: string | undefined;
468
+ width?: number | undefined;
469
+ height?: number | undefined;
470
+ } | undefined;
471
+ }>, "many">;
472
+ images: z.ZodArray<z.ZodObject<{
473
+ id: z.ZodOptional<z.ZodString>;
474
+ url: z.ZodString;
475
+ altText: z.ZodString;
476
+ width: z.ZodOptional<z.ZodNumber>;
477
+ height: z.ZodOptional<z.ZodNumber>;
478
+ }, "strip", z.ZodTypeAny, {
479
+ url: string;
480
+ altText: string;
481
+ id?: string | undefined;
482
+ width?: number | undefined;
483
+ height?: number | undefined;
484
+ }, {
485
+ url: string;
486
+ altText: string;
487
+ id?: string | undefined;
488
+ width?: number | undefined;
489
+ height?: number | undefined;
490
+ }>, "many">;
491
+ featuredImage: z.ZodOptional<z.ZodObject<{
492
+ id: z.ZodOptional<z.ZodString>;
493
+ url: z.ZodString;
494
+ altText: z.ZodString;
495
+ width: z.ZodOptional<z.ZodNumber>;
496
+ height: z.ZodOptional<z.ZodNumber>;
497
+ }, "strip", z.ZodTypeAny, {
498
+ url: string;
499
+ altText: string;
500
+ id?: string | undefined;
501
+ width?: number | undefined;
502
+ height?: number | undefined;
503
+ }, {
504
+ url: string;
505
+ altText: string;
506
+ id?: string | undefined;
507
+ width?: number | undefined;
508
+ height?: number | undefined;
509
+ }>>;
510
+ }, "strip", z.ZodTypeAny, {
511
+ options: {
512
+ values: string[];
513
+ id: string;
514
+ name: string;
515
+ }[];
516
+ id: string;
517
+ title: string;
518
+ variants: {
519
+ id: string;
520
+ title: string;
521
+ availableForSale: boolean;
522
+ selectedOptions: {
523
+ value: string;
524
+ name: string;
525
+ }[];
526
+ sku?: string | undefined;
527
+ price?: Money | null | undefined;
528
+ compareAtPrice?: Money | undefined;
529
+ image?: {
530
+ url: string;
531
+ altText: string;
532
+ id?: string | undefined;
533
+ width?: number | undefined;
534
+ height?: number | undefined;
535
+ } | undefined;
536
+ }[];
537
+ images: {
538
+ url: string;
539
+ altText: string;
540
+ id?: string | undefined;
541
+ width?: number | undefined;
542
+ height?: number | undefined;
543
+ }[];
544
+ handle?: string | undefined;
545
+ description?: string | undefined;
546
+ vendor?: string | undefined;
547
+ featuredImage?: {
548
+ url: string;
549
+ altText: string;
550
+ id?: string | undefined;
551
+ width?: number | undefined;
552
+ height?: number | undefined;
553
+ } | undefined;
554
+ }, {
555
+ options: {
556
+ values: string[];
557
+ id: string;
558
+ name: string;
559
+ }[];
560
+ id: string;
561
+ title: string;
562
+ variants: {
563
+ id: string;
564
+ title: string;
565
+ availableForSale: boolean;
566
+ selectedOptions: {
567
+ value: string;
568
+ name: string;
569
+ }[];
570
+ sku?: string | undefined;
571
+ price?: Money | null | undefined;
572
+ compareAtPrice?: Money | undefined;
573
+ image?: {
574
+ url: string;
575
+ altText: string;
576
+ id?: string | undefined;
577
+ width?: number | undefined;
578
+ height?: number | undefined;
579
+ } | undefined;
580
+ }[];
581
+ images: {
582
+ url: string;
583
+ altText: string;
584
+ id?: string | undefined;
585
+ width?: number | undefined;
586
+ height?: number | undefined;
587
+ }[];
588
+ handle?: string | undefined;
589
+ description?: string | undefined;
590
+ vendor?: string | undefined;
591
+ featuredImage?: {
592
+ url: string;
593
+ altText: string;
594
+ id?: string | undefined;
595
+ width?: number | undefined;
596
+ height?: number | undefined;
597
+ } | undefined;
598
+ }>;
599
+ selectedVariantId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
600
+ quantity: z.ZodOptional<z.ZodNumber>;
601
+ rating: z.ZodOptional<z.ZodObject<{
602
+ value: z.ZodNumber;
603
+ count: z.ZodNumber;
604
+ }, "strip", z.ZodTypeAny, {
605
+ value: number;
606
+ count: number;
607
+ }, {
608
+ value: number;
609
+ count: number;
610
+ }>>;
611
+ deliveryEstimate: z.ZodOptional<z.ZodString>;
612
+ shipping: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
613
+ sizesLabel: z.ZodOptional<z.ZodString>;
614
+ variantLabel: z.ZodOptional<z.ZodString>;
615
+ reviewsLabel: z.ZodOptional<z.ZodString>;
616
+ addToCartLabel: z.ZodOptional<z.ZodString>;
617
+ outOfStockLabel: z.ZodOptional<z.ZodString>;
618
+ unavailablePriceLabel: z.ZodOptional<z.ZodString>;
619
+ selectVariantLabel: z.ZodOptional<z.ZodString>;
620
+ quantityLabel: z.ZodOptional<z.ZodString>;
621
+ deliveryEstimateLabel: z.ZodOptional<z.ZodString>;
622
+ shippingLabel: z.ZodOptional<z.ZodString>;
623
+ }, "strip", z.ZodTypeAny, {
624
+ product: {
625
+ options: {
626
+ values: string[];
627
+ id: string;
628
+ name: string;
629
+ }[];
630
+ id: string;
631
+ title: string;
632
+ variants: {
633
+ id: string;
634
+ title: string;
635
+ availableForSale: boolean;
636
+ selectedOptions: {
637
+ value: string;
638
+ name: string;
639
+ }[];
640
+ sku?: string | undefined;
641
+ price?: Money | null | undefined;
642
+ compareAtPrice?: Money | undefined;
643
+ image?: {
644
+ url: string;
645
+ altText: string;
646
+ id?: string | undefined;
647
+ width?: number | undefined;
648
+ height?: number | undefined;
649
+ } | undefined;
650
+ }[];
651
+ images: {
652
+ url: string;
653
+ altText: string;
654
+ id?: string | undefined;
655
+ width?: number | undefined;
656
+ height?: number | undefined;
657
+ }[];
658
+ handle?: string | undefined;
659
+ description?: string | undefined;
660
+ vendor?: string | undefined;
661
+ featuredImage?: {
662
+ url: string;
663
+ altText: string;
664
+ id?: string | undefined;
665
+ width?: number | undefined;
666
+ height?: number | undefined;
667
+ } | undefined;
668
+ };
669
+ selectedVariantId?: string | null | undefined;
670
+ quantity?: number | undefined;
671
+ rating?: {
672
+ value: number;
673
+ count: number;
674
+ } | undefined;
675
+ deliveryEstimate?: string | undefined;
676
+ shipping?: Money | undefined;
677
+ sizesLabel?: string | undefined;
678
+ variantLabel?: string | undefined;
679
+ reviewsLabel?: string | undefined;
680
+ addToCartLabel?: string | undefined;
681
+ outOfStockLabel?: string | undefined;
682
+ unavailablePriceLabel?: string | undefined;
683
+ selectVariantLabel?: string | undefined;
684
+ quantityLabel?: string | undefined;
685
+ deliveryEstimateLabel?: string | undefined;
686
+ shippingLabel?: string | undefined;
687
+ }, {
688
+ product: {
689
+ options: {
690
+ values: string[];
691
+ id: string;
692
+ name: string;
693
+ }[];
694
+ id: string;
695
+ title: string;
696
+ variants: {
697
+ id: string;
698
+ title: string;
699
+ availableForSale: boolean;
700
+ selectedOptions: {
701
+ value: string;
702
+ name: string;
703
+ }[];
704
+ sku?: string | undefined;
705
+ price?: Money | null | undefined;
706
+ compareAtPrice?: Money | undefined;
707
+ image?: {
708
+ url: string;
709
+ altText: string;
710
+ id?: string | undefined;
711
+ width?: number | undefined;
712
+ height?: number | undefined;
713
+ } | undefined;
714
+ }[];
715
+ images: {
716
+ url: string;
717
+ altText: string;
718
+ id?: string | undefined;
719
+ width?: number | undefined;
720
+ height?: number | undefined;
721
+ }[];
722
+ handle?: string | undefined;
723
+ description?: string | undefined;
724
+ vendor?: string | undefined;
725
+ featuredImage?: {
726
+ url: string;
727
+ altText: string;
728
+ id?: string | undefined;
729
+ width?: number | undefined;
730
+ height?: number | undefined;
731
+ } | undefined;
732
+ };
733
+ selectedVariantId?: string | null | undefined;
734
+ quantity?: number | undefined;
735
+ rating?: {
736
+ value: number;
737
+ count: number;
738
+ } | undefined;
739
+ deliveryEstimate?: string | undefined;
740
+ shipping?: Money | undefined;
741
+ sizesLabel?: string | undefined;
742
+ variantLabel?: string | undefined;
743
+ reviewsLabel?: string | undefined;
744
+ addToCartLabel?: string | undefined;
745
+ outOfStockLabel?: string | undefined;
746
+ unavailablePriceLabel?: string | undefined;
747
+ selectVariantLabel?: string | undefined;
748
+ quantityLabel?: string | undefined;
749
+ deliveryEstimateLabel?: string | undefined;
750
+ shippingLabel?: string | undefined;
751
+ }>;
752
+ type ProductOverview1SpecProps = z.infer<typeof productOverview1PropsSchema>;
33
753
  declare const cardProductSchema: z.ZodObject<{
34
754
  id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
35
755
  title: z.ZodString;
@@ -38,19 +758,19 @@ declare const cardProductSchema: z.ZodObject<{
38
758
  image: z.ZodString;
39
759
  badge: z.ZodOptional<z.ZodString>;
40
760
  }, "strip", z.ZodTypeAny, {
41
- title: string;
42
- image: string;
43
761
  id: string | number;
762
+ title: string;
44
763
  price: number;
45
- badge?: string | undefined;
764
+ image: string;
46
765
  originalPrice?: number | undefined;
766
+ badge?: string | undefined;
47
767
  }, {
48
- title: string;
49
- image: string;
50
768
  id: string | number;
769
+ title: string;
51
770
  price: number;
52
- badge?: string | undefined;
771
+ image: string;
53
772
  originalPrice?: number | undefined;
773
+ badge?: string | undefined;
54
774
  }>;
55
775
  type CardProduct = z.infer<typeof cardProductSchema>;
56
776
  declare const cartItemSchema: z.ZodObject<{
@@ -58,39 +778,68 @@ declare const cartItemSchema: z.ZodObject<{
58
778
  name: z.ZodString;
59
779
  price: z.ZodNumber;
60
780
  quantity: z.ZodNumber;
61
- image: z.ZodString;
781
+ /** Optional; absent images are omitted, never serialized as `""`. */
782
+ image: z.ZodOptional<z.ZodString>;
62
783
  variant: z.ZodOptional<z.ZodString>;
784
+ /** Canonical backend per-unit price, preferred for display when present. */
785
+ unitPrice: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
786
+ /** Canonical backend line total, preferred over `price * quantity`. */
787
+ lineTotal: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
63
788
  }, "strip", z.ZodTypeAny, {
64
- image: string;
65
789
  id: string;
66
790
  name: string;
67
791
  price: number;
68
792
  quantity: number;
793
+ image?: string | undefined;
69
794
  variant?: string | undefined;
795
+ unitPrice?: Money | undefined;
796
+ lineTotal?: Money | undefined;
70
797
  }, {
71
- image: string;
72
798
  id: string;
73
799
  name: string;
74
800
  price: number;
75
801
  quantity: number;
802
+ image?: string | undefined;
76
803
  variant?: string | undefined;
804
+ unitPrice?: Money | undefined;
805
+ lineTotal?: Money | undefined;
77
806
  }>;
78
807
  type CartItem = z.infer<typeof cartItemSchema>;
808
+ declare const cartTotalsSchema: z.ZodObject<{
809
+ subtotal: z.ZodType<Money, z.ZodTypeDef, Money>;
810
+ discount: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
811
+ tax: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
812
+ shipping: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
813
+ total: z.ZodType<Money, z.ZodTypeDef, Money>;
814
+ }, "strip", z.ZodTypeAny, {
815
+ subtotal: Money;
816
+ total: Money;
817
+ shipping?: Money | undefined;
818
+ discount?: Money | undefined;
819
+ tax?: Money | undefined;
820
+ }, {
821
+ subtotal: Money;
822
+ total: Money;
823
+ shipping?: Money | undefined;
824
+ discount?: Money | undefined;
825
+ tax?: Money | undefined;
826
+ }>;
827
+ type CartTotals = z.infer<typeof cartTotalsSchema>;
79
828
  declare const recentlyViewedItemSchema: z.ZodObject<{
80
829
  id: z.ZodString;
81
830
  name: z.ZodString;
82
831
  price: z.ZodNumber;
83
832
  image: z.ZodString;
84
833
  }, "strip", z.ZodTypeAny, {
85
- image: string;
86
834
  id: string;
87
835
  name: string;
88
836
  price: number;
89
- }, {
90
837
  image: string;
838
+ }, {
91
839
  id: string;
92
840
  name: string;
93
841
  price: number;
842
+ image: string;
94
843
  }>;
95
844
  type RecentlyViewedItem = z.infer<typeof recentlyViewedItemSchema>;
96
845
  declare const promotionSchema: z.ZodObject<{
@@ -98,9 +847,9 @@ declare const promotionSchema: z.ZodObject<{
98
847
  reward: z.ZodString;
99
848
  icon: z.ZodDefault<z.ZodString>;
100
849
  }, "strip", z.ZodTypeAny, {
101
- icon: string;
102
850
  threshold: number;
103
851
  reward: string;
852
+ icon: string;
104
853
  }, {
105
854
  threshold: number;
106
855
  reward: string;
@@ -128,24 +877,25 @@ type UtilityLink = z.infer<typeof utilityLinkSchema>;
128
877
  declare const navCartItemSchema: z.ZodObject<{
129
878
  id: z.ZodString;
130
879
  name: z.ZodString;
131
- variant: z.ZodString;
880
+ variant: z.ZodOptional<z.ZodString>;
132
881
  price: z.ZodNumber;
133
882
  qty: z.ZodNumber;
134
- image: z.ZodString;
883
+ /** Optional; absent images are omitted, never serialized as `""`. */
884
+ image: z.ZodOptional<z.ZodString>;
135
885
  }, "strip", z.ZodTypeAny, {
136
- variant: string;
137
- image: string;
138
886
  id: string;
139
887
  name: string;
140
888
  price: number;
141
889
  qty: number;
890
+ image?: string | undefined;
891
+ variant?: string | undefined;
142
892
  }, {
143
- variant: string;
144
- image: string;
145
893
  id: string;
146
894
  name: string;
147
895
  price: number;
148
896
  qty: number;
897
+ image?: string | undefined;
898
+ variant?: string | undefined;
149
899
  }>;
150
900
  type NavCartItem = z.infer<typeof navCartItemSchema>;
151
901
  declare const storeUserSchema: z.ZodObject<{
@@ -154,13 +904,13 @@ declare const storeUserSchema: z.ZodObject<{
154
904
  avatar: z.ZodString;
155
905
  initials: z.ZodString;
156
906
  }, "strip", z.ZodTypeAny, {
157
- email: string;
158
907
  name: string;
908
+ email: string;
159
909
  avatar: string;
160
910
  initials: string;
161
911
  }, {
162
- email: string;
163
912
  name: string;
913
+ email: string;
164
914
  avatar: string;
165
915
  initials: string;
166
916
  }>;
@@ -173,13 +923,13 @@ declare const accountMenuItemSchema: z.ZodObject<{
173
923
  }, "strip", z.ZodTypeAny, {
174
924
  label: string;
175
925
  href: string;
176
- icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
177
926
  description?: string | undefined;
927
+ icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
178
928
  }, {
179
929
  label: string;
180
930
  href: string;
181
- icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
182
931
  description?: string | undefined;
932
+ icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
183
933
  }>;
184
934
  type AccountMenuItem = z.infer<typeof accountMenuItemSchema>;
185
935
  /**
@@ -196,26 +946,26 @@ declare const buttonPropsSchema: z.ZodObject<{
196
946
  disabled: z.ZodOptional<z.ZodBoolean>;
197
947
  className: z.ZodOptional<z.ZodString>;
198
948
  }, "strip", z.ZodTypeAny, {
199
- variant?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link" | undefined;
200
- className?: string | undefined;
201
- size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | undefined;
949
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | undefined;
950
+ size?: "icon" | "default" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | undefined;
202
951
  disabled?: boolean | undefined;
203
- }, {
204
- variant?: "default" | "secondary" | "destructive" | "outline" | "ghost" | "link" | undefined;
205
952
  className?: string | undefined;
206
- size?: "default" | "xs" | "sm" | "lg" | "icon" | "icon-xs" | "icon-sm" | "icon-lg" | undefined;
953
+ }, {
954
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | undefined;
955
+ size?: "icon" | "default" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | undefined;
207
956
  disabled?: boolean | undefined;
957
+ className?: string | undefined;
208
958
  }>;
209
959
  type ButtonSpecProps = z.infer<typeof buttonPropsSchema>;
210
960
  declare const storeContainer1PropsSchema: z.ZodObject<{
211
961
  size: z.ZodOptional<z.ZodEnum<["default", "narrow", "wide", "full"]>>;
212
962
  className: z.ZodOptional<z.ZodString>;
213
963
  }, "strip", z.ZodTypeAny, {
214
- className?: string | undefined;
215
964
  size?: "default" | "narrow" | "wide" | "full" | undefined;
216
- }, {
217
965
  className?: string | undefined;
966
+ }, {
218
967
  size?: "default" | "narrow" | "wide" | "full" | undefined;
968
+ className?: string | undefined;
219
969
  }>;
220
970
  type StoreContainer1SpecProps = z.infer<typeof storeContainer1PropsSchema>;
221
971
  declare const productCard1PropsSchema: z.ZodObject<{
@@ -227,41 +977,41 @@ declare const productCard1PropsSchema: z.ZodObject<{
227
977
  image: z.ZodString;
228
978
  badge: z.ZodOptional<z.ZodString>;
229
979
  }, "strip", z.ZodTypeAny, {
230
- title: string;
231
- image: string;
232
980
  id: string | number;
981
+ title: string;
233
982
  price: number;
234
- badge?: string | undefined;
983
+ image: string;
235
984
  originalPrice?: number | undefined;
985
+ badge?: string | undefined;
236
986
  }, {
237
- title: string;
238
- image: string;
239
987
  id: string | number;
988
+ title: string;
240
989
  price: number;
241
- badge?: string | undefined;
990
+ image: string;
242
991
  originalPrice?: number | undefined;
992
+ badge?: string | undefined;
243
993
  }>, "many">;
244
994
  heading: z.ZodOptional<z.ZodString>;
245
995
  maxItems: z.ZodOptional<z.ZodNumber>;
246
996
  }, "strip", z.ZodTypeAny, {
247
997
  products: {
248
- title: string;
249
- image: string;
250
998
  id: string | number;
999
+ title: string;
251
1000
  price: number;
252
- badge?: string | undefined;
1001
+ image: string;
253
1002
  originalPrice?: number | undefined;
1003
+ badge?: string | undefined;
254
1004
  }[];
255
1005
  heading?: string | undefined;
256
1006
  maxItems?: number | undefined;
257
1007
  }, {
258
1008
  products: {
259
- title: string;
260
- image: string;
261
1009
  id: string | number;
1010
+ title: string;
262
1011
  price: number;
263
- badge?: string | undefined;
1012
+ image: string;
264
1013
  originalPrice?: number | undefined;
1014
+ badge?: string | undefined;
265
1015
  }[];
266
1016
  heading?: string | undefined;
267
1017
  maxItems?: number | undefined;
@@ -273,31 +1023,40 @@ declare const shoppingCart4PropsSchema: z.ZodObject<{
273
1023
  name: z.ZodString;
274
1024
  price: z.ZodNumber;
275
1025
  quantity: z.ZodNumber;
276
- image: z.ZodString;
1026
+ /** Optional; absent images are omitted, never serialized as `""`. */
1027
+ image: z.ZodOptional<z.ZodString>;
277
1028
  variant: z.ZodOptional<z.ZodString>;
1029
+ /** Canonical backend per-unit price, preferred for display when present. */
1030
+ unitPrice: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
1031
+ /** Canonical backend line total, preferred over `price * quantity`. */
1032
+ lineTotal: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
278
1033
  }, "strip", z.ZodTypeAny, {
279
- image: string;
280
1034
  id: string;
281
1035
  name: string;
282
1036
  price: number;
283
1037
  quantity: number;
1038
+ image?: string | undefined;
284
1039
  variant?: string | undefined;
1040
+ unitPrice?: Money | undefined;
1041
+ lineTotal?: Money | undefined;
285
1042
  }, {
286
- image: string;
287
1043
  id: string;
288
1044
  name: string;
289
1045
  price: number;
290
1046
  quantity: number;
1047
+ image?: string | undefined;
291
1048
  variant?: string | undefined;
1049
+ unitPrice?: Money | undefined;
1050
+ lineTotal?: Money | undefined;
292
1051
  }>, "many">;
293
1052
  promotions: z.ZodDefault<z.ZodArray<z.ZodObject<{
294
1053
  threshold: z.ZodNumber;
295
1054
  reward: z.ZodString;
296
1055
  icon: z.ZodDefault<z.ZodString>;
297
1056
  }, "strip", z.ZodTypeAny, {
298
- icon: string;
299
1057
  threshold: number;
300
1058
  reward: string;
1059
+ icon: string;
301
1060
  }, {
302
1061
  threshold: number;
303
1062
  reward: string;
@@ -309,23 +1068,50 @@ declare const shoppingCart4PropsSchema: z.ZodObject<{
309
1068
  price: z.ZodNumber;
310
1069
  image: z.ZodString;
311
1070
  }, "strip", z.ZodTypeAny, {
312
- image: string;
313
1071
  id: string;
314
1072
  name: string;
315
1073
  price: number;
316
- }, {
317
1074
  image: string;
1075
+ }, {
318
1076
  id: string;
319
1077
  name: string;
320
1078
  price: number;
1079
+ image: string;
321
1080
  }>, "many">>;
1081
+ /** Backend-authoritative totals; rendered verbatim, never computed locally. */
1082
+ totals: z.ZodOptional<z.ZodObject<{
1083
+ subtotal: z.ZodType<Money, z.ZodTypeDef, Money>;
1084
+ discount: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
1085
+ tax: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
1086
+ shipping: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
1087
+ total: z.ZodType<Money, z.ZodTypeDef, Money>;
1088
+ }, "strip", z.ZodTypeAny, {
1089
+ subtotal: Money;
1090
+ total: Money;
1091
+ shipping?: Money | undefined;
1092
+ discount?: Money | undefined;
1093
+ tax?: Money | undefined;
1094
+ }, {
1095
+ subtotal: Money;
1096
+ total: Money;
1097
+ shipping?: Money | undefined;
1098
+ discount?: Money | undefined;
1099
+ tax?: Money | undefined;
1100
+ }>>;
1101
+ totalsState: z.ZodOptional<z.ZodEnum<["idle", "pending", "error"]>>;
1102
+ totalsErrorLabel: z.ZodOptional<z.ZodString>;
1103
+ totalsUnavailableLabel: z.ZodOptional<z.ZodString>;
1104
+ amountUnavailableLabel: z.ZodOptional<z.ZodString>;
1105
+ retryLabel: z.ZodOptional<z.ZodString>;
322
1106
  taxRate: z.ZodOptional<z.ZodNumber>;
323
1107
  titleLabel: z.ZodOptional<z.ZodString>;
324
1108
  subtotalLabel: z.ZodOptional<z.ZodString>;
1109
+ discountLabel: z.ZodOptional<z.ZodString>;
325
1110
  taxLabel: z.ZodOptional<z.ZodString>;
326
1111
  shippingLabel: z.ZodOptional<z.ZodString>;
327
1112
  shippingFreeLabel: z.ZodOptional<z.ZodString>;
328
1113
  totalLabel: z.ZodOptional<z.ZodString>;
1114
+ totalsPendingLabel: z.ZodOptional<z.ZodString>;
329
1115
  awayFromLabel: z.ZodOptional<z.ZodString>;
330
1116
  activatedLabel: z.ZodOptional<z.ZodString>;
331
1117
  itemsLabel: z.ZodOptional<z.ZodString>;
@@ -340,33 +1126,53 @@ declare const shoppingCart4PropsSchema: z.ZodObject<{
340
1126
  checkoutLabel: z.ZodOptional<z.ZodString>;
341
1127
  quickCheckoutLabel: z.ZodOptional<z.ZodString>;
342
1128
  checkoutNowLabel: z.ZodOptional<z.ZodString>;
1129
+ emptyLabel: z.ZodOptional<z.ZodString>;
1130
+ removeLabel: z.ZodOptional<z.ZodString>;
1131
+ decreaseLabel: z.ZodOptional<z.ZodString>;
1132
+ increaseLabel: z.ZodOptional<z.ZodString>;
343
1133
  }, "strip", z.ZodTypeAny, {
344
1134
  items: {
345
- image: string;
346
1135
  id: string;
347
1136
  name: string;
348
1137
  price: number;
349
1138
  quantity: number;
1139
+ image?: string | undefined;
350
1140
  variant?: string | undefined;
1141
+ unitPrice?: Money | undefined;
1142
+ lineTotal?: Money | undefined;
351
1143
  }[];
352
1144
  promotions: {
353
- icon: string;
354
1145
  threshold: number;
355
1146
  reward: string;
1147
+ icon: string;
356
1148
  }[];
1149
+ shippingLabel?: string | undefined;
357
1150
  recentlyViewed?: {
358
- image: string;
359
1151
  id: string;
360
1152
  name: string;
361
1153
  price: number;
1154
+ image: string;
362
1155
  }[] | undefined;
1156
+ totals?: {
1157
+ subtotal: Money;
1158
+ total: Money;
1159
+ shipping?: Money | undefined;
1160
+ discount?: Money | undefined;
1161
+ tax?: Money | undefined;
1162
+ } | undefined;
1163
+ totalsState?: "idle" | "pending" | "error" | undefined;
1164
+ totalsErrorLabel?: string | undefined;
1165
+ totalsUnavailableLabel?: string | undefined;
1166
+ amountUnavailableLabel?: string | undefined;
1167
+ retryLabel?: string | undefined;
363
1168
  taxRate?: number | undefined;
364
1169
  titleLabel?: string | undefined;
365
1170
  subtotalLabel?: string | undefined;
1171
+ discountLabel?: string | undefined;
366
1172
  taxLabel?: string | undefined;
367
- shippingLabel?: string | undefined;
368
1173
  shippingFreeLabel?: string | undefined;
369
1174
  totalLabel?: string | undefined;
1175
+ totalsPendingLabel?: string | undefined;
370
1176
  awayFromLabel?: string | undefined;
371
1177
  activatedLabel?: string | undefined;
372
1178
  itemsLabel?: string | undefined;
@@ -381,33 +1187,53 @@ declare const shoppingCart4PropsSchema: z.ZodObject<{
381
1187
  checkoutLabel?: string | undefined;
382
1188
  quickCheckoutLabel?: string | undefined;
383
1189
  checkoutNowLabel?: string | undefined;
1190
+ emptyLabel?: string | undefined;
1191
+ removeLabel?: string | undefined;
1192
+ decreaseLabel?: string | undefined;
1193
+ increaseLabel?: string | undefined;
384
1194
  }, {
385
1195
  items: {
386
- image: string;
387
1196
  id: string;
388
1197
  name: string;
389
1198
  price: number;
390
1199
  quantity: number;
1200
+ image?: string | undefined;
391
1201
  variant?: string | undefined;
1202
+ unitPrice?: Money | undefined;
1203
+ lineTotal?: Money | undefined;
392
1204
  }[];
1205
+ shippingLabel?: string | undefined;
393
1206
  promotions?: {
394
1207
  threshold: number;
395
1208
  reward: string;
396
1209
  icon?: string | undefined;
397
1210
  }[] | undefined;
398
1211
  recentlyViewed?: {
399
- image: string;
400
1212
  id: string;
401
1213
  name: string;
402
1214
  price: number;
1215
+ image: string;
403
1216
  }[] | undefined;
1217
+ totals?: {
1218
+ subtotal: Money;
1219
+ total: Money;
1220
+ shipping?: Money | undefined;
1221
+ discount?: Money | undefined;
1222
+ tax?: Money | undefined;
1223
+ } | undefined;
1224
+ totalsState?: "idle" | "pending" | "error" | undefined;
1225
+ totalsErrorLabel?: string | undefined;
1226
+ totalsUnavailableLabel?: string | undefined;
1227
+ amountUnavailableLabel?: string | undefined;
1228
+ retryLabel?: string | undefined;
404
1229
  taxRate?: number | undefined;
405
1230
  titleLabel?: string | undefined;
406
1231
  subtotalLabel?: string | undefined;
1232
+ discountLabel?: string | undefined;
407
1233
  taxLabel?: string | undefined;
408
- shippingLabel?: string | undefined;
409
1234
  shippingFreeLabel?: string | undefined;
410
1235
  totalLabel?: string | undefined;
1236
+ totalsPendingLabel?: string | undefined;
411
1237
  awayFromLabel?: string | undefined;
412
1238
  activatedLabel?: string | undefined;
413
1239
  itemsLabel?: string | undefined;
@@ -422,8 +1248,51 @@ declare const shoppingCart4PropsSchema: z.ZodObject<{
422
1248
  checkoutLabel?: string | undefined;
423
1249
  quickCheckoutLabel?: string | undefined;
424
1250
  checkoutNowLabel?: string | undefined;
1251
+ emptyLabel?: string | undefined;
1252
+ removeLabel?: string | undefined;
1253
+ decreaseLabel?: string | undefined;
1254
+ increaseLabel?: string | undefined;
425
1255
  }>;
426
1256
  type ShoppingCart4SpecProps = z.infer<typeof shoppingCart4PropsSchema>;
1257
+ /**
1258
+ * Optional brand seams shared by the existing blocks. These mirror the
1259
+ * components' optional props as a serializable subset (no React): an accent
1260
+ * marks a trailing segment of the wordmark/brand name, and an editorial image
1261
+ * is a native `<img>` source. Omitting each keeps the block's current output.
1262
+ */
1263
+ declare const logoAccentSchema: z.ZodObject<{
1264
+ text: z.ZodString;
1265
+ className: z.ZodOptional<z.ZodString>;
1266
+ }, "strip", z.ZodTypeAny, {
1267
+ text: string;
1268
+ className?: string | undefined;
1269
+ }, {
1270
+ text: string;
1271
+ className?: string | undefined;
1272
+ }>;
1273
+ type LogoAccent = z.infer<typeof logoAccentSchema>;
1274
+ declare const brandAccentSchema: z.ZodObject<{
1275
+ text: z.ZodString;
1276
+ className: z.ZodOptional<z.ZodString>;
1277
+ }, "strip", z.ZodTypeAny, {
1278
+ text: string;
1279
+ className?: string | undefined;
1280
+ }, {
1281
+ text: string;
1282
+ className?: string | undefined;
1283
+ }>;
1284
+ type BrandAccent = z.infer<typeof brandAccentSchema>;
1285
+ declare const heroImageSchema: z.ZodObject<{
1286
+ src: z.ZodString;
1287
+ alt: z.ZodString;
1288
+ }, "strip", z.ZodTypeAny, {
1289
+ src: string;
1290
+ alt: string;
1291
+ }, {
1292
+ src: string;
1293
+ alt: string;
1294
+ }>;
1295
+ type HeroImage = z.infer<typeof heroImageSchema>;
427
1296
  declare const navbar4PropsSchema: z.ZodObject<{
428
1297
  storeCategories: z.ZodArray<z.ZodType<StoreCategory, z.ZodTypeDef, StoreCategory>, "many">;
429
1298
  shippingNote: z.ZodString;
@@ -439,43 +1308,63 @@ declare const navbar4PropsSchema: z.ZodObject<{
439
1308
  }>, "many">;
440
1309
  logoText: z.ZodString;
441
1310
  logoHref: z.ZodOptional<z.ZodString>;
1311
+ /** Optional accent for a trailing segment of `logoText`; omitted → unchanged. */
1312
+ logoAccent: z.ZodOptional<z.ZodObject<{
1313
+ text: z.ZodString;
1314
+ className: z.ZodOptional<z.ZodString>;
1315
+ }, "strip", z.ZodTypeAny, {
1316
+ text: string;
1317
+ className?: string | undefined;
1318
+ }, {
1319
+ text: string;
1320
+ className?: string | undefined;
1321
+ }>>;
1322
+ /**
1323
+ * Consumer-supplied classes merged onto the block's outer surface as the
1324
+ * final argument (e.g. a semantic surface token). Omitted → unchanged.
1325
+ */
1326
+ className: z.ZodOptional<z.ZodString>;
442
1327
  accountHref: z.ZodOptional<z.ZodString>;
443
1328
  searchQuery: z.ZodOptional<z.ZodString>;
444
1329
  items: z.ZodOptional<z.ZodArray<z.ZodObject<{
445
1330
  id: z.ZodString;
446
1331
  name: z.ZodString;
447
- variant: z.ZodString;
1332
+ variant: z.ZodOptional<z.ZodString>;
448
1333
  price: z.ZodNumber;
449
1334
  qty: z.ZodNumber;
450
- image: z.ZodString;
1335
+ /** Optional; absent images are omitted, never serialized as `""`. */
1336
+ image: z.ZodOptional<z.ZodString>;
451
1337
  }, "strip", z.ZodTypeAny, {
452
- variant: string;
453
- image: string;
454
1338
  id: string;
455
1339
  name: string;
456
1340
  price: number;
457
1341
  qty: number;
1342
+ image?: string | undefined;
1343
+ variant?: string | undefined;
458
1344
  }, {
459
- variant: string;
460
- image: string;
461
1345
  id: string;
462
1346
  name: string;
463
1347
  price: number;
464
1348
  qty: number;
1349
+ image?: string | undefined;
1350
+ variant?: string | undefined;
465
1351
  }>, "many">>;
1352
+ /** Authoritative backend subtotal for the mini-cart. */
1353
+ subtotal: z.ZodOptional<z.ZodType<Money, z.ZodTypeDef, Money>>;
1354
+ subtotalUnavailableLabel: z.ZodOptional<z.ZodString>;
466
1355
  user: z.ZodOptional<z.ZodObject<{
467
1356
  name: z.ZodString;
468
1357
  email: z.ZodString;
469
1358
  avatar: z.ZodString;
470
1359
  initials: z.ZodString;
471
1360
  }, "strip", z.ZodTypeAny, {
472
- email: string;
473
1361
  name: string;
1362
+ email: string;
474
1363
  avatar: string;
475
1364
  initials: string;
476
1365
  }, {
477
- email: string;
478
1366
  name: string;
1367
+ email: string;
479
1368
  avatar: string;
480
1369
  initials: string;
481
1370
  }>>;
@@ -487,77 +1376,209 @@ declare const navbar4PropsSchema: z.ZodObject<{
487
1376
  }, "strip", z.ZodTypeAny, {
488
1377
  label: string;
489
1378
  href: string;
490
- icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
491
1379
  description?: string | undefined;
1380
+ icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
492
1381
  }, {
493
1382
  label: string;
494
1383
  href: string;
495
- icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
496
1384
  description?: string | undefined;
1385
+ icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
497
1386
  }>, "many">>;
498
1387
  }, "strip", z.ZodTypeAny, {
499
- logoText: string;
500
1388
  storeCategories: StoreCategory[];
1389
+ shippingNote: string;
501
1390
  utilityLinks: {
502
1391
  label: string;
503
1392
  href: string;
504
1393
  }[];
505
- shippingNote: string;
506
- logoHref?: string | undefined;
507
- user?: {
508
- email: string;
509
- name: string;
510
- avatar: string;
511
- initials: string;
512
- } | undefined;
1394
+ logoText: string;
1395
+ subtotal?: Money | undefined;
1396
+ className?: string | undefined;
513
1397
  items?: {
514
- variant: string;
515
- image: string;
516
1398
  id: string;
517
1399
  name: string;
518
1400
  price: number;
519
1401
  qty: number;
1402
+ image?: string | undefined;
1403
+ variant?: string | undefined;
520
1404
  }[] | undefined;
1405
+ logoHref?: string | undefined;
1406
+ logoAccent?: {
1407
+ text: string;
1408
+ className?: string | undefined;
1409
+ } | undefined;
521
1410
  accountHref?: string | undefined;
522
1411
  searchQuery?: string | undefined;
1412
+ subtotalUnavailableLabel?: string | undefined;
1413
+ user?: {
1414
+ name: string;
1415
+ email: string;
1416
+ avatar: string;
1417
+ initials: string;
1418
+ } | undefined;
523
1419
  accountMenuItems?: {
524
1420
  label: string;
525
1421
  href: string;
526
- icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
527
1422
  description?: string | undefined;
1423
+ icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
528
1424
  }[] | undefined;
529
1425
  }, {
530
- logoText: string;
531
1426
  storeCategories: StoreCategory[];
1427
+ shippingNote: string;
532
1428
  utilityLinks: {
533
1429
  label: string;
534
1430
  href: string;
535
1431
  }[];
536
- shippingNote: string;
537
- logoHref?: string | undefined;
538
- user?: {
539
- email: string;
540
- name: string;
541
- avatar: string;
542
- initials: string;
543
- } | undefined;
1432
+ logoText: string;
1433
+ subtotal?: Money | undefined;
1434
+ className?: string | undefined;
544
1435
  items?: {
545
- variant: string;
546
- image: string;
547
1436
  id: string;
548
1437
  name: string;
549
1438
  price: number;
550
1439
  qty: number;
1440
+ image?: string | undefined;
1441
+ variant?: string | undefined;
551
1442
  }[] | undefined;
1443
+ logoHref?: string | undefined;
1444
+ logoAccent?: {
1445
+ text: string;
1446
+ className?: string | undefined;
1447
+ } | undefined;
552
1448
  accountHref?: string | undefined;
553
1449
  searchQuery?: string | undefined;
1450
+ subtotalUnavailableLabel?: string | undefined;
1451
+ user?: {
1452
+ name: string;
1453
+ email: string;
1454
+ avatar: string;
1455
+ initials: string;
1456
+ } | undefined;
554
1457
  accountMenuItems?: {
555
1458
  label: string;
556
1459
  href: string;
557
- icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
558
1460
  description?: string | undefined;
1461
+ icon?: "orders" | "wishlist" | "addresses" | "settings" | undefined;
559
1462
  }[] | undefined;
560
1463
  }>;
561
1464
  type Navbar4SpecProps = z.infer<typeof navbar4PropsSchema>;
1465
+ /**
1466
+ * Serializable contracts for the two bounded editorial sections (`faq`, `cta`).
1467
+ * These are the serializable subset of `FaqBlock1Props`/`CtaSection1Props`: the
1468
+ * React-only callbacks (`onPrimaryClick`/`onSecondaryClick`) are intentionally
1469
+ * excluded — the catalog adapter binds them (see design D3).
1470
+ */
1471
+ declare const ctaSchema: z.ZodObject<{
1472
+ label: z.ZodString;
1473
+ href: z.ZodOptional<z.ZodString>;
1474
+ }, "strip", z.ZodTypeAny, {
1475
+ label: string;
1476
+ href?: string | undefined;
1477
+ }, {
1478
+ label: string;
1479
+ href?: string | undefined;
1480
+ }>;
1481
+ type CtaSpec = z.infer<typeof ctaSchema>;
1482
+ declare const faqItemSchema: z.ZodObject<{
1483
+ value: z.ZodString;
1484
+ question: z.ZodString;
1485
+ answer: z.ZodString;
1486
+ }, "strip", z.ZodTypeAny, {
1487
+ value: string;
1488
+ question: string;
1489
+ answer: string;
1490
+ }, {
1491
+ value: string;
1492
+ question: string;
1493
+ answer: string;
1494
+ }>;
1495
+ type FaqItemSpec = z.infer<typeof faqItemSchema>;
1496
+ declare const faqBlock1PropsSchema: z.ZodObject<{
1497
+ items: z.ZodArray<z.ZodObject<{
1498
+ value: z.ZodString;
1499
+ question: z.ZodString;
1500
+ answer: z.ZodString;
1501
+ }, "strip", z.ZodTypeAny, {
1502
+ value: string;
1503
+ question: string;
1504
+ answer: string;
1505
+ }, {
1506
+ value: string;
1507
+ question: string;
1508
+ answer: string;
1509
+ }>, "many">;
1510
+ title: z.ZodOptional<z.ZodString>;
1511
+ description: z.ZodOptional<z.ZodString>;
1512
+ accordionType: z.ZodOptional<z.ZodEnum<["single", "multiple"]>>;
1513
+ }, "strip", z.ZodTypeAny, {
1514
+ items: {
1515
+ value: string;
1516
+ question: string;
1517
+ answer: string;
1518
+ }[];
1519
+ title?: string | undefined;
1520
+ description?: string | undefined;
1521
+ accordionType?: "single" | "multiple" | undefined;
1522
+ }, {
1523
+ items: {
1524
+ value: string;
1525
+ question: string;
1526
+ answer: string;
1527
+ }[];
1528
+ title?: string | undefined;
1529
+ description?: string | undefined;
1530
+ accordionType?: "single" | "multiple" | undefined;
1531
+ }>;
1532
+ type FaqBlock1SpecProps = z.infer<typeof faqBlock1PropsSchema>;
1533
+ declare const ctaSection1PropsSchema: z.ZodObject<{
1534
+ badgeText: z.ZodOptional<z.ZodString>;
1535
+ title: z.ZodOptional<z.ZodString>;
1536
+ description: z.ZodOptional<z.ZodString>;
1537
+ primaryCta: z.ZodOptional<z.ZodObject<{
1538
+ label: z.ZodString;
1539
+ href: z.ZodOptional<z.ZodString>;
1540
+ }, "strip", z.ZodTypeAny, {
1541
+ label: string;
1542
+ href?: string | undefined;
1543
+ }, {
1544
+ label: string;
1545
+ href?: string | undefined;
1546
+ }>>;
1547
+ secondaryCta: z.ZodOptional<z.ZodObject<{
1548
+ label: z.ZodString;
1549
+ href: z.ZodOptional<z.ZodString>;
1550
+ }, "strip", z.ZodTypeAny, {
1551
+ label: string;
1552
+ href?: string | undefined;
1553
+ }, {
1554
+ label: string;
1555
+ href?: string | undefined;
1556
+ }>>;
1557
+ }, "strip", z.ZodTypeAny, {
1558
+ title?: string | undefined;
1559
+ description?: string | undefined;
1560
+ badgeText?: string | undefined;
1561
+ primaryCta?: {
1562
+ label: string;
1563
+ href?: string | undefined;
1564
+ } | undefined;
1565
+ secondaryCta?: {
1566
+ label: string;
1567
+ href?: string | undefined;
1568
+ } | undefined;
1569
+ }, {
1570
+ title?: string | undefined;
1571
+ description?: string | undefined;
1572
+ badgeText?: string | undefined;
1573
+ primaryCta?: {
1574
+ label: string;
1575
+ href?: string | undefined;
1576
+ } | undefined;
1577
+ secondaryCta?: {
1578
+ label: string;
1579
+ href?: string | undefined;
1580
+ } | undefined;
1581
+ }>;
1582
+ type CtaSection1SpecProps = z.infer<typeof ctaSection1PropsSchema>;
562
1583
 
563
- export { type AccountMenuItem, type ButtonSpecProps, type CanonMoney, type CanonProduct, type CardProduct, type CartItem, type NavCartItem, type Navbar4SpecProps, PRODUCT_IMAGE_FALLBACK, type ProductCard1SpecProps, type Promotion, type RecentlyViewedItem, type ShoppingCart4SpecProps, type StoreCategory, type StoreContainer1SpecProps, type StoreUser, type UtilityLink, accountMenuItemSchema, buttonPropsSchema, cardProductSchema, cartItemSchema, navCartItemSchema, navbar4PropsSchema, paymentMethodSchema, productCard1PropsSchema, promotionSchema, recentlyViewedItemSchema, shoppingCart4PropsSchema, storeCategorySchema, storeContainer1PropsSchema, storeUserSchema, utilityLinkSchema };
1584
+ export { type AccountMenuItem, type BrandAccent, type ButtonSpecProps, type CanonMoney, type CanonProduct, type CardProduct, type CartItem, type CartTotals, type CtaSection1SpecProps, type CtaSpec, type FaqBlock1SpecProps, type FaqItemSpec, type HeroImage, type LogoAccent, type NavCartItem, type Navbar4SpecProps, PRODUCT_IMAGE_FALLBACK, type ProductCard1SpecProps, type ProductDetailProductSpec, type ProductDetailVariantSpec, type ProductOverview1SpecProps, type Promotion, type RecentlyViewedItem, type ShoppingCart4SpecProps, type StoreCategory, type StoreContainer1SpecProps, type StoreUser, type UtilityLink, accountMenuItemSchema, brandAccentSchema, buttonPropsSchema, cardProductSchema, cartItemSchema, cartTotalsSchema, ctaSchema, ctaSection1PropsSchema, faqBlock1PropsSchema, faqItemSchema, formatMoney, heroImageSchema, isAvailableMoney, isCompleteFiniteDecimal, logoAccentSchema, moneySchema, navCartItemSchema, navbar4PropsSchema, paymentMethodSchema, productCard1PropsSchema, productDetailProductSchema, productDetailVariantSchema, productOverview1PropsSchema, promotionSchema, recentlyViewedItemSchema, resolveAbsoluteQuantity, shoppingCart4PropsSchema, storeCategorySchema, storeContainer1PropsSchema, storeUserSchema, utilityLinkSchema };