create-brainerce-store 1.50.5 → 1.52.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 (230) hide show
  1. package/README.md +72 -0
  2. package/dist/index.js +146 -100
  3. package/messages/en.json +36 -1
  4. package/messages/he.json +36 -1
  5. package/package.json +1 -1
  6. package/templates/nextjs/base/.claude/commands/design.md +60 -0
  7. package/templates/nextjs/base/.env.local.ejs +5 -0
  8. package/templates/nextjs/base/.eslintrc.json +57 -3
  9. package/templates/nextjs/base/AGENTS.md +41 -0
  10. package/templates/nextjs/base/AI-GUIDE.md +143 -0
  11. package/templates/nextjs/base/CLAUDE.md +52 -0
  12. package/templates/nextjs/base/TRANSLATIONS.md +1 -1
  13. package/templates/nextjs/base/next.config.ts +2 -2
  14. package/templates/nextjs/base/package.json.ejs +52 -39
  15. package/templates/nextjs/base/src/app/account/page.tsx +5 -5
  16. package/templates/nextjs/base/src/app/api/auth/logout/route.ts +1 -1
  17. package/templates/nextjs/base/src/app/api/auth/reset-password/route.ts +2 -2
  18. package/templates/nextjs/base/src/app/api/store/[...path]/route.ts +1 -1
  19. package/templates/nextjs/base/src/app/auth/callback/page.tsx +4 -4
  20. package/templates/nextjs/base/src/app/blog/[slug]/page.tsx.ejs +4 -4
  21. package/templates/nextjs/base/src/app/blog/page.tsx.ejs +2 -2
  22. package/templates/nextjs/base/src/app/cart/page.tsx +2 -173
  23. package/templates/nextjs/base/src/app/checkout/page.tsx +12 -11
  24. package/templates/nextjs/base/src/app/contact/page.tsx +3 -3
  25. package/templates/nextjs/base/src/app/faq/page.tsx.ejs +2 -2
  26. package/templates/nextjs/base/src/app/forgot-password/page.tsx +4 -4
  27. package/templates/nextjs/base/src/app/globals.css +36 -30
  28. package/templates/nextjs/base/src/app/layout.tsx.ejs +12 -12
  29. package/templates/nextjs/base/src/app/login/page.tsx +4 -4
  30. package/templates/nextjs/base/src/app/order-confirmation/page.tsx +19 -12
  31. package/templates/nextjs/base/src/app/page.tsx +4 -4
  32. package/templates/nextjs/base/src/app/pages/[slug]/page.tsx.ejs +3 -3
  33. package/templates/nextjs/base/src/app/payment-complete/page.tsx +1 -1
  34. package/templates/nextjs/base/src/app/products/[slug]/page.tsx +6 -6
  35. package/templates/nextjs/base/src/app/products/page.tsx +4 -623
  36. package/templates/nextjs/base/src/app/register/page.tsx +4 -4
  37. package/templates/nextjs/base/src/app/reset-password/page.tsx +5 -5
  38. package/templates/nextjs/base/src/app/sitemap.ts +1 -1
  39. package/templates/nextjs/base/src/app/verify-email/page.tsx +5 -5
  40. package/templates/nextjs/base/src/components/account/address-book.tsx +3 -3
  41. package/templates/nextjs/base/src/components/account/order-customizations.tsx +3 -3
  42. package/templates/nextjs/base/src/components/account/order-history.tsx +13 -5
  43. package/templates/nextjs/base/src/components/account/order-payment-block.tsx +2 -2
  44. package/templates/nextjs/base/src/components/account/order-shipping-block.tsx +2 -2
  45. package/templates/nextjs/base/src/components/account/order-status-timeline.tsx +2 -2
  46. package/templates/nextjs/base/src/components/account/profile-section.tsx +3 -3
  47. package/templates/nextjs/base/src/components/auth/login-form.tsx +4 -4
  48. package/templates/nextjs/base/src/components/auth/oauth-buttons.tsx +4 -4
  49. package/templates/nextjs/base/src/components/auth/register-form.tsx +4 -4
  50. package/templates/nextjs/base/src/components/brainerce-bot.tsx +2 -2
  51. package/templates/nextjs/base/src/components/checkout/checkout-form.tsx +24 -3
  52. package/templates/nextjs/base/src/components/checkout/custom-fields-step.tsx +2 -2
  53. package/templates/nextjs/base/src/components/checkout/delivery-method-step.tsx +2 -2
  54. package/templates/nextjs/base/src/components/checkout/order-bump-card.tsx +4 -4
  55. package/templates/nextjs/base/src/components/checkout/payment-step.tsx +20 -16
  56. package/templates/nextjs/base/src/components/checkout/pickup-step.tsx +3 -3
  57. package/templates/nextjs/base/src/components/checkout/shipping-step.tsx +3 -3
  58. package/templates/nextjs/base/src/components/checkout/tax-display.tsx +3 -3
  59. package/templates/nextjs/base/src/components/seo/organization-json-ld.tsx +2 -2
  60. package/templates/nextjs/base/src/components/seo/product-json-ld.tsx +3 -3
  61. package/templates/nextjs/base/src/components/ui/accordion.tsx +53 -0
  62. package/templates/nextjs/base/src/components/ui/badge.tsx +32 -0
  63. package/templates/nextjs/base/src/components/ui/button.tsx +49 -0
  64. package/templates/nextjs/base/src/components/ui/card.tsx +55 -0
  65. package/templates/nextjs/base/src/components/ui/checkbox.tsx +28 -0
  66. package/templates/nextjs/base/src/components/ui/dialog.tsx +107 -0
  67. package/templates/nextjs/base/src/components/ui/input.tsx +22 -0
  68. package/templates/nextjs/base/src/components/ui/label.tsx +21 -0
  69. package/templates/nextjs/base/src/components/ui/radio-group.tsx +38 -0
  70. package/templates/nextjs/base/src/components/ui/select.tsx +153 -0
  71. package/templates/nextjs/base/src/components/ui/separator.tsx +26 -0
  72. package/templates/nextjs/base/src/components/ui/sheet.tsx +125 -0
  73. package/templates/nextjs/base/src/components/ui/skeleton.tsx +7 -0
  74. package/templates/nextjs/base/src/components/ui/tabs.tsx +55 -0
  75. package/templates/nextjs/base/src/components/ui/textarea.tsx +21 -0
  76. package/templates/nextjs/base/src/components/ui/tooltip.tsx +32 -0
  77. package/templates/nextjs/base/src/core/hooks/use-cart-page.ts +58 -0
  78. package/templates/nextjs/base/src/core/hooks/use-home-data.ts +51 -0
  79. package/templates/nextjs/base/src/core/hooks/use-product-listing.ts +295 -0
  80. package/templates/nextjs/base/src/core/hooks/use-product-page.ts +278 -0
  81. package/templates/nextjs/base/src/{hooks → core/hooks}/use-search.ts +1 -1
  82. package/templates/nextjs/base/src/{lib → core/lib}/brainerce.ts.ejs +1 -1
  83. package/templates/nextjs/base/src/core/lib/product-options.ts +121 -0
  84. package/templates/nextjs/base/src/{lib → core/lib}/resolve-currency.ts +1 -1
  85. package/templates/nextjs/base/src/{lib → core/lib}/safe-redirect.ts +1 -1
  86. package/templates/nextjs/base/src/{lib → core/lib}/sanitize.ts.ejs +1 -1
  87. package/templates/nextjs/base/src/{lib → core/lib}/use-currency.ts +1 -1
  88. package/templates/nextjs/base/src/{providers → core/providers}/store-provider.tsx.ejs +4 -4
  89. package/templates/nextjs/base/src/{components → ui}/cart/cart-bundle-offer.tsx +22 -16
  90. package/templates/nextjs/base/src/{components → ui}/cart/cart-item.tsx +8 -14
  91. package/templates/nextjs/base/src/{components → ui}/cart/cart-nudges.tsx +28 -39
  92. package/templates/nextjs/base/src/{components → ui}/cart/cart-summary.tsx +7 -5
  93. package/templates/nextjs/base/src/{components → ui}/cart/cart-upgrade-banner.tsx +13 -28
  94. package/templates/nextjs/base/src/ui/cart/cart-view.tsx +140 -0
  95. package/templates/nextjs/base/src/{components → ui}/cart/coupon-input.tsx +14 -25
  96. package/templates/nextjs/base/src/{components → ui}/cart/free-shipping-bar.tsx +6 -7
  97. package/templates/nextjs/base/src/{components → ui}/cart/reservation-countdown.tsx +95 -103
  98. package/templates/nextjs/base/src/ui/home/discount-banner-strip.tsx +20 -0
  99. package/templates/nextjs/base/src/ui/home/featured-products-section.tsx +24 -0
  100. package/templates/nextjs/base/src/ui/home/hero-section.tsx +27 -0
  101. package/templates/nextjs/base/src/ui/home/home-client.tsx +29 -0
  102. package/templates/nextjs/base/src/{components/content → ui/layout}/announcement-bar.tsx.ejs +116 -125
  103. package/templates/nextjs/base/src/ui/layout/faq-section.tsx.ejs +90 -0
  104. package/templates/nextjs/base/src/{components/content → ui/layout}/header-account.tsx +5 -20
  105. package/templates/nextjs/base/src/ui/layout/language-switcher.tsx.ejs +80 -0
  106. package/templates/nextjs/base/src/{components/content → ui/layout}/rich-text-block.tsx.ejs +1 -1
  107. package/templates/nextjs/base/src/{components/content → ui/layout}/site-footer.tsx.ejs +144 -164
  108. package/templates/nextjs/base/src/{components/content → ui/layout}/site-header.tsx.ejs +152 -182
  109. package/templates/nextjs/base/src/{components/products → ui/product}/customization-fields.tsx +457 -478
  110. package/templates/nextjs/base/src/{components/products → ui/product}/discount-badge.tsx +18 -22
  111. package/templates/nextjs/base/src/{components/products → ui/product}/frequently-bought-together.tsx +21 -33
  112. package/templates/nextjs/base/src/ui/product/modifier-group-selector.tsx +206 -0
  113. package/templates/nextjs/base/src/{components/shared → ui/product}/price-display.tsx +5 -4
  114. package/templates/nextjs/base/src/{components/products → ui/product}/product-card.tsx +238 -271
  115. package/templates/nextjs/base/src/{app/products/[slug] → ui/product}/product-client-section.tsx +455 -631
  116. package/templates/nextjs/base/src/{components/products → ui/product}/product-grid.tsx +3 -3
  117. package/templates/nextjs/base/src/ui/product/product-listing.tsx +446 -0
  118. package/templates/nextjs/base/src/{components/products → ui/product}/recommendation-section.tsx +102 -107
  119. package/templates/nextjs/base/src/{components/reviews → ui/product}/review-form.tsx +46 -45
  120. package/templates/nextjs/base/src/{components/reviews/reviews-section.tsx → ui/product/reviews-section.tsx.ejs} +38 -15
  121. package/templates/nextjs/base/src/{components/products → ui/product}/stock-badge.tsx +61 -63
  122. package/templates/nextjs/base/src/{components/products → ui/product}/variant-selector.tsx +3 -3
  123. package/templates/nextjs/base/src/{components → ui}/shared/cdn-image.tsx +1 -1
  124. package/templates/nextjs/base/src/{components → ui}/shared/loading-spinner.tsx +2 -2
  125. package/templates/nextjs/base/tailwind.config.ts +69 -30
  126. package/templates/nextjs/designs/atelier/app-overlay/layout.tsx.ejs +251 -0
  127. package/templates/nextjs/designs/atelier/globals.css +396 -0
  128. package/templates/nextjs/designs/atelier/messages-patch/en.json +99 -0
  129. package/templates/nextjs/designs/atelier/messages-patch/he.json +99 -0
  130. package/templates/nextjs/designs/atelier/ui/cart/cart-bundle-offer.tsx +110 -0
  131. package/templates/nextjs/designs/atelier/ui/cart/cart-drawer.tsx +163 -0
  132. package/templates/nextjs/designs/atelier/ui/cart/cart-item.tsx +140 -0
  133. package/templates/nextjs/designs/atelier/ui/cart/cart-nudges.tsx +34 -0
  134. package/templates/nextjs/designs/atelier/ui/cart/cart-summary.tsx +107 -0
  135. package/templates/nextjs/designs/atelier/ui/cart/cart-upgrade-banner.tsx +123 -0
  136. package/templates/nextjs/designs/atelier/ui/cart/cart-view.tsx +147 -0
  137. package/templates/nextjs/designs/atelier/ui/cart/coupon-input.tsx +142 -0
  138. package/templates/nextjs/designs/atelier/ui/cart/free-shipping-bar.tsx +77 -0
  139. package/templates/nextjs/designs/atelier/ui/cart/reservation-countdown.tsx +89 -0
  140. package/templates/nextjs/designs/atelier/ui/home/benefits-band.tsx +34 -0
  141. package/templates/nextjs/designs/atelier/ui/home/category-tiles.tsx +148 -0
  142. package/templates/nextjs/designs/atelier/ui/home/discount-banner-strip.tsx +27 -0
  143. package/templates/nextjs/designs/atelier/ui/home/editorial-band.tsx +73 -0
  144. package/templates/nextjs/designs/atelier/ui/home/featured-products-section.tsx +36 -0
  145. package/templates/nextjs/designs/atelier/ui/home/hero-section.tsx +148 -0
  146. package/templates/nextjs/designs/atelier/ui/home/home-client.tsx +54 -0
  147. package/templates/nextjs/designs/atelier/ui/home/newsletter-section.tsx +78 -0
  148. package/templates/nextjs/designs/atelier/ui/home/testimonials-band.tsx +46 -0
  149. package/templates/nextjs/designs/atelier/ui/layout/announcement-bar.tsx +118 -0
  150. package/templates/nextjs/designs/atelier/ui/layout/faq-section.tsx +96 -0
  151. package/templates/nextjs/designs/atelier/ui/layout/header-account.tsx +36 -0
  152. package/templates/nextjs/designs/atelier/ui/layout/header-cart.tsx +36 -0
  153. package/templates/nextjs/designs/atelier/ui/layout/language-switcher.tsx.ejs +137 -0
  154. package/templates/nextjs/designs/atelier/ui/layout/nav-url.ts +14 -0
  155. package/templates/nextjs/designs/atelier/ui/layout/rich-text-block.tsx +34 -0
  156. package/templates/nextjs/designs/atelier/ui/layout/site-footer.tsx.ejs +141 -0
  157. package/templates/nextjs/designs/atelier/ui/layout/site-header.tsx.ejs +138 -0
  158. package/templates/nextjs/designs/atelier/ui/product/customization-fields.tsx +466 -0
  159. package/templates/nextjs/designs/atelier/ui/product/discount-badge.tsx +17 -0
  160. package/templates/nextjs/designs/atelier/ui/product/frequently-bought-together.tsx +196 -0
  161. package/templates/nextjs/designs/atelier/ui/product/modifier-group-selector.tsx +193 -0
  162. package/templates/nextjs/designs/atelier/ui/product/price-display.tsx +69 -0
  163. package/templates/nextjs/designs/atelier/ui/product/product-card.tsx +260 -0
  164. package/templates/nextjs/designs/atelier/ui/product/product-client-section.tsx +471 -0
  165. package/templates/nextjs/designs/atelier/ui/product/product-grid.tsx +47 -0
  166. package/templates/nextjs/designs/atelier/ui/product/product-listing.tsx +260 -0
  167. package/templates/nextjs/designs/atelier/ui/product/recommendation-section.tsx +95 -0
  168. package/templates/nextjs/designs/atelier/ui/product/review-form.tsx +267 -0
  169. package/templates/nextjs/designs/atelier/ui/product/reviews-section.tsx.ejs +148 -0
  170. package/templates/nextjs/designs/atelier/ui/product/stock-badge.tsx +66 -0
  171. package/templates/nextjs/designs/atelier/ui/product/variant-selector.tsx +206 -0
  172. package/templates/nextjs/designs/atelier/ui/shared/cdn-image.tsx +29 -0
  173. package/templates/nextjs/designs/atelier/ui/shared/fly-to-cart.ts +86 -0
  174. package/templates/nextjs/designs/atelier/ui/shared/icons.tsx +269 -0
  175. package/templates/nextjs/designs/atelier/ui/shared/loading-spinner.tsx +64 -0
  176. package/templates/nextjs/designs/atelier/ui/shared/reveal.tsx +71 -0
  177. package/templates/nextjs/designs/atelier/ui/shared/select-menu.tsx +125 -0
  178. package/templates/nextjs/themes/luxury/globals.css +405 -399
  179. package/templates/nextjs/themes/minimal/globals.css +36 -30
  180. package/templates/nextjs/themes/playful/globals.css +406 -400
  181. package/templates/nextjs/ui-canvas/cart/cart-bundle-offer.tsx +89 -0
  182. package/templates/nextjs/ui-canvas/cart/cart-item.tsx +123 -0
  183. package/templates/nextjs/ui-canvas/cart/cart-nudges.tsx +27 -0
  184. package/templates/nextjs/ui-canvas/cart/cart-summary.tsx +99 -0
  185. package/templates/nextjs/ui-canvas/cart/cart-upgrade-banner.tsx +105 -0
  186. package/templates/nextjs/ui-canvas/cart/cart-view.tsx +106 -0
  187. package/templates/nextjs/ui-canvas/cart/coupon-input.tsx +119 -0
  188. package/templates/nextjs/ui-canvas/cart/free-shipping-bar.tsx +54 -0
  189. package/templates/nextjs/ui-canvas/cart/reservation-countdown.tsx +81 -0
  190. package/templates/nextjs/ui-canvas/home/discount-banner-strip.tsx +19 -0
  191. package/templates/nextjs/ui-canvas/home/featured-products-section.tsx +23 -0
  192. package/templates/nextjs/ui-canvas/home/hero-section.tsx +21 -0
  193. package/templates/nextjs/ui-canvas/home/home-client.tsx +26 -0
  194. package/templates/nextjs/ui-canvas/layout/announcement-bar.tsx.ejs +101 -0
  195. package/templates/nextjs/ui-canvas/layout/faq-section.tsx.ejs +71 -0
  196. package/templates/nextjs/ui-canvas/layout/header-account.tsx +31 -0
  197. package/templates/nextjs/{base/src/components → ui-canvas}/layout/language-switcher.tsx.ejs +76 -70
  198. package/templates/nextjs/ui-canvas/layout/rich-text-block.tsx.ejs +36 -0
  199. package/templates/nextjs/ui-canvas/layout/site-footer.tsx.ejs +82 -0
  200. package/templates/nextjs/ui-canvas/layout/site-header.tsx.ejs +119 -0
  201. package/templates/nextjs/ui-canvas/product/customization-fields.tsx +445 -0
  202. package/templates/nextjs/ui-canvas/product/discount-badge.tsx +19 -0
  203. package/templates/nextjs/ui-canvas/product/frequently-bought-together.tsx +168 -0
  204. package/templates/nextjs/ui-canvas/product/modifier-group-selector.tsx +165 -0
  205. package/templates/nextjs/ui-canvas/product/price-display.tsx +52 -0
  206. package/templates/nextjs/ui-canvas/product/product-card.tsx +197 -0
  207. package/templates/nextjs/ui-canvas/product/product-client-section.tsx +352 -0
  208. package/templates/nextjs/ui-canvas/product/product-grid.tsx +27 -0
  209. package/templates/nextjs/ui-canvas/product/product-listing.tsx +224 -0
  210. package/templates/nextjs/ui-canvas/product/recommendation-section.tsx +99 -0
  211. package/templates/nextjs/ui-canvas/product/review-form.tsx +266 -0
  212. package/templates/nextjs/ui-canvas/product/reviews-section.tsx.ejs +96 -0
  213. package/templates/nextjs/ui-canvas/product/stock-badge.tsx +45 -0
  214. package/templates/nextjs/ui-canvas/product/variant-selector.tsx +212 -0
  215. package/templates/nextjs/ui-canvas/shared/cdn-image.tsx +31 -0
  216. package/templates/nextjs/ui-canvas/shared/loading-spinner.tsx +27 -0
  217. package/templates/nextjs/base/src/app/home-client.tsx +0 -98
  218. package/templates/nextjs/base/src/components/content/faq-section.tsx.ejs +0 -103
  219. package/templates/nextjs/base/src/components/products/modifier-group-selector.tsx +0 -238
  220. /package/templates/nextjs/base/src/{lib → core/lib}/auth.ts +0 -0
  221. /package/templates/nextjs/base/src/{lib → core/lib}/csrf.ts +0 -0
  222. /package/templates/nextjs/base/src/{lib → core/lib}/image-hosts.ts +0 -0
  223. /package/templates/nextjs/base/src/{lib → core/lib}/navigation.tsx.ejs +0 -0
  224. /package/templates/nextjs/base/src/{lib → core/lib}/nonce.ts +0 -0
  225. /package/templates/nextjs/base/src/{lib → core/lib}/sanitize-html.ts +0 -0
  226. /package/templates/nextjs/base/src/{lib → core/lib}/seo.ts +0 -0
  227. /package/templates/nextjs/base/src/{lib → core/lib}/store-info.ts +0 -0
  228. /package/templates/nextjs/base/src/{lib → core/lib}/translations.ts.ejs +0 -0
  229. /package/templates/nextjs/base/src/{lib → core/lib}/utils.ts +0 -0
  230. /package/templates/nextjs/base/src/{lib → core/lib}/validation.ts +0 -0
