@thorprovider/blocks 2.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (842) hide show
  1. package/README.md +120 -8
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/blocks/application/app-shells/app-shell-1-sidebar.d.ts +21 -0
  4. package/dist/blocks/application/app-shells/app-shell-1-sidebar.d.ts.map +1 -0
  5. package/dist/blocks/application/app-shells/app-shell-1-sidebar.js +147 -0
  6. package/dist/blocks/application/app-shells/app-shell-1-sidebar.js.map +1 -0
  7. package/dist/blocks/application/app-shells/app-shell-1-sidebar.mjs +153 -0
  8. package/dist/blocks/application/app-shells/app-shell-1-sidebar.mjs.map +1 -0
  9. package/dist/blocks/application/app-shells/app-shell-1.d.ts +27 -0
  10. package/dist/blocks/application/app-shells/app-shell-1.d.ts.map +1 -0
  11. package/dist/blocks/application/app-shells/app-shell-1.js +150 -0
  12. package/dist/blocks/application/app-shells/app-shell-1.js.map +1 -0
  13. package/dist/blocks/application/app-shells/app-shell-1.mjs +123 -0
  14. package/dist/blocks/application/app-shells/app-shell-1.mjs.map +1 -0
  15. package/dist/blocks/application/login-forms/login-page.d.ts +42 -0
  16. package/dist/blocks/application/login-forms/login-page.d.ts.map +1 -0
  17. package/dist/blocks/application/login-forms/login-page.js +209 -0
  18. package/dist/blocks/application/login-forms/login-page.js.map +1 -0
  19. package/dist/blocks/application/login-forms/login-page.mjs +185 -0
  20. package/dist/blocks/application/login-forms/login-page.mjs.map +1 -0
  21. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.d.ts +3 -0
  22. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.d.ts.map +1 -0
  23. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.js +74 -0
  24. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.js.map +1 -0
  25. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.mjs +50 -0
  26. package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.mjs.map +1 -0
  27. package/dist/blocks/application/password-recovery/forgot-password-page-1.d.ts +42 -0
  28. package/dist/blocks/application/password-recovery/forgot-password-page-1.d.ts.map +1 -0
  29. package/dist/blocks/application/password-recovery/forgot-password-page-1.js +293 -0
  30. package/dist/blocks/application/password-recovery/forgot-password-page-1.js.map +1 -0
  31. package/dist/blocks/application/password-recovery/forgot-password-page-1.mjs +259 -0
  32. package/dist/blocks/application/password-recovery/forgot-password-page-1.mjs.map +1 -0
  33. package/dist/blocks/application/signup-forms/signup-page-1.d.ts +41 -0
  34. package/dist/blocks/application/signup-forms/signup-page-1.d.ts.map +1 -0
  35. package/dist/blocks/application/signup-forms/signup-page-1.js +195 -0
  36. package/dist/blocks/application/signup-forms/signup-page-1.js.map +1 -0
  37. package/dist/blocks/application/signup-forms/signup-page-1.mjs +171 -0
  38. package/dist/blocks/application/signup-forms/signup-page-1.mjs.map +1 -0
  39. package/dist/blocks/application/verification/verify-1.d.ts +35 -0
  40. package/dist/blocks/application/verification/verify-1.d.ts.map +1 -0
  41. package/dist/blocks/application/verification/verify-1.js +243 -0
  42. package/dist/blocks/application/verification/verify-1.js.map +1 -0
  43. package/dist/blocks/application/verification/verify-1.mjs +219 -0
  44. package/dist/blocks/application/verification/verify-1.mjs.map +1 -0
  45. package/dist/blocks/application/verification/verify-confetti.d.ts +22 -0
  46. package/dist/blocks/application/verification/verify-confetti.d.ts.map +1 -0
  47. package/dist/blocks/application/verification/verify-confetti.js +145 -0
  48. package/dist/blocks/application/verification/verify-confetti.js.map +1 -0
  49. package/dist/blocks/application/verification/verify-confetti.mjs +121 -0
  50. package/dist/blocks/application/verification/verify-confetti.mjs.map +1 -0
  51. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.d.ts +39 -0
  52. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.d.ts.map +1 -0
  53. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.js +180 -0
  54. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.js.map +1 -0
  55. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.mjs +156 -0
  56. package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.mjs.map +1 -0
  57. package/dist/blocks/e-commerce/category-filters/category-listing.d.ts +236 -0
  58. package/dist/blocks/e-commerce/category-filters/category-listing.d.ts.map +1 -0
  59. package/dist/blocks/e-commerce/category-filters/category-listing.js +562 -0
  60. package/dist/blocks/e-commerce/category-filters/category-listing.js.map +1 -0
  61. package/dist/blocks/e-commerce/category-filters/category-listing.mjs +539 -0
  62. package/dist/blocks/e-commerce/category-filters/category-listing.mjs.map +1 -0
  63. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.d.ts +4 -0
  64. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.d.ts.map +1 -0
  65. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js +97 -0
  66. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js.map +1 -0
  67. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs +73 -0
  68. package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs.map +1 -0
  69. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.d.ts +41 -0
  70. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.d.ts.map +1 -0
  71. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.js +115 -0
  72. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.js.map +1 -0
  73. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.mjs +91 -0
  74. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.mjs.map +1 -0
  75. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.d.ts +107 -0
  76. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.d.ts.map +1 -0
  77. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.js +180 -0
  78. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.js.map +1 -0
  79. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.mjs +156 -0
  80. package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.mjs.map +1 -0
  81. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts +13 -0
  82. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts.map +1 -0
  83. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js +180 -0
  84. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js.map +1 -0
  85. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs +156 -0
  86. package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs.map +1 -0
  87. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts +12 -0
  88. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts.map +1 -0
  89. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js +50 -0
  90. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js.map +1 -0
  91. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs +33 -0
  92. package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs.map +1 -0
  93. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.d.ts +11 -0
  94. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.d.ts.map +1 -0
  95. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.js +50 -0
  96. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.js.map +1 -0
  97. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.mjs +25 -0
  98. package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.mjs.map +1 -0
  99. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.d.ts +5 -0
  100. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.d.ts.map +1 -0
  101. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.js +17 -0
  102. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.js.map +1 -0
  103. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.mjs +1 -0
  104. package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.mjs.map +1 -0
  105. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts +20 -0
  106. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts.map +1 -0
  107. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js +176 -0
  108. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js.map +1 -0
  109. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs +152 -0
  110. package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs.map +1 -0
  111. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts +12 -0
  112. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts.map +1 -0
  113. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js +93 -0
  114. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js.map +1 -0
  115. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs +69 -0
  116. package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs.map +1 -0
  117. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.d.ts +11 -0
  118. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.d.ts.map +1 -0
  119. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.js +76 -0
  120. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.js.map +1 -0
  121. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.mjs +52 -0
  122. package/dist/blocks/e-commerce/checkout-forms/checkout-progress.mjs.map +1 -0
  123. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts +11 -0
  124. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts.map +1 -0
  125. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js +64 -0
  126. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js.map +1 -0
  127. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs +40 -0
  128. package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs.map +1 -0
  129. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts +17 -0
  130. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts.map +1 -0
  131. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js +199 -0
  132. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js.map +1 -0
  133. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs +175 -0
  134. package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs.map +1 -0
  135. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts +164 -0
  136. package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts.map +1 -0
  137. package/dist/blocks/e-commerce/checkout-forms/checkout.js +351 -0
  138. package/dist/blocks/e-commerce/checkout-forms/checkout.js.map +1 -0
  139. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs +327 -0
  140. package/dist/blocks/e-commerce/checkout-forms/checkout.mjs.map +1 -0
  141. package/dist/blocks/e-commerce/navigation/back-to-top.d.ts +28 -0
  142. package/dist/blocks/e-commerce/navigation/back-to-top.d.ts.map +1 -0
  143. package/dist/blocks/e-commerce/navigation/back-to-top.js +78 -0
  144. package/dist/blocks/e-commerce/navigation/back-to-top.js.map +1 -0
  145. package/dist/blocks/e-commerce/navigation/back-to-top.mjs +52 -0
  146. package/dist/blocks/e-commerce/navigation/back-to-top.mjs.map +1 -0
  147. package/dist/blocks/e-commerce/navigation/breadcrumb.d.ts +61 -0
  148. package/dist/blocks/e-commerce/navigation/breadcrumb.d.ts.map +1 -0
  149. package/dist/blocks/e-commerce/navigation/breadcrumb.js +111 -0
  150. package/dist/blocks/e-commerce/navigation/breadcrumb.js.map +1 -0
  151. package/dist/blocks/e-commerce/navigation/breadcrumb.mjs +93 -0
  152. package/dist/blocks/e-commerce/navigation/breadcrumb.mjs.map +1 -0
  153. package/dist/blocks/e-commerce/navigation/category-icon.d.ts +28 -0
  154. package/dist/blocks/e-commerce/navigation/category-icon.d.ts.map +1 -0
  155. package/dist/blocks/e-commerce/navigation/category-icon.js +86 -0
  156. package/dist/blocks/e-commerce/navigation/category-icon.js.map +1 -0
  157. package/dist/blocks/e-commerce/navigation/category-icon.mjs +79 -0
  158. package/dist/blocks/e-commerce/navigation/category-icon.mjs.map +1 -0
  159. package/dist/blocks/e-commerce/navigation/mega-menu.d.ts +112 -0
  160. package/dist/blocks/e-commerce/navigation/mega-menu.d.ts.map +1 -0
  161. package/dist/blocks/e-commerce/navigation/mega-menu.js +250 -0
  162. package/dist/blocks/e-commerce/navigation/mega-menu.js.map +1 -0
  163. package/dist/blocks/e-commerce/navigation/mega-menu.mjs +228 -0
  164. package/dist/blocks/e-commerce/navigation/mega-menu.mjs.map +1 -0
  165. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.d.ts +71 -0
  166. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.d.ts.map +1 -0
  167. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.js +94 -0
  168. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.js.map +1 -0
  169. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.mjs +68 -0
  170. package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.mjs.map +1 -0
  171. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.d.ts +121 -0
  172. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.d.ts.map +1 -0
  173. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.js +257 -0
  174. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.js.map +1 -0
  175. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.mjs +235 -0
  176. package/dist/blocks/e-commerce/navigation/mobile-category-drawer.mjs.map +1 -0
  177. package/dist/blocks/e-commerce/navigation/skip-to-content.d.ts +25 -0
  178. package/dist/blocks/e-commerce/navigation/skip-to-content.d.ts.map +1 -0
  179. package/dist/blocks/e-commerce/navigation/skip-to-content.js +55 -0
  180. package/dist/blocks/e-commerce/navigation/skip-to-content.js.map +1 -0
  181. package/dist/blocks/e-commerce/navigation/skip-to-content.mjs +30 -0
  182. package/dist/blocks/e-commerce/navigation/skip-to-content.mjs.map +1 -0
  183. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.d.ts +23 -0
  184. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.d.ts.map +1 -0
  185. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.js +127 -0
  186. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.js.map +1 -0
  187. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.mjs +111 -0
  188. package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.mjs.map +1 -0
  189. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts +66 -0
  190. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts.map +1 -0
  191. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js +280 -0
  192. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js.map +1 -0
  193. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs +263 -0
  194. package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs.map +1 -0
  195. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.d.ts +13 -0
  196. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.d.ts.map +1 -0
  197. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.js +83 -0
  198. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.js.map +1 -0
  199. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.mjs +59 -0
  200. package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.mjs.map +1 -0
  201. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.d.ts +8 -0
  202. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.d.ts.map +1 -0
  203. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.js +73 -0
  204. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.js.map +1 -0
  205. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.mjs +49 -0
  206. package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.mjs.map +1 -0
  207. package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts +121 -0
  208. package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts.map +1 -0
  209. package/dist/blocks/e-commerce/navigation/storefront-navbar.js +424 -0
  210. package/dist/blocks/e-commerce/navigation/storefront-navbar.js.map +1 -0
  211. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs +399 -0
  212. package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs.map +1 -0
  213. package/dist/blocks/e-commerce/order-history/order-history.d.ts +74 -0
  214. package/dist/blocks/e-commerce/order-history/order-history.d.ts.map +1 -0
  215. package/dist/blocks/e-commerce/order-history/order-history.js +161 -0
  216. package/dist/blocks/e-commerce/order-history/order-history.js.map +1 -0
  217. package/dist/blocks/e-commerce/order-history/order-history.mjs +141 -0
  218. package/dist/blocks/e-commerce/order-history/order-history.mjs.map +1 -0
  219. package/dist/blocks/e-commerce/order-history/order-line.d.ts +50 -0
  220. package/dist/blocks/e-commerce/order-history/order-line.d.ts.map +1 -0
  221. package/dist/blocks/e-commerce/order-history/order-line.js +75 -0
  222. package/dist/blocks/e-commerce/order-history/order-line.js.map +1 -0
  223. package/dist/blocks/e-commerce/order-history/order-line.mjs +49 -0
  224. package/dist/blocks/e-commerce/order-history/order-line.mjs.map +1 -0
  225. package/dist/blocks/e-commerce/product-categories/category-card.d.ts +9 -0
  226. package/dist/blocks/e-commerce/product-categories/category-card.d.ts.map +1 -0
  227. package/dist/blocks/e-commerce/product-categories/category-card.js +154 -0
  228. package/dist/blocks/e-commerce/product-categories/category-card.js.map +1 -0
  229. package/dist/blocks/e-commerce/product-categories/category-card.mjs +134 -0
  230. package/dist/blocks/e-commerce/product-categories/category-card.mjs.map +1 -0
  231. package/dist/blocks/e-commerce/product-categories/category-shared.d.ts +15 -0
  232. package/dist/blocks/e-commerce/product-categories/category-shared.d.ts.map +1 -0
  233. package/dist/blocks/e-commerce/product-categories/category-shared.js +101 -0
  234. package/dist/blocks/e-commerce/product-categories/category-shared.js.map +1 -0
  235. package/dist/blocks/e-commerce/product-categories/category-shared.mjs +97 -0
  236. package/dist/blocks/e-commerce/product-categories/category-shared.mjs.map +1 -0
  237. package/dist/blocks/e-commerce/product-categories/product-category-grid.d.ts +10 -0
  238. package/dist/blocks/e-commerce/product-categories/product-category-grid.d.ts.map +1 -0
  239. package/dist/blocks/e-commerce/product-categories/product-category-grid.js +138 -0
  240. package/dist/blocks/e-commerce/product-categories/product-category-grid.js.map +1 -0
  241. package/dist/blocks/e-commerce/product-categories/product-category-grid.mjs +114 -0
  242. package/dist/blocks/e-commerce/product-categories/product-category-grid.mjs.map +1 -0
  243. package/dist/blocks/e-commerce/product-categories/product-category.d.ts +41 -0
  244. package/dist/blocks/e-commerce/product-categories/product-category.d.ts.map +1 -0
  245. package/dist/blocks/e-commerce/product-categories/product-category.js +319 -0
  246. package/dist/blocks/e-commerce/product-categories/product-category.js.map +1 -0
  247. package/dist/blocks/e-commerce/product-categories/product-category.mjs +322 -0
  248. package/dist/blocks/e-commerce/product-categories/product-category.mjs.map +1 -0
  249. package/dist/blocks/e-commerce/product-list/product-card.d.ts +47 -0
  250. package/dist/blocks/e-commerce/product-list/product-card.d.ts.map +1 -0
  251. package/dist/blocks/e-commerce/product-list/product-card.js +361 -0
  252. package/dist/blocks/e-commerce/product-list/product-card.js.map +1 -0
  253. package/dist/blocks/e-commerce/product-list/product-card.mjs +337 -0
  254. package/dist/blocks/e-commerce/product-list/product-card.mjs.map +1 -0
  255. package/dist/blocks/e-commerce/product-list/product-grid.d.ts +28 -0
  256. package/dist/blocks/e-commerce/product-list/product-grid.d.ts.map +1 -0
  257. package/dist/blocks/e-commerce/product-list/product-grid.js +92 -0
  258. package/dist/blocks/e-commerce/product-list/product-grid.js.map +1 -0
  259. package/dist/blocks/e-commerce/product-list/product-grid.mjs +68 -0
  260. package/dist/blocks/e-commerce/product-list/product-grid.mjs.map +1 -0
  261. package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts +30 -0
  262. package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts.map +1 -0
  263. package/dist/blocks/e-commerce/product-list/product-showcase-1.js +245 -0
  264. package/dist/blocks/e-commerce/product-list/product-showcase-1.js.map +1 -0
  265. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs +221 -0
  266. package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs.map +1 -0
  267. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.d.ts +20 -0
  268. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.d.ts.map +1 -0
  269. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.js +71 -0
  270. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.js.map +1 -0
  271. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.mjs +47 -0
  272. package/dist/blocks/e-commerce/product-overview/product-overview-gallery.mjs.map +1 -0
  273. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.d.ts +15 -0
  274. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.d.ts.map +1 -0
  275. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.js +118 -0
  276. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.js.map +1 -0
  277. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.mjs +94 -0
  278. package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.mjs.map +1 -0
  279. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.d.ts +26 -0
  280. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.d.ts.map +1 -0
  281. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.js +85 -0
  282. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.js.map +1 -0
  283. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.mjs +61 -0
  284. package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.mjs.map +1 -0
  285. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.d.ts +32 -0
  286. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.d.ts.map +1 -0
  287. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.js +79 -0
  288. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.js.map +1 -0
  289. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.mjs +51 -0
  290. package/dist/blocks/e-commerce/product-overview/product-overview-tabs.mjs.map +1 -0
  291. package/dist/blocks/e-commerce/product-overview/product-overview.d.ts +121 -0
  292. package/dist/blocks/e-commerce/product-overview/product-overview.d.ts.map +1 -0
  293. package/dist/blocks/e-commerce/product-overview/product-overview.js +844 -0
  294. package/dist/blocks/e-commerce/product-overview/product-overview.js.map +1 -0
  295. package/dist/blocks/e-commerce/product-overview/product-overview.mjs +821 -0
  296. package/dist/blocks/e-commerce/product-overview/product-overview.mjs.map +1 -0
  297. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.d.ts +17 -0
  298. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.d.ts.map +1 -0
  299. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.js +123 -0
  300. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.js.map +1 -0
  301. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.mjs +99 -0
  302. package/dist/blocks/e-commerce/product-overview/product-quick-view-card.mjs.map +1 -0
  303. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts +20 -0
  304. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts.map +1 -0
  305. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js +271 -0
  306. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js.map +1 -0
  307. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs +253 -0
  308. package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs.map +1 -0
  309. package/dist/blocks/e-commerce/product-overview/product-quick-view.d.ts +68 -0
  310. package/dist/blocks/e-commerce/product-overview/product-quick-view.d.ts.map +1 -0
  311. package/dist/blocks/e-commerce/product-overview/product-quick-view.js +84 -0
  312. package/dist/blocks/e-commerce/product-overview/product-quick-view.js.map +1 -0
  313. package/dist/blocks/e-commerce/product-overview/product-quick-view.mjs +60 -0
  314. package/dist/blocks/e-commerce/product-overview/product-quick-view.mjs.map +1 -0
  315. package/dist/blocks/e-commerce/reviews/review-card.d.ts +60 -0
  316. package/dist/blocks/e-commerce/reviews/review-card.d.ts.map +1 -0
  317. package/dist/blocks/e-commerce/reviews/review-card.js +166 -0
  318. package/dist/blocks/e-commerce/reviews/review-card.js.map +1 -0
  319. package/dist/blocks/e-commerce/reviews/review-card.mjs +139 -0
  320. package/dist/blocks/e-commerce/reviews/review-card.mjs.map +1 -0
  321. package/dist/blocks/e-commerce/reviews/review-composer.d.ts +50 -0
  322. package/dist/blocks/e-commerce/reviews/review-composer.d.ts.map +1 -0
  323. package/dist/blocks/e-commerce/reviews/review-composer.js +180 -0
  324. package/dist/blocks/e-commerce/reviews/review-composer.js.map +1 -0
  325. package/dist/blocks/e-commerce/reviews/review-composer.mjs +155 -0
  326. package/dist/blocks/e-commerce/reviews/review-composer.mjs.map +1 -0
  327. package/dist/blocks/e-commerce/reviews/review-list.d.ts +40 -0
  328. package/dist/blocks/e-commerce/reviews/review-list.d.ts.map +1 -0
  329. package/dist/blocks/e-commerce/reviews/review-list.js +138 -0
  330. package/dist/blocks/e-commerce/reviews/review-list.js.map +1 -0
  331. package/dist/blocks/e-commerce/reviews/review-list.mjs +119 -0
  332. package/dist/blocks/e-commerce/reviews/review-list.mjs.map +1 -0
  333. package/dist/blocks/e-commerce/reviews/review-summary.d.ts +49 -0
  334. package/dist/blocks/e-commerce/reviews/review-summary.d.ts.map +1 -0
  335. package/dist/blocks/e-commerce/reviews/review-summary.js +150 -0
  336. package/dist/blocks/e-commerce/reviews/review-summary.js.map +1 -0
  337. package/dist/blocks/e-commerce/reviews/review-summary.mjs +124 -0
  338. package/dist/blocks/e-commerce/reviews/review-summary.mjs.map +1 -0
  339. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.d.ts +98 -0
  340. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.d.ts.map +1 -0
  341. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.js +417 -0
  342. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.js.map +1 -0
  343. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.mjs +393 -0
  344. package/dist/blocks/e-commerce/shopping-carts/shopping-cart.mjs.map +1 -0
  345. package/dist/blocks/e-commerce/store-containers/store-container-1.d.ts +13 -0
  346. package/dist/blocks/e-commerce/store-containers/store-container-1.d.ts.map +1 -0
  347. package/dist/blocks/e-commerce/store-containers/store-container-1.js +45 -0
  348. package/dist/blocks/e-commerce/store-containers/store-container-1.js.map +1 -0
  349. package/dist/blocks/e-commerce/store-containers/store-container-1.mjs +21 -0
  350. package/dist/blocks/e-commerce/store-containers/store-container-1.mjs.map +1 -0
  351. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts +163 -0
  352. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts.map +1 -0
  353. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js +810 -0
  354. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js.map +1 -0
  355. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs +786 -0
  356. package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs.map +1 -0
  357. package/dist/blocks/marketing/banners/avatar-group.d.ts +8 -0
  358. package/dist/blocks/marketing/banners/avatar-group.d.ts.map +1 -0
  359. package/dist/blocks/marketing/banners/avatar-group.js +90 -0
  360. package/dist/blocks/marketing/banners/avatar-group.js.map +1 -0
  361. package/dist/blocks/marketing/banners/avatar-group.mjs +56 -0
  362. package/dist/blocks/marketing/banners/avatar-group.mjs.map +1 -0
  363. package/dist/blocks/marketing/banners/banner-1.d.ts +26 -0
  364. package/dist/blocks/marketing/banners/banner-1.d.ts.map +1 -0
  365. package/dist/blocks/marketing/banners/banner-1.js +177 -0
  366. package/dist/blocks/marketing/banners/banner-1.js.map +1 -0
  367. package/dist/blocks/marketing/banners/banner-1.mjs +153 -0
  368. package/dist/blocks/marketing/banners/banner-1.mjs.map +1 -0
  369. package/dist/blocks/marketing/cta/cta-section-1.d.ts +13 -0
  370. package/dist/blocks/marketing/cta/cta-section-1.d.ts.map +1 -0
  371. package/dist/blocks/marketing/cta/cta-section-1.js +116 -0
  372. package/dist/blocks/marketing/cta/cta-section-1.js.map +1 -0
  373. package/dist/blocks/marketing/cta/cta-section-1.mjs +92 -0
  374. package/dist/blocks/marketing/cta/cta-section-1.mjs.map +1 -0
  375. package/dist/blocks/marketing/faq/faq-block-1.d.ts +16 -0
  376. package/dist/blocks/marketing/faq/faq-block-1.d.ts.map +1 -0
  377. package/dist/blocks/marketing/faq/faq-block-1.js +49 -0
  378. package/dist/blocks/marketing/faq/faq-block-1.js.map +1 -0
  379. package/dist/blocks/marketing/faq/faq-block-1.mjs +25 -0
  380. package/dist/blocks/marketing/faq/faq-block-1.mjs.map +1 -0
  381. package/dist/blocks/marketing/features/feature.d.ts +45 -0
  382. package/dist/blocks/marketing/features/feature.d.ts.map +1 -0
  383. package/dist/blocks/marketing/features/feature.js +135 -0
  384. package/dist/blocks/marketing/features/feature.js.map +1 -0
  385. package/dist/blocks/marketing/features/feature.mjs +111 -0
  386. package/dist/blocks/marketing/features/feature.mjs.map +1 -0
  387. package/dist/blocks/marketing/footers/footer-section.d.ts +59 -0
  388. package/dist/blocks/marketing/footers/footer-section.d.ts.map +1 -0
  389. package/dist/blocks/marketing/footers/footer-section.js +356 -0
  390. package/dist/blocks/marketing/footers/footer-section.js.map +1 -0
  391. package/dist/blocks/marketing/footers/footer-section.mjs +332 -0
  392. package/dist/blocks/marketing/footers/footer-section.mjs.map +1 -0
  393. package/dist/blocks/marketing/hero-sections/avatar-group.d.ts +9 -0
  394. package/dist/blocks/marketing/hero-sections/avatar-group.d.ts.map +1 -0
  395. package/dist/blocks/marketing/hero-sections/avatar-group.js +92 -0
  396. package/dist/blocks/marketing/hero-sections/avatar-group.js.map +1 -0
  397. package/dist/blocks/marketing/hero-sections/avatar-group.mjs +58 -0
  398. package/dist/blocks/marketing/hero-sections/avatar-group.mjs.map +1 -0
  399. package/dist/blocks/marketing/hero-sections/hero-section-1.d.ts +27 -0
  400. package/dist/blocks/marketing/hero-sections/hero-section-1.d.ts.map +1 -0
  401. package/dist/blocks/marketing/hero-sections/hero-section-1.js +124 -0
  402. package/dist/blocks/marketing/hero-sections/hero-section-1.js.map +1 -0
  403. package/dist/blocks/marketing/hero-sections/hero-section-1.mjs +100 -0
  404. package/dist/blocks/marketing/hero-sections/hero-section-1.mjs.map +1 -0
  405. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.d.ts +19 -0
  406. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.d.ts.map +1 -0
  407. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.js +63 -0
  408. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.js.map +1 -0
  409. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.mjs +39 -0
  410. package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.mjs.map +1 -0
  411. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.d.ts +13 -0
  412. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.d.ts.map +1 -0
  413. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.js +49 -0
  414. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.js.map +1 -0
  415. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.mjs +25 -0
  416. package/dist/blocks/marketing/logo-clouds/logo-cloud-1.mjs.map +1 -0
  417. package/dist/blocks/marketing/navbars/navbar.d.ts +80 -0
  418. package/dist/blocks/marketing/navbars/navbar.d.ts.map +1 -0
  419. package/dist/blocks/marketing/navbars/navbar.js +484 -0
  420. package/dist/blocks/marketing/navbars/navbar.js.map +1 -0
  421. package/dist/blocks/marketing/navbars/navbar.mjs +475 -0
  422. package/dist/blocks/marketing/navbars/navbar.mjs.map +1 -0
  423. package/dist/blocks/marketing/pricing/pricing-section-1.d.ts +23 -0
  424. package/dist/blocks/marketing/pricing/pricing-section-1.d.ts.map +1 -0
  425. package/dist/blocks/marketing/pricing/pricing-section-1.js +89 -0
  426. package/dist/blocks/marketing/pricing/pricing-section-1.js.map +1 -0
  427. package/dist/blocks/marketing/pricing/pricing-section-1.mjs +65 -0
  428. package/dist/blocks/marketing/pricing/pricing-section-1.mjs.map +1 -0
  429. package/dist/blocks/marketing/statistics/statistic-1.d.ts +19 -0
  430. package/dist/blocks/marketing/statistics/statistic-1.d.ts.map +1 -0
  431. package/dist/blocks/marketing/statistics/statistic-1.js +83 -0
  432. package/dist/blocks/marketing/statistics/statistic-1.js.map +1 -0
  433. package/dist/blocks/marketing/statistics/statistic-1.mjs +59 -0
  434. package/dist/blocks/marketing/statistics/statistic-1.mjs.map +1 -0
  435. package/dist/blocks/marketing/testimonials/testimonial-section.d.ts +29 -0
  436. package/dist/blocks/marketing/testimonials/testimonial-section.d.ts.map +1 -0
  437. package/dist/blocks/marketing/testimonials/testimonial-section.js +173 -0
  438. package/dist/blocks/marketing/testimonials/testimonial-section.js.map +1 -0
  439. package/dist/blocks/marketing/testimonials/testimonial-section.mjs +155 -0
  440. package/dist/blocks/marketing/testimonials/testimonial-section.mjs.map +1 -0
  441. package/dist/blocks/shared/reaction-toggle.d.ts +14 -0
  442. package/dist/blocks/shared/reaction-toggle.d.ts.map +1 -0
  443. package/dist/blocks/shared/reaction-toggle.js +138 -0
  444. package/dist/blocks/shared/reaction-toggle.js.map +1 -0
  445. package/dist/blocks/shared/reaction-toggle.mjs +114 -0
  446. package/dist/blocks/shared/reaction-toggle.mjs.map +1 -0
  447. package/dist/hooks/use-mobile.d.ts +2 -0
  448. package/dist/hooks/use-mobile.d.ts.map +1 -0
  449. package/dist/hooks/use-mobile.js +53 -0
  450. package/dist/hooks/use-mobile.js.map +1 -0
  451. package/dist/hooks/use-mobile.mjs +19 -0
  452. package/dist/hooks/use-mobile.mjs.map +1 -0
  453. package/dist/index.d.ts +100 -0
  454. package/dist/index.d.ts.map +1 -0
  455. package/dist/index.js +339 -0
  456. package/dist/index.js.map +1 -0
  457. package/dist/index.mjs +238 -0
  458. package/dist/index.mjs.map +1 -0
  459. package/{src/lib/cart.ts → dist/lib/cart.d.ts} +2 -3
  460. package/dist/lib/cart.d.ts.map +1 -0
  461. package/dist/lib/cart.js +31 -0
  462. package/dist/lib/cart.js.map +1 -0
  463. package/dist/lib/cart.mjs +7 -0
  464. package/dist/lib/cart.mjs.map +1 -0
  465. package/dist/lib/contracts.d.ts +4008 -0
  466. package/dist/lib/contracts.d.ts.map +1 -0
  467. package/dist/lib/contracts.js +828 -0
  468. package/dist/lib/contracts.js.map +1 -0
  469. package/dist/lib/contracts.mjs +737 -0
  470. package/dist/lib/contracts.mjs.map +1 -0
  471. package/dist/lib/money.d.ts +28 -0
  472. package/dist/lib/money.d.ts.map +1 -0
  473. package/dist/lib/money.js +50 -0
  474. package/dist/lib/money.js.map +1 -0
  475. package/dist/lib/money.mjs +24 -0
  476. package/dist/lib/money.mjs.map +1 -0
  477. package/dist/lib/types/menu.d.ts +40 -0
  478. package/dist/lib/types/menu.d.ts.map +1 -0
  479. package/dist/lib/types/menu.js +50 -0
  480. package/dist/lib/types/menu.js.map +1 -0
  481. package/dist/lib/types/menu.mjs +25 -0
  482. package/dist/lib/types/menu.mjs.map +1 -0
  483. package/dist/lib/types.d.ts +5 -0
  484. package/dist/lib/types.d.ts.map +1 -0
  485. package/dist/lib/types.js +17 -0
  486. package/dist/lib/types.js.map +1 -0
  487. package/dist/lib/types.mjs +1 -0
  488. package/dist/lib/types.mjs.map +1 -0
  489. package/dist/lib/utils.d.ts +7 -0
  490. package/dist/lib/utils.d.ts.map +1 -0
  491. package/dist/lib/utils.js +33 -0
  492. package/dist/lib/utils.js.map +1 -0
  493. package/dist/lib/utils.mjs +9 -0
  494. package/dist/lib/utils.mjs.map +1 -0
  495. package/dist/ui/accordion.d.ts +8 -0
  496. package/dist/ui/accordion.d.ts.map +1 -0
  497. package/dist/ui/accordion.js +93 -0
  498. package/dist/ui/accordion.js.map +1 -0
  499. package/dist/ui/accordion.mjs +66 -0
  500. package/dist/ui/accordion.mjs.map +1 -0
  501. package/dist/ui/avatar.d.ts +12 -0
  502. package/dist/ui/avatar.d.ts.map +1 -0
  503. package/dist/ui/avatar.js +134 -0
  504. package/dist/ui/avatar.js.map +1 -0
  505. package/{src/ui/avatar.tsx → dist/ui/avatar.mjs} +67 -70
  506. package/dist/ui/avatar.mjs.map +1 -0
  507. package/dist/ui/badge.d.ts +10 -0
  508. package/dist/ui/badge.d.ts.map +1 -0
  509. package/dist/ui/badge.js +69 -0
  510. package/dist/ui/badge.js.map +1 -0
  511. package/dist/ui/badge.mjs +44 -0
  512. package/dist/ui/badge.mjs.map +1 -0
  513. package/dist/ui/breadcrumb.d.ts +12 -0
  514. package/dist/ui/breadcrumb.d.ts.map +1 -0
  515. package/dist/ui/breadcrumb.js +134 -0
  516. package/dist/ui/breadcrumb.js.map +1 -0
  517. package/dist/ui/breadcrumb.mjs +104 -0
  518. package/dist/ui/breadcrumb.mjs.map +1 -0
  519. package/dist/ui/button-group.d.ts +12 -0
  520. package/dist/ui/button-group.d.ts.map +1 -0
  521. package/dist/ui/button-group.js +104 -0
  522. package/dist/ui/button-group.js.map +1 -0
  523. package/dist/ui/button-group.mjs +77 -0
  524. package/dist/ui/button-group.mjs.map +1 -0
  525. package/dist/ui/button.d.ts +11 -0
  526. package/dist/ui/button.d.ts.map +1 -0
  527. package/dist/ui/button.js +82 -0
  528. package/dist/ui/button.js.map +1 -0
  529. package/dist/ui/button.mjs +57 -0
  530. package/dist/ui/button.mjs.map +1 -0
  531. package/dist/ui/card.d.ts +10 -0
  532. package/dist/ui/card.d.ts.map +1 -0
  533. package/dist/ui/card.js +121 -0
  534. package/dist/ui/card.js.map +1 -0
  535. package/dist/ui/card.mjs +91 -0
  536. package/dist/ui/card.mjs.map +1 -0
  537. package/dist/ui/carousel.d.ts +20 -0
  538. package/dist/ui/carousel.d.ts.map +1 -0
  539. package/dist/ui/carousel.js +238 -0
  540. package/dist/ui/carousel.js.map +1 -0
  541. package/dist/ui/carousel.mjs +200 -0
  542. package/dist/ui/carousel.mjs.map +1 -0
  543. package/dist/ui/dialog.d.ts +18 -0
  544. package/dist/ui/dialog.d.ts.map +1 -0
  545. package/dist/ui/dialog.js +181 -0
  546. package/dist/ui/dialog.js.map +1 -0
  547. package/dist/ui/dialog.mjs +148 -0
  548. package/dist/ui/dialog.mjs.map +1 -0
  549. package/dist/ui/drawer.d.ts +14 -0
  550. package/dist/ui/drawer.d.ts.map +1 -0
  551. package/dist/ui/drawer.js +163 -0
  552. package/dist/ui/drawer.js.map +1 -0
  553. package/dist/ui/drawer.mjs +130 -0
  554. package/dist/ui/drawer.mjs.map +1 -0
  555. package/dist/ui/dropdown-menu.d.ts +26 -0
  556. package/dist/ui/dropdown-menu.d.ts.map +1 -0
  557. package/dist/ui/dropdown-menu.js +271 -0
  558. package/dist/ui/dropdown-menu.js.map +1 -0
  559. package/dist/ui/dropdown-menu.mjs +233 -0
  560. package/dist/ui/dropdown-menu.mjs.map +1 -0
  561. package/dist/ui/empty.d.ts +12 -0
  562. package/dist/ui/empty.d.ts.map +1 -0
  563. package/dist/ui/empty.js +132 -0
  564. package/dist/ui/empty.js.map +1 -0
  565. package/dist/ui/empty.mjs +103 -0
  566. package/dist/ui/empty.mjs.map +1 -0
  567. package/dist/ui/field.d.ts +25 -0
  568. package/dist/ui/field.d.ts.map +1 -0
  569. package/dist/ui/field.js +264 -0
  570. package/dist/ui/field.js.map +1 -0
  571. package/{src/ui/field.tsx → dist/ui/field.mjs} +142 -159
  572. package/dist/ui/field.mjs.map +1 -0
  573. package/dist/ui/input-group.d.ts +17 -0
  574. package/dist/ui/input-group.d.ts.map +1 -0
  575. package/dist/ui/input-group.js +185 -0
  576. package/dist/ui/input-group.js.map +1 -0
  577. package/{src/ui/input-group.tsx → dist/ui/input-group.mjs} +92 -106
  578. package/dist/ui/input-group.mjs.map +1 -0
  579. package/dist/ui/input-otp.d.ts +12 -0
  580. package/dist/ui/input-otp.d.ts.map +1 -0
  581. package/dist/ui/input-otp.js +105 -0
  582. package/dist/ui/input-otp.js.map +1 -0
  583. package/dist/ui/input-otp.mjs +68 -0
  584. package/dist/ui/input-otp.mjs.map +1 -0
  585. package/dist/ui/input.d.ts +4 -0
  586. package/dist/ui/input.d.ts.map +1 -0
  587. package/dist/ui/input.js +46 -0
  588. package/dist/ui/input.js.map +1 -0
  589. package/{src/ui/input.tsx → dist/ui/input.mjs} +17 -15
  590. package/dist/ui/input.mjs.map +1 -0
  591. package/dist/ui/label.d.ts +5 -0
  592. package/dist/ui/label.d.ts.map +1 -0
  593. package/dist/ui/label.js +48 -0
  594. package/dist/ui/label.js.map +1 -0
  595. package/dist/ui/label.mjs +24 -0
  596. package/dist/ui/label.mjs.map +1 -0
  597. package/dist/ui/navigation-menu.d.ts +15 -0
  598. package/dist/ui/navigation-menu.d.ts.map +1 -0
  599. package/dist/ui/navigation-menu.js +203 -0
  600. package/dist/ui/navigation-menu.js.map +1 -0
  601. package/{src/ui/navigation-menu.tsx → dist/ui/navigation-menu.mjs} +116 -112
  602. package/dist/ui/navigation-menu.mjs.map +1 -0
  603. package/dist/ui/pagination.d.ts +14 -0
  604. package/dist/ui/pagination.d.ts.map +1 -0
  605. package/dist/ui/pagination.js +149 -0
  606. package/dist/ui/pagination.js.map +1 -0
  607. package/dist/ui/pagination.mjs +123 -0
  608. package/dist/ui/pagination.mjs.map +1 -0
  609. package/dist/ui/progress.d.ts +5 -0
  610. package/dist/ui/progress.d.ts.map +1 -0
  611. package/dist/ui/progress.js +57 -0
  612. package/dist/ui/progress.js.map +1 -0
  613. package/dist/ui/progress.mjs +33 -0
  614. package/dist/ui/progress.mjs.map +1 -0
  615. package/dist/ui/radio-group.d.ts +6 -0
  616. package/dist/ui/radio-group.d.ts.map +1 -0
  617. package/dist/ui/radio-group.js +72 -0
  618. package/dist/ui/radio-group.js.map +1 -0
  619. package/dist/ui/radio-group.mjs +47 -0
  620. package/dist/ui/radio-group.mjs.map +1 -0
  621. package/dist/ui/select.d.ts +16 -0
  622. package/dist/ui/select.d.ts.map +1 -0
  623. package/dist/ui/select.js +213 -0
  624. package/dist/ui/select.js.map +1 -0
  625. package/dist/ui/select.mjs +180 -0
  626. package/dist/ui/select.mjs.map +1 -0
  627. package/dist/ui/separator.d.ts +5 -0
  628. package/dist/ui/separator.d.ts.map +1 -0
  629. package/dist/ui/separator.js +52 -0
  630. package/dist/ui/separator.js.map +1 -0
  631. package/dist/ui/separator.mjs +28 -0
  632. package/dist/ui/separator.mjs.map +1 -0
  633. package/dist/ui/sheet.d.ts +15 -0
  634. package/dist/ui/sheet.d.ts.map +1 -0
  635. package/dist/ui/sheet.js +160 -0
  636. package/dist/ui/sheet.js.map +1 -0
  637. package/dist/ui/sheet.mjs +129 -0
  638. package/dist/ui/sheet.mjs.map +1 -0
  639. package/dist/ui/sidebar.d.ts +70 -0
  640. package/dist/ui/sidebar.d.ts.map +1 -0
  641. package/dist/ui/sidebar.js +697 -0
  642. package/dist/ui/sidebar.js.map +1 -0
  643. package/dist/ui/sidebar.mjs +651 -0
  644. package/dist/ui/sidebar.mjs.map +1 -0
  645. package/dist/ui/skeleton.d.ts +3 -0
  646. package/dist/ui/skeleton.d.ts.map +1 -0
  647. package/dist/ui/skeleton.js +40 -0
  648. package/dist/ui/skeleton.js.map +1 -0
  649. package/dist/ui/skeleton.mjs +16 -0
  650. package/dist/ui/skeleton.mjs.map +1 -0
  651. package/dist/ui/table.d.ts +11 -0
  652. package/dist/ui/table.d.ts.map +1 -0
  653. package/dist/ui/table.js +147 -0
  654. package/dist/ui/table.js.map +1 -0
  655. package/dist/ui/table.mjs +116 -0
  656. package/dist/ui/table.mjs.map +1 -0
  657. package/dist/ui/tabs.d.ts +12 -0
  658. package/dist/ui/tabs.d.ts.map +1 -0
  659. package/dist/ui/tabs.js +121 -0
  660. package/dist/ui/tabs.js.map +1 -0
  661. package/{src/ui/tabs.tsx → dist/ui/tabs.mjs} +59 -56
  662. package/dist/ui/tabs.mjs.map +1 -0
  663. package/dist/ui/textarea.d.ts +4 -0
  664. package/dist/ui/textarea.d.ts.map +1 -0
  665. package/dist/ui/textarea.js +43 -0
  666. package/dist/ui/textarea.js.map +1 -0
  667. package/{src/ui/textarea.tsx → dist/ui/textarea.mjs} +16 -14
  668. package/dist/ui/textarea.mjs.map +1 -0
  669. package/dist/ui/toggle-group.d.ts +10 -0
  670. package/dist/ui/toggle-group.d.ts.map +1 -0
  671. package/dist/ui/toggle-group.js +105 -0
  672. package/dist/ui/toggle-group.js.map +1 -0
  673. package/dist/ui/toggle-group.mjs +70 -0
  674. package/dist/ui/toggle-group.mjs.map +1 -0
  675. package/dist/ui/toggle.d.ts +10 -0
  676. package/dist/ui/toggle.d.ts.map +1 -0
  677. package/dist/ui/toggle.js +70 -0
  678. package/dist/ui/toggle.js.map +1 -0
  679. package/{src/ui/toggle.tsx → dist/ui/toggle.mjs} +25 -26
  680. package/dist/ui/toggle.mjs.map +1 -0
  681. package/dist/ui/tooltip.d.ts +8 -0
  682. package/dist/ui/tooltip.d.ts.map +1 -0
  683. package/dist/ui/tooltip.js +84 -0
  684. package/dist/ui/tooltip.js.map +1 -0
  685. package/dist/ui/tooltip.mjs +57 -0
  686. package/dist/ui/tooltip.mjs.map +1 -0
  687. package/package.json +8 -1
  688. package/AGENTS.md +0 -1
  689. package/CHANGELOG.md +0 -155
  690. package/components.json +0 -33
  691. package/docs/standards/data-contracts.md +0 -81
  692. package/docs/standards/theming.md +0 -112
  693. package/scripts/fix-esm-extensions.mjs +0 -40
  694. package/src/blocks/application/app-shells/app-shell-1-sidebar.tsx +0 -198
  695. package/src/blocks/application/app-shells/app-shell-1.tsx +0 -196
  696. package/src/blocks/application/login-forms/login-page.test.tsx +0 -190
  697. package/src/blocks/application/login-forms/login-page.tsx +0 -240
  698. package/src/blocks/application/password-recovery/forgot-password-page-1-brand-mark.tsx +0 -38
  699. package/src/blocks/application/password-recovery/forgot-password-page-1.tsx +0 -318
  700. package/src/blocks/application/signup-forms/signup-page-1.tsx +0 -229
  701. package/src/blocks/application/verification/verify-1.tsx +0 -307
  702. package/src/blocks/application/verification/verify-confetti.tsx +0 -192
  703. package/src/blocks/application/viewport-ownership.test.tsx +0 -41
  704. package/src/blocks/e-commerce/category-filters/category-listing-filter-fields.tsx +0 -218
  705. package/src/blocks/e-commerce/category-filters/category-listing.test.tsx +0 -601
  706. package/src/blocks/e-commerce/category-filters/category-listing.tsx +0 -934
  707. package/src/blocks/e-commerce/checkout-forms/checkbox-check.tsx +0 -74
  708. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.tsx +0 -195
  709. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.test.tsx +0 -136
  710. package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.tsx +0 -329
  711. package/src/blocks/e-commerce/checkout-forms/checkout-contact-step.tsx +0 -149
  712. package/src/blocks/e-commerce/checkout-forms/checkout-country-field.tsx +0 -53
  713. package/src/blocks/e-commerce/checkout-forms/checkout-field-feedback.tsx +0 -29
  714. package/src/blocks/e-commerce/checkout-forms/checkout-form-types.ts +0 -7
  715. package/src/blocks/e-commerce/checkout-forms/checkout-order-summary.tsx +0 -230
  716. package/src/blocks/e-commerce/checkout-forms/checkout-payment-step.tsx +0 -100
  717. package/src/blocks/e-commerce/checkout-forms/checkout-progress.tsx +0 -62
  718. package/src/blocks/e-commerce/checkout-forms/checkout-review-step.tsx +0 -59
  719. package/src/blocks/e-commerce/checkout-forms/checkout-shipping-step.tsx +0 -180
  720. package/src/blocks/e-commerce/checkout-forms/checkout.test.tsx +0 -478
  721. package/src/blocks/e-commerce/checkout-forms/checkout.tsx +0 -550
  722. package/src/blocks/e-commerce/navigation/back-to-top.test.tsx +0 -27
  723. package/src/blocks/e-commerce/navigation/back-to-top.tsx +0 -71
  724. package/src/blocks/e-commerce/navigation/breadcrumb.test.tsx +0 -174
  725. package/src/blocks/e-commerce/navigation/breadcrumb.tsx +0 -130
  726. package/src/blocks/e-commerce/navigation/category-icon.test.tsx +0 -54
  727. package/src/blocks/e-commerce/navigation/category-icon.tsx +0 -94
  728. package/src/blocks/e-commerce/navigation/mega-menu.test.tsx +0 -139
  729. package/src/blocks/e-commerce/navigation/mega-menu.tsx +0 -271
  730. package/src/blocks/e-commerce/navigation/mobile-bottom-nav.test.tsx +0 -74
  731. package/src/blocks/e-commerce/navigation/mobile-bottom-nav.tsx +0 -78
  732. package/src/blocks/e-commerce/navigation/mobile-category-drawer.test.tsx +0 -192
  733. package/src/blocks/e-commerce/navigation/mobile-category-drawer.tsx +0 -278
  734. package/src/blocks/e-commerce/navigation/skip-to-content.test.tsx +0 -35
  735. package/src/blocks/e-commerce/navigation/skip-to-content.tsx +0 -37
  736. package/src/blocks/e-commerce/navigation/storefront-navbar-account-menu.test.tsx +0 -56
  737. package/src/blocks/e-commerce/navigation/storefront-navbar-account-menu.tsx +0 -134
  738. package/src/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.test.tsx +0 -204
  739. package/src/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.tsx +0 -371
  740. package/src/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.tsx +0 -96
  741. package/src/blocks/e-commerce/navigation/storefront-navbar-search-bar.tsx +0 -52
  742. package/src/blocks/e-commerce/navigation/storefront-navbar.test.tsx +0 -264
  743. package/src/blocks/e-commerce/navigation/storefront-navbar.tsx +0 -604
  744. package/src/blocks/e-commerce/order-history/order-history-1.tsx +0 -159
  745. package/src/blocks/e-commerce/order-history/order-history-2.tsx +0 -222
  746. package/src/blocks/e-commerce/product-categories/category-card-grid.test.tsx +0 -122
  747. package/src/blocks/e-commerce/product-categories/category-card.test.tsx +0 -68
  748. package/src/blocks/e-commerce/product-categories/category-card.tsx +0 -172
  749. package/src/blocks/e-commerce/product-categories/category-grid.test.tsx +0 -67
  750. package/src/blocks/e-commerce/product-categories/category-shared.tsx +0 -109
  751. package/src/blocks/e-commerce/product-categories/product-category-grid.tsx +0 -170
  752. package/src/blocks/e-commerce/product-categories/product-category.test.tsx +0 -266
  753. package/src/blocks/e-commerce/product-categories/product-category.tsx +0 -462
  754. package/src/blocks/e-commerce/product-list/product-card.test.tsx +0 -263
  755. package/src/blocks/e-commerce/product-list/product-card.tsx +0 -447
  756. package/src/blocks/e-commerce/product-list/product-grid.test.tsx +0 -162
  757. package/src/blocks/e-commerce/product-list/product-grid.tsx +0 -114
  758. package/src/blocks/e-commerce/product-list/product-showcase-1.test.tsx +0 -78
  759. package/src/blocks/e-commerce/product-list/product-showcase-1.tsx +0 -277
  760. package/src/blocks/e-commerce/product-overview/product-overview-gallery.tsx +0 -71
  761. package/src/blocks/e-commerce/product-overview/product-overview-lightbox-tab.tsx +0 -116
  762. package/src/blocks/e-commerce/product-overview/product-overview-reviews-tab.tsx +0 -105
  763. package/src/blocks/e-commerce/product-overview/product-overview-tabs.tsx +0 -70
  764. package/src/blocks/e-commerce/product-overview/product-overview.test.tsx +0 -283
  765. package/src/blocks/e-commerce/product-overview/product-overview.tsx +0 -1186
  766. package/src/blocks/e-commerce/product-overview/product-quick-view-card.tsx +0 -135
  767. package/src/blocks/e-commerce/product-overview/product-quick-view-dialog.tsx +0 -393
  768. package/src/blocks/e-commerce/product-overview/product-quick-view.tsx +0 -136
  769. package/src/blocks/e-commerce/reviews/review-rating-1-review-form.tsx +0 -133
  770. package/src/blocks/e-commerce/reviews/review-rating-1.tsx +0 -178
  771. package/src/blocks/e-commerce/reviews/review-rating-2.tsx +0 -245
  772. package/src/blocks/e-commerce/shopping-carts/shopping-cart.test.tsx +0 -399
  773. package/src/blocks/e-commerce/shopping-carts/shopping-cart.tsx +0 -628
  774. package/src/blocks/e-commerce/store-containers/store-container-1.tsx +0 -29
  775. package/src/blocks/e-commerce/storefront-hero/storefront-hero.test.tsx +0 -412
  776. package/src/blocks/e-commerce/storefront-hero/storefront-hero.tsx +0 -1283
  777. package/src/blocks/marketing/banners/avatar-group.tsx +0 -69
  778. package/src/blocks/marketing/banners/banner-1.tsx +0 -188
  779. package/src/blocks/marketing/cta/cta-section-1.tsx +0 -112
  780. package/src/blocks/marketing/faq/faq-block-1.tsx +0 -45
  781. package/src/blocks/marketing/features/feature.test.tsx +0 -153
  782. package/src/blocks/marketing/features/feature.tsx +0 -195
  783. package/src/blocks/marketing/footers/footer-section-accessibility.test.tsx +0 -118
  784. package/src/blocks/marketing/footers/footer-section-actions.test.tsx +0 -131
  785. package/src/blocks/marketing/footers/footer-section-data.test.tsx +0 -127
  786. package/src/blocks/marketing/footers/footer-section-native-links.test.tsx +0 -100
  787. package/src/blocks/marketing/footers/footer-section-public-api.test.tsx +0 -11
  788. package/src/blocks/marketing/footers/footer-section.test.tsx +0 -46
  789. package/src/blocks/marketing/footers/footer-section.tsx +0 -532
  790. package/src/blocks/marketing/hero-sections/avatar-group.tsx +0 -86
  791. package/src/blocks/marketing/hero-sections/hero-section-1.tsx +0 -135
  792. package/src/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.tsx +0 -52
  793. package/src/blocks/marketing/logo-clouds/logo-cloud-1.tsx +0 -56
  794. package/src/blocks/marketing/navbars/navbar-public-api.test.tsx +0 -57
  795. package/src/blocks/marketing/navbars/navbar.mega.test.tsx +0 -149
  796. package/src/blocks/marketing/navbars/navbar.test.tsx +0 -155
  797. package/src/blocks/marketing/navbars/navbar.tsx +0 -735
  798. package/src/blocks/marketing/pricing/pricing-section-1.tsx +0 -94
  799. package/src/blocks/marketing/statistics/statistic-1.tsx +0 -93
  800. package/src/blocks/marketing/testimonials/testimonial-section.test.tsx +0 -171
  801. package/src/blocks/marketing/testimonials/testimonial-section.tsx +0 -237
  802. package/src/blocks/shared/reaction-toggle.tsx +0 -145
  803. package/src/hooks/use-mobile.ts +0 -19
  804. package/src/index.ts +0 -284
  805. package/src/lib/cart.test.ts +0 -15
  806. package/src/lib/contracts-curated.test.ts +0 -225
  807. package/src/lib/contracts-server-boundary.test.ts +0 -52
  808. package/src/lib/contracts.test.ts +0 -228
  809. package/src/lib/contracts.ts +0 -857
  810. package/src/lib/money.test.ts +0 -64
  811. package/src/lib/money.ts +0 -65
  812. package/src/lib/types/menu.ts +0 -43
  813. package/src/lib/types.ts +0 -4
  814. package/src/lib/utils.ts +0 -10
  815. package/src/ui/accordion.tsx +0 -65
  816. package/src/ui/badge.tsx +0 -47
  817. package/src/ui/breadcrumb.tsx +0 -108
  818. package/src/ui/button-group.tsx +0 -83
  819. package/src/ui/button.tsx +0 -63
  820. package/src/ui/card.tsx +0 -91
  821. package/src/ui/carousel.tsx +0 -241
  822. package/src/ui/dialog.tsx +0 -158
  823. package/src/ui/drawer.tsx +0 -134
  824. package/src/ui/dropdown-menu.tsx +0 -256
  825. package/src/ui/empty.tsx +0 -103
  826. package/src/ui/input-otp.tsx +0 -76
  827. package/src/ui/label.tsx +0 -23
  828. package/src/ui/pagination.tsx +0 -127
  829. package/src/ui/progress.tsx +0 -30
  830. package/src/ui/radio-group.tsx +0 -44
  831. package/src/ui/select.tsx +0 -189
  832. package/src/ui/separator.tsx +0 -27
  833. package/src/ui/sheet.tsx +0 -142
  834. package/src/ui/sidebar.tsx +0 -726
  835. package/src/ui/skeleton.tsx +0 -13
  836. package/src/ui/table.tsx +0 -115
  837. package/src/ui/toggle-group.tsx +0 -83
  838. package/src/ui/tooltip.tsx +0 -56
  839. package/tsconfig.build.json +0 -12
  840. package/tsconfig.json +0 -20
  841. package/tsup.config.ts +0 -19
  842. package/vitest.config.ts +0 -17
