@thorprovider/blocks 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (842) hide show
  1. package/README.md +120 -8
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/blocks/application/app-shells/app-shell-1-sidebar.d.ts +21 -0
  4. package/dist/blocks/application/app-shells/app-shell-1-sidebar.d.ts.map +1 -0
  5. package/dist/blocks/application/app-shells/app-shell-1-sidebar.js +147 -0
  6. package/dist/blocks/application/app-shells/app-shell-1-sidebar.js.map +1 -0
  7. package/dist/blocks/application/app-shells/app-shell-1-sidebar.mjs +153 -0
  8. package/dist/blocks/application/app-shells/app-shell-1-sidebar.mjs.map +1 -0
  9. package/dist/blocks/application/app-shells/app-shell-1.d.ts +27 -0
  10. package/dist/blocks/application/app-shells/app-shell-1.d.ts.map +1 -0
  11. package/dist/blocks/application/app-shells/app-shell-1.js +150 -0
  12. package/dist/blocks/application/app-shells/app-shell-1.js.map +1 -0
  13. package/dist/blocks/application/app-shells/app-shell-1.mjs +123 -0
  14. package/dist/blocks/application/app-shells/app-shell-1.mjs.map +1 -0
  15. package/dist/blocks/application/login-forms/login-page.d.ts +42 -0
  16. package/dist/blocks/application/login-forms/login-page.d.ts.map +1 -0
  17. package/dist/blocks/application/login-forms/login-page.js +209 -0
  18. package/dist/blocks/application/login-forms/login-page.js.map +1 -0
  19. package/dist/blocks/application/login-forms/login-page.mjs +185 -0
  20. package/dist/blocks/application/login-forms/login-page.mjs.map +1 -0
  21. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.d.ts +3 -0
  22. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.d.ts.map +1 -0
  23. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.js +74 -0
  24. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.js.map +1 -0
  25. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.mjs +50 -0
  26. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.mjs.map +1 -0
  27. package/dist/blocks/application/password-recovery/forgot-password-page-1.d.ts +42 -0
  28. package/dist/blocks/application/password-recovery/forgot-password-page-1.d.ts.map +1 -0
  29. package/dist/blocks/application/password-recovery/forgot-password-page-1.js +293 -0
  30. package/dist/blocks/application/password-recovery/forgot-password-page-1.js.map +1 -0
  31. package/dist/blocks/application/password-recovery/forgot-password-page-1.mjs +259 -0
  32. package/dist/blocks/application/password-recovery/forgot-password-page-1.mjs.map +1 -0
  33. package/dist/blocks/application/signup-forms/signup-page-1.d.ts +41 -0
  34. package/dist/blocks/application/signup-forms/signup-page-1.d.ts.map +1 -0
  35. package/dist/blocks/application/signup-forms/signup-page-1.js +195 -0
  36. package/dist/blocks/application/signup-forms/signup-page-1.js.map +1 -0
  37. package/dist/blocks/application/signup-forms/signup-page-1.mjs +171 -0
  38. package/dist/blocks/application/signup-forms/signup-page-1.mjs.map +1 -0
  39. package/dist/blocks/application/verification/verify-1.d.ts +35 -0
  40. package/dist/blocks/application/verification/verify-1.d.ts.map +1 -0
  41. package/dist/blocks/application/verification/verify-1.js +243 -0
  42. package/dist/blocks/application/verification/verify-1.js.map +1 -0
  43. package/dist/blocks/application/verification/verify-1.mjs +219 -0
  44. package/dist/blocks/application/verification/verify-1.mjs.map +1 -0
  45. package/dist/blocks/application/verification/verify-confetti.d.ts +22 -0
  46. package/dist/blocks/application/verification/verify-confetti.d.ts.map +1 -0
  47. package/dist/blocks/application/verification/verify-confetti.js +145 -0
  48. package/dist/blocks/application/verification/verify-confetti.js.map +1 -0
  49. package/dist/blocks/application/verification/verify-confetti.mjs +121 -0
  50. package/dist/blocks/application/verification/verify-confetti.mjs.map +1 -0
  51. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.d.ts +39 -0
  52. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.d.ts.map +1 -0
  53. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.js +180 -0
  54. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.js.map +1 -0
  55. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.mjs +156 -0
  56. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.mjs.map +1 -0
  57. package/dist/blocks/e-commerce/category-filters/category-listing.d.ts +236 -0
  58. package/dist/blocks/e-commerce/category-filters/category-listing.d.ts.map +1 -0
  59. package/dist/blocks/e-commerce/category-filters/category-listing.js +562 -0
  60. package/dist/blocks/e-commerce/category-filters/category-listing.js.map +1 -0
  61. package/dist/blocks/e-commerce/category-filters/category-listing.mjs +539 -0
  62. package/dist/blocks/e-commerce/category-filters/category-listing.mjs.map +1 -0
  63. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.d.ts +4 -0
  64. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.d.ts.map +1 -0
  65. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js +97 -0
  66. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js.map +1 -0
  67. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs +73 -0
  68. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs.map +1 -0
  69. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.d.ts +41 -0
  70. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.d.ts.map +1 -0
  71. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.js +115 -0
  72. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.js.map +1 -0
  73. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.mjs +91 -0
  74. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.mjs.map +1 -0
  75. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.d.ts +107 -0
  76. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.d.ts.map +1 -0
  77. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.js +180 -0
  78. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.js.map +1 -0
  79. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.mjs +156 -0
  80. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.mjs.map +1 -0
  81. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts +13 -0
  82. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts.map +1 -0
  83. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js +180 -0
  84. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js.map +1 -0
  85. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs +156 -0
  86. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs.map +1 -0
  87. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts +12 -0
  88. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts.map +1 -0
  89. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js +50 -0
  90. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js.map +1 -0
  91. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs +33 -0
  92. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs.map +1 -0
  93. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.d.ts +11 -0
  94. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.d.ts.map +1 -0
  95. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.js +50 -0
  96. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.js.map +1 -0
  97. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.mjs +25 -0
  98. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.mjs.map +1 -0
  99. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.d.ts +5 -0
  100. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.d.ts.map +1 -0
  101. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.js +17 -0
  102. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.js.map +1 -0
  103. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.mjs +1 -0
  104. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.mjs.map +1 -0
  105. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts +20 -0
  106. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts.map +1 -0
  107. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js +176 -0
  108. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js.map +1 -0
  109. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs +152 -0
  110. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs.map +1 -0
  111. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts +12 -0
  112. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts.map +1 -0
  113. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js +93 -0
  114. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js.map +1 -0
  115. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs +69 -0
  116. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs.map +1 -0
  117. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.d.ts +11 -0
  118. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.d.ts.map +1 -0
  119. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.js +76 -0
  120. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.js.map +1 -0
  121. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.mjs +52 -0
  122. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.mjs.map +1 -0
  123. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts +11 -0
  124. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts.map +1 -0
  125. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js +64 -0
  126. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js.map +1 -0
  127. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs +40 -0
  128. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs.map +1 -0
  129. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts +17 -0
  130. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts.map +1 -0
  131. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js +199 -0
  132. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js.map +1 -0
  133. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs +175 -0
  134. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs.map +1 -0
  135. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts +164 -0
  136. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts.map +1 -0
  137. package/dist/blocks/e-commerce/checkout-forms/checkout.js +351 -0
  138. package/dist/blocks/e-commerce/checkout-forms/checkout.js.map +1 -0
  139. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs +327 -0
  140. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs.map +1 -0
  141. package/dist/blocks/e-commerce/navigation/back-to-top.d.ts +28 -0
  142. package/dist/blocks/e-commerce/navigation/back-to-top.d.ts.map +1 -0
  143. package/dist/blocks/e-commerce/navigation/back-to-top.js +78 -0
  144. package/dist/blocks/e-commerce/navigation/back-to-top.js.map +1 -0
  145. package/dist/blocks/e-commerce/navigation/back-to-top.mjs +52 -0
  146. package/dist/blocks/e-commerce/navigation/back-to-top.mjs.map +1 -0
  147. package/dist/blocks/e-commerce/navigation/breadcrumb.d.ts +61 -0
  148. package/dist/blocks/e-commerce/navigation/breadcrumb.d.ts.map +1 -0
  149. package/dist/blocks/e-commerce/navigation/breadcrumb.js +111 -0
  150. package/dist/blocks/e-commerce/navigation/breadcrumb.js.map +1 -0
  151. package/dist/blocks/e-commerce/navigation/breadcrumb.mjs +93 -0
  152. package/dist/blocks/e-commerce/navigation/breadcrumb.mjs.map +1 -0
  153. package/dist/blocks/e-commerce/navigation/category-icon.d.ts +28 -0
  154. package/dist/blocks/e-commerce/navigation/category-icon.d.ts.map +1 -0
  155. package/dist/blocks/e-commerce/navigation/category-icon.js +86 -0
  156. package/dist/blocks/e-commerce/navigation/category-icon.js.map +1 -0
  157. package/dist/blocks/e-commerce/navigation/category-icon.mjs +79 -0
  158. package/dist/blocks/e-commerce/navigation/category-icon.mjs.map +1 -0
  159. package/dist/blocks/e-commerce/navigation/mega-menu.d.ts +112 -0
  160. package/dist/blocks/e-commerce/navigation/mega-menu.d.ts.map +1 -0
  161. package/dist/blocks/e-commerce/navigation/mega-menu.js +250 -0
  162. package/dist/blocks/e-commerce/navigation/mega-menu.js.map +1 -0
  163. package/dist/blocks/e-commerce/navigation/mega-menu.mjs +228 -0
  164. package/dist/blocks/e-commerce/navigation/mega-menu.mjs.map +1 -0
  165. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.d.ts +71 -0
  166. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.d.ts.map +1 -0
  167. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.js +94 -0
  168. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.js.map +1 -0
  169. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.mjs +68 -0
  170. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.mjs.map +1 -0
  171. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.d.ts +121 -0
  172. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.d.ts.map +1 -0
  173. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.js +257 -0
  174. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.js.map +1 -0
  175. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.mjs +235 -0
  176. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.mjs.map +1 -0
  177. package/dist/blocks/e-commerce/navigation/skip-to-content.d.ts +25 -0
  178. package/dist/blocks/e-commerce/navigation/skip-to-content.d.ts.map +1 -0
  179. package/dist/blocks/e-commerce/navigation/skip-to-content.js +55 -0
  180. package/dist/blocks/e-commerce/navigation/skip-to-content.js.map +1 -0
  181. package/dist/blocks/e-commerce/navigation/skip-to-content.mjs +30 -0
  182. package/dist/blocks/e-commerce/navigation/skip-to-content.mjs.map +1 -0
  183. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.d.ts +23 -0
  184. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.d.ts.map +1 -0
  185. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.js +127 -0
  186. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.js.map +1 -0
  187. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.mjs +111 -0
  188. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.mjs.map +1 -0
  189. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts +66 -0
  190. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts.map +1 -0
  191. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js +280 -0
  192. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js.map +1 -0
  193. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs +263 -0
  194. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs.map +1 -0
  195. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.d.ts +13 -0
  196. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.d.ts.map +1 -0
  197. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.js +83 -0
  198. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.js.map +1 -0
  199. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.mjs +59 -0
  200. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.mjs.map +1 -0
  201. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.d.ts +8 -0
  202. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.d.ts.map +1 -0
  203. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.js +73 -0
  204. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.js.map +1 -0
  205. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.mjs +49 -0
  206. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.mjs.map +1 -0
  207. package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts +121 -0
  208. package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts.map +1 -0
  209. package/dist/blocks/e-commerce/navigation/storefront-navbar.js +424 -0
  210. package/dist/blocks/e-commerce/navigation/storefront-navbar.js.map +1 -0
  211. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs +399 -0
  212. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs.map +1 -0
  213. package/dist/blocks/e-commerce/order-history/order-history.d.ts +74 -0
  214. package/dist/blocks/e-commerce/order-history/order-history.d.ts.map +1 -0
  215. package/dist/blocks/e-commerce/order-history/order-history.js +161 -0
  216. package/dist/blocks/e-commerce/order-history/order-history.js.map +1 -0
  217. package/dist/blocks/e-commerce/order-history/order-history.mjs +141 -0
  218. package/dist/blocks/e-commerce/order-history/order-history.mjs.map +1 -0
  219. package/dist/blocks/e-commerce/order-history/order-line.d.ts +50 -0
  220. package/dist/blocks/e-commerce/order-history/order-line.d.ts.map +1 -0
  221. package/dist/blocks/e-commerce/order-history/order-line.js +75 -0
  222. package/dist/blocks/e-commerce/order-history/order-line.js.map +1 -0
  223. package/dist/blocks/e-commerce/order-history/order-line.mjs +49 -0
  224. package/dist/blocks/e-commerce/order-history/order-line.mjs.map +1 -0
  225. package/dist/blocks/e-commerce/product-categories/category-card.d.ts +9 -0
  226. package/dist/blocks/e-commerce/product-categories/category-card.d.ts.map +1 -0
  227. package/dist/blocks/e-commerce/product-categories/category-card.js +154 -0
  228. package/dist/blocks/e-commerce/product-categories/category-card.js.map +1 -0
  229. package/dist/blocks/e-commerce/product-categories/category-card.mjs +134 -0
  230. package/dist/blocks/e-commerce/product-categories/category-card.mjs.map +1 -0
  231. package/dist/blocks/e-commerce/product-categories/category-shared.d.ts +15 -0
  232. package/dist/blocks/e-commerce/product-categories/category-shared.d.ts.map +1 -0
  233. package/dist/blocks/e-commerce/product-categories/category-shared.js +101 -0
  234. package/dist/blocks/e-commerce/product-categories/category-shared.js.map +1 -0
  235. package/dist/blocks/e-commerce/product-categories/category-shared.mjs +97 -0
  236. package/dist/blocks/e-commerce/product-categories/category-shared.mjs.map +1 -0
  237. package/dist/blocks/e-commerce/product-categories/product-category-grid.d.ts +10 -0
  238. package/dist/blocks/e-commerce/product-categories/product-category-grid.d.ts.map +1 -0
  239. package/dist/blocks/e-commerce/product-categories/product-category-grid.js +138 -0
  240. package/dist/blocks/e-commerce/product-categories/product-category-grid.js.map +1 -0
  241. package/dist/blocks/e-commerce/product-categories/product-category-grid.mjs +114 -0
  242. package/dist/blocks/e-commerce/product-categories/product-category-grid.mjs.map +1 -0
  243. package/dist/blocks/e-commerce/product-categories/product-category.d.ts +41 -0
  244. package/dist/blocks/e-commerce/product-categories/product-category.d.ts.map +1 -0
  245. package/dist/blocks/e-commerce/product-categories/product-category.js +319 -0
  246. package/dist/blocks/e-commerce/product-categories/product-category.js.map +1 -0
  247. package/dist/blocks/e-commerce/product-categories/product-category.mjs +322 -0
  248. package/dist/blocks/e-commerce/product-categories/product-category.mjs.map +1 -0
  249. package/dist/blocks/e-commerce/product-list/product-card.d.ts +47 -0
  250. package/dist/blocks/e-commerce/product-list/product-card.d.ts.map +1 -0
  251. package/dist/blocks/e-commerce/product-list/product-card.js +361 -0
  252. package/dist/blocks/e-commerce/product-list/product-card.js.map +1 -0
  253. package/dist/blocks/e-commerce/product-list/product-card.mjs +337 -0
  254. package/dist/blocks/e-commerce/product-list/product-card.mjs.map +1 -0
  255. package/dist/blocks/e-commerce/product-list/product-grid.d.ts +28 -0
  256. package/dist/blocks/e-commerce/product-list/product-grid.d.ts.map +1 -0
  257. package/dist/blocks/e-commerce/product-list/product-grid.js +92 -0
  258. package/dist/blocks/e-commerce/product-list/product-grid.js.map +1 -0
  259. package/dist/blocks/e-commerce/product-list/product-grid.mjs +68 -0
  260. package/dist/blocks/e-commerce/product-list/product-grid.mjs.map +1 -0
  261. package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts +30 -0
  262. package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts.map +1 -0
  263. package/dist/blocks/e-commerce/product-list/product-showcase-1.js +245 -0
  264. package/dist/blocks/e-commerce/product-list/product-showcase-1.js.map +1 -0
  265. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs +221 -0
  266. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs.map +1 -0
  267. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.d.ts +20 -0
  268. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.d.ts.map +1 -0
  269. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.js +71 -0
  270. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.js.map +1 -0
  271. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.mjs +47 -0
  272. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.mjs.map +1 -0
  273. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.d.ts +15 -0
  274. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.d.ts.map +1 -0
  275. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.js +118 -0
  276. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.js.map +1 -0
  277. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.mjs +94 -0
  278. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.mjs.map +1 -0
  279. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.d.ts +26 -0
  280. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.d.ts.map +1 -0
  281. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.js +85 -0
  282. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.js.map +1 -0
  283. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.mjs +61 -0
  284. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.mjs.map +1 -0
  285. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.d.ts +32 -0
  286. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.d.ts.map +1 -0
  287. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.js +79 -0
  288. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.js.map +1 -0
  289. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.mjs +51 -0
  290. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.mjs.map +1 -0
  291. package/dist/blocks/e-commerce/product-overview/product-overview.d.ts +121 -0
  292. package/dist/blocks/e-commerce/product-overview/product-overview.d.ts.map +1 -0
  293. package/dist/blocks/e-commerce/product-overview/product-overview.js +844 -0
  294. package/dist/blocks/e-commerce/product-overview/product-overview.js.map +1 -0
  295. package/dist/blocks/e-commerce/product-overview/product-overview.mjs +821 -0
  296. package/dist/blocks/e-commerce/product-overview/product-overview.mjs.map +1 -0
  297. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.d.ts +17 -0
  298. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.d.ts.map +1 -0
  299. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.js +123 -0
  300. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.js.map +1 -0
  301. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.mjs +99 -0
  302. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.mjs.map +1 -0
  303. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts +20 -0
  304. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts.map +1 -0
  305. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js +271 -0
  306. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js.map +1 -0
  307. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs +253 -0
  308. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs.map +1 -0
  309. package/dist/blocks/e-commerce/product-overview/product-quick-view.d.ts +68 -0
  310. package/dist/blocks/e-commerce/product-overview/product-quick-view.d.ts.map +1 -0
  311. package/dist/blocks/e-commerce/product-overview/product-quick-view.js +84 -0
  312. package/dist/blocks/e-commerce/product-overview/product-quick-view.js.map +1 -0
  313. package/dist/blocks/e-commerce/product-overview/product-quick-view.mjs +60 -0
  314. package/dist/blocks/e-commerce/product-overview/product-quick-view.mjs.map +1 -0
  315. package/dist/blocks/e-commerce/reviews/review-card.d.ts +60 -0
  316. package/dist/blocks/e-commerce/reviews/review-card.d.ts.map +1 -0
  317. package/dist/blocks/e-commerce/reviews/review-card.js +166 -0
  318. package/dist/blocks/e-commerce/reviews/review-card.js.map +1 -0
  319. package/dist/blocks/e-commerce/reviews/review-card.mjs +139 -0
  320. package/dist/blocks/e-commerce/reviews/review-card.mjs.map +1 -0
  321. package/dist/blocks/e-commerce/reviews/review-composer.d.ts +50 -0
  322. package/dist/blocks/e-commerce/reviews/review-composer.d.ts.map +1 -0
  323. package/dist/blocks/e-commerce/reviews/review-composer.js +180 -0
  324. package/dist/blocks/e-commerce/reviews/review-composer.js.map +1 -0
  325. package/dist/blocks/e-commerce/reviews/review-composer.mjs +155 -0
  326. package/dist/blocks/e-commerce/reviews/review-composer.mjs.map +1 -0
  327. package/dist/blocks/e-commerce/reviews/review-list.d.ts +40 -0
  328. package/dist/blocks/e-commerce/reviews/review-list.d.ts.map +1 -0
  329. package/dist/blocks/e-commerce/reviews/review-list.js +138 -0
  330. package/dist/blocks/e-commerce/reviews/review-list.js.map +1 -0
  331. package/dist/blocks/e-commerce/reviews/review-list.mjs +119 -0
  332. package/dist/blocks/e-commerce/reviews/review-list.mjs.map +1 -0
  333. package/dist/blocks/e-commerce/reviews/review-summary.d.ts +49 -0
  334. package/dist/blocks/e-commerce/reviews/review-summary.d.ts.map +1 -0
  335. package/dist/blocks/e-commerce/reviews/review-summary.js +150 -0
  336. package/dist/blocks/e-commerce/reviews/review-summary.js.map +1 -0
  337. package/dist/blocks/e-commerce/reviews/review-summary.mjs +124 -0
  338. package/dist/blocks/e-commerce/reviews/review-summary.mjs.map +1 -0
  339. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.d.ts +98 -0
  340. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.d.ts.map +1 -0
  341. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.js +417 -0
  342. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.js.map +1 -0
  343. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.mjs +393 -0
  344. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.mjs.map +1 -0
  345. package/dist/blocks/e-commerce/store-containers/store-container-1.d.ts +13 -0
  346. package/dist/blocks/e-commerce/store-containers/store-container-1.d.ts.map +1 -0
  347. package/dist/blocks/e-commerce/store-containers/store-container-1.js +45 -0
  348. package/dist/blocks/e-commerce/store-containers/store-container-1.js.map +1 -0
  349. package/dist/blocks/e-commerce/store-containers/store-container-1.mjs +21 -0
  350. package/dist/blocks/e-commerce/store-containers/store-container-1.mjs.map +1 -0
  351. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts +163 -0
  352. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts.map +1 -0
  353. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js +810 -0
  354. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js.map +1 -0
  355. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs +786 -0
  356. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs.map +1 -0
  357. package/dist/blocks/marketing/banners/avatar-group.d.ts +8 -0
  358. package/dist/blocks/marketing/banners/avatar-group.d.ts.map +1 -0
  359. package/dist/blocks/marketing/banners/avatar-group.js +90 -0
  360. package/dist/blocks/marketing/banners/avatar-group.js.map +1 -0
  361. package/dist/blocks/marketing/banners/avatar-group.mjs +56 -0
  362. package/dist/blocks/marketing/banners/avatar-group.mjs.map +1 -0
  363. package/dist/blocks/marketing/banners/banner-1.d.ts +26 -0
  364. package/dist/blocks/marketing/banners/banner-1.d.ts.map +1 -0
  365. package/dist/blocks/marketing/banners/banner-1.js +177 -0
  366. package/dist/blocks/marketing/banners/banner-1.js.map +1 -0
  367. package/dist/blocks/marketing/banners/banner-1.mjs +153 -0
  368. package/dist/blocks/marketing/banners/banner-1.mjs.map +1 -0
  369. package/dist/blocks/marketing/cta/cta-section-1.d.ts +13 -0
  370. package/dist/blocks/marketing/cta/cta-section-1.d.ts.map +1 -0
  371. package/dist/blocks/marketing/cta/cta-section-1.js +116 -0
  372. package/dist/blocks/marketing/cta/cta-section-1.js.map +1 -0
  373. package/dist/blocks/marketing/cta/cta-section-1.mjs +92 -0
  374. package/dist/blocks/marketing/cta/cta-section-1.mjs.map +1 -0
  375. package/dist/blocks/marketing/faq/faq-block-1.d.ts +16 -0
  376. package/dist/blocks/marketing/faq/faq-block-1.d.ts.map +1 -0
  377. package/dist/blocks/marketing/faq/faq-block-1.js +49 -0
  378. package/dist/blocks/marketing/faq/faq-block-1.js.map +1 -0
  379. package/dist/blocks/marketing/faq/faq-block-1.mjs +25 -0
  380. package/dist/blocks/marketing/faq/faq-block-1.mjs.map +1 -0
  381. package/dist/blocks/marketing/features/feature.d.ts +45 -0
  382. package/dist/blocks/marketing/features/feature.d.ts.map +1 -0
  383. package/dist/blocks/marketing/features/feature.js +135 -0
  384. package/dist/blocks/marketing/features/feature.js.map +1 -0
  385. package/dist/blocks/marketing/features/feature.mjs +111 -0
  386. package/dist/blocks/marketing/features/feature.mjs.map +1 -0
  387. package/dist/blocks/marketing/footers/footer-section.d.ts +59 -0
  388. package/dist/blocks/marketing/footers/footer-section.d.ts.map +1 -0
  389. package/dist/blocks/marketing/footers/footer-section.js +356 -0
  390. package/dist/blocks/marketing/footers/footer-section.js.map +1 -0
  391. package/dist/blocks/marketing/footers/footer-section.mjs +332 -0
  392. package/dist/blocks/marketing/footers/footer-section.mjs.map +1 -0
  393. package/dist/blocks/marketing/hero-sections/avatar-group.d.ts +9 -0
  394. package/dist/blocks/marketing/hero-sections/avatar-group.d.ts.map +1 -0
  395. package/dist/blocks/marketing/hero-sections/avatar-group.js +92 -0
  396. package/dist/blocks/marketing/hero-sections/avatar-group.js.map +1 -0
  397. package/dist/blocks/marketing/hero-sections/avatar-group.mjs +58 -0
  398. package/dist/blocks/marketing/hero-sections/avatar-group.mjs.map +1 -0
  399. package/dist/blocks/marketing/hero-sections/hero-section-1.d.ts +27 -0
  400. package/dist/blocks/marketing/hero-sections/hero-section-1.d.ts.map +1 -0
  401. package/dist/blocks/marketing/hero-sections/hero-section-1.js +124 -0
  402. package/dist/blocks/marketing/hero-sections/hero-section-1.js.map +1 -0
  403. package/dist/blocks/marketing/hero-sections/hero-section-1.mjs +100 -0
  404. package/dist/blocks/marketing/hero-sections/hero-section-1.mjs.map +1 -0
  405. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.d.ts +19 -0
  406. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.d.ts.map +1 -0
  407. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.js +63 -0
  408. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.js.map +1 -0
  409. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.mjs +39 -0
  410. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.mjs.map +1 -0
  411. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.d.ts +13 -0
  412. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.d.ts.map +1 -0
  413. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.js +49 -0
  414. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.js.map +1 -0
  415. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.mjs +25 -0
  416. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.mjs.map +1 -0
  417. package/dist/blocks/marketing/navbars/navbar.d.ts +80 -0
  418. package/dist/blocks/marketing/navbars/navbar.d.ts.map +1 -0
  419. package/dist/blocks/marketing/navbars/navbar.js +484 -0
  420. package/dist/blocks/marketing/navbars/navbar.js.map +1 -0
  421. package/dist/blocks/marketing/navbars/navbar.mjs +475 -0
  422. package/dist/blocks/marketing/navbars/navbar.mjs.map +1 -0
  423. package/dist/blocks/marketing/pricing/pricing-section-1.d.ts +23 -0
  424. package/dist/blocks/marketing/pricing/pricing-section-1.d.ts.map +1 -0
  425. package/dist/blocks/marketing/pricing/pricing-section-1.js +89 -0
  426. package/dist/blocks/marketing/pricing/pricing-section-1.js.map +1 -0
  427. package/dist/blocks/marketing/pricing/pricing-section-1.mjs +65 -0
  428. package/dist/blocks/marketing/pricing/pricing-section-1.mjs.map +1 -0
  429. package/dist/blocks/marketing/statistics/statistic-1.d.ts +19 -0
  430. package/dist/blocks/marketing/statistics/statistic-1.d.ts.map +1 -0
  431. package/dist/blocks/marketing/statistics/statistic-1.js +83 -0
  432. package/dist/blocks/marketing/statistics/statistic-1.js.map +1 -0
  433. package/dist/blocks/marketing/statistics/statistic-1.mjs +59 -0
  434. package/dist/blocks/marketing/statistics/statistic-1.mjs.map +1 -0
  435. package/dist/blocks/marketing/testimonials/testimonial-section.d.ts +29 -0
  436. package/dist/blocks/marketing/testimonials/testimonial-section.d.ts.map +1 -0
  437. package/dist/blocks/marketing/testimonials/testimonial-section.js +173 -0
  438. package/dist/blocks/marketing/testimonials/testimonial-section.js.map +1 -0
  439. package/dist/blocks/marketing/testimonials/testimonial-section.mjs +155 -0
  440. package/dist/blocks/marketing/testimonials/testimonial-section.mjs.map +1 -0
  441. package/dist/blocks/shared/reaction-toggle.d.ts +14 -0
  442. package/dist/blocks/shared/reaction-toggle.d.ts.map +1 -0
  443. package/dist/blocks/shared/reaction-toggle.js +138 -0
  444. package/dist/blocks/shared/reaction-toggle.js.map +1 -0
  445. package/dist/blocks/shared/reaction-toggle.mjs +114 -0
  446. package/dist/blocks/shared/reaction-toggle.mjs.map +1 -0
  447. package/dist/hooks/use-mobile.d.ts +2 -0
  448. package/dist/hooks/use-mobile.d.ts.map +1 -0
  449. package/dist/hooks/use-mobile.js +53 -0
  450. package/dist/hooks/use-mobile.js.map +1 -0
  451. package/dist/hooks/use-mobile.mjs +19 -0
  452. package/dist/hooks/use-mobile.mjs.map +1 -0
  453. package/dist/index.d.ts +100 -0
  454. package/dist/index.d.ts.map +1 -0
  455. package/dist/index.js +339 -0
  456. package/dist/index.js.map +1 -0
  457. package/dist/index.mjs +238 -0
  458. package/dist/index.mjs.map +1 -0
  459. package/{src/lib/cart.ts → dist/lib/cart.d.ts} +2 -3
  460. package/dist/lib/cart.d.ts.map +1 -0
  461. package/dist/lib/cart.js +31 -0
  462. package/dist/lib/cart.js.map +1 -0
  463. package/dist/lib/cart.mjs +7 -0
  464. package/dist/lib/cart.mjs.map +1 -0
  465. package/dist/lib/contracts.d.ts +4008 -0
  466. package/dist/lib/contracts.d.ts.map +1 -0
  467. package/dist/lib/contracts.js +828 -0
  468. package/dist/lib/contracts.js.map +1 -0
  469. package/dist/lib/contracts.mjs +737 -0
  470. package/dist/lib/contracts.mjs.map +1 -0
  471. package/dist/lib/money.d.ts +28 -0
  472. package/dist/lib/money.d.ts.map +1 -0
  473. package/dist/lib/money.js +50 -0
  474. package/dist/lib/money.js.map +1 -0
  475. package/dist/lib/money.mjs +24 -0
  476. package/dist/lib/money.mjs.map +1 -0
  477. package/dist/lib/types/menu.d.ts +40 -0
  478. package/dist/lib/types/menu.d.ts.map +1 -0
  479. package/dist/lib/types/menu.js +50 -0
  480. package/dist/lib/types/menu.js.map +1 -0
  481. package/dist/lib/types/menu.mjs +25 -0
  482. package/dist/lib/types/menu.mjs.map +1 -0
  483. package/dist/lib/types.d.ts +5 -0
  484. package/dist/lib/types.d.ts.map +1 -0
  485. package/dist/lib/types.js +17 -0
  486. package/dist/lib/types.js.map +1 -0
  487. package/dist/lib/types.mjs +1 -0
  488. package/dist/lib/types.mjs.map +1 -0
  489. package/dist/lib/utils.d.ts +7 -0
  490. package/dist/lib/utils.d.ts.map +1 -0
  491. package/dist/lib/utils.js +33 -0
  492. package/dist/lib/utils.js.map +1 -0
  493. package/dist/lib/utils.mjs +9 -0
  494. package/dist/lib/utils.mjs.map +1 -0
  495. package/dist/ui/accordion.d.ts +8 -0
  496. package/dist/ui/accordion.d.ts.map +1 -0
  497. package/dist/ui/accordion.js +93 -0
  498. package/dist/ui/accordion.js.map +1 -0
  499. package/dist/ui/accordion.mjs +66 -0
  500. package/dist/ui/accordion.mjs.map +1 -0
  501. package/dist/ui/avatar.d.ts +12 -0
  502. package/dist/ui/avatar.d.ts.map +1 -0
  503. package/dist/ui/avatar.js +134 -0
  504. package/dist/ui/avatar.js.map +1 -0
  505. package/{src/ui/avatar.tsx → dist/ui/avatar.mjs} +67 -70
  506. package/dist/ui/avatar.mjs.map +1 -0
  507. package/dist/ui/badge.d.ts +10 -0
  508. package/dist/ui/badge.d.ts.map +1 -0
  509. package/dist/ui/badge.js +69 -0
  510. package/dist/ui/badge.js.map +1 -0
  511. package/dist/ui/badge.mjs +44 -0
  512. package/dist/ui/badge.mjs.map +1 -0
  513. package/dist/ui/breadcrumb.d.ts +12 -0
  514. package/dist/ui/breadcrumb.d.ts.map +1 -0
  515. package/dist/ui/breadcrumb.js +134 -0
  516. package/dist/ui/breadcrumb.js.map +1 -0
  517. package/dist/ui/breadcrumb.mjs +104 -0
  518. package/dist/ui/breadcrumb.mjs.map +1 -0
  519. package/dist/ui/button-group.d.ts +12 -0
  520. package/dist/ui/button-group.d.ts.map +1 -0
  521. package/dist/ui/button-group.js +104 -0
  522. package/dist/ui/button-group.js.map +1 -0
  523. package/dist/ui/button-group.mjs +77 -0
  524. package/dist/ui/button-group.mjs.map +1 -0
  525. package/dist/ui/button.d.ts +11 -0
  526. package/dist/ui/button.d.ts.map +1 -0
  527. package/dist/ui/button.js +82 -0
  528. package/dist/ui/button.js.map +1 -0
  529. package/dist/ui/button.mjs +57 -0
  530. package/dist/ui/button.mjs.map +1 -0
  531. package/dist/ui/card.d.ts +10 -0
  532. package/dist/ui/card.d.ts.map +1 -0
  533. package/dist/ui/card.js +121 -0
  534. package/dist/ui/card.js.map +1 -0
  535. package/dist/ui/card.mjs +91 -0
  536. package/dist/ui/card.mjs.map +1 -0
  537. package/dist/ui/carousel.d.ts +20 -0
  538. package/dist/ui/carousel.d.ts.map +1 -0
  539. package/dist/ui/carousel.js +238 -0
  540. package/dist/ui/carousel.js.map +1 -0
  541. package/dist/ui/carousel.mjs +200 -0
  542. package/dist/ui/carousel.mjs.map +1 -0
  543. package/dist/ui/dialog.d.ts +18 -0
  544. package/dist/ui/dialog.d.ts.map +1 -0
  545. package/dist/ui/dialog.js +181 -0
  546. package/dist/ui/dialog.js.map +1 -0
  547. package/dist/ui/dialog.mjs +148 -0
  548. package/dist/ui/dialog.mjs.map +1 -0
  549. package/dist/ui/drawer.d.ts +14 -0
  550. package/dist/ui/drawer.d.ts.map +1 -0
  551. package/dist/ui/drawer.js +163 -0
  552. package/dist/ui/drawer.js.map +1 -0
  553. package/dist/ui/drawer.mjs +130 -0
  554. package/dist/ui/drawer.mjs.map +1 -0
  555. package/dist/ui/dropdown-menu.d.ts +26 -0
  556. package/dist/ui/dropdown-menu.d.ts.map +1 -0
  557. package/dist/ui/dropdown-menu.js +271 -0
  558. package/dist/ui/dropdown-menu.js.map +1 -0
  559. package/dist/ui/dropdown-menu.mjs +233 -0
  560. package/dist/ui/dropdown-menu.mjs.map +1 -0
  561. package/dist/ui/empty.d.ts +12 -0
  562. package/dist/ui/empty.d.ts.map +1 -0
  563. package/dist/ui/empty.js +132 -0
  564. package/dist/ui/empty.js.map +1 -0
  565. package/dist/ui/empty.mjs +103 -0
  566. package/dist/ui/empty.mjs.map +1 -0
  567. package/dist/ui/field.d.ts +25 -0
  568. package/dist/ui/field.d.ts.map +1 -0
  569. package/dist/ui/field.js +264 -0
  570. package/dist/ui/field.js.map +1 -0
  571. package/{src/ui/field.tsx → dist/ui/field.mjs} +142 -159
  572. package/dist/ui/field.mjs.map +1 -0
  573. package/dist/ui/input-group.d.ts +17 -0
  574. package/dist/ui/input-group.d.ts.map +1 -0
  575. package/dist/ui/input-group.js +185 -0
  576. package/dist/ui/input-group.js.map +1 -0
  577. package/{src/ui/input-group.tsx → dist/ui/input-group.mjs} +92 -106
  578. package/dist/ui/input-group.mjs.map +1 -0
  579. package/dist/ui/input-otp.d.ts +12 -0
  580. package/dist/ui/input-otp.d.ts.map +1 -0
  581. package/dist/ui/input-otp.js +105 -0
  582. package/dist/ui/input-otp.js.map +1 -0
  583. package/dist/ui/input-otp.mjs +68 -0
  584. package/dist/ui/input-otp.mjs.map +1 -0
  585. package/dist/ui/input.d.ts +4 -0
  586. package/dist/ui/input.d.ts.map +1 -0
  587. package/dist/ui/input.js +46 -0
  588. package/dist/ui/input.js.map +1 -0
  589. package/{src/ui/input.tsx → dist/ui/input.mjs} +17 -15
  590. package/dist/ui/input.mjs.map +1 -0
  591. package/dist/ui/label.d.ts +5 -0
  592. package/dist/ui/label.d.ts.map +1 -0
  593. package/dist/ui/label.js +48 -0
  594. package/dist/ui/label.js.map +1 -0
  595. package/dist/ui/label.mjs +24 -0
  596. package/dist/ui/label.mjs.map +1 -0
  597. package/dist/ui/navigation-menu.d.ts +15 -0
  598. package/dist/ui/navigation-menu.d.ts.map +1 -0
  599. package/dist/ui/navigation-menu.js +203 -0
  600. package/dist/ui/navigation-menu.js.map +1 -0
  601. package/{src/ui/navigation-menu.tsx → dist/ui/navigation-menu.mjs} +116 -112
  602. package/dist/ui/navigation-menu.mjs.map +1 -0
  603. package/dist/ui/pagination.d.ts +14 -0
  604. package/dist/ui/pagination.d.ts.map +1 -0
  605. package/dist/ui/pagination.js +149 -0
  606. package/dist/ui/pagination.js.map +1 -0
  607. package/dist/ui/pagination.mjs +123 -0
  608. package/dist/ui/pagination.mjs.map +1 -0
  609. package/dist/ui/progress.d.ts +5 -0
  610. package/dist/ui/progress.d.ts.map +1 -0
  611. package/dist/ui/progress.js +57 -0
  612. package/dist/ui/progress.js.map +1 -0
  613. package/dist/ui/progress.mjs +33 -0
  614. package/dist/ui/progress.mjs.map +1 -0
  615. package/dist/ui/radio-group.d.ts +6 -0
  616. package/dist/ui/radio-group.d.ts.map +1 -0
  617. package/dist/ui/radio-group.js +72 -0
  618. package/dist/ui/radio-group.js.map +1 -0
  619. package/dist/ui/radio-group.mjs +47 -0
  620. package/dist/ui/radio-group.mjs.map +1 -0
  621. package/dist/ui/select.d.ts +16 -0
  622. package/dist/ui/select.d.ts.map +1 -0
  623. package/dist/ui/select.js +213 -0
  624. package/dist/ui/select.js.map +1 -0
  625. package/dist/ui/select.mjs +180 -0
  626. package/dist/ui/select.mjs.map +1 -0
  627. package/dist/ui/separator.d.ts +5 -0
  628. package/dist/ui/separator.d.ts.map +1 -0
  629. package/dist/ui/separator.js +52 -0
  630. package/dist/ui/separator.js.map +1 -0
  631. package/dist/ui/separator.mjs +28 -0
  632. package/dist/ui/separator.mjs.map +1 -0
  633. package/dist/ui/sheet.d.ts +15 -0
  634. package/dist/ui/sheet.d.ts.map +1 -0
  635. package/dist/ui/sheet.js +160 -0
  636. package/dist/ui/sheet.js.map +1 -0
  637. package/dist/ui/sheet.mjs +129 -0
  638. package/dist/ui/sheet.mjs.map +1 -0
  639. package/dist/ui/sidebar.d.ts +70 -0
  640. package/dist/ui/sidebar.d.ts.map +1 -0
  641. package/dist/ui/sidebar.js +697 -0
  642. package/dist/ui/sidebar.js.map +1 -0
  643. package/dist/ui/sidebar.mjs +651 -0
  644. package/dist/ui/sidebar.mjs.map +1 -0
  645. package/dist/ui/skeleton.d.ts +3 -0
  646. package/dist/ui/skeleton.d.ts.map +1 -0
  647. package/dist/ui/skeleton.js +40 -0
  648. package/dist/ui/skeleton.js.map +1 -0
  649. package/dist/ui/skeleton.mjs +16 -0
  650. package/dist/ui/skeleton.mjs.map +1 -0
  651. package/dist/ui/table.d.ts +11 -0
  652. package/dist/ui/table.d.ts.map +1 -0
  653. package/dist/ui/table.js +147 -0
  654. package/dist/ui/table.js.map +1 -0
  655. package/dist/ui/table.mjs +116 -0
  656. package/dist/ui/table.mjs.map +1 -0
  657. package/dist/ui/tabs.d.ts +12 -0
  658. package/dist/ui/tabs.d.ts.map +1 -0
  659. package/dist/ui/tabs.js +121 -0
  660. package/dist/ui/tabs.js.map +1 -0
  661. package/{src/ui/tabs.tsx → dist/ui/tabs.mjs} +59 -56
  662. package/dist/ui/tabs.mjs.map +1 -0
  663. package/dist/ui/textarea.d.ts +4 -0
  664. package/dist/ui/textarea.d.ts.map +1 -0
  665. package/dist/ui/textarea.js +43 -0
  666. package/dist/ui/textarea.js.map +1 -0
  667. package/{src/ui/textarea.tsx → dist/ui/textarea.mjs} +16 -14
  668. package/dist/ui/textarea.mjs.map +1 -0
  669. package/dist/ui/toggle-group.d.ts +10 -0
  670. package/dist/ui/toggle-group.d.ts.map +1 -0
  671. package/dist/ui/toggle-group.js +105 -0
  672. package/dist/ui/toggle-group.js.map +1 -0
  673. package/dist/ui/toggle-group.mjs +70 -0
  674. package/dist/ui/toggle-group.mjs.map +1 -0
  675. package/dist/ui/toggle.d.ts +10 -0
  676. package/dist/ui/toggle.d.ts.map +1 -0
  677. package/dist/ui/toggle.js +70 -0
  678. package/dist/ui/toggle.js.map +1 -0
  679. package/{src/ui/toggle.tsx → dist/ui/toggle.mjs} +25 -26
  680. package/dist/ui/toggle.mjs.map +1 -0
  681. package/dist/ui/tooltip.d.ts +8 -0
  682. package/dist/ui/tooltip.d.ts.map +1 -0
  683. package/dist/ui/tooltip.js +84 -0
  684. package/dist/ui/tooltip.js.map +1 -0
  685. package/dist/ui/tooltip.mjs +57 -0
  686. package/dist/ui/tooltip.mjs.map +1 -0
  687. package/package.json +8 -1
  688. package/AGENTS.md +0 -1
  689. package/CHANGELOG.md +0 -155
  690. package/components.json +0 -33
  691. package/docs/standards/data-contracts.md +0 -81
  692. package/docs/standards/theming.md +0 -112
  693. package/scripts/fix-esm-extensions.mjs +0 -40
  694. package/src/blocks/application/app-shells/app-shell-1-sidebar.tsx +0 -198
  695. package/src/blocks/application/app-shells/app-shell-1.tsx +0 -196
  696. package/src/blocks/application/login-forms/login-page.test.tsx +0 -190
  697. package/src/blocks/application/login-forms/login-page.tsx +0 -240
  698. package/src/blocks/application/password-recovery/forgot-password-page-1-brand-mark.tsx +0 -38
  699. package/src/blocks/application/password-recovery/forgot-password-page-1.tsx +0 -318
  700. package/src/blocks/application/signup-forms/signup-page-1.tsx +0 -229
  701. package/src/blocks/application/verification/verify-1.tsx +0 -307
  702. package/src/blocks/application/verification/verify-confetti.tsx +0 -192
  703. package/src/blocks/application/viewport-ownership.test.tsx +0 -41
  704. package/src/blocks/e-commerce/category-filters/category-listing-filter-fields.tsx +0 -218
  705. package/src/blocks/e-commerce/category-filters/category-listing.test.tsx +0 -601
  706. package/src/blocks/e-commerce/category-filters/category-listing.tsx +0 -934
  707. package/src/blocks/e-commerce/checkout-forms/checkbox-check.tsx +0 -74
  708. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.tsx +0 -195
  709. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.test.tsx +0 -136
  710. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.tsx +0 -329
  711. package/src/blocks/e-commerce/checkout-forms/checkout-contact-step.tsx +0 -149
  712. package/src/blocks/e-commerce/checkout-forms/checkout-country-field.tsx +0 -53
  713. package/src/blocks/e-commerce/checkout-forms/checkout-field-feedback.tsx +0 -29
  714. package/src/blocks/e-commerce/checkout-forms/checkout-form-types.ts +0 -7
  715. package/src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx +0 -230
  716. package/src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx +0 -100
  717. package/src/blocks/e-commerce/checkout-forms/checkout-progress.tsx +0 -62
  718. package/src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx +0 -59
  719. package/src/blocks/e-commerce/checkout-forms/checkout-shipping-step.tsx +0 -180
  720. package/src/blocks/e-commerce/checkout-forms/checkout.test.tsx +0 -478
  721. package/src/blocks/e-commerce/checkout-forms/checkout.tsx +0 -550
  722. package/src/blocks/e-commerce/navigation/back-to-top.test.tsx +0 -27
  723. package/src/blocks/e-commerce/navigation/back-to-top.tsx +0 -71
  724. package/src/blocks/e-commerce/navigation/breadcrumb.test.tsx +0 -174
  725. package/src/blocks/e-commerce/navigation/breadcrumb.tsx +0 -130
  726. package/src/blocks/e-commerce/navigation/category-icon.test.tsx +0 -54
  727. package/src/blocks/e-commerce/navigation/category-icon.tsx +0 -94
  728. package/src/blocks/e-commerce/navigation/mega-menu.test.tsx +0 -139
  729. package/src/blocks/e-commerce/navigation/mega-menu.tsx +0 -271
  730. package/src/blocks/e-commerce/navigation/mobile-bottom-nav.test.tsx +0 -74
  731. package/src/blocks/e-commerce/navigation/mobile-bottom-nav.tsx +0 -78
  732. package/src/blocks/e-commerce/navigation/mobile-category-drawer.test.tsx +0 -192
  733. package/src/blocks/e-commerce/navigation/mobile-category-drawer.tsx +0 -278
  734. package/src/blocks/e-commerce/navigation/skip-to-content.test.tsx +0 -35
  735. package/src/blocks/e-commerce/navigation/skip-to-content.tsx +0 -37
  736. package/src/blocks/e-commerce/navigation/storefront-navbar-account-menu.test.tsx +0 -56
  737. package/src/blocks/e-commerce/navigation/storefront-navbar-account-menu.tsx +0 -134
  738. package/src/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.test.tsx +0 -204
  739. package/src/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.tsx +0 -371
  740. package/src/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.tsx +0 -96
  741. package/src/blocks/e-commerce/navigation/storefront-navbar-search-bar.tsx +0 -52
  742. package/src/blocks/e-commerce/navigation/storefront-navbar.test.tsx +0 -264
  743. package/src/blocks/e-commerce/navigation/storefront-navbar.tsx +0 -604
  744. package/src/blocks/e-commerce/order-history/order-history-1.tsx +0 -159
  745. package/src/blocks/e-commerce/order-history/order-history-2.tsx +0 -222
  746. package/src/blocks/e-commerce/product-categories/category-card-grid.test.tsx +0 -122
  747. package/src/blocks/e-commerce/product-categories/category-card.test.tsx +0 -68
  748. package/src/blocks/e-commerce/product-categories/category-card.tsx +0 -172
  749. package/src/blocks/e-commerce/product-categories/category-grid.test.tsx +0 -67
  750. package/src/blocks/e-commerce/product-categories/category-shared.tsx +0 -109
  751. package/src/blocks/e-commerce/product-categories/product-category-grid.tsx +0 -170
  752. package/src/blocks/e-commerce/product-categories/product-category.test.tsx +0 -266
  753. package/src/blocks/e-commerce/product-categories/product-category.tsx +0 -462
  754. package/src/blocks/e-commerce/product-list/product-card.test.tsx +0 -263
  755. package/src/blocks/e-commerce/product-list/product-card.tsx +0 -447
  756. package/src/blocks/e-commerce/product-list/product-grid.test.tsx +0 -162
  757. package/src/blocks/e-commerce/product-list/product-grid.tsx +0 -114
  758. package/src/blocks/e-commerce/product-list/product-showcase-1.test.tsx +0 -78
  759. package/src/blocks/e-commerce/product-list/product-showcase-1.tsx +0 -277
  760. package/src/blocks/e-commerce/product-overview/product-overview-gallery.tsx +0 -71
  761. package/src/blocks/e-commerce/product-overview/product-overview-lightbox-tab.tsx +0 -116
  762. package/src/blocks/e-commerce/product-overview/product-overview-reviews-tab.tsx +0 -105
  763. package/src/blocks/e-commerce/product-overview/product-overview-tabs.tsx +0 -70
  764. package/src/blocks/e-commerce/product-overview/product-overview.test.tsx +0 -283
  765. package/src/blocks/e-commerce/product-overview/product-overview.tsx +0 -1186
  766. package/src/blocks/e-commerce/product-overview/product-quick-view-card.tsx +0 -135
  767. package/src/blocks/e-commerce/product-overview/product-quick-view-dialog.tsx +0 -393
  768. package/src/blocks/e-commerce/product-overview/product-quick-view.tsx +0 -136
  769. package/src/blocks/e-commerce/reviews/review-rating-1-review-form.tsx +0 -133
  770. package/src/blocks/e-commerce/reviews/review-rating-1.tsx +0 -178
  771. package/src/blocks/e-commerce/reviews/review-rating-2.tsx +0 -245
  772. package/src/blocks/e-commerce/shopping-carts/shopping-cart.test.tsx +0 -399
  773. package/src/blocks/e-commerce/shopping-carts/shopping-cart.tsx +0 -628
  774. package/src/blocks/e-commerce/store-containers/store-container-1.tsx +0 -29
  775. package/src/blocks/e-commerce/storefront-hero/storefront-hero.test.tsx +0 -412
  776. package/src/blocks/e-commerce/storefront-hero/storefront-hero.tsx +0 -1283
  777. package/src/blocks/marketing/banners/avatar-group.tsx +0 -69
  778. package/src/blocks/marketing/banners/banner-1.tsx +0 -188
  779. package/src/blocks/marketing/cta/cta-section-1.tsx +0 -112
  780. package/src/blocks/marketing/faq/faq-block-1.tsx +0 -45
  781. package/src/blocks/marketing/features/feature.test.tsx +0 -153
  782. package/src/blocks/marketing/features/feature.tsx +0 -195
  783. package/src/blocks/marketing/footers/footer-section-accessibility.test.tsx +0 -118
  784. package/src/blocks/marketing/footers/footer-section-actions.test.tsx +0 -131
  785. package/src/blocks/marketing/footers/footer-section-data.test.tsx +0 -127
  786. package/src/blocks/marketing/footers/footer-section-native-links.test.tsx +0 -100
  787. package/src/blocks/marketing/footers/footer-section-public-api.test.tsx +0 -11
  788. package/src/blocks/marketing/footers/footer-section.test.tsx +0 -46
  789. package/src/blocks/marketing/footers/footer-section.tsx +0 -532
  790. package/src/blocks/marketing/hero-sections/avatar-group.tsx +0 -86
  791. package/src/blocks/marketing/hero-sections/hero-section-1.tsx +0 -135
  792. package/src/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.tsx +0 -52
  793. package/src/blocks/marketing/logo-clouds/logo-cloud-1.tsx +0 -56
  794. package/src/blocks/marketing/navbars/navbar-public-api.test.tsx +0 -57
  795. package/src/blocks/marketing/navbars/navbar.mega.test.tsx +0 -149
  796. package/src/blocks/marketing/navbars/navbar.test.tsx +0 -155
  797. package/src/blocks/marketing/navbars/navbar.tsx +0 -735
  798. package/src/blocks/marketing/pricing/pricing-section-1.tsx +0 -94
  799. package/src/blocks/marketing/statistics/statistic-1.tsx +0 -93
  800. package/src/blocks/marketing/testimonials/testimonial-section.test.tsx +0 -171
  801. package/src/blocks/marketing/testimonials/testimonial-section.tsx +0 -237
  802. package/src/blocks/shared/reaction-toggle.tsx +0 -145
  803. package/src/hooks/use-mobile.ts +0 -19
  804. package/src/index.ts +0 -284
  805. package/src/lib/cart.test.ts +0 -15
  806. package/src/lib/contracts-curated.test.ts +0 -225
  807. package/src/lib/contracts-server-boundary.test.ts +0 -52
  808. package/src/lib/contracts.test.ts +0 -228
  809. package/src/lib/contracts.ts +0 -857
  810. package/src/lib/money.test.ts +0 -64
  811. package/src/lib/money.ts +0 -65
  812. package/src/lib/types/menu.ts +0 -43
  813. package/src/lib/types.ts +0 -4
  814. package/src/lib/utils.ts +0 -10
  815. package/src/ui/accordion.tsx +0 -65
  816. package/src/ui/badge.tsx +0 -47
  817. package/src/ui/breadcrumb.tsx +0 -108
  818. package/src/ui/button-group.tsx +0 -83
  819. package/src/ui/button.tsx +0 -63
  820. package/src/ui/card.tsx +0 -91
  821. package/src/ui/carousel.tsx +0 -241
  822. package/src/ui/dialog.tsx +0 -158
  823. package/src/ui/drawer.tsx +0 -134
  824. package/src/ui/dropdown-menu.tsx +0 -256
  825. package/src/ui/empty.tsx +0 -103
  826. package/src/ui/input-otp.tsx +0 -76
  827. package/src/ui/label.tsx +0 -23
  828. package/src/ui/pagination.tsx +0 -127
  829. package/src/ui/progress.tsx +0 -30
  830. package/src/ui/radio-group.tsx +0 -44
  831. package/src/ui/select.tsx +0 -189
  832. package/src/ui/separator.tsx +0 -27
  833. package/src/ui/sheet.tsx +0 -142
  834. package/src/ui/sidebar.tsx +0 -726
  835. package/src/ui/skeleton.tsx +0 -13
  836. package/src/ui/table.tsx +0 -115
  837. package/src/ui/toggle-group.tsx +0 -83
  838. package/src/ui/tooltip.tsx +0 -56
  839. package/tsconfig.build.json +0 -12
  840. package/tsconfig.json +0 -20
  841. package/tsup.config.ts +0 -19
  842. package/vitest.config.ts +0 -17
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/product-overview/product-overview.tsx"],"sourcesContent":["'use client'\n\nimport { useEffect, useState } from 'react'\nimport { Camera, Check, Heart, Info, MessageSquare, Minus, Package, Plus, Share2, ShoppingCart, Star, Truck } from 'lucide-react'\nimport type { Image, Money, ProductOption, SelectedOption } from '@thorprovider/types'\nimport { Button } from '../../../ui/button'\nimport { Card, CardContent } from '../../../ui/card'\nimport { Separator } from '../../../ui/separator'\nimport { cn } from '../../../lib/utils'\nimport { PRODUCT_IMAGE_FALLBACK } from '../../../lib/contracts'\nimport { formatMoney, isAvailableMoney } from '../../../lib/money'\nimport { ReactionToggle } from '../../shared/reaction-toggle'\nimport { Carousel, CarouselContent, CarouselItem, type CarouselApi } from '../../../ui/carousel'\nimport { ProductOverviewGallery } from './product-overview-gallery'\nimport { ProductOverviewLightboxTab } from './product-overview-lightbox-tab'\nimport { ProductOverviewReviewsTab, type ProductOverviewReview } from './product-overview-reviews-tab'\nimport {\n ProductOverviewTabs,\n ProductOverviewTabsContentFade,\n ProductOverviewTabsIndicator,\n ProductOverviewTabsList,\n ProductOverviewTabsTrigger,\n} from './product-overview-tabs'\n\n/**\n * Canonical product-detail projection.\n *\n * The block consumes the canonical `@thorprovider/types` shapes (`Money`,\n * `ProductOption`, `SelectedOption`, `Image`) so adapter output maps without a\n * second, drifting product type. The only deviation is `price`: the canon marks\n * it required, but a missing/unresolved backend price is a real, distinct state\n * that must disable purchase — so the projection allows `price` to be absent\n * and the block treats absence as \"unavailable\", never as zero.\n */\nexport interface ProductDetailVariant {\n id: string\n title: string\n sku?: string\n availableForSale: boolean\n selectedOptions: SelectedOption[]\n /** Canonical Money; omit/null when the backend has no resolved price. */\n price?: Money | null\n compareAtPrice?: Money\n image?: Image\n}\n\nexport interface ProductDetailProduct {\n id: string\n handle?: string\n title: string\n description?: string\n vendor?: string\n options: ProductOption[]\n variants: ProductDetailVariant[]\n images: Image[]\n featuredImage?: Image\n}\n\nexport interface ProductOverviewRating {\n value: number\n count: number\n}\n\n/**\n * The bounded presentation surface. `standard` is the straightforward detail\n * layout, `gallery` is image-forward, and `rich` adds tabbed overview/specs/\n * reviews/gallery. The value changes structure, never the data contract.\n */\nexport type ProductOverviewPresentation = 'standard' | 'gallery' | 'rich'\n\nexport interface ProductOverviewProps {\n product: ProductDetailProduct\n /** Bounded presentation option; defaults to `standard`. */\n presentation?: ProductOverviewPresentation\n /** Controlled selection: the backend variant id, or null/undefined when nothing is explicitly selected. */\n selectedVariantId?: string | null\n onSelectVariant?: (variantId: string) => void\n /** Controlled quantity for the add-to-cart action; defaults to 1 when omitted. */\n quantity?: number\n onQuantityChange?: (quantity: number) => void\n /** Add-to-cart identity is the selected backend variant id, with the requested quantity. */\n onAddToCart?: (variantId: string, quantity: number) => void\n isWishlisted?: boolean\n onToggleWishlist?: (variantId: string, isWishlisted: boolean) => void\n /** Optional share action (used by the `rich` presentation). */\n onShare?: () => void\n /** Rendered only when the backend supplies it. */\n rating?: ProductOverviewRating\n /** Rendered only when the backend supplies it. */\n deliveryEstimate?: string\n /** Rendered only when the backend supplies it. */\n shipping?: Money\n formatPrice?: (money: Money) => string\n /** `rich`-only optional data. Omitted sections render no chrome. */\n specifications?: Record<string, string>\n /** `rich`-only optional data. Omitted sections render no chrome. */\n features?: string[]\n /** `rich`-only optional data. Omitted sections render no chrome. */\n reviews?: ProductOverviewReview[]\n sizesLabel?: string\n variantLabel?: string\n reviewsLabel?: string\n addToCartLabel?: string\n outOfStockLabel?: string\n unavailablePriceLabel?: string\n selectVariantLabel?: string\n quantityLabel?: string\n deliveryEstimateLabel?: string\n shippingLabel?: string\n removeFromWishlistLabel?: string\n addToWishlistLabel?: string\n imageFallback?: string\n /** `gallery`/`rich` labels. */\n badgeLabel?: string\n availabilityLabel?: string\n skuLabel?: string\n overviewLabel?: string\n specsLabel?: string\n featuresLabel?: string\n specificationsLabel?: string\n galleryLabel?: string\n photosLabel?: string\n saveLabel?: string\n savedLabel?: string\n shareLabel?: string\n basedOnReviewsLabel?: string\n foundHelpfulLabel?: string\n ofCounterLabel?: string\n freeDeliveryLabel?: string\n}\n\nexport function variantLabelOf(variant: ProductDetailVariant): string {\n if (variant.title.trim() !== '') return variant.title\n return variant.selectedOptions.map(option => option.value).join(' / ')\n}\n\n/**\n * The add-to-cart payload contract: the explicitly selected backend variant id\n * and a positive quantity (defaults to 1). Returns `null` when no variant has\n * been selected — the block never substitutes the first variant.\n */\nexport function resolveAddToCartPayload(\n variant: ProductDetailVariant | null,\n quantity: number | undefined,\n): { variantId: string; quantity: number } | null {\n if (!variant) return null\n return {\n variantId: variant.id,\n quantity: typeof quantity === 'number' && quantity > 0 ? quantity : 1,\n }\n}\n\nexport function galleryImages(product: ProductDetailProduct, fallback: string): string[] {\n const images = product.images\n .map(image => image.url)\n .filter((url): url is string => typeof url === 'string' && url.trim() !== '')\n if (images.length > 0) return images\n const featured = product.featuredImage?.url\n if (typeof featured === 'string' && featured.trim() !== '') return [featured]\n return [fallback]\n}\n\ninterface ResolvedSelection {\n selectedVariant: ProductDetailVariant | null\n selectedPrice: Money | null | undefined\n selectedCompareAt: Money | undefined\n priceAvailable: boolean\n compareAtAvailable: boolean\n canPurchase: boolean\n quantityValue: number\n addPayload: { variantId: string; quantity: number } | null\n}\n\nexport default function ProductOverview({\n product,\n presentation = 'standard',\n selectedVariantId,\n onSelectVariant,\n quantity,\n onQuantityChange,\n onAddToCart,\n isWishlisted = false,\n onToggleWishlist,\n onShare,\n rating,\n deliveryEstimate,\n shipping,\n formatPrice,\n specifications,\n features,\n reviews,\n sizesLabel = 'Variantes',\n variantLabel = 'Variante',\n reviewsLabel = 'Reseñas',\n addToCartLabel = 'Agregar al carrito',\n outOfStockLabel = 'Agotado',\n unavailablePriceLabel = 'Precio no disponible',\n selectVariantLabel = 'Selecciona una variante',\n quantityLabel = 'Cantidad',\n deliveryEstimateLabel = 'Entrega estimada',\n shippingLabel = 'Envío',\n removeFromWishlistLabel = 'Quitar de favoritos',\n addToWishlistLabel = 'Agregar a favoritos',\n imageFallback = PRODUCT_IMAGE_FALLBACK,\n badgeLabel,\n availabilityLabel = 'Disponible',\n skuLabel = 'SKU',\n overviewLabel = 'Resumen',\n specsLabel = 'Especificaciones',\n featuresLabel = 'Características clave',\n specificationsLabel = 'Especificaciones técnicas',\n galleryLabel = 'Galería',\n photosLabel = 'fotos',\n saveLabel = 'Guardar',\n savedLabel = 'Guardado',\n shareLabel = 'Compartir',\n basedOnReviewsLabel = 'Basado en {count} reseñas',\n foundHelpfulLabel = '{count} personas encontraron esto útil',\n ofCounterLabel = '{current} de {total}',\n freeDeliveryLabel,\n}: ProductOverviewProps) {\n const [selectedImage, setSelectedImage] = useState(0)\n const [carouselApi, setCarouselApi] = useState<CarouselApi>()\n\n useEffect(() => {\n if (!carouselApi) return\n carouselApi.scrollTo(selectedImage)\n const handleSelect = () => setSelectedImage(carouselApi.selectedScrollSnap())\n carouselApi.on('select', handleSelect)\n return () => {\n carouselApi.off('select', handleSelect)\n }\n }, [carouselApi, selectedImage])\n\n const selectedVariant =\n selectedVariantId != null\n ? product.variants.find(variant => variant.id === selectedVariantId) ?? null\n : null\n\n const selectedPrice = selectedVariant?.price\n const selectedCompareAt = selectedVariant?.compareAtPrice\n const priceAvailable = isAvailableMoney(selectedPrice)\n const compareAtAvailable = isAvailableMoney(selectedCompareAt)\n const canPurchase = Boolean(selectedVariant?.availableForSale) && priceAvailable\n const quantityValue = quantity ?? 1\n const addPayload = resolveAddToCartPayload(selectedVariant, quantityValue)\n\n const images = galleryImages(product, imageFallback)\n const hasRealImages = images[0] !== imageFallback || product.featuredImage != null\n const activeImage = images[Math.min(selectedImage, images.length - 1)]\n\n const selection: ResolvedSelection = {\n selectedVariant,\n selectedPrice,\n selectedCompareAt,\n priceAvailable,\n compareAtAvailable,\n canPurchase,\n quantityValue,\n addPayload,\n }\n\n const handleAddToCart = () => {\n if (onAddToCart && addPayload) onAddToCart(addPayload.variantId, addPayload.quantity)\n }\n const handleToggleWishlist = () => {\n if (!selectedVariant || !onToggleWishlist) return\n onToggleWishlist(selectedVariant.id, !isWishlisted)\n }\n\n if (presentation === 'gallery') {\n return (\n <GalleryPresentation\n product={product}\n selection={selection}\n images={images}\n activeImage={activeImage}\n selectedImage={selectedImage}\n onSelectImage={setSelectedImage}\n setCarouselApi={setCarouselApi}\n onSelectVariant={onSelectVariant}\n onQuantityChange={onQuantityChange}\n onAddToCart={handleAddToCart}\n isWishlisted={isWishlisted}\n onToggleWishlist={onToggleWishlist ? handleToggleWishlist : undefined}\n rating={rating}\n formatPrice={formatPrice}\n labels={{\n reviewsLabel,\n addToCartLabel,\n outOfStockLabel,\n unavailablePriceLabel,\n selectVariantLabel,\n quantityLabel,\n removeFromWishlistLabel,\n addToWishlistLabel,\n freeDeliveryLabel,\n }}\n />\n )\n }\n\n if (presentation === 'rich') {\n return (\n <RichPresentation\n product={product}\n selection={selection}\n images={images}\n selectedImage={selectedImage}\n onSelectImage={setSelectedImage}\n onSelectVariant={onSelectVariant}\n onQuantityChange={onQuantityChange}\n onAddToCart={handleAddToCart}\n isWishlisted={isWishlisted}\n onToggleWishlist={onToggleWishlist ? handleToggleWishlist : undefined}\n onShare={onShare}\n rating={rating}\n formatPrice={formatPrice}\n specifications={specifications}\n features={features}\n reviews={reviews}\n labels={{\n reviewsLabel,\n addToCartLabel,\n outOfStockLabel,\n unavailablePriceLabel,\n selectVariantLabel,\n quantityLabel,\n removeFromWishlistLabel,\n addToWishlistLabel,\n badgeLabel,\n availabilityLabel,\n skuLabel,\n overviewLabel,\n specsLabel,\n featuresLabel,\n specificationsLabel,\n galleryLabel,\n photosLabel,\n saveLabel,\n savedLabel,\n shareLabel,\n basedOnReviewsLabel,\n foundHelpfulLabel,\n ofCounterLabel,\n }}\n />\n )\n }\n\n return (\n <StandardPresentation\n product={product}\n selection={selection}\n images={images}\n activeImage={activeImage}\n selectedImage={selectedImage}\n onSelectImage={setSelectedImage}\n onSelectVariant={onSelectVariant}\n onQuantityChange={onQuantityChange}\n onAddToCart={handleAddToCart}\n isWishlisted={isWishlisted}\n onToggleWishlist={onToggleWishlist ? handleToggleWishlist : undefined}\n rating={rating}\n deliveryEstimate={deliveryEstimate}\n shipping={shipping}\n formatPrice={formatPrice}\n hasRealImages={hasRealImages}\n labels={{\n sizesLabel,\n variantLabel,\n reviewsLabel,\n addToCartLabel,\n outOfStockLabel,\n unavailablePriceLabel,\n selectVariantLabel,\n quantityLabel,\n deliveryEstimateLabel,\n shippingLabel,\n removeFromWishlistLabel,\n addToWishlistLabel,\n }}\n />\n )\n}\n\ninterface SharedLabels {\n reviewsLabel: string\n addToCartLabel: string\n outOfStockLabel: string\n unavailablePriceLabel: string\n selectVariantLabel: string\n quantityLabel: string\n removeFromWishlistLabel: string\n addToWishlistLabel: string\n}\n\nfunction VariantSelector({\n product,\n selectedVariantId,\n onSelectVariant,\n sizesLabel,\n variantLabel,\n outOfStockLabel,\n}: {\n product: ProductDetailProduct\n selectedVariantId?: string | null\n onSelectVariant?: (variantId: string) => void\n sizesLabel: string\n variantLabel: string\n outOfStockLabel: string\n}) {\n if (product.variants.length === 0) return null\n return (\n <div className='flex flex-col gap-2'>\n <h3 className='font-bold'>{sizesLabel}</h3>\n <div className='flex flex-wrap gap-3'>\n {product.variants.map(variant => {\n const isSelected = variant.id === selectedVariantId\n return (\n <Button\n key={variant.id}\n variant={isSelected ? 'default' : 'outline'}\n onClick={onSelectVariant ? () => onSelectVariant(variant.id) : undefined}\n disabled={!variant.availableForSale}\n aria-pressed={isSelected}\n className='h-9 cursor-pointer rounded-full px-4'\n >\n {variantLabelOf(variant)}\n {!variant.availableForSale ? (\n <span className='text-muted-foreground ms-2 text-xs font-normal'>{outOfStockLabel}</span>\n ) : null}\n </Button>\n )\n })}\n </div>\n {variantLabel ? (\n <span className='sr-only'>{variantLabel}</span>\n ) : null}\n </div>\n )\n}\n\nfunction QuantityStepper({\n quantityValue,\n quantityLabel,\n onQuantityChange,\n}: {\n quantityValue: number\n quantityLabel: string\n onQuantityChange: (quantity: number) => void\n}) {\n return (\n <div className='flex flex-col gap-2'>\n <h3 className='font-bold'>{quantityLabel}</h3>\n <div className='border-border flex w-fit items-center rounded-md border'>\n <Button\n type='button'\n variant='ghost'\n size='icon'\n className='size-9 rounded-r-none'\n aria-label={`${quantityLabel} -1`}\n onClick={() => onQuantityChange(Math.max(1, quantityValue - 1))}\n disabled={quantityValue <= 1}\n >\n <Minus />\n </Button>\n <span className='w-10 text-center text-sm tabular-nums'>{quantityValue}</span>\n <Button\n type='button'\n variant='ghost'\n size='icon'\n className='size-9 rounded-l-none'\n aria-label={`${quantityLabel} +1`}\n onClick={() => onQuantityChange(quantityValue + 1)}\n >\n <Plus />\n </Button>\n </div>\n </div>\n )\n}\n\nfunction WishlistButton({\n isWishlisted,\n disabled,\n onToggleWishlist,\n removeFromWishlistLabel,\n addToWishlistLabel,\n className,\n}: {\n isWishlisted: boolean\n disabled: boolean\n onToggleWishlist?: () => void\n removeFromWishlistLabel: string\n addToWishlistLabel: string\n className?: string\n}) {\n // Purpose-gated: no wishlist handler means no wishlist affordance. A visible\n // button that does nothing is a dead control, so it is not rendered at all.\n if (!onToggleWishlist) return null\n return (\n <Button\n variant='outline'\n size='icon'\n className={cn('cursor-pointer', className)}\n disabled={disabled}\n onClick={onToggleWishlist}\n aria-pressed={isWishlisted}\n aria-label={isWishlisted ? removeFromWishlistLabel : addToWishlistLabel}\n >\n <ReactionToggle\n active={isWishlisted}\n icon={Heart}\n iconClassName='size-5'\n activeColorClassName='text-primary'\n />\n </Button>\n )\n}\n\nfunction StandardPresentation({\n product,\n selection,\n images,\n activeImage,\n selectedImage,\n onSelectImage,\n onSelectVariant,\n onQuantityChange,\n onAddToCart,\n isWishlisted,\n onToggleWishlist,\n rating,\n deliveryEstimate,\n shipping,\n formatPrice,\n hasRealImages,\n labels,\n}: {\n product: ProductDetailProduct\n selection: ResolvedSelection\n images: string[]\n activeImage: string\n selectedImage: number\n onSelectImage: (index: number) => void\n onSelectVariant?: (variantId: string) => void\n onQuantityChange?: (quantity: number) => void\n onAddToCart: () => void\n isWishlisted: boolean\n onToggleWishlist?: () => void\n rating?: ProductOverviewRating\n deliveryEstimate?: string\n shipping?: Money\n formatPrice?: (money: Money) => string\n hasRealImages: boolean\n labels: SharedLabels & {\n sizesLabel: string\n variantLabel: string\n deliveryEstimateLabel: string\n shippingLabel: string\n }\n}) {\n const { selectedVariant, selectedPrice, selectedCompareAt, priceAvailable, compareAtAvailable, canPurchase, quantityValue } =\n selection\n\n return (\n <div>\n <section className='@container mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid grid-cols-1 gap-6 py-4 lg:grid-cols-2 lg:gap-8 lg:py-6 xl:grid-cols-3 xl:gap-12 xl:py-12'>\n <div className='flex flex-col justify-between gap-6 lg:gap-8'>\n <div className='flex flex-col gap-2 lg:gap-4'>\n {product.vendor ? (\n <span className='text-sm font-semibold tracking-wide uppercase'>{product.vendor}</span>\n ) : null}\n <h2 className='text-xl font-bold tracking-tight text-balance lg:text-3xl'>{product.title}</h2>\n {product.description ? (\n <p className='text-muted-foreground text-balance'>{product.description}</p>\n ) : null}\n\n {selectedVariant ? (\n priceAvailable ? (\n <p className='text-2xl font-bold tracking-tight'>\n {formatMoney(selectedPrice, formatPrice)}\n {compareAtAvailable ? (\n <span className='text-muted-foreground ms-2 text-base font-normal line-through'>\n {formatMoney(selectedCompareAt, formatPrice)}\n </span>\n ) : null}\n </p>\n ) : (\n <p className='text-muted-foreground text-sm'>{labels.unavailablePriceLabel}</p>\n )\n ) : (\n <p className='text-muted-foreground text-sm'>{labels.selectVariantLabel}</p>\n )}\n </div>\n\n {hasRealImages ? (\n <div className='flex flex-wrap gap-4'>\n {images.map((url, index) => (\n <button\n key={`${product.id}:image:${index}`}\n type='button'\n onClick={() => onSelectImage(index)}\n aria-label={`${product.title} ${index + 1}`}\n aria-pressed={selectedImage === index}\n className={cn(\n 'ring-offset-background size-16 cursor-pointer overflow-hidden rounded-sm ring-offset-2 transition-all lg:size-18',\n selectedImage === index && 'ring-foreground ring-2',\n )}\n >\n <img src={url || undefined} alt='' className='size-full object-cover' />\n </button>\n ))}\n </div>\n ) : null}\n </div>\n\n <div className='row-span-2 row-start-1 lg:col-start-2'>\n <div className='bg-muted aspect-square w-full overflow-hidden rounded-lg'>\n <img src={activeImage || undefined} alt={product.title} className='h-90 w-full object-cover' />\n </div>\n </div>\n\n <div className='flex flex-col gap-6 lg:gap-10'>\n <VariantSelector\n product={product}\n selectedVariantId={selectedVariant?.id}\n onSelectVariant={onSelectVariant}\n sizesLabel={labels.sizesLabel}\n variantLabel={labels.variantLabel}\n outOfStockLabel={labels.outOfStockLabel}\n />\n\n {selectedVariant && selectedVariant.selectedOptions.length > 0 ? (\n <p className='text-muted-foreground text-sm'>\n {selectedVariant.selectedOptions\n .map((option: SelectedOption) => `${option.name}: ${option.value}`)\n .join(' · ')}\n </p>\n ) : null}\n\n {rating ? (\n <div className='flex flex-col gap-2'>\n <h3 className='font-bold'>{labels.reviewsLabel}</h3>\n <div className='flex items-center gap-2'>\n <div className='flex gap-1' aria-hidden='true'>\n {[0, 1, 2, 3, 4].map(index => (\n <Star\n key={index}\n className='text-foreground size-5'\n fill={index < rating.value ? 'currentColor' : 'none'}\n />\n ))}\n </div>\n <span className='text-muted-foreground text-sm tabular-nums'>\n {`${rating.value} (${rating.count})`}\n </span>\n </div>\n </div>\n ) : null}\n\n {onQuantityChange ? (\n <QuantityStepper\n quantityValue={quantityValue}\n quantityLabel={labels.quantityLabel}\n onQuantityChange={onQuantityChange}\n />\n ) : null}\n\n {deliveryEstimate || shipping ? (\n <dl className='text-muted-foreground flex flex-col gap-1 text-sm'>\n {deliveryEstimate ? (\n <div className='flex gap-2'>\n <dt>{labels.deliveryEstimateLabel}</dt>\n <dd className='text-foreground'>{deliveryEstimate}</dd>\n </div>\n ) : null}\n {isAvailableMoney(shipping) ? (\n <div className='flex gap-2'>\n <dt>{labels.shippingLabel}</dt>\n <dd className='text-foreground'>{formatMoney(shipping, formatPrice)}</dd>\n </div>\n ) : null}\n </dl>\n ) : null}\n\n <div className='flex gap-4'>\n <Button\n className='h-10 flex-1 cursor-pointer rounded-full px-8'\n size='lg'\n disabled={!canPurchase}\n onClick={onAddToCart}\n >\n {labels.addToCartLabel}\n </Button>\n <WishlistButton\n isWishlisted={isWishlisted}\n disabled={!selectedVariant}\n onToggleWishlist={onToggleWishlist}\n removeFromWishlistLabel={labels.removeFromWishlistLabel}\n addToWishlistLabel={labels.addToWishlistLabel}\n className='size-9 rounded-full'\n />\n </div>\n </div>\n </div>\n </section>\n </div>\n )\n}\n\nfunction GalleryPresentation({\n product,\n selection,\n images,\n activeImage,\n selectedImage,\n onSelectImage,\n setCarouselApi,\n onSelectVariant,\n onQuantityChange,\n onAddToCart,\n isWishlisted,\n onToggleWishlist,\n rating,\n formatPrice,\n labels,\n}: {\n product: ProductDetailProduct\n selection: ResolvedSelection\n images: string[]\n activeImage: string\n selectedImage: number\n onSelectImage: (index: number) => void\n setCarouselApi: (api: CarouselApi | undefined) => void\n onSelectVariant?: (variantId: string) => void\n onQuantityChange?: (quantity: number) => void\n onAddToCart: () => void\n isWishlisted: boolean\n onToggleWishlist?: () => void\n rating?: ProductOverviewRating\n formatPrice?: (money: Money) => string\n labels: SharedLabels & { freeDeliveryLabel?: string }\n}) {\n const { selectedVariant, selectedPrice, selectedCompareAt, priceAvailable, compareAtAvailable, canPurchase, quantityValue } =\n selection\n\n return (\n <section className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid grid-cols-1 gap-8 py-4 md:py-6 lg:grid-cols-2 lg:py-12'>\n <div className='flex flex-col gap-4'>\n <Carousel setApi={setCarouselApi} className='w-full'>\n <CarouselContent>\n {images.map((url, index) => (\n <CarouselItem key={`${product.id}:carousel:${index}`}>\n <div className='bg-muted flex h-130 w-full items-center justify-center overflow-hidden rounded-lg'>\n <img src={url || undefined} alt={`${product.title} ${index + 1}`} className='h-full w-full object-cover' />\n </div>\n </CarouselItem>\n ))}\n </CarouselContent>\n </Carousel>\n\n <div className='flex flex-wrap gap-4'>\n {images.map((url, index) => (\n <button\n type='button'\n key={`${product.id}:thumb:${index}`}\n onClick={() => onSelectImage(index)}\n aria-label={`Mostrar imagen ${index + 1} de ${product.title}`}\n aria-pressed={selectedImage === index}\n className='aspect-square size-16 cursor-pointer'\n >\n <img\n src={url || undefined}\n alt={`${product.title} ${index + 1}`}\n className={cn(\n 'size-full cursor-pointer rounded-md object-cover ring-offset-2 transition-all',\n selectedImage === index ? 'ring-foreground ring-2' : '',\n )}\n />\n </button>\n ))}\n </div>\n </div>\n\n <div className='flex flex-col gap-6'>\n <header className='flex flex-col gap-4'>\n <div className='flex items-center'>\n <Button variant='ghost' size='icon' className='bg-primary size-6 scale-75 cursor-pointer rounded-full'>\n <Check className='text-primary-foreground size-4' />\n </Button>\n {product.vendor ? <span className='ms-2 font-medium'>{product.vendor}</span> : null}\n {selectedVariant?.sku ? (\n <span className='text-muted-foreground ms-auto'>{selectedVariant.sku}</span>\n ) : null}\n </div>\n <h1 className='text-xl font-bold text-balance xl:text-3xl'>{product.title}</h1>\n\n {rating ? (\n <div className='flex items-center gap-2'>\n <div className='flex'>\n {[0, 1, 2, 3, 4].map(i => (\n <Star\n key={i}\n className={cn(\n 'size-5',\n i < rating.value ? 'fill-foreground text-foreground' : 'text-muted-foreground',\n )}\n />\n ))}\n </div>\n <span className='text-muted-foreground text-sm'>\n {rating.count} {labels.reviewsLabel}\n </span>\n </div>\n ) : null}\n </header>\n\n {selectedVariant ? (\n priceAvailable ? (\n <p className='text-4xl font-bold'>\n {formatMoney(selectedPrice, formatPrice)}\n {compareAtAvailable ? (\n <span className='text-muted-foreground ms-2 text-xl font-normal line-through'>\n {formatMoney(selectedCompareAt, formatPrice)}\n </span>\n ) : null}\n </p>\n ) : (\n <p className='text-muted-foreground text-sm'>{labels.unavailablePriceLabel}</p>\n )\n ) : (\n <p className='text-muted-foreground text-sm'>{labels.selectVariantLabel}</p>\n )}\n\n <VariantSelector\n product={product}\n selectedVariantId={selectedVariant?.id}\n onSelectVariant={onSelectVariant}\n sizesLabel={labels.selectVariantLabel}\n variantLabel=''\n outOfStockLabel={labels.outOfStockLabel}\n />\n\n {onQuantityChange ? (\n <QuantityStepper\n quantityValue={quantityValue}\n quantityLabel={labels.quantityLabel}\n onQuantityChange={onQuantityChange}\n />\n ) : null}\n\n <div className='flex gap-4'>\n <Button className='h-12 flex-1 cursor-pointer rounded-md' size='lg' disabled={!canPurchase} onClick={onAddToCart}>\n <ShoppingCart />\n {labels.addToCartLabel}\n </Button>\n <WishlistButton\n isWishlisted={isWishlisted}\n disabled={!selectedVariant}\n onToggleWishlist={onToggleWishlist}\n removeFromWishlistLabel={labels.removeFromWishlistLabel}\n addToWishlistLabel={labels.addToWishlistLabel}\n className='border-input size-12 rounded-md'\n />\n </div>\n\n {labels.freeDeliveryLabel ? (\n <div className='text-muted-foreground flex items-center justify-center gap-2 text-sm'>\n <Truck className='size-4' />\n <span>{labels.freeDeliveryLabel}</span>\n </div>\n ) : null}\n </div>\n </div>\n </section>\n )\n}\n\nfunction RichPresentation({\n product,\n selection,\n images,\n selectedImage,\n onSelectImage,\n onSelectVariant,\n onQuantityChange,\n onAddToCart,\n isWishlisted,\n onToggleWishlist,\n onShare,\n rating,\n formatPrice,\n specifications,\n features,\n reviews,\n labels,\n}: {\n product: ProductDetailProduct\n selection: ResolvedSelection\n images: string[]\n selectedImage: number\n onSelectImage: (index: number) => void\n onSelectVariant?: (variantId: string) => void\n onQuantityChange?: (quantity: number) => void\n onAddToCart: () => void\n isWishlisted: boolean\n onToggleWishlist?: () => void\n onShare?: () => void\n rating?: ProductOverviewRating\n formatPrice?: (money: Money) => string\n specifications?: Record<string, string>\n features?: string[]\n reviews?: ProductOverviewReview[]\n labels: SharedLabels & {\n badgeLabel?: string\n availabilityLabel: string\n skuLabel: string\n overviewLabel: string\n specsLabel: string\n featuresLabel: string\n specificationsLabel: string\n galleryLabel: string\n photosLabel: string\n saveLabel: string\n savedLabel: string\n shareLabel: string\n basedOnReviewsLabel: string\n foundHelpfulLabel: string\n ofCounterLabel: string\n }\n}) {\n const { selectedVariant, selectedPrice, selectedCompareAt, priceAvailable, compareAtAvailable, canPurchase, quantityValue } =\n selection\n\n const featureList = features && features.length > 0 ? features : undefined\n const specEntries = specifications ? Object.entries(specifications) : []\n const hasSpecs = specEntries.length > 0\n const hasReviews = Boolean(reviews && reviews.length > 0)\n const hasGallery = images.length > 1\n const hasTabs = Boolean(featureList) || hasSpecs || hasReviews || hasGallery\n const reviewCount = reviews?.length ?? 0\n\n // The initial tab is computed once and frozen: Base UI's uncontrolled Tabs warns if\n // `defaultValue` changes after mount, and this expression tracks the data-derived tab set\n // (which changes when optional props like `specifications` appear or disappear).\n const [defaultTab] = useState(() =>\n featureList ? 'overview' : hasSpecs ? 'specs' : hasReviews ? 'reviews' : 'gallery',\n )\n\n return (\n <section className='py-12'>\n <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>\n <div className='grid gap-12 lg:grid-cols-2'>\n <ProductOverviewGallery\n images={images}\n title={product.title}\n badgeLabel={labels.badgeLabel}\n selectedImage={selectedImage}\n onSelectImage={onSelectImage}\n photosLabel={labels.photosLabel}\n />\n\n <div className='flex flex-col gap-8'>\n <div>\n <h1 className='text-3xl leading-tight font-bold text-balance'>{product.title}</h1>\n <div className='mt-4 flex flex-wrap items-center gap-4'>\n {rating ? (\n <div className='flex items-center gap-2'>\n <div className='flex'>\n {[0, 1, 2, 3, 4].map(i => (\n <Star\n key={i}\n className={cn(\n 'size-4',\n i < rating.value ? 'fill-foreground text-foreground' : 'text-muted-foreground',\n )}\n />\n ))}\n </div>\n <span className='text-sm font-medium'>{rating.value}</span>\n </div>\n ) : null}\n {hasReviews ? (\n <span className='text-muted-foreground text-sm'>\n {reviewCount} {labels.reviewsLabel.toLowerCase()}\n </span>\n ) : null}\n {selectedVariant?.sku ? (\n <>\n <Separator orientation='vertical' className='h-4' />\n <span className='text-muted-foreground text-sm'>\n {labels.skuLabel}: {selectedVariant.sku}\n </span>\n </>\n ) : null}\n </div>\n </div>\n\n {selectedVariant ? (\n priceAvailable ? (\n <div className='flex items-baseline gap-3'>\n <span className='text-4xl font-bold'>{formatMoney(selectedPrice, formatPrice)}</span>\n {compareAtAvailable ? (\n <span className='text-muted-foreground text-xl line-through'>\n {formatMoney(selectedCompareAt, formatPrice)}\n </span>\n ) : null}\n </div>\n ) : (\n <p className='text-muted-foreground text-sm'>{labels.unavailablePriceLabel}</p>\n )\n ) : (\n <p className='text-muted-foreground text-sm'>{labels.selectVariantLabel}</p>\n )}\n\n {selectedVariant?.availableForSale ? (\n <div className='bg-success/10 inline-flex w-fit items-center gap-2 rounded-full px-3 py-1.5'>\n <div className='bg-success size-2 rounded-full' />\n <span className='text-success text-sm font-medium'>{labels.availabilityLabel}</span>\n </div>\n ) : null}\n\n {product.description ? <p className='text-muted-foreground leading-relaxed'>{product.description}</p> : null}\n\n <VariantSelector\n product={product}\n selectedVariantId={selectedVariant?.id}\n onSelectVariant={onSelectVariant}\n sizesLabel={labels.selectVariantLabel}\n variantLabel=''\n outOfStockLabel={labels.outOfStockLabel}\n />\n\n {onQuantityChange ? (\n <QuantityStepper\n quantityValue={quantityValue}\n quantityLabel={labels.quantityLabel}\n onQuantityChange={onQuantityChange}\n />\n ) : null}\n\n <div className='flex flex-col gap-4'>\n <Button size='lg' className='h-12 w-full cursor-pointer gap-2' disabled={!canPurchase} onClick={onAddToCart}>\n <ShoppingCart />\n {labels.addToCartLabel}\n </Button>\n <div className='flex gap-3'>\n <WishlistButton\n isWishlisted={isWishlisted}\n disabled={!selectedVariant}\n onToggleWishlist={onToggleWishlist}\n removeFromWishlistLabel={labels.removeFromWishlistLabel}\n addToWishlistLabel={labels.addToWishlistLabel}\n className='h-12 flex-1 gap-2 rounded-md'\n />\n {onShare ? (\n <Button\n variant='outline'\n size='lg'\n className='h-12 flex-1 cursor-pointer gap-2'\n onClick={onShare}\n >\n <Share2 />\n {labels.shareLabel}\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n </div>\n\n {hasTabs ? (\n <div className='mt-16'>\n <ProductOverviewTabs defaultValue={defaultTab} className='w-full'>\n <ProductOverviewTabsList className='bg-muted/50 relative grid !h-12 w-full grid-cols-4 rounded-xl p-1'>\n <ProductOverviewTabsIndicator />\n {featureList ? (\n <ProductOverviewTabsTrigger\n value='overview'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <Info className='size-4 shrink-0' />\n <span className='hidden sm:inline'>{labels.overviewLabel}</span>\n </ProductOverviewTabsTrigger>\n ) : null}\n {hasSpecs ? (\n <ProductOverviewTabsTrigger\n value='specs'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <Package className='size-4 shrink-0' />\n <span className='hidden sm:inline'>{labels.specsLabel}</span>\n </ProductOverviewTabsTrigger>\n ) : null}\n {hasReviews ? (\n <ProductOverviewTabsTrigger\n value='reviews'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <MessageSquare className='size-4 shrink-0' />\n <span className='hidden sm:inline'>\n {labels.reviewsLabel} ({reviewCount})\n </span>\n </ProductOverviewTabsTrigger>\n ) : null}\n {hasGallery ? (\n <ProductOverviewTabsTrigger\n value='gallery'\n className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'\n >\n <Camera className='size-4 shrink-0' />\n <span className='hidden sm:inline'>{labels.galleryLabel}</span>\n </ProductOverviewTabsTrigger>\n ) : null}\n </ProductOverviewTabsList>\n {featureList ? (\n <ProductOverviewTabsContentFade value='overview' className='mt-8'>\n <Card className='border shadow-none'>\n <CardContent className='p-8 py-0'>\n <h3 className='mb-6 text-xl font-semibold text-balance'>{labels.featuresLabel}</h3>\n <div className='grid gap-4 sm:grid-cols-2'>\n {featureList.map(feature => (\n <div key={feature} className='group flex items-center gap-3'>\n <div className='bg-primary/20 size-2 rounded-full transition-colors' />\n <span className='text-sm'>{feature}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </ProductOverviewTabsContentFade>\n ) : null}\n {hasSpecs ? (\n <ProductOverviewTabsContentFade value='specs' className='mt-8'>\n <Card className='border shadow-none'>\n <CardContent className='p-8 py-0'>\n <h3 className='mb-6 text-xl font-semibold text-balance'>{labels.specificationsLabel}</h3>\n <div className='flex flex-col gap-4'>\n {specEntries.map(([key, value]) => (\n <div\n key={key}\n className='border-muted grid grid-cols-1 gap-2 border-b py-3 last:border-b-0 md:grid-cols-3 md:gap-4'\n >\n <span className='text-muted-foreground text-sm font-medium'>{key}</span>\n <span className='col-span-1 text-sm md:col-span-2'>{value}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </ProductOverviewTabsContentFade>\n ) : null}\n {hasReviews && reviews ? (\n <ProductOverviewTabsContentFade value='reviews' className='mt-8'>\n <ProductOverviewReviewsTab\n rating={rating?.value ?? 0}\n reviews={reviews}\n basedOnReviewsLabel={labels.basedOnReviewsLabel}\n foundHelpfulLabel={labels.foundHelpfulLabel}\n />\n </ProductOverviewTabsContentFade>\n ) : null}\n {hasGallery ? (\n <ProductOverviewTabsContentFade value='gallery' className='mt-8'>\n <ProductOverviewLightboxTab\n images={images}\n title={product.title}\n galleryLabel={labels.galleryLabel}\n ofCounterLabel={labels.ofCounterLabel}\n />\n </ProductOverviewTabsContentFade>\n ) : null}\n </ProductOverviewTabs>\n </div>\n ) : null}\n </div>\n </section>\n )\n}\n\nexport type { ProductOverviewReview }\nexport { ProductOverviewGallery, ProductOverviewLightboxTab, ProductOverviewReviewsTab }\n"],"mappings":"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","names":[]}
@@ -0,0 +1,17 @@
1
+ import type { QuickViewProduct } from './product-quick-view';
2
+ /**
3
+ * One product in the grid, and the thing a quick view is meant to keep you inside of.
4
+ *
5
+ * The whole card is the button. A card that carries a separate "Quick view" link has two targets
6
+ * for one intention, and on a touch screen the hover-revealed one is a target that never appears
7
+ * at all - so the control is drawn on hover and focus as an *affordance*, while the press area
8
+ * is the entire card at every input type.
9
+ */
10
+ export declare function ProductQuickViewCard({ product, isActive, onOpen, }: {
11
+ product: QuickViewProduct;
12
+ /** Whether this is the product currently open in the quick view. */
13
+ isActive: boolean;
14
+ onOpen: () => void;
15
+ }): import("react").JSX.Element;
16
+ export default ProductQuickViewCard;
17
+ //# sourceMappingURL=product-quick-view-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-quick-view-card.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/product-overview/product-quick-view-card.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAI5D;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,OAAO,EACP,QAAQ,EACR,MAAM,GACP,EAAE;IACD,OAAO,EAAE,gBAAgB,CAAA;IACzB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB,+BAuGA;AAED,eAAe,oBAAoB,CAAA"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var product_quick_view_card_exports = {};
21
+ __export(product_quick_view_card_exports, {
22
+ ProductQuickViewCard: () => ProductQuickViewCard,
23
+ default: () => product_quick_view_card_default
24
+ });
25
+ module.exports = __toCommonJS(product_quick_view_card_exports);
26
+ var import_jsx_runtime = require("react/jsx-runtime");
27
+ var import_lucide_react = require("lucide-react");
28
+ var import_badge = require("../../../ui/badge.js");
29
+ var import_card = require("../../../ui/card.js");
30
+ var import_utils = require("../../../lib/utils.js");
31
+ const money = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0 });
32
+ function ProductQuickViewCard({
33
+ product,
34
+ isActive,
35
+ onOpen
36
+ }) {
37
+ const swatches = product.variants.find((variant) => variant.options.some((option) => option.swatch))?.options ?? [];
38
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
39
+ import_card.Card,
40
+ {
41
+ className: (0, import_utils.cn)(
42
+ "group/card relative gap-0 overflow-hidden py-0 transition-shadow",
43
+ // The mark that survives behind the dialog: when the reader closes it, the card they
44
+ // were looking at is the one still lit, so the grid tells them where they got to.
45
+ isActive ? "ring-primary ring-2" : "hover:shadow-lg"
46
+ ),
47
+ children: [
48
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "bg-muted relative aspect-4/5 w-full overflow-hidden", children: [
49
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
50
+ "img",
51
+ {
52
+ src: product.image || void 0,
53
+ alt: product.imageAlt,
54
+ className: "size-full object-cover transition-transform duration-500 ease-out group-hover/card:scale-[1.03]",
55
+ loading: "lazy",
56
+ decoding: "async"
57
+ }
58
+ ),
59
+ product.compareAt ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_badge.Badge, { className: "absolute top-3 left-3 rounded-full", children: `${Math.round((1 - product.price / product.compareAt) * 100)}% de descuento` }) : null,
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
61
+ "div",
62
+ {
63
+ "aria-hidden": "true",
64
+ className: (0, import_utils.cn)(
65
+ "pointer-events-none absolute inset-x-0 bottom-0 flex justify-center p-3",
66
+ "translate-y-2 opacity-0 transition-[opacity,transform] duration-200 ease-out",
67
+ "group-hover/card:translate-y-0 group-hover/card:opacity-100",
68
+ "group-has-focus-visible/card:translate-y-0 group-has-focus-visible/card:opacity-100"
69
+ ),
70
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "bg-background/90 text-foreground ring-border flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium ring-1 backdrop-blur", children: [
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Eye, { className: "size-4" }),
72
+ "Vista r\xE1pida"
73
+ ] })
74
+ }
75
+ )
76
+ ] }),
77
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
78
+ "button",
79
+ {
80
+ type: "button",
81
+ onClick: onOpen,
82
+ "aria-haspopup": "dialog",
83
+ className: "focus-visible:ring-ring/50 absolute inset-0 z-10 cursor-pointer rounded-xl outline-none focus-visible:ring-[3px]",
84
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "sr-only", children: `Vista r\xE1pida: ${product.name}` })
85
+ }
86
+ ),
87
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_card.CardContent, { className: "flex flex-col gap-1 p-4", children: [
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-start justify-between gap-3", children: [
89
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-base font-medium", children: product.name }),
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "shrink-0 text-base font-medium tabular-nums", children: money.format(product.price) })
91
+ ] }),
92
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm", children: product.tagline }),
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-2 flex items-center justify-between gap-3", children: [
94
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-muted-foreground flex items-center gap-1.5 text-xs", children: [
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Star, { className: "size-3.5 fill-foreground text-foreground", "aria-hidden": "true" }),
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-foreground font-medium tabular-nums", children: product.rating }),
97
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "tabular-nums", children: [
98
+ "(",
99
+ product.reviewCount,
100
+ ")"
101
+ ] })
102
+ ] }),
103
+ swatches.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "flex items-center gap-1", children: swatches.map((option) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
104
+ "span",
105
+ {
106
+ "aria-hidden": "true",
107
+ className: "ring-border size-3 rounded-full ring-1",
108
+ style: { backgroundColor: option.swatch }
109
+ },
110
+ option.value
111
+ )) }) : null
112
+ ] })
113
+ ] })
114
+ ]
115
+ }
116
+ );
117
+ }
118
+ var product_quick_view_card_default = ProductQuickViewCard;
119
+ // Annotate the CommonJS export names for ESM import in node:
120
+ 0 && (module.exports = {
121
+ ProductQuickViewCard
122
+ });
123
+ //# sourceMappingURL=product-quick-view-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/product-overview/product-quick-view-card.tsx"],"sourcesContent":["'use client'\n\nimport { Eye, Star } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\n\nimport type { QuickViewProduct } from './product-quick-view'\n\nconst money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 })\n\n/**\n * One product in the grid, and the thing a quick view is meant to keep you inside of.\n *\n * The whole card is the button. A card that carries a separate \"Quick view\" link has two targets\n * for one intention, and on a touch screen the hover-revealed one is a target that never appears\n * at all - so the control is drawn on hover and focus as an *affordance*, while the press area\n * is the entire card at every input type.\n */\nexport function ProductQuickViewCard({\n product,\n isActive,\n onOpen,\n}: {\n product: QuickViewProduct\n /** Whether this is the product currently open in the quick view. */\n isActive: boolean\n onOpen: () => void\n}) {\n const swatches = product.variants.find(variant => variant.options.some(option => option.swatch))?.options ?? []\n\n return (\n <Card\n className={cn(\n 'group/card relative gap-0 overflow-hidden py-0 transition-shadow',\n // The mark that survives behind the dialog: when the reader closes it, the card they\n // were looking at is the one still lit, so the grid tells them where they got to.\n isActive ? 'ring-primary ring-2' : 'hover:shadow-lg'\n )}\n >\n <div className='bg-muted relative aspect-4/5 w-full overflow-hidden'>\n <img\n src={product.image || undefined}\n alt={product.imageAlt}\n className='size-full object-cover transition-transform duration-500 ease-out group-hover/card:scale-[1.03]'\n loading='lazy'\n decoding='async'\n />\n\n {product.compareAt ? (\n <Badge className='absolute top-3 left-3 rounded-full'>\n {`${Math.round((1 - product.price / product.compareAt) * 100)}% de descuento`}\n </Badge>\n ) : null}\n\n {/*\n Drawn on hover and focus, and never the thing that has to be hit. `pointer-events-none`\n keeps every press on the card's own trigger underneath, so there is exactly one target\n however the reader is pointing at it.\n */}\n <div\n aria-hidden='true'\n className={cn(\n 'pointer-events-none absolute inset-x-0 bottom-0 flex justify-center p-3',\n 'translate-y-2 opacity-0 transition-[opacity,transform] duration-200 ease-out',\n 'group-hover/card:translate-y-0 group-hover/card:opacity-100',\n 'group-has-focus-visible/card:translate-y-0 group-has-focus-visible/card:opacity-100'\n )}\n >\n <span className='bg-background/90 text-foreground ring-border flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium ring-1 backdrop-blur'>\n <Eye className='size-4' />\n Vista rápida\n </span>\n </div>\n </div>\n\n {/*\n The card's one interactive element, and it covers the card.\n\n A stretched link would leave only the title actually pressable: the picture sits over a\n pseudo-element and swallows every click on the image and on the Quick view pill. A real\n element in the DOM, on top, with an explicit z-index, is unambiguous at every input type.\n It is empty and carries an accessible name, so the price and rating underneath are not\n read as part of the button's label.\n */}\n <button\n type='button'\n onClick={onOpen}\n aria-haspopup='dialog'\n className='focus-visible:ring-ring/50 absolute inset-0 z-10 cursor-pointer rounded-xl outline-none focus-visible:ring-[3px]'\n >\n <span className='sr-only'>{`Vista rápida: ${product.name}`}</span>\n </button>\n\n <CardContent className='flex flex-col gap-1 p-4'>\n <div className='flex items-start justify-between gap-3'>\n <p className='text-base font-medium'>{product.name}</p>\n\n <p className='shrink-0 text-base font-medium tabular-nums'>{money.format(product.price)}</p>\n </div>\n\n <p className='text-muted-foreground text-sm'>{product.tagline}</p>\n\n <div className='mt-2 flex items-center justify-between gap-3'>\n <p className='text-muted-foreground flex items-center gap-1.5 text-xs'>\n {/* Foreground token per theming contract, never the only carrier of the rating. */}\n <Star className='size-3.5 fill-foreground text-foreground' aria-hidden='true' />\n <span className='text-foreground font-medium tabular-nums'>{product.rating}</span>\n <span className='tabular-nums'>({product.reviewCount})</span>\n </p>\n\n {swatches.length > 0 ? (\n <span className='flex items-center gap-1'>\n {/*\n Finish colours are product data, so they stay literal rather than tokenised, and\n they are decoration here - the same information is in words inside the panel.\n */}\n {swatches.map(option => (\n <span\n key={option.value}\n aria-hidden='true'\n className='ring-border size-3 rounded-full ring-1'\n style={{ backgroundColor: option.swatch }}\n />\n ))}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport default ProductQuickViewCard"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CQ;AAxCR,0BAA0B;AAE1B,mBAAsB;AACtB,kBAAkC;AAClC,mBAAmB;AAInB,MAAM,QAAQ,IAAI,KAAK,aAAa,SAAS,EAAE,OAAO,YAAY,UAAU,OAAO,uBAAuB,EAAE,CAAC;AAUtG,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,WAAW,QAAQ,SAAS,KAAK,aAAW,QAAQ,QAAQ,KAAK,YAAU,OAAO,MAAM,CAAC,GAAG,WAAW,CAAC;AAE9G,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAW;AAAA,QACT;AAAA;AAAA;AAAA,QAGA,WAAW,wBAAwB;AAAA,MACrC;AAAA,MAEA;AAAA,qDAAC,SAAI,WAAU,uDACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,QAAQ,SAAS;AAAA,cACtB,KAAK,QAAQ;AAAA,cACb,WAAU;AAAA,cACV,SAAQ;AAAA,cACR,UAAS;AAAA;AAAA,UACX;AAAA,UAEC,QAAQ,YACP,4CAAC,sBAAM,WAAU,sCACd,aAAG,KAAK,OAAO,IAAI,QAAQ,QAAQ,QAAQ,aAAa,GAAG,CAAC,kBAC/D,IACE;AAAA,UAOJ;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,eAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cAEA,uDAAC,UAAK,WAAU,0IACd;AAAA,4DAAC,2BAAI,WAAU,UAAS;AAAA,gBAAE;AAAA,iBAE5B;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAWA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,iBAAc;AAAA,YACd,WAAU;AAAA,YAEV,sDAAC,UAAK,WAAU,WAAW,8BAAiB,QAAQ,IAAI,IAAG;AAAA;AAAA,QAC7D;AAAA,QAEA,6CAAC,2BAAY,WAAU,2BACrB;AAAA,uDAAC,SAAI,WAAU,0CACb;AAAA,wDAAC,OAAE,WAAU,yBAAyB,kBAAQ,MAAK;AAAA,YAEnD,4CAAC,OAAE,WAAU,+CAA+C,gBAAM,OAAO,QAAQ,KAAK,GAAE;AAAA,aAC1F;AAAA,UAEA,4CAAC,OAAE,WAAU,iCAAiC,kBAAQ,SAAQ;AAAA,UAE9D,6CAAC,SAAI,WAAU,gDACb;AAAA,yDAAC,OAAE,WAAU,2DAEX;AAAA,0DAAC,4BAAK,WAAU,4CAA2C,eAAY,QAAO;AAAA,cAC9E,4CAAC,UAAK,WAAU,4CAA4C,kBAAQ,QAAO;AAAA,cAC3E,6CAAC,UAAK,WAAU,gBAAe;AAAA;AAAA,gBAAE,QAAQ;AAAA,gBAAY;AAAA,iBAAC;AAAA,eACxD;AAAA,YAEC,SAAS,SAAS,IACjB,4CAAC,UAAK,WAAU,2BAKb,mBAAS,IAAI,YACZ;AAAA,cAAC;AAAA;AAAA,gBAEC,eAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,OAAO,EAAE,iBAAiB,OAAO,OAAO;AAAA;AAAA,cAHnC,OAAO;AAAA,YAId,CACD,GACH,IACE;AAAA,aACN;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kCAAQ;","names":[]}
@@ -0,0 +1,99 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Eye, Star } from "lucide-react";
4
+ import { Badge } from "../../../ui/badge.mjs";
5
+ import { Card, CardContent } from "../../../ui/card.mjs";
6
+ import { cn } from "../../../lib/utils.mjs";
7
+ const money = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0 });
8
+ function ProductQuickViewCard({
9
+ product,
10
+ isActive,
11
+ onOpen
12
+ }) {
13
+ const swatches = product.variants.find((variant) => variant.options.some((option) => option.swatch))?.options ?? [];
14
+ return /* @__PURE__ */ jsxs(
15
+ Card,
16
+ {
17
+ className: cn(
18
+ "group/card relative gap-0 overflow-hidden py-0 transition-shadow",
19
+ // The mark that survives behind the dialog: when the reader closes it, the card they
20
+ // were looking at is the one still lit, so the grid tells them where they got to.
21
+ isActive ? "ring-primary ring-2" : "hover:shadow-lg"
22
+ ),
23
+ children: [
24
+ /* @__PURE__ */ jsxs("div", { className: "bg-muted relative aspect-4/5 w-full overflow-hidden", children: [
25
+ /* @__PURE__ */ jsx(
26
+ "img",
27
+ {
28
+ src: product.image || void 0,
29
+ alt: product.imageAlt,
30
+ className: "size-full object-cover transition-transform duration-500 ease-out group-hover/card:scale-[1.03]",
31
+ loading: "lazy",
32
+ decoding: "async"
33
+ }
34
+ ),
35
+ product.compareAt ? /* @__PURE__ */ jsx(Badge, { className: "absolute top-3 left-3 rounded-full", children: `${Math.round((1 - product.price / product.compareAt) * 100)}% de descuento` }) : null,
36
+ /* @__PURE__ */ jsx(
37
+ "div",
38
+ {
39
+ "aria-hidden": "true",
40
+ className: cn(
41
+ "pointer-events-none absolute inset-x-0 bottom-0 flex justify-center p-3",
42
+ "translate-y-2 opacity-0 transition-[opacity,transform] duration-200 ease-out",
43
+ "group-hover/card:translate-y-0 group-hover/card:opacity-100",
44
+ "group-has-focus-visible/card:translate-y-0 group-has-focus-visible/card:opacity-100"
45
+ ),
46
+ children: /* @__PURE__ */ jsxs("span", { className: "bg-background/90 text-foreground ring-border flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium ring-1 backdrop-blur", children: [
47
+ /* @__PURE__ */ jsx(Eye, { className: "size-4" }),
48
+ "Vista r\xE1pida"
49
+ ] })
50
+ }
51
+ )
52
+ ] }),
53
+ /* @__PURE__ */ jsx(
54
+ "button",
55
+ {
56
+ type: "button",
57
+ onClick: onOpen,
58
+ "aria-haspopup": "dialog",
59
+ className: "focus-visible:ring-ring/50 absolute inset-0 z-10 cursor-pointer rounded-xl outline-none focus-visible:ring-[3px]",
60
+ children: /* @__PURE__ */ jsx("span", { className: "sr-only", children: `Vista r\xE1pida: ${product.name}` })
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col gap-1 p-4", children: [
64
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
65
+ /* @__PURE__ */ jsx("p", { className: "text-base font-medium", children: product.name }),
66
+ /* @__PURE__ */ jsx("p", { className: "shrink-0 text-base font-medium tabular-nums", children: money.format(product.price) })
67
+ ] }),
68
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: product.tagline }),
69
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center justify-between gap-3", children: [
70
+ /* @__PURE__ */ jsxs("p", { className: "text-muted-foreground flex items-center gap-1.5 text-xs", children: [
71
+ /* @__PURE__ */ jsx(Star, { className: "size-3.5 fill-foreground text-foreground", "aria-hidden": "true" }),
72
+ /* @__PURE__ */ jsx("span", { className: "text-foreground font-medium tabular-nums", children: product.rating }),
73
+ /* @__PURE__ */ jsxs("span", { className: "tabular-nums", children: [
74
+ "(",
75
+ product.reviewCount,
76
+ ")"
77
+ ] })
78
+ ] }),
79
+ swatches.length > 0 ? /* @__PURE__ */ jsx("span", { className: "flex items-center gap-1", children: swatches.map((option) => /* @__PURE__ */ jsx(
80
+ "span",
81
+ {
82
+ "aria-hidden": "true",
83
+ className: "ring-border size-3 rounded-full ring-1",
84
+ style: { backgroundColor: option.swatch }
85
+ },
86
+ option.value
87
+ )) }) : null
88
+ ] })
89
+ ] })
90
+ ]
91
+ }
92
+ );
93
+ }
94
+ var product_quick_view_card_default = ProductQuickViewCard;
95
+ export {
96
+ ProductQuickViewCard,
97
+ product_quick_view_card_default as default
98
+ };
99
+ //# sourceMappingURL=product-quick-view-card.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/blocks/e-commerce/product-overview/product-quick-view-card.tsx"],"sourcesContent":["'use client'\n\nimport { Eye, Star } from 'lucide-react'\n\nimport { Badge } from '../../../ui/badge'\nimport { Card, CardContent } from '../../../ui/card'\nimport { cn } from '../../../lib/utils'\n\nimport type { QuickViewProduct } from './product-quick-view'\n\nconst money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 })\n\n/**\n * One product in the grid, and the thing a quick view is meant to keep you inside of.\n *\n * The whole card is the button. A card that carries a separate \"Quick view\" link has two targets\n * for one intention, and on a touch screen the hover-revealed one is a target that never appears\n * at all - so the control is drawn on hover and focus as an *affordance*, while the press area\n * is the entire card at every input type.\n */\nexport function ProductQuickViewCard({\n product,\n isActive,\n onOpen,\n}: {\n product: QuickViewProduct\n /** Whether this is the product currently open in the quick view. */\n isActive: boolean\n onOpen: () => void\n}) {\n const swatches = product.variants.find(variant => variant.options.some(option => option.swatch))?.options ?? []\n\n return (\n <Card\n className={cn(\n 'group/card relative gap-0 overflow-hidden py-0 transition-shadow',\n // The mark that survives behind the dialog: when the reader closes it, the card they\n // were looking at is the one still lit, so the grid tells them where they got to.\n isActive ? 'ring-primary ring-2' : 'hover:shadow-lg'\n )}\n >\n <div className='bg-muted relative aspect-4/5 w-full overflow-hidden'>\n <img\n src={product.image || undefined}\n alt={product.imageAlt}\n className='size-full object-cover transition-transform duration-500 ease-out group-hover/card:scale-[1.03]'\n loading='lazy'\n decoding='async'\n />\n\n {product.compareAt ? (\n <Badge className='absolute top-3 left-3 rounded-full'>\n {`${Math.round((1 - product.price / product.compareAt) * 100)}% de descuento`}\n </Badge>\n ) : null}\n\n {/*\n Drawn on hover and focus, and never the thing that has to be hit. `pointer-events-none`\n keeps every press on the card's own trigger underneath, so there is exactly one target\n however the reader is pointing at it.\n */}\n <div\n aria-hidden='true'\n className={cn(\n 'pointer-events-none absolute inset-x-0 bottom-0 flex justify-center p-3',\n 'translate-y-2 opacity-0 transition-[opacity,transform] duration-200 ease-out',\n 'group-hover/card:translate-y-0 group-hover/card:opacity-100',\n 'group-has-focus-visible/card:translate-y-0 group-has-focus-visible/card:opacity-100'\n )}\n >\n <span className='bg-background/90 text-foreground ring-border flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium ring-1 backdrop-blur'>\n <Eye className='size-4' />\n Vista rápida\n </span>\n </div>\n </div>\n\n {/*\n The card's one interactive element, and it covers the card.\n\n A stretched link would leave only the title actually pressable: the picture sits over a\n pseudo-element and swallows every click on the image and on the Quick view pill. A real\n element in the DOM, on top, with an explicit z-index, is unambiguous at every input type.\n It is empty and carries an accessible name, so the price and rating underneath are not\n read as part of the button's label.\n */}\n <button\n type='button'\n onClick={onOpen}\n aria-haspopup='dialog'\n className='focus-visible:ring-ring/50 absolute inset-0 z-10 cursor-pointer rounded-xl outline-none focus-visible:ring-[3px]'\n >\n <span className='sr-only'>{`Vista rápida: ${product.name}`}</span>\n </button>\n\n <CardContent className='flex flex-col gap-1 p-4'>\n <div className='flex items-start justify-between gap-3'>\n <p className='text-base font-medium'>{product.name}</p>\n\n <p className='shrink-0 text-base font-medium tabular-nums'>{money.format(product.price)}</p>\n </div>\n\n <p className='text-muted-foreground text-sm'>{product.tagline}</p>\n\n <div className='mt-2 flex items-center justify-between gap-3'>\n <p className='text-muted-foreground flex items-center gap-1.5 text-xs'>\n {/* Foreground token per theming contract, never the only carrier of the rating. */}\n <Star className='size-3.5 fill-foreground text-foreground' aria-hidden='true' />\n <span className='text-foreground font-medium tabular-nums'>{product.rating}</span>\n <span className='tabular-nums'>({product.reviewCount})</span>\n </p>\n\n {swatches.length > 0 ? (\n <span className='flex items-center gap-1'>\n {/*\n Finish colours are product data, so they stay literal rather than tokenised, and\n they are decoration here - the same information is in words inside the panel.\n */}\n {swatches.map(option => (\n <span\n key={option.value}\n aria-hidden='true'\n className='ring-border size-3 rounded-full ring-1'\n style={{ backgroundColor: option.swatch }}\n />\n ))}\n </span>\n ) : null}\n </div>\n </CardContent>\n </Card>\n )\n}\n\nexport default ProductQuickViewCard"],"mappings":";AA0CQ,cA4BE,YA5BF;AAxCR,SAAS,KAAK,YAAY;AAE1B,SAAS,aAAa;AACtB,SAAS,MAAM,mBAAmB;AAClC,SAAS,UAAU;AAInB,MAAM,QAAQ,IAAI,KAAK,aAAa,SAAS,EAAE,OAAO,YAAY,UAAU,OAAO,uBAAuB,EAAE,CAAC;AAUtG,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,WAAW,QAAQ,SAAS,KAAK,aAAW,QAAQ,QAAQ,KAAK,YAAU,OAAO,MAAM,CAAC,GAAG,WAAW,CAAC;AAE9G,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA;AAAA;AAAA,QAGA,WAAW,wBAAwB;AAAA,MACrC;AAAA,MAEA;AAAA,6BAAC,SAAI,WAAU,uDACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,QAAQ,SAAS;AAAA,cACtB,KAAK,QAAQ;AAAA,cACb,WAAU;AAAA,cACV,SAAQ;AAAA,cACR,UAAS;AAAA;AAAA,UACX;AAAA,UAEC,QAAQ,YACP,oBAAC,SAAM,WAAU,sCACd,aAAG,KAAK,OAAO,IAAI,QAAQ,QAAQ,QAAQ,aAAa,GAAG,CAAC,kBAC/D,IACE;AAAA,UAOJ;AAAA,YAAC;AAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cAEA,+BAAC,UAAK,WAAU,0IACd;AAAA,oCAAC,OAAI,WAAU,UAAS;AAAA,gBAAE;AAAA,iBAE5B;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAWA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,iBAAc;AAAA,YACd,WAAU;AAAA,YAEV,8BAAC,UAAK,WAAU,WAAW,8BAAiB,QAAQ,IAAI,IAAG;AAAA;AAAA,QAC7D;AAAA,QAEA,qBAAC,eAAY,WAAU,2BACrB;AAAA,+BAAC,SAAI,WAAU,0CACb;AAAA,gCAAC,OAAE,WAAU,yBAAyB,kBAAQ,MAAK;AAAA,YAEnD,oBAAC,OAAE,WAAU,+CAA+C,gBAAM,OAAO,QAAQ,KAAK,GAAE;AAAA,aAC1F;AAAA,UAEA,oBAAC,OAAE,WAAU,iCAAiC,kBAAQ,SAAQ;AAAA,UAE9D,qBAAC,SAAI,WAAU,gDACb;AAAA,iCAAC,OAAE,WAAU,2DAEX;AAAA,kCAAC,QAAK,WAAU,4CAA2C,eAAY,QAAO;AAAA,cAC9E,oBAAC,UAAK,WAAU,4CAA4C,kBAAQ,QAAO;AAAA,cAC3E,qBAAC,UAAK,WAAU,gBAAe;AAAA;AAAA,gBAAE,QAAQ;AAAA,gBAAY;AAAA,iBAAC;AAAA,eACxD;AAAA,YAEC,SAAS,SAAS,IACjB,oBAAC,UAAK,WAAU,2BAKb,mBAAS,IAAI,YACZ;AAAA,cAAC;AAAA;AAAA,gBAEC,eAAY;AAAA,gBACZ,WAAU;AAAA,gBACV,OAAO,EAAE,iBAAiB,OAAO,OAAO;AAAA;AAAA,cAHnC,OAAO;AAAA,YAId,CACD,GACH,IACE;AAAA,aACN;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,kCAAQ;","names":[]}
@@ -0,0 +1,20 @@
1
+ import type { QuickViewProduct } from './product-quick-view';
2
+ /**
3
+ * The panel a quick view opens, and the reason the pattern exists.
4
+ *
5
+ * A quick view is not a small product page. It is a promise that the reader will not lose the
6
+ * grid, so this one keeps the whole catalogue reachable from inside: the strip under the picture
7
+ * is the other products, not other angles of this one. Choosing from it re-dresses the panel
8
+ * around a new product, the grid behind marks where the reader has got to, and closing returns
9
+ * them to a grid they never actually left.
10
+ */
11
+ export declare function ProductQuickViewDialog({ products, activeIndex, onActiveIndexChange, onClose, onAddToCart, }: {
12
+ products: QuickViewProduct[];
13
+ /** Which product is open, or `null` when the dialog is closed. */
14
+ activeIndex: number | null;
15
+ onActiveIndexChange: (index: number) => void;
16
+ onClose: () => void;
17
+ onAddToCart?: (product: QuickViewProduct, quantity: number, selection: Record<string, string>) => void;
18
+ }): import("react").JSX.Element | null;
19
+ export default ProductQuickViewDialog;
20
+ //# sourceMappingURL=product-quick-view-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"product-quick-view-dialog.d.ts","sourceRoot":"","sources":["../../../../src/blocks/e-commerce/product-overview/product-quick-view-dialog.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAyB5D;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,WAAW,GACZ,EAAE;IACD,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,kEAAkE;IAClE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5C,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,WAAW,CAAC,EAAE,CACZ,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,IAAI,CAAA;CACV,sCAgUA;AAED,eAAe,sBAAsB,CAAA"}