@@ -1,400 +1,406 @@
1
- @tailwind base;
2
- @tailwind components;
3
- @tailwind utilities;
4
-
5
- @layer base {
6
- :root {
7
- --background: 0 0% 99%;
8
- --foreground: 260 25% 16%;
9
- --primary: 330 75% 56%;
10
- --primary-foreground: 0 0% 100%;
11
- --secondary: 260 50% 94%;
12
- --secondary-foreground: 260 25% 16%;
13
- --muted: 270 30% 95%;
14
- --muted-foreground: 260 10% 45%;
15
- --accent: 280 60% 60%;
16
- --accent-foreground: 0 0% 100%;
17
- --destructive: 0 84% 60%;
18
- --destructive-foreground: 0 0% 100%;
19
- --border: 270 20% 88%;
20
- --radius: 1rem;
21
-
22
- /* Playful-specific tokens */
23
- --pink: 330 75% 56%;
24
- --purple: 280 60% 60%;
25
- --lavender: 260 50% 94%;
26
- --peach: 20 80% 88%;
27
- --mint: 160 50% 88%;
28
- }
29
-
30
- * {
31
- @apply border-border;
32
- }
33
-
34
- body {
35
- @apply bg-background text-foreground antialiased;
36
- line-height: 1.65;
37
- }
38
-
39
- /* Playful typography — friendly, bold, tight */
40
- h1,
41
- h2,
42
- h3,
43
- h4 {
44
- font-weight: 700;
45
- letter-spacing: -0.02em;
46
- line-height: 1.2;
47
- }
48
-
49
- h1 {
50
- font-weight: 800;
51
- letter-spacing: -0.03em;
52
- }
53
-
54
- /* Fun colorful selection */
55
- ::selection {
56
- background: hsl(var(--pink) / 0.25);
57
- color: hsl(260 25% 16%);
58
- }
59
-
60
- /* Colorful focus rings */
61
- :focus-visible {
62
- outline: 2.5px solid hsl(var(--purple));
63
- outline-offset: 3px;
64
- border-radius: var(--radius);
65
- }
66
-
67
- /* Playful scrollbar */
68
- ::-webkit-scrollbar {
69
- width: 8px;
70
- }
71
-
72
- ::-webkit-scrollbar-track {
73
- background: hsl(var(--lavender));
74
- }
75
-
76
- ::-webkit-scrollbar-thumb {
77
- background: linear-gradient(
78
- 180deg,
79
- hsl(var(--pink)),
80
- hsl(var(--purple))
81
- );
82
- border-radius: 999px;
83
- }
84
- }
85
-
86
- @layer components {
87
- /* ─── Buttons ─── */
88
-
89
- /* Primary CTA — gradient with bounce and glow */
90
- button[class*="bg-primary"],
91
- a[class*="bg-primary"] {
92
- font-weight: 700;
93
- letter-spacing: 0.01em;
94
- background: linear-gradient(
95
- 135deg,
96
- hsl(var(--pink)),
97
- hsl(330 80% 52%),
98
- hsl(var(--purple))
99
- ) !important;
100
- background-size: 200% 200%;
101
- box-shadow:
102
- 0 4px 14px hsl(var(--pink) / 0.3),
103
- 0 2px 6px hsl(var(--purple) / 0.15);
104
- transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
105
- border: none;
106
- }
107
-
108
- button[class*="bg-primary"]:hover,
109
- a[class*="bg-primary"]:hover {
110
- transform: translateY(-3px) scale(1.03);
111
- box-shadow:
112
- 0 8px 28px hsl(var(--pink) / 0.4),
113
- 0 4px 12px hsl(var(--purple) / 0.2);
114
- background-position: 100% 0;
115
- opacity: 1 !important;
116
- }
117
-
118
- button[class*="bg-primary"]:active,
119
- a[class*="bg-primary"]:active {
120
- transform: translateY(0) scale(0.97);
121
- box-shadow: 0 2px 8px hsl(var(--pink) / 0.2);
122
- }
123
-
124
- /* Secondary buttons — soft pill with hover pop */
125
- [class*="bg-secondary"] {
126
- border-radius: 999px !important;
127
- font-weight: 600;
128
- transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
129
- }
130
-
131
- [class*="bg-secondary"]:hover {
132
- background: hsl(var(--lavender)) !important;
133
- transform: translateY(-2px);
134
- box-shadow: 0 4px 16px hsl(var(--purple) / 0.12);
135
- }
136
-
137
- /* ─── Product Cards ─── */
138
-
139
- [class*="group"][class*="border"] {
140
- border-radius: var(--radius);
141
- overflow: hidden;
142
- border: 2px solid hsl(var(--border));
143
- background: white;
144
- transition: all 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
145
- }
146
-
147
- [class*="group"][class*="border"]:hover {
148
- transform: translateY(-6px) rotate(-0.5deg);
149
- border-color: hsl(var(--pink) / 0.3);
150
- box-shadow:
151
- 0 16px 40px hsl(var(--purple) / 0.12),
152
- 0 6px 16px hsl(var(--pink) / 0.1);
153
- }
154
-
155
- /* Product image hover — fun overshoot zoom */
156
- [class*="group-hover\\:scale-105"] {
157
- transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important;
158
- }
159
-
160
- [class*="group"]:hover [class*="group-hover\\:scale-105"] {
161
- transform: scale(1.08) !important;
162
- }
163
-
164
- /* ─── Form Elements ─── */
165
-
166
- input[class*="border-border"],
167
- select[class*="border-border"],
168
- textarea[class*="border-border"] {
169
- border-radius: var(--radius);
170
- border-width: 2px;
171
- transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
172
- }
173
-
174
- input[class*="border-border"]:focus,
175
- select[class*="border-border"]:focus,
176
- textarea[class*="border-border"]:focus {
177
- border-color: hsl(var(--purple)) !important;
178
- box-shadow: 0 0 0 4px hsl(var(--purple) / 0.1);
179
- transform: scale(1.01);
180
- }
181
-
182
- input::placeholder,
183
- textarea::placeholder {
184
- color: hsl(var(--muted-foreground) / 0.6);
185
- }
186
-
187
- /* ─── Navigation & Header ─── */
188
-
189
- header[class*="sticky"] {
190
- border-bottom: none !important;
191
- box-shadow: 0 4px 20px hsl(var(--purple) / 0.06);
192
- background: hsl(0 0% 99% / 0.9) !important;
193
- backdrop-filter: blur(10px);
194
- }
195
-
196
- /* Nav link hover — colorful underline */
197
- nav a {
198
- position: relative;
199
- font-weight: 600;
200
- transition: color 0.2s ease;
201
- }
202
-
203
- nav a::after {
204
- content: '';
205
- position: absolute;
206
- bottom: -2px;
207
- left: 50%;
208
- width: 0;
209
- height: 3px;
210
- background: linear-gradient(90deg, hsl(var(--pink)), hsl(var(--purple)));
211
- border-radius: 999px;
212
- transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
213
- transform: translateX(-50%);
214
- }
215
-
216
- nav a:hover::after {
217
- width: 100%;
218
- }
219
-
220
- nav a:hover {
221
- color: hsl(var(--pink));
222
- }
223
-
224
- /* ─── Badges & Tags ─── */
225
-
226
- /* Category/filter pills */
227
- [class*="bg-muted"][class*="text-xs"] {
228
- border-radius: 999px;
229
- font-weight: 700;
230
- padding-left: 0.85rem;
231
- padding-right: 0.85rem;
232
- transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
233
- }
234
-
235
- [class*="bg-muted"][class*="text-xs"]:hover {
236
- background: hsl(var(--lavender)) !important;
237
- transform: scale(1.05);
238
- }
239
-
240
- /* Sale/discount badges — fun wiggle + pill */
241
- [class*="bg-destructive"] {
242
- border-radius: 999px;
243
- font-weight: 800;
244
- box-shadow: 0 2px 8px hsl(0 84% 60% / 0.3);
245
- animation: playful-wiggle 3s ease-in-out infinite;
246
- }
247
-
248
- /* ─── Price Display ─── */
249
-
250
- [class*="font-bold"][class*="text-lg"],
251
- [class*="font-bold"][class*="text-xl"],
252
- [class*="font-bold"][class*="text-2xl"] {
253
- color: hsl(var(--pink));
254
- }
255
-
256
- /* Strikethrough — more playful */
257
- [class*="line-through"] {
258
- opacity: 0.4;
259
- text-decoration-color: hsl(var(--purple) / 0.4);
260
- text-decoration-thickness: 2px;
261
- }
262
-
263
- /* ─── Dividers ─── */
264
-
265
- hr {
266
- border: none;
267
- height: 3px;
268
- background: linear-gradient(
269
- 90deg,
270
- transparent,
271
- hsl(var(--lavender)),
272
- hsl(var(--pink) / 0.2),
273
- hsl(var(--lavender)),
274
- transparent
275
- );
276
- border-radius: 999px;
277
- }
278
-
279
- /* ─── Cart & Checkout ─── */
280
-
281
- /* Sticky summary — playful card */
282
- [class*="sticky"][class*="top-"] {
283
- border-radius: var(--radius);
284
- border: 2px solid hsl(var(--border));
285
- box-shadow: 0 4px 20px hsl(var(--purple) / 0.06);
286
- }
287
-
288
- /* Quantity buttons */
289
- button[class*="h-8"][class*="w-8"],
290
- button[class*="h-10"][class*="w-10"] {
291
- border-radius: 999px !important;
292
- transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
293
- }
294
-
295
- button[class*="h-8"][class*="w-8"]:hover,
296
- button[class*="h-10"][class*="w-10"]:hover {
297
- transform: scale(1.1);
298
- background: hsl(var(--lavender)) !important;
299
- }
300
-
301
- /* ─── Images ─── */
302
-
303
- /* Product images — rounded */
304
- [class*="aspect-square"] {
305
- border-radius: calc(var(--radius) - 2px);
306
- overflow: hidden;
307
- }
308
- }
309
-
310
- /* ─── Animations ─── */
311
-
312
- /* Bouncy slide-up entrance */
313
- @keyframes playful-slide-up {
314
- from {
315
- opacity: 0;
316
- transform: translateY(24px) scale(0.96);
317
- }
318
- 50% {
319
- transform: translateY(-6px) scale(1.01);
320
- }
321
- to {
322
- opacity: 1;
323
- transform: translateY(0) scale(1);
324
- }
325
- }
326
-
327
- /* Wiggle for discount badges */
328
- @keyframes playful-wiggle {
329
- 0%,
330
- 85%,
331
- 100% {
332
- transform: rotate(0deg);
333
- }
334
- 90% {
335
- transform: rotate(-3deg);
336
- }
337
- 95% {
338
- transform: rotate(3deg);
339
- }
340
- }
341
-
342
- /* Pop-in for grid items */
343
- @keyframes playful-pop-in {
344
- from {
345
- opacity: 0;
346
- transform: scale(0.9) translateY(16px);
347
- }
348
- 60% {
349
- transform: scale(1.02) translateY(-2px);
350
- }
351
- to {
352
- opacity: 1;
353
- transform: scale(1) translateY(0);
354
- }
355
- }
356
-
357
- main > * {
358
- animation: playful-slide-up 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
359
- }
360
-
361
- main > *:nth-child(2) {
362
- animation-delay: 0.06s;
363
- }
364
-
365
- main > *:nth-child(3) {
366
- animation-delay: 0.12s;
367
- }
368
-
369
- /* Staggered grid items — playful pop */
370
- [class*="grid"] > [class*="group"] {
371
- animation: playful-pop-in 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
372
- }
373
-
374
- [class*="grid"] > [class*="group"]:nth-child(2) {
375
- animation-delay: 0.06s;
376
- }
377
-
378
- [class*="grid"] > [class*="group"]:nth-child(3) {
379
- animation-delay: 0.12s;
380
- }
381
-
382
- [class*="grid"] > [class*="group"]:nth-child(4) {
383
- animation-delay: 0.18s;
384
- }
385
-
386
- [class*="grid"] > [class*="group"]:nth-child(5) {
387
- animation-delay: 0.24s;
388
- }
389
-
390
- [class*="grid"] > [class*="group"]:nth-child(6) {
391
- animation-delay: 0.3s;
392
- }
393
-
394
- [class*="grid"] > [class*="group"]:nth-child(7) {
395
- animation-delay: 0.36s;
396
- }
397
-
398
- [class*="grid"] > [class*="group"]:nth-child(8) {
399
- animation-delay: 0.42s;
400
- }
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ :root {
7
+ --background: 0 0% 99%;
8
+ --foreground: 260 25% 16%;
9
+ --primary: 330 75% 56%;
10
+ --primary-foreground: 0 0% 100%;
11
+ --secondary: 260 50% 94%;
12
+ --secondary-foreground: 260 25% 16%;
13
+ --muted: 270 30% 95%;
14
+ --muted-foreground: 260 10% 45%;
15
+ --accent: 280 60% 60%;
16
+ --accent-foreground: 0 0% 100%;
17
+ --destructive: 0 84% 60%;
18
+ --destructive-foreground: 0 0% 100%;
19
+ --border: 270 20% 88%;
20
+ --input: 270 20% 88%;
21
+ --ring: 330 75% 56%;
22
+ --card: 0 0% 100%;
23
+ --card-foreground: 260 25% 16%;
24
+ --popover: 0 0% 100%;
25
+ --popover-foreground: 260 25% 16%;
26
+ --radius: 1rem;
27
+
28
+ /* Playful-specific tokens */
29
+ --pink: 330 75% 56%;
30
+ --purple: 280 60% 60%;
31
+ --lavender: 260 50% 94%;
32
+ --peach: 20 80% 88%;
33
+ --mint: 160 50% 88%;
34
+ }
35
+
36
+ * {
37
+ @apply border-border;
38
+ }
39
+
40
+ body {
41
+ @apply bg-background text-foreground antialiased;
42
+ line-height: 1.65;
43
+ }
44
+
45
+ /* Playful typography — friendly, bold, tight */
46
+ h1,
47
+ h2,
48
+ h3,
49
+ h4 {
50
+ font-weight: 700;
51
+ letter-spacing: -0.02em;
52
+ line-height: 1.2;
53
+ }
54
+
55
+ h1 {
56
+ font-weight: 800;
57
+ letter-spacing: -0.03em;
58
+ }
59
+
60
+ /* Fun colorful selection */
61
+ ::selection {
62
+ background: hsl(var(--pink) / 0.25);
63
+ color: hsl(260 25% 16%);
64
+ }
65
+
66
+ /* Colorful focus rings */
67
+ :focus-visible {
68
+ outline: 2.5px solid hsl(var(--purple));
69
+ outline-offset: 3px;
70
+ border-radius: var(--radius);
71
+ }
72
+
73
+ /* Playful scrollbar */
74
+ ::-webkit-scrollbar {
75
+ width: 8px;
76
+ }
77
+
78
+ ::-webkit-scrollbar-track {
79
+ background: hsl(var(--lavender));
80
+ }
81
+
82
+ ::-webkit-scrollbar-thumb {
83
+ background: linear-gradient(
84
+ 180deg,
85
+ hsl(var(--pink)),
86
+ hsl(var(--purple))
87
+ );
88
+ border-radius: 999px;
89
+ }
90
+ }
91
+
92
+ @layer components {
93
+ /* ─── Buttons ─── */
94
+
95
+ /* Primary CTA — gradient with bounce and glow */
96
+ button[class*="bg-primary"],
97
+ a[class*="bg-primary"] {
98
+ font-weight: 700;
99
+ letter-spacing: 0.01em;
100
+ background: linear-gradient(
101
+ 135deg,
102
+ hsl(var(--pink)),
103
+ hsl(330 80% 52%),
104
+ hsl(var(--purple))
105
+ ) !important;
106
+ background-size: 200% 200%;
107
+ box-shadow:
108
+ 0 4px 14px hsl(var(--pink) / 0.3),
109
+ 0 2px 6px hsl(var(--purple) / 0.15);
110
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
111
+ border: none;
112
+ }
113
+
114
+ button[class*="bg-primary"]:hover,
115
+ a[class*="bg-primary"]:hover {
116
+ transform: translateY(-3px) scale(1.03);
117
+ box-shadow:
118
+ 0 8px 28px hsl(var(--pink) / 0.4),
119
+ 0 4px 12px hsl(var(--purple) / 0.2);
120
+ background-position: 100% 0;
121
+ opacity: 1 !important;
122
+ }
123
+
124
+ button[class*="bg-primary"]:active,
125
+ a[class*="bg-primary"]:active {
126
+ transform: translateY(0) scale(0.97);
127
+ box-shadow: 0 2px 8px hsl(var(--pink) / 0.2);
128
+ }
129
+
130
+ /* Secondary buttons — soft pill with hover pop */
131
+ [class*="bg-secondary"] {
132
+ border-radius: 999px !important;
133
+ font-weight: 600;
134
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
135
+ }
136
+
137
+ [class*="bg-secondary"]:hover {
138
+ background: hsl(var(--lavender)) !important;
139
+ transform: translateY(-2px);
140
+ box-shadow: 0 4px 16px hsl(var(--purple) / 0.12);
141
+ }
142
+
143
+ /* ─── Product Cards ─── */
144
+
145
+ [class*="group"][class*="border"] {
146
+ border-radius: var(--radius);
147
+ overflow: hidden;
148
+ border: 2px solid hsl(var(--border));
149
+ background: white;
150
+ transition: all 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
151
+ }
152
+
153
+ [class*="group"][class*="border"]:hover {
154
+ transform: translateY(-6px) rotate(-0.5deg);
155
+ border-color: hsl(var(--pink) / 0.3);
156
+ box-shadow:
157
+ 0 16px 40px hsl(var(--purple) / 0.12),
158
+ 0 6px 16px hsl(var(--pink) / 0.1);
159
+ }
160
+
161
+ /* Product image hover — fun overshoot zoom */
162
+ [class*="group-hover\\:scale-105"] {
163
+ transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) !important;
164
+ }
165
+
166
+ [class*="group"]:hover [class*="group-hover\\:scale-105"] {
167
+ transform: scale(1.08) !important;
168
+ }
169
+
170
+ /* ─── Form Elements ─── */
171
+
172
+ input[class*="border-border"],
173
+ select[class*="border-border"],
174
+ textarea[class*="border-border"] {
175
+ border-radius: var(--radius);
176
+ border-width: 2px;
177
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
178
+ }
179
+
180
+ input[class*="border-border"]:focus,
181
+ select[class*="border-border"]:focus,
182
+ textarea[class*="border-border"]:focus {
183
+ border-color: hsl(var(--purple)) !important;
184
+ box-shadow: 0 0 0 4px hsl(var(--purple) / 0.1);
185
+ transform: scale(1.01);
186
+ }
187
+
188
+ input::placeholder,
189
+ textarea::placeholder {
190
+ color: hsl(var(--muted-foreground) / 0.6);
191
+ }
192
+
193
+ /* ─── Navigation & Header ─── */
194
+
195
+ header[class*="sticky"] {
196
+ border-bottom: none !important;
197
+ box-shadow: 0 4px 20px hsl(var(--purple) / 0.06);
198
+ background: hsl(0 0% 99% / 0.9) !important;
199
+ backdrop-filter: blur(10px);
200
+ }
201
+
202
+ /* Nav link hover — colorful underline */
203
+ nav a {
204
+ position: relative;
205
+ font-weight: 600;
206
+ transition: color 0.2s ease;
207
+ }
208
+
209
+ nav a::after {
210
+ content: '';
211
+ position: absolute;
212
+ bottom: -2px;
213
+ left: 50%;
214
+ width: 0;
215
+ height: 3px;
216
+ background: linear-gradient(90deg, hsl(var(--pink)), hsl(var(--purple)));
217
+ border-radius: 999px;
218
+ transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
219
+ transform: translateX(-50%);
220
+ }
221
+
222
+ nav a:hover::after {
223
+ width: 100%;
224
+ }
225
+
226
+ nav a:hover {
227
+ color: hsl(var(--pink));
228
+ }
229
+
230
+ /* ─── Badges & Tags ─── */
231
+
232
+ /* Category/filter pills */
233
+ [class*="bg-muted"][class*="text-xs"] {
234
+ border-radius: 999px;
235
+ font-weight: 700;
236
+ padding-left: 0.85rem;
237
+ padding-right: 0.85rem;
238
+ transition: all 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
239
+ }
240
+
241
+ [class*="bg-muted"][class*="text-xs"]:hover {
242
+ background: hsl(var(--lavender)) !important;
243
+ transform: scale(1.05);
244
+ }
245
+
246
+ /* Sale/discount badges — fun wiggle + pill */
247
+ [class*="bg-destructive"] {
248
+ border-radius: 999px;
249
+ font-weight: 800;
250
+ box-shadow: 0 2px 8px hsl(0 84% 60% / 0.3);
251
+ animation: playful-wiggle 3s ease-in-out infinite;
252
+ }
253
+
254
+ /* ─── Price Display ─── */
255
+
256
+ [class*="font-bold"][class*="text-lg"],
257
+ [class*="font-bold"][class*="text-xl"],
258
+ [class*="font-bold"][class*="text-2xl"] {
259
+ color: hsl(var(--pink));
260
+ }
261
+
262
+ /* Strikethrough — more playful */
263
+ [class*="line-through"] {
264
+ opacity: 0.4;
265
+ text-decoration-color: hsl(var(--purple) / 0.4);
266
+ text-decoration-thickness: 2px;
267
+ }
268
+
269
+ /* ─── Dividers ─── */
270
+
271
+ hr {
272
+ border: none;
273
+ height: 3px;
274
+ background: linear-gradient(
275
+ 90deg,
276
+ transparent,
277
+ hsl(var(--lavender)),
278
+ hsl(var(--pink) / 0.2),
279
+ hsl(var(--lavender)),
280
+ transparent
281
+ );
282
+ border-radius: 999px;
283
+ }
284
+
285
+ /* ─── Cart & Checkout ─── */
286
+
287
+ /* Sticky summary — playful card */
288
+ [class*="sticky"][class*="top-"] {
289
+ border-radius: var(--radius);
290
+ border: 2px solid hsl(var(--border));
291
+ box-shadow: 0 4px 20px hsl(var(--purple) / 0.06);
292
+ }
293
+
294
+ /* Quantity buttons */
295
+ button[class*="h-8"][class*="w-8"],
296
+ button[class*="h-10"][class*="w-10"] {
297
+ border-radius: 999px !important;
298
+ transition: all 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
299
+ }
300
+
301
+ button[class*="h-8"][class*="w-8"]:hover,
302
+ button[class*="h-10"][class*="w-10"]:hover {
303
+ transform: scale(1.1);
304
+ background: hsl(var(--lavender)) !important;
305
+ }
306
+
307
+ /* ─── Images ─── */
308
+
309
+ /* Product images — rounded */
310
+ [class*="aspect-square"] {
311
+ border-radius: calc(var(--radius) - 2px);
312
+ overflow: hidden;
313
+ }
314
+ }
315
+
316
+ /* ─── Animations ─── */
317
+
318
+ /* Bouncy slide-up entrance */
319
+ @keyframes playful-slide-up {
320
+ from {
321
+ opacity: 0;
322
+ transform: translateY(24px) scale(0.96);
323
+ }
324
+ 50% {
325
+ transform: translateY(-6px) scale(1.01);
326
+ }
327
+ to {
328
+ opacity: 1;
329
+ transform: translateY(0) scale(1);
330
+ }
331
+ }
332
+
333
+ /* Wiggle for discount badges */
334
+ @keyframes playful-wiggle {
335
+ 0%,
336
+ 85%,
337
+ 100% {
338
+ transform: rotate(0deg);
339
+ }
340
+ 90% {
341
+ transform: rotate(-3deg);
342
+ }
343
+ 95% {
344
+ transform: rotate(3deg);
345
+ }
346
+ }
347
+
348
+ /* Pop-in for grid items */
349
+ @keyframes playful-pop-in {
350
+ from {
351
+ opacity: 0;
352
+ transform: scale(0.9) translateY(16px);
353
+ }
354
+ 60% {
355
+ transform: scale(1.02) translateY(-2px);
356
+ }
357
+ to {
358
+ opacity: 1;
359
+ transform: scale(1) translateY(0);
360
+ }
361
+ }
362
+
363
+ main > * {
364
+ animation: playful-slide-up 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
365
+ }
366
+
367
+ main > *:nth-child(2) {
368
+ animation-delay: 0.06s;
369
+ }
370
+
371
+ main > *:nth-child(3) {
372
+ animation-delay: 0.12s;
373
+ }
374
+
375
+ /* Staggered grid items — playful pop */
376
+ [class*="grid"] > [class*="group"] {
377
+ animation: playful-pop-in 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
378
+ }
379
+
380
+ [class*="grid"] > [class*="group"]:nth-child(2) {
381
+ animation-delay: 0.06s;
382
+ }
383
+
384
+ [class*="grid"] > [class*="group"]:nth-child(3) {
385
+ animation-delay: 0.12s;
386
+ }
387
+
388
+ [class*="grid"] > [class*="group"]:nth-child(4) {
389
+ animation-delay: 0.18s;
390
+ }
391
+
392
+ [class*="grid"] > [class*="group"]:nth-child(5) {
393
+ animation-delay: 0.24s;
394
+ }
395
+
396
+ [class*="grid"] > [class*="group"]:nth-child(6) {
397
+ animation-delay: 0.3s;
398
+ }
399
+
400
+ [class*="grid"] > [class*="group"]:nth-child(7) {
401
+ animation-delay: 0.36s;
402
+ }
403
+
404
+ [class*="grid"] > [class*="group"]:nth-child(8) {
405
+ animation-delay: 0.42s;
406
+ }