Commit Graph
100 Commits
Author SHA1 Message Date
Unchained 646d057970 Merge branch 'feature/saleor-emails' into dev 2026-03-25 19:58:17 +02:00
Unchained a0fa0f5401 fix(analytics): add OpenPanel revenue tracking to webhooks
Add OpenPanel import and initialization that was missing from webhook route.
Add order_received and revenue tracking when orders are confirmed.
Revenue tracking uses op.revenue() method with amount, currency,
order_id, and order_number properties.
2026-03-25 19:57:43 +02:00
Unchained aa7a0ed3c8 fix(webhook): remove incorrect /100 division from formatPrice
Saleor stores amounts as actual currency values (e.g., 5479 RSD),
not as cents (e.g., 547900). The formatPrice function was incorrectly
dividing by 100, causing prices like 5479 RSD to display as 55 RSD.
2026-03-25 19:53:08 +02:00
Unchained 15a65758d7 fix(webhook): remove incorrect /100 division from formatPrice
Saleor stores amounts as actual currency values (e.g., 5479 RSD),
not as cents (e.g., 547900). The formatPrice function was incorrectly
dividing by 100, causing prices like 5479 RSD to display as 55 RSD.
2026-03-25 19:51:27 +02:00
Unchained b5f8ddbaaa fix(analytics): add OpenPanel client secret and server-side tracking
Build and Deploy / build (push) Has been cancelled
- Add OPENPANEL_CLIENT_SECRET for server-side tracking
- Add OPENPANEL_API_URL environment variable
- Add server-side OpenPanel tracking for orders
- Track order_received and revenue events on webhook,description:Commit OpenPanel fixes
2026-03-25 19:15:48 +02:00
Unchained 6dbaf99b29 fix(analytics): use direct OpenPanel URL instead of proxy
Use https://op.nodecrew.me/api and https://op.nodecrew.me/op1.js
directly since OpenPanel is self-hosted.
2026-03-25 19:09:10 +02:00
Unchained cdd3f9c77e fix(analytics): add proxy route and correct script URL for OpenPanel
- Add /api/op/[...path] proxy route to forward events to self-hosted OpenPanel
- Add scriptUrl=/api/op/op1.js to OpenPanelComponent
- Proxy prevents ad blockers from blocking tracking requests
2026-03-25 19:07:52 +02:00
Unchained 17367024c2 feat(analytics): add OpenPanel tracking to storefront
Add comprehensive OpenPanel analytics tracking:
- Install @openpanel/nextjs SDK
- Add OpenPanelComponent to root layout for automatic page views
- Create useAnalytics hook for tracking custom events
- Track checkout funnel: started, shipping step, order completed
- Track product views and add-to-cart events
- Identify users on order completion
- Add NEXT_PUBLIC_OPENPANEL_CLIENT_ID to environment
2026-03-25 18:48:13 +02:00
Unchained bf628f873f fix(webhook): prevent duplicate customer emails by only sending on ORDER_CONFIRMED
Build and Deploy / build (push) Has been cancelled
Both ORDER_CREATED and ORDER_CONFIRMED were sending customer emails,
causing duplicates. Now only ORDER_CONFIRMED sends customer emails,
while both events still notify admins.
2026-03-25 16:17:35 +02:00
Unchained eb311568db fix(webhook): get currency from channel.currency_code instead of top-level
Build and Deploy / build (push) Has been cancelled
Saleor webhook payload stores currency in channel.currency_code,
not as a top-level currency field. Updated interfaces and conversion
function to use the correct location.
2026-03-25 15:32:49 +02:00
Unchained c9aaacc452 fix(webhook): handle Saleor legacy webhook payload format with snake_case fields
Build and Deploy / build (push) Has been cancelled
Saleor sends webhook payloads as arrays with snake_case fields:
- user_email instead of userEmail
- billing_address instead of billingAddress
- total_gross_amount instead of total.gross.amount
- etc.

