@fayz-ai/storefront 0.2.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 (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +39 -0
  3. package/dist/auth.d.ts +29 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/blocks.d.ts +6 -0
  6. package/dist/blocks.d.ts.map +1 -0
  7. package/dist/components/CartDrawer.d.ts +3 -0
  8. package/dist/components/CartDrawer.d.ts.map +1 -0
  9. package/dist/components/CustomerAccountShell.d.ts +13 -0
  10. package/dist/components/CustomerAccountShell.d.ts.map +1 -0
  11. package/dist/components/FiltersPanel.d.ts +3 -0
  12. package/dist/components/FiltersPanel.d.ts.map +1 -0
  13. package/dist/components/OrderTrackingTimeline.d.ts +7 -0
  14. package/dist/components/OrderTrackingTimeline.d.ts.map +1 -0
  15. package/dist/components/Price.d.ts +11 -0
  16. package/dist/components/Price.d.ts.map +1 -0
  17. package/dist/components/ProductCard.d.ts +7 -0
  18. package/dist/components/ProductCard.d.ts.map +1 -0
  19. package/dist/components/ProductGrid.d.ts +7 -0
  20. package/dist/components/ProductGrid.d.ts.map +1 -0
  21. package/dist/components/ProductOptionSelector.d.ts +9 -0
  22. package/dist/components/ProductOptionSelector.d.ts.map +1 -0
  23. package/dist/components/ProductSpecs.d.ts +8 -0
  24. package/dist/components/ProductSpecs.d.ts.map +1 -0
  25. package/dist/components/QuantityInput.d.ts +12 -0
  26. package/dist/components/QuantityInput.d.ts.map +1 -0
  27. package/dist/components/RelatedProducts.d.ts +9 -0
  28. package/dist/components/RelatedProducts.d.ts.map +1 -0
  29. package/dist/components/SignInModal.d.ts +19 -0
  30. package/dist/components/SignInModal.d.ts.map +1 -0
  31. package/dist/components/StorefrontErrorBoundary.d.ts +20 -0
  32. package/dist/components/StorefrontErrorBoundary.d.ts.map +1 -0
  33. package/dist/components/StorefrontFooter.d.ts +3 -0
  34. package/dist/components/StorefrontFooter.d.ts.map +1 -0
  35. package/dist/components/StorefrontHeader.d.ts +3 -0
  36. package/dist/components/StorefrontHeader.d.ts.map +1 -0
  37. package/dist/components/Toaster.d.ts +3 -0
  38. package/dist/components/Toaster.d.ts.map +1 -0
  39. package/dist/components/sections/CategoryShowcase.d.ts +6 -0
  40. package/dist/components/sections/CategoryShowcase.d.ts.map +1 -0
  41. package/dist/components/sections/HeroSection.d.ts +9 -0
  42. package/dist/components/sections/HeroSection.d.ts.map +1 -0
  43. package/dist/components/sections/MiscSections.d.ts +33 -0
  44. package/dist/components/sections/MiscSections.d.ts.map +1 -0
  45. package/dist/components/sections/ProductRail.d.ts +9 -0
  46. package/dist/components/sections/ProductRail.d.ts.map +1 -0
  47. package/dist/config.d.ts +149 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/createStorefrontApp.d.ts +16 -0
  50. package/dist/createStorefrontApp.d.ts.map +1 -0
  51. package/dist/format.d.ts +3 -0
  52. package/dist/format.d.ts.map +1 -0
  53. package/dist/hooks/index.d.ts +6 -0
  54. package/dist/hooks/index.d.ts.map +1 -0
  55. package/dist/hooks/useCategories.d.ts +6 -0
  56. package/dist/hooks/useCategories.d.ts.map +1 -0
  57. package/dist/hooks/useDiscountValidator.d.ts +14 -0
  58. package/dist/hooks/useDiscountValidator.d.ts.map +1 -0
  59. package/dist/hooks/useMyOrders.d.ts +7 -0
  60. package/dist/hooks/useMyOrders.d.ts.map +1 -0
  61. package/dist/hooks/useProduct.d.ts +7 -0
  62. package/dist/hooks/useProduct.d.ts.map +1 -0
  63. package/dist/hooks/useProducts.d.ts +8 -0
  64. package/dist/hooks/useProducts.d.ts.map +1 -0
  65. package/dist/hooks/useStorefrontHead.d.ts +11 -0
  66. package/dist/hooks/useStorefrontHead.d.ts.map +1 -0
  67. package/dist/index.cjs +4186 -0
  68. package/dist/index.cjs.map +1 -0
  69. package/dist/index.d.ts +55 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +4085 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/motion.d.ts +19 -0
  74. package/dist/motion.d.ts.map +1 -0
  75. package/dist/order-status.d.ts +10 -0
  76. package/dist/order-status.d.ts.map +1 -0
  77. package/dist/pages/CatalogPage.d.ts +3 -0
  78. package/dist/pages/CatalogPage.d.ts.map +1 -0
  79. package/dist/pages/CheckoutPage.d.ts +3 -0
  80. package/dist/pages/CheckoutPage.d.ts.map +1 -0
  81. package/dist/pages/HomePage.d.ts +6 -0
  82. package/dist/pages/HomePage.d.ts.map +1 -0
  83. package/dist/pages/MyPurchasesPage.d.ts +3 -0
  84. package/dist/pages/MyPurchasesPage.d.ts.map +1 -0
  85. package/dist/pages/NotFoundPage.d.ts +4 -0
  86. package/dist/pages/NotFoundPage.d.ts.map +1 -0
  87. package/dist/pages/OrderConfirmationPage.d.ts +5 -0
  88. package/dist/pages/OrderConfirmationPage.d.ts.map +1 -0
  89. package/dist/pages/PolicyPage.d.ts +15 -0
  90. package/dist/pages/PolicyPage.d.ts.map +1 -0
  91. package/dist/pages/ProductDetailPage.d.ts +5 -0
  92. package/dist/pages/ProductDetailPage.d.ts.map +1 -0
  93. package/dist/presets.d.ts +33 -0
  94. package/dist/presets.d.ts.map +1 -0
  95. package/dist/product-options.d.ts +12 -0
  96. package/dist/product-options.d.ts.map +1 -0
  97. package/dist/router.d.ts +285 -0
  98. package/dist/router.d.ts.map +1 -0
  99. package/dist/scaffold.d.ts +14 -0
  100. package/dist/scaffold.d.ts.map +1 -0
  101. package/dist/sections.d.ts +84 -0
  102. package/dist/sections.d.ts.map +1 -0
  103. package/dist/slot-contracts.d.ts +34 -0
  104. package/dist/slot-contracts.d.ts.map +1 -0
  105. package/dist/stores/cart.store.d.ts +58 -0
  106. package/dist/stores/cart.store.d.ts.map +1 -0
  107. package/dist/stores/catalog.store.d.ts +18 -0
  108. package/dist/stores/catalog.store.d.ts.map +1 -0
  109. package/dist/stores/session.store.d.ts +23 -0
  110. package/dist/stores/session.store.d.ts.map +1 -0
  111. package/dist/stores/toast.store.d.ts +27 -0
  112. package/dist/stores/toast.store.d.ts.map +1 -0
  113. package/dist/testids.d.ts +93 -0
  114. package/dist/testids.d.ts.map +1 -0
  115. package/dist/theme.d.ts +59 -0
  116. package/dist/theme.d.ts.map +1 -0
  117. package/dist/workflows/checkout.d.ts +33 -0
  118. package/dist/workflows/checkout.d.ts.map +1 -0
  119. package/package.json +56 -0
  120. package/src/auth.ts +134 -0
  121. package/src/blocks.tsx +47 -0
  122. package/src/components/CartDrawer.tsx +250 -0
  123. package/src/components/CustomerAccountShell.tsx +102 -0
  124. package/src/components/FiltersPanel.tsx +109 -0
  125. package/src/components/OrderTrackingTimeline.tsx +135 -0
  126. package/src/components/Price.tsx +32 -0
  127. package/src/components/ProductCard.tsx +104 -0
  128. package/src/components/ProductGrid.tsx +34 -0
  129. package/src/components/ProductOptionSelector.tsx +50 -0
  130. package/src/components/ProductSpecs.tsx +75 -0
  131. package/src/components/QuantityInput.tsx +52 -0
  132. package/src/components/RelatedProducts.tsx +31 -0
  133. package/src/components/SignInModal.tsx +120 -0
  134. package/src/components/StorefrontErrorBoundary.tsx +51 -0
  135. package/src/components/StorefrontFooter.tsx +100 -0
  136. package/src/components/StorefrontHeader.tsx +342 -0
  137. package/src/components/Toaster.tsx +60 -0
  138. package/src/components/sections/CategoryShowcase.tsx +79 -0
  139. package/src/components/sections/HeroSection.tsx +177 -0
  140. package/src/components/sections/MiscSections.tsx +157 -0
  141. package/src/components/sections/ProductRail.tsx +73 -0
  142. package/src/config.ts +176 -0
  143. package/src/createStorefrontApp.tsx +171 -0
  144. package/src/format.ts +7 -0
  145. package/src/hooks/index.ts +5 -0
  146. package/src/hooks/useCategories.ts +26 -0
  147. package/src/hooks/useDiscountValidator.ts +43 -0
  148. package/src/hooks/useMyOrders.ts +41 -0
  149. package/src/hooks/useProduct.ts +36 -0
  150. package/src/hooks/useProducts.ts +39 -0
  151. package/src/hooks/useStorefrontHead.ts +25 -0
  152. package/src/index.ts +132 -0
  153. package/src/motion.tsx +94 -0
  154. package/src/order-status.ts +33 -0
  155. package/src/pages/CatalogPage.tsx +118 -0
  156. package/src/pages/CheckoutPage.tsx +578 -0
  157. package/src/pages/HomePage.tsx +12 -0
  158. package/src/pages/MyPurchasesPage.tsx +310 -0
  159. package/src/pages/NotFoundPage.tsx +25 -0
  160. package/src/pages/OrderConfirmationPage.tsx +189 -0
  161. package/src/pages/PolicyPage.tsx +47 -0
  162. package/src/pages/ProductDetailPage.tsx +184 -0
  163. package/src/presets.ts +258 -0
  164. package/src/product-options.ts +63 -0
  165. package/src/router.ts +49 -0
  166. package/src/scaffold.tsx +109 -0
  167. package/src/sections.ts +69 -0
  168. package/src/slot-contracts.ts +20 -0
  169. package/src/stores/cart.store.ts +149 -0
  170. package/src/stores/catalog.store.ts +39 -0
  171. package/src/stores/session.store.ts +28 -0
  172. package/src/stores/toast.store.ts +43 -0
  173. package/src/testids.ts +103 -0
  174. package/src/theme.ts +160 -0
  175. package/src/workflows/checkout.ts +91 -0
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ export declare function prefersReducedMotion(): boolean;
3
+ /** True once the element has entered the viewport (one-shot). */
4
+ export declare function useInView<T extends HTMLElement>(margin?: string): [React.RefObject<T>, boolean];
5
+ export interface RevealProps extends React.HTMLAttributes<HTMLDivElement> {
6
+ /** Stagger delay in ms */
7
+ delay?: number;
8
+ children: React.ReactNode;
9
+ }
10
+ /** Plays a fade-up entrance when the element scrolls into view.
11
+ * Content is VISIBLE by default — never pre-hidden — so screenshots,
12
+ * crawlers and environments without IntersectionObserver always see it;
13
+ * the animation's own from-state handles the fade. */
14
+ export declare function Reveal({ delay, children, className, style, ...rest }: RevealProps): React.JSX.Element;
15
+ /** True after the window has scrolled past the threshold (header treatments). */
16
+ export declare function useScrolled(threshold?: number): boolean;
17
+ /** Re-triggers a CSS animation class whenever `value` changes (cart badge pop). */
18
+ export declare function usePopOnChange(value: number): boolean;
19
+ //# sourceMappingURL=motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../src/motion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAA;AAO1D,wBAAgB,oBAAoB,IAAI,OAAO,CAG9C;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,MAAM,SAAoB,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAyB1G;AAED,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACvE,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;uDAGuD;AACvD,wBAAgB,MAAM,CAAC,EAAE,KAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,qBAYrF;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,SAAS,SAAI,GAAG,OAAO,CASlD;AAED,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAgBrD"}
@@ -0,0 +1,10 @@
1
+ import type { FinancialStatus } from '@fayz-ai/shop/types';
2
+ /** One source of truth for a financial-status pill — label + color by status,
3
+ * so a pending or refunded order never renders inside a green "success" pill. */
4
+ export declare function financialStatusBadge(status: FinancialStatus): {
5
+ label: string;
6
+ className: string;
7
+ };
8
+ export declare function isPaid(status: FinancialStatus): boolean;
9
+ export declare function isRefunded(status: FinancialStatus): boolean;
10
+ //# sourceMappingURL=order-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order-status.d.ts","sourceRoot":"","sources":["../src/order-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAmB1D;kFACkF;AAClF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAGlG;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAEvD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAE3D"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function CatalogPage(): React.JSX.Element;
3
+ //# sourceMappingURL=CatalogPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CatalogPage.d.ts","sourceRoot":"","sources":["../../src/pages/CatalogPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqC,MAAM,OAAO,CAAA;AA0DzD,wBAAgB,WAAW,sBA2D1B"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function CheckoutPage(): React.JSX.Element;
3
+ //# sourceMappingURL=CheckoutPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckoutPage.d.ts","sourceRoot":"","sources":["../../src/pages/CheckoutPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AA+FlD,wBAAgB,YAAY,sBAke3B"}
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { HomeSection } from '../sections';
3
+ export declare function HomePage({ sections }: {
4
+ sections: HomeSection[];
5
+ }): React.JSX.Element;
6
+ //# sourceMappingURL=HomePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HomePage.d.ts","sourceRoot":"","sources":["../../src/pages/HomePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAO9C,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;CAAE,qBAEjE"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function MyPurchasesPage(): React.JSX.Element;
3
+ //# sourceMappingURL=MyPurchasesPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MyPurchasesPage.d.ts","sourceRoot":"","sources":["../../src/pages/MyPurchasesPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAA;AA0RvC,wBAAgB,eAAe,sBA2B9B"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ /** Fallback for unknown routes. Previously these silently rendered the home/catalog page with a 200. */
3
+ export declare function NotFoundPage(): React.JSX.Element;
4
+ //# sourceMappingURL=NotFoundPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotFoundPage.d.ts","sourceRoot":"","sources":["../../src/pages/NotFoundPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,wGAAwG;AACxG,wBAAgB,YAAY,sBAkB3B"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare function OrderConfirmationPage({ orderId }: {
3
+ orderId: string;
4
+ }): React.JSX.Element;
5
+ //# sourceMappingURL=OrderConfirmationPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrderConfirmationPage.d.ts","sourceRoot":"","sources":["../../src/pages/OrderConfirmationPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAmDlD,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,qBAyIrE"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ declare const TITLES: {
3
+ readonly privacy: "Política de Privacidade";
4
+ readonly terms: "Termos de Uso";
5
+ readonly returns: "Trocas e Devoluções";
6
+ };
7
+ export type PolicyKind = keyof typeof TITLES;
8
+ /** Institutional/legal pages. Content comes from config.legal; absent pages show
9
+ * a placeholder so the routes + footer links exist (no 404) before the store
10
+ * publishes its policy — a payment-processor / go-live requirement. */
11
+ export declare function PolicyPage({ kind }: {
12
+ kind: PolicyKind;
13
+ }): React.JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=PolicyPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PolicyPage.d.ts","sourceRoot":"","sources":["../../src/pages/PolicyPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,QAAA,MAAM,MAAM;;;;CAIF,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,MAAM,CAAA;AAE5C;;wEAEwE;AACxE,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,qBA8BxD"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare function ProductDetailPage({ slug }: {
3
+ slug: string;
4
+ }): React.JSX.Element;
5
+ //# sourceMappingURL=ProductDetailPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductDetailPage.d.ts","sourceRoot":"","sources":["../../src/pages/ProductDetailPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAelD,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,qBAwK3D"}
@@ -0,0 +1,33 @@
1
+ import type { StorefrontTheme } from './theme';
2
+ import type { HomeConfig } from './sections';
3
+ /** Real imagery for a template home — resolved at build time (e.g. via
4
+ * scripts/fetch-unsplash.mjs); falls back to gradient placeholders when omitted. */
5
+ export interface TemplateImages {
6
+ hero?: Array<string | undefined>;
7
+ banners?: Array<string | undefined>;
8
+ }
9
+ export interface StorefrontTemplate {
10
+ id: string;
11
+ /** The Nuvemshop pattern this recreates */
12
+ inspiration: string;
13
+ theme: StorefrontTheme;
14
+ /** Default home blueprint — pass the store name for copy interpolation */
15
+ home: (storeName: string, images?: TemplateImages) => HomeConfig;
16
+ announcement?: string;
17
+ }
18
+ /** maré — elegant fashion (Rio): airy warm paper, olive ink, sand CTA, centered logo. */
19
+ export declare const mareTemplate: StorefrontTemplate;
20
+ /** sertão — editorial organic (Uyuni): cream paper, coffee serif ink, boxed hero, manifesto. */
21
+ export declare const sertaoTemplate: StorefrontTemplate;
22
+ /** volt — bold tech (Brasília): white canvas, near-black ink, vivid CTA, dark search-first header, split hero. */
23
+ export declare const voltTemplate: StorefrontTemplate;
24
+ /** atelier — classic premium retail (Flex): white, near-black, gold accent, slider hero, trust badges. */
25
+ export declare const atelierTemplate: StorefrontTemplate;
26
+ export declare const storefrontTemplates: {
27
+ readonly mare: StorefrontTemplate;
28
+ readonly sertao: StorefrontTemplate;
29
+ readonly volt: StorefrontTemplate;
30
+ readonly atelier: StorefrontTemplate;
31
+ };
32
+ export type StorefrontTemplateId = keyof typeof storefrontTemplates;
33
+ //# sourceMappingURL=presets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAS5C;qFACqF;AACrF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,eAAe,CAAA;IACtB,0EAA0E;IAC1E,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,KAAK,UAAU,CAAA;IAChE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,yFAAyF;AACzF,eAAO,MAAM,YAAY,EAAE,kBA0C1B,CAAA;AAED,gGAAgG;AAChG,eAAO,MAAM,cAAc,EAAE,kBA2D5B,CAAA;AAED,kHAAkH;AAClH,eAAO,MAAM,YAAY,EAAE,kBAkD1B,CAAA;AAED,0GAA0G;AAC1G,eAAO,MAAM,eAAe,EAAE,kBA4D7B,CAAA;AAED,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAA;AAEV,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,mBAAmB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { Product } from '@fayz-ai/shop/types';
2
+ export interface ProductOptionGroup {
3
+ id: string;
4
+ label: string;
5
+ values: string[];
6
+ }
7
+ export type ProductOptionSelection = Record<string, string>;
8
+ export declare function getProductOptionGroups(product: Product): ProductOptionGroup[];
9
+ export declare function normalizeProductOptionSelection(selection?: ProductOptionSelection | null): ProductOptionSelection;
10
+ export declare function formatProductOptionSelection(selection?: ProductOptionSelection | null): string;
11
+ export declare function productOptionSelectionKey(selection?: ProductOptionSelection | null): string;
12
+ //# sourceMappingURL=product-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-options.d.ts","sourceRoot":"","sources":["../src/product-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAiB3D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,EAAE,CAgB7E;AAED,wBAAgB,+BAA+B,CAAC,SAAS,CAAC,EAAE,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,CAOjH;AAED,wBAAgB,4BAA4B,CAAC,SAAS,CAAC,EAAE,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAI9F;AAED,wBAAgB,yBAAyB,CAAC,SAAS,CAAC,EAAE,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAI3F"}
@@ -0,0 +1,285 @@
1
+ import React from 'react';
2
+ export declare function navigateTo(to: string): void;
3
+ export declare function useHashPath(): string;
4
+ /** Match '/product/:slug' against '/product/leather-backpack' → { slug: 'leather-backpack' } */
5
+ export declare function matchPath(pattern: string, path: string): Record<string, string> | null;
6
+ export interface LinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
7
+ to: string;
8
+ }
9
+ /** Real anchor (#/path) — middle-click/cmd-click friendly, Playwright friendly. */
10
+ export declare function Link({ to, children, ...rest }: LinkProps): React.DetailedReactHTMLElement<{
11
+ download?: any;
12
+ href: string;
13
+ hrefLang?: string | undefined;
14
+ media?: string | undefined;
15
+ ping?: string | undefined;
16
+ target?: React.HTMLAttributeAnchorTarget | undefined;
17
+ type?: string | undefined;
18
+ referrerPolicy?: React.HTMLAttributeReferrerPolicy | undefined;
19
+ defaultChecked?: boolean | undefined;
20
+ defaultValue?: string | number | readonly string[] | undefined;
21
+ suppressContentEditableWarning?: boolean | undefined;
22
+ suppressHydrationWarning?: boolean | undefined;
23
+ accessKey?: string | undefined;
24
+ autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {});
25
+ autoFocus?: boolean | undefined;
26
+ className?: string | undefined;
27
+ contentEditable?: (boolean | "false" | "true") | "inherit" | "plaintext-only" | undefined;
28
+ contextMenu?: string | undefined;
29
+ dir?: string | undefined;
30
+ draggable?: (boolean | "false" | "true") | undefined;
31
+ enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
32
+ hidden?: boolean | undefined;
33
+ id?: string | undefined;
34
+ lang?: string | undefined;
35
+ nonce?: string | undefined;
36
+ slot?: string | undefined;
37
+ spellCheck?: (boolean | "false" | "true") | undefined;
38
+ style?: React.CSSProperties | undefined;
39
+ tabIndex?: number | undefined;
40
+ title?: string | undefined;
41
+ translate?: "yes" | "no" | undefined;
42
+ radioGroup?: string | undefined;
43
+ role?: React.AriaRole | undefined;
44
+ about?: string | undefined;
45
+ content?: string | undefined;
46
+ datatype?: string | undefined;
47
+ inlist?: any;
48
+ prefix?: string | undefined;
49
+ property?: string | undefined;
50
+ rel?: string | undefined;
51
+ resource?: string | undefined;
52
+ rev?: string | undefined;
53
+ typeof?: string | undefined;
54
+ vocab?: string | undefined;
55
+ autoCorrect?: string | undefined;
56
+ autoSave?: string | undefined;
57
+ color?: string | undefined;
58
+ itemProp?: string | undefined;
59
+ itemScope?: boolean | undefined;
60
+ itemType?: string | undefined;
61
+ itemID?: string | undefined;
62
+ itemRef?: string | undefined;
63
+ results?: number | undefined;
64
+ security?: string | undefined;
65
+ unselectable?: "on" | "off" | undefined;
66
+ inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined;
67
+ is?: string | undefined;
68
+ exportparts?: string | undefined;
69
+ part?: string | undefined;
70
+ "aria-activedescendant"?: string | undefined;
71
+ "aria-atomic"?: (boolean | "false" | "true") | undefined;
72
+ "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
73
+ "aria-braillelabel"?: string | undefined;
74
+ "aria-brailleroledescription"?: string | undefined;
75
+ "aria-busy"?: (boolean | "false" | "true") | undefined;
76
+ "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
77
+ "aria-colcount"?: number | undefined;
78
+ "aria-colindex"?: number | undefined;
79
+ "aria-colindextext"?: string | undefined;
80
+ "aria-colspan"?: number | undefined;
81
+ "aria-controls"?: string | undefined;
82
+ "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined;
83
+ "aria-describedby"?: string | undefined;
84
+ "aria-description"?: string | undefined;
85
+ "aria-details"?: string | undefined;
86
+ "aria-disabled"?: (boolean | "false" | "true") | undefined;
87
+ "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
88
+ "aria-errormessage"?: string | undefined;
89
+ "aria-expanded"?: (boolean | "false" | "true") | undefined;
90
+ "aria-flowto"?: string | undefined;
91
+ "aria-grabbed"?: (boolean | "false" | "true") | undefined;
92
+ "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
93
+ "aria-hidden"?: (boolean | "false" | "true") | undefined;
94
+ "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
95
+ "aria-keyshortcuts"?: string | undefined;
96
+ "aria-label"?: string | undefined;
97
+ "aria-labelledby"?: string | undefined;
98
+ "aria-level"?: number | undefined;
99
+ "aria-live"?: "off" | "assertive" | "polite" | undefined;
100
+ "aria-modal"?: (boolean | "false" | "true") | undefined;
101
+ "aria-multiline"?: (boolean | "false" | "true") | undefined;
102
+ "aria-multiselectable"?: (boolean | "false" | "true") | undefined;
103
+ "aria-orientation"?: "horizontal" | "vertical" | undefined;
104
+ "aria-owns"?: string | undefined;
105
+ "aria-placeholder"?: string | undefined;
106
+ "aria-posinset"?: number | undefined;
107
+ "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
108
+ "aria-readonly"?: (boolean | "false" | "true") | undefined;
109
+ "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
110
+ "aria-required"?: (boolean | "false" | "true") | undefined;
111
+ "aria-roledescription"?: string | undefined;
112
+ "aria-rowcount"?: number | undefined;
113
+ "aria-rowindex"?: number | undefined;
114
+ "aria-rowindextext"?: string | undefined;
115
+ "aria-rowspan"?: number | undefined;
116
+ "aria-selected"?: (boolean | "false" | "true") | undefined;
117
+ "aria-setsize"?: number | undefined;
118
+ "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
119
+ "aria-valuemax"?: number | undefined;
120
+ "aria-valuemin"?: number | undefined;
121
+ "aria-valuenow"?: number | undefined;
122
+ "aria-valuetext"?: string | undefined;
123
+ dangerouslySetInnerHTML?: {
124
+ __html: string | TrustedHTML;
125
+ } | undefined;
126
+ onCopy?: React.ClipboardEventHandler<HTMLAnchorElement> | undefined;
127
+ onCopyCapture?: React.ClipboardEventHandler<HTMLAnchorElement> | undefined;
128
+ onCut?: React.ClipboardEventHandler<HTMLAnchorElement> | undefined;
129
+ onCutCapture?: React.ClipboardEventHandler<HTMLAnchorElement> | undefined;
130
+ onPaste?: React.ClipboardEventHandler<HTMLAnchorElement> | undefined;
131
+ onPasteCapture?: React.ClipboardEventHandler<HTMLAnchorElement> | undefined;
132
+ onCompositionEnd?: React.CompositionEventHandler<HTMLAnchorElement> | undefined;
133
+ onCompositionEndCapture?: React.CompositionEventHandler<HTMLAnchorElement> | undefined;
134
+ onCompositionStart?: React.CompositionEventHandler<HTMLAnchorElement> | undefined;
135
+ onCompositionStartCapture?: React.CompositionEventHandler<HTMLAnchorElement> | undefined;
136
+ onCompositionUpdate?: React.CompositionEventHandler<HTMLAnchorElement> | undefined;
137
+ onCompositionUpdateCapture?: React.CompositionEventHandler<HTMLAnchorElement> | undefined;
138
+ onFocus?: React.FocusEventHandler<HTMLAnchorElement> | undefined;
139
+ onFocusCapture?: React.FocusEventHandler<HTMLAnchorElement> | undefined;
140
+ onBlur?: React.FocusEventHandler<HTMLAnchorElement> | undefined;
141
+ onBlurCapture?: React.FocusEventHandler<HTMLAnchorElement> | undefined;
142
+ onChange?: React.FormEventHandler<HTMLAnchorElement> | undefined;
143
+ onChangeCapture?: React.FormEventHandler<HTMLAnchorElement> | undefined;
144
+ onBeforeInput?: React.InputEventHandler<HTMLAnchorElement> | undefined;
145
+ onBeforeInputCapture?: React.FormEventHandler<HTMLAnchorElement> | undefined;
146
+ onInput?: React.FormEventHandler<HTMLAnchorElement> | undefined;
147
+ onInputCapture?: React.FormEventHandler<HTMLAnchorElement> | undefined;
148
+ onReset?: React.FormEventHandler<HTMLAnchorElement> | undefined;
149
+ onResetCapture?: React.FormEventHandler<HTMLAnchorElement> | undefined;
150
+ onSubmit?: React.FormEventHandler<HTMLAnchorElement> | undefined;
151
+ onSubmitCapture?: React.FormEventHandler<HTMLAnchorElement> | undefined;
152
+ onInvalid?: React.FormEventHandler<HTMLAnchorElement> | undefined;
153
+ onInvalidCapture?: React.FormEventHandler<HTMLAnchorElement> | undefined;
154
+ onLoad?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
155
+ onLoadCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
156
+ onError?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
157
+ onErrorCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
158
+ onKeyDown?: React.KeyboardEventHandler<HTMLAnchorElement> | undefined;
159
+ onKeyDownCapture?: React.KeyboardEventHandler<HTMLAnchorElement> | undefined;
160
+ onKeyPress?: React.KeyboardEventHandler<HTMLAnchorElement> | undefined;
161
+ onKeyPressCapture?: React.KeyboardEventHandler<HTMLAnchorElement> | undefined;
162
+ onKeyUp?: React.KeyboardEventHandler<HTMLAnchorElement> | undefined;
163
+ onKeyUpCapture?: React.KeyboardEventHandler<HTMLAnchorElement> | undefined;
164
+ onAbort?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
165
+ onAbortCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
166
+ onCanPlay?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
167
+ onCanPlayCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
168
+ onCanPlayThrough?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
169
+ onCanPlayThroughCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
170
+ onDurationChange?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
171
+ onDurationChangeCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
172
+ onEmptied?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
173
+ onEmptiedCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
174
+ onEncrypted?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
175
+ onEncryptedCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
176
+ onEnded?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
177
+ onEndedCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
178
+ onLoadedData?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
179
+ onLoadedDataCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
180
+ onLoadedMetadata?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
181
+ onLoadedMetadataCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
182
+ onLoadStart?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
183
+ onLoadStartCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
184
+ onPause?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
185
+ onPauseCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
186
+ onPlay?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
187
+ onPlayCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
188
+ onPlaying?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
189
+ onPlayingCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
190
+ onProgress?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
191
+ onProgressCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
192
+ onRateChange?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
193
+ onRateChangeCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
194
+ onSeeked?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
195
+ onSeekedCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
196
+ onSeeking?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
197
+ onSeekingCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
198
+ onStalled?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
199
+ onStalledCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
200
+ onSuspend?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
201
+ onSuspendCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
202
+ onTimeUpdate?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
203
+ onTimeUpdateCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
204
+ onVolumeChange?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
205
+ onVolumeChangeCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
206
+ onWaiting?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
207
+ onWaitingCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
208
+ onAuxClick?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
209
+ onAuxClickCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
210
+ onClick?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
211
+ onClickCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
212
+ onContextMenu?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
213
+ onContextMenuCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
214
+ onDoubleClick?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
215
+ onDoubleClickCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
216
+ onDrag?: React.DragEventHandler<HTMLAnchorElement> | undefined;
217
+ onDragCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
218
+ onDragEnd?: React.DragEventHandler<HTMLAnchorElement> | undefined;
219
+ onDragEndCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
220
+ onDragEnter?: React.DragEventHandler<HTMLAnchorElement> | undefined;
221
+ onDragEnterCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
222
+ onDragExit?: React.DragEventHandler<HTMLAnchorElement> | undefined;
223
+ onDragExitCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
224
+ onDragLeave?: React.DragEventHandler<HTMLAnchorElement> | undefined;
225
+ onDragLeaveCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
226
+ onDragOver?: React.DragEventHandler<HTMLAnchorElement> | undefined;
227
+ onDragOverCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
228
+ onDragStart?: React.DragEventHandler<HTMLAnchorElement> | undefined;
229
+ onDragStartCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
230
+ onDrop?: React.DragEventHandler<HTMLAnchorElement> | undefined;
231
+ onDropCapture?: React.DragEventHandler<HTMLAnchorElement> | undefined;
232
+ onMouseDown?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
233
+ onMouseDownCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
234
+ onMouseEnter?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
235
+ onMouseLeave?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
236
+ onMouseMove?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
237
+ onMouseMoveCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
238
+ onMouseOut?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
239
+ onMouseOutCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
240
+ onMouseOver?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
241
+ onMouseOverCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
242
+ onMouseUp?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
243
+ onMouseUpCapture?: React.MouseEventHandler<HTMLAnchorElement> | undefined;
244
+ onSelect?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
245
+ onSelectCapture?: React.ReactEventHandler<HTMLAnchorElement> | undefined;
246
+ onTouchCancel?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
247
+ onTouchCancelCapture?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
248
+ onTouchEnd?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
249
+ onTouchEndCapture?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
250
+ onTouchMove?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
251
+ onTouchMoveCapture?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
252
+ onTouchStart?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
253
+ onTouchStartCapture?: React.TouchEventHandler<HTMLAnchorElement> | undefined;
254
+ onPointerDown?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
255
+ onPointerDownCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
256
+ onPointerMove?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
257
+ onPointerMoveCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
258
+ onPointerUp?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
259
+ onPointerUpCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
260
+ onPointerCancel?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
261
+ onPointerCancelCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
262
+ onPointerEnter?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
263
+ onPointerLeave?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
264
+ onPointerOver?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
265
+ onPointerOverCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
266
+ onPointerOut?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
267
+ onPointerOutCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
268
+ onGotPointerCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
269
+ onGotPointerCaptureCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
270
+ onLostPointerCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
271
+ onLostPointerCaptureCapture?: React.PointerEventHandler<HTMLAnchorElement> | undefined;
272
+ onScroll?: React.UIEventHandler<HTMLAnchorElement> | undefined;
273
+ onScrollCapture?: React.UIEventHandler<HTMLAnchorElement> | undefined;
274
+ onWheel?: React.WheelEventHandler<HTMLAnchorElement> | undefined;
275
+ onWheelCapture?: React.WheelEventHandler<HTMLAnchorElement> | undefined;
276
+ onAnimationStart?: React.AnimationEventHandler<HTMLAnchorElement> | undefined;
277
+ onAnimationStartCapture?: React.AnimationEventHandler<HTMLAnchorElement> | undefined;
278
+ onAnimationEnd?: React.AnimationEventHandler<HTMLAnchorElement> | undefined;
279
+ onAnimationEndCapture?: React.AnimationEventHandler<HTMLAnchorElement> | undefined;
280
+ onAnimationIteration?: React.AnimationEventHandler<HTMLAnchorElement> | undefined;
281
+ onAnimationIterationCapture?: React.AnimationEventHandler<HTMLAnchorElement> | undefined;
282
+ onTransitionEnd?: React.TransitionEventHandler<HTMLAnchorElement> | undefined;
283
+ onTransitionEndCapture?: React.TransitionEventHandler<HTMLAnchorElement> | undefined;
284
+ }, HTMLElement>;
285
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAA;AASlD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAUpC;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAatF;AAED,MAAM,WAAW,SAAU,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IAC9E,EAAE,EAAE,MAAM,CAAA;CACX;AAED,mFAAmF;AACnF,wBAAgB,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAExD"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import type { AppManifest } from '@fayz-ai/core';
3
+ import type { StorefrontConfig } from './config';
4
+ import './blocks';
5
+ /** StorefrontConfig → AppManifest (the sugar-to-data direction). */
6
+ export declare function defineStorefront(config: StorefrontConfig): AppManifest;
7
+ export declare function StorefrontScaffold({ manifest, surface }: {
8
+ manifest: AppManifest;
9
+ surface: string;
10
+ }): React.JSX.Element;
11
+ export declare namespace StorefrontScaffold {
12
+ var displayName: string;
13
+ }
14
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,eAAe,CAAA;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAIhD,OAAO,UAAU,CAAA;AAgBjB,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,WAAW,CAiCtE;AAgCD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,qBAanG;yBAbe,kBAAkB"}
@@ -0,0 +1,84 @@
1
+ import type { HeroVariant } from './theme';
2
+ export interface HeroSlide {
3
+ title: string;
4
+ subtitle?: string;
5
+ cta?: string;
6
+ href?: string;
7
+ /** Image URL; omit for a gradient placeholder derived from `hue` */
8
+ image?: string;
9
+ hue?: number;
10
+ /** Editorial boxed copy block (Uyuni) instead of free overlay */
11
+ boxed?: boolean;
12
+ }
13
+ export type HomeSection = {
14
+ type: 'hero';
15
+ variant: HeroVariant;
16
+ slides: HeroSlide[];
17
+ height?: 'tall' | 'medium';
18
+ } | {
19
+ type: 'categories';
20
+ style: 'bubbles' | 'tiles';
21
+ title?: string;
22
+ } | {
23
+ type: 'products';
24
+ title: string;
25
+ subtitle?: string;
26
+ /** Small-caps label above the title (e.g. 'curadoria') */
27
+ eyebrow?: string;
28
+ /** 'sale' = compareAtPrice set; 'new' = newest first; 'all' = catalog order */
29
+ filter?: 'sale' | 'new' | 'all';
30
+ limit?: number;
31
+ } | {
32
+ type: 'benefits';
33
+ items: Array<{
34
+ icon: string;
35
+ title: string;
36
+ text?: string;
37
+ }>;
38
+ } | {
39
+ type: 'banner';
40
+ title: string;
41
+ subtitle?: string;
42
+ eyebrow?: string;
43
+ cta?: string;
44
+ href?: string;
45
+ image?: string;
46
+ hue?: number;
47
+ } | {
48
+ type: 'manifesto';
49
+ title?: string;
50
+ text: string;
51
+ } | {
52
+ type: 'testimonials';
53
+ title?: string;
54
+ items: Array<{
55
+ quote: string;
56
+ author: string;
57
+ }>;
58
+ } | {
59
+ type: 'newsletter';
60
+ title?: string;
61
+ subtitle?: string;
62
+ };
63
+ export interface HomeConfig {
64
+ sections: HomeSection[];
65
+ }
66
+ export interface NavLink {
67
+ label: string;
68
+ to: string;
69
+ }
70
+ export interface FooterConfig {
71
+ about?: string;
72
+ contact?: {
73
+ phone?: string;
74
+ email?: string;
75
+ address?: string;
76
+ };
77
+ social?: Array<{
78
+ label: string;
79
+ href: string;
80
+ }>;
81
+ }
82
+ /** Wide gradient SVG data-URI — deterministic hero/banner art, no network. */
83
+ export declare function bannerPlaceholder(label: string, hueA: number, hueB: number, w?: number, h?: number): string;
84
+ //# sourceMappingURL=sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../src/sections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Stable selectors that custom storefront slots must preserve.
3
+ *
4
+ * Apps can fully customize the visual tree, but catalog/product-rail slots still
5
+ * need these anchors so checkout smoke tests, QA, and agents can operate stores.
6
+ */
7
+ export declare const productCardSlotContract: {
8
+ readonly root: {
9
+ readonly 'data-testid': "product-card";
10
+ };
11
+ readonly name: {
12
+ readonly 'data-testid': "product-card-name";
13
+ };
14
+ readonly priceTestId: "product-card-price";
15
+ readonly addButton: {
16
+ readonly 'data-testid': "product-card-add";
17
+ };
18
+ };
19
+ export declare const storefrontSlotContracts: {
20
+ readonly productCard: {
21
+ readonly root: {
22
+ readonly 'data-testid': "product-card";
23
+ };
24
+ readonly name: {
25
+ readonly 'data-testid': "product-card-name";
26
+ };
27
+ readonly priceTestId: "product-card-price";
28
+ readonly addButton: {
29
+ readonly 'data-testid': "product-card-add";
30
+ };
31
+ };
32
+ };
33
+ export type ProductCardSlotContract = typeof productCardSlotContract;
34
+ //# sourceMappingURL=slot-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slot-contracts.d.ts","sourceRoot":"","sources":["../src/slot-contracts.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;CAK1B,CAAA;AAEV,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;CAE1B,CAAA;AAEV,MAAM,MAAM,uBAAuB,GAAG,OAAO,uBAAuB,CAAA"}