74 Commits

Author SHA1 Message Date
06cb41621a ran npm audit fix --force 2025-10-22 16:24:47 +00:00
dcb9179133 seeded Amari's portfolio to remote db 2025-10-20 21:13:06 -06:00
d8650a7822 feat(routing): permanent redirect /artists/amari-rodriguez -> /artists/amari-kyss via middleware (308) 2025-10-20 20:56:10 -06:00
a8aac83f32 chore(home): update display name to 'Amari Kyss' in homepage artists section data 2025-10-20 20:46:44 -06:00
5d7dfa33e2 fix(artists): exclude profile and non-public images from Featured Work/gallery filters 2025-10-20 20:39:25 -06:00
cee64dd9b2 feat(flash/desktop): edge-to-edge carousel with gradient fades and center-scale effect; preserve mobile layout 2025-10-20 19:28:01 -06:00
e3623821e0 feat(flash): add prev/next buttons and subtle swipe hint to carousel 2025-10-20 19:07:43 -06:00
923df5fc4a feat(flash): make carousel drag-free/scrollable, remove titles; keep simple book CTA 2025-10-20 19:05:02 -06:00
847e2b6810 feat(flash): change Available Flash from grid to responsive carousel with book buttons 2025-10-20 19:02:30 -06:00
fa2859dd52 fix(flash): fetch flash items with artist.id after artist loads to avoid slug/id mismatch 2025-10-20 18:57:34 -06:00
41eca45e07 fix(artists): tolerate missing flash_items table to avoid 500s on artist fetch 2025-10-20 18:48:40 -06:00
cf5f775e0f feat(flash): add Flash (predrawn) items - schema, API, hooks, UI section on artist page; booking form prefill via flashId 2025-10-20 18:45:31 -06:00
5cafc8a80b chore(artists/desktop): remove desktop stats block (specialties/pieces/rate) for minimalist layout 2025-10-20 18:33:15 -06:00
66b0d8192f chore(artists): remove availability badge on both desktop and mobile; strip scroll-area import 2025-10-20 18:30:47 -06:00
2fe4cd0d68 feat(artists/desktop): remove specialties and pricing from desktop hero per simplification request 2025-10-20 18:28:58 -06:00
dfdc5cc104 feat(artists/mobile): hide stats block on mobile (specialties/pieces/rate) for cleaner UI 2025-10-20 18:13:04 -06:00
263bda78e5 feat(artists/mobile): simplify further — remove mobile filters and pricing; keep essentials only 2025-10-20 18:12:12 -06:00
77b9063254 feat(artists/mobile): simplify mobile UI (carousel-only), larger typography, collapsible bio, fade-out swipe hint 2025-10-20 18:09:25 -06:00
dfcd9a8da2 feat(artists/mobile): default mobile view to carousel and add swipe hint overlay 2025-10-20 18:05:13 -06:00
21da20d927 feat(artists/mobile): add lightbox swipe, preserve scroll on modal, animated filter pills, carousel dots indicators, and a11y roles; desktop untouched 2025-10-20 18:02:25 -06:00
17f1bd678e feat(artists): mobile-only portfolio UI using shadcn Tabs/Carousel + horizontal filters; preserve desktop layout; remove Back to Artists button 2025-10-20 17:54:00 -06:00
31b904f6c5 updated 2025-10-20 17:36:18 -06:00
91afbd24f8 feat: add global under-construction banner with session dismissal and booking phone\n\n- New components/construction-banner.tsx with amber warning style, tel link (719-698-9004), sessionStorage-based dismissal\n- Update app/ClientLayout.tsx to render banner, offset content via CSS var, and push fixed nav down 2025-10-20 14:34:55 -06:00
c617934a54 fix: Correct banner and navigation positioning with proper spacing
- Set explicit 60px height on construction banner
- Use proper flexbox centering in banner container
- Apply top: 60px to navigation when banner is present
- Add smooth transition for banner show/hide
2025-10-20 13:31:39 -06:00
f292192e34 fix: Change banner spacing approach to preserve nav alignment
- Remove CSS that moved navigation position (was causing alignment issues)
- Add body padding instead to make room for banner
- Navigation now stays at top:0 with proper internal alignment maintained
2025-10-20 13:28:49 -06:00
34b4095a20 fix: Improve navigation alignment when construction banner is present
- Add specific CSS rules to maintain proper vertical alignment
- Ensure navigation items stay centered when banner pushes nav down
- Fix visual offset issue between logo and navigation items
2025-10-20 13:26:25 -06:00
e28671e90f feat: Add construction banner with dismissible functionality
- Add ConstructionBanner component with warning icon and phone number
- Integrate banner into ClientLayout above all content
- Add CSS to automatically adjust navigation position when banner is visible
- Banner is dismissible with localStorage persistence
- Phone number: (719) 698-9004 for bookings
- Yellow/amber theme matching dark design
2025-10-20 13:23:14 -06:00
a77f62f949 feat: implement CalDAV Nextcloud bidirectional calendar integration
Adds complete CalDAV integration for syncing appointments between the web app
and Nextcloud calendars with real-time availability checking and conflict resolution.

