@ecomiq/storefront 2.1.4 → 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 (310) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -103
  3. package/dist/account-Dx4e3syi.js +258 -0
  4. package/dist/account-forms-AVk71ko7.js +39 -0
  5. package/dist/account-forms.d.ts +13 -0
  6. package/dist/account.d.ts +240 -0
  7. package/dist/address-defaults-BqjRhS82.js +14 -0
  8. package/dist/address-defaults.d.ts +11 -0
  9. package/dist/analytics/analytics-CG1Qagwl.js +148 -0
  10. package/dist/analytics/analytics.d.ts +1 -0
  11. package/dist/analytics/config-DJr-GRhs.js +62 -0
  12. package/dist/analytics/config.d.ts +22 -0
  13. package/dist/analytics/consent-B13rBpBs.js +57 -0
  14. package/dist/analytics/consent-banner-9QvRRy8v.js +239 -0
  15. package/dist/analytics/consent-banner.d.ts +20 -0
  16. package/dist/analytics/cookies-pLozllyB.js +100 -0
  17. package/dist/analytics/cookies.d.ts +6 -0
  18. package/dist/analytics/destinations-iECrlLIr.js +144 -0
  19. package/dist/analytics/events-Dt81tIp1.js +102 -0
  20. package/dist/analytics/events.d.ts +51 -0
  21. package/dist/analytics/tracker-p4yaoOyk.js +51 -0
  22. package/dist/api-cache-DsuIn5hX.js +159 -0
  23. package/dist/bank-accounts-DlEczQQ5.js +81 -0
  24. package/dist/bank-accounts.d.ts +4 -0
  25. package/dist/captcha-DAqaIx8m.js +117 -0
  26. package/dist/captcha.d.ts +34 -0
  27. package/dist/cart-D7DxZ2lD.js +30 -0
  28. package/dist/cart-actions-Bsub_FFG.js +116 -0
  29. package/dist/cart-actions.d.ts +15 -0
  30. package/dist/cart-drawer-B7PPsR69.js +22 -0
  31. package/dist/cart-drawer.d.ts +9 -0
  32. package/dist/cart-form-y9P1r_EX.js +81 -0
  33. package/dist/cart-form.d.ts +24 -0
  34. package/dist/cart-summary-ur2VWKr-.js +89 -0
  35. package/dist/cart-summary.d.ts +31 -0
  36. package/dist/cart.d.ts +4 -0
  37. package/dist/catalog-7gJ-l5hW.js +67 -0
  38. package/dist/catalog-hooks-B7ZP4wYY.js +312 -0
  39. package/dist/catalog-hooks.d.ts +111 -0
  40. package/dist/catalog.d.ts +5 -0
  41. package/dist/checkout-DVWSXANi.js +474 -0
  42. package/dist/checkout-form-CbOIdENC.js +131 -0
  43. package/dist/checkout-form.d.ts +20 -0
  44. package/dist/checkout.d.ts +86 -0
  45. package/dist/complaint-book-BvwLvfx0.js +117 -0
  46. package/dist/complaint-book.d.ts +62 -0
  47. package/dist/culqi-authentication-BGr20vAJ.js +204 -0
  48. package/dist/culqi-authentication.d.ts +15 -0
  49. package/dist/culqi-checkout-CTXpKgp_.js +55 -0
  50. package/dist/culqi-three-ds-HP3mfrvV.js +33 -0
  51. package/dist/culqi-three-ds.d.ts +29 -0
  52. package/dist/customer-avatar-CJXSDroK.js +12 -0
  53. package/dist/customer-avatar.d.ts +5 -0
  54. package/dist/customer-cookies-DHOgFAMV.js +45 -0
  55. package/dist/customer-csrf-C1oDX-Py.js +17 -0
  56. package/dist/customer-csrf.d.ts +3 -0
  57. package/dist/customer-document-fields-C1K-_DAD.js +70 -0
  58. package/dist/customer-document-fields.d.ts +9 -0
  59. package/dist/customer-login-form-C7AC6vXd.js +144 -0
  60. package/dist/customer-login-form.d.ts +17 -0
  61. package/dist/customer-registration-form-BEm_NEfP.js +93 -0
  62. package/dist/customer-registration-form.d.ts +8 -0
  63. package/dist/document-url-CGsAl5Tf.js +9 -0
  64. package/dist/documents-T1mzc_j8.js +38 -0
  65. package/dist/documents.d.ts +16 -0
  66. package/dist/entries/account.d.ts +11 -0
  67. package/dist/entries/account.js +10 -0
  68. package/dist/entries/analytics.d.ts +6 -0
  69. package/dist/entries/analytics.js +5 -0
  70. package/dist/entries/cart.d.ts +8 -0
  71. package/dist/entries/cart.js +7 -0
  72. package/dist/entries/checkout.d.ts +12 -0
  73. package/dist/entries/checkout.js +11 -0
  74. package/dist/entries/order.d.ts +11 -0
  75. package/dist/entries/order.js +11 -0
  76. package/dist/favicon-YpyhVJ9H.js +28 -0
  77. package/dist/favicon.d.ts +4 -0
  78. package/dist/form-BtQcbXlJ.js +18 -0
  79. package/dist/form-contracts-BNpHaTGJ.js +166 -0
  80. package/dist/form-contracts.d.ts +42 -0
  81. package/dist/form.d.ts +3 -0
  82. package/dist/hidden-CCWtOWKR.js +3 -0
  83. package/dist/hidden.d.ts +4 -0
  84. package/dist/index.d.ts +50 -0
  85. package/dist/index.js +50 -0
  86. package/dist/invoice-fields-BG0HjL6T.js +103 -0
  87. package/dist/invoice-fields.d.ts +39 -0
  88. package/dist/links-kFxBZfdb.js +96 -0
  89. package/dist/links.d.ts +21 -0
  90. package/dist/mercadopago-checkout-DC7RXa8k.js +27 -0
  91. package/dist/mercadopago-dialog-UTQev0MG.js +180 -0
  92. package/dist/mercadopago-dialog.d.ts +21 -0
  93. package/dist/money-DtGOtDri.js +32 -0
  94. package/dist/money.d.ts +1 -0
  95. package/dist/optimistic-cart-BveVOHuh.js +53 -0
  96. package/dist/optimistic-cart.d.ts +16 -0
  97. package/dist/order-display-DTt5WBbc.js +112 -0
  98. package/dist/order-display.d.ts +20 -0
  99. package/dist/order-draft-DxV1Uhm3.js +38 -0
  100. package/dist/order-draft.d.ts +16 -0
  101. package/dist/order-pages-Dm6l5m0m.js +38 -0
  102. package/dist/order-pages.d.ts +12 -0
  103. package/dist/order-payment-continuation-D_d5PGA4.js +212 -0
  104. package/dist/order-payment-continuation.d.ts +10 -0
  105. package/dist/order-payment-in-review-x4gdLFHZ.js +65 -0
  106. package/dist/order-payment-in-review.d.ts +5 -0
  107. package/dist/order-status-BJXLJwxq.js +162 -0
  108. package/dist/order-status.d.ts +89 -0
  109. package/dist/order-view-9IlBg5AF.js +62 -0
  110. package/dist/order-view.d.ts +12 -0
  111. package/dist/page-action-Ctkf4xC6.js +7 -0
  112. package/dist/page-seo-a5FJl8x5.js +262 -0
  113. package/dist/page-seo.d.ts +34 -0
  114. package/dist/pages-Ca_Gt6mq.js +150 -0
  115. package/dist/pages.d.ts +45 -0
  116. package/dist/payment-dialog-frame-B-Q_xQ94.js +57 -0
  117. package/dist/payment-logo-BoPaGJc_.js +46 -0
  118. package/dist/payment-logo-svgs-By9lDTLK.js +20 -0
  119. package/dist/payment-logo.d.ts +11 -0
  120. package/dist/payment-logos-BYvdwYyJ.js +23 -0
  121. package/dist/payment-methods-B8ocTgFZ.js +73 -0
  122. package/dist/payment-methods.d.ts +58 -0
  123. package/dist/payment-return-5cjypwIw.js +7 -0
  124. package/dist/place-CmW4hBWY.js +13 -0
  125. package/dist/place.d.ts +4 -0
  126. package/dist/preview-BiIBif3C.js +427 -0
  127. package/dist/preview-address-Cf0sJ-9p.js +21 -0
  128. package/dist/preview-cart-Dg2CVktS.js +376 -0
  129. package/dist/product-preview-BspMAecJ.js +51 -0
  130. package/dist/product-preview.d.ts +5 -0
  131. package/dist/product-variants-BNDHvs1y.js +46 -0
  132. package/dist/product-variants.d.ts +12 -0
  133. package/dist/public-pages-XtwlaLwt.js +194 -0
  134. package/dist/public-pages.d.ts +67 -0
  135. package/dist/registration-CpDcv8ql.js +91 -0
  136. package/dist/registration.d.ts +12 -0
  137. package/dist/request-security-CRsRMgwj.js +76 -0
  138. package/dist/rich-text-M-Ju8RL4.js +9 -0
  139. package/dist/rich-text.d.ts +5 -0
  140. package/dist/route-text-DcJw2SsK.js +9 -0
  141. package/dist/route-text.d.ts +4 -0
  142. package/dist/section-preview-CmsMl3yu.js +83 -0
  143. package/dist/section-preview.d.ts +12 -0
  144. package/dist/sections/account-addresses.d.ts +18 -0
  145. package/dist/sections/account-addresses.js +375 -0
  146. package/dist/sections/account-order.d.ts +12 -0
  147. package/dist/sections/account-order.js +592 -0
  148. package/dist/sections/account-orders.d.ts +8 -0
  149. package/dist/sections/account-orders.js +359 -0
  150. package/dist/sections/account-profile.d.ts +16 -0
  151. package/dist/sections/account-profile.js +123 -0
  152. package/dist/sections/checkout.d.ts +24 -0
  153. package/dist/sections/checkout.js +963 -0
  154. package/dist/sections/complaint-book.d.ts +8 -0
  155. package/dist/sections/complaint-book.js +538 -0
  156. package/dist/sections/design-system.d.ts +1 -0
  157. package/dist/sections/design-system.js +310 -0
  158. package/dist/sections/draft-invoice.d.ts +20 -0
  159. package/dist/sections/draft-invoice.js +158 -0
  160. package/dist/sections/order-tracking.d.ts +19 -0
  161. package/dist/sections/order-tracking.js +141 -0
  162. package/dist/sections-CNUMWTF_.js +77 -0
  163. package/dist/sections.d.ts +19 -0
  164. package/dist/seo-GpDRhAAA.js +78 -0
  165. package/dist/session-CKvmFJyg.js +379 -0
  166. package/dist/session.d.ts +24 -0
  167. package/dist/settings-B0NO2A6Y.js +78 -0
  168. package/dist/settings.d.ts +51 -0
  169. package/dist/source-marker-DhqSkW7n.js +4 -0
  170. package/dist/sources-B-3JFJfb.js +46 -0
  171. package/dist/sources.d.ts +7 -0
  172. package/dist/store-8Q-_LFrQ.js +152 -0
  173. package/dist/store-contact--hY6CoFb.js +19 -0
  174. package/dist/store-contact.d.ts +6 -0
  175. package/dist/store.d.ts +17 -0
  176. package/dist/storefront-language-DrMjVbmk.js +29 -0
  177. package/dist/storefront-language.d.ts +14 -0
  178. package/dist/storefront-text-D25ae1qf.js +11 -0
  179. package/dist/storefront-text-en-ljjjSS4q.js +1030 -0
  180. package/dist/storefront-text-pt-BtHaJLcp.js +1030 -0
  181. package/dist/storefront-text.d.ts +4 -0
  182. package/dist/stripe-dialog-Ev9s3Z62.js +396 -0
  183. package/dist/stripe-dialog.d.ts +30 -0
  184. package/dist/telemetry-HuZXWBPi.js +114 -0
  185. package/dist/telemetry.d.ts +10 -0
  186. package/dist/templates-CAqoNyTW.js +40 -0
  187. package/dist/templates.d.ts +15 -0
  188. package/dist/urls-CpGQPxvf.js +71 -0
  189. package/dist/urls.d.ts +18 -0
  190. package/dist/use-checkout-CZcxXJXi.js +42 -0
  191. package/dist/use-checkout-payment-9R-zacrJ.js +80 -0
  192. package/dist/use-checkout-payment.d.ts +18 -0
  193. package/dist/use-checkout.d.ts +36 -0
  194. package/dist/use-culqi-checkout-CrjLAipU.js +109 -0
  195. package/dist/use-order-payment-BKIz_IO0.js +45 -0
  196. package/dist/use-order-payment.d.ts +18 -0
  197. package/dist/use-payment-token-CErx-tN-.js +105 -0
  198. package/dist/vite-payment-logos-kziu7wKb.js +27 -0
  199. package/dist/vite-payment-logos.d.ts +24 -0
  200. package/dist/vite-public-assets-DW2fgtVb.js +209 -0
  201. package/dist/vite-public-assets.d.ts +29 -0
  202. package/dist/vite-sections-DTBr0-Kg.js +464 -0
  203. package/dist/vite-sections.d.ts +21 -0
  204. package/dist/vite-theme-ui-BMO-CDi3.js +41 -0
  205. package/dist/vite-theme-ui.d.ts +10 -0
  206. package/dist/vite.d.ts +36 -0
  207. package/dist/vite.js +127 -0
  208. package/dist/voucher-payment-CVFDZ1L8.js +66 -0
  209. package/dist/worker-CNi-gzCu.js +86 -0
  210. package/dist/worker.d.ts +27 -0
  211. package/package.json +100 -76
  212. package/src/sections/account-addresses.tsx +215 -0
  213. package/src/sections/account-order.tsx +424 -0
  214. package/src/sections/account-orders.tsx +259 -0
  215. package/src/sections/account-profile.tsx +70 -0
  216. package/src/sections/checkout.tsx +586 -0
  217. package/src/sections/complaint-book.tsx +325 -0
  218. package/src/sections/design-system.tsx +146 -0
  219. package/src/sections/draft-invoice.tsx +105 -0
  220. package/src/sections/order-tracking.tsx +81 -0
  221. package/src/vite-client.d.ts +4 -0
  222. package/bin/ecomiq.mjs +0 -179
  223. package/public/design-bridge.js +0 -318
  224. package/src/api-proxy.ts +0 -194
  225. package/src/auth/create-storefront-auth.ts +0 -94
  226. package/src/auth/ecomiq-oauth-password-client.ts +0 -26
  227. package/src/auth/ecomiq-oauth-password-constants.ts +0 -24
  228. package/src/auth/ecomiq-oauth-password-plugin.ts +0 -294
  229. package/src/auth/ecomiq-oauth-password-types.ts +0 -24
  230. package/src/auth/ecomiq-storefront-sign-in.ts +0 -44
  231. package/src/auth/env.ts +0 -7
  232. package/src/auth/secure-cookies.ts +0 -23
  233. package/src/auth/storefront-auth-base-url.ts +0 -117
  234. package/src/auth/storefront-auth.ts +0 -7
  235. package/src/cart-session.ts +0 -239
  236. package/src/client.ts +0 -48
  237. package/src/codegen.mjs +0 -801
  238. package/src/components/account/customer-addresses-panel.tsx +0 -678
  239. package/src/components/account/customer-order-detail-panel.tsx +0 -285
  240. package/src/components/account/customer-orders-panel.tsx +0 -192
  241. package/src/components/account/customer-profile-panel.tsx +0 -379
  242. package/src/components/checkout/cart-sync.ts +0 -143
  243. package/src/components/checkout/checkout-contact-section.tsx +0 -76
  244. package/src/components/checkout/checkout-external-update-banner.tsx +0 -15
  245. package/src/components/checkout/checkout-form-controls.tsx +0 -139
  246. package/src/components/checkout/checkout-line-items.tsx +0 -43
  247. package/src/components/checkout/checkout-order-summary.tsx +0 -165
  248. package/src/components/checkout/checkout-payment-section.tsx +0 -212
  249. package/src/components/checkout/checkout-session-view.tsx +0 -564
  250. package/src/components/checkout/checkout-shipping-address-section.tsx +0 -400
  251. package/src/components/checkout/checkout-shipping-section.tsx +0 -98
  252. package/src/components/checkout/checkout-states.tsx +0 -73
  253. package/src/components/checkout/checkout-step-card.tsx +0 -101
  254. package/src/components/checkout/checkout-steps.ts +0 -111
  255. package/src/components/checkout/form-schema.ts +0 -281
  256. package/src/components/checkout/format.ts +0 -15
  257. package/src/components/checkout/index.ts +0 -5
  258. package/src/components/checkout/map-customer-to-checkout.ts +0 -188
  259. package/src/components/checkout/types.ts +0 -41
  260. package/src/components/checkout/use-checkout-customer-prefill.ts +0 -409
  261. package/src/components/checkout/use-checkout-geo.ts +0 -50
  262. package/src/components/checkout/use-checkout-session.ts +0 -640
  263. package/src/components/hero.tsx +0 -291
  264. package/src/config.d.ts +0 -94
  265. package/src/config.mjs +0 -146
  266. package/src/format-money.ts +0 -31
  267. package/src/health.ts +0 -90
  268. package/src/hooks/index.ts +0 -9
  269. package/src/hooks/recently-viewed.ts +0 -125
  270. package/src/index.ts +0 -349
  271. package/src/link.tsx +0 -2
  272. package/src/pages/account/account-page-skeleton.tsx +0 -69
  273. package/src/pages/account/account-page-view.tsx +0 -270
  274. package/src/pages/account/account-shell.tsx +0 -101
  275. package/src/pages/account/parse-account-route.ts +0 -36
  276. package/src/pages/account.tsx +0 -16
  277. package/src/pages/api.$.ts +0 -20
  278. package/src/pages/api.auth.$.ts +0 -16
  279. package/src/pages/checkout.$checkoutId.tsx +0 -60
  280. package/src/pages/checkout.tsx +0 -31
  281. package/src/pages/pages.$pageSlug.tsx +0 -74
  282. package/src/pages/thank-you.tsx +0 -53
  283. package/src/providers/auth.tsx +0 -96
  284. package/src/providers/cart.tsx +0 -275
  285. package/src/providers/ecomiq.ts +0 -137
  286. package/src/providers/index.ts +0 -26
  287. package/src/proxy-api.ts +0 -20
  288. package/src/public-config.ts +0 -24
  289. package/src/review-submission.ts +0 -89
  290. package/src/runtime/context.ts +0 -2
  291. package/src/runtime/default-layout.tsx +0 -64
  292. package/src/runtime/head.ts +0 -149
  293. package/src/runtime/page.tsx +0 -143
  294. package/src/runtime/postcss-browser-stub.mjs +0 -5
  295. package/src/server-config-store.ts +0 -35
  296. package/src/server.ts +0 -286
  297. package/src/styles.css +0 -76
  298. package/src/ui/badge.tsx +0 -32
  299. package/src/ui/button.tsx +0 -31
  300. package/src/ui/card.tsx +0 -31
  301. package/src/ui/carousel.tsx +0 -218
  302. package/src/ui/cn.ts +0 -6
  303. package/src/ui/index.ts +0 -8
  304. package/src/ui/separator.tsx +0 -6
  305. package/src/ui/skeleton.tsx +0 -6
  306. package/src/ui/storefront-error.tsx +0 -49
  307. package/src/utils.ts +0 -36
  308. package/src/vite-inline.mjs +0 -263
  309. package/templates/__root.tsx +0 -83
  310. package/templates/router.tsx +0 -19