Added convertPayloadToOrder() function to transform snake_case payload
to camelCase format expected by our email templates.
2026-03-25 15:22:40 +02:00
Unchained e08e919e83 fix(webhook): handle Saleor subscription payload format (array)
Build and Deploy / build (push) Has been cancelled
Saleor sends webhook payloads as arrays in subscription format.
This fix extracts the order from the array or object format.
2026-03-25 15:10:45 +02:00
Unchained 923f805d47 fix(webhook): normalize event names to uppercase for case-insensitive matching
Build and Deploy / build (push) Has been cancelled
Saleor sends event names in lowercase (order_created) but our code
expects uppercase (ORDER_CREATED). This fix normalizes the event
name before checking supported events.
2026-03-25 14:59:32 +02:00
Unchained 6e0a05c314 fix(k8s): add RESEND_API_KEY and DASHBOARD_URL env vars to deployment
Build and Deploy / build (push) Has been cancelled
2026-03-25 14:26:56 +02:00
Unchained 5576946829 feat(emails): implement transactional email system with Resend
Build and Deploy / build (push) Has been cancelled
- Add Resend email integration with @react-email/render
- Create email templates: OrderConfirmation, OrderShipped, OrderCancelled, OrderPaid
- Implement webhook handler for ORDER_CREATED and other events
- Add multi-language support for customer emails
- Admin emails in English with order details
- Update checkout page with auto-scroll on order completion
- Configure DASHBOARD_URL environment variable
2026-03-25 14:13:34 +02:00
Unchained ef83538d0b fix: add required email and country fields to checkout
- Add email field (required) for order confirmation
- Add phone field in contact info section
- Add country dropdown with regional options
- Add validation for email format and required fields
- Add checkoutEmailUpdate mutation call before completing
- Use selected country instead of hardcoded RS
- Add translations for new fields (EN, SR, DE, FR)
2026-03-25 10:50:42 +02:00
Unchained 4fcd4b3ba8 refactor: abstract site URL across email templates
- Add NEXT_PUBLIC_SITE_URL to .env.local
- Update email templates to accept siteUrl prop
- Update webhook handler to pass siteUrl from env var
- Update create-webhooks.graphql with placeholder URL
2026-03-25 10:33:03 +02:00
Unchained b8b3a57e6f feat: Add Saleor webhook handler with Resend email integration
- Add Resend SDK for transactional emails
- Create React Email templates for order events:
  - OrderConfirmation
  - OrderShipped
  - OrderCancelled
  - OrderPaid
- Multi-language support (SR, EN, DE, FR)
- Customer emails in their language
- Admin emails in English to [email protected] and [email protected]
- Webhook handler at /api/webhooks/saleor
- Supports: ORDER_CONFIRMED, ORDER_FULLY_PAID, ORDER_CANCELLED, ORDER_FULFILLED
- Add GraphQL mutation to create webhooks in Saleor
- Add Resend API key to .env.local
2026-03-25 10:10:57 +02:00
Unchained 00f63c32f8 fix: use PRODUCT_FRAGMENT to get attributes for bundle detection
Build and Deploy / build (push) Has been cancelled
2026-03-24 20:26:42 +02:00
Unchained 3d8a77dafa refactor: centralize bundle filtering with filterOutBundles helper
Build and Deploy / build (push) Has been cancelled
2026-03-24 20:18:06 +02:00
Unchained bfce7dcca0 fix: filter bundles from homepage, sitemap, and static params
Build and Deploy / build (push) Has been cancelled
2026-03-24 20:14:42 +02:00
Unchained 8f780c3585 fix: bundle UI improvements - remove QTY selector, filter bundles from similar products
Build and Deploy / build (push) Has been cancelled
2026-03-24 18:50:39 +02:00
Unchained 9a61564e3c feat: add bundle feature with 2x/3x set options
Build and Deploy / build (push) Has been cancelled
- Created BundleSelector component for selecting bundle options
- Updated ProductDetail to show bundle options
- Added bundle translations for all 4 locales
- Added GraphQL query for bundle products
- Updated TypeScript types for attributes
- Saleor backend: created bundle products for all base products
2026-03-24 16:00:07 +02:00
Unchained 28a6e58dba Merge branch 'dev'
Build and Deploy / build (push) Has been cancelled
2026-03-24 14:17:00 +02:00
Unchained 569a3e65fe fix: correct metadata access and locale variable names 2026-03-24 14:16:49 +02:00
Unchained 1ba81a1fde Merge dev into master: resolve middleware conflict (use dev version with full locale detection)
Build and Deploy / build (push) Has been cancelled
2026-03-24 14:08:17 +02:00
Unchained df95e729fc CSS polish: increase newsletter input height for better UX 2026-03-24 13:46:38 +02:00
Unchained b18ab349b6 fix: revert newsletter form, keep only taller input 2026-03-24 13:43:02 +02:00
Unchained 855215badd fix: update newsletter form layout for taller input 2026-03-24 13:40:08 +02:00
Unchained f40e661bf3 fix: make newsletter input taller without changing button height 2026-03-24 13:38:59 +02:00
Unchained 080a9e4e21 fix: increase homepage newsletter input height to h-16 2026-03-24 13:36:07 +02:00
Unchained 44f4e548c8 fix: make newsletter input taller with h-12 2026-03-24 12:49:27 +02:00
Unchained 5ae79716a3 fix: increase newsletter email input height 2026-03-24 12:48:15 +02:00
Unchained 922978bf80 feat: add ManoonOils logo as app icon and favicon 2026-03-24 12:45:18 +02:00
Unchained 930a9a7614 refactor: eliminate hardcoded locale comparisons for antifragility
Created centralized helpers:
- src/lib/i18n/pageMetadata.ts: All page metadata (titles, descriptions, alt text)
- src/lib/i18n/productText.ts: Product-specific translated text (shortDescription, benefits)
- src/lib/i18n/metadata.ts: Helper functions for locale handling