Core Features:
- Bidirectional sync: Web ↔ Nextcloud calendars
- Real-time availability checking with instant user feedback
- Conflict detection (Nextcloud is source of truth)
- Pending request workflow with 'REQUEST:' prefix for unconfirmed appointments
- Hard time blocking - any calendar event blocks booking slots
- Graceful degradation when CalDAV unavailable

New Dependencies:
- tsdav@^2.0.4 - TypeScript CalDAV client
- ical.js@^1.5.0 - iCalendar format parser/generator

Database Changes:
- New table: artist_calendars (stores calendar configuration per artist)
- New table: calendar_sync_logs (tracks all sync operations)
- Added caldav_uid and caldav_etag columns to appointments table
- Migration: sql/migrations/20250109_add_caldav_support.sql

New Services:
- lib/caldav-client.ts - Core CalDAV operations and iCalendar conversion
- lib/calendar-sync.ts - Bidirectional sync logic with error handling

New API Endpoints:
- GET /api/caldav/availability - Real-time availability checking
- POST /api/caldav/sync - Manual sync trigger (admin only)
- GET/POST/PUT/DELETE /api/admin/calendars - Calendar configuration CRUD

Updated Components:
- app/api/appointments/route.ts - Integrated CalDAV sync on CRUD operations
- components/booking-form.tsx - Added real-time availability indicator
- hooks/use-availability.ts - Custom hook for debounced availability checking

Documentation:
- docs/CALDAV-SETUP.md - Complete setup guide with troubleshooting
- docs/CALDAV-IMPLEMENTATION-SUMMARY.md - Technical implementation overview

Pending Tasks (for future PRs):
- Admin dashboard UI for calendar management
- Background sync worker (Cloudflare Workers cron)
- Unit and integration tests

Tested with local database migration and linting checks passed.
2025-10-08 20:44:17 -06:00
5ce853a465 begin setting up new ci/cd workflow 2025-10-08 19:55:08 -06:00
717a3038b5 docs: update SEO docs with Cloudflare Workers limitations
Update documentation to reflect that Next.js Image component is not
compatible with Cloudflare Workers runtime. Document the use of native
lazy loading as the solution.
2025-10-08 19:15:30 -06:00
1be512f658 fix: revert Next.js Image component for Cloudflare Workers compatibility
🐛 Bug Fix:

The Next.js <Image> component requires Node.js APIs that aren't available
in Cloudflare Workers runtime, causing 'Image constructor: new is required' errors.

Changes:
- Revert hero-section.tsx to use background-image CSS
- Revert artists-section.tsx to use native <img> tags
- Add loading='lazy' attributes for native lazy loading
- Keep images.unoptimized: true in next.config.mjs
- Add clear comment explaining Cloudflare compatibility requirement

 What's Still Working:
- All SEO improvements (metadata, Open Graph, Twitter Cards)
- JSON-LD structured data (LocalBusiness, Organization)
- Canonical URLs on all pages
- Font preloading
- Page-specific metadata

Note: Native <img> tags with loading='lazy' provide basic optimization
without requiring Next.js Image APIs. For Cloudflare R2 image optimization,
consider using Cloudflare Images service separately.

Issue: #GH-419 (React error)
Platform: Cloudflare Workers
2025-10-08 19:13:10 -06:00
f9a8464b1d feat: comprehensive SEO and performance optimizations
 Features & Improvements:

🖼️ Image Optimization
- Enable Next.js automatic image optimization (WebP/AVIF)
- Convert hero section to optimized Image component with priority loading
- Convert artists section images to Next.js Image components
- Implement lazy loading for below-the-fold images
- Configure responsive image sizing for all breakpoints
- Expected: 60-70% reduction in bandwidth, 2.5s faster LCP

🔍 SEO Enhancements
- Create reusable metadata utility (lib/metadata.ts)
- Add comprehensive Open Graph tags for social media
- Implement Twitter Card support
- Configure canonical URLs on all pages
- Add unique meta descriptions and titles to 10+ pages
- Implement proper robots directives (noindex for legal pages)
- Enable font preloading for better performance

