@thorprovider/blocks 1.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 (859) hide show
  1. package/README.md +274 -46
  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 -107
  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-1.tsx +0 -246
  697. package/src/blocks/application/login-forms/login-page-2.tsx +0 -207
  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 -320
  700. package/src/blocks/application/signup-forms/signup-page-1.tsx +0 -231
  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/e-commerce/category-filters/category-filter-1.tsx +0 -260
  704. package/src/blocks/e-commerce/category-filters/category-filter-2-filter-panel.tsx +0 -222
  705. package/src/blocks/e-commerce/category-filters/category-filter-2.test.tsx +0 -513
  706. package/src/blocks/e-commerce/category-filters/category-filter-2.tsx +0 -921
  707. package/src/blocks/e-commerce/category-filters/category-filter-4-chip-rail.tsx +0 -57
  708. package/src/blocks/e-commerce/category-filters/category-filter-4-drawer.tsx +0 -124
  709. package/src/blocks/e-commerce/category-filters/category-filter-4-fields.tsx +0 -170
  710. package/src/blocks/e-commerce/category-filters/category-filter-4-sidebar.tsx +0 -52
  711. package/src/blocks/e-commerce/category-filters/category-filter-4-sort-sheet.tsx +0 -57
  712. package/src/blocks/e-commerce/category-filters/category-filter-4-state.ts +0 -68
  713. package/src/blocks/e-commerce/category-filters/category-filter-4.tsx +0 -298
  714. package/src/blocks/e-commerce/checkout-forms/card-formatting.test.ts +0 -47
  715. package/src/blocks/e-commerce/checkout-forms/card-formatting.ts +0 -9
  716. package/src/blocks/e-commerce/checkout-forms/checkbox-check.tsx +0 -74
  717. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.tsx +0 -195
  718. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.test.tsx +0 -136
  719. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.tsx +0 -329
  720. package/src/blocks/e-commerce/checkout-forms/checkout-field-feedback.tsx +0 -29
  721. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-contact-step.tsx +0 -96
  722. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-country-field.tsx +0 -51
  723. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-order-summary.tsx +0 -252
  724. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-payment-step.tsx +0 -188
  725. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-progress.tsx +0 -36
  726. package/src/blocks/e-commerce/checkout-forms/checkout-form-1-shipping-step.tsx +0 -156
  727. package/src/blocks/e-commerce/checkout-forms/checkout-form-1.test.tsx +0 -216
  728. package/src/blocks/e-commerce/checkout-forms/checkout-form-1.tsx +0 -338
  729. package/src/blocks/e-commerce/checkout-forms/checkout-form-2-order-summary.tsx +0 -130
  730. package/src/blocks/e-commerce/checkout-forms/checkout-form-2-payment-card.tsx +0 -175
  731. package/src/blocks/e-commerce/checkout-forms/checkout-form-2-shipping-card.tsx +0 -190
  732. package/src/blocks/e-commerce/checkout-forms/checkout-form-2.tsx +0 -312
  733. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-information-step.tsx +0 -91
  734. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-order-summary.tsx +0 -110
  735. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-payment-step.tsx +0 -137
  736. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-progress.tsx +0 -68
  737. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-review-step.tsx +0 -79
  738. package/src/blocks/e-commerce/checkout-forms/checkout-form-3-shipping-step.tsx +0 -172
  739. package/src/blocks/e-commerce/checkout-forms/checkout-form-3.tsx +0 -392
  740. package/src/blocks/e-commerce/checkout-forms/checkout-form-types.ts +0 -7
  741. package/src/blocks/e-commerce/navigation/back-to-top.test.tsx +0 -27
  742. package/src/blocks/e-commerce/navigation/back-to-top.tsx +0 -71
  743. package/src/blocks/e-commerce/navigation/breadcrumb.test.tsx +0 -174
  744. package/src/blocks/e-commerce/navigation/breadcrumb.tsx +0 -130
  745. package/src/blocks/e-commerce/navigation/category-icon.test.tsx +0 -54
  746. package/src/blocks/e-commerce/navigation/category-icon.tsx +0 -94
  747. package/src/blocks/e-commerce/navigation/mega-menu.test.tsx +0 -139
  748. package/src/blocks/e-commerce/navigation/mega-menu.tsx +0 -271
  749. package/src/blocks/e-commerce/navigation/mobile-bottom-nav.test.tsx +0 -74
  750. package/src/blocks/e-commerce/navigation/mobile-bottom-nav.tsx +0 -78
  751. package/src/blocks/e-commerce/navigation/mobile-category-drawer.test.tsx +0 -192
  752. package/src/blocks/e-commerce/navigation/mobile-category-drawer.tsx +0 -278
  753. package/src/blocks/e-commerce/navigation/skip-to-content.test.tsx +0 -35
  754. package/src/blocks/e-commerce/navigation/skip-to-content.tsx +0 -37
  755. package/src/blocks/e-commerce/order-history/order-history-1.tsx +0 -159
  756. package/src/blocks/e-commerce/order-history/order-history-2.tsx +0 -222
  757. package/src/blocks/e-commerce/product-categories/category-card-grid.test.tsx +0 -122
  758. package/src/blocks/e-commerce/product-categories/category-card.test.tsx +0 -68
  759. package/src/blocks/e-commerce/product-categories/category-card.tsx +0 -172
  760. package/src/blocks/e-commerce/product-categories/category-grid.test.tsx +0 -67
  761. package/src/blocks/e-commerce/product-categories/category-shared.tsx +0 -109
  762. package/src/blocks/e-commerce/product-categories/product-category-grid.tsx +0 -170
  763. package/src/blocks/e-commerce/product-categories/product-category.test.tsx +0 -266
  764. package/src/blocks/e-commerce/product-categories/product-category.tsx +0 -462
  765. package/src/blocks/e-commerce/product-list/product-card.test.tsx +0 -263
  766. package/src/blocks/e-commerce/product-list/product-card.tsx +0 -424
  767. package/src/blocks/e-commerce/product-list/product-grid.test.tsx +0 -162
  768. package/src/blocks/e-commerce/product-list/product-grid.tsx +0 -114
  769. package/src/blocks/e-commerce/product-list/product-showcase-1.test.tsx +0 -78
  770. package/src/blocks/e-commerce/product-list/product-showcase-1.tsx +0 -277
  771. package/src/blocks/e-commerce/product-overview/product-overview-gallery.tsx +0 -71
  772. package/src/blocks/e-commerce/product-overview/product-overview-lightbox-tab.tsx +0 -116
  773. package/src/blocks/e-commerce/product-overview/product-overview-reviews-tab.tsx +0 -105
  774. package/src/blocks/e-commerce/product-overview/product-overview-tabs.tsx +0 -70
  775. package/src/blocks/e-commerce/product-overview/product-overview.test.tsx +0 -283
  776. package/src/blocks/e-commerce/product-overview/product-overview.tsx +0 -1186
  777. package/src/blocks/e-commerce/product-overview/product-quick-view-card.tsx +0 -135
  778. package/src/blocks/e-commerce/product-overview/product-quick-view-dialog.tsx +0 -393
  779. package/src/blocks/e-commerce/product-overview/product-quick-view.tsx +0 -136
  780. package/src/blocks/e-commerce/reviews/review-rating-1-review-form.tsx +0 -133
  781. package/src/blocks/e-commerce/reviews/review-rating-1.tsx +0 -178
  782. package/src/blocks/e-commerce/reviews/review-rating-2.tsx +0 -245
  783. package/src/blocks/e-commerce/shopping-carts/shopping-cart.test.tsx +0 -399
  784. package/src/blocks/e-commerce/shopping-carts/shopping-cart.tsx +0 -628
  785. package/src/blocks/e-commerce/store-containers/store-container-1.tsx +0 -29
  786. package/src/blocks/e-commerce/storefront-hero/storefront-hero.test.tsx +0 -412
  787. package/src/blocks/e-commerce/storefront-hero/storefront-hero.tsx +0 -1283
  788. package/src/blocks/marketing/banners/avatar-group.tsx +0 -69
  789. package/src/blocks/marketing/banners/banner-1.tsx +0 -188
  790. package/src/blocks/marketing/cta/cta-section-1.tsx +0 -112
  791. package/src/blocks/marketing/faq/faq-block-1.tsx +0 -45
  792. package/src/blocks/marketing/features/feature.test.tsx +0 -153
  793. package/src/blocks/marketing/features/feature.tsx +0 -195
  794. package/src/blocks/marketing/footers/footer-section-1.test.tsx +0 -117
  795. package/src/blocks/marketing/footers/footer-section-1.tsx +0 -178
  796. package/src/blocks/marketing/footers/footer-section-3.tsx +0 -192
  797. package/src/blocks/marketing/footers/footer-section-4.tsx +0 -355
  798. package/src/blocks/marketing/hero-sections/avatar-group.tsx +0 -86
  799. package/src/blocks/marketing/hero-sections/hero-section-1.tsx +0 -135
  800. package/src/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.tsx +0 -52
  801. package/src/blocks/marketing/logo-clouds/logo-cloud-1.tsx +0 -56
  802. package/src/blocks/marketing/navbars/navbar-1.tsx +0 -267
  803. package/src/blocks/marketing/navbars/navbar-2.tsx +0 -351
  804. package/src/blocks/marketing/navbars/navbar-3.tsx +0 -303
  805. package/src/blocks/marketing/navbars/navbar-4-account-menu.test.tsx +0 -56
  806. package/src/blocks/marketing/navbars/navbar-4-account-menu.tsx +0 -134
  807. package/src/blocks/marketing/navbars/navbar-4-cart-sheet.test.tsx +0 -204
  808. package/src/blocks/marketing/navbars/navbar-4-cart-sheet.tsx +0 -371
  809. package/src/blocks/marketing/navbars/navbar-4-like-button.tsx +0 -177
  810. package/src/blocks/marketing/navbars/navbar-4-mobile-nav.tsx +0 -104
  811. package/src/blocks/marketing/navbars/navbar-4-product-grid.tsx +0 -219
  812. package/src/blocks/marketing/navbars/navbar-4-search-bar.tsx +0 -52
  813. package/src/blocks/marketing/navbars/navbar-4.test.tsx +0 -264
  814. package/src/blocks/marketing/navbars/navbar-4.tsx +0 -604
  815. package/src/blocks/marketing/pricing/pricing-section-1.tsx +0 -94
  816. package/src/blocks/marketing/statistics/statistic-1.tsx +0 -93
  817. package/src/blocks/marketing/testimonials/testimonial-1.tsx +0 -141
  818. package/src/blocks/marketing/testimonials/testimonial-2.tsx +0 -108
  819. package/src/blocks/shared/reaction-toggle.tsx +0 -145
  820. package/src/hooks/use-mobile.ts +0 -19
  821. package/src/index.ts +0 -285
  822. package/src/lib/cart.test.ts +0 -15
  823. package/src/lib/contracts-curated.test.ts +0 -225
  824. package/src/lib/contracts-server-boundary.test.ts +0 -52
  825. package/src/lib/contracts.test.ts +0 -173
  826. package/src/lib/contracts.ts +0 -795
  827. package/src/lib/money.test.ts +0 -64
  828. package/src/lib/money.ts +0 -65
  829. package/src/lib/types/menu.ts +0 -43
  830. package/src/lib/types.ts +0 -4
  831. package/src/lib/utils.ts +0 -10
  832. package/src/ui/accordion.tsx +0 -65
  833. package/src/ui/badge.tsx +0 -47
  834. package/src/ui/breadcrumb.tsx +0 -108
  835. package/src/ui/button-group.tsx +0 -83
  836. package/src/ui/button.tsx +0 -63
  837. package/src/ui/card.tsx +0 -91
  838. package/src/ui/carousel.tsx +0 -241
  839. package/src/ui/dialog.tsx +0 -158
  840. package/src/ui/drawer.tsx +0 -134
  841. package/src/ui/dropdown-menu.tsx +0 -256
  842. package/src/ui/empty.tsx +0 -103
  843. package/src/ui/input-otp.tsx +0 -76
  844. package/src/ui/label.tsx +0 -23
  845. package/src/ui/pagination.tsx +0 -127
  846. package/src/ui/progress.tsx +0 -30
  847. package/src/ui/radio-group.tsx +0 -44
  848. package/src/ui/select.tsx +0 -189
  849. package/src/ui/separator.tsx +0 -27
  850. package/src/ui/sheet.tsx +0 -142
  851. package/src/ui/sidebar.tsx +0 -726
  852. package/src/ui/skeleton.tsx +0 -13
  853. package/src/ui/table.tsx +0 -115
  854. package/src/ui/toggle-group.tsx +0 -83
  855. package/src/ui/tooltip.tsx +0 -56
  856. package/tsconfig.build.json +0 -12
  857. package/tsconfig.json +0 -20
  858. package/tsup.config.ts +0 -19
  859. 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"}