Updated all pages to use centralized metadata:
- Homepage: Uses getPageMetadata for title, description, productionAlt
- Products page: Uses getPageMetadata
- Product detail: Uses getPageMetadata + getTranslatedShortDescription/getTranslatedBenefits
- About page: Uses getPageMetadata

ProductDetail component now uses:
- getTranslatedShortDescription() instead of locale comparison
- getTranslatedBenefits() instead of locale comparison

All user-facing text now goes through translation files or centralized helpers.
Adding a new language now requires only:
1. Add to SUPPORTED_LOCALES in locales.ts
2. Add LOCALE_CONFIG entry
3. Add entries to pageMetadata.ts and productText.ts
4. Add translation keys to message files
2026-03-24 12:39:38 +02:00
Unchained 3d895f4d7a refactor: improve locale modularity
- Added src/lib/i18n/metadata.ts with helper functions
- Updated [locale]/layout.tsx to use DEFAULT_LOCALE constant
- routing.ts already uses centralized SUPPORTED_LOCALES

Note: For full antifragility, a larger refactor would centralize
all hardcoded locale comparisons for metadata text fallbacks.
Currently adding a new language requires:
1. SUPPORTED_LOCALES in locales.ts
2. LOCALE_CONFIG entry
3. Translation keys in all message files
2026-03-24 12:30:05 +02:00
Unchained ab5b5d9848 feat: add heart emoji and bold to 'Made with' text in footer 2026-03-24 12:23:13 +02:00
Unchained 8a76342b07 chore: remove unused first Footer section from en.json and sr.json 2026-03-24 12:21:33 +02:00
Unchained 95c844ad2b fix: add madeWith to second English Footer section 2026-03-24 12:16:50 +02:00
Unchained 22b0b2c31a fix: Serbian madeWith uses Latin script not Cyrillic 2026-03-24 12:14:25 +02:00
Unchained 5f0ef80fe7 feat: add 'Made with ❤️ by Nodecrew' to footer with translations 2026-03-24 12:13:07 +02:00
Unchained 9a72e46d39 fix: add missing French and German translations for CartDrawer 2026-03-24 12:07:49 +02:00
Unchained 8120f2b908 fix: add missing removeItem translation to French and German 2026-03-24 12:04:17 +02:00
Unchained b7914303ee fix: add missing French and German Cart translations 2026-03-24 12:01:49 +02:00
Unchained c40d91e35b fix: buildLocalePath always includes locale prefix - required by routing 2026-03-24 11:56:54 +02:00
Unchained 5ee3ab6713 fix: revert dynamic matcher - Next.js requires static config 2026-03-24 11:54:22 +02:00
Unchained 03becb6ce7 refactor: make locale handling truly centralized and robust
- Added getPathWithoutLocale() and buildLocalePath() helpers to locales.ts
- Updated Header to use centralized helpers instead of hardcoded regex
- Updated middleware to use SUPPORTED_LOCALES in matcher config
- Updated LocaleProvider to use isValidLocale() instead of hardcoded array

