@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,934 +0,0 @@
1
- 'use client'
2
-
3
- import { useEffect, useId, useState, type ReactNode } from 'react'
4
- import { Search, SlidersHorizontal, X } from 'lucide-react'
5
-
6
- import { Badge } from '../../../ui/badge'
7
- import { Button } from '../../../ui/button'
8
- import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '../../../ui/drawer'
9
- import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyTitle } from '../../../ui/empty'
10
- import { Input } from '../../../ui/input'
11
- import { Label } from '../../../ui/label'
12
- import {
13
- Pagination,
14
- PaginationContent,
15
- PaginationEllipsis,
16
- PaginationItem,
17
- } from '../../../ui/pagination'
18
- import { RadioGroup, RadioGroupItem } from '../../../ui/radio-group'
19
- import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../ui/select'
20
- import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from '../../../ui/sheet'
21
- import { Skeleton } from '../../../ui/skeleton'
22
- import { cn } from '../../../lib/utils'
23
- import type { ProductPresentation } from '../../../lib/contracts'
24
-
25
- import { ProductCard } from '../product-list/product-card'
26
-
27
- import { CategoryListingFilterFields } from './category-listing-filter-fields'
28
-
29
- /** The bounded presentation surface. The data contract and callbacks are identical. */
30
- export type CategoryListingPresentation = 'sidebar' | 'toolbar'
31
-
32
- export interface CategoryListingOption {
33
- id: string
34
- label: string
35
- }
36
-
37
- export interface CategoryListingPriceRange {
38
- min: number
39
- max: number
40
- step: number
41
- }
42
-
43
- export interface CategoryListingSortOption {
44
- value: string
45
- label: string
46
- }
47
-
48
- /**
49
- * A provider-backed facet value. `count` is rendered only when it is a real
50
- * non-negative number — a true zero is preserved, never recomputed or summed.
51
- */
52
- export interface CategoryListingFacetOption {
53
- value: string
54
- label: string
55
- count?: number
56
- }
57
-
58
- /**
59
- * A generic facet group. The block never derives sector-specific fields
60
- * (frame size, colourway, range…) and never invents groups or options.
61
- */
62
- export interface CategoryListingFacetGroup {
63
- id: string
64
- label: string
65
- options: CategoryListingFacetOption[]
66
- }
67
-
68
- /** The absolute canonical filter set emitted upward. */
69
- export interface CategoryListingFilters {
70
- categories: string[]
71
- collections: string[]
72
- priceRange?: [number, number]
73
- facets?: Record<string, string[]>
74
- }
75
-
76
- /**
77
- * A typed catalog-query error the listing renders for repair. It mirrors the
78
- * runtime boundary error: `fields` names the exact raw parameters to remove and
79
- * `feature` is present only for `unmounted-capability`. The block never builds a
80
- * host URL — it emits the fields through `onRepair`.
81
- */
82
- export interface CategoryListingQueryError {
83
- code: 'invalid-query' | 'unsupported-query' | 'unmounted-capability'
84
- /** Exact raw URL parameter names that must be removed to repair the query. */
85
- fields: string[]
86
- message?: string
87
- feature?: 'catalog-search' | 'category-filters'
88
- }
89
-
90
- /**
91
- * The observable listing status. The host derives it from the URL boundary and
92
- * the provider outcome; the block only renders it. Distinct states stay
93
- * distinct — a valid empty result is never shown as an error and a raw failure
94
- * is never swallowed as empty.
95
- */
96
- export type CategoryListingStatus =
97
- | { state: 'loading' }
98
- | { state: 'ready' }
99
- | { state: 'empty' }
100
- | { state: 'invalid-query'; error: CategoryListingQueryError }
101
- | { state: 'unsupported-query'; error: CategoryListingQueryError }
102
- | { state: 'unmounted-capability'; error: CategoryListingQueryError }
103
- | { state: 'error'; message?: string }
104
-
105
- /** The kind of canonical filter an active chip represents. */
106
- export type CategoryListingActiveFilterKind =
107
- | 'text'
108
- | 'category'
109
- | 'collection'
110
- | 'price'
111
- | 'attribute'
112
-
113
- /**
114
- * A removable active-filter chip. Built only from the actual canonical query:
115
- * `params` are the raw URL parameter names carrying the filter and `value` is
116
- * the specific list value to drop.
117
- */
118
- export interface CategoryListingActiveFilter {
119
- /** Stable identity for React keys and removal callbacks. */
120
- id: string
121
- kind: CategoryListingActiveFilterKind
122
- /** Human-readable label shown on the chip. */
123
- label: string
124
- /** Raw URL parameter names that carry this filter. */
125
- params: string[]
126
- /** The specific list value this chip removes; absent for scalar filters. */
127
- value?: string
128
- }
129
-
130
- export interface CategoryListingProps {
131
- /** Bounded presentation option; defaults to `sidebar`. */
132
- presentation?: CategoryListingPresentation
133
-
134
- /** Exactly the provider-paged products for the current page. Never re-paginated. */
135
- products: ProductPresentation[]
136
- pagination: (number | string)[]
137
-
138
- // ── Controlled canonical-query values ─────────────────────────────────────
139
- // The listing owns no private query state: these values are authoritative and
140
- // every interaction reports the absolute next value through a callback.
141
- searchValue: string
142
- selectedCategories: string[]
143
- selectedCollections: string[]
144
- selectedSort: string
145
- selectedPage: number
146
- selectedPageSize: number
147
- selectedPriceRange?: [number, number]
148
- selectedFacets?: Record<string, string[]>
149
-
150
- // ── Provider-declared option sets ─────────────────────────────────────────
151
- categories?: CategoryListingOption[]
152
- collections?: CategoryListingOption[]
153
- sortOptions?: CategoryListingSortOption[]
154
- /**
155
- * Real backend-provided price range only. When absent the price control is
156
- * omitted; the block never falls back to a fabricated `0..1000` default.
157
- */
158
- priceRange?: CategoryListingPriceRange
159
- /** Generic provider-backed facet groups; a group renders only when non-empty. */
160
- facets?: CategoryListingFacetGroup[]
161
- viewOptions?: number[]
162
-
163
- // ── Per-control visibility (selected from installed features) ─────────────
164
- showSearch: boolean
165
- showFilters: boolean
166
- showSort: boolean
167
- /** Price remains gated on a real `priceRange` even when this is true. */
168
- showPrice?: boolean
169
-
170
- // ── Observable listing states + active-filter chips ───────────────────────
171
- status: CategoryListingStatus
172
- activeFilters: CategoryListingActiveFilter[]
173
-
174
- // ── Copy ──────────────────────────────────────────────────────────────────
175
- filtersTitle?: string
176
- applyFiltersLabel?: string
177
- selectedText?: string
178
- clearAllLabel?: string
179
- priceRangeTitle?: string
180
- minLabel?: string
181
- maxLabel?: string
182
- categoriesTitle?: string
183
- collectionsTitle?: string
184
- sortTitle?: string
185
- viewLabel?: string
186
- viewPlaceholder?: string
187
- sortPlaceholder?: string
188
- productsTitle?: string
189
- currentLabel?: string
190
- searchLabel?: string
191
- searchPlaceholder?: string
192
- loadingLabel?: string
193
- emptyTitle?: string
194
- emptyDescription?: string
195
- clearFiltersLabel?: string
196
- invalidQueryTitle?: string
197
- unsupportedQueryTitle?: string
198
- unmountedCapabilityTitle?: string
199
- errorTitle?: string
200
- errorDescription?: string
201
- repairLabel?: string
202
- retryLabel?: string
203
- activeFiltersTitle?: string
204
- removeFilterLabel?: string
205
-
206
- // ── Emit-only callbacks: the block never fetches or rewrites the URL ─────
207
- onProductClick?: (product: ProductPresentation) => void
208
- onPageChange?: (page: number) => void
209
- onPageSizeChange?: (pageSize: number) => void
210
- onSortChange?: (sort: string) => void
211
- onFilterChange?: (next: CategoryListingFilters) => void
212
- onSearchChange?: (value: string) => void
213
- /** Empty-state clear: drops the active filters but never base scope/sort/pageSize. */
214
- onClearFilters?: () => void
215
- /** Invalid/unsupported/unmounted repair: receives the exact bad fields to remove. */
216
- onRepair?: (remove: string[]) => void
217
- /** Query/network failure retry: preserves the current query/input. */
218
- onRetry?: () => void
219
- /** Removes a single active-filter chip. */
220
- onRemoveFilter?: (filter: CategoryListingActiveFilter) => void
221
- }
222
-
223
- const DEFAULT_VIEW_OPTIONS = [10, 25, 50, 100]
224
-
225
- /**
226
- * Pure selection reducer shared by checkbox handlers. Exported so the emitted
227
- * contract is unit-testable without a DOM (this package's tests render with
228
- * `react-dom/server`).
229
- */
230
- export function toggleFilterValue(
231
- current: readonly string[],
232
- value: string,
233
- checked: boolean,
234
- ): string[] {
235
- return checked ? [...current, value] : current.filter(candidate => candidate !== value)
236
- }
237
-
238
- /** Assemble the typed absolute filter change emitted upward. */
239
- export function buildFilterChange(input: {
240
- categories: string[]
241
- collections: string[]
242
- priceRange?: [number, number]
243
- facets?: Record<string, string[]>
244
- }): CategoryListingFilters {
245
- const change: CategoryListingFilters = {
246
- categories: input.categories,
247
- collections: input.collections,
248
- }
249
- if (input.priceRange) change.priceRange = input.priceRange
250
- if (input.facets) change.facets = input.facets
251
- return change
252
- }
253
-
254
- /**
255
- * Reconcile the controlled search draft with the URL-backed `searchValue`.
256
- *
257
- * The URL is authoritative, but it only updates after an async server
258
- * navigation. Binding the input directly to that lagging prop makes React reset
259
- * it to the previous server value on every re-render, so fast typing loses every
260
- * character but the last. This pure function keeps a local draft authoritative
261
- * while the shopper is typing and adopts an external `searchValue`
262
- * (navigation / reload / back-forward) only when no uncommitted edit is pending.
263
- */
264
- export function reconcileSearchDraft(input: {
265
- searchValue?: string
266
- prevSearchValue?: string
267
- draft: string
268
- }): { draft: string; prevSearchValue?: string } | null {
269
- const { searchValue, prevSearchValue, draft } = input
270
- if (searchValue === undefined || searchValue === prevSearchValue) return null
271
- const clean = prevSearchValue === undefined || draft === prevSearchValue
272
- return { draft: clean ? searchValue : draft, prevSearchValue: searchValue }
273
- }
274
-
275
- export interface CategoryListingStatusViewProps {
276
- status: CategoryListingStatus
277
- activeFilters?: CategoryListingActiveFilter[]
278
- activeFiltersTitle?: string
279
- removeFilterLabel?: string
280
- loadingLabel?: string
281
- emptyTitle?: string
282
- emptyDescription?: string
283
- clearFiltersLabel?: string
284
- invalidQueryTitle?: string
285
- unsupportedQueryTitle?: string
286
- unmountedCapabilityTitle?: string
287
- errorTitle?: string
288
- errorDescription?: string
289
- repairLabel?: string
290
- retryLabel?: string
291
- onClearFilters?: () => void
292
- onRepair?: (remove: string[]) => void
293
- onRetry?: () => void
294
- onRemoveFilter?: (filter: CategoryListingActiveFilter) => void
295
- }
296
-
297
- /** Human-readable description naming the exact offending parameters. */
298
- function describeQueryError(
299
- error: CategoryListingQueryError,
300
- state: 'invalid-query' | 'unsupported-query' | 'unmounted-capability',
301
- ): string {
302
- const fields = error.fields.join(', ')
303
- if (state === 'unmounted-capability' && error.feature) {
304
- return `${fields} pertenece a la función «${error.feature}», que no está instalada.`
305
- }
306
- return error.message ?? `Parámetros: ${fields}`
307
- }
308
-
309
- /**
310
- * Hooks-free presentation of the observable listing states and the removable
311
- * active-filter chips. Kept separate from `CategoryListing` so the interaction
312
- * contract (clear / repair / retry / chip removal) is testable by invoking the
313
- * rendered handlers without a DOM. It renders no products and performs no fetch.
314
- */
315
- export function CategoryListingStatusView({
316
- status,
317
- activeFilters = [],
318
- activeFiltersTitle = 'Filtros activos',
319
- removeFilterLabel = 'Quitar filtro',
320
- loadingLabel = 'Cargando productos',
321
- emptyTitle = 'Sin resultados',
322
- emptyDescription = 'Ningún producto coincide con los filtros activos.',
323
- clearFiltersLabel = 'Limpiar filtros',
324
- invalidQueryTitle = 'Consulta no válida',
325
- unsupportedQueryTitle = 'Filtro no disponible',
326
- unmountedCapabilityTitle = 'Función no disponible',
327
- errorTitle = 'No se pudieron cargar los productos',
328
- errorDescription = 'Inténtalo de nuevo.',
329
- repairLabel = 'Corregir búsqueda',
330
- retryLabel = 'Reintentar',
331
- onClearFilters,
332
- onRepair,
333
- onRetry,
334
- onRemoveFilter,
335
- }: CategoryListingStatusViewProps) {
336
- const chips =
337
- activeFilters.length > 0 ? (
338
- <div role='group' aria-label={activeFiltersTitle} className='flex flex-wrap items-center gap-2'>
339
- {activeFilters.map(filter => (
340
- <Badge key={filter.id} variant='secondary' className='gap-1 pr-1'>
341
- <span>{filter.label}</span>
342
- <Button
343
- type='button'
344
- variant='ghost'
345
- size='icon-xs'
346
- className='size-4 cursor-pointer rounded-full'
347
- aria-label={`${removeFilterLabel}: ${filter.label}`}
348
- data-action='remove-filter'
349
- data-filter-id={filter.id}
350
- onClick={() => onRemoveFilter?.(filter)}
351
- >
352
- <X aria-hidden='true' />
353
- </Button>
354
- </Badge>
355
- ))}
356
- </div>
357
- ) : null
358
-
359
- if (status.state === 'ready') return chips
360
-
361
- let body: ReactNode
362
- switch (status.state) {
363
- case 'loading':
364
- body = (
365
- <div role='status' aria-live='polite' aria-busy='true' className='flex flex-col gap-4'>
366
- <span className='sr-only'>{loadingLabel}</span>
367
- <div className='grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-6 lg:grid-cols-3'>
368
- {Array.from({ length: 6 }, (_, index) => (
369
- <div key={index} className='flex flex-col gap-2'>
370
- <Skeleton className='aspect-3/4 w-full rounded-lg' />
371
- <Skeleton className='h-4 w-3/4' />
372
- <Skeleton className='h-4 w-1/3' />
373
- </div>
374
- ))}
375
- </div>
376
- </div>
377
- )
378
- break
379
- case 'empty':
380
- body = (
381
- <Empty role='status'>
382
- <EmptyHeader>
383
- <EmptyTitle>{emptyTitle}</EmptyTitle>
384
- <EmptyDescription>{emptyDescription}</EmptyDescription>
385
- </EmptyHeader>
386
- {onClearFilters ? (
387
- <EmptyContent>
388
- <Button type='button' variant='outline' data-action='clear-filters' onClick={() => onClearFilters()}>
389
- {clearFiltersLabel}
390
- </Button>
391
- </EmptyContent>
392
- ) : null}
393
- </Empty>
394
- )
395
- break
396
- case 'invalid-query':
397
- case 'unsupported-query':
398
- case 'unmounted-capability':
399
- body = (
400
- <Empty role='alert'>
401
- <EmptyHeader>
402
- <EmptyTitle>
403
- {status.state === 'invalid-query'
404
- ? invalidQueryTitle
405
- : status.state === 'unsupported-query'
406
- ? unsupportedQueryTitle
407
- : unmountedCapabilityTitle}
408
- </EmptyTitle>
409
- <EmptyDescription>{describeQueryError(status.error, status.state)}</EmptyDescription>
410
- </EmptyHeader>
411
- {onRepair ? (
412
- <EmptyContent>
413
- <Button
414
- type='button'
415
- variant='outline'
416
- data-action='repair'
417
- onClick={() => onRepair(status.error.fields)}
418
- >
419
- {repairLabel}
420
- </Button>
421
- </EmptyContent>
422
- ) : null}
423
- </Empty>
424
- )
425
- break
426
- case 'error':
427
- body = (
428
- <Empty role='alert'>
429
- <EmptyHeader>
430
- <EmptyTitle>{errorTitle}</EmptyTitle>
431
- <EmptyDescription>{status.message ?? errorDescription}</EmptyDescription>
432
- </EmptyHeader>
433
- {onRetry ? (
434
- <EmptyContent>
435
- <Button type='button' variant='default' data-action='retry' onClick={() => onRetry()}>
436
- {retryLabel}
437
- </Button>
438
- </EmptyContent>
439
- ) : null}
440
- </Empty>
441
- )
442
- break
443
- }
444
-
445
- return (
446
- <div className='flex flex-col gap-4'>
447
- {chips}
448
- {body}
449
- </div>
450
- )
451
- }
452
-
453
- export function CategoryListing({
454
- presentation = 'sidebar',
455
- products,
456
- pagination,
457
- searchValue,
458
- selectedCategories,
459
- selectedCollections,
460
- selectedSort,
461
- selectedPage,
462
- selectedPageSize,
463
- selectedPriceRange,
464
- selectedFacets = {},
465
- categories = [],
466
- collections = [],
467
- sortOptions = [],
468
- priceRange: priceRangeConfig,
469
- facets = [],
470
- viewOptions = DEFAULT_VIEW_OPTIONS,
471
- showSearch,
472
- showFilters,
473
- showSort,
474
- showPrice = true,
475
- status,
476
- activeFilters,
477
- filtersTitle = 'Filtros',
478
- applyFiltersLabel = 'Aplicar filtros',
479
- selectedText = 'Filtros',
480
- clearAllLabel = 'Restablecer',
481
- priceRangeTitle = 'Rango de precio',
482
- minLabel = 'Mínimo',
483
- maxLabel = 'Máximo',
484
- categoriesTitle = 'Categoría',
485
- collectionsTitle = 'Colección',
486
- sortTitle = 'Ordenar por',
487
- viewLabel = 'Ver',
488
- viewPlaceholder = 'Seleccionar',
489
- sortPlaceholder = 'Ordenar por',
490
- productsTitle = 'Productos',
491
- currentLabel = '(actual)',
492
- searchLabel = 'Buscar',
493
- searchPlaceholder = 'Buscar',
494
- loadingLabel,
495
- emptyTitle,
496
- emptyDescription,
497
- clearFiltersLabel,
498
- invalidQueryTitle,
499
- unsupportedQueryTitle,
500
- unmountedCapabilityTitle,
501
- errorTitle,
502
- errorDescription,
503
- repairLabel,
504
- retryLabel,
505
- activeFiltersTitle,
506
- removeFilterLabel,
507
- onProductClick,
508
- onPageChange,
509
- onPageSizeChange,
510
- onSortChange,
511
- onFilterChange,
512
- onSearchChange,
513
- onClearFilters,
514
- onRepair,
515
- onRetry,
516
- onRemoveFilter,
517
- }: CategoryListingProps) {
518
- const searchInputId = useId()
519
- const [draftSearch, setDraftSearch] = useState(searchValue)
520
- const [prevSearchValue, setPrevSearchValue] = useState<string | undefined>(searchValue)
521
- const [isSheetOpen, setIsSheetOpen] = useState(false)
522
- const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false)
523
- const [isSortDrawerOpen, setIsSortDrawerOpen] = useState(false)
524
-
525
- const reconciledSearch = reconcileSearchDraft({ searchValue, prevSearchValue, draft: draftSearch })
526
- if (reconciledSearch) {
527
- setPrevSearchValue(reconciledSearch.prevSearchValue)
528
- if (reconciledSearch.draft !== draftSearch) setDraftSearch(reconciledSearch.draft)
529
- }
530
-
531
- // The desktop surface owns the filters; close every mobile overlay when the
532
- // viewport crosses into the desktop layout.
533
- useEffect(() => {
534
- const mediaQuery = window.matchMedia('(min-width: 1024px)')
535
- const handleChange = (event: MediaQueryListEvent) => {
536
- if (event.matches) {
537
- setIsSheetOpen(false)
538
- setIsFilterDrawerOpen(false)
539
- setIsSortDrawerOpen(false)
540
- }
541
- }
542
- mediaQuery.addEventListener('change', handleChange)
543
- return () => mediaQuery.removeEventListener('change', handleChange)
544
- }, [])
545
-
546
- const priceRangeValue: [number, number] = priceRangeConfig
547
- ? (selectedPriceRange ?? [priceRangeConfig.min, priceRangeConfig.max])
548
- : [0, 0]
549
-
550
- const emitFilters = (overrides: Partial<CategoryListingFilters> = {}) => {
551
- onFilterChange?.(
552
- buildFilterChange({
553
- categories: selectedCategories,
554
- collections: selectedCollections,
555
- ...(priceRangeConfig ? { priceRange: priceRangeValue } : {}),
556
- facets: selectedFacets,
557
- ...overrides,
558
- }),
559
- )
560
- }
561
-
562
- const handleCategoryChange = (category: string, checked: boolean) => {
563
- emitFilters({ categories: toggleFilterValue(selectedCategories, category, checked) })
564
- }
565
-
566
- const handleCollectionChange = (collection: string, checked: boolean) => {
567
- emitFilters({ collections: toggleFilterValue(selectedCollections, collection, checked) })
568
- }
569
-
570
- const handleFacetChange = (group: CategoryListingFacetGroup, value: string, checked: boolean) => {
571
- const current = selectedFacets[group.id] ?? []
572
- const nextValues = toggleFilterValue(current, value, checked)
573
- const nextFacets: Record<string, string[]> = { ...selectedFacets }
574
- if (nextValues.length > 0) nextFacets[group.id] = nextValues
575
- else delete nextFacets[group.id]
576
- emitFilters({ facets: nextFacets })
577
- }
578
-
579
- const handlePriceChange = (next: [number, number]) => {
580
- emitFilters({ priceRange: next })
581
- }
582
-
583
- const handleClearAll = () => {
584
- emitFilters({
585
- categories: [],
586
- collections: [],
587
- ...(priceRangeConfig ? { priceRange: [priceRangeConfig.min, priceRangeConfig.max] as [number, number] } : {}),
588
- facets: {},
589
- })
590
- }
591
-
592
- const handlePageSizeChange = (size: number) => {
593
- if (Number.isFinite(size)) onPageSizeChange?.(size)
594
- }
595
-
596
- const handlePageChange = (page: number | string) => {
597
- if (page === '...') return
598
- const numeric = Number(page)
599
- if (Number.isFinite(numeric)) onPageChange?.(numeric)
600
- }
601
-
602
- const handleSortChange = (sort: string) => {
603
- onSortChange?.(sort)
604
- }
605
-
606
- const handleSearchChange = (text: string) => {
607
- setDraftSearch(text)
608
- onSearchChange?.(text)
609
- }
610
-
611
- const fields = (
612
- <CategoryListingFilterFields
613
- selectedText={selectedText}
614
- clearAllLabel={clearAllLabel}
615
- priceRangeTitle={priceRangeTitle}
616
- priceRange={priceRangeValue}
617
- priceRangeConfig={showPrice ? priceRangeConfig : undefined}
618
- minLabel={minLabel}
619
- maxLabel={maxLabel}
620
- onPriceChange={handlePriceChange}
621
- categoriesTitle={categoriesTitle}
622
- categories={categories}
623
- selectedCategories={selectedCategories}
624
- onCategoryChange={handleCategoryChange}
625
- collectionsTitle={collectionsTitle}
626
- collections={collections}
627
- selectedCollections={selectedCollections}
628
- onCollectionChange={handleCollectionChange}
629
- facets={facets}
630
- selectedFacets={selectedFacets}
631
- onFacetChange={handleFacetChange}
632
- onClearAll={handleClearAll}
633
- />
634
- )
635
-
636
- const sortControl = (ariaLabel: string) =>
637
- showSort && sortOptions.length > 0 ? (
638
- <Select value={selectedSort} onValueChange={handleSortChange}>
639
- <SelectTrigger className='h-8 w-[180px]' aria-label={ariaLabel}>
640
- <SelectValue placeholder={sortPlaceholder} />
641
- </SelectTrigger>
642
- <SelectContent>
643
- {sortOptions.map(option => (
644
- <SelectItem key={option.value} value={option.value}>
645
- {option.label}
646
- </SelectItem>
647
- ))}
648
- </SelectContent>
649
- </Select>
650
- ) : null
651
-
652
- const searchControl = showSearch ? (
653
- <div className='relative w-full sm:w-64'>
654
- <label htmlFor={searchInputId} className='sr-only'>
655
- {searchLabel}
656
- </label>
657
- <Search
658
- aria-hidden='true'
659
- className='text-muted-foreground pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2'
660
- />
661
- <Input
662
- id={searchInputId}
663
- type='search'
664
- value={draftSearch}
665
- onChange={event => handleSearchChange(event.target.value)}
666
- placeholder={searchPlaceholder}
667
- aria-label={searchLabel}
668
- className='h-8 pl-8'
669
- />
670
- </div>
671
- ) : null
672
-
673
- const pageSizeControl =
674
- viewOptions.length > 0 ? (
675
- <div className='hidden items-center gap-2 sm:flex'>
676
- <span className='text-sm'>{viewLabel}</span>
677
- <Select
678
- value={String(selectedPageSize)}
679
- onValueChange={value => {
680
- const option = viewOptions.find(candidate => String(candidate) === value)
681
- handlePageSizeChange(option ?? Number(value))
682
- }}
683
- >
684
- <SelectTrigger className='h-8 w-[100px]' aria-label={viewLabel}>
685
- <SelectValue placeholder={viewPlaceholder} />
686
- </SelectTrigger>
687
- <SelectContent>
688
- {viewOptions.map(option => (
689
- <SelectItem key={option} value={String(option)}>
690
- {option}
691
- </SelectItem>
692
- ))}
693
- </SelectContent>
694
- </Select>
695
- </div>
696
- ) : null
697
-
698
- const statusView = (
699
- <CategoryListingStatusView
700
- status={status}
701
- activeFilters={activeFilters}
702
- loadingLabel={loadingLabel}
703
- emptyTitle={emptyTitle}
704
- emptyDescription={emptyDescription}
705
- clearFiltersLabel={clearFiltersLabel}
706
- invalidQueryTitle={invalidQueryTitle}
707
- unsupportedQueryTitle={unsupportedQueryTitle}
708
- unmountedCapabilityTitle={unmountedCapabilityTitle}
709
- errorTitle={errorTitle}
710
- errorDescription={errorDescription}
711
- repairLabel={repairLabel}
712
- retryLabel={retryLabel}
713
- activeFiltersTitle={activeFiltersTitle}
714
- removeFilterLabel={removeFilterLabel}
715
- onClearFilters={onClearFilters}
716
- onRepair={onRepair}
717
- onRetry={onRetry}
718
- onRemoveFilter={onRemoveFilter}
719
- />
720
- )
721
-
722
- const results =
723
- status.state === 'ready' ? (
724
- <section aria-labelledby='products-heading' className='flex flex-col gap-6'>
725
- <h2 id='products-heading' className='sr-only'>
726
- {productsTitle}
727
- </h2>
728
- <ul
729
- data-slot='category-listing-products'
730
- className={cn(
731
- 'grid grid-cols-1 gap-4 sm:grid-cols-2 sm:gap-6',
732
- presentation === 'sidebar' ? 'lg:grid-cols-3' : 'lg:grid-cols-4',
733
- )}
734
- >
735
- {products.map(product => (
736
- <li key={product.id}>
737
- <ProductCard
738
- item={product}
739
- presentation='minimal'
740
- hideAddToCart
741
- onProductClick={onProductClick}
742
- />
743
- </li>
744
- ))}
745
- </ul>
746
-
747
- {pagination.length > 0 ? (
748
- <Pagination aria-label='Paginación'>
749
- <PaginationContent>
750
- {pagination.map((page, index) =>
751
- page === '...' ? (
752
- <PaginationEllipsis key={`${page}-${index}`} />
753
- ) : (
754
- <PaginationItem key={page}>
755
- <Button
756
- type='button'
757
- variant={selectedPage === page ? 'outline' : 'ghost'}
758
- size='icon'
759
- data-slot='pagination-link'
760
- data-active={selectedPage === page}
761
- aria-current={selectedPage === page ? 'page' : undefined}
762
- className='size-8 cursor-pointer p-0'
763
- onClick={() => handlePageChange(page)}
764
- >
765
- {page}
766
- {selectedPage === page && <span className='sr-only'>{currentLabel}</span>}
767
- </Button>
768
- </PaginationItem>
769
- ),
770
- )}
771
- </PaginationContent>
772
- </Pagination>
773
- ) : null}
774
- </section>
775
- ) : null
776
-
777
- return (
778
- <div className='mx-auto w-full max-w-7xl px-4 py-8 sm:px-6 lg:px-8'>
779
- <div className={cn('flex flex-col gap-8', presentation === 'sidebar' && 'lg:flex-row')}>
780
- {presentation === 'sidebar' && showFilters ? (
781
- <aside className='hidden w-full flex-none lg:block lg:w-72'>
782
- <div className='max-h-100vh sticky top-4 overflow-y-auto'>
783
- <div className='flex flex-col gap-6 pb-6'>{fields}</div>
784
- </div>
785
- </aside>
786
- ) : null}
787
-
788
- <main className='flex min-w-0 flex-1 flex-col gap-6'>
789
- {presentation === 'toolbar' ? (
790
- <>
791
- <div className='bg-background/95 supports-[backdrop-filter]:bg-background/80 sticky top-0 z-10 -mx-4 flex items-center gap-2 border-b px-4 py-2 backdrop-blur lg:hidden'>
792
- {showFilters ? (
793
- <Button
794
- type='button'
795
- variant='outline'
796
- size='sm'
797
- className='h-9 flex-1 cursor-pointer justify-start'
798
- onClick={() => setIsFilterDrawerOpen(true)}
799
- >
800
- <SlidersHorizontal aria-hidden='true' />
801
- {filtersTitle}
802
- {activeFilters.length > 0 ? (
803
- <Badge variant='secondary' className='ms-auto'>
804
- {activeFilters.length}
805
- </Badge>
806
- ) : null}
807
- </Button>
808
- ) : null}
809
- {showSort && sortOptions.length > 0 ? (
810
- <Button
811
- type='button'
812
- variant='outline'
813
- size='sm'
814
- className='h-9 cursor-pointer'
815
- aria-label={sortTitle}
816
- onClick={() => setIsSortDrawerOpen(true)}
817
- >
818
- {sortTitle}
819
- </Button>
820
- ) : null}
821
- </div>
822
-
823
- <div className='hidden items-center gap-3 lg:flex'>
824
- {showFilters ? (
825
- <Button
826
- type='button'
827
- variant='outline'
828
- size='sm'
829
- className='h-8 cursor-pointer'
830
- onClick={() => setIsFilterDrawerOpen(true)}
831
- >
832
- <SlidersHorizontal aria-hidden='true' />
833
- {filtersTitle}
834
- {activeFilters.length > 0 ? (
835
- <Badge variant='secondary'>{activeFilters.length}</Badge>
836
- ) : null}
837
- </Button>
838
- ) : null}
839
- <div className='ms-auto'>{sortControl(sortTitle)}</div>
840
- </div>
841
- </>
842
- ) : null}
843
-
844
- <div className='flex flex-wrap items-center justify-between gap-4'>
845
- <div className='flex flex-1 items-center gap-4'>
846
- {presentation === 'sidebar' && showFilters ? (
847
- <Sheet open={isSheetOpen} onOpenChange={setIsSheetOpen}>
848
- <SheetTrigger asChild>
849
- <Button
850
- variant='outline'
851
- size='sm'
852
- className='h-8 cursor-pointer px-3 text-xs lg:hidden'
853
- >
854
- <SlidersHorizontal aria-hidden='true' />
855
- {filtersTitle}
856
- </Button>
857
- </SheetTrigger>
858
- <SheetContent side='left' className='w-full p-0 sm:w-[380px] lg:hidden'>
859
- <SheetHeader className='border-b px-6 py-4'>
860
- <SheetTitle className='text-lg'>{filtersTitle}</SheetTitle>
861
- </SheetHeader>
862
- <div className='h-[calc(100vh-4rem)] overflow-y-auto p-6'>
863
- <div className='flex flex-col gap-6'>{fields}</div>
864
- </div>
865
- </SheetContent>
866
- </Sheet>
867
- ) : null}
868
- {searchControl}
869
- {pageSizeControl}
870
- </div>
871
- {presentation === 'sidebar' ? (
872
- <div className='flex items-center gap-4'>{sortControl(sortPlaceholder)}</div>
873
- ) : null}
874
- </div>
875
-
876
- {statusView}
877
- {results}
878
- </main>
879
- </div>
880
-
881
- {presentation === 'toolbar' && showFilters ? (
882
- <Drawer open={isFilterDrawerOpen} onOpenChange={setIsFilterDrawerOpen}>
883
- <DrawerContent>
884
- <DrawerHeader>
885
- <DrawerTitle>{filtersTitle}</DrawerTitle>
886
- </DrawerHeader>
887
- <div className='min-h-0 flex-1 overflow-y-auto px-4'>{fields}</div>
888
- <div className='flex items-center gap-2 border-t p-4 pb-[max(1rem,env(safe-area-inset-bottom))]'>
889
- <Button type='button' variant='ghost' onClick={handleClearAll}>
890
- {clearAllLabel}
891
- </Button>
892
- <Button type='button' className='flex-1' onClick={() => setIsFilterDrawerOpen(false)}>
893
- {applyFiltersLabel}
894
- </Button>
895
- </div>
896
- </DrawerContent>
897
- </Drawer>
898
- ) : null}
899
-
900
- {presentation === 'toolbar' && showSort && sortOptions.length > 0 ? (
901
- <Drawer open={isSortDrawerOpen} onOpenChange={setIsSortDrawerOpen}>
902
- <DrawerContent>
903
- <DrawerHeader>
904
- <DrawerTitle>{sortTitle}</DrawerTitle>
905
- </DrawerHeader>
906
- <div className='px-4 pb-6'>
907
- <RadioGroup
908
- value={selectedSort}
909
- onValueChange={value => {
910
- if (typeof value === 'string') {
911
- handleSortChange(value)
912
- setIsSortDrawerOpen(false)
913
- }
914
- }}
915
- className='gap-3'
916
- >
917
- {sortOptions.map(option => (
918
- <div key={option.value} className='flex items-center gap-2'>
919
- <RadioGroupItem value={option.value} id={`listing-sort-${option.value}`} />
920
- <Label htmlFor={`listing-sort-${option.value}`} className='min-h-11 font-normal'>
921
- {option.label}
922
- </Label>
923
- </div>
924
- ))}
925
- </RadioGroup>
926
- </div>
927
- </DrawerContent>
928
- </Drawer>
929
- ) : null}
930
- </div>
931
- )
932
- }
933
-
934
- export default CategoryListing