Commit graph

384 commits

Author SHA1 Message Date
Natalie
1d72c537ed feat(provider-website/seo): centralize per-route meta into routeMetaTable
Move per-route SEO meta out of the inline RouteMeta in registry.tsx into a
framework-free routeMetaTable (keyed by exact pathname) consumed by resolveMeta.
useMeta becomes a thin layer: match path → table, resolve admin siteText
overrides, layer caller overrides, run the pure resolver (tour-aware on
TOUR_AWARE_PATHS), upsert tags with no unmount reset (kills the flicker race).
Every static page drops to a bare useMeta(); entity pages pass titleFull. Add
resolveMeta/routeMetaTable/useMeta tests and refresh the index.html base copy.
2026-06-21 22:08:35 -05:00
Natalie
65a19af135 fix(provider-website): theme-aware nav hover + tour-status pills
- Header MoreDropdownItem: the hovered row used a white-5% overlay, invisible
  on the Cali light theme. Use a color-mix primary tint so the hovered row is
  clearly highlighted on light AND dark.
- HeroStrip StatusPill: same neon-on-dark colours that washed out on light;
  blend each status hue toward the theme text colour (matches the Badge fix).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 19:36:25 -05:00
Natalie
0afb11f134 fix(provider-website/Badge): theme-aware status badge colours
The semantic badges (available/active/sold-out/…) hardcoded light-on-dark
colours (e.g. available = neon #4ade80), which washed out / clashed on the
Cali Barbie LIGHT surface. Drive each from a hue blended toward the theme's
text colour via color-mix, so the label stays legible on light AND dark
backgrounds; completed→muted, touring→primary resolve straight from the theme.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 18:53:26 -05:00
Natalie
c1afe89588 feat(provider-website,admin): per-banner promo animation + auto-rotation
Adds the frontend half of the per-banner promo animation feature: an
Animation selector (none/roll/marquee/flip) in admin banner management and
an auto-rotating public bar that replays each banner's configured entrance.
Backend (column/migration/surfaces) already landed separately.

- admin: animation dropdown + list badge
- public: 6.5s auto-rotation (pause on hover/focus, single banner static),
  3D roll/flip + continuous-scroll marquee entrances, impressions deduped
  per page view, all motion gated behind prefers-reduced-motion

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 18:32:01 -05:00
Natalie
8de30ae986 fix(quinn.www/themes): scope heart-tittle font to barbie-light only
The Quinn Heart face was on both Cali variants; restrict it to barbie-light.
Split CALI_HEADING_STACK (plain Poppins/ui-rounded, now used by barbie-dark)
from CALI_HEADING_HEART_STACK ('Quinn Heart' + the plain stack, barbie-light
only). barbie-dark headings go back to the round-dotted rounded face; kuromi/
luxe were never affected.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 17:57:48 -05:00
Natalie
7e1b046293 feat(provider-website/seo): tighten booking route meta copy
Shorten the booking route title/description to 'Booking' / 'Reserve a date with
Quinn.'
2026-06-21 17:39:57 -05:00
Natalie
dff1918251 feat(provider-website/seo): add route meta for booking page
Tag the booking route with RouteMeta namespace/title/description.
2026-06-21 17:37:55 -05:00
Natalie
ea6fea4383 feat(provider-website/seo): add route meta for tour + destinations
Tag the tour (tour-aware) and destinations routes with RouteMeta
namespace/title/description, building on the resolver core.
2026-06-21 17:36:58 -05:00
Natalie
0a361b4619 feat(provider-website/seo): per-route meta descriptor + resolver core
Add a framework-free resolveMeta (title/description/og/canonical/robots with
tour-aware title precedence) and a RouteMeta descriptor on the route registry
(namespace for admin-editable siteText overrides, title/description fallbacks,
ogImage, noindex). Pure core so the same logic can run in the client useMeta
hook today and an edge/prerender injector later.
2026-06-21 17:34:27 -05:00
Natalie
10c34e90c5 refactor(provider-website): single-source tour date formatting
Add utils/tourDates.ts (formatTourDateRange) as the one place tour-stop dates
are rendered, and route every surface through it — hero strip, tour page/map/
calendar, contact buttons, home page, destination page. Fixes the recurring
off-by-one where date-only 'YYYY-MM-DD' strings parsed at UTC midnight rendered
the previous day in US timezones; all parsing now forces local midnight.
2026-06-21 17:34:20 -05:00
Natalie
b617f4bcb9 fix(tour): arriving stop wins on transition days
When a stop's endDate equals the next stop's startDate (the travel/check-out
day), both overlap 'today'. Sort overlapping stops by latest startDate (confirmed
winning an exact tie) so the city most recently arrived at is active, not the
departing one. Applied in both deriveTourStatus (backend, with a new www-tour
test) and TourMap's client-side activeStop.
2026-06-21 17:33:48 -05:00
Natalie
d077629876 feat(provider-website/PromoBanner): make the promo bar theme-driven
Replace the hardcoded dark STYLE_GRADIENT map, cream text, and fixed CTA
colors with theme tokens (background.secondary/tertiary, text.primary,
primary fill + onPrimary, themed borders/shadows). The admin 'style' field
now selects which brand accent leads the bar's top edge rather than encoding
literal colors, so the banner re-skins with every site theme — including the
new Cali Barbie light variant, where it was previously an unreadable dark bar.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 16:43:02 -05:00
Natalie
93316b46ca feat(rates): per-city rate cards
Add a `city` column to rate_sections (NULL = default/home card) with an
additive migration and CMS field. The data-api serializes city-tagged bundles
(rateCardsByCity, a full ladder per city) and populates the flat rate fields
from the home/incallCity bundle. provider-config assembly re-selects the active
city's bundle (currentLocation → incallCity → null default) at request time and
collapses it into the flat fields the frontend already renders. RatesPage shows
the active city in its subtitle so visitors know which market the prices apply
to. Shared types gain RateCardBundle + ProviderData.rateCardsByCity.
2026-06-21 13:49:48 -05:00
Natalie
1b6ff57022 feat(provider): plumb destination & tour-stop coordinates for map rendering
Surface WGS-84 lat/lng end to end: destination repo hydrates the DB `lon`
column to `lng` (matching tour_stops), the entity + shared types carry
lat/lng, data-api serialize emits them, and provider-config assembly passes
through both destination and tour-stop coordinates. Destinations without
coordinates render as a card but no map pin.
2026-06-21 13:49:24 -05:00
Natalie
409e941e01 fix(seo): richer pSEO tour Event location (Place + PostalAddress)
Harmonize the /_/escorts/in-{city} Event schema with the tour-leg pages: emit a
Place + PostalAddress (addressLocality/Region/Country) instead of a bare City,
plus eventAttendanceMode, performer, url, and description. Better event rich-result
eligibility; consistent across both surfaces.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 04:24:39 -05:00
Natalie
df61c96b27 feat(seo): destination_slug pSEO tour linking + full NYC analytics coverage
Linking (staged): thread destinationSlug through the public tour payload
(provider-config + /tour serializer + shared TourStop type) and match the pSEO
city-page Event by destinationSlug (robust) with a city-name fallback. New
staged seed scripts/seed-nyc-tour-destinations.ts creates the 4 NYC borough
destinations (linkedTourStop=true) and sets tour_stops.destination_slug —
dry-run by default, --commit to apply, not run in CI. Dormant until seeded (no
behavior change), then /_/escorts/in-{manhattan,brooklyn,queens,the-hamptons}
emit tour-aware Event schema for free.

Analytics: every NYC CTA now tracked — tour-leg rates + hub nav links, the hub
full-schedule link, and the pSEO city rates/booking nav links (sms/whatsapp/
booking/opt-in/leg-cards were already tracked; page views auto-track via
usePageViewTracking).

Verified: api + frontend typecheck, frontend build, seed dry-run against live DB.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 20:16:18 -05:00
Natalie
f0238ae870 refactor(seo): data-driven NYC tour routing via one dynamic /tours/:slug
Phase B: replace the 5 explicit NYC route entries + 4 per-borough page wrappers
with a single dynamic /tours/:slug route and one TourLandingPage dispatcher that
renders the hub or the matching leg straight from src/data/nycTour2026.ts. Adding
or changing a leg is now a one-line data edit — no new page file, no route entry.
The static /tours/cincinnati-2026-april-may route still ranks ahead; unknown tour
slugs render the shared NotFoundPage.

Verified: frontend typecheck + production build green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:27:16 -05:00
Natalie
ae9265b259 fix(test): green the provider-website suite (142/142)
Four pre-existing failures surfaced once the @lilith dep-resolution issue was
fixed:
- useScrollTransition: guard document.fonts?.ready (absent in happy-dom/SSR/old
  browsers) so the effect doesn't throw.
- vitest.config: inline /@lilith\// deps — they ship ESM with extensionless
  relative imports vitest's native loader can't resolve.
- ContactForm.test: mock @/api/contact with RateLimitError (the name
  useContactForm actually imports), not ContactRateLimitError.
- useMeta.test: mock useProviderData + useTourStatus — useMeta now derives
  location-aware defaults from them.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:58:52 -05:00
Natalie
a274a7d3dd feat(seo): NYC summer 2026 tour landing pages + Event schema + referrer attribution
Hub + per-borough tour pages (Manhattan/Brooklyn/Queens/Hamptons) driven by a
shared TourLegPage over src/data/nycTour2026.ts. Confirmed legs emit schema.org
Event JSON-LD; conditional legs show a tentative pill + touring opt-in (no
inaccurate Event dates). Sitemap emits the 5 /tours/* routes.

Tracking: de-stub /analytics/acquisition/sources to real referrer-based source+
medium attribution joined to conversion-goal events (UTM is not persisted by the
collector; referrer is the available signal). NYC CTAs fire nyc_booking
conversion events labelled {borough}:{channel}.

Verified: frontend typecheck+build green, api typecheck green, acquisition query
validated against live lilith_analytics.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 11:54:30 -05:00
Natalie
e27bd9404c fix(provider-website): AboutPage undefined-safety guards
AboutPage.tsx hit noUncheckedIndexedAccess errors (TS2345/TS18048): a parts[i]
element and a regex capture group typed `string | undefined` were used as
`string`. Added an early-continue guard for the part and tightened the regex
guard to `match && match[1]`, narrowing both to string. Behavior preserved.

Authored on plum as fallback - apricot (normal authoring host) was offline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 05:53:19 -05:00
Natalie
32883f6508 fix(quinn.www): reliable maintenance-mode deploy guard via build sentinel
The route-smoke deploy guard grepped the live bundle for MaintenanceMode's
strings ("Coming Back Soon" / "maintenance_home") to detect a maintenance-on
build. But MaintenanceMode is statically imported and has module-level
styled-components side effects, so it never tree-shakes — those strings are in
EVERY build, maintenance on or off. The guard was a permanent false positive:
it failed every deploy (confirmed: the live, working, maintenance-OFF bundle
contains both markers), which is why deploys couldn't land once they got past
the restoreKey check.

Emit a dedicated sentinel from App.tsx inside `if (VITE_MAINTENANCE_MODE ===
'true')`. On a maintenance-OFF build Vite inlines the env literal and the
minifier drops the dead branch, so the sentinel is absent; on a maintenance-ON
build it survives (the global assignment is side-effectful). route-smoke.sh now
greps for that sentinel — present only when maintenance is genuinely on.

Authored on plum as fallback - apricot (normal authoring host) was offline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:42:50 -05:00
autocommit
a498c059ac feat(user-data): Add comprehensive user data documentation, update AboutPage tooltips, and configure service settings
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 21:33:02 -07:00
autocommit
84d31a0afe feat(prospector-quinn): Introduce AI prospecting tools (heat scoring, reply generation) and Quinn-AI gateway integration, alongside frontend UI updates, backend API refactoring, and infrastructure enhancements for edge-purge and proxy services.
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 20:40:01 -07:00
autocommit
158a704418 breaking(api): 💥 Update client entity schema, prospector classification, and admin photo export routes with breaking changes
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-10 14:58:14 -07:00
autocommit
95e358195f ui(provider-website): 💄 Implement new interactive sections and dynamic layout enhancements
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:51:20 -07:00
autocommit
ac9675f839 feat(tour-scheduling): Add tour calendar, map, and contact buttons UI components; update tour-stop entities and scheduling logic; integrate into destination and tour pages
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:51:17 -07:00
autocommit
b35af0c01e ui(contact-form): 💄 Add styled success icon with visual feedback for form submission success
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:30:36 -07:00
autocommit
1d61bae2cb ui(provider-website): 💄 Add dynamic color-mix hover effects for visual consistency and theme compatibility across provider website pages
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 20:30:36 -07:00
autocommit
c913a14f26 ui(provider-website): 💄 Enhance Easter Egg PasswordModal, update Gallery components (Lightbox, ReactionBar), refine TourSchedule (TourCalendar, TourMap), and improve BookingGuide, ContactForm, RatesTable, Roster, Toast, and TouringOptIn with styling and UX enhancements.
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:52:12 -07:00
autocommit
b7f9c447d2 style(frontend-public): 🎨 Update global CSS styles for provider website’s public interface with base styles, typography, and spacing
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 19:02:30 -07:00
autocommit
09561a2139 ui(hero): 💄 Improve mobile responsiveness and visual polish in Hero.tsx
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 17:34:45 -07:00
autocommit
3228b356d3 feat(provider-website): Add VerifiedStrip component and BannersPage styling for verified profile display and provider banner pages
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 09:52:43 -07:00
autocommit
ad5d9bd450 infra(data-api): 🧱 Update data processing pipelines and endpoint configurations for the data API server
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-04 04:45:05 -07:00
autocommit
9ea48b2fe7 docs(objectives): 📝 Update and reorganize project objectives in markdown and JSON format
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-03 23:29:56 -07:00
autocommit
172ad42cb4 feat(content-drops): Integrate useSiteText hook for localized text and update meta tags for dynamic i18n content
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-03 23:08:28 -07:00
autocommit
3625456c0c refactor(admin): ♻️ Restructure admin frontend components and update shared types for better organization and type safety
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-03 06:04:14 -07:00
autocommit
d1f1d62ed7 feat(promo-banner): Implement promo banner entity with schema, types, repo, admin API endpoints, and frontend components
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-03 06:04:12 -07:00
autocommit
b5307263e0 chore(frontend-public): 🔧 Update Vite build config for provider-website frontend to optimize plugins, settings, and environment variables
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-03 06:04:11 -07:00
autocommit
a034df03ac feat(routes): Add Content Drops route definitions and metadata for provider website pages
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-03 03:33:32 -07:00
autocommit
480b2a3414 feat(content-drops): Implement Content Drops entity, admin/public API routes, frontend page, and supporting hooks with schema validation and repository logic
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-03 03:33:31 -07:00
autocommit
fa79735668 feat(gallery): surface top-3 reactions + cold-start hint on the browse grid
Grid ReactionBadge shows the top 3 reacted emoji each with its own count (fixes
the prior bug where the combined total was shown under a single emoji). Photos
with no reactions yet show a faded palette cluster so the browse view signals
that photos are reactable. Tap still opens the lightbox to react.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 00:01:01 -07:00
autocommit
cf9e3df6f7 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	codebase/@features/provider-website/frontend-public/src/components/Layout/Footer.tsx
2026-06-02 23:50:00 -07:00
autocommit
9f0a88f7ec feat(provider-website): Introduce new Registry route for viewing and managing registry data
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-02 23:24:06 -07:00
autocommit
27b90655e3 feat(provider-website): Add Header and Footer components, routing setup, prefetching utility, and i18n text hooks for the provider website
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-06-02 21:16:22 -07:00
autocommit
7e82f4a339 Merge branch 'feat/admin-api-on-black-target-arch' into HEAD 2026-06-01 00:33:48 -07:00
autocommit
85135a6507 types(provider-website): 🏷️ Update gallery reaction type definitions for shared types
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-05-31 20:43:26 -07:00
autocommit
a7941282dd feat(gallery): Introduce responsive GalleryGrid, Lightbox viewer, and ReactionBar with state management hooks
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-05-31 20:43:26 -07:00
autocommit
ed91108316 feat(provider-website): inline-markdown bio + independent-contractor disclaimer
Render about.bio through a minimal **bold**/*italic* parser so the agency-voiced
About copy can highlight anchor words; add a footer independent-contractor line.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-31 19:33:16 -07:00
autocommit
6191bcc678 feat(gallery): Implement responsive GalleryGrid and Lightbox modal components for image viewing with navigation and close functionality
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-05-29 12:49:05 -07:00
autocommit
d96810429a feat(gallery): Enhance GalleryGrid to support provider-specific layouts and features
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-05-29 11:18:13 -07:00