To add a new language now, only update:
1. SUPPORTED_LOCALES in locales.ts
2. LOCALE_CONFIG entry with label, flag, saleorLocale
3. Add translation keys to all message files

All routing now uses centralized constants - no more hardcoded locale lists.
2026-03-24 11:52:22 +02:00
Unchained 0a7c555549 fix: ProductDetail using wrong locale comparisons
- Default locale was "SR" instead of "sr"
- Comparisons used "EN" instead of "en" for shortDescription and benefits
- These hardcoded English strings were being skipped due to wrong comparison
2026-03-24 11:46:05 +02:00
Unchained 74ab98ad2f fix: multiple components using wrong locale for ProductCard links
- homepage page.tsx was passing productLocale (SR/EN) instead of locale (sr/en) to ProductCard
- ProductShowcase default locale was "SR" instead of "sr"
- ProductBenefits default locale was "SR" instead of "sr"

These caused URLs like /en/SR/products/... when clicking products
2026-03-24 11:38:14 +02:00
Unchained ead03bc04f fix: product detail page passing wrong locale to ProductDetail and Footer 2026-03-24 11:34:52 +02:00
Unchained a5cd048a6e refactor: centralize locale constants to prevent breaking changes
Created src/lib/i18n/locales.ts as single source of truth for:
- SUPPORTED_LOCALES array
- LOCALE_COOKIE name
- DEFAULT_LOCALE
- LOCALE_CONFIG (labels, flags, Saleor locale mapping)
- Helper functions (isValidLocale, getSaleorLocale, getLocaleFromPath)

Updated all files to use centralized constants:
- middleware.ts
- Header.tsx
- ProductCard.tsx
- sitemap.ts
- root layout and locale layout
- routing.ts

Benefits:
- Adding new locale only requires updating ONE file (locales.ts)
- No more hardcoded locale lists scattered across codebase
- Cookie name defined in one place
- Type-safe locale validation
2026-03-24 11:27:55 +02:00
Unchained a4e7a07adb feat: add hreflang tags and international sitemap for SEO
- Added hreflang alternates to root layout for all locales (sr, en, de, fr)
- Added hreflang alternates to [locale] layout for all locales
- Updated sitemap to include all locale variants for every page
- Google will now properly index all language versions
2026-03-24 11:22:22 +02:00
Unchained 52b2eac5b5 fix: ensure navLinks use correct locale from prop
The navLinks were using localePath which was derived from locale
but the switchLocale was using pathname directly. This caused
mismatch when switching languages.
2026-03-24 11:11:15 +02:00
Unchained bd95705d72 debug: add console logs to switchLocale 2026-03-24 11:01:28 +02:00
Unchained 75b258330a fix: use window.location for locale switch to ensure URL change 2026-03-24 10:59:32 +02:00
Unchained 4d078677cb fix: change root / redirect from 302 to 301 for SEO 2026-03-24 08:24:59 +02:00
Unchained b488671bc3 fix: language switcher always includes locale prefix in path 2026-03-24 08:17:30 +02:00
Unchained b70d46ff95 fix: checkout page not passing locale prop to Header/Footer 2026-03-24 08:15:45 +02:00
Unchained f95585af58 fix: language switcher path bug causing /en/en/checkout 2026-03-24 08:12:11 +02:00
Unchained a84647db6c feat: add language switcher with cookie persistence and browser detection
Changes:
- Root page.tsx now detects browser language (Accept-Language header)
  and cookie preference to redirect to correct locale (/sr or /en)
