Commit Graph

65 Commits

Author SHA1 Message Date
belviskhoremk
c733a5afa9 feat: add Book page with the full mock-data booking flow 2026-08-03 17:56:01 +00:00
belviskhoremk
358b5121f0 fix: make useBooking submit() validate synchronously instead of racing setState's updater 2026-08-03 17:51:45 +00:00
belviskhoremk
a270c33c73 feat: add useBooking hook for the booking flow state machine 2026-08-03 17:49:42 +00:00
belviskhoremk
f4687105bb fix: use globalThis instead of Node-only global in test setup to unblock the TypeScript build
Replace 'global.IntersectionObserver' with 'globalThis.IntersectionObserver' to fix
TS2304 "Cannot find name 'global'" error. globalThis is the standard environment-agnostic
reference that type-checks cleanly in browser-targeted tsconfig. Runtime behavior
identical to global in Node/jsdom contexts.

Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 17:39:30 +00:00
belviskhoremk
0795efc421 fix: apply CSS module class for active Shop category filter
Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 17:37:14 +00:00
belviskhoremk
698f79daf6 feat: add Shop page with category filter and product inquiries
Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 17:33:55 +00:00
belviskhoremk
cdc74488cd feat: add InquiryModal for product inquiries
Implements a modal component for collecting product inquiries with name, email, and notes fields. Validates name (required) and email (must contain @) client-side, displays inline error messages for invalid input, and shows a confirmation message on valid submit.

Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 17:30:52 +00:00
belviskhoremk
88379caee2 feat: add ProductCard and ServiceCard components
Implement ProductCard component with:
- Renders product details (name, price, description)
- "Ask about this" button disabled when out of stock
- Shows "Currently unavailable" badge when out of stock
- Calls onInquire callback when clicked

Implement ServiceCard component with:
- Renders service details (name, formatted duration, price)
- Clickable button card that calls onSelect with service id
- formatDuration helper for human-readable time format

Both components include CSS modules with hover effects and proper styling.
All 4 tests pass (2 for each component).

Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 17:27:31 +00:00
belviskhoremk
8c88f2a891 fix: isolate Hero3D reduced-motion test from framer-motion's module-level cache
framer-motion's useReducedMotion() hook caches its result at the module level
and never re-reads window.matchMedia on subsequent calls. This caused the second
test to fail because the cache was locked to the first test's matchMedia mock.

Fixed by using vi.doMock() with vi.resetModules() to mock useReducedMotion
directly with the desired value for each test, ensuring each test runs with a
fresh module context where the hook returns the expected value.

Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 17:22:54 +00:00
belviskhoremk
e3cdb743ab feat: add Hero3D scroll-driven rotating motif component
- Implements Hero3D component with CSS 3D transforms
- Uses framer-motion's useScroll/useTransform for scroll-linked rotation
- Respects prefers-reduced-motion preference for static rendering
- Component structure: wrapper with perspective, inner motif with 3D rotation
- Test setup: added window.matchMedia mock for framer-motion compatibility

Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 17:18:42 +00:00
belviskhoremk
ede4387ab3 feat: add shared Layout wrapping Nav and Footer around all routes
- Create Layout component that renders Nav > Outlet > Footer
- Wire Layout as parent route in App.tsx to wrap all page routes
- Update App.test.tsx to verify Nav/Footer render on every route

Claude-Session: https://claude.ai/code
2026-08-03 17:07:35 +00:00
belviskhoremk
df3bff9ed3 feat: add Nav and Footer components 2026-08-03 17:04:33 +00:00
belviskhoremk
619d5a506e feat: add ScrollReveal motion wrapper component
Implement ScrollReveal component that fades and rises sections into view
on scroll with framer-motion. Respects prefers-reduced-motion by
rendering children unanimated when that setting is enabled.

- Add ScrollReveal component with fade+rise animation on scroll
- Add test coverage for both animated and reduced-motion paths
- Add IntersectionObserver mock to test setup

Claude-Session: https://claude.ai/code/session_01NhxA4npAXAxmCDEJt6kxSH
2026-08-03 16:59:56 +00:00
belviskhoremk
d920651a09 feat: add mock data for products, services, availability, and rules 2026-08-03 16:56:49 +00:00
belviskhoremk
4771d3ead7 chore: set up Vitest, routing, and design tokens
Includes the base Vite+React+TS scaffold files (package.json, index.html,
tsconfigs, etc.) which had never been committed to git.
2026-08-03 16:53:05 +00:00