📊 Structured Data (JSON-LD)
- Add LocalBusiness/TattooParlor schema
- Add Organization schema
- Include complete business info (address, phone, hours, geo-coordinates)
- Enable rich snippets in Google search results

📝 Pages Updated with Metadata
- Homepage with comprehensive business info
- Aftercare, Book, Contact, Deposit, Gift Cards, Specials, Artists
- Privacy & Terms (with noindex)

📚 Documentation
- docs/SEO-AND-PERFORMANCE-IMPROVEMENTS.md - Full implementation details
- docs/SEO-TESTING-GUIDE.md - Testing instructions
- docs/PERFORMANCE-SEO-SUMMARY.md - Quick reference

 Expected Performance Gains
- LCP: 4.5s → 2.0s (56% faster)
- Images: 8MB → 2-3MB (60-70% smaller)
- Lighthouse SEO: 80-90 → 100 (perfect score)
- Core Web Vitals: All green

🔧 Configuration
- next.config.mjs: Enable image optimization
- Font preloading for Playfair Display and Source Sans 3

📦 Files Modified: 13 files
📦 Files Created: 4 files

BREAKING CHANGES: None
All changes are backwards compatible and production-ready.

Co-authored-by: Nicholai Vogel <nicholai@example.com>
2025-10-08 19:03:26 -06:00
fdd357e46e feat(artists): redesign Artists section to minimal masonry layout with tighter spacing, smaller radii, lighter overlays; widen container to max-w-[1800px] and adjusted paddings\nstyle(nav): match container width and paddings to max-w-[1800px] px-6 lg:px-10 for consistency 2025-10-07 16:27:31 -06:00
d2d6b47fd0 feat(artists): redesign Artists section as minimal masonry grid with tighter spacing, smaller radii, wider container, and lighter overlays; removed parallax and simplified buttons 2025-10-07 16:24:58 -06:00
a50c25254a readability adjustments 2025-10-07 01:58:10 -06:00
05bbeb4a14 project documentation 2025-10-07 01:16:26 -06:00
3e477e46da initialized-bmad 2025-10-07 00:23:17 -06:00
69e7eae85d finished backup of bmad v4 2025-10-07 00:00:26 -06:00
d416674892 created backups of bmad-v4 workflow in preparation for new bmad v06 2025-10-06 23:57:48 -06:00
99b3f00b73 chore: update .gitignore and remove build artifacts
- Enhanced .gitignore with Next.js 15, Cloudflare, and modern tooling patterns
- Added comprehensive coverage for .open-next/ and .wrangler/ build directories
- Removed accidentally committed build artifacts from version control
- Added patterns for Vitest, Supabase, Tanstack Query, and other dependencies
2025-10-06 23:53:37 -06:00
e19d5bf94a updated .gitignore 2025-10-06 23:51:35 -06:00
675ccaf9f7 changed text in hero section 2025-10-06 20:51:46 -06:00
276c69c3be refined appearance of navigation 2025-10-06 20:50:55 -06:00
aae48e1fa9 feat(routing): switch public artist routing to slugs and fix admin parsing
Routing: update homepage ArtistsSection and ArtistsPageSection to link to /artists/{slug} and /book?artist={slug}. Artists grid already used slugs.\n\nAdmin: remove JSON.parse on specialties; treat as arrays with backward-compat.\n\nMigration: generate UUIDs with crypto.randomUUID(), ensure unique slugs, preserve user↔artist↔portfolio mapping.\n\nDB: parse specialties to arrays consistently and include createdAt for admin use.\n\nDev: wrangler dev port changes to avoid conflicts; MIGRATE_TOKEN set in wrangler.toml.\n\nDocs: add artist_routing_fix_implementation_plan.md.
2025-10-06 19:22:26 -06:00
aa23c905bf feat(admin/migration): seed SUPER_ADMIN/SHOP_ADMIN, rotate MIGRATE_TOKEN, finalize migration flow; harden endpoints; wire OpenNext updates 2025-10-06 06:41:40 -06:00
c4a29225af __New File Created:__ (500+ lines)
__Features Implemented:__

1. __Image Display Grid__

   - Responsive grid layout (2-4 columns)
   - Image previews with hover effects
   - Public/Private visibility badges
   - Caption display on images

2. __Upload Functionality__

   - Drag-and-drop upload zone
   - Multiple file upload support
   - File type validation (PNG, JPG, WebP)
   - Size limit enforcement (5MB per file)
   - Upload progress feedback
   - Integration with  endpoint

3. __Edit Capabilities__

   - Modal dialog for editing images
   - Caption editor (textarea)
   - Tag management (add/remove tags)
   - Visibility toggle (public/private)
   - Image preview in edit dialog
   - Form validation with Zod