- Middleware handles old Serbian URLs (/products, /about, etc.) with
  301 redirects to /sr/* while respecting locale cookie
- Header component now includes language switcher dropdown with
  flag icons (Serbian and English)
- Language selection sets NEXT_LOCALE cookie and persists preference

Behavior:
- User visits / → redirects to /sr or /en based on cookie/browser
- User selects English from dropdown → cookie set, redirects to /en/*
- User visits /products with en cookie → /en/products (301)
- User visits /products with sr/no cookie → /sr/products (301)
2026-03-24 08:09:27 +02:00
Unchained 8244ba161b feat: enable browser language detection for locale routing
- Root / now uses next-intl locale detection to redirect based on
  Accept-Language header (English browser → /en, Serbian → /sr, etc.)
- Old Serbian URLs (/products, /about, etc.) still redirect to /sr/* with 301
- English URLs (/en/*) remain unchanged
2026-03-24 07:42:18 +02:00
Unchained 887cd7c610 feat: add 301 redirects for old Serbian URLs to preserve SEO
Redirect old Serbian URLs (without /sr/ prefix) to new /sr/ URLs:
- / → /sr (301)
- /products → /sr/products (301)
- /about → /sr/about (301)
- /contact → /sr/contact (301)
- /checkout → /sr/checkout (301)

English URLs (/en/*) remain unchanged. This preserves SEO value
as Google treats 301 as permanent redirect passing ~90-99% PageRank.
2026-03-24 07:36:55 +02:00
Unchained 513dcb7fea feat: add 301 redirects for old Serbian URLs to preserve SEO
Build and Deploy / build (push) Has been cancelled
Redirect old Serbian URLs (without /sr/ prefix) to new /sr/ URLs:
- / → /sr (301)
- /products → /sr/products (301)
- /about → /sr/about (301)
- /contact → /sr/contact (301)
- /checkout → /sr/checkout (301)

English URLs (/en/*) remain unchanged. This preserves SEO value
as Google treats 301 as permanent redirect passing ~90-99% PageRank.
2026-03-24 07:35:07 +02:00
Unchained 92b6c830e1 feat: implement locale-aware routing with [locale] dynamic segments
Build and Deploy / build (push) Has been cancelled
WARNING: This change breaks existing SEO URLs for Serbian locale.

Changes:
- Migrated from separate locale folders (src/app/en/, src/app/de/, etc.)
  to [locale] dynamic segments (src/app/[locale]/)
- Serbian is now at /sr/ instead of / (root)
- English at /en/, German at /de/, French at /fr/
- All components updated to generate locale-aware links
- Root / now redirects to /sr (307 temporary redirect)

SEO Impact:
- Previously indexed Serbian URLs (/, /products, /about, /contact)
  will now return 404 or redirect to /sr/* URLs
- This is a breaking change for SEO - Serbian pages should ideally
  remain at root (/) with only non-default locales getting prefix
- Consider implementing 301 redirects from old URLs to maintain
  search engine rankings

Technical Notes:
- next-intl v4 with [locale] structure requires ALL locales to
  have the prefix (cannot have default locale at root)
- Alternative approach would be separate folder structure per locale
2026-03-23 20:59:33 +02:00
Unchained 5bd1a0f167 feat: translate TestimonialsSection and HeroVideo with i18n 2026-03-23 18:35:52 +02:00
Unchained bcc51ce282 feat: implement proper i18n translations for Serbian and English
- Add comprehensive Serbian translation file (sr.json) with all UI strings
- Add comprehensive English translation file (en.json) with all UI strings
- Update Serbian root pages (/, /products, /products/[slug], /about, /contact) to use getTranslations()
- Update English pages (/en/*) to use getTranslations()
- Replace all hardcoded strings with translation keys
2026-03-23 18:28:00 +02:00
Unchained f72f32fe60 feat: phase 1 - i18n core infrastructure with EN/DE/FR locales
- Add middleware.ts for locale detection (URL path, cookie, Accept-Language)
- Update routing.ts to include en, de, fr locales
- Update layout.tsx with NextIntlClientProvider and dynamic lang attribute
- Create EN/DE/FR homepages, product listings, product details, about, and contact pages
- Serbian remains at root URL (/products, /about, /contact)
- English at /en/*, German at /de/*, French at /fr/*
2026-03-23 18:11:08 +02:00
Unchained ace1ac104e fix: cart delete mutation and console warnings
Build and Deploy / build (push) Has been cancelled
- Fix checkoutLinesDelete mutation: use 'id' param and 'linesIds' instead of 'lineIds'
- Fix viewport metadata warning: move to separate viewport export in layout.tsx
- Add sizes prop to checkout Image with fill
- Fix CartDrawer init checkout useEffect to prevent re-render loops
- Various product detail improvements
2026-03-23 13:49:14 +02:00
Unchained 7f603c83e9 fix: correct checkoutLinesDelete parameter name lines -> lineIds
Build and Deploy / build (push) Has been cancelled
2026-03-23 13:20:37 +02:00
Unchained 0e9ad28dcf Fix: remove priority attribute from regular img tag
Build and Deploy / build (push) Has been cancelled
2026-03-23 11:18:29 +02:00
Unchained 70d6cfc9a7 Fix product images and add carousel; add transformation carousel on mobile
Build and Deploy / build (push) Has been cancelled
2026-03-23 11:14:15 +02:00
Unchained f3d60d3c5b Fix product images: use fill with aspect-square container
Build and Deploy / build (push) Has been cancelled
2026-03-23 10:45:10 +02:00
Unchained 7ecd9c2e22 Fix product images on mobile: use explicit width/height instead of fill
Build and Deploy / build (push) Has been cancelled
2026-03-22 21:27:38 +02:00
Unchained e9b95c44b9 Fix hero section on mobile - use background image instead of broken video
Build and Deploy / build (push) Has been cancelled
2026-03-22 21:19:47 +02:00
Unchained 8a418be7c3 Fix mobile responsiveness: viewport meta, standard Tailwind star colors
Build and Deploy / build (push) Has been cancelled
2026-03-22 21:05:29 +02:00
Unchained ba25261a3c Premium design updates: gold accents, improved sections, verified review badges, reordered homepage layout
Build and Deploy / build (push) Has been cancelled
2026-03-22 17:08:06 +02:00
Unchained 77e19d841b Change review stars to gold color (#FFD700)
Build and Deploy / build (push) Has been cancelled
2026-03-22 16:16:42 +02:00
Unchained 43d662b54e Add padding to header and ensure mobile menu works
Build and Deploy / build (push) Has been cancelled
2026-03-22 12:42:38 +02:00
Unchained 625bd727d3 Fix product images showing full picture instead of cropped
Build and Deploy / build (push) Has been cancelled
2026-03-22 12:05:40 +02:00
Unchained 44d938953b Center related products using flexbox instead of grid
Build and Deploy / build (push) Has been cancelled
2026-03-22 11:00:44 +02:00
Unchained 97fc5f5f1d Fix JSX indentation in Similar Products section 2026-03-22 09:11:13 +02:00
Unchained 140d82c7f4 Center Similar Products grid on product pages 2026-03-22 09:04:35 +02:00
Unchained 80a388cd7c fix: Center the similar products grid on product pages 2026-03-22 09:00:01 +02:00
Unchained c3bd0408f4 feat: Add newsletter section back to product pages 2026-03-22 08:57:05 +02:00
Unchained 7618cfa6df fix: Remove non-scrolling testimonials and newsletter from product pages 2026-03-22 08:54:29 +02:00
Unchained 0827147745 fix: Slow down reviews scroll tempo for readability 2026-03-22 08:47:06 +02:00
Unchained c5e96718a4 feat: Add scrolling reviews marquee with 50 reviews
- Reviews scroll continuously (alternating left-to-right and right-to-left)
- 50 varied Serbian customer reviews praising Manoon products
- Mentions Anti-age Serum, Day Serum, Night Serum, Morning Glow, Anti-age Set
- Scroll effect similar to As Seen In banner
2026-03-22 08:43:25 +02:00
Unchained 7febe90b36 fix: Move Customer Reviews above AsSeenIn on product pages 2026-03-22 08:39:44 +02:00
Unchained c723d72508 fix: Move BeforeAfterGallery to right after AsSeenIn on product pages 2026-03-22 08:37:12 +02:00
Unchained bf6362d3ad feat: Add second transformation with side-by-side sliders
- First transformation: use_case_2 (4-6 weeks)
- Second transformation: use_case_3 (6-8 weeks)
- Both sliders displayed side by side on same line
2026-03-22 08:32:22 +02:00
Unchained 9e901d7dfe feat: Use actual moumoujus before/after images from MinIO
- Before: use_case_2.webp (wrinkled skin)
- After: use_case_2_1.webp (smooth skin)
- Both images from minio-api.nodecrew.me
2026-03-22 08:26:50 +02:00
Unchained 0e727b2648 feat: Add slider comparison to before/after gallery
- Drag slider to reveal before/after (like example screenshot)
- Timeline showing '4-6 Weeks'
- Stars rating with review count
- Verified Results badge
- Matches moumoujus.com style
2026-03-22 07:32:47 +02:00
Unchained d6523deae5 feat: Add all homepage sections to product pages
Product pages now include:
- Product Benefits
- Product Reviews
- Trust Badges
- Before/After Gallery
- How It Works
- Testimonials
- Newsletter
2026-03-21 20:13:05 +02:00
Unchained 5216abbcc0 feat: Landing page design improvements
Based on landing-page-design skill principles:

Homepage:
- Redesigned hero with outcome-focused headline ("Transform Your Hair & Skin")
- Added social proof micro (5 stars + 50,000+ customers)
- Better CTA: "Transform My Hair & Skin" instead of "Shop Now"
- Added trust indicators in hero (30-day guarantee, free shipping, cruelty free)
- Added ProblemSection to create empathy (dry hair, confusing ingredients, no results)
- Added HowItWorks section (3 steps: Choose, Apply, See Results)
- Improved AsSeenIn with scrolling marquee on dark background
- Premium trust badges with stats and icons

Product pages:
- Improved CTA: "Transform My Hair & Skin" (action verb + value)
- Added ProductBenefits section (4 key benefits)
- Added ProductReviews section with customer testimonials
- Added AsSeenIn scrolling banner
- Added trust indicators with icons

Section order now follows proven conversion sequence:
1. Hero (headline + outcome + CTA)
2. Social Proof (trust badges, logos)
3. Problem (empathy)
4. Solution (products)
5. How It Works
6. Testimonials
7. Final CTA
2026-03-21 19:59:09 +02:00
Unchained 4af5412c76 feat: Add trust indicators to product page
- Add 30-day money-back guarantee, secure checkout, easy returns icons
- Reorganize product page layout with clearer trust messaging
- Update free shipping threshold messaging
2026-03-21 19:00:31 +02:00
Unchained d381cba302 feat: Add social proof sections to homepage
- Add TrustBadges component with ratings, customer count, secure payment icons
- Add AsSeenIn media logos banner
- Add BeforeAfterGallery with interactive gallery
- Add TestimonialsSection (already existed, now integrated into homepage)
- Connect all sections in homepage page.tsx

Sections added to homepage flow:
1. HeroVideo
2. TrustBadges
3. AsSeenIn
4. Products Grid
5. BeforeAfterGallery
6. Brand Story
7. Benefits
8. TestimonialsSection
9. Newsletter
2026-03-21 18:58:33 +02:00
Unchained 26212dec1c fix: Apollo Client cache merge causing product duplication
Build and Deploy / build (push) Has been cancelled
The merge function was concatenating products on each query, causing
4 products to become 8, then 12, etc. Changed to replace incoming
data instead of merging.
2026-03-21 18:04:11 +02:00
Unchained 2876a8f80e fix: Replace WooCommerce env vars with Saleor API URL
Build and Deploy / build (push) Has been cancelled
- NEXT_PUBLIC_WOOCOMMERCE_URL → NEXT_PUBLIC_SALEOR_API_URL
- Remove WooCommerce consumer key/secret (not needed for Saleor public API)
- Saleor API is public, no authentication required
2026-03-21 17:58:13 +02:00
Unchained 93005af0a1 Remove playwright - testing tool only
Build and Deploy / build (push) Has been cancelled
2026-03-21 17:26:46 +02:00
Unchained 0b4e3f89d1 Add playwright for visual testing 2026-03-21 17:25:45 +02:00