@thorprovider/blocks 1.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +274 -46
- package/dist/.tsbuildinfo +1 -0
- package/dist/blocks/application/app-shells/app-shell-1-sidebar.d.ts +21 -0
- package/dist/blocks/application/app-shells/app-shell-1-sidebar.d.ts.map +1 -0
- package/dist/blocks/application/app-shells/app-shell-1-sidebar.js +147 -0
- package/dist/blocks/application/app-shells/app-shell-1-sidebar.js.map +1 -0
- package/dist/blocks/application/app-shells/app-shell-1-sidebar.mjs +153 -0
- package/dist/blocks/application/app-shells/app-shell-1-sidebar.mjs.map +1 -0
- package/dist/blocks/application/app-shells/app-shell-1.d.ts +27 -0
- package/dist/blocks/application/app-shells/app-shell-1.d.ts.map +1 -0
- package/dist/blocks/application/app-shells/app-shell-1.js +150 -0
- package/dist/blocks/application/app-shells/app-shell-1.js.map +1 -0
- package/dist/blocks/application/app-shells/app-shell-1.mjs +123 -0
- package/dist/blocks/application/app-shells/app-shell-1.mjs.map +1 -0
- package/dist/blocks/application/login-forms/login-page.d.ts +42 -0
- package/dist/blocks/application/login-forms/login-page.d.ts.map +1 -0
- package/dist/blocks/application/login-forms/login-page.js +209 -0
- package/dist/blocks/application/login-forms/login-page.js.map +1 -0
- package/dist/blocks/application/login-forms/login-page.mjs +185 -0
- package/dist/blocks/application/login-forms/login-page.mjs.map +1 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.d.ts +3 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.d.ts.map +1 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.js +74 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.js.map +1 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.mjs +50 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1-brand-mark.mjs.map +1 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1.d.ts +42 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1.d.ts.map +1 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1.js +293 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1.js.map +1 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1.mjs +259 -0
- package/dist/blocks/application/password-recovery/forgot-password-page-1.mjs.map +1 -0
- package/dist/blocks/application/signup-forms/signup-page-1.d.ts +41 -0
- package/dist/blocks/application/signup-forms/signup-page-1.d.ts.map +1 -0
- package/dist/blocks/application/signup-forms/signup-page-1.js +195 -0
- package/dist/blocks/application/signup-forms/signup-page-1.js.map +1 -0
- package/dist/blocks/application/signup-forms/signup-page-1.mjs +171 -0
- package/dist/blocks/application/signup-forms/signup-page-1.mjs.map +1 -0
- package/dist/blocks/application/verification/verify-1.d.ts +35 -0
- package/dist/blocks/application/verification/verify-1.d.ts.map +1 -0
- package/dist/blocks/application/verification/verify-1.js +243 -0
- package/dist/blocks/application/verification/verify-1.js.map +1 -0
- package/dist/blocks/application/verification/verify-1.mjs +219 -0
- package/dist/blocks/application/verification/verify-1.mjs.map +1 -0
- package/dist/blocks/application/verification/verify-confetti.d.ts +22 -0
- package/dist/blocks/application/verification/verify-confetti.d.ts.map +1 -0
- package/dist/blocks/application/verification/verify-confetti.js +145 -0
- package/dist/blocks/application/verification/verify-confetti.js.map +1 -0
- package/dist/blocks/application/verification/verify-confetti.mjs +121 -0
- package/dist/blocks/application/verification/verify-confetti.mjs.map +1 -0
- package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.d.ts +39 -0
- package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.d.ts.map +1 -0
- package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.js +180 -0
- package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.js.map +1 -0
- package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.mjs +156 -0
- package/dist/blocks/e-commerce/category-filters/category-listing-filter-fields.mjs.map +1 -0
- package/dist/blocks/e-commerce/category-filters/category-listing.d.ts +236 -0
- package/dist/blocks/e-commerce/category-filters/category-listing.d.ts.map +1 -0
- package/dist/blocks/e-commerce/category-filters/category-listing.js +562 -0
- package/dist/blocks/e-commerce/category-filters/category-listing.js.map +1 -0
- package/dist/blocks/e-commerce/category-filters/category-listing.mjs +539 -0
- package/dist/blocks/e-commerce/category-filters/category-listing.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.d.ts +4 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js +97 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs +73 -0
- package/dist/blocks/e-commerce/checkout-forms/checkbox-check.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.d.ts +41 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.js +115 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.mjs +91 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.d.ts +107 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.js +180 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.mjs +156 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-confirmation.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts +13 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js +180 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs +156 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-contact-step.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts +12 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js +50 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs +33 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-country-field.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.d.ts +11 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.js +50 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.mjs +25 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-field-feedback.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.d.ts +5 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.js +17 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.mjs +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-form-types.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts +20 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js +176 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs +152 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-order-summary.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts +12 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js +93 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs +69 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-payment-step.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-progress.d.ts +11 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-progress.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-progress.js +76 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-progress.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-progress.mjs +52 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-progress.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts +11 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js +64 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs +40 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-review-step.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts +17 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js +199 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs +175 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout-shipping-step.mjs.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts +164 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.d.ts.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.js +351 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.js.map +1 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.mjs +327 -0
- package/dist/blocks/e-commerce/checkout-forms/checkout.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/back-to-top.d.ts +28 -0
- package/dist/blocks/e-commerce/navigation/back-to-top.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/back-to-top.js +78 -0
- package/dist/blocks/e-commerce/navigation/back-to-top.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/back-to-top.mjs +52 -0
- package/dist/blocks/e-commerce/navigation/back-to-top.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/breadcrumb.d.ts +61 -0
- package/dist/blocks/e-commerce/navigation/breadcrumb.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/breadcrumb.js +111 -0
- package/dist/blocks/e-commerce/navigation/breadcrumb.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/breadcrumb.mjs +93 -0
- package/dist/blocks/e-commerce/navigation/breadcrumb.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/category-icon.d.ts +28 -0
- package/dist/blocks/e-commerce/navigation/category-icon.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/category-icon.js +86 -0
- package/dist/blocks/e-commerce/navigation/category-icon.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/category-icon.mjs +79 -0
- package/dist/blocks/e-commerce/navigation/category-icon.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/mega-menu.d.ts +112 -0
- package/dist/blocks/e-commerce/navigation/mega-menu.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/mega-menu.js +250 -0
- package/dist/blocks/e-commerce/navigation/mega-menu.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/mega-menu.mjs +228 -0
- package/dist/blocks/e-commerce/navigation/mega-menu.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.d.ts +71 -0
- package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.js +94 -0
- package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.mjs +68 -0
- package/dist/blocks/e-commerce/navigation/mobile-bottom-nav.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/mobile-category-drawer.d.ts +121 -0
- package/dist/blocks/e-commerce/navigation/mobile-category-drawer.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/mobile-category-drawer.js +257 -0
- package/dist/blocks/e-commerce/navigation/mobile-category-drawer.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/mobile-category-drawer.mjs +235 -0
- package/dist/blocks/e-commerce/navigation/mobile-category-drawer.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/skip-to-content.d.ts +25 -0
- package/dist/blocks/e-commerce/navigation/skip-to-content.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/skip-to-content.js +55 -0
- package/dist/blocks/e-commerce/navigation/skip-to-content.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/skip-to-content.mjs +30 -0
- package/dist/blocks/e-commerce/navigation/skip-to-content.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.d.ts +23 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.js +127 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.mjs +111 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-account-menu.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts +66 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js +280 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs +263 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-cart-sheet.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.d.ts +13 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.js +83 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.mjs +59 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-mobile-nav.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.d.ts +8 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.js +73 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.mjs +49 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar-search-bar.mjs.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts +121 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar.d.ts.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar.js +424 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar.js.map +1 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs +399 -0
- package/dist/blocks/e-commerce/navigation/storefront-navbar.mjs.map +1 -0
- package/dist/blocks/e-commerce/order-history/order-history.d.ts +74 -0
- package/dist/blocks/e-commerce/order-history/order-history.d.ts.map +1 -0
- package/dist/blocks/e-commerce/order-history/order-history.js +161 -0
- package/dist/blocks/e-commerce/order-history/order-history.js.map +1 -0
- package/dist/blocks/e-commerce/order-history/order-history.mjs +141 -0
- package/dist/blocks/e-commerce/order-history/order-history.mjs.map +1 -0
- package/dist/blocks/e-commerce/order-history/order-line.d.ts +50 -0
- package/dist/blocks/e-commerce/order-history/order-line.d.ts.map +1 -0
- package/dist/blocks/e-commerce/order-history/order-line.js +75 -0
- package/dist/blocks/e-commerce/order-history/order-line.js.map +1 -0
- package/dist/blocks/e-commerce/order-history/order-line.mjs +49 -0
- package/dist/blocks/e-commerce/order-history/order-line.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-categories/category-card.d.ts +9 -0
- package/dist/blocks/e-commerce/product-categories/category-card.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-categories/category-card.js +154 -0
- package/dist/blocks/e-commerce/product-categories/category-card.js.map +1 -0
- package/dist/blocks/e-commerce/product-categories/category-card.mjs +134 -0
- package/dist/blocks/e-commerce/product-categories/category-card.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-categories/category-shared.d.ts +15 -0
- package/dist/blocks/e-commerce/product-categories/category-shared.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-categories/category-shared.js +101 -0
- package/dist/blocks/e-commerce/product-categories/category-shared.js.map +1 -0
- package/dist/blocks/e-commerce/product-categories/category-shared.mjs +97 -0
- package/dist/blocks/e-commerce/product-categories/category-shared.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-categories/product-category-grid.d.ts +10 -0
- package/dist/blocks/e-commerce/product-categories/product-category-grid.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-categories/product-category-grid.js +138 -0
- package/dist/blocks/e-commerce/product-categories/product-category-grid.js.map +1 -0
- package/dist/blocks/e-commerce/product-categories/product-category-grid.mjs +114 -0
- package/dist/blocks/e-commerce/product-categories/product-category-grid.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-categories/product-category.d.ts +41 -0
- package/dist/blocks/e-commerce/product-categories/product-category.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-categories/product-category.js +319 -0
- package/dist/blocks/e-commerce/product-categories/product-category.js.map +1 -0
- package/dist/blocks/e-commerce/product-categories/product-category.mjs +322 -0
- package/dist/blocks/e-commerce/product-categories/product-category.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-card.d.ts +47 -0
- package/dist/blocks/e-commerce/product-list/product-card.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-card.js +361 -0
- package/dist/blocks/e-commerce/product-list/product-card.js.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-card.mjs +337 -0
- package/dist/blocks/e-commerce/product-list/product-card.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-grid.d.ts +28 -0
- package/dist/blocks/e-commerce/product-list/product-grid.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-grid.js +92 -0
- package/dist/blocks/e-commerce/product-list/product-grid.js.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-grid.mjs +68 -0
- package/dist/blocks/e-commerce/product-list/product-grid.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts +30 -0
- package/dist/blocks/e-commerce/product-list/product-showcase-1.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-showcase-1.js +245 -0
- package/dist/blocks/e-commerce/product-list/product-showcase-1.js.map +1 -0
- package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs +221 -0
- package/dist/blocks/e-commerce/product-list/product-showcase-1.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-gallery.d.ts +20 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-gallery.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-gallery.js +71 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-gallery.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-gallery.mjs +47 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-gallery.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.d.ts +15 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.js +118 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.mjs +94 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-lightbox-tab.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.d.ts +26 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.js +85 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.mjs +61 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-reviews-tab.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-tabs.d.ts +32 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-tabs.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-tabs.js +79 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-tabs.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-tabs.mjs +51 -0
- package/dist/blocks/e-commerce/product-overview/product-overview-tabs.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview.d.ts +121 -0
- package/dist/blocks/e-commerce/product-overview/product-overview.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview.js +844 -0
- package/dist/blocks/e-commerce/product-overview/product-overview.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-overview.mjs +821 -0
- package/dist/blocks/e-commerce/product-overview/product-overview.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-card.d.ts +17 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-card.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-card.js +123 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-card.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-card.mjs +99 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-card.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts +20 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js +271 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs +253 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view-dialog.mjs.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view.d.ts +68 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view.d.ts.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view.js +84 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view.js.map +1 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view.mjs +60 -0
- package/dist/blocks/e-commerce/product-overview/product-quick-view.mjs.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-card.d.ts +60 -0
- package/dist/blocks/e-commerce/reviews/review-card.d.ts.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-card.js +166 -0
- package/dist/blocks/e-commerce/reviews/review-card.js.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-card.mjs +139 -0
- package/dist/blocks/e-commerce/reviews/review-card.mjs.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-composer.d.ts +50 -0
- package/dist/blocks/e-commerce/reviews/review-composer.d.ts.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-composer.js +180 -0
- package/dist/blocks/e-commerce/reviews/review-composer.js.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-composer.mjs +155 -0
- package/dist/blocks/e-commerce/reviews/review-composer.mjs.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-list.d.ts +40 -0
- package/dist/blocks/e-commerce/reviews/review-list.d.ts.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-list.js +138 -0
- package/dist/blocks/e-commerce/reviews/review-list.js.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-list.mjs +119 -0
- package/dist/blocks/e-commerce/reviews/review-list.mjs.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-summary.d.ts +49 -0
- package/dist/blocks/e-commerce/reviews/review-summary.d.ts.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-summary.js +150 -0
- package/dist/blocks/e-commerce/reviews/review-summary.js.map +1 -0
- package/dist/blocks/e-commerce/reviews/review-summary.mjs +124 -0
- package/dist/blocks/e-commerce/reviews/review-summary.mjs.map +1 -0
- package/dist/blocks/e-commerce/shopping-carts/shopping-cart.d.ts +98 -0
- package/dist/blocks/e-commerce/shopping-carts/shopping-cart.d.ts.map +1 -0
- package/dist/blocks/e-commerce/shopping-carts/shopping-cart.js +417 -0
- package/dist/blocks/e-commerce/shopping-carts/shopping-cart.js.map +1 -0
- package/dist/blocks/e-commerce/shopping-carts/shopping-cart.mjs +393 -0
- package/dist/blocks/e-commerce/shopping-carts/shopping-cart.mjs.map +1 -0
- package/dist/blocks/e-commerce/store-containers/store-container-1.d.ts +13 -0
- package/dist/blocks/e-commerce/store-containers/store-container-1.d.ts.map +1 -0
- package/dist/blocks/e-commerce/store-containers/store-container-1.js +45 -0
- package/dist/blocks/e-commerce/store-containers/store-container-1.js.map +1 -0
- package/dist/blocks/e-commerce/store-containers/store-container-1.mjs +21 -0
- package/dist/blocks/e-commerce/store-containers/store-container-1.mjs.map +1 -0
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts +163 -0
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.d.ts.map +1 -0
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js +810 -0
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.js.map +1 -0
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs +786 -0
- package/dist/blocks/e-commerce/storefront-hero/storefront-hero.mjs.map +1 -0
- package/dist/blocks/marketing/banners/avatar-group.d.ts +8 -0
- package/dist/blocks/marketing/banners/avatar-group.d.ts.map +1 -0
- package/dist/blocks/marketing/banners/avatar-group.js +90 -0
- package/dist/blocks/marketing/banners/avatar-group.js.map +1 -0
- package/dist/blocks/marketing/banners/avatar-group.mjs +56 -0
- package/dist/blocks/marketing/banners/avatar-group.mjs.map +1 -0
- package/dist/blocks/marketing/banners/banner-1.d.ts +26 -0
- package/dist/blocks/marketing/banners/banner-1.d.ts.map +1 -0
- package/dist/blocks/marketing/banners/banner-1.js +177 -0
- package/dist/blocks/marketing/banners/banner-1.js.map +1 -0
- package/dist/blocks/marketing/banners/banner-1.mjs +153 -0
- package/dist/blocks/marketing/banners/banner-1.mjs.map +1 -0
- package/dist/blocks/marketing/cta/cta-section-1.d.ts +13 -0
- package/dist/blocks/marketing/cta/cta-section-1.d.ts.map +1 -0
- package/dist/blocks/marketing/cta/cta-section-1.js +116 -0
- package/dist/blocks/marketing/cta/cta-section-1.js.map +1 -0
- package/dist/blocks/marketing/cta/cta-section-1.mjs +92 -0
- package/dist/blocks/marketing/cta/cta-section-1.mjs.map +1 -0
- package/dist/blocks/marketing/faq/faq-block-1.d.ts +16 -0
- package/dist/blocks/marketing/faq/faq-block-1.d.ts.map +1 -0
- package/dist/blocks/marketing/faq/faq-block-1.js +49 -0
- package/dist/blocks/marketing/faq/faq-block-1.js.map +1 -0
- package/dist/blocks/marketing/faq/faq-block-1.mjs +25 -0
- package/dist/blocks/marketing/faq/faq-block-1.mjs.map +1 -0
- package/dist/blocks/marketing/features/feature.d.ts +45 -0
- package/dist/blocks/marketing/features/feature.d.ts.map +1 -0
- package/dist/blocks/marketing/features/feature.js +135 -0
- package/dist/blocks/marketing/features/feature.js.map +1 -0
- package/dist/blocks/marketing/features/feature.mjs +111 -0
- package/dist/blocks/marketing/features/feature.mjs.map +1 -0
- package/dist/blocks/marketing/footers/footer-section.d.ts +59 -0
- package/dist/blocks/marketing/footers/footer-section.d.ts.map +1 -0
- package/dist/blocks/marketing/footers/footer-section.js +356 -0
- package/dist/blocks/marketing/footers/footer-section.js.map +1 -0
- package/dist/blocks/marketing/footers/footer-section.mjs +332 -0
- package/dist/blocks/marketing/footers/footer-section.mjs.map +1 -0
- package/dist/blocks/marketing/hero-sections/avatar-group.d.ts +9 -0
- package/dist/blocks/marketing/hero-sections/avatar-group.d.ts.map +1 -0
- package/dist/blocks/marketing/hero-sections/avatar-group.js +92 -0
- package/dist/blocks/marketing/hero-sections/avatar-group.js.map +1 -0
- package/dist/blocks/marketing/hero-sections/avatar-group.mjs +58 -0
- package/dist/blocks/marketing/hero-sections/avatar-group.mjs.map +1 -0
- package/dist/blocks/marketing/hero-sections/hero-section-1.d.ts +27 -0
- package/dist/blocks/marketing/hero-sections/hero-section-1.d.ts.map +1 -0
- package/dist/blocks/marketing/hero-sections/hero-section-1.js +124 -0
- package/dist/blocks/marketing/hero-sections/hero-section-1.js.map +1 -0
- package/dist/blocks/marketing/hero-sections/hero-section-1.mjs +100 -0
- package/dist/blocks/marketing/hero-sections/hero-section-1.mjs.map +1 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.d.ts +19 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.d.ts.map +1 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.js +63 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.js.map +1 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.mjs +39 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.mjs.map +1 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1.d.ts +13 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1.d.ts.map +1 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1.js +49 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1.js.map +1 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1.mjs +25 -0
- package/dist/blocks/marketing/logo-clouds/logo-cloud-1.mjs.map +1 -0
- package/dist/blocks/marketing/navbars/navbar.d.ts +80 -0
- package/dist/blocks/marketing/navbars/navbar.d.ts.map +1 -0
- package/dist/blocks/marketing/navbars/navbar.js +484 -0
- package/dist/blocks/marketing/navbars/navbar.js.map +1 -0
- package/dist/blocks/marketing/navbars/navbar.mjs +475 -0
- package/dist/blocks/marketing/navbars/navbar.mjs.map +1 -0
- package/dist/blocks/marketing/pricing/pricing-section-1.d.ts +23 -0
- package/dist/blocks/marketing/pricing/pricing-section-1.d.ts.map +1 -0
- package/dist/blocks/marketing/pricing/pricing-section-1.js +89 -0
- package/dist/blocks/marketing/pricing/pricing-section-1.js.map +1 -0
- package/dist/blocks/marketing/pricing/pricing-section-1.mjs +65 -0
- package/dist/blocks/marketing/pricing/pricing-section-1.mjs.map +1 -0
- package/dist/blocks/marketing/statistics/statistic-1.d.ts +19 -0
- package/dist/blocks/marketing/statistics/statistic-1.d.ts.map +1 -0
- package/dist/blocks/marketing/statistics/statistic-1.js +83 -0
- package/dist/blocks/marketing/statistics/statistic-1.js.map +1 -0
- package/dist/blocks/marketing/statistics/statistic-1.mjs +59 -0
- package/dist/blocks/marketing/statistics/statistic-1.mjs.map +1 -0
- package/dist/blocks/marketing/testimonials/testimonial-section.d.ts +29 -0
- package/dist/blocks/marketing/testimonials/testimonial-section.d.ts.map +1 -0
- package/dist/blocks/marketing/testimonials/testimonial-section.js +173 -0
- package/dist/blocks/marketing/testimonials/testimonial-section.js.map +1 -0
- package/dist/blocks/marketing/testimonials/testimonial-section.mjs +155 -0
- package/dist/blocks/marketing/testimonials/testimonial-section.mjs.map +1 -0
- package/dist/blocks/shared/reaction-toggle.d.ts +14 -0
- package/dist/blocks/shared/reaction-toggle.d.ts.map +1 -0
- package/dist/blocks/shared/reaction-toggle.js +138 -0
- package/dist/blocks/shared/reaction-toggle.js.map +1 -0
- package/dist/blocks/shared/reaction-toggle.mjs +114 -0
- package/dist/blocks/shared/reaction-toggle.mjs.map +1 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +53 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-mobile.mjs +19 -0
- package/dist/hooks/use-mobile.mjs.map +1 -0
- package/dist/index.d.ts +100 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +339 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +238 -0
- package/dist/index.mjs.map +1 -0
- package/{src/lib/cart.ts → dist/lib/cart.d.ts} +2 -3
- package/dist/lib/cart.d.ts.map +1 -0
- package/dist/lib/cart.js +31 -0
- package/dist/lib/cart.js.map +1 -0
- package/dist/lib/cart.mjs +7 -0
- package/dist/lib/cart.mjs.map +1 -0
- package/dist/lib/contracts.d.ts +4008 -0
- package/dist/lib/contracts.d.ts.map +1 -0
- package/dist/lib/contracts.js +828 -0
- package/dist/lib/contracts.js.map +1 -0
- package/dist/lib/contracts.mjs +737 -0
- package/dist/lib/contracts.mjs.map +1 -0
- package/dist/lib/money.d.ts +28 -0
- package/dist/lib/money.d.ts.map +1 -0
- package/dist/lib/money.js +50 -0
- package/dist/lib/money.js.map +1 -0
- package/dist/lib/money.mjs +24 -0
- package/dist/lib/money.mjs.map +1 -0
- package/dist/lib/types/menu.d.ts +40 -0
- package/dist/lib/types/menu.d.ts.map +1 -0
- package/dist/lib/types/menu.js +50 -0
- package/dist/lib/types/menu.js.map +1 -0
- package/dist/lib/types/menu.mjs +25 -0
- package/dist/lib/types/menu.mjs.map +1 -0
- package/dist/lib/types.d.ts +5 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +17 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/types.mjs +1 -0
- package/dist/lib/types.mjs.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +33 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/lib/utils.mjs +9 -0
- package/dist/lib/utils.mjs.map +1 -0
- package/dist/ui/accordion.d.ts +8 -0
- package/dist/ui/accordion.d.ts.map +1 -0
- package/dist/ui/accordion.js +93 -0
- package/dist/ui/accordion.js.map +1 -0
- package/dist/ui/accordion.mjs +66 -0
- package/dist/ui/accordion.mjs.map +1 -0
- package/dist/ui/avatar.d.ts +12 -0
- package/dist/ui/avatar.d.ts.map +1 -0
- package/dist/ui/avatar.js +134 -0
- package/dist/ui/avatar.js.map +1 -0
- package/{src/ui/avatar.tsx → dist/ui/avatar.mjs} +67 -70
- package/dist/ui/avatar.mjs.map +1 -0
- package/dist/ui/badge.d.ts +10 -0
- package/dist/ui/badge.d.ts.map +1 -0
- package/dist/ui/badge.js +69 -0
- package/dist/ui/badge.js.map +1 -0
- package/dist/ui/badge.mjs +44 -0
- package/dist/ui/badge.mjs.map +1 -0
- package/dist/ui/breadcrumb.d.ts +12 -0
- package/dist/ui/breadcrumb.d.ts.map +1 -0
- package/dist/ui/breadcrumb.js +134 -0
- package/dist/ui/breadcrumb.js.map +1 -0
- package/dist/ui/breadcrumb.mjs +104 -0
- package/dist/ui/breadcrumb.mjs.map +1 -0
- package/dist/ui/button-group.d.ts +12 -0
- package/dist/ui/button-group.d.ts.map +1 -0
- package/dist/ui/button-group.js +104 -0
- package/dist/ui/button-group.js.map +1 -0
- package/dist/ui/button-group.mjs +77 -0
- package/dist/ui/button-group.mjs.map +1 -0
- package/dist/ui/button.d.ts +11 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/button.js +82 -0
- package/dist/ui/button.js.map +1 -0
- package/dist/ui/button.mjs +57 -0
- package/dist/ui/button.mjs.map +1 -0
- package/dist/ui/card.d.ts +10 -0
- package/dist/ui/card.d.ts.map +1 -0
- package/dist/ui/card.js +121 -0
- package/dist/ui/card.js.map +1 -0
- package/dist/ui/card.mjs +91 -0
- package/dist/ui/card.mjs.map +1 -0
- package/dist/ui/carousel.d.ts +20 -0
- package/dist/ui/carousel.d.ts.map +1 -0
- package/dist/ui/carousel.js +238 -0
- package/dist/ui/carousel.js.map +1 -0
- package/dist/ui/carousel.mjs +200 -0
- package/dist/ui/carousel.mjs.map +1 -0
- package/dist/ui/dialog.d.ts +18 -0
- package/dist/ui/dialog.d.ts.map +1 -0
- package/dist/ui/dialog.js +181 -0
- package/dist/ui/dialog.js.map +1 -0
- package/dist/ui/dialog.mjs +148 -0
- package/dist/ui/dialog.mjs.map +1 -0
- package/dist/ui/drawer.d.ts +14 -0
- package/dist/ui/drawer.d.ts.map +1 -0
- package/dist/ui/drawer.js +163 -0
- package/dist/ui/drawer.js.map +1 -0
- package/dist/ui/drawer.mjs +130 -0
- package/dist/ui/drawer.mjs.map +1 -0
- package/dist/ui/dropdown-menu.d.ts +26 -0
- package/dist/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/ui/dropdown-menu.js +271 -0
- package/dist/ui/dropdown-menu.js.map +1 -0
- package/dist/ui/dropdown-menu.mjs +233 -0
- package/dist/ui/dropdown-menu.mjs.map +1 -0
- package/dist/ui/empty.d.ts +12 -0
- package/dist/ui/empty.d.ts.map +1 -0
- package/dist/ui/empty.js +132 -0
- package/dist/ui/empty.js.map +1 -0
- package/dist/ui/empty.mjs +103 -0
- package/dist/ui/empty.mjs.map +1 -0
- package/dist/ui/field.d.ts +25 -0
- package/dist/ui/field.d.ts.map +1 -0
- package/dist/ui/field.js +264 -0
- package/dist/ui/field.js.map +1 -0
- package/{src/ui/field.tsx → dist/ui/field.mjs} +142 -159
- package/dist/ui/field.mjs.map +1 -0
- package/dist/ui/input-group.d.ts +17 -0
- package/dist/ui/input-group.d.ts.map +1 -0
- package/dist/ui/input-group.js +185 -0
- package/dist/ui/input-group.js.map +1 -0
- package/{src/ui/input-group.tsx → dist/ui/input-group.mjs} +92 -106
- package/dist/ui/input-group.mjs.map +1 -0
- package/dist/ui/input-otp.d.ts +12 -0
- package/dist/ui/input-otp.d.ts.map +1 -0
- package/dist/ui/input-otp.js +105 -0
- package/dist/ui/input-otp.js.map +1 -0
- package/dist/ui/input-otp.mjs +68 -0
- package/dist/ui/input-otp.mjs.map +1 -0
- package/dist/ui/input.d.ts +4 -0
- package/dist/ui/input.d.ts.map +1 -0
- package/dist/ui/input.js +46 -0
- package/dist/ui/input.js.map +1 -0
- package/{src/ui/input.tsx → dist/ui/input.mjs} +17 -15
- package/dist/ui/input.mjs.map +1 -0
- package/dist/ui/label.d.ts +5 -0
- package/dist/ui/label.d.ts.map +1 -0
- package/dist/ui/label.js +48 -0
- package/dist/ui/label.js.map +1 -0
- package/dist/ui/label.mjs +24 -0
- package/dist/ui/label.mjs.map +1 -0
- package/dist/ui/navigation-menu.d.ts +15 -0
- package/dist/ui/navigation-menu.d.ts.map +1 -0
- package/dist/ui/navigation-menu.js +203 -0
- package/dist/ui/navigation-menu.js.map +1 -0
- package/{src/ui/navigation-menu.tsx → dist/ui/navigation-menu.mjs} +116 -112
- package/dist/ui/navigation-menu.mjs.map +1 -0
- package/dist/ui/pagination.d.ts +14 -0
- package/dist/ui/pagination.d.ts.map +1 -0
- package/dist/ui/pagination.js +149 -0
- package/dist/ui/pagination.js.map +1 -0
- package/dist/ui/pagination.mjs +123 -0
- package/dist/ui/pagination.mjs.map +1 -0
- package/dist/ui/progress.d.ts +5 -0
- package/dist/ui/progress.d.ts.map +1 -0
- package/dist/ui/progress.js +57 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/progress.mjs +33 -0
- package/dist/ui/progress.mjs.map +1 -0
- package/dist/ui/radio-group.d.ts +6 -0
- package/dist/ui/radio-group.d.ts.map +1 -0
- package/dist/ui/radio-group.js +72 -0
- package/dist/ui/radio-group.js.map +1 -0
- package/dist/ui/radio-group.mjs +47 -0
- package/dist/ui/radio-group.mjs.map +1 -0
- package/dist/ui/select.d.ts +16 -0
- package/dist/ui/select.d.ts.map +1 -0
- package/dist/ui/select.js +213 -0
- package/dist/ui/select.js.map +1 -0
- package/dist/ui/select.mjs +180 -0
- package/dist/ui/select.mjs.map +1 -0
- package/dist/ui/separator.d.ts +5 -0
- package/dist/ui/separator.d.ts.map +1 -0
- package/dist/ui/separator.js +52 -0
- package/dist/ui/separator.js.map +1 -0
- package/dist/ui/separator.mjs +28 -0
- package/dist/ui/separator.mjs.map +1 -0
- package/dist/ui/sheet.d.ts +15 -0
- package/dist/ui/sheet.d.ts.map +1 -0
- package/dist/ui/sheet.js +160 -0
- package/dist/ui/sheet.js.map +1 -0
- package/dist/ui/sheet.mjs +129 -0
- package/dist/ui/sheet.mjs.map +1 -0
- package/dist/ui/sidebar.d.ts +70 -0
- package/dist/ui/sidebar.d.ts.map +1 -0
- package/dist/ui/sidebar.js +697 -0
- package/dist/ui/sidebar.js.map +1 -0
- package/dist/ui/sidebar.mjs +651 -0
- package/dist/ui/sidebar.mjs.map +1 -0
- package/dist/ui/skeleton.d.ts +3 -0
- package/dist/ui/skeleton.d.ts.map +1 -0
- package/dist/ui/skeleton.js +40 -0
- package/dist/ui/skeleton.js.map +1 -0
- package/dist/ui/skeleton.mjs +16 -0
- package/dist/ui/skeleton.mjs.map +1 -0
- package/dist/ui/table.d.ts +11 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +147 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/table.mjs +116 -0
- package/dist/ui/table.mjs.map +1 -0
- package/dist/ui/tabs.d.ts +12 -0
- package/dist/ui/tabs.d.ts.map +1 -0
- package/dist/ui/tabs.js +121 -0
- package/dist/ui/tabs.js.map +1 -0
- package/{src/ui/tabs.tsx → dist/ui/tabs.mjs} +59 -56
- package/dist/ui/tabs.mjs.map +1 -0
- package/dist/ui/textarea.d.ts +4 -0
- package/dist/ui/textarea.d.ts.map +1 -0
- package/dist/ui/textarea.js +43 -0
- package/dist/ui/textarea.js.map +1 -0
- package/{src/ui/textarea.tsx → dist/ui/textarea.mjs} +16 -14
- package/dist/ui/textarea.mjs.map +1 -0
- package/dist/ui/toggle-group.d.ts +10 -0
- package/dist/ui/toggle-group.d.ts.map +1 -0
- package/dist/ui/toggle-group.js +105 -0
- package/dist/ui/toggle-group.js.map +1 -0
- package/dist/ui/toggle-group.mjs +70 -0
- package/dist/ui/toggle-group.mjs.map +1 -0
- package/dist/ui/toggle.d.ts +10 -0
- package/dist/ui/toggle.d.ts.map +1 -0
- package/dist/ui/toggle.js +70 -0
- package/dist/ui/toggle.js.map +1 -0
- package/{src/ui/toggle.tsx → dist/ui/toggle.mjs} +25 -26
- package/dist/ui/toggle.mjs.map +1 -0
- package/dist/ui/tooltip.d.ts +8 -0
- package/dist/ui/tooltip.d.ts.map +1 -0
- package/dist/ui/tooltip.js +84 -0
- package/dist/ui/tooltip.js.map +1 -0
- package/dist/ui/tooltip.mjs +57 -0
- package/dist/ui/tooltip.mjs.map +1 -0
- package/package.json +8 -1
- package/AGENTS.md +0 -1
- package/CHANGELOG.md +0 -107
- package/components.json +0 -33
- package/docs/standards/data-contracts.md +0 -81
- package/docs/standards/theming.md +0 -112
- package/scripts/fix-esm-extensions.mjs +0 -40
- package/src/blocks/application/app-shells/app-shell-1-sidebar.tsx +0 -198
- package/src/blocks/application/app-shells/app-shell-1.tsx +0 -196
- package/src/blocks/application/login-forms/login-page-1.tsx +0 -246
- package/src/blocks/application/login-forms/login-page-2.tsx +0 -207
- package/src/blocks/application/password-recovery/forgot-password-page-1-brand-mark.tsx +0 -38
- package/src/blocks/application/password-recovery/forgot-password-page-1.tsx +0 -320
- package/src/blocks/application/signup-forms/signup-page-1.tsx +0 -231
- package/src/blocks/application/verification/verify-1.tsx +0 -307
- package/src/blocks/application/verification/verify-confetti.tsx +0 -192
- package/src/blocks/e-commerce/category-filters/category-filter-1.tsx +0 -260
- package/src/blocks/e-commerce/category-filters/category-filter-2-filter-panel.tsx +0 -222
- package/src/blocks/e-commerce/category-filters/category-filter-2.test.tsx +0 -513
- package/src/blocks/e-commerce/category-filters/category-filter-2.tsx +0 -921
- package/src/blocks/e-commerce/category-filters/category-filter-4-chip-rail.tsx +0 -57
- package/src/blocks/e-commerce/category-filters/category-filter-4-drawer.tsx +0 -124
- package/src/blocks/e-commerce/category-filters/category-filter-4-fields.tsx +0 -170
- package/src/blocks/e-commerce/category-filters/category-filter-4-sidebar.tsx +0 -52
- package/src/blocks/e-commerce/category-filters/category-filter-4-sort-sheet.tsx +0 -57
- package/src/blocks/e-commerce/category-filters/category-filter-4-state.ts +0 -68
- package/src/blocks/e-commerce/category-filters/category-filter-4.tsx +0 -298
- package/src/blocks/e-commerce/checkout-forms/card-formatting.test.ts +0 -47
- package/src/blocks/e-commerce/checkout-forms/card-formatting.ts +0 -9
- package/src/blocks/e-commerce/checkout-forms/checkbox-check.tsx +0 -74
- package/src/blocks/e-commerce/checkout-forms/checkout-confirmation-fulfilment-progress.tsx +0 -195
- package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.test.tsx +0 -136
- package/src/blocks/e-commerce/checkout-forms/checkout-confirmation.tsx +0 -329
- package/src/blocks/e-commerce/checkout-forms/checkout-field-feedback.tsx +0 -29
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1-contact-step.tsx +0 -96
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1-country-field.tsx +0 -51
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1-order-summary.tsx +0 -252
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1-payment-step.tsx +0 -188
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1-progress.tsx +0 -36
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1-shipping-step.tsx +0 -156
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1.test.tsx +0 -216
- package/src/blocks/e-commerce/checkout-forms/checkout-form-1.tsx +0 -338
- package/src/blocks/e-commerce/checkout-forms/checkout-form-2-order-summary.tsx +0 -130
- package/src/blocks/e-commerce/checkout-forms/checkout-form-2-payment-card.tsx +0 -175
- package/src/blocks/e-commerce/checkout-forms/checkout-form-2-shipping-card.tsx +0 -190
- package/src/blocks/e-commerce/checkout-forms/checkout-form-2.tsx +0 -312
- package/src/blocks/e-commerce/checkout-forms/checkout-form-3-information-step.tsx +0 -91
- package/src/blocks/e-commerce/checkout-forms/checkout-form-3-order-summary.tsx +0 -110
- package/src/blocks/e-commerce/checkout-forms/checkout-form-3-payment-step.tsx +0 -137
- package/src/blocks/e-commerce/checkout-forms/checkout-form-3-progress.tsx +0 -68
- package/src/blocks/e-commerce/checkout-forms/checkout-form-3-review-step.tsx +0 -79
- package/src/blocks/e-commerce/checkout-forms/checkout-form-3-shipping-step.tsx +0 -172
- package/src/blocks/e-commerce/checkout-forms/checkout-form-3.tsx +0 -392
- package/src/blocks/e-commerce/checkout-forms/checkout-form-types.ts +0 -7
- package/src/blocks/e-commerce/navigation/back-to-top.test.tsx +0 -27
- package/src/blocks/e-commerce/navigation/back-to-top.tsx +0 -71
- package/src/blocks/e-commerce/navigation/breadcrumb.test.tsx +0 -174
- package/src/blocks/e-commerce/navigation/breadcrumb.tsx +0 -130
- package/src/blocks/e-commerce/navigation/category-icon.test.tsx +0 -54
- package/src/blocks/e-commerce/navigation/category-icon.tsx +0 -94
- package/src/blocks/e-commerce/navigation/mega-menu.test.tsx +0 -139
- package/src/blocks/e-commerce/navigation/mega-menu.tsx +0 -271
- package/src/blocks/e-commerce/navigation/mobile-bottom-nav.test.tsx +0 -74
- package/src/blocks/e-commerce/navigation/mobile-bottom-nav.tsx +0 -78
- package/src/blocks/e-commerce/navigation/mobile-category-drawer.test.tsx +0 -192
- package/src/blocks/e-commerce/navigation/mobile-category-drawer.tsx +0 -278
- package/src/blocks/e-commerce/navigation/skip-to-content.test.tsx +0 -35
- package/src/blocks/e-commerce/navigation/skip-to-content.tsx +0 -37
- package/src/blocks/e-commerce/order-history/order-history-1.tsx +0 -159
- package/src/blocks/e-commerce/order-history/order-history-2.tsx +0 -222
- package/src/blocks/e-commerce/product-categories/category-card-grid.test.tsx +0 -122
- package/src/blocks/e-commerce/product-categories/category-card.test.tsx +0 -68
- package/src/blocks/e-commerce/product-categories/category-card.tsx +0 -172
- package/src/blocks/e-commerce/product-categories/category-grid.test.tsx +0 -67
- package/src/blocks/e-commerce/product-categories/category-shared.tsx +0 -109
- package/src/blocks/e-commerce/product-categories/product-category-grid.tsx +0 -170
- package/src/blocks/e-commerce/product-categories/product-category.test.tsx +0 -266
- package/src/blocks/e-commerce/product-categories/product-category.tsx +0 -462
- package/src/blocks/e-commerce/product-list/product-card.test.tsx +0 -263
- package/src/blocks/e-commerce/product-list/product-card.tsx +0 -424
- package/src/blocks/e-commerce/product-list/product-grid.test.tsx +0 -162
- package/src/blocks/e-commerce/product-list/product-grid.tsx +0 -114
- package/src/blocks/e-commerce/product-list/product-showcase-1.test.tsx +0 -78
- package/src/blocks/e-commerce/product-list/product-showcase-1.tsx +0 -277
- package/src/blocks/e-commerce/product-overview/product-overview-gallery.tsx +0 -71
- package/src/blocks/e-commerce/product-overview/product-overview-lightbox-tab.tsx +0 -116
- package/src/blocks/e-commerce/product-overview/product-overview-reviews-tab.tsx +0 -105
- package/src/blocks/e-commerce/product-overview/product-overview-tabs.tsx +0 -70
- package/src/blocks/e-commerce/product-overview/product-overview.test.tsx +0 -283
- package/src/blocks/e-commerce/product-overview/product-overview.tsx +0 -1186
- package/src/blocks/e-commerce/product-overview/product-quick-view-card.tsx +0 -135
- package/src/blocks/e-commerce/product-overview/product-quick-view-dialog.tsx +0 -393
- package/src/blocks/e-commerce/product-overview/product-quick-view.tsx +0 -136
- package/src/blocks/e-commerce/reviews/review-rating-1-review-form.tsx +0 -133
- package/src/blocks/e-commerce/reviews/review-rating-1.tsx +0 -178
- package/src/blocks/e-commerce/reviews/review-rating-2.tsx +0 -245
- package/src/blocks/e-commerce/shopping-carts/shopping-cart.test.tsx +0 -399
- package/src/blocks/e-commerce/shopping-carts/shopping-cart.tsx +0 -628
- package/src/blocks/e-commerce/store-containers/store-container-1.tsx +0 -29
- package/src/blocks/e-commerce/storefront-hero/storefront-hero.test.tsx +0 -412
- package/src/blocks/e-commerce/storefront-hero/storefront-hero.tsx +0 -1283
- package/src/blocks/marketing/banners/avatar-group.tsx +0 -69
- package/src/blocks/marketing/banners/banner-1.tsx +0 -188
- package/src/blocks/marketing/cta/cta-section-1.tsx +0 -112
- package/src/blocks/marketing/faq/faq-block-1.tsx +0 -45
- package/src/blocks/marketing/features/feature.test.tsx +0 -153
- package/src/blocks/marketing/features/feature.tsx +0 -195
- package/src/blocks/marketing/footers/footer-section-1.test.tsx +0 -117
- package/src/blocks/marketing/footers/footer-section-1.tsx +0 -178
- package/src/blocks/marketing/footers/footer-section-3.tsx +0 -192
- package/src/blocks/marketing/footers/footer-section-4.tsx +0 -355
- package/src/blocks/marketing/hero-sections/avatar-group.tsx +0 -86
- package/src/blocks/marketing/hero-sections/hero-section-1.tsx +0 -135
- package/src/blocks/marketing/logo-clouds/logo-cloud-1-logo-icon.tsx +0 -52
- package/src/blocks/marketing/logo-clouds/logo-cloud-1.tsx +0 -56
- package/src/blocks/marketing/navbars/navbar-1.tsx +0 -267
- package/src/blocks/marketing/navbars/navbar-2.tsx +0 -351
- package/src/blocks/marketing/navbars/navbar-3.tsx +0 -303
- package/src/blocks/marketing/navbars/navbar-4-account-menu.test.tsx +0 -56
- package/src/blocks/marketing/navbars/navbar-4-account-menu.tsx +0 -134
- package/src/blocks/marketing/navbars/navbar-4-cart-sheet.test.tsx +0 -204
- package/src/blocks/marketing/navbars/navbar-4-cart-sheet.tsx +0 -371
- package/src/blocks/marketing/navbars/navbar-4-like-button.tsx +0 -177
- package/src/blocks/marketing/navbars/navbar-4-mobile-nav.tsx +0 -104
- package/src/blocks/marketing/navbars/navbar-4-product-grid.tsx +0 -219
- package/src/blocks/marketing/navbars/navbar-4-search-bar.tsx +0 -52
- package/src/blocks/marketing/navbars/navbar-4.test.tsx +0 -264
- package/src/blocks/marketing/navbars/navbar-4.tsx +0 -604
- package/src/blocks/marketing/pricing/pricing-section-1.tsx +0 -94
- package/src/blocks/marketing/statistics/statistic-1.tsx +0 -93
- package/src/blocks/marketing/testimonials/testimonial-1.tsx +0 -141
- package/src/blocks/marketing/testimonials/testimonial-2.tsx +0 -108
- package/src/blocks/shared/reaction-toggle.tsx +0 -145
- package/src/hooks/use-mobile.ts +0 -19
- package/src/index.ts +0 -285
- package/src/lib/cart.test.ts +0 -15
- package/src/lib/contracts-curated.test.ts +0 -225
- package/src/lib/contracts-server-boundary.test.ts +0 -52
- package/src/lib/contracts.test.ts +0 -173
- package/src/lib/contracts.ts +0 -795
- package/src/lib/money.test.ts +0 -64
- package/src/lib/money.ts +0 -65
- package/src/lib/types/menu.ts +0 -43
- package/src/lib/types.ts +0 -4
- package/src/lib/utils.ts +0 -10
- package/src/ui/accordion.tsx +0 -65
- package/src/ui/badge.tsx +0 -47
- package/src/ui/breadcrumb.tsx +0 -108
- package/src/ui/button-group.tsx +0 -83
- package/src/ui/button.tsx +0 -63
- package/src/ui/card.tsx +0 -91
- package/src/ui/carousel.tsx +0 -241
- package/src/ui/dialog.tsx +0 -158
- package/src/ui/drawer.tsx +0 -134
- package/src/ui/dropdown-menu.tsx +0 -256
- package/src/ui/empty.tsx +0 -103
- package/src/ui/input-otp.tsx +0 -76
- package/src/ui/label.tsx +0 -23
- package/src/ui/pagination.tsx +0 -127
- package/src/ui/progress.tsx +0 -30
- package/src/ui/radio-group.tsx +0 -44
- package/src/ui/select.tsx +0 -189
- package/src/ui/separator.tsx +0 -27
- package/src/ui/sheet.tsx +0 -142
- package/src/ui/sidebar.tsx +0 -726
- package/src/ui/skeleton.tsx +0 -13
- package/src/ui/table.tsx +0 -115
- package/src/ui/toggle-group.tsx +0 -83
- package/src/ui/tooltip.tsx +0 -56
- package/tsconfig.build.json +0 -12
- package/tsconfig.json +0 -20
- package/tsup.config.ts +0 -19
- package/vitest.config.ts +0 -17
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { Eye, Star } from 'lucide-react'
|
|
4
|
-
|
|
5
|
-
import { Badge } from '../../../ui/badge'
|
|
6
|
-
import { Card, CardContent } from '../../../ui/card'
|
|
7
|
-
import { cn } from '../../../lib/utils'
|
|
8
|
-
|
|
9
|
-
import type { QuickViewProduct } from './product-quick-view'
|
|
10
|
-
|
|
11
|
-
const money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 })
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* One product in the grid, and the thing a quick view is meant to keep you inside of.
|
|
15
|
-
*
|
|
16
|
-
* The whole card is the button. A card that carries a separate "Quick view" link has two targets
|
|
17
|
-
* for one intention, and on a touch screen the hover-revealed one is a target that never appears
|
|
18
|
-
* at all - so the control is drawn on hover and focus as an *affordance*, while the press area
|
|
19
|
-
* is the entire card at every input type.
|
|
20
|
-
*/
|
|
21
|
-
export function ProductQuickViewCard({
|
|
22
|
-
product,
|
|
23
|
-
isActive,
|
|
24
|
-
onOpen,
|
|
25
|
-
}: {
|
|
26
|
-
product: QuickViewProduct
|
|
27
|
-
/** Whether this is the product currently open in the quick view. */
|
|
28
|
-
isActive: boolean
|
|
29
|
-
onOpen: () => void
|
|
30
|
-
}) {
|
|
31
|
-
const swatches = product.variants.find(variant => variant.options.some(option => option.swatch))?.options ?? []
|
|
32
|
-
|
|
33
|
-
return (
|
|
34
|
-
<Card
|
|
35
|
-
className={cn(
|
|
36
|
-
'group/card relative gap-0 overflow-hidden py-0 transition-shadow',
|
|
37
|
-
// The mark that survives behind the dialog: when the reader closes it, the card they
|
|
38
|
-
// were looking at is the one still lit, so the grid tells them where they got to.
|
|
39
|
-
isActive ? 'ring-primary ring-2' : 'hover:shadow-lg'
|
|
40
|
-
)}
|
|
41
|
-
>
|
|
42
|
-
<div className='bg-muted relative aspect-4/5 w-full overflow-hidden'>
|
|
43
|
-
<img
|
|
44
|
-
src={product.image || undefined}
|
|
45
|
-
alt={product.imageAlt}
|
|
46
|
-
className='size-full object-cover transition-transform duration-500 ease-out group-hover/card:scale-[1.03]'
|
|
47
|
-
loading='lazy'
|
|
48
|
-
decoding='async'
|
|
49
|
-
/>
|
|
50
|
-
|
|
51
|
-
{product.compareAt ? (
|
|
52
|
-
<Badge className='absolute top-3 left-3 rounded-full'>
|
|
53
|
-
{`${Math.round((1 - product.price / product.compareAt) * 100)}% de descuento`}
|
|
54
|
-
</Badge>
|
|
55
|
-
) : null}
|
|
56
|
-
|
|
57
|
-
{/*
|
|
58
|
-
Drawn on hover and focus, and never the thing that has to be hit. `pointer-events-none`
|
|
59
|
-
keeps every press on the card's own trigger underneath, so there is exactly one target
|
|
60
|
-
however the reader is pointing at it.
|
|
61
|
-
*/}
|
|
62
|
-
<div
|
|
63
|
-
aria-hidden='true'
|
|
64
|
-
className={cn(
|
|
65
|
-
'pointer-events-none absolute inset-x-0 bottom-0 flex justify-center p-3',
|
|
66
|
-
'translate-y-2 opacity-0 transition-[opacity,transform] duration-200 ease-out',
|
|
67
|
-
'group-hover/card:translate-y-0 group-hover/card:opacity-100',
|
|
68
|
-
'group-has-focus-visible/card:translate-y-0 group-has-focus-visible/card:opacity-100'
|
|
69
|
-
)}
|
|
70
|
-
>
|
|
71
|
-
<span className='bg-background/90 text-foreground ring-border flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium ring-1 backdrop-blur'>
|
|
72
|
-
<Eye className='size-4' />
|
|
73
|
-
Vista rápida
|
|
74
|
-
</span>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
|
|
78
|
-
{/*
|
|
79
|
-
The card's one interactive element, and it covers the card.
|
|
80
|
-
|
|
81
|
-
A stretched link would leave only the title actually pressable: the picture sits over a
|
|
82
|
-
pseudo-element and swallows every click on the image and on the Quick view pill. A real
|
|
83
|
-
element in the DOM, on top, with an explicit z-index, is unambiguous at every input type.
|
|
84
|
-
It is empty and carries an accessible name, so the price and rating underneath are not
|
|
85
|
-
read as part of the button's label.
|
|
86
|
-
*/}
|
|
87
|
-
<button
|
|
88
|
-
type='button'
|
|
89
|
-
onClick={onOpen}
|
|
90
|
-
aria-haspopup='dialog'
|
|
91
|
-
className='focus-visible:ring-ring/50 absolute inset-0 z-10 cursor-pointer rounded-xl outline-none focus-visible:ring-[3px]'
|
|
92
|
-
>
|
|
93
|
-
<span className='sr-only'>{`Vista rápida: ${product.name}`}</span>
|
|
94
|
-
</button>
|
|
95
|
-
|
|
96
|
-
<CardContent className='flex flex-col gap-1 p-4'>
|
|
97
|
-
<div className='flex items-start justify-between gap-3'>
|
|
98
|
-
<p className='text-base font-medium'>{product.name}</p>
|
|
99
|
-
|
|
100
|
-
<p className='shrink-0 text-base font-medium tabular-nums'>{money.format(product.price)}</p>
|
|
101
|
-
</div>
|
|
102
|
-
|
|
103
|
-
<p className='text-muted-foreground text-sm'>{product.tagline}</p>
|
|
104
|
-
|
|
105
|
-
<div className='mt-2 flex items-center justify-between gap-3'>
|
|
106
|
-
<p className='text-muted-foreground flex items-center gap-1.5 text-xs'>
|
|
107
|
-
{/* Foreground token per theming contract, never the only carrier of the rating. */}
|
|
108
|
-
<Star className='size-3.5 fill-foreground text-foreground' aria-hidden='true' />
|
|
109
|
-
<span className='text-foreground font-medium tabular-nums'>{product.rating}</span>
|
|
110
|
-
<span className='tabular-nums'>({product.reviewCount})</span>
|
|
111
|
-
</p>
|
|
112
|
-
|
|
113
|
-
{swatches.length > 0 ? (
|
|
114
|
-
<span className='flex items-center gap-1'>
|
|
115
|
-
{/*
|
|
116
|
-
Finish colours are product data, so they stay literal rather than tokenised, and
|
|
117
|
-
they are decoration here - the same information is in words inside the panel.
|
|
118
|
-
*/}
|
|
119
|
-
{swatches.map(option => (
|
|
120
|
-
<span
|
|
121
|
-
key={option.value}
|
|
122
|
-
aria-hidden='true'
|
|
123
|
-
className='ring-border size-3 rounded-full ring-1'
|
|
124
|
-
style={{ backgroundColor: option.swatch }}
|
|
125
|
-
/>
|
|
126
|
-
))}
|
|
127
|
-
</span>
|
|
128
|
-
) : null}
|
|
129
|
-
</div>
|
|
130
|
-
</CardContent>
|
|
131
|
-
</Card>
|
|
132
|
-
)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export default ProductQuickViewCard
|
|
@@ -1,393 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { useEffect, useMemo, useState } from 'react'
|
|
4
|
-
import { AnimatePresence, motion, useReducedMotion } from 'motion/react'
|
|
5
|
-
import { Check, Minus, Plus, Star } from 'lucide-react'
|
|
6
|
-
|
|
7
|
-
import { Badge } from '../../../ui/badge'
|
|
8
|
-
import { Button } from '../../../ui/button'
|
|
9
|
-
import { ButtonGroup, ButtonGroupText } from '../../../ui/button-group'
|
|
10
|
-
import {
|
|
11
|
-
Dialog,
|
|
12
|
-
DialogContent,
|
|
13
|
-
DialogDescription,
|
|
14
|
-
DialogHeader,
|
|
15
|
-
DialogTitle,
|
|
16
|
-
} from '../../../ui/dialog'
|
|
17
|
-
import { Separator } from '../../../ui/separator'
|
|
18
|
-
import { ToggleGroup, ToggleGroupItem } from '../../../ui/toggle-group'
|
|
19
|
-
|
|
20
|
-
import type { QuickViewProduct } from './product-quick-view'
|
|
21
|
-
|
|
22
|
-
const money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 })
|
|
23
|
-
|
|
24
|
-
/** How long the added-to-cart confirmation stays up before the button returns to its label. */
|
|
25
|
-
const confirmationMs = 2400
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* What a product opens on: its stated default where it has one, and otherwise the first option
|
|
29
|
-
* that is actually in stock — never a sold-out one, which would put the panel in a state whose
|
|
30
|
-
* add-to-cart button cannot honestly be pressed.
|
|
31
|
-
*/
|
|
32
|
-
function defaultSelection(product: QuickViewProduct): Record<string, string> {
|
|
33
|
-
return Object.fromEntries(
|
|
34
|
-
product.variants.map(variant => {
|
|
35
|
-
const stated = variant.options.find(
|
|
36
|
-
option => option.value === variant.defaultValue && option.available
|
|
37
|
-
)
|
|
38
|
-
const fallback = variant.options.find(option => option.available) ?? variant.options[0]
|
|
39
|
-
|
|
40
|
-
return [variant.key, (stated ?? fallback).value]
|
|
41
|
-
})
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* The panel a quick view opens, and the reason the pattern exists.
|
|
47
|
-
*
|
|
48
|
-
* A quick view is not a small product page. It is a promise that the reader will not lose the
|
|
49
|
-
* grid, so this one keeps the whole catalogue reachable from inside: the strip under the picture
|
|
50
|
-
* is the other products, not other angles of this one. Choosing from it re-dresses the panel
|
|
51
|
-
* around a new product, the grid behind marks where the reader has got to, and closing returns
|
|
52
|
-
* them to a grid they never actually left.
|
|
53
|
-
*/
|
|
54
|
-
export function ProductQuickViewDialog({
|
|
55
|
-
products,
|
|
56
|
-
activeIndex,
|
|
57
|
-
onActiveIndexChange,
|
|
58
|
-
onClose,
|
|
59
|
-
onAddToCart,
|
|
60
|
-
}: {
|
|
61
|
-
products: QuickViewProduct[]
|
|
62
|
-
/** Which product is open, or `null` when the dialog is closed. */
|
|
63
|
-
activeIndex: number | null
|
|
64
|
-
onActiveIndexChange: (index: number) => void
|
|
65
|
-
onClose: () => void
|
|
66
|
-
onAddToCart?: (
|
|
67
|
-
product: QuickViewProduct,
|
|
68
|
-
quantity: number,
|
|
69
|
-
selection: Record<string, string>
|
|
70
|
-
) => void
|
|
71
|
-
}) {
|
|
72
|
-
const reduceMotion = useReducedMotion()
|
|
73
|
-
const product = activeIndex === null ? null : products[activeIndex]
|
|
74
|
-
|
|
75
|
-
const [selection, setSelection] = useState<Record<string, string>>({})
|
|
76
|
-
const [quantity, setQuantity] = useState(1)
|
|
77
|
-
const [addedCount, setAddedCount] = useState(0)
|
|
78
|
-
|
|
79
|
-
/*
|
|
80
|
-
One effect keyed on the product's identity rather than three scattered resets. Carrying a
|
|
81
|
-
"brushed brass" across from a pendant to a sofa is worse than starting again, and a quantity
|
|
82
|
-
of four floor lamps should not become four sofas because the reader stepped sideways.
|
|
83
|
-
*/
|
|
84
|
-
useEffect(() => {
|
|
85
|
-
if (!product) {
|
|
86
|
-
return
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
setSelection(defaultSelection(product))
|
|
90
|
-
setQuantity(1)
|
|
91
|
-
setAddedCount(0)
|
|
92
|
-
}, [product?.id]) // eslint-disable-line react-hooks/exhaustive-deps
|
|
93
|
-
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
if (addedCount === 0) {
|
|
96
|
-
return
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const timer = setTimeout(() => setAddedCount(0), confirmationMs)
|
|
100
|
-
|
|
101
|
-
return () => clearTimeout(timer)
|
|
102
|
-
}, [addedCount])
|
|
103
|
-
|
|
104
|
-
/*
|
|
105
|
-
The chosen options in words, for the live region and the stock line. Built from the variant
|
|
106
|
-
order rather than from the selection object, so it reads the way the controls are stacked
|
|
107
|
-
instead of in whatever order the keys happen to sit in.
|
|
108
|
-
*/
|
|
109
|
-
const selectionSummary = useMemo(() => {
|
|
110
|
-
if (!product) {
|
|
111
|
-
return ''
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
return product.variants
|
|
115
|
-
.map(variant => variant.options.find(option => option.value === selection[variant.key])?.label)
|
|
116
|
-
.filter(Boolean)
|
|
117
|
-
.join(' · ')
|
|
118
|
-
}, [product, selection])
|
|
119
|
-
|
|
120
|
-
if (!product || activeIndex === null) {
|
|
121
|
-
return null
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const discount = product.compareAt ? Math.round((1 - product.price / product.compareAt) * 100) : null
|
|
125
|
-
|
|
126
|
-
return (
|
|
127
|
-
<Dialog open onOpenChange={next => !next && onClose()}>
|
|
128
|
-
{/*
|
|
129
|
-
`max-h` plus `overflow-y-auto` is what makes this usable below a laptop. The popup is
|
|
130
|
-
fixed and centred with a translate, so without a bound it grew past both edges of a phone
|
|
131
|
-
and the add-to-cart button ended up off the bottom of the screen with no way to reach it
|
|
132
|
-
— the page behind a fixed element cannot scroll to it either.
|
|
133
|
-
*/}
|
|
134
|
-
<DialogContent className='max-h-[92dvh] w-full overflow-y-auto p-0 sm:max-w-4xl md:h-[38rem] md:max-h-[92dvh] md:overflow-hidden'>
|
|
135
|
-
<DialogHeader className='sr-only'>
|
|
136
|
-
<DialogTitle>{product.name}</DialogTitle>
|
|
137
|
-
<DialogDescription>{product.description}</DialogDescription>
|
|
138
|
-
</DialogHeader>
|
|
139
|
-
|
|
140
|
-
{/*
|
|
141
|
-
A fixed height from `md`, and the detail column scrolls inside it.
|
|
142
|
-
|
|
143
|
-
The popup is centred with a -50% translate, so its height decides where its top edge
|
|
144
|
-
lands. Every product carries a different length of description and a different number
|
|
145
|
-
of variant rows, so stepping through the strip re-measured the panel and slid the whole
|
|
146
|
-
dialog up and down under the reader's cursor - the thumbnail they wanted next was no
|
|
147
|
-
longer where they were pointing. Holding the height still makes the strip a control
|
|
148
|
-
rather than a moving target. Below `md` the columns stack and the whole popup scrolls,
|
|
149
|
-
where a fixed height would be the wrong answer.
|
|
150
|
-
*/}
|
|
151
|
-
<div className='grid gap-0 md:h-full md:min-h-0 md:grid-cols-[minmax(0,0.95fr)_minmax(0,1fr)]'>
|
|
152
|
-
<div className='bg-muted/40 flex flex-col gap-3 p-4 sm:p-5 md:min-h-0 md:justify-center md:overflow-y-auto'>
|
|
153
|
-
{/*
|
|
154
|
-
The picture cross-fades rather than cutting. At this size a hard swap reads as a
|
|
155
|
-
flicker, and the fade is what ties the thumbnail that was pressed to the picture
|
|
156
|
-
that arrives.
|
|
157
|
-
*/}
|
|
158
|
-
<div className='bg-muted relative aspect-square w-full overflow-hidden rounded-lg'>
|
|
159
|
-
<AnimatePresence initial={false} mode='popLayout'>
|
|
160
|
-
<motion.img
|
|
161
|
-
key={product.id}
|
|
162
|
-
src={product.image || undefined}
|
|
163
|
-
alt={product.imageAlt}
|
|
164
|
-
className='absolute inset-0 size-full object-cover'
|
|
165
|
-
initial={reduceMotion ? false : { opacity: 0 }}
|
|
166
|
-
animate={{ opacity: 1 }}
|
|
167
|
-
exit={reduceMotion ? undefined : { opacity: 0 }}
|
|
168
|
-
transition={{ duration: 0.24, ease: 'easeOut' }}
|
|
169
|
-
decoding='async'
|
|
170
|
-
/>
|
|
171
|
-
</AnimatePresence>
|
|
172
|
-
|
|
173
|
-
<Badge variant='secondary' className='absolute top-3 left-3 rounded-full'>
|
|
174
|
-
{product.category}
|
|
175
|
-
</Badge>
|
|
176
|
-
</div>
|
|
177
|
-
|
|
178
|
-
{/*
|
|
179
|
-
`spacing={2}` rather than a `gap-2` class. A ToggleGroup at the default spacing of
|
|
180
|
-
zero is a segmented control: it strips the item radii, collapses the shared borders
|
|
181
|
-
and adds `px-2` to every item through a `group-data-[spacing=0]` selector that no
|
|
182
|
-
plain `p-0` utility can outrank. That padding around a small thumbnail was the odd
|
|
183
|
-
width and the odd gaps; asking for real spacing turns the whole rule off.
|
|
184
|
-
|
|
185
|
-
A ToggleGroup rather than a row of buttons for the same reason it is used for the
|
|
186
|
-
variants: single selection, roving focus and arrow-key movement, none of which a
|
|
187
|
-
loop of buttons gets without being told.
|
|
188
|
-
*/}
|
|
189
|
-
<ToggleGroup
|
|
190
|
-
type='multiple'
|
|
191
|
-
spacing={2}
|
|
192
|
-
value={[String(activeIndex)]}
|
|
193
|
-
onValueChange={value => value[0] && onActiveIndexChange(Number(value[0]))}
|
|
194
|
-
aria-label='Elegir producto'
|
|
195
|
-
className='grid w-full grid-cols-4'
|
|
196
|
-
>
|
|
197
|
-
{products.map((entry, index) => (
|
|
198
|
-
<ToggleGroupItem
|
|
199
|
-
key={entry.id}
|
|
200
|
-
value={String(index)}
|
|
201
|
-
aria-label={entry.name}
|
|
202
|
-
className='data-[state=on]:ring-primary size-auto min-w-0 overflow-hidden rounded-md p-0 ring-2 ring-transparent transition-shadow data-[state=on]:bg-transparent'
|
|
203
|
-
>
|
|
204
|
-
<img
|
|
205
|
-
src={entry.image || undefined}
|
|
206
|
-
alt=''
|
|
207
|
-
className='bg-muted aspect-square w-full object-cover'
|
|
208
|
-
loading='lazy'
|
|
209
|
-
decoding='async'
|
|
210
|
-
/>
|
|
211
|
-
</ToggleGroupItem>
|
|
212
|
-
))}
|
|
213
|
-
</ToggleGroup>
|
|
214
|
-
|
|
215
|
-
<p className='text-muted-foreground text-center font-mono text-xs tabular-nums'>
|
|
216
|
-
{`${activeIndex + 1} / ${products.length}`}
|
|
217
|
-
</p>
|
|
218
|
-
</div>
|
|
219
|
-
|
|
220
|
-
<div className='flex flex-col p-4 pt-5 sm:p-6 md:min-h-0 md:overflow-y-auto'>
|
|
221
|
-
<p className='text-muted-foreground text-xs tracking-[0.16em] uppercase'>{product.tagline}</p>
|
|
222
|
-
|
|
223
|
-
<h2 className='mt-2 text-2xl font-semibold tracking-tight text-balance'>{product.name}</h2>
|
|
224
|
-
|
|
225
|
-
<div className='mt-3 flex flex-wrap items-center gap-x-3 gap-y-2'>
|
|
226
|
-
<p className='text-xl font-semibold tabular-nums'>{money.format(product.price)}</p>
|
|
227
|
-
{product.compareAt ? (
|
|
228
|
-
<p className='text-muted-foreground text-sm line-through tabular-nums'>
|
|
229
|
-
{money.format(product.compareAt)}
|
|
230
|
-
</p>
|
|
231
|
-
) : null}
|
|
232
|
-
{discount ? (
|
|
233
|
-
<Badge variant='secondary' className='rounded-full font-normal'>{`${discount}% de descuento`}</Badge>
|
|
234
|
-
) : null}
|
|
235
|
-
<p className='text-muted-foreground flex items-center gap-1.5 text-sm'>
|
|
236
|
-
{/*
|
|
237
|
-
Rating stars use the foreground token so they inherit theme contrast,
|
|
238
|
-
matching storefront-hero-1 and review-rating-1. The rating number sits
|
|
239
|
-
right beside the star, so the star is never the only carrier.
|
|
240
|
-
*/}
|
|
241
|
-
<Star className='size-3.5 fill-foreground text-foreground' aria-hidden='true' />
|
|
242
|
-
<span className='text-foreground font-medium tabular-nums'>{product.rating}</span>
|
|
243
|
-
<span className='tabular-nums'>({product.reviewCount})</span>
|
|
244
|
-
</p>
|
|
245
|
-
</div>
|
|
246
|
-
|
|
247
|
-
<p className='text-muted-foreground mt-4 text-sm leading-6 text-pretty'>{product.description}</p>
|
|
248
|
-
|
|
249
|
-
<div className='mt-5 flex flex-col gap-5'>
|
|
250
|
-
{product.variants.map(variant => (
|
|
251
|
-
/*
|
|
252
|
-
A fieldset per variant, and a ToggleGroup inside it rather than a row of
|
|
253
|
-
Buttons with a hand-rolled `aria-pressed`. A loop of buttons has to fake single
|
|
254
|
-
selection and roving focus, and gets the focus order wrong the moment one of
|
|
255
|
-
them is disabled — which, with a sold-out finish, is most of them.
|
|
256
|
-
*/
|
|
257
|
-
<fieldset key={variant.key}>
|
|
258
|
-
<legend className='flex w-full items-baseline gap-2 text-sm font-medium'>
|
|
259
|
-
{variant.label}
|
|
260
|
-
<span className='text-muted-foreground font-normal'>
|
|
261
|
-
{variant.options.find(option => option.value === selection[variant.key])?.label}
|
|
262
|
-
</span>
|
|
263
|
-
</legend>
|
|
264
|
-
|
|
265
|
-
<ToggleGroup
|
|
266
|
-
type='multiple'
|
|
267
|
-
spacing={2}
|
|
268
|
-
variant='outline'
|
|
269
|
-
value={[selection[variant.key] ?? '']}
|
|
270
|
-
onValueChange={value =>
|
|
271
|
-
value[0] && setSelection(current => ({ ...current, [variant.key]: value[0] }))
|
|
272
|
-
}
|
|
273
|
-
aria-label={variant.label}
|
|
274
|
-
className='mt-2 flex-wrap'
|
|
275
|
-
>
|
|
276
|
-
{variant.options.map(option => (
|
|
277
|
-
<ToggleGroupItem
|
|
278
|
-
key={option.value}
|
|
279
|
-
value={option.value}
|
|
280
|
-
disabled={!option.available}
|
|
281
|
-
// Sold out is a word, not just a dimmed control.
|
|
282
|
-
aria-label={option.available ? option.label : `${option.label}, agotado`}
|
|
283
|
-
className='data-[state=on]:border-primary data-[state=on]:ring-primary/30 gap-2 data-[state=on]:ring-2'
|
|
284
|
-
>
|
|
285
|
-
{option.swatch ? (
|
|
286
|
-
<span
|
|
287
|
-
aria-hidden='true'
|
|
288
|
-
className='ring-border size-3 rounded-full ring-1'
|
|
289
|
-
style={{ backgroundColor: option.swatch }}
|
|
290
|
-
/>
|
|
291
|
-
) : null}
|
|
292
|
-
{option.label}
|
|
293
|
-
</ToggleGroupItem>
|
|
294
|
-
))}
|
|
295
|
-
</ToggleGroup>
|
|
296
|
-
</fieldset>
|
|
297
|
-
))}
|
|
298
|
-
</div>
|
|
299
|
-
|
|
300
|
-
<div className='mt-6 flex flex-wrap items-center gap-3'>
|
|
301
|
-
{/*
|
|
302
|
-
A ButtonGroup, so the stepper's shared border, its corner radii and its focus
|
|
303
|
-
stacking come from the component rather than from `rounded-r-none` by hand.
|
|
304
|
-
|
|
305
|
-
The readout is a `ButtonGroupText`, not a bare div. The group styles its children
|
|
306
|
-
through `[&>[data-slot]…]` selectors, so an element without a `data-slot` is
|
|
307
|
-
invisible to every one of them: it kept its own radius, lost no border where the
|
|
308
|
-
group expected a seam, and threw off which child counted as last - which is the
|
|
309
|
-
detached middle box with a stray rule under it.
|
|
310
|
-
*/}
|
|
311
|
-
<ButtonGroup aria-label='Cantidad'>
|
|
312
|
-
<Button
|
|
313
|
-
variant='outline'
|
|
314
|
-
size='icon'
|
|
315
|
-
aria-label='Reducir cantidad'
|
|
316
|
-
disabled={quantity <= 1}
|
|
317
|
-
onClick={() => setQuantity(current => Math.max(1, current - 1))}
|
|
318
|
-
>
|
|
319
|
-
<Minus />
|
|
320
|
-
</Button>
|
|
321
|
-
{/*
|
|
322
|
-
`aria-live` rather than a label: the number changes under the reader's own
|
|
323
|
-
button presses, and announcing it is the only way they hear the result.
|
|
324
|
-
*/}
|
|
325
|
-
<ButtonGroupText aria-live='polite' className='bg-background min-w-10 justify-center tabular-nums'>
|
|
326
|
-
{quantity}
|
|
327
|
-
</ButtonGroupText>
|
|
328
|
-
<Button
|
|
329
|
-
variant='outline'
|
|
330
|
-
size='icon'
|
|
331
|
-
aria-label='Aumentar cantidad'
|
|
332
|
-
onClick={() => setQuantity(current => current + 1)}
|
|
333
|
-
>
|
|
334
|
-
<Plus />
|
|
335
|
-
</Button>
|
|
336
|
-
</ButtonGroup>
|
|
337
|
-
|
|
338
|
-
<Button
|
|
339
|
-
className='flex-1'
|
|
340
|
-
onClick={() => {
|
|
341
|
-
setAddedCount(quantity)
|
|
342
|
-
onAddToCart?.(product, quantity, selection)
|
|
343
|
-
}}
|
|
344
|
-
>
|
|
345
|
-
{addedCount > 0 ? (
|
|
346
|
-
<>
|
|
347
|
-
<Check aria-hidden='true' />
|
|
348
|
-
Añadido al carrito
|
|
349
|
-
</>
|
|
350
|
-
) : (
|
|
351
|
-
`Añadir al carrito · ${money.format(product.price * quantity)}`
|
|
352
|
-
)}
|
|
353
|
-
</Button>
|
|
354
|
-
</div>
|
|
355
|
-
|
|
356
|
-
{product.unitsLeft ? (
|
|
357
|
-
<p className='text-muted-foreground mt-3 text-xs'>
|
|
358
|
-
{`Solo quedan ${product.unitsLeft} en ${selectionSummary || 'esta opción'}.`}
|
|
359
|
-
</p>
|
|
360
|
-
) : null}
|
|
361
|
-
|
|
362
|
-
{/* The one announcement, off-screen, that the visible confirmation stands in for. */}
|
|
363
|
-
<p role='status' aria-live='polite' className='sr-only'>
|
|
364
|
-
{addedCount > 0 ? `${addedCount} × ${product.name}, ${selectionSummary}, añadido a tu carrito` : ''}
|
|
365
|
-
</p>
|
|
366
|
-
|
|
367
|
-
<Separator className='mt-6' />
|
|
368
|
-
|
|
369
|
-
<ul className='text-muted-foreground mt-4 grid gap-1.5 text-sm sm:grid-cols-2'>
|
|
370
|
-
{product.details.map(detail => (
|
|
371
|
-
<li key={detail} className='flex items-start gap-2'>
|
|
372
|
-
<Check className='text-primary mt-0.5 size-3.5 shrink-0' aria-hidden='true' />
|
|
373
|
-
{detail}
|
|
374
|
-
</li>
|
|
375
|
-
))}
|
|
376
|
-
</ul>
|
|
377
|
-
|
|
378
|
-
{product.href ? (
|
|
379
|
-
<a
|
|
380
|
-
href={product.href}
|
|
381
|
-
className='text-muted-foreground hover:text-foreground focus-visible:ring-ring/50 mt-5 w-fit rounded-sm text-sm underline underline-offset-4 outline-none focus-visible:ring-[3px]'
|
|
382
|
-
>
|
|
383
|
-
Ver la página completa del producto
|
|
384
|
-
</a>
|
|
385
|
-
) : null}
|
|
386
|
-
</div>
|
|
387
|
-
</div>
|
|
388
|
-
</DialogContent>
|
|
389
|
-
</Dialog>
|
|
390
|
-
)
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
export default ProductQuickViewDialog
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { useId, useState } from 'react'
|
|
4
|
-
|
|
5
|
-
import { Badge } from '../../../ui/badge'
|
|
6
|
-
|
|
7
|
-
import { ProductQuickViewCard } from './product-quick-view-card'
|
|
8
|
-
import { ProductQuickViewDialog } from './product-quick-view-dialog'
|
|
9
|
-
|
|
10
|
-
export interface QuickViewOption {
|
|
11
|
-
value: string
|
|
12
|
-
label: string
|
|
13
|
-
available: boolean
|
|
14
|
-
/**
|
|
15
|
-
* A literal colour for a swatch, when the option is one.
|
|
16
|
-
*
|
|
17
|
-
* Finish colours are product data, not theme data: brass has to stay brass whatever preset the
|
|
18
|
-
* customizer is on. It is the one place in the block that is not a token, and the option's
|
|
19
|
-
* label always carries the same information in words.
|
|
20
|
-
*/
|
|
21
|
-
swatch?: string
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface QuickViewVariant {
|
|
25
|
-
key: string
|
|
26
|
-
label: string
|
|
27
|
-
/**
|
|
28
|
-
* Which option a product opens on.
|
|
29
|
-
*
|
|
30
|
-
* Not simply the first available one: sizes are listed smallest first, and the sofa is sold as
|
|
31
|
-
* the size its name promises, so the panel would otherwise open on an option that disagrees
|
|
32
|
-
* with the card the reader just pressed.
|
|
33
|
-
*/
|
|
34
|
-
defaultValue?: string
|
|
35
|
-
options: QuickViewOption[]
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface QuickViewProduct {
|
|
39
|
-
id: string
|
|
40
|
-
name: string
|
|
41
|
-
/** The one line that says what it is, under the name on the card and in the panel. */
|
|
42
|
-
tagline: string
|
|
43
|
-
category: string
|
|
44
|
-
price: number
|
|
45
|
-
compareAt?: number
|
|
46
|
-
rating: number
|
|
47
|
-
reviewCount: number
|
|
48
|
-
/** In stock, and low enough to be worth saying. Omitted when there is plenty. */
|
|
49
|
-
unitsLeft?: number
|
|
50
|
-
image: string
|
|
51
|
-
imageAlt: string
|
|
52
|
-
description: string
|
|
53
|
-
/** The panel shows these as a list, not as a specification table. */
|
|
54
|
-
details: string[]
|
|
55
|
-
variants: QuickViewVariant[]
|
|
56
|
-
/** Where the full product page lives. The panel only links to it when set. */
|
|
57
|
-
href?: string
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface ProductQuickViewProps {
|
|
61
|
-
products: QuickViewProduct[]
|
|
62
|
-
eyebrow?: string
|
|
63
|
-
heading?: string
|
|
64
|
-
lede?: string
|
|
65
|
-
/**
|
|
66
|
-
* Called with the chosen options when the reader adds to cart. When absent the button still
|
|
67
|
-
* shows and keeps its added-to-cart confirmation; it just has nowhere to report to.
|
|
68
|
-
*/
|
|
69
|
-
onAddToCart?: (
|
|
70
|
-
product: QuickViewProduct,
|
|
71
|
-
quantity: number,
|
|
72
|
-
selection: Record<string, string>
|
|
73
|
-
) => void
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* A product grid whose point is the panel that opens over it.
|
|
78
|
-
*
|
|
79
|
-
* One dialog serves the whole catalogue rather than one per card: the panel steps between
|
|
80
|
-
* products from inside, the card it is showing stays lit underneath, and closing puts the reader
|
|
81
|
-
* back exactly where the grid says they are.
|
|
82
|
-
*/
|
|
83
|
-
export function ProductQuickView({
|
|
84
|
-
products,
|
|
85
|
-
eyebrow = 'Novedades de la temporada',
|
|
86
|
-
heading = 'Todo lo que vale la pena saber, sin salir de la rejilla',
|
|
87
|
-
lede = 'Abre cualquier pieza para ver sus acabados, sus medidas y la respuesta a la pregunta que, de otro modo, te enviaría a la página del producto. Recorre el resto de la habitación desde dentro.',
|
|
88
|
-
onAddToCart,
|
|
89
|
-
}: ProductQuickViewProps) {
|
|
90
|
-
const [activeIndex, setActiveIndex] = useState<number | null>(null)
|
|
91
|
-
// A reusable block cannot carry a fixed heading id: two instances on a page would both claim it.
|
|
92
|
-
const headingId = useId()
|
|
93
|
-
|
|
94
|
-
return (
|
|
95
|
-
<section aria-labelledby={headingId} className='bg-background w-full py-16 sm:py-24'>
|
|
96
|
-
<div className='mx-auto w-full max-w-6xl px-4 sm:px-6 lg:px-8'>
|
|
97
|
-
<div className='flex max-w-2xl flex-col items-start'>
|
|
98
|
-
<Badge variant='outline' className='gap-2 rounded-full px-3'>
|
|
99
|
-
<span aria-hidden='true' className='bg-primary size-1.5 rounded-full' />
|
|
100
|
-
{eyebrow}
|
|
101
|
-
</Badge>
|
|
102
|
-
|
|
103
|
-
<h2
|
|
104
|
-
id={headingId}
|
|
105
|
-
className='mt-5 text-3xl font-semibold tracking-tight text-balance sm:text-4xl'
|
|
106
|
-
>
|
|
107
|
-
{heading}
|
|
108
|
-
</h2>
|
|
109
|
-
|
|
110
|
-
<p className='text-muted-foreground mt-4 text-base text-pretty'>{lede}</p>
|
|
111
|
-
</div>
|
|
112
|
-
|
|
113
|
-
<div className='mt-10 grid grid-cols-1 gap-5 sm:grid-cols-2 md:grid-cols-3 lg:mt-12'>
|
|
114
|
-
{products.map((product, index) => (
|
|
115
|
-
<ProductQuickViewCard
|
|
116
|
-
key={product.id}
|
|
117
|
-
product={product}
|
|
118
|
-
isActive={activeIndex === index}
|
|
119
|
-
onOpen={() => setActiveIndex(index)}
|
|
120
|
-
/>
|
|
121
|
-
))}
|
|
122
|
-
</div>
|
|
123
|
-
</div>
|
|
124
|
-
|
|
125
|
-
<ProductQuickViewDialog
|
|
126
|
-
products={products}
|
|
127
|
-
activeIndex={activeIndex}
|
|
128
|
-
onActiveIndexChange={setActiveIndex}
|
|
129
|
-
onClose={() => setActiveIndex(null)}
|
|
130
|
-
onAddToCart={onAddToCart}
|
|
131
|
-
/>
|
|
132
|
-
</section>
|
|
133
|
-
)
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export default ProductQuickView
|