@@ -1,1186 +0,0 @@
1
- 'use client'
2
-
3
- import { useEffect, useState } from 'react'
4
- import { Camera, Check, Heart, Info, MessageSquare, Minus, Package, Plus, Share2, ShoppingCart, Star, Truck } from 'lucide-react'
5
- import type { Image, Money, ProductOption, SelectedOption } from '@thorprovider/types'
6
- import { Button } from '../../../ui/button'
7
- import { Card, CardContent } from '../../../ui/card'
8
- import { Separator } from '../../../ui/separator'
9
- import { cn } from '../../../lib/utils'
10
- import { PRODUCT_IMAGE_FALLBACK } from '../../../lib/contracts'
11
- import { formatMoney, isAvailableMoney } from '../../../lib/money'
12
- import { ReactionToggle } from '../../shared/reaction-toggle'
13
- import { Carousel, CarouselContent, CarouselItem, type CarouselApi } from '../../../ui/carousel'
14
- import { ProductOverviewGallery } from './product-overview-gallery'
15
- import { ProductOverviewLightboxTab } from './product-overview-lightbox-tab'
16
- import { ProductOverviewReviewsTab, type ProductOverviewReview } from './product-overview-reviews-tab'
17
- import {
18
- ProductOverviewTabs,
19
- ProductOverviewTabsContentFade,
20
- ProductOverviewTabsIndicator,
21
- ProductOverviewTabsList,
22
- ProductOverviewTabsTrigger,
23
- } from './product-overview-tabs'
24
-
25
- /**
26
- * Canonical product-detail projection.
27
- *
28
- * The block consumes the canonical `@thorprovider/types` shapes (`Money`,
29
- * `ProductOption`, `SelectedOption`, `Image`) so adapter output maps without a
30
- * second, drifting product type. The only deviation is `price`: the canon marks
31
- * it required, but a missing/unresolved backend price is a real, distinct state
32
- * that must disable purchase — so the projection allows `price` to be absent
33
- * and the block treats absence as "unavailable", never as zero.
34
- */
35
- export interface ProductDetailVariant {
36
- id: string
37
- title: string
38
- sku?: string
39
- availableForSale: boolean
40
- selectedOptions: SelectedOption[]
41
- /** Canonical Money; omit/null when the backend has no resolved price. */
42
- price?: Money | null
43
- compareAtPrice?: Money
44
- image?: Image
45
- }
46
-
47
- export interface ProductDetailProduct {
48
- id: string
49
- handle?: string
50
- title: string
51
- description?: string
52
- vendor?: string
53
- options: ProductOption[]
54
- variants: ProductDetailVariant[]
55
- images: Image[]
56
- featuredImage?: Image
57
- }
58
-
59
- export interface ProductOverviewRating {
60
- value: number
61
- count: number
62
- }
63
-
64
- /**
65
- * The bounded presentation surface. `standard` is the straightforward detail
66
- * layout, `gallery` is image-forward, and `rich` adds tabbed overview/specs/
67
- * reviews/gallery. The value changes structure, never the data contract.
68
- */
69
- export type ProductOverviewPresentation = 'standard' | 'gallery' | 'rich'
70
-
71
- export interface ProductOverviewProps {
72
- product: ProductDetailProduct
73
- /** Bounded presentation option; defaults to `standard`. */
74
- presentation?: ProductOverviewPresentation
75
- /** Controlled selection: the backend variant id, or null/undefined when nothing is explicitly selected. */
76
- selectedVariantId?: string | null
77
- onSelectVariant?: (variantId: string) => void
78
- /** Controlled quantity for the add-to-cart action; defaults to 1 when omitted. */
79
- quantity?: number
80
- onQuantityChange?: (quantity: number) => void
81
- /** Add-to-cart identity is the selected backend variant id, with the requested quantity. */
82
- onAddToCart?: (variantId: string, quantity: number) => void
83
- isWishlisted?: boolean
84
- onToggleWishlist?: (variantId: string, isWishlisted: boolean) => void
85
- /** Optional share action (used by the `rich` presentation). */
86
- onShare?: () => void
87
- /** Rendered only when the backend supplies it. */
88
- rating?: ProductOverviewRating
89
- /** Rendered only when the backend supplies it. */
90
- deliveryEstimate?: string
91
- /** Rendered only when the backend supplies it. */
92
- shipping?: Money
93
- formatPrice?: (money: Money) => string
94
- /** `rich`-only optional data. Omitted sections render no chrome. */
95
- specifications?: Record<string, string>
96
- /** `rich`-only optional data. Omitted sections render no chrome. */
97
- features?: string[]
98
- /** `rich`-only optional data. Omitted sections render no chrome. */
99
- reviews?: ProductOverviewReview[]
100
- sizesLabel?: string
101
- variantLabel?: string
102
- reviewsLabel?: string
103
- addToCartLabel?: string
104
- outOfStockLabel?: string
105
- unavailablePriceLabel?: string
106
- selectVariantLabel?: string
107
- quantityLabel?: string
108
- deliveryEstimateLabel?: string
109
- shippingLabel?: string
110
- removeFromWishlistLabel?: string
111
- addToWishlistLabel?: string
112
- imageFallback?: string
113
- /** `gallery`/`rich` labels. */
114
- badgeLabel?: string
115
- availabilityLabel?: string
116
- skuLabel?: string
117
- overviewLabel?: string
118
- specsLabel?: string
119
- featuresLabel?: string
120
- specificationsLabel?: string
121
- galleryLabel?: string
122
- photosLabel?: string
123
- saveLabel?: string
124
- savedLabel?: string
125
- shareLabel?: string
126
- basedOnReviewsLabel?: string
127
- foundHelpfulLabel?: string
128
- ofCounterLabel?: string
129
- freeDeliveryLabel?: string
130
- }
131
-
132
- export function variantLabelOf(variant: ProductDetailVariant): string {
133
- if (variant.title.trim() !== '') return variant.title
134
- return variant.selectedOptions.map(option => option.value).join(' / ')
135
- }
136
-
137
- /**
138
- * The add-to-cart payload contract: the explicitly selected backend variant id
139
- * and a positive quantity (defaults to 1). Returns `null` when no variant has
140
- * been selected — the block never substitutes the first variant.
141
- */
142
- export function resolveAddToCartPayload(
143
- variant: ProductDetailVariant | null,
144
- quantity: number | undefined,
145
- ): { variantId: string; quantity: number } | null {
146
- if (!variant) return null
147
- return {
148
- variantId: variant.id,
149
- quantity: typeof quantity === 'number' && quantity > 0 ? quantity : 1,
150
- }
151
- }
152
-
153
- export function galleryImages(product: ProductDetailProduct, fallback: string): string[] {
154
- const images = product.images
155
- .map(image => image.url)
156
- .filter((url): url is string => typeof url === 'string' && url.trim() !== '')
157
- if (images.length > 0) return images
158
- const featured = product.featuredImage?.url
159
- if (typeof featured === 'string' && featured.trim() !== '') return [featured]
160
- return [fallback]
161
- }
162
-
163
- interface ResolvedSelection {
164
- selectedVariant: ProductDetailVariant | null
165
- selectedPrice: Money | null | undefined
166
- selectedCompareAt: Money | undefined
167
- priceAvailable: boolean
168
- compareAtAvailable: boolean
169
- canPurchase: boolean
170
- quantityValue: number
171
- addPayload: { variantId: string; quantity: number } | null
172
- }
173
-
174
- export default function ProductOverview({
175
- product,
176
- presentation = 'standard',
177
- selectedVariantId,
178
- onSelectVariant,
179
- quantity,
180
- onQuantityChange,
181
- onAddToCart,
182
- isWishlisted = false,
183
- onToggleWishlist,
184
- onShare,
185
- rating,
186
- deliveryEstimate,
187
- shipping,
188
- formatPrice,
189
- specifications,
190
- features,
191
- reviews,
192
- sizesLabel = 'Variantes',
193
- variantLabel = 'Variante',
194
- reviewsLabel = 'Reseñas',
195
- addToCartLabel = 'Agregar al carrito',
196
- outOfStockLabel = 'Agotado',
197
- unavailablePriceLabel = 'Precio no disponible',
198
- selectVariantLabel = 'Selecciona una variante',
199
- quantityLabel = 'Cantidad',
200
- deliveryEstimateLabel = 'Entrega estimada',
201
- shippingLabel = 'Envío',
202
- removeFromWishlistLabel = 'Quitar de favoritos',
203
- addToWishlistLabel = 'Agregar a favoritos',
204
- imageFallback = PRODUCT_IMAGE_FALLBACK,
205
- badgeLabel,
206
- availabilityLabel = 'Disponible',
207
- skuLabel = 'SKU',
208
- overviewLabel = 'Resumen',
209
- specsLabel = 'Especificaciones',
210
- featuresLabel = 'Características clave',
211
- specificationsLabel = 'Especificaciones técnicas',
212
- galleryLabel = 'Galería',
213
- photosLabel = 'fotos',
214
- saveLabel = 'Guardar',
215
- savedLabel = 'Guardado',
216
- shareLabel = 'Compartir',
217
- basedOnReviewsLabel = 'Basado en {count} reseñas',
218
- foundHelpfulLabel = '{count} personas encontraron esto útil',
219
- ofCounterLabel = '{current} de {total}',
220
- freeDeliveryLabel,
221
- }: ProductOverviewProps) {
222
- const [selectedImage, setSelectedImage] = useState(0)
223
- const [carouselApi, setCarouselApi] = useState<CarouselApi>()
224
-
225
- useEffect(() => {
226
- if (!carouselApi) return
227
- carouselApi.scrollTo(selectedImage)
228
- const handleSelect = () => setSelectedImage(carouselApi.selectedScrollSnap())
229
- carouselApi.on('select', handleSelect)
230
- return () => {
231
- carouselApi.off('select', handleSelect)
232
- }
233
- }, [carouselApi, selectedImage])
234
-
235
- const selectedVariant =
236
- selectedVariantId != null
237
- ? product.variants.find(variant => variant.id === selectedVariantId) ?? null
238
- : null
239
-
240
- const selectedPrice = selectedVariant?.price
241
- const selectedCompareAt = selectedVariant?.compareAtPrice
242
- const priceAvailable = isAvailableMoney(selectedPrice)
243
- const compareAtAvailable = isAvailableMoney(selectedCompareAt)
244
- const canPurchase = Boolean(selectedVariant?.availableForSale) && priceAvailable
245
- const quantityValue = quantity ?? 1
246
- const addPayload = resolveAddToCartPayload(selectedVariant, quantityValue)
247
-
248
- const images = galleryImages(product, imageFallback)
249
- const hasRealImages = images[0] !== imageFallback || product.featuredImage != null
250
- const activeImage = images[Math.min(selectedImage, images.length - 1)]
251
-
252
- const selection: ResolvedSelection = {
253
- selectedVariant,
254
- selectedPrice,
255
- selectedCompareAt,
256
- priceAvailable,
257
- compareAtAvailable,
258
- canPurchase,
259
- quantityValue,
260
- addPayload,
261
- }
262
-
263
- const handleAddToCart = () => {
264
- if (onAddToCart && addPayload) onAddToCart(addPayload.variantId, addPayload.quantity)
265
- }
266
- const handleToggleWishlist = () => {
267
- if (!selectedVariant || !onToggleWishlist) return
268
- onToggleWishlist(selectedVariant.id, !isWishlisted)
269
- }
270
-
271
- if (presentation === 'gallery') {
272
- return (
273
- <GalleryPresentation
274
- product={product}
275
- selection={selection}
276
- images={images}
277
- activeImage={activeImage}
278
- selectedImage={selectedImage}
279
- onSelectImage={setSelectedImage}
280
- setCarouselApi={setCarouselApi}
281
- onSelectVariant={onSelectVariant}
282
- onQuantityChange={onQuantityChange}
283
- onAddToCart={handleAddToCart}
284
- isWishlisted={isWishlisted}
285
- onToggleWishlist={onToggleWishlist ? handleToggleWishlist : undefined}
286
- rating={rating}
287
- formatPrice={formatPrice}
288
- labels={{
289
- reviewsLabel,
290
- addToCartLabel,
291
- outOfStockLabel,
292
- unavailablePriceLabel,
293
- selectVariantLabel,
294
- quantityLabel,
295
- removeFromWishlistLabel,
296
- addToWishlistLabel,
297
- freeDeliveryLabel,
298
- }}
299
- />
300
- )
301
- }
302
-
303
- if (presentation === 'rich') {
304
- return (
305
- <RichPresentation
306
- product={product}
307
- selection={selection}
308
- images={images}
309
- selectedImage={selectedImage}
310
- onSelectImage={setSelectedImage}
311
- onSelectVariant={onSelectVariant}
312
- onQuantityChange={onQuantityChange}
313
- onAddToCart={handleAddToCart}
314
- isWishlisted={isWishlisted}
315
- onToggleWishlist={onToggleWishlist ? handleToggleWishlist : undefined}
316
- onShare={onShare}
317
- rating={rating}
318
- formatPrice={formatPrice}
319
- specifications={specifications}
320
- features={features}
321
- reviews={reviews}
322
- labels={{
323
- reviewsLabel,
324
- addToCartLabel,
325
- outOfStockLabel,
326
- unavailablePriceLabel,
327
- selectVariantLabel,
328
- quantityLabel,
329
- removeFromWishlistLabel,
330
- addToWishlistLabel,
331
- badgeLabel,
332
- availabilityLabel,
333
- skuLabel,
334
- overviewLabel,
335
- specsLabel,
336
- featuresLabel,
337
- specificationsLabel,
338
- galleryLabel,
339
- photosLabel,
340
- saveLabel,
341
- savedLabel,
342
- shareLabel,
343
- basedOnReviewsLabel,
344
- foundHelpfulLabel,
345
- ofCounterLabel,
346
- }}
347
- />
348
- )
349
- }
350
-
351
- return (
352
- <StandardPresentation
353
- product={product}
354
- selection={selection}
355
- images={images}
356
- activeImage={activeImage}
357
- selectedImage={selectedImage}
358
- onSelectImage={setSelectedImage}
359
- onSelectVariant={onSelectVariant}
360
- onQuantityChange={onQuantityChange}
361
- onAddToCart={handleAddToCart}
362
- isWishlisted={isWishlisted}
363
- onToggleWishlist={onToggleWishlist ? handleToggleWishlist : undefined}
364
- rating={rating}
365
- deliveryEstimate={deliveryEstimate}
366
- shipping={shipping}
367
- formatPrice={formatPrice}
368
- hasRealImages={hasRealImages}
369
- labels={{
370
- sizesLabel,
371
- variantLabel,
372
- reviewsLabel,
373
- addToCartLabel,
374
- outOfStockLabel,
375
- unavailablePriceLabel,
376
- selectVariantLabel,
377
- quantityLabel,
378
- deliveryEstimateLabel,
379
- shippingLabel,
380
- removeFromWishlistLabel,
381
- addToWishlistLabel,
382
- }}
383
- />
384
- )
385
- }
386
-
387
- interface SharedLabels {
388
- reviewsLabel: string
389
- addToCartLabel: string
390
- outOfStockLabel: string
391
- unavailablePriceLabel: string
392
- selectVariantLabel: string
393
- quantityLabel: string
394
- removeFromWishlistLabel: string
395
- addToWishlistLabel: string
396
- }
397
-
398
- function VariantSelector({
399
- product,
400
- selectedVariantId,
401
- onSelectVariant,
402
- sizesLabel,
403
- variantLabel,
404
- outOfStockLabel,
405
- }: {
406
- product: ProductDetailProduct
407
- selectedVariantId?: string | null
408
- onSelectVariant?: (variantId: string) => void
409
- sizesLabel: string
410
- variantLabel: string
411
- outOfStockLabel: string
412
- }) {
413
- if (product.variants.length === 0) return null
414
- return (
415
- <div className='flex flex-col gap-2'>
416
- <h3 className='font-bold'>{sizesLabel}</h3>
417
- <div className='flex flex-wrap gap-3'>
418
- {product.variants.map(variant => {
419
- const isSelected = variant.id === selectedVariantId
420
- return (
421
- <Button
422
- key={variant.id}
423
- variant={isSelected ? 'default' : 'outline'}
424
- onClick={onSelectVariant ? () => onSelectVariant(variant.id) : undefined}
425
- disabled={!variant.availableForSale}
426
- aria-pressed={isSelected}
427
- className='h-9 cursor-pointer rounded-full px-4'
428
- >
429
- {variantLabelOf(variant)}
430
- {!variant.availableForSale ? (
431
- <span className='text-muted-foreground ms-2 text-xs font-normal'>{outOfStockLabel}</span>
432
- ) : null}
433
- </Button>
434
- )
435
- })}
436
- </div>
437
- {variantLabel ? (
438
- <span className='sr-only'>{variantLabel}</span>
439
- ) : null}
440
- </div>
441
- )
442
- }
443
-
444
- function QuantityStepper({
445
- quantityValue,
446
- quantityLabel,
447
- onQuantityChange,
448
- }: {
449
- quantityValue: number
450
- quantityLabel: string
451
- onQuantityChange: (quantity: number) => void
452
- }) {
453
- return (
454
- <div className='flex flex-col gap-2'>
455
- <h3 className='font-bold'>{quantityLabel}</h3>
456
- <div className='border-border flex w-fit items-center rounded-md border'>
457
- <Button
458
- type='button'
459
- variant='ghost'
460
- size='icon'
461
- className='size-9 rounded-r-none'
462
- aria-label={`${quantityLabel} -1`}
463
- onClick={() => onQuantityChange(Math.max(1, quantityValue - 1))}
464
- disabled={quantityValue <= 1}
465
- >
466
- <Minus />
467
- </Button>
468
- <span className='w-10 text-center text-sm tabular-nums'>{quantityValue}</span>
469
- <Button
470
- type='button'
471
- variant='ghost'
472
- size='icon'
473
- className='size-9 rounded-l-none'
474
- aria-label={`${quantityLabel} +1`}
475
- onClick={() => onQuantityChange(quantityValue + 1)}
476
- >
477
- <Plus />
478
- </Button>
479
- </div>
480
- </div>
481
- )
482
- }
483
-
484
- function WishlistButton({
485
- isWishlisted,
486
- disabled,
487
- onToggleWishlist,
488
- removeFromWishlistLabel,
489
- addToWishlistLabel,
490
- className,
491
- }: {
492
- isWishlisted: boolean
493
- disabled: boolean
494
- onToggleWishlist?: () => void
495
- removeFromWishlistLabel: string
496
- addToWishlistLabel: string
497
- className?: string
498
- }) {
499
- // Purpose-gated: no wishlist handler means no wishlist affordance. A visible
500
- // button that does nothing is a dead control, so it is not rendered at all.
501
- if (!onToggleWishlist) return null
502
- return (
503
- <Button
504
- variant='outline'
505
- size='icon'
506
- className={cn('cursor-pointer', className)}
507
- disabled={disabled}
508
- onClick={onToggleWishlist}
509
- aria-pressed={isWishlisted}
510
- aria-label={isWishlisted ? removeFromWishlistLabel : addToWishlistLabel}
511
- >
512
- <ReactionToggle
513
- active={isWishlisted}
514
- icon={Heart}
515
- iconClassName='size-5'
516
- activeColorClassName='text-primary'
517
- />
518
- </Button>
519
- )
520
- }
521
-
522
- function StandardPresentation({
523
- product,
524
- selection,
525
- images,
526
- activeImage,
527
- selectedImage,
528
- onSelectImage,
529
- onSelectVariant,
530
- onQuantityChange,
531
- onAddToCart,
532
- isWishlisted,
533
- onToggleWishlist,
534
- rating,
535
- deliveryEstimate,
536
- shipping,
537
- formatPrice,
538
- hasRealImages,
539
- labels,
540
- }: {
541
- product: ProductDetailProduct
542
- selection: ResolvedSelection
543
- images: string[]
544
- activeImage: string
545
- selectedImage: number
546
- onSelectImage: (index: number) => void
547
- onSelectVariant?: (variantId: string) => void
548
- onQuantityChange?: (quantity: number) => void
549
- onAddToCart: () => void
550
- isWishlisted: boolean
551
- onToggleWishlist?: () => void
552
- rating?: ProductOverviewRating
553
- deliveryEstimate?: string
554
- shipping?: Money
555
- formatPrice?: (money: Money) => string
556
- hasRealImages: boolean
557
- labels: SharedLabels & {
558
- sizesLabel: string
559
- variantLabel: string
560
- deliveryEstimateLabel: string
561
- shippingLabel: string
562
- }
563
- }) {
564
- const { selectedVariant, selectedPrice, selectedCompareAt, priceAvailable, compareAtAvailable, canPurchase, quantityValue } =
565
- selection
566
-
567
- return (
568
- <div>
569
- <section className='@container mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>
570
- <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'>
571
- <div className='flex flex-col justify-between gap-6 lg:gap-8'>
572
- <div className='flex flex-col gap-2 lg:gap-4'>
573
- {product.vendor ? (
574
- <span className='text-sm font-semibold tracking-wide uppercase'>{product.vendor}</span>
575
- ) : null}
576
- <h2 className='text-xl font-bold tracking-tight text-balance lg:text-3xl'>{product.title}</h2>
577
- {product.description ? (
578
- <p className='text-muted-foreground text-balance'>{product.description}</p>
579
- ) : null}
580
-
581
- {selectedVariant ? (
582
- priceAvailable ? (
583
- <p className='text-2xl font-bold tracking-tight'>
584
- {formatMoney(selectedPrice, formatPrice)}
585
- {compareAtAvailable ? (
586
- <span className='text-muted-foreground ms-2 text-base font-normal line-through'>
587
- {formatMoney(selectedCompareAt, formatPrice)}
588
- </span>
589
- ) : null}
590
- </p>
591
- ) : (
592
- <p className='text-muted-foreground text-sm'>{labels.unavailablePriceLabel}</p>
593
- )
594
- ) : (
595
- <p className='text-muted-foreground text-sm'>{labels.selectVariantLabel}</p>
596
- )}
597
- </div>
598
-
599
- {hasRealImages ? (
600
- <div className='flex flex-wrap gap-4'>
601
- {images.map((url, index) => (
602
- <button
603
- key={`${product.id}:image:${index}`}
604
- type='button'
605
- onClick={() => onSelectImage(index)}
606
- aria-label={`${product.title} ${index + 1}`}
607
- aria-pressed={selectedImage === index}
608
- className={cn(
609
- 'ring-offset-background size-16 cursor-pointer overflow-hidden rounded-sm ring-offset-2 transition-all lg:size-18',
610
- selectedImage === index && 'ring-foreground ring-2',
611
- )}
612
- >
613
- <img src={url || undefined} alt='' className='size-full object-cover' />
614
- </button>
615
- ))}
616
- </div>
617
- ) : null}
618
- </div>
619
-
620
- <div className='row-span-2 row-start-1 lg:col-start-2'>
621
- <div className='bg-muted aspect-square w-full overflow-hidden rounded-lg'>
622
- <img src={activeImage || undefined} alt={product.title} className='h-90 w-full object-cover' />
623
- </div>
624
- </div>
625
-
626
- <div className='flex flex-col gap-6 lg:gap-10'>
627
- <VariantSelector
628
- product={product}
629
- selectedVariantId={selectedVariant?.id}
630
- onSelectVariant={onSelectVariant}
631
- sizesLabel={labels.sizesLabel}
632
- variantLabel={labels.variantLabel}
633
- outOfStockLabel={labels.outOfStockLabel}
634
- />
635
-
636
- {selectedVariant && selectedVariant.selectedOptions.length > 0 ? (
637
- <p className='text-muted-foreground text-sm'>
638
- {selectedVariant.selectedOptions
639
- .map((option: SelectedOption) => `${option.name}: ${option.value}`)
640
- .join(' · ')}
641
- </p>
642
- ) : null}
643
-
644
- {rating ? (
645
- <div className='flex flex-col gap-2'>
646
- <h3 className='font-bold'>{labels.reviewsLabel}</h3>
647
- <div className='flex items-center gap-2'>
648
- <div className='flex gap-1' aria-hidden='true'>
649
- {[0, 1, 2, 3, 4].map(index => (
650
- <Star
651
- key={index}
652
- className='text-foreground size-5'
653
- fill={index < rating.value ? 'currentColor' : 'none'}
654
- />
655
- ))}
656
- </div>
657
- <span className='text-muted-foreground text-sm tabular-nums'>
658
- {`${rating.value} (${rating.count})`}
659
- </span>
660
- </div>
661
- </div>
662
- ) : null}
663
-
664
- {onQuantityChange ? (
665
- <QuantityStepper
666
- quantityValue={quantityValue}
667
- quantityLabel={labels.quantityLabel}
668
- onQuantityChange={onQuantityChange}
669
- />
670
- ) : null}
671
-
672
- {deliveryEstimate || shipping ? (
673
- <dl className='text-muted-foreground flex flex-col gap-1 text-sm'>
674
- {deliveryEstimate ? (
675
- <div className='flex gap-2'>
676
- <dt>{labels.deliveryEstimateLabel}</dt>
677
- <dd className='text-foreground'>{deliveryEstimate}</dd>
678
- </div>
679
- ) : null}
680
- {isAvailableMoney(shipping) ? (
681
- <div className='flex gap-2'>
682
- <dt>{labels.shippingLabel}</dt>
683
- <dd className='text-foreground'>{formatMoney(shipping, formatPrice)}</dd>
684
- </div>
685
- ) : null}
686
- </dl>
687
- ) : null}
688
-
689
- <div className='flex gap-4'>
690
- <Button
691
- className='h-10 flex-1 cursor-pointer rounded-full px-8'
692
- size='lg'
693
- disabled={!canPurchase}
694
- onClick={onAddToCart}
695
- >
696
- {labels.addToCartLabel}
697
- </Button>
698
- <WishlistButton
699
- isWishlisted={isWishlisted}
700
- disabled={!selectedVariant}
701
- onToggleWishlist={onToggleWishlist}
702
- removeFromWishlistLabel={labels.removeFromWishlistLabel}
703
- addToWishlistLabel={labels.addToWishlistLabel}
704
- className='size-9 rounded-full'
705
- />
706
- </div>
707
- </div>
708
- </div>
709
- </section>
710
- </div>
711
- )
712
- }
713
-
714
- function GalleryPresentation({
715
- product,
716
- selection,
717
- images,
718
- activeImage,
719
- selectedImage,
720
- onSelectImage,
721
- setCarouselApi,
722
- onSelectVariant,
723
- onQuantityChange,
724
- onAddToCart,
725
- isWishlisted,
726
- onToggleWishlist,
727
- rating,
728
- formatPrice,
729
- labels,
730
- }: {
731
- product: ProductDetailProduct
732
- selection: ResolvedSelection
733
- images: string[]
734
- activeImage: string
735
- selectedImage: number
736
- onSelectImage: (index: number) => void
737
- setCarouselApi: (api: CarouselApi | undefined) => void
738
- onSelectVariant?: (variantId: string) => void
739
- onQuantityChange?: (quantity: number) => void
740
- onAddToCart: () => void
741
- isWishlisted: boolean
742
- onToggleWishlist?: () => void
743
- rating?: ProductOverviewRating
744
- formatPrice?: (money: Money) => string
745
- labels: SharedLabels & { freeDeliveryLabel?: string }
746
- }) {
747
- const { selectedVariant, selectedPrice, selectedCompareAt, priceAvailable, compareAtAvailable, canPurchase, quantityValue } =
748
- selection
749
-
750
- return (
751
- <section className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>
752
- <div className='grid grid-cols-1 gap-8 py-4 md:py-6 lg:grid-cols-2 lg:py-12'>
753
- <div className='flex flex-col gap-4'>
754
- <Carousel setApi={setCarouselApi} className='w-full'>
755
- <CarouselContent>
756
- {images.map((url, index) => (
757
- <CarouselItem key={`${product.id}:carousel:${index}`}>
758
- <div className='bg-muted flex h-130 w-full items-center justify-center overflow-hidden rounded-lg'>
759
- <img src={url || undefined} alt={`${product.title} ${index + 1}`} className='h-full w-full object-cover' />
760
- </div>
761
- </CarouselItem>
762
- ))}
763
- </CarouselContent>
764
- </Carousel>
765
-
766
- <div className='flex flex-wrap gap-4'>
767
- {images.map((url, index) => (
768
- <button
769
- type='button'
770
- key={`${product.id}:thumb:${index}`}
771
- onClick={() => onSelectImage(index)}
772
- aria-label={`Mostrar imagen ${index + 1} de ${product.title}`}
773
- aria-pressed={selectedImage === index}
774
- className='aspect-square size-16 cursor-pointer'
775
- >
776
- <img
777
- src={url || undefined}
778
- alt={`${product.title} ${index + 1}`}
779
- className={cn(
780
- 'size-full cursor-pointer rounded-md object-cover ring-offset-2 transition-all',
781
- selectedImage === index ? 'ring-foreground ring-2' : '',
782
- )}
783
- />
784
- </button>
785
- ))}
786
- </div>
787
- </div>
788
-
789
- <div className='flex flex-col gap-6'>
790
- <header className='flex flex-col gap-4'>
791
- <div className='flex items-center'>
792
- <Button variant='ghost' size='icon' className='bg-primary size-6 scale-75 cursor-pointer rounded-full'>
793
- <Check className='text-primary-foreground size-4' />
794
- </Button>
795
- {product.vendor ? <span className='ms-2 font-medium'>{product.vendor}</span> : null}
796
- {selectedVariant?.sku ? (
797
- <span className='text-muted-foreground ms-auto'>{selectedVariant.sku}</span>
798
- ) : null}
799
- </div>
800
- <h1 className='text-xl font-bold text-balance xl:text-3xl'>{product.title}</h1>
801
-
802
- {rating ? (
803
- <div className='flex items-center gap-2'>
804
- <div className='flex'>
805
- {[0, 1, 2, 3, 4].map(i => (
806
- <Star
807
- key={i}
808
- className={cn(
809
- 'size-5',
810
- i < rating.value ? 'fill-foreground text-foreground' : 'text-muted-foreground',
811
- )}
812
- />
813
- ))}
814
- </div>
815
- <span className='text-muted-foreground text-sm'>
816
- {rating.count} {labels.reviewsLabel}
817
- </span>
818
- </div>
819
- ) : null}
820
- </header>
821
-
822
- {selectedVariant ? (
823
- priceAvailable ? (
824
- <p className='text-4xl font-bold'>
825
- {formatMoney(selectedPrice, formatPrice)}
826
- {compareAtAvailable ? (
827
- <span className='text-muted-foreground ms-2 text-xl font-normal line-through'>
828
- {formatMoney(selectedCompareAt, formatPrice)}
829
- </span>
830
- ) : null}
831
- </p>
832
- ) : (
833
- <p className='text-muted-foreground text-sm'>{labels.unavailablePriceLabel}</p>
834
- )
835
- ) : (
836
- <p className='text-muted-foreground text-sm'>{labels.selectVariantLabel}</p>
837
- )}
838
-
839
- <VariantSelector
840
- product={product}
841
- selectedVariantId={selectedVariant?.id}
842
- onSelectVariant={onSelectVariant}
843
- sizesLabel={labels.selectVariantLabel}
844
- variantLabel=''
845
- outOfStockLabel={labels.outOfStockLabel}
846
- />
847
-
848
- {onQuantityChange ? (
849
- <QuantityStepper
850
- quantityValue={quantityValue}
851
- quantityLabel={labels.quantityLabel}
852
- onQuantityChange={onQuantityChange}
853
- />
854
- ) : null}
855
-
856
- <div className='flex gap-4'>
857
- <Button className='h-12 flex-1 cursor-pointer rounded-md' size='lg' disabled={!canPurchase} onClick={onAddToCart}>
858
- <ShoppingCart />
859
- {labels.addToCartLabel}
860
- </Button>
861
- <WishlistButton
862
- isWishlisted={isWishlisted}
863
- disabled={!selectedVariant}
864
- onToggleWishlist={onToggleWishlist}
865
- removeFromWishlistLabel={labels.removeFromWishlistLabel}
866
- addToWishlistLabel={labels.addToWishlistLabel}
867
- className='border-input size-12 rounded-md'
868
- />
869
- </div>
870
-
871
- {labels.freeDeliveryLabel ? (
872
- <div className='text-muted-foreground flex items-center justify-center gap-2 text-sm'>
873
- <Truck className='size-4' />
874
- <span>{labels.freeDeliveryLabel}</span>
875
- </div>
876
- ) : null}
877
- </div>
878
- </div>
879
- </section>
880
- )
881
- }
882
-
883
- function RichPresentation({
884
- product,
885
- selection,
886
- images,
887
- selectedImage,
888
- onSelectImage,
889
- onSelectVariant,
890
- onQuantityChange,
891
- onAddToCart,
892
- isWishlisted,
893
- onToggleWishlist,
894
- onShare,
895
- rating,
896
- formatPrice,
897
- specifications,
898
- features,
899
- reviews,
900
- labels,
901
- }: {
902
- product: ProductDetailProduct
903
- selection: ResolvedSelection
904
- images: string[]
905
- selectedImage: number
906
- onSelectImage: (index: number) => void
907
- onSelectVariant?: (variantId: string) => void
908
- onQuantityChange?: (quantity: number) => void
909
- onAddToCart: () => void
910
- isWishlisted: boolean
911
- onToggleWishlist?: () => void
912
- onShare?: () => void
913
- rating?: ProductOverviewRating
914
- formatPrice?: (money: Money) => string
915
- specifications?: Record<string, string>
916
- features?: string[]
917
- reviews?: ProductOverviewReview[]
918
- labels: SharedLabels & {
919
- badgeLabel?: string
920
- availabilityLabel: string
921
- skuLabel: string
922
- overviewLabel: string
923
- specsLabel: string
924
- featuresLabel: string
925
- specificationsLabel: string
926
- galleryLabel: string
927
- photosLabel: string
928
- saveLabel: string
929
- savedLabel: string
930
- shareLabel: string
931
- basedOnReviewsLabel: string
932
- foundHelpfulLabel: string
933
- ofCounterLabel: string
934
- }
935
- }) {
936
- const { selectedVariant, selectedPrice, selectedCompareAt, priceAvailable, compareAtAvailable, canPurchase, quantityValue } =
937
- selection
938
-
939
- const featureList = features && features.length > 0 ? features : undefined
940
- const specEntries = specifications ? Object.entries(specifications) : []
941
- const hasSpecs = specEntries.length > 0
942
- const hasReviews = Boolean(reviews && reviews.length > 0)
943
- const hasGallery = images.length > 1
944
- const hasTabs = Boolean(featureList) || hasSpecs || hasReviews || hasGallery
945
- const reviewCount = reviews?.length ?? 0
946
-
947
- // The initial tab is computed once and frozen: Base UI's uncontrolled Tabs warns if
948
- // `defaultValue` changes after mount, and this expression tracks the data-derived tab set
949
- // (which changes when optional props like `specifications` appear or disappear).
950
- const [defaultTab] = useState(() =>
951
- featureList ? 'overview' : hasSpecs ? 'specs' : hasReviews ? 'reviews' : 'gallery',
952
- )
953
-
954
- return (
955
- <section className='py-12'>
956
- <div className='mx-auto w-full max-w-7xl px-4 sm:px-6 lg:px-8'>
957
- <div className='grid gap-12 lg:grid-cols-2'>
958
- <ProductOverviewGallery
959
- images={images}
960
- title={product.title}
961
- badgeLabel={labels.badgeLabel}
962
- selectedImage={selectedImage}
963
- onSelectImage={onSelectImage}
964
- photosLabel={labels.photosLabel}
965
- />
966
-
967
- <div className='flex flex-col gap-8'>
968
- <div>
969
- <h1 className='text-3xl leading-tight font-bold text-balance'>{product.title}</h1>
970
- <div className='mt-4 flex flex-wrap items-center gap-4'>
971
- {rating ? (
972
- <div className='flex items-center gap-2'>
973
- <div className='flex'>
974
- {[0, 1, 2, 3, 4].map(i => (
975
- <Star
976
- key={i}
977
- className={cn(
978
- 'size-4',
979
- i < rating.value ? 'fill-foreground text-foreground' : 'text-muted-foreground',
980
- )}
981
- />
982
- ))}
983
- </div>
984
- <span className='text-sm font-medium'>{rating.value}</span>
985
- </div>
986
- ) : null}
987
- {hasReviews ? (
988
- <span className='text-muted-foreground text-sm'>
989
- {reviewCount} {labels.reviewsLabel.toLowerCase()}
990
- </span>
991
- ) : null}
992
- {selectedVariant?.sku ? (
993
- <>
994
- <Separator orientation='vertical' className='h-4' />
995
- <span className='text-muted-foreground text-sm'>
996
- {labels.skuLabel}: {selectedVariant.sku}
997
- </span>
998
- </>
999
- ) : null}
1000
- </div>
1001
- </div>
1002
-
1003
- {selectedVariant ? (
1004
- priceAvailable ? (
1005
- <div className='flex items-baseline gap-3'>
1006
- <span className='text-4xl font-bold'>{formatMoney(selectedPrice, formatPrice)}</span>
1007
- {compareAtAvailable ? (
1008
- <span className='text-muted-foreground text-xl line-through'>
1009
- {formatMoney(selectedCompareAt, formatPrice)}
1010
- </span>
1011
- ) : null}
1012
- </div>
1013
- ) : (
1014
- <p className='text-muted-foreground text-sm'>{labels.unavailablePriceLabel}</p>
1015
- )
1016
- ) : (
1017
- <p className='text-muted-foreground text-sm'>{labels.selectVariantLabel}</p>
1018
- )}
1019
-
1020
- {selectedVariant?.availableForSale ? (
1021
- <div className='bg-success/10 inline-flex w-fit items-center gap-2 rounded-full px-3 py-1.5'>
1022
- <div className='bg-success size-2 rounded-full' />
1023
- <span className='text-success text-sm font-medium'>{labels.availabilityLabel}</span>
1024
- </div>
1025
- ) : null}
1026
-
1027
- {product.description ? <p className='text-muted-foreground leading-relaxed'>{product.description}</p> : null}
1028
-
1029
- <VariantSelector
1030
- product={product}
1031
- selectedVariantId={selectedVariant?.id}
1032
- onSelectVariant={onSelectVariant}
1033
- sizesLabel={labels.selectVariantLabel}
1034
- variantLabel=''
1035
- outOfStockLabel={labels.outOfStockLabel}
1036
- />
1037
-
1038
- {onQuantityChange ? (
1039
- <QuantityStepper
1040
- quantityValue={quantityValue}
1041
- quantityLabel={labels.quantityLabel}
1042
- onQuantityChange={onQuantityChange}
1043
- />
1044
- ) : null}
1045
-
1046
- <div className='flex flex-col gap-4'>
1047
- <Button size='lg' className='h-12 w-full cursor-pointer gap-2' disabled={!canPurchase} onClick={onAddToCart}>
1048
- <ShoppingCart />
1049
- {labels.addToCartLabel}
1050
- </Button>
1051
- <div className='flex gap-3'>
1052
- <WishlistButton
1053
- isWishlisted={isWishlisted}
1054
- disabled={!selectedVariant}
1055
- onToggleWishlist={onToggleWishlist}
1056
- removeFromWishlistLabel={labels.removeFromWishlistLabel}
1057
- addToWishlistLabel={labels.addToWishlistLabel}
1058
- className='h-12 flex-1 gap-2 rounded-md'
1059
- />
1060
- {onShare ? (
1061
- <Button
1062
- variant='outline'
1063
- size='lg'
1064
- className='h-12 flex-1 cursor-pointer gap-2'
1065
- onClick={onShare}
1066
- >
1067
- <Share2 />
1068
- {labels.shareLabel}
1069
- </Button>
1070
- ) : null}
1071
- </div>
1072
- </div>
1073
- </div>
1074
- </div>
1075
-
1076
- {hasTabs ? (
1077
- <div className='mt-16'>
1078
- <ProductOverviewTabs defaultValue={defaultTab} className='w-full'>
1079
- <ProductOverviewTabsList className='bg-muted/50 relative grid !h-12 w-full grid-cols-4 rounded-xl p-1'>
1080
- <ProductOverviewTabsIndicator />
1081
- {featureList ? (
1082
- <ProductOverviewTabsTrigger
1083
- value='overview'
1084
- className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'
1085
- >
1086
- <Info className='size-4 shrink-0' />
1087
- <span className='hidden sm:inline'>{labels.overviewLabel}</span>
1088
- </ProductOverviewTabsTrigger>
1089
- ) : null}
1090
- {hasSpecs ? (
1091
- <ProductOverviewTabsTrigger
1092
- value='specs'
1093
- className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'
1094
- >
1095
- <Package className='size-4 shrink-0' />
1096
- <span className='hidden sm:inline'>{labels.specsLabel}</span>
1097
- </ProductOverviewTabsTrigger>
1098
- ) : null}
1099
- {hasReviews ? (
1100
- <ProductOverviewTabsTrigger
1101
- value='reviews'
1102
- className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'
1103
- >
1104
- <MessageSquare className='size-4 shrink-0' />
1105
- <span className='hidden sm:inline'>
1106
- {labels.reviewsLabel} ({reviewCount})
1107
- </span>
1108
- </ProductOverviewTabsTrigger>
1109
- ) : null}
1110
- {hasGallery ? (
1111
- <ProductOverviewTabsTrigger
1112
- value='gallery'
1113
- className='z-10 h-10 gap-2 text-sm font-medium data-active:bg-transparent data-active:shadow-none dark:data-active:bg-transparent'
1114
- >
1115
- <Camera className='size-4 shrink-0' />
1116
- <span className='hidden sm:inline'>{labels.galleryLabel}</span>
1117
- </ProductOverviewTabsTrigger>
1118
- ) : null}
1119
- </ProductOverviewTabsList>
1120
- {featureList ? (
1121
- <ProductOverviewTabsContentFade value='overview' className='mt-8'>
1122
- <Card className='border shadow-none'>
1123
- <CardContent className='p-8 py-0'>
1124
- <h3 className='mb-6 text-xl font-semibold text-balance'>{labels.featuresLabel}</h3>
1125
- <div className='grid gap-4 sm:grid-cols-2'>
1126
- {featureList.map(feature => (
1127
- <div key={feature} className='group flex items-center gap-3'>
1128
- <div className='bg-primary/20 size-2 rounded-full transition-colors' />
1129
- <span className='text-sm'>{feature}</span>
1130
- </div>
1131
- ))}
1132
- </div>
1133
- </CardContent>
1134
- </Card>
1135
- </ProductOverviewTabsContentFade>
1136
- ) : null}
1137
- {hasSpecs ? (
1138
- <ProductOverviewTabsContentFade value='specs' className='mt-8'>
1139
- <Card className='border shadow-none'>
1140
- <CardContent className='p-8 py-0'>
1141
- <h3 className='mb-6 text-xl font-semibold text-balance'>{labels.specificationsLabel}</h3>
1142
- <div className='flex flex-col gap-4'>
1143
- {specEntries.map(([key, value]) => (
1144
- <div
1145
- key={key}
1146
- className='border-muted grid grid-cols-1 gap-2 border-b py-3 last:border-b-0 md:grid-cols-3 md:gap-4'
1147
- >
1148
- <span className='text-muted-foreground text-sm font-medium'>{key}</span>
1149
- <span className='col-span-1 text-sm md:col-span-2'>{value}</span>
1150
- </div>
1151
- ))}
1152
- </div>
1153
- </CardContent>
1154
- </Card>
1155
- </ProductOverviewTabsContentFade>
1156
- ) : null}
1157
- {hasReviews && reviews ? (
1158
- <ProductOverviewTabsContentFade value='reviews' className='mt-8'>
1159
- <ProductOverviewReviewsTab
1160
- rating={rating?.value ?? 0}
1161
- reviews={reviews}
1162
- basedOnReviewsLabel={labels.basedOnReviewsLabel}
1163
- foundHelpfulLabel={labels.foundHelpfulLabel}
1164
- />
1165
- </ProductOverviewTabsContentFade>
1166
- ) : null}
1167
- {hasGallery ? (
1168
- <ProductOverviewTabsContentFade value='gallery' className='mt-8'>
1169
- <ProductOverviewLightboxTab
1170
- images={images}
1171
- title={product.title}
1172
- galleryLabel={labels.galleryLabel}
1173
- ofCounterLabel={labels.ofCounterLabel}
1174
- />
1175
- </ProductOverviewTabsContentFade>
1176
- ) : null}
1177
- </ProductOverviewTabs>
1178
- </div>
1179
- ) : null}
1180
- </div>
1181
- </section>
1182
- )
1183
- }
1184
-
1185
- export type { ProductOverviewReview }
1186
- export { ProductOverviewGallery, ProductOverviewLightboxTab, ProductOverviewReviewsTab }