diff --git a/apps/web/src/components/HireCJModal.tsx b/apps/web/src/components/HireCJModal.tsx new file mode 100644 index 0000000..c738f5a --- /dev/null +++ b/apps/web/src/components/HireCJModal.tsx @@ -0,0 +1,145 @@ +import React from "react"; +import { + X, + Mail, + Briefcase, + MapPin, + Calendar, + Mic, + Radio, + Volume2, + Settings, + Cable, +} from "lucide-react"; + +interface HireCJModalProps { + isOpen: boolean; + onClose: () => void; +} + +const HireCJModal: React.FC = ({ isOpen, onClose }) => { + if (!isOpen) return null; + + const skills = [ + { icon: Mic, text: "FOH & Monitors A1 - Front of House & Monitor Mix Engineering" }, + { icon: Volume2, text: "A2 & Stage Support - Audio Assistant, Patch, RF Coordination" }, + { + icon: Settings, + text: "System Design & Deployment - PA Architecture, Setup, Tuning & Optimization", + }, + { icon: Radio, text: "RF & Intercom Systems - Wireless Coordination, Clear-Com, RTS" }, + { icon: Cable, text: "Festival & Tour Production - Signal Flow, System Integration" }, + { + icon: Briefcase, + text: "Production Management - Technical Director, Project Manager, Show Coordination", + }, + ]; + + return ( + <> +
+
e.stopPropagation()} + > +
+
+

+ Hire CJ - Professional Audio Engineer +

+ +
+ +
+
+

+ + Get In Touch +

+

+ Ready to elevate your event's audio experience? Contact me at: +

+ + cj@sounddocs.org + +

Please include:

+
    +
  • Event dates and location
  • +
  • Type of event (concert, corporate, festival, theater, etc.)
  • +
  • Specific role needed (FOH, Monitors, System Tech, RF, etc.)
  • +
  • Venue size and expected attendance
  • +
  • Equipment details if available
  • +
+
+ +
+

+ + Skills & Services +

+
+ {skills.map((skill, index) => { + const Icon = skill.icon; + return ( +
+ + {skill.text} +
+ ); + })} +
+
+ +
+

+ + Availability +

+

+ Available for events worldwide. Based in the United States with extensive touring + experience. Passport ready for international events. +

+
+ +
+

+ + Booking Information +

+

+ For the best chance of securing your dates, please reach out as early as possible. + I work with a production company full time, and my schedule fills up quickly +

+
+
+ +
+ +
+
+
+
+ + ); +}; + +export default HireCJModal; diff --git a/apps/web/src/components/WheresCJ.tsx b/apps/web/src/components/WheresCJ.tsx index eceec14..0440621 100644 --- a/apps/web/src/components/WheresCJ.tsx +++ b/apps/web/src/components/WheresCJ.tsx @@ -1,6 +1,7 @@ import React, { useState, useEffect } from "react"; -import { MapPin, Loader2, WifiOff } from "lucide-react"; +import { MapPin, Loader2, WifiOff, Briefcase } from "lucide-react"; import { fetchCurrentCJLocation } from "../lib/supabase"; +import HireCJModal from "./HireCJModal"; interface LocationData { location_name: string; @@ -11,6 +12,8 @@ const WheresCJ: React.FC = () => { const [location, setLocation] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isHovered, setIsHovered] = useState(false); + const [showHireModal, setShowHireModal] = useState(false); + const [hoverTimeout, setHoverTimeout] = useState(null); useEffect(() => { const getLocation = async () => { @@ -40,10 +43,24 @@ const WheresCJ: React.FC = () => { if (!location) { return ( -
- -

Off The Grid

-

CJ is currently unavailable. Check back later!

+
+
+ +

Off The Grid

+

CJ is currently unavailable. Check back later!

+
+
+ +
); } @@ -62,7 +79,17 @@ const WheresCJ: React.FC = () => { )}
-
+
+

Find me and say hi to get some exclusive SoundDocs stickers!

@@ -71,25 +98,46 @@ const WheresCJ: React.FC = () => { ); }; + const handleMouseEnter = () => { + if (hoverTimeout) { + clearTimeout(hoverTimeout); + setHoverTimeout(null); + } + setIsHovered(true); + }; + + const handleMouseLeave = () => { + const timeout = setTimeout(() => { + setIsHovered(false); + }, 200); // 200ms delay before closing + setHoverTimeout(timeout); + }; + return ( -
setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > -
- + <> +
+
+ +
+ + {isHovered && ( +
+ +
+ )}
- {isHovered && ( -
- -
- )} -
+ setShowHireModal(false)} /> + ); };