Commit graph

41 commits

Author SHA1 Message Date
Vadym Samoilenko
16fcf793d7 Fix TypeScript unused import errors blocking CI build
Remove unused 'motion' import from BlockDivider and unused 'PageBlock' type from DynamicPage.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 22:41:52 +00:00
Vadym Samoilenko
6cd63f1bdf Add Page Builder: 15 block types + publish/unpublish via TinaCMS
- New TinaCMS collection 'pages' with 15 block templates:
  Hero, TextBlock, TwoColumn, Features, Stats, Testimonials,
  Team, FAQ, CTABanner, Video, Gallery, Pricing, Timeline,
  Divider, ContactForm
- Each page has published toggle (unpublished → 404)
- Route /p/:slug renders dynamic pages from content/pages/*.json
- scripts/copy-pages.mjs copies content/pages → public/pages at build
- prerender.mjs extended to prerender published pages
- All blocks styled with design tokens + Framer Motion animations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 22:29:51 +00:00
Vadym Samoilenko
f5423d202c Increase gap between rotating text ring and sphere in Banner2
Text was overlapping the globe. Scale the SVG text ring to 1.45x on
desktop and 1.6x on mobile so the text orbit sits clearly outside
the sphere boundary.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 21:51:57 +00:00
Vadym Samoilenko
d42ab963bc Add hreflang tags for en/uk language switching
Single URL for both languages is correct for client-side i18n — signals
to search engines that both language versions exist at the same URL.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 21:37:25 +00:00
Vadym Samoilenko
a3040d9852 Add JSON-LD schemas: FAQ, HowTo, BlogPosting, Person, AggregateRating
- PricingPage: FAQPage schema from existing FAQ array
- HomePage: HowTo schema with 5-step process (Challenge Briefing → Scaling)
- BlogPostPage: BlogPosting schema with headline, dates, author, publisher
- AboutPage: Person schema for Vadym Samoilenko (CEO & Founder)
- index.html: LocalBusiness + AggregateRating schema (5.0/5, 5 reviews)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 21:37:21 +00:00
Vadym Samoilenko
2ab22e5efb Fix cookie banner disappearing when TinaCloud data loads
Refactored LanguageProvider to avoid remounting children when switching
from static to live translations. Previously, the switch from
LanguageContext.Provider to TinaConnectedProvider caused all children
to unmount/remount, resetting CookieConsent state and hiding the banner
if cookie_consent was already set in localStorage.

New approach: TinaLiveSync is a null-rendering component that calls useTina
and syncs live data back to LanguageProvider via a stable callback, while
LanguageContext.Provider remains the stable root wrapper — children never remount.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 22:36:18 +00:00
Vadym Samoilenko
f7f1376568 Add search, design tokens with color picker, beforeSubmit for blog
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 22:07:40 +00:00
Vadym Samoilenko
9484ce0587 Fix useTina empty query error: defer TinaCloud connection until data loaded
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 22:02:10 +00:00
Vadym Samoilenko
1cca59dbdd Add visual editing via useTina + configure tina collections for SPA
- Integrate useTina hook for live translation editing in LanguageContext
- Configure translationsEn/translationsUk with global=true and router
- Add blog post router and auto-slugify filename generator

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 21:40:15 +00:00
Vadym Samoilenko
985d21b53d Add TinaCMS Cloud integration (Phase 1)
- Add tina/config.ts with full schema for all site sections
- Convert i18n from TypeScript to nested JSON (content/translations/)
- Update LanguageContext to import JSON with flattenObject utility
- Update dev/build scripts to run tinacms build
- Add sync-blog.mjs support for content/blog/*.md (TinaCMS posts)
- Update CI/CD with Tina env vars, remove blog rsync exclusion
- Add tina/__generated__/ to .gitignore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 20:34:35 +00:00
Vadym Samoilenko
de292da095 Reduce Banner2 rotating text circle size further
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:43:04 +00:00
Vadym Samoilenko
01eef07e90 Fix Banner2 rotating text circle overflowing frame
Reduced .banner2-text-overlay width at all breakpoints to keep the
circular "Get Your Free Consultation" text within the banner bounds.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:41:26 +00:00
Vadym Samoilenko
6e932d76e4 Add multi-language support (EN/UK) across entire site
Custom i18n system with typed translation dictionaries (~570 keys),
LanguageProvider context, and useTranslation hook. All 31 components
and pages wired with t() calls. Chatbot backend passes language hint
to Claude for Ukrainian responses. Language preference persists via
localStorage. SEO meta tags and html lang attribute update dynamically.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:32:04 +00:00
Vadym Samoilenko
43b95c84df Add markdown rendering in chat widget + opportunities for new leads
- Chat messages now render bold, italic, links, and line breaks
- Bare URLs auto-linked, XSS-safe via HTML escaping before markdown
- New leads create Opportunity with stage NEW in Twenty CRM
- Applied to both chatbot-api and email-api (contact + quote forms)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:30:49 +00:00
Vadym Samoilenko
8e73d77abc Fix chatbot: lead persistence, CRM creation, RC delivery, mobile UI
- Store lead info in Redis session meta so bot remembers name across messages
- Create Twenty CRM lead immediately from form data (bypass tool-call flow)
- Store room→session reverse mapping in Redis for RC webhook delivery
- Update system prompt: don't re-ask for form-provided info
- Fix "Most Popular" badge clipped on mobile (overflow: visible)
- Fix contact form inputs overflowing on small screens (box-sizing)
- Reduce chat tooltip size on mobile to avoid overlapping content

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:18:29 +00:00
Vadym Samoilenko
e78d6dc1c6 Add Twenty CRM integration + lead enrichment + pulsating chat bubble
- New twenty_crm.py: full CRUD for people, companies, notes via Twenty REST API
- Lead capture now creates person + company in Twenty CRM automatically
- New update_lead tool: enriches CRM profile as conversation progresses
  (job title, phone, city, budget, requirements)
- Session meta stored in Redis to track Twenty person ID across messages
- Docker-compose updated with TWENTY_CRM env vars
- Chat bubble: pulsating ring animation with gradient background

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 18:13:26 +00:00
Vadym Samoilenko
a8e8d8a71b Add lead collection form before chat + fix RC bot message delivery
- New ChatLeadForm component: collects name, email, company before chat starts
- GDPR consent checkbox with Privacy Policy link
- Lead info passed to backend and injected as LLM context
- Visitor name from form used in Rocket.Chat room
- RC bot messages: added logging + fallback to livechat/message endpoint
- RC room caching to avoid repeated API calls

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 18:02:08 +00:00
Vadym Samoilenko
73b1a0feda Add AI chatbot: FastAPI backend + React chat widget
- Python FastAPI backend (chatbot-api/) with Claude Sonnet 4.6, prompt injection
  protection, rate limiting (30 msg/session), off-topic filtering, Redis session storage
- Rocket.Chat integration for live monitoring and human takeover
- Lead capture via n8n webhook
- React chat widget: floating bubble, auto-greeting after 30s, glassmorphism chat
  window, mobile responsive, lazy loaded, Mixpanel analytics
- Nginx proxy /api/chat → chatbot-api:8000
- Docker: chatbot-api + Redis services added to docker-compose

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 17:14:07 +00:00
Vadym Samoilenko
8e5ba6f687 Close mobile menu automatically on scroll
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:11:42 +00:00
Vadym Samoilenko
d778a7e5f2 Fix hero text overlap under bottom circle, reduce mobile menu font to 1.1rem
- Add margin-bottom: 0 on circle-3 at 768px and 480px breakpoints
- Reduce mobile nav font from 1.4rem to 1.1rem

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:10:02 +00:00
Vadym Samoilenko
181d3347f2 Reduce mobile menu font size from 2rem to 1.4rem
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:07:53 +00:00
Vadym Samoilenko
d40bd2e5b3 Fix Popular badge: inline flow instead of absolute overlap on price
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:04:09 +00:00
Vadym Samoilenko
c0cdbac5f9 Fix Popular badge position and bundle cards equal height
- Move Popular badges inside cards (top-right) instead of overlapping top edge
- Remove align-items: start from bundles grid so all cards stretch equally

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:01:18 +00:00
Vadym Samoilenko
9d281920e9 Add Results in Numbers, Service Selector, and Popular Bundles to Services page
- Metrics section: 4 gradient stat cards with spring entrance animation
- Interactive selector: 3-step wizard (goal → budget → recommendations)
- Popular Bundles: 3 package tiers (Starter, Growth, Full Stack) with CTA
- Full responsive support for all new sections

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:58:14 +00:00
Vadym Samoilenko
a0cec68ff2 Redesign pages with homepage patterns, remove How We Work & Tech Stack
- Apply glassmorphism, radial glows, gradient banners to About/Services/Pricing
- Remove How We Work and Technology Stack sections from Services
- Add gradient banner styling to discount section on Pricing
- Update About values section with full-width gradient banner

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:43:44 +00:00
Vadym Samoilenko
fd10a0708c Fix mobile burger menu: raise z-index, animate to X, close on route change
- Burger button z-index 1100 (above overlay 1002)
- Hamburger lines animate to X when menu is open
- Menu auto-closes on route change

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:37:08 +00:00
Vadym Samoilenko
f53d385508 Add AI Chatbots & Custom Website services (popular), widen content to match header
- New services: AI Chatbots & Virtual Assistants (£3K-£10K), Custom Website Development (£2.5K-£15K)
- Both marked as Popular with orange badge on Services and Pricing pages
- Widen all content blocks to max-width 1200px to align with header container
- Widen CTA blocks to 900px

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:36:26 +00:00
Vadym Samoilenko
9544aabf8b Add founder photo to About page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:33:09 +00:00
Vadym Samoilenko
5522820df4 Remove Company Details section, redesign Industries as icon cards with descriptions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:30:36 +00:00
Vadym Samoilenko
d80b93ce74 Update founder section: remove photo, add AI certifications from LinkedIn
- Remove avatar placeholder (no photo available)
- Update background: 2.5+ years at OLIVER Agency (WPP), 30-50% manual effort reduction
- Add AI certs: Prompt Engineering (Vanderbilt), GenAI for Marketing (Microsoft),
  Vertex AI (Google), AI in Business (LinkedIn), Make Basics
- Separate analytics certs: Power BI, Laba Business/Marketing Analytics

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:29:13 +00:00
Vadym Samoilenko
206de6a8d4 Remove Cases from navigation menu
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:26:57 +00:00
Vadym Samoilenko
a7b8738262 Fix founder section: name to Vadym Samoilenko, avatar placeholder, interactive hover effects
- Fix name from Danylo to Vadym Samoilenko
- Remove broken photo file, add gradient avatar with initials as placeholder
- Add whileHover animations to differentiator cards, values, industry badges, founder card
- Glass cards lift on hover with orange glow
- Founder card glow/shadow on hover

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:25:53 +00:00
Vadym Samoilenko
af26ccd2b7 Add About, Services, Pricing pages with quote form
- /about: company story, differentiators, values, founder bio, industries, company details
- /services: 6 service cards with pricing, assurance pack, process steps, tech stack
- /pricing: pricing table, retainer tiers, training, payment terms, discounts, comparison, FAQ, inline quote form
- QuoteForm component with service dropdown + project description textarea
- POST /api/quote endpoint via Resend for quote requests
- Nav updated: About Us, Services, Pricing now route to standalone pages
- SEO: JSON-LD schemas, sitemap.xml, llms.txt updated
- Founder photo added

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:19:30 +00:00
Vadym Samoilenko
7c8276da17 Add dates to filler reviews for visual consistency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:47:21 +00:00
Vadym Samoilenko
b45a1810c3 Add filler reviews for AI bots and web development, fix carousel with few reviews
Google reviews come first, filler reviews pad the carousel to ensure it works smoothly.
Filler reviews focus on AI chatbots, voice assistants, and website development.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:43:06 +00:00
Vadym Samoilenko
37f250f7ed Filter out reviews without text, sync twice a month
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:40:13 +00:00
Vadym Samoilenko
9ca6272b98 Fix deploy to preserve reviews.json and show all rated reviews
- Exclude reviews.json from rsync --delete so deploy doesn't wipe it
- Show all reviews with rating >= 4 (not just those with text)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:30:37 +00:00
Vadym Samoilenko
6c1956585a Add SEO, structured data, AI indexing, and Google Reviews integration
- Add react-helmet-async with SEO component for dynamic meta tags on all pages
- Add JSON-LD structured data (Organization, WebSite, ProfessionalService) to index.html
- Add fallback OG/Twitter Card meta tags in index.html for non-JS crawlers
- Add robots.txt allowing all crawlers including AI bots (GPTBot, Claude-Web, etc.)
- Add sitemap.xml with all routes
- Add llms.txt for AI crawler discovery
- Add X-Robots-Tag header and reviews.json cache rule to nginx.conf
- Replace fake testimonials with Google Reviews (fetch /reviews.json)
- Add star ratings, Google badge, and "Leave us a review" button to testimonials
- Add server/sync-reviews.mjs for daily Google Places API review sync

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:26:05 +00:00
Vadym Samoilenko
d0516d18d3 Add GDPR cookie consent banner
Analytics (Mixpanel, Amplitude, Google Analytics) now only
initialise after user accepts cookies. Reject option available.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 14:02:35 +00:00
Vadym Samoilenko
bcc8dca87b Add Privacy Policy and Terms of Use pages
UK GDPR compliant with ICO Registration No. ZB979660.
Routes: /privacy-policy, /terms-of-use. Footer links updated.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:59:37 +00:00
Vadym Samoilenko
67c7ab3289 Initial commit: Aimpress website
React 19 + TypeScript SPA with Vite, mobile responsive fixes,
GitHub Actions CI/CD pipeline for automated deployment.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 13:47:37 +00:00