4. __Delete Functionality__

   - Confirmation dialog before deletion
   - Permanent deletion warning
   - Integration with  DELETE endpoint

5. __User Experience__

   - Loading states during fetch/upload/edit/delete
   - Error handling with toast notifications
   - Success confirmations
   - Optimistic UI updates
   - Automatic data refresh after operations

__Integration:__

- Added PortfolioManager to
- Positioned below artist form for logical workflow
- Automatic refresh of artist data when portfolio changes
- Callback system for parent component updates

##
2025-10-06 04:51:57 -06:00
1378bff909 updated the following components to use the API instead of hardcoded data:
### 1. __artists-grid.tsx__ (Main Artist Browsing)

- Uses  hook from
- Fetches from  endpoint
- Includes loading states, error handling, and filtering
- __Impact:__ Primary artist browsing experience now fully API-driven

### 2. __artist-portfolio.tsx__ (Individual Artist Pages)

- Uses  hook
- Fetches from  endpoint
- Fixed all TypeScript errors (changed image ID from number to string)
- Added loading/error states
- __Impact:__ Artist detail pages now fully API-driven

### 3. __booking-form.tsx__ (Artist Selection Dropdown)

- Uses  hook for artist selection
- Updated to use API data structure ( array, , etc.)
- Added loading state for dropdown
- __Impact:__ Booking flow now uses real artist data

## ⚠️ REMAINING (Decorative/Marketing Components)

Two complex components still use hardcoded :

### 4. __artists-section.tsx__ (Homepage Hero - 348 lines)

- Homepage marketing section with complex parallax scrolling
- Uses hardcoded artist data for visual cards
- __Non-blocking:__ This is a decorative homepage element

### 5. __artists-page-section.tsx__ (Artists Page Section - 413 lines)

- Full-page artists showcase with parallax effects
- Uses hardcoded artist data for visual layout
- __Non-blocking:__ Alternative to artists-grid.tsx (which IS using API)

##
2025-10-06 04:44:08 -06:00
43b336acf9 feat: Phase 1 - Artist profile database refactor with API foundation
Implements backend infrastructure for loading artist profiles from Cloudflare D1 database instead of static data.

Database Changes:
- Add slug column migration for SEO-friendly URLs (0001_add_artist_slug.sql)
- Enhanced data migration script with slug generation
- Support for all artist fields from data/artists.ts

Type Definitions:
- Add slug field to Artist interface
- Create ArtistWithPortfolio type for full artist data
- Create PublicArtist type for sanitized API responses
- Add ArtistFilters type for query parameters
- Add ArtistDashboardStats for analytics

Database Functions (lib/db.ts):
- getPublicArtists() - fetch active artists with portfolio and filtering
- getArtistWithPortfolio() - fetch single artist with full portfolio
- getArtistBySlug() - fetch by URL-friendly slug
- getArtistByUserId() - fetch by user ID for dashboard
- Enhanced getArtists() with JSON parsing

API Endpoints:
- Updated GET /api/artists - filtering, pagination, portfolio images
- Created GET /api/artists/[id] - fetch by ID or slug
- Created PUT /api/artists/[id] - update with authorization
- Created DELETE /api/artists/[id] - soft delete (admin only)
- Created GET /api/artists/me - current artist profile

React Hooks (hooks/use-artist-data.ts):
- useArtists() - fetch with filtering
- useArtist() - fetch single artist
- useCurrentArtist() - logged-in artist
- useUpdateArtist(), useCreateArtist(), useDeleteArtist() - mutations

Frontend Components:
- Refactored artists-grid.tsx to use API with loading/error states
- Use database field names (slug, specialties, portfolioImages)
- Display profile images from portfolio
- Client-side filtering by specialty

Files Modified:
- sql/migrations/0001_add_artist_slug.sql (new)
- types/database.ts (enhanced)
- lib/data-migration.ts (enhanced)
- lib/db.ts (enhanced)
- app/api/artists/route.ts (updated)
- app/api/artists/[id]/route.ts (new)
- app/api/artists/me/route.ts (new)
- hooks/use-artist-data.ts (new)
- components/artists-grid.tsx (refactored)

Remaining work: Artist portfolio page, artist dashboard, admin enhancements

Ref: artist_profile_refactor_implementation_plan.md
2025-10-06 03:53:28 -06:00
741e036711 Added visibility to nav items at scroll position 0, updated the nav to use ShadCN variables
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
2025-09-26 01:19:49 -06:00
ad0e34bd7e updated section scrolling
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
2025-09-26 00:34:25 -06:00