package/src/styles.css DELETED
@@ -1,76 +0,0 @@
1
- /* Design system de Ecomiq — Tailwind v4 + tokens estilo shadcn.
2
- * `source(...)` fija el scan para que client y SSR generen el mismo CSS/hash. */
3
- @import 'tailwindcss' source('./');
4
-
5
- /* Escanear los componentes UI del propio framework */
6
- @source './ui';
7
- @source './components';
8
- @source './runtime';
9
- @source './pages';
10
- @source '../templates';
11
-
12
- @theme inline {
13
- --color-background: var(--background);
14
- --color-foreground: var(--foreground);
15
- --color-card: var(--card);
16
- --color-card-foreground: var(--card-foreground);
17
- --color-primary: var(--primary);
18
- --color-primary-foreground: var(--primary-foreground);
19
- --color-secondary: var(--secondary);
20
- --color-secondary-foreground: var(--secondary-foreground);
21
- --color-muted: var(--muted);
22
- --color-muted-foreground: var(--muted-foreground);
23
- --color-accent: var(--accent);
24
- --color-accent-foreground: var(--accent-foreground);
25
- --color-destructive: var(--destructive);
26
- --color-destructive-foreground: var(--destructive-foreground);
27
- --color-border: var(--border);
28
- --color-input: var(--input);
29
- --color-ring: var(--ring);
30
- --radius-lg: var(--radius);
31
- --radius-md: calc(var(--radius) - 2px);
32
- --radius-sm: calc(var(--radius) - 4px);
33
- }
34
-
35
- :root {
36
- --background: oklch(0.99 0.003 90);
37
- --foreground: oklch(0.2 0.02 260);
38
- --card: oklch(1 0 0);
39
- --card-foreground: oklch(0.2 0.02 260);
40
- --primary: oklch(0.45 0.15 165);
41
- --primary-foreground: oklch(0.98 0.01 165);
42
- --secondary: oklch(0.96 0.01 165);
43
- --secondary-foreground: oklch(0.3 0.05 165);
44
- --muted: oklch(0.96 0.005 90);
45
- --muted-foreground: oklch(0.5 0.02 260);
46
- --accent: oklch(0.94 0.03 165);
47
- --accent-foreground: oklch(0.3 0.05 165);
48
- --destructive: oklch(0.55 0.2 25);
49
- --destructive-foreground: oklch(0.98 0.01 25);
50
- --border: oklch(0.91 0.005 90);
51
- --input: oklch(0.91 0.005 90);
52
- --ring: oklch(0.45 0.15 165);
53
- --radius: 0.625rem;
54
- }
55
-
56
- * {
57
- border-color: var(--border);
58
- }
59
-
60
- ::selection {
61
- background: var(--accent);
62
- }
63
-
64
- :focus-visible {
65
- outline: 2px solid var(--ring);
66
- outline-offset: 2px;
67
- }
68
-
69
- @media (prefers-reduced-motion: reduce) {
70
- *,
71
- *::before,
72
- *::after {
73
- animation-duration: 0.01ms !important;
74
- transition-duration: 0.01ms !important;
75
- }
76
- }
package/src/ui/badge.tsx DELETED
@@ -1,32 +0,0 @@
1
- import type { ComponentProps, ReactNode } from 'react'
2
- import { cva, type VariantProps } from 'class-variance-authority'
3
- import { cn } from './cn'
4
-
5
- const badgeVariants = cva(
6
- 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-medium transition-colors',
7
- {
8
- variants: {
9
- variant: {
10
- default: 'border-transparent bg-primary text-primary-foreground',
11
- secondary: 'border-transparent bg-secondary text-secondary-foreground',
12
- outline: 'text-foreground',
13
- destructive: 'border-transparent bg-destructive text-destructive-foreground',
14
- },
15
- },
16
- defaultVariants: { variant: 'default' },
17
- },
18
- )
19
-
20
- export interface BadgeProps
21
- extends Omit<ComponentProps<'span'>, 'children'>,
22
- VariantProps<typeof badgeVariants> {
23
- children?: ReactNode
24
- }
25
-
26
- export function Badge({ className, variant, children, ...props }: BadgeProps) {
27
- return (
28
- <span className={cn(badgeVariants({ variant }), className)} {...props}>
29
- {children}
30
- </span>
31
- )
32
- }
package/src/ui/button.tsx DELETED
@@ -1,31 +0,0 @@
1
- import type { ComponentProps } from 'react'
2
- import { cva, type VariantProps } from 'class-variance-authority'
3
- import { cn } from './cn'
4
-
5
- export const buttonVariants = cva(
6
- 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0',
7
- {
8
- variants: {
9
- variant: {
10
- default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',
11
- secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
12
- outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
13
- ghost: 'hover:bg-accent hover:text-accent-foreground',
14
- destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
15
- },
16
- size: {
17
- default: 'h-9 px-4 py-2',
18
- sm: 'h-8 rounded-md px-3 text-xs',
19
- lg: 'h-10 rounded-md px-8',
20
- icon: 'h-9 w-9',
21
- },
22
- },
23
- defaultVariants: { variant: 'default', size: 'default' },
24
- },
25
- )
26
-
27
- export interface ButtonProps extends ComponentProps<'button'>, VariantProps<typeof buttonVariants> {}
28
-
29
- export function Button({ className, variant, size, type = 'button', ...props }: ButtonProps) {
30
- return <button type={type} className={cn(buttonVariants({ variant, size }), className)} {...props} />
31
- }
package/src/ui/card.tsx DELETED
@@ -1,31 +0,0 @@
1
- import type { ComponentProps } from 'react'
2
- import { cn } from './cn'
3
-
4
- export function Card({ className, ...props }: ComponentProps<'div'>) {
5
- return (
6
- <div
7
- className={cn('rounded-lg border bg-card text-card-foreground shadow-sm', className)}
8
- {...props}
9
- />
10
- )
11
- }
12
-
13
- export function CardHeader({ className, ...props }: ComponentProps<'div'>) {
14
- return <div className={cn('flex flex-col space-y-1.5 p-6', className)} {...props} />
15
- }
16
-
17
- export function CardTitle({ className, ...props }: ComponentProps<'h3'>) {
18
- return <h3 className={cn('font-semibold leading-none tracking-tight', className)} {...props} />
19
- }
20
-
21
- export function CardDescription({ className, ...props }: ComponentProps<'p'>) {
22
- return <p className={cn('text-sm text-muted-foreground', className)} {...props} />
23
- }
24
-
25
- export function CardContent({ className, ...props }: ComponentProps<'div'>) {
26
- return <div className={cn('p-6 pt-0', className)} {...props} />
27
- }
28
-
29
- export function CardFooter({ className, ...props }: ComponentProps<'div'>) {
30
- return <div className={cn('flex items-center p-6 pt-0', className)} {...props} />
31
- }
@@ -1,218 +0,0 @@
1
- import {
2
- Children,
3
- createContext,
4
- useCallback,
5
- useContext,
6
- useEffect,
7
- useMemo,
8
- useState,
9
- type HTMLAttributes,
10
- type ReactNode,
11
- } from 'react'
12
- import useEmblaCarousel, {
13
- type UseEmblaCarouselType,
14
- } from 'embla-carousel-react'
15
- import Autoplay from 'embla-carousel-autoplay'
16
- import Fade from 'embla-carousel-fade'
17
- import { ChevronLeft, ChevronRight } from 'lucide-react'
18
- import { cn } from './cn'
19
- import { Button } from './button'
20
-
21
- type EmblaCarouselApi = UseEmblaCarouselType[1]
22
-
23
- type CarouselContextValue = {
24
- api: EmblaCarouselApi | undefined
25
- selectedIndex: number
26
- scrollPrev: () => void
27
- scrollNext: () => void
28
- scrollTo: (index: number) => void
29
- slideCount: number
30
- }
31
-
32
- const CarouselContext = createContext<CarouselContextValue | null>(null)
33
-
34
- function useCarousel() {
35
- const ctx = useContext(CarouselContext)
36
- if (!ctx) throw new Error('Carousel components must be used within <Carousel>')
37
- return ctx
38
- }
39
-
40
- export type CarouselProps = {
41
- children: ReactNode
42
- className?: string
43
- /** Loop infinito. Default: true si hay más de un slide. */
44
- loop?: boolean
45
- /** Transición fade (Embla Fade). Default: false. */
46
- fade?: boolean
47
- /** Autoplay: delay en ms, o false para desactivar. Default: false. */
48
- autoplay?: number | false
49
- /** Flechas prev/next. Default: true si hay más de un slide. */
50
- showArrows?: boolean
51
- /** Dots de navegación. Default: true si hay más de un slide. */
52
- showDots?: boolean
53
- /** Etiqueta accesible del region. */
54
- 'aria-label'?: string
55
- } & Omit<HTMLAttributes<HTMLElement>, 'children'>
56
-
57
- export function Carousel({
58
- children,
59
- className,
60
- loop,
61
- fade = false,
62
- autoplay = false,
63
- showArrows,
64
- showDots,
65
- 'aria-label': ariaLabel = 'Carrusel',
66
- ...rest
67
- }: CarouselProps) {
68
- const slides = Children.toArray(children).filter(Boolean)
69
- const slideCount = slides.length
70
- const multi = slideCount > 1
71
- const shouldLoop = loop ?? multi
72
- const arrows = showArrows ?? multi
73
- const dots = showDots ?? multi
74
-
75
- const plugins = useMemo(() => {
76
- if (!multi) return []
77
- const list = []
78
- if (fade) list.push(Fade())
79
- if (autoplay !== false) {
80
- list.push(
81
- Autoplay({
82
- delay: typeof autoplay === 'number' ? autoplay : 6000,
83
- stopOnInteraction: false,
84
- stopOnMouseEnter: true,
85
- }),
86
- )
87
- }
88
- return list
89
- }, [multi, fade, autoplay])
90
-
91
- const [emblaRef, emblaApi] = useEmblaCarousel(
92
- { loop: shouldLoop, align: 'start', duration: 35 },
93
- plugins,
94
- )
95
-
96
- const [selectedIndex, setSelectedIndex] = useState(0)
97
-
98
- const resetAutoplay = useCallback(() => {
99
- const plugin = emblaApi?.plugins()?.autoplay
100
- if (plugin && 'reset' in plugin) plugin.reset()
101
- }, [emblaApi])
102
-
103
- const scrollPrev = useCallback(() => {
104
- emblaApi?.scrollPrev()
105
- resetAutoplay()
106
- }, [emblaApi, resetAutoplay])
107
-
108
- const scrollNext = useCallback(() => {
109
- emblaApi?.scrollNext()
110
- resetAutoplay()
111
- }, [emblaApi, resetAutoplay])
112
-
113
- const scrollTo = useCallback(
114
- (index: number) => {
115
- emblaApi?.scrollTo(index)
116
- resetAutoplay()
117
- },
118
- [emblaApi, resetAutoplay],
119
- )
120
-
121
- useEffect(() => {
122
- if (!emblaApi) return
123
- const onSelect = () => setSelectedIndex(emblaApi.selectedScrollSnap())
124
- onSelect()
125
- emblaApi.on('select', onSelect)
126
- emblaApi.on('reInit', onSelect)
127
- return () => {
128
- emblaApi.off('select', onSelect)
129
- emblaApi.off('reInit', onSelect)
130
- }
131
- }, [emblaApi])
132
-
133
- const value = useMemo(
134
- () => ({
135
- api: emblaApi,
136
- selectedIndex,
137
- scrollPrev,
138
- scrollNext,
139
- scrollTo,
140
- slideCount,
141
- }),
142
- [emblaApi, selectedIndex, scrollPrev, scrollNext, scrollTo, slideCount],
143
- )
144
-
145
- if (slideCount === 0) return null
146
-
147
- return (
148
- <CarouselContext.Provider value={value}>
149
- <section
150
- className={cn('group relative overflow-hidden', className)}
151
- aria-label={ariaLabel}
152
- role="region"
153
- aria-roledescription="carrusel"
154
- {...rest}
155
- >
156
- <div className="overflow-hidden" ref={emblaRef}>
157
- <div className="flex touch-pan-y">
158
- {slides.map((slide, index) => (
159
- <div key={index} className="relative min-w-0 flex-[0_0_100%]">
160
- {slide}
161
- </div>
162
- ))}
163
- </div>
164
- </div>
165
-
166
- {arrows ? (
167
- <div className="pointer-events-none absolute inset-x-0 top-1/2 z-20 flex -translate-y-1/2 justify-between px-4 md:px-8">
168
- <Button
169
- type="button"
170
- variant="outline"
171
- size="icon"
172
- onClick={scrollPrev}
173
- className="pointer-events-auto rounded-full border-white/20 bg-black/40 text-white shadow-sm backdrop-blur-sm hover:bg-black/60 hover:text-white"
174
- aria-label="Slide anterior"
175
- >
176
- <ChevronLeft />
177
- </Button>
178
- <Button
179
- type="button"
180
- variant="outline"
181
- size="icon"
182
- onClick={scrollNext}
183
- className="pointer-events-auto rounded-full border-white/20 bg-black/40 text-white shadow-sm backdrop-blur-sm hover:bg-black/60 hover:text-white"
184
- aria-label="Slide siguiente"
185
- >
186
- <ChevronRight />
187
- </Button>
188
- </div>
189
- ) : null}
190
-
191
- {dots ? (
192
- <div
193
- className="absolute bottom-6 left-1/2 z-20 flex -translate-x-1/2 gap-2 md:bottom-8"
194
- role="tablist"
195
- aria-label="Slides"
196
- >
197
- {slides.map((_, i) => (
198
- <button
199
- key={i}
200
- type="button"
201
- role="tab"
202
- aria-selected={i === selectedIndex}
203
- aria-label={`Slide ${i + 1}`}
204
- onClick={() => scrollTo(i)}
205
- className={cn(
206
- 'h-2 w-2 rounded-full border border-white/30 transition md:h-2.5 md:w-2.5',
207
- i === selectedIndex ? 'scale-110 bg-white' : 'bg-white/45 hover:bg-white/70',
208
- )}
209
- />
210
- ))}
211
- </div>
212
- ) : null}
213
- </section>
214
- </CarouselContext.Provider>
215
- )
216
- }
217
-
218
- export { useCarousel }
package/src/ui/cn.ts DELETED
@@ -1,6 +0,0 @@
1
- import { clsx, type ClassValue } from 'clsx'
2
- import { twMerge } from 'tailwind-merge'
3
-
4
- export function cn(...inputs: ClassValue[]) {
5
- return twMerge(clsx(inputs))
6
- }
package/src/ui/index.ts DELETED
@@ -1,8 +0,0 @@
1
- export { Button, buttonVariants, type ButtonProps } from './button'
2
- export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from './card'
3
- export { Badge, type BadgeProps } from './badge'
4
- export { Skeleton } from './skeleton'
5
- export { Separator } from './separator'
6
- export { Carousel, useCarousel, type CarouselProps } from './carousel'
7
- export { StorefrontError, type StorefrontErrorProps } from './storefront-error'
8
- export { cn } from './cn'
@@ -1,6 +0,0 @@
1
- import type { ComponentProps } from 'react'
2
- import { cn } from './cn'
3
-
4
- export function Separator({ className, ...props }: ComponentProps<'div'>) {
5
- return <div role="separator" className={cn('h-px w-full bg-border', className)} {...props} />
6
- }
@@ -1,6 +0,0 @@
1
- import type { ComponentProps } from 'react'
2
- import { cn } from './cn'
3
-
4
- export function Skeleton({ className, ...props }: ComponentProps<'div'>) {
5
- return <div className={cn('animate-pulse rounded-md bg-muted', className)} {...props} />
6
- }
@@ -1,49 +0,0 @@
1
- import { House, RefreshCw, TriangleAlert } from 'lucide-react'
2
- import { Button, buttonVariants } from './button'
3
-
4
- export interface StorefrontErrorProps {
5
- title?: string
6
- description?: string
7
- onRetry?: () => void
8
- returnTo?: string
9
- returnLabel?: string
10
- }
11
-
12
- export function StorefrontError({
13
- title = 'No pudimos cargar esta página',
14
- description = 'La tienda no respondió como esperábamos. Inténtalo nuevamente en unos segundos.',
15
- onRetry,
16
- returnTo = '/',
17
- returnLabel = 'Volver al inicio',
18
- }: StorefrontErrorProps) {
19
- return (
20
- <section className="mx-auto flex min-h-[55vh] w-full max-w-6xl items-center px-4 py-16" role="alert">
21
- <div className="w-full max-w-xl border-l-2 border-primary pl-5 sm:pl-7">
22
- <div className="mb-5 flex size-11 items-center justify-center rounded-lg bg-muted text-muted-foreground">
23
- <TriangleAlert className="size-5" aria-hidden="true" />
24
- </div>
25
- <p className="mb-2 text-xs font-semibold uppercase tracking-[0.16em] text-muted-foreground">
26
- Interrupción temporal
27
- </p>
28
- <h1 className="text-balance text-2xl font-semibold tracking-[-0.02em] sm:text-3xl">
29
- {title}
30
- </h1>
31
- <p className="mt-3 max-w-md text-sm leading-6 text-muted-foreground">
32
- {description}
33
- </p>
34
- <div className="mt-6 flex flex-wrap gap-2">
35
- {onRetry ? (
36
- <Button onClick={onRetry} className="min-h-10">
37
- <RefreshCw aria-hidden="true" />
38
- Intentar otra vez
39
- </Button>
40
- ) : null}
41
- <a href={returnTo} className={buttonVariants({ variant: 'outline' })}>
42
- <House aria-hidden="true" />
43
- {returnLabel}
44
- </a>
45
- </div>
46
- </div>
47
- </section>
48
- )
49
- }
package/src/utils.ts DELETED
@@ -1,36 +0,0 @@
1
- import type { StorefrontSettings } from "@ecomiq/core";
2
-
3
- type StorefrontCmsPage = StorefrontSettings['cms']['pages'][number]
4
-
5
- function isRenderableCmsPage(p: StorefrontCmsPage): boolean {
6
- return p.status === "published";
7
- }
8
-
9
- export function findStorefrontCmsPageBySlug(
10
- settings: StorefrontSettings | null | undefined,
11
- slug: string
12
- ) {
13
- const pages = settings?.cms?.pages;
14
- if (!pages?.length) return null;
15
- const raw = pages.find(
16
- (p) => p.slug === slug && isRenderableCmsPage(p)
17
- );
18
- if (!raw) return null;
19
- return raw;
20
- }
21
-
22
- export function cmsBranding(settings: StorefrontSettings | null | undefined) {
23
- return settings?.cms?.settings?.branding;
24
- }
25
-
26
- export function cmsSeo(settings: StorefrontSettings | null | undefined) {
27
- return settings?.cms?.settings?.seo;
28
- }
29
-
30
- export function storeDisplayName(settings: StorefrontSettings | null | undefined) {
31
- return settings?.store?.name ?? cmsSeo(settings)?.siteName;
32
- }
33
-
34
- export function storeSeoDescription(settings: StorefrontSettings | null | undefined) {
35
- return cmsSeo(settings)?.metaDescription ?? settings?.store?.description;
36
- }