1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/_404-CJ5XVNv6.js","assets/vendor-Visk9v06.js","assets/preload-DNrUkv91.js","assets/powerpivot-book-CUVPBfij.js","assets/alert-B0IdgUYY.js","assets/copilot-excel-book-DFIX0nXb.js","assets/_id_-BnDw6l9Y.js","assets/student-8iMTkCO3.js","assets/tabs-Cr7Q0jtH.js","assets/ProfileMenu-BH0_dJt6.js","assets/instructor-B8sJKUi6.js","assets/separator-D9zpTTcM.js","assets/instructor-blog-W6A6aBBN.js","assets/BlogImagePicker-IzDWsc-7.js","assets/admin-mwydos7a.js","assets/success-CrklEs3W.js","assets/cancel-C43VT2ZE.js","assets/invoice-confirmation-DnOZWkI0.js","assets/invoice-payment-success-E47MHV7Z.js","assets/staff-login-CdvqelaB.js","assets/reset-password-Chmuuhq4.js","assets/reset-password-confirm-DHEAQV0b.js","assets/test-enrollment-D0tBRKFX.js","assets/test-magic-link-Cw5A0QFT.js","assets/dev-reset-password-C2khYBJ4.js","assets/unsubscribe-BjwoSPno.js","assets/_token_-CIiEJRHv.js","assets/_slug_-CNFgW9eQ.js","assets/done-D8SGsd7a.js"])))=>i.map(i=>d[i]); 2var _a, _b, _c, _d; 3import { _ as __vitePreload } from "./preload-DNrUkv91.js"; 4import { r as reactExports, j as jsxRuntimeExports, C as CircleUser, B as Bot, a as ChevronDown, L as LoaderCircle, b as CircleAlert, c as CircleCheck, S as Send, X, d as Link, G as GraduationCap, Y as Youtube, t as twMerge, e as clsx, f as Slot, g as cva, h as createAuthClient, m as magicLinkClient, O as Overlay, P as Portal, i as Content, k as Close, T as Title, D as Description, R as Root, l as Trigger, n as Root$1, o as CollapsibleTrigger$1, p as CollapsibleContent$1, q as Root$2, s as Plus, u as Trash2, v as Root2, I as Item2, w as Indicator, x as Circle, y as Checkbox$1, z as CheckboxIndicator, A as Check, E as useNavigate, F as ShoppingCart, M as Minus, H as CreditCard, J as FileText, K as useLocation, N as Menu, Q as Helmet, U as ScrollRestoration, V as motion, W as Monitor, Z as ArrowRight, _ as Star, $ as Navigate, a0 as Trigger$1, a1 as Icon, a2 as ScrollUpButton, a3 as ChevronUp, a4 as ScrollDownButton, a5 as Portal$1, a6 as Content2, a7 as Viewport, a8 as Label$1, a9 as Item, aa as ItemIndicator, ab as ItemText, ac as Separator, ad as Root2$1, ae as Value, af as useLoaderData, ag as useSearchParams, ah as Search, ai as Calendar, aj as CircleCheckBig, ak as Users, al as Item$1, am as Header$1, an as Trigger2, ao as Content2$1, ap as Root2$2, aq as FileDown, ar as useParams, as as ArrowLeft, at as Clock, au as Tag, av as Video, aw as CirclePlay, ax as Wrench, ay as Award, az as MessageCircle, aA as Target, aB as BookOpen, aC as CircleHelp, aD as MapPin, aE as Headphones, aF as MonitorPlay, aG as Quote, aH as format, aI as ChevronLeft, aJ as ChevronRight, aK as RefreshCw, aL as Phone, aM as Mail, aN as Briefcase, aO as Shield, aP as AnimatePresence, aQ as objectType, aR as stringType, aS as arrayType, aT as Zap, aU as ChartNoAxesColumn, aV as useRouteError, aW as isRouteErrorResponse, aX as Toaster$1, aY as createBrowserRouter, aZ as RouterProvider$1, a_ as Outlet, a$ as QueryClient, b0 as ReactDOM, b1 as React, b2 as HelmetProvider, b3 as QueryClientProvider } from "./vendor-Visk9v06.js"; 5const SESSION_KEY = "sf_live_chat_session"; 6function getStoredSession() { 7 try { 8 return localStorage.getItem(SESSION_KEY); 9 } catch { 10 return null; 11 } 12} 13function storeSession(id) { 14 try { 15 localStorage.setItem(SESSION_KEY, id); 16 } catch { 17 } 18} 19function clearSession() { 20 try { 21 localStorage.removeItem(SESSION_KEY); 22 } catch { 23 } 24} 25function hasConsent() { 26 try { 27 return localStorage.getItem("c2_analytics_consent") === "true"; 28 } catch { 29 return false; 30 } 31} 32function HybridChatWidget() { 33 const [settings, setSettings] = reactExports.useState({ 34 enabled: true, 35 offlineOnly: false, 36 botName: "SkillForge Assistant" 37 }); 38 const [open, setOpen] = reactExports.useState(false); 39 const [consentReady, setConsentReady] = reactExports.useState(hasConsent()); 40 const [aiMessages, setAiMessages] = reactExports.useState([]); 41 const [aiInput, setAiInput] = reactExports.useState(""); 42 const [aiLoading, setAiLoading] = reactExports.useState(false); 43 const [showHandoffOption, setShowHandoffOption] = reactExports.useState(false); 44 const [mode, setMode] = reactExports.useState("ai"); 45 const [sessionId, setSessionId] = reactExports.useState(null); 46 const [liveMessages, setLiveMessages] = reactExports.useState([]); 47 const [lastMsgId, setLastMsgId] = reactExports.useState(0); 48 const [liveInput, setLiveInput] = reactExports.useState(""); 49 const [liveSending, setLiveSending] = reactExports.useState(false); 50 const sessionKey = reactExports.useRef(Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2)).current; 51 const [captureName, setCaptureName] = reactExports.useState(""); 52 const [captureEmail, setCaptureEmail] = reactExports.useState(""); 53 const [captureMessage, setCaptureMessage] = reactExports.useState(""); 54 const [captureSubmitting, setCaptureSubmitting] = reactExports.useState(false); 55 const [captureError, setCaptureError] = reactExports.useState(""); 56 const bottomRef = reactExports.useRef(null); 57 const pollRef = reactExports.useRef(null); 58 const inputRef = reactExports.useRef(null); 59 const modeRef = reactExports.useRef(mode); 60 modeRef.current = mode; 61 reactExports.useEffect(() => { 62 if (consentReady) return; 63 const handler = () => setConsentReady(hasConsent()); 64 window.addEventListener("storage", handler); 65 const id = setInterval(() => { 66 if (hasConsent()) { 67 setConsentReady(true); 68 clearInterval(id); 69 } 70 }, 1e3); 71 return () => { 72 window.removeEventListener("storage", handler); 73 clearInterval(id); 74 }; 75 }, [consentReady]); 76 reactExports.useEffect(() => { 77 fetch("/api/chatbot/settings").then((r) => r.json()).then((d) => setSettings(d)).catch(() => { 78 }); 79 }, []); 80 reactExports.useEffect(() => { 81 if (!consentReady) return; 82 const stored = getStoredSession(); 83 if (!stored) return; 84 fetch(`/api/live-chat/messages?sessionId=${stored}&after=0`).then((r) => r.json()).then((d) => { 85 var _a2, _b2; 86 if (d.status && d.status !== "ai") { 87 setSessionId(stored); 88 const restored = d.status === "captured" ? "captured" : d.status === "closed" ? "closed" : d.status; 89 setMode(restored); 90 setLiveMessages(d.messages ?? []); 91 setLastMsgId(((_b2 = (_a2 = d.messages) == null ? void 0 : _a2.at(-1)) == null ? void 0 : _b2.id) ?? 0); 92 } 93 }).catch(() => { 94 }); 95 }, [consentReady]); 96 reactExports.useEffect(() => { 97 var _a2; 98 (_a2 = bottomRef.current) == null ? void 0 : _a2.scrollIntoView({ 99 behavior: "smooth" 100 }); 101 }, [aiMessages, liveMessages, aiLoading, mode]); 102 reactExports.useEffect(() => { 103 if (open && mode === "ai" && aiMessages.length === 0 && settings) { 104 setAiMessages([{ 105 role: "assistant", 106 content: `Hi! I'm ${settings.botName}. How can I help you today?` 107 }]); 108 } 109 }, [open, mode, aiMessages.length, settings]); 110 reactExports.useEffect(() => { 111 if (open) setTimeout(() => { 112 var _a2; 113 return (_a2 = inputRef.current) == null ? void 0 : _a2.focus(); 114 }, 100); 115 }, [open, mode]); 116 const startPolling = reactExports.useCallback((sid, afterId) => { 117 if (pollRef.current) clearInterval(pollRef.current); 118 let after = afterId; 119 pollRef.current = setInterval(async () => { 120 var _a2;
121 try { 122 const r = await fetch(`/api/live-chat/messages?sessionId=${sid}&after=${after}`); 123 const d = await r.json(); 124 if (((_a2 = d.messages) == null ? void 0 : _a2.length) > 0) { 125 setLiveMessages((prev) => { 126 const existingIds = new Set(prev.map((m) => m.id)); 127 const newMsgs = d.messages.filter((m) => !existingIds.has(m.id)); 128 return [...prev, ...newMsgs]; 129 }); 130 after = d.messages.at(-1).id; 131 setLastMsgId(after); 132 } 133 if (d.status === "active" && modeRef.current !== "active") setMode("active"); 134 if (d.status === "closed") { 135 setMode("closed"); 136 if (pollRef.current) clearInterval(pollRef.current); 137 } 138 } catch { 139 } 140 }, 2500); 141 }, []); 142 reactExports.useEffect(() => { 143 if ((mode === "waiting" || mode === "active") && sessionId) { 144 startPolling(sessionId, lastMsgId); 145 } 146 return () => { 147 if (pollRef.current) clearInterval(pollRef.current); 148 }; 149 }, [mode, sessionId]); 150 function signalsDissatisfaction(text) { 151 const t = text.toLowerCase(); 152 return ["that didn't help", "that doesn't help", "not helpful", "not what i", "still don't understand", "still confused", "doesn't answer", "didn't answer", "that's not", "thats not", "wrong answer", "incorrect", "that's wrong", "thats wrong", "not right", "still not sure", "can you explain", "i don't get it", "i dont get it", "more detail", "more information", "talk to", "speak to", "speak with", "talk with", "human", "person", "agent", "someone", "real person", "live chat", "support", "can't find", "cant find", "not working", "doesn't work", "doesnt work", "frustrated", "confused", "lost", "help me", "need help"].some((phrase) => t.includes(phrase)); 153 } 154 async function handleAiSend() { 155 const text = aiInput.trim(); 156 if (!text || aiLoading) return; 157 setAiInput(""); 158 const next = [...aiMessages, { 159 role: "user", 160 content: text 161 }]; 162 setAiMessages(next); 163 setAiLoading(true); 164 if (signalsDissatisfaction(text)) setShowHandoffOption(true); 165 try { 166 const res = await fetch("/api/chatbot/chat", { 167 method: "POST", 168 headers: { 169 "Content-Type": "application/json" 170 }, 171 body: JSON.stringify({ 172 messages: next, 173 sessionKey, 174 pageUrl: window.location.href 175 }) 176 }); 177 const data2 = await res.json(); 178 if (!res.ok) throw new Error(res.status === 503 ? "not currently available" : data2.error ?? "No response"); 179 const reply = data2.reply; 180 setAiMessages([...next, { 181 role: "assistant", 182 content: reply 183 }]); 184 const aiUncertain = ["i'm not sure", "i don't know", "i cannot", "i can't", "unable to", "don't have that information", "contact", "reach out", "speak with", "talk to", "support team", "our team"].some((p) => reply.toLowerCase().includes(p)); 185 if (aiUncertain) setShowHandoffOption(true); 186 } catch (err) { 187 const msg = err instanceof Error ? err.message : ""; 188 const isDisabled = msg.toLowerCase().includes("not currently available") || msg.toLowerCase().includes("503"); 189 setAiMessages([...next, { 190 role: "assistant", 191 content: isDisabled ? `The AI assistant isn't active right now. Click "Talk to a person" below to reach our team.` : `Sorry, I'm having trouble responding right now. You can try again or click "Talk to a person" below.` 192 }]); 193 setShowHandoffOption(true); 194 } finally { 195 setAiLoading(false); 196 } 197 } 198 async function handleRequestHuman() { 199 var _a2, _b2; 200 setMode("handoff-choice"); 201 let sid = sessionId; 202 if (!sid) { 203 const r = await fetch("/api/live-chat/session", { 204 method: "POST", 205 headers: { 206 "Content-Type": "application/json" 207 }, 208 body: JSON.stringify({ 209 sessionId: getStoredSession() 210 }) 211 }); 212 const d = await r.json(); 213 sid = d.sessionId; 214 setSessionId(sid); 215 storeSession(sid); 216 } 217 const statusRes = await fetch("/api/live-chat/status"); 218 const { 219 online 220 } = await statusRes.json(); 221 await fetch("/api/live-chat/handoff", { 222 method: "POST", 223 headers: { 224 "Content-Type": "application/json" 225 }, 226 body: JSON.stringify({ 227 sessionId: sid, 228 lastAiMessages: aiMessages.slice(-10) 229 }) 230 }); 231 const msgRes = await fetch(`/api/live-chat/messages?sessionId=${sid}&after=0`); 232 const msgData = await msgRes.json();
233 setLiveMessages(msgData.messages ?? []); 234 setLastMsgId(((_b2 = (_a2 = msgData.messages) == null ? void 0 : _a2.at(-1)) == null ? void 0 : _b2.id) ?? 0); 235 setMode(online ? "waiting" : "capture-form"); 236 } 237 async function handleLiveSend() { 238 const text = liveInput.trim(); 239 if (!text || liveSending || !sessionId) return; 240 setLiveInput(""); 241 setLiveSending(true); 242 try { 243 await fetch("/api/live-chat/messages", { 244 method: "POST", 245 headers: { 246 "Content-Type": "application/json" 247 }, 248 body: JSON.stringify({ 249 sessionId, 250 content: text 251 }) 252 }); 253 setLiveMessages((prev) => [...prev, { 254 id: Date.now(), 255 role: "user", 256 content: text, 257 senderName: "You" 258 }]); 259 } catch { 260 } finally { 261 setLiveSending(false); 262 } 263 } 264 async function handleCaptureSubmit(e) { 265 e.preventDefault(); 266 if (!captureName.trim() || !captureEmail.trim() || !captureMessage.trim()) { 267 setCaptureError("Please fill in all fields."); 268 return; 269 } 270 setCaptureError(""); 271 setCaptureSubmitting(true); 272 try { 273 const res = await fetch("/api/live-chat/capture", { 274 method: "POST", 275 headers: { 276 "Content-Type": "application/json" 277 }, 278 body: JSON.stringify({ 279 sessionId, 280 name: captureName.trim(), 281 email: captureEmail.trim(), 282 message: captureMessage.trim() 283 }) 284 }); 285 if (!res.ok) throw new Error("Failed"); 286 setMode("captured"); 287 } catch { 288 setCaptureError("Something went wrong. Please try again."); 289 } finally { 290 setCaptureSubmitting(false); 291 } 292 } 293 function handleStartOver() { 294 clearSession(); 295 setSessionId(null); 296 setMode("ai"); 297 setAiMessages([]); 298 setLiveMessages([]); 299 setLastMsgId(0); 300 setShowHandoffOption(false); 301 setCaptureName(""); 302 setCaptureEmail(""); 303 setCaptureMessage(""); 304 if (pollRef.current) clearInterval(pollRef.current); 305 } 306 const botName = settings.botName; 307 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 308 open && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "fixed bottom-40 right-5 z-50 w-80 sm:w-96 flex flex-col rounded-2xl shadow-2xl overflow-hidden", style: { 309 maxHeight: "540px", 310 background: "hsl(var(--background))" 311 }, children: [
312 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between px-4 py-3 flex-shrink-0", style: { 313 background: "hsl(var(--primary))" 314 }, children: [ 315 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 316 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-7 h-7 rounded-full flex items-center justify-center flex-shrink-0", style: { 317 background: "hsl(var(--chat-bubble-strong))" 318 }, children: mode === "active" ? /* @__PURE__ */ jsxRuntimeExports.jsx(CircleUser, { className: "w-4 h-4 text-white" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { className: "w-4 h-4 text-white" }) }), 319 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 320 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-white leading-tight", children: mode === "active" ? "Live Support" : botName }), 321 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-[10px] text-white/70 leading-tight", children: [ 322 mode === "ai" && "AI Assistant", 323 mode === "handoff-choice" && "Connectingâ¦", 324 mode === "waiting" && "Waiting for agentâ¦", 325 mode === "active" && "Agent connected", 326 mode === "capture-form" && "Leave a message", 327 mode === "captured" && "Message received", 328 mode === "closed" && "Conversation closed" 329 ] }) 330 ] }) 331 ] }),
332 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => setOpen(false), className: "text-white/70 hover:text-white transition-colors p-1 rounded", "aria-label": "Close chat", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "w-5 h-5" }) }) 333 ] }), 334 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 overflow-y-auto p-3", style: { 335 minHeight: 0, 336 background: "hsl(var(--background))" 337 }, children: [ 338 mode === "ai" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 339 aiMessages.map((m, i) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `flex ${m.role === "user" ? "justify-end" : "justify-start"}`, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `max-w-[80%] rounded-2xl px-3 py-2 text-sm leading-relaxed ${m.role === "user" ? "rounded-br-sm" : "rounded-bl-sm"}`, style: m.role === "user" ? { 340 background: "hsl(var(--primary))", 341 color: "white" 342 } : { 343 background: "hsl(var(--muted))", 344 color: "hsl(var(--foreground))" 345 }, children: m.content }) }, i)), 346 aiLoading && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-start", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-2xl rounded-bl-sm px-3 py-2", style: { 347 background: "hsl(var(--muted))" 348 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "w-4 h-4 animate-spin text-muted-foreground" }) }) }), 349 showHandoffOption && !aiLoading && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center pt-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: handleRequestHuman, className: "text-xs text-primary hover:text-primary/80 underline underline-offset-2 transition-colors", children: "Still need help? Talk to a person" }) }),
350 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: bottomRef }) 351 ] }), 352 mode === "handoff-choice" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center h-32 gap-3", children: [ 353 /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "w-6 h-6 animate-spin text-primary" }), 354 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Checking availabilityâ¦" }) 355 ] }), 356 (mode === "waiting" || mode === "active") && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 357 liveMessages.map((m, i) => { 358 if (m.role === "system") { 359 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[11px] text-muted-foreground italic px-2 text-center", children: m.content }) }, i); 360 } 361 const isUser = m.role === "user"; 362 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `flex ${isUser ? "justify-end" : "justify-start"}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-[80%]", children: [ 363 !isUser && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-[10px] text-muted-foreground mb-0.5 pl-1", children: m.senderName ?? "Agent" }),
364 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `rounded-2xl px-3 py-2 text-sm leading-relaxed ${isUser ? "rounded-br-sm" : "rounded-bl-sm"}`, style: isUser ? { 365 background: "hsl(var(--primary))", 366 color: "white" 367 } : { 368 background: "hsl(var(--muted))", 369 color: "hsl(var(--foreground))" 370 }, children: m.content }) 371 ] }) }, i); 372 }), 373 mode === "waiting" && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-start", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-2xl rounded-bl-sm px-3 py-2", style: { 374 background: "hsl(var(--muted))" 375 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(LoaderCircle, { className: "w-4 h-4 animate-spin text-muted-foreground" }) }) }), 376 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref: bottomRef }) 377 ] }), 378 mode === "capture-form" && /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleCaptureSubmit, className: "space-y-3", children: [
379 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-foreground leading-relaxed", children: "No agents are available right now. Leave your details and we'll get back to you shortly." }), 380 /* @__PURE__ */ jsxRuntimeExports.jsx("input", { className: "w-full text-sm rounded-lg px-3 py-2 outline-none text-foreground placeholder:text-muted-foreground", style: { 381 background: "hsl(var(--muted))", 382 border: "1px solid hsl(var(--border))" 383 }, placeholder: "Your name", value: captureName, onChange: (e) => setCaptureName(e.target.value), required: true }), 384 /* @__PURE__ */ jsxRuntimeExports.jsx("input", { type: "email", className: "w-full text-sm rounded-lg px-3 py-2 outline-none text-foreground placeholder:text-muted-foreground", style: { 385 background: "hsl(var(--muted))", 386 border: "1px solid hsl(var(--border))" 387 }, placeholder: "Your email", value: captureEmail, onChange: (e) => setCaptureEmail(e.target.value), required: true }),
388 /* @__PURE__ */ jsxRuntimeExports.jsx("textarea", { className: "w-full text-sm rounded-lg px-3 py-2 outline-none text-foreground placeholder:text-muted-foreground resize-none", style: { 389 background: "hsl(var(--muted))", 390 border: "1px solid hsl(var(--border))" 391 }, placeholder: "How can we help you?", rows: 3, value: captureMessage, onChange: (e) => setCaptureMessage(e.target.value), required: true }), 392 captureError && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-destructive flex items-center gap-1", children: [ 393 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleAlert, { className: "w-3 h-3 flex-shrink-0" }), 394 captureError 395 ] }), 396 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "submit", disabled: captureSubmitting, className: "w-full py-2 rounded-lg text-sm font-semibold transition-opacity disabled:opacity-50", style: { 397 background: "hsl(var(--primary))", 398 color: "white" 399 }, children: captureSubmitting ? "Sendingâ¦" : "Send Message" }) 400 ] }), 401 mode === "captured" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center gap-3 py-6 text-center", children: [
402 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "w-10 h-10 text-primary" }), 403 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-foreground font-semibold", children: "Message received!" }), 404 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground leading-relaxed", children: [ 405 "We'll get back to you at ", 406 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: captureEmail }), 407 " as soon as possible." 408 ] }), 409 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: handleStartOver, className: "mt-2 text-xs text-primary hover:text-primary/80 underline underline-offset-2", children: "Start a new conversation" }) 410 ] }), 411 mode === "closed" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center gap-3 py-6 text-center", children: [ 412 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-foreground font-semibold", children: "Conversation closed" }),
413 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "This chat session has ended." }), 414 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: handleStartOver, className: "mt-2 text-xs text-primary hover:text-primary/80 underline underline-offset-2", children: "Start a new conversation" }) 415 ] }) 416 ] }), 417 (mode === "ai" || mode === "active" || mode === "waiting") && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-3 flex gap-2 flex-shrink-0", style: { 418 background: "hsl(var(--background))", 419 borderTop: "1px solid hsl(var(--border))" 420 }, children: [ 421 /* @__PURE__ */ jsxRuntimeExports.jsx("input", { ref: inputRef, className: "flex-1 text-sm rounded-full px-3 py-1.5 outline-none text-foreground placeholder:text-muted-foreground", style: { 422 background: "hsl(var(--muted))", 423 border: "1px solid hsl(var(--border))" 424 }, placeholder: mode === "waiting" ? "Waiting for agentâ¦" : "Type a messageâ¦", value: mode === "ai" ? aiInput : liveInput, onChange: (e) => mode === "ai" ? setAiInput(e.target.value) : setLiveInput(e.target.value), onKeyDown: (e) => { 425 if (e.key === "Enter" && !e.shiftKey) { 426 e.preventDefault(); 427 if (mode === "ai") handleAiSend(); 428 else if (mode === "active") handleLiveSend(); 429 } 430 }, disabled: mode === "waiting" || aiLoading || liveSending }),
431 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: mode === "ai" ? handleAiSend : handleLiveSend, disabled: mode === "waiting" || mode === "ai" && (aiLoading || !aiInput.trim()) || mode === "active" && (liveSending || !liveInput.trim()), className: "w-8 h-8 rounded-full flex items-center justify-center disabled:opacity-40 transition-opacity flex-shrink-0", style: { 432 background: "hsl(var(--primary))" 433 }, "aria-label": "Send message", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Send, { className: "w-3.5 h-3.5 text-white" }) }) 434 ] }) 435 ] }), 436 /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { onClick: () => setOpen((o) => !o), className: "fixed bottom-5 right-5 z-50 w-14 h-14 rounded-full shadow-lg flex items-center justify-center transition-transform hover:scale-105 active:scale-95", style: { 437 background: "hsl(var(--primary))" 438 }, "aria-label": open ? "Close chat" : "Open chat", children: [ 439 open ? /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-6 h-6 text-white" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Bot, { className: "w-6 h-6 text-white" }), 440 mode === "waiting" && !open && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute top-1 right-1 w-3 h-3 rounded-full border-2 border-white animate-pulse", style: { 441 background: "hsl(var(--chat-online-dot))" 442 } }) 443 ] }) 444 ] }); 445} 446function Footer() { 447 const currentYear = (/* @__PURE__ */ new Date()).getFullYear(); 448 const footerLinks = { 449 company: [{ 450 name: "About", 451 href: "/about" 452 }, { 453 name: "Courses", 454 href: "/courses" 455 }, { 456 name: "Careers", 457 href: "/careers" 458 }, { 459 name: "Contact", 460 href: "/contact-us" 461 }], 462 support: [{ 463 name: "FAQ", 464 href: "/instructor-led-online-class-faqs" 465 }, { 466 name: "Privacy Policy", 467 href: "/privacy-policy" 468 }], 469 portals: [{ 470 name: "Student Portal", 471 href: "/student" 472 }] 473 }; 474 return /* @__PURE__ */ jsxRuntimeExports.jsx("footer", { className: "bg-muted border-t border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-12", children: [ 475 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-4 gap-8", children: [
476 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "col-span-1", children: [ 477 /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/", className: "flex items-center gap-2 mb-4", children: [ 478 /* @__PURE__ */ jsxRuntimeExports.jsx(GraduationCap, { className: "h-8 w-8 text-primary" }), 479 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-xl font-bold text-foreground", children: [ 480 "SkillForge", 481 /* @__PURE__ */ jsxRuntimeExports.jsx("sup", { className: "text-[0.6em] font-normal align-super", children: "®" }) 482 ] }) 483 ] }), 484 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mb-5", children: "Empowering professionals through expert-led training and development programs." }), 485 /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: "https://www.youtube.com/skillforge", target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-2 text-sm text-muted-foreground hover:text-red-600 transition-colors group", "aria-label": "SkillForge on YouTube", children: [
486 /* @__PURE__ */ jsxRuntimeExports.jsx(Youtube, { className: "w-5 h-5 text-red-500 group-hover:text-red-600 transition-colors" }), 487 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Watch on YouTube" }) 488 ] }) 489 ] }), 490 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 491 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground mb-4", children: "Company" }), 492 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "space-y-2", children: footerLinks.company.map((link) => /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: link.href, className: "text-sm text-muted-foreground hover:text-primary transition-colors", children: link.name }) }, link.name)) }) 493 ] }), 494 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 495 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground mb-4", children: "Support" }), 496 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "space-y-2", children: footerLinks.support.map((link) => /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: link.href, className: "text-sm text-muted-foreground hover:text-primary transition-colors", children: link.name }) }, link.name)) }) 497 ] }),
498 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 499 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground mb-4", children: "Portals" }), 500 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "space-y-2", children: footerLinks.portals.map((link) => /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: link.href, className: "text-sm text-muted-foreground hover:text-primary transition-colors", children: link.name }) }, link.name)) }) 501 ] }) 502 ] }), 503 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-8 pt-8 border-t border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-center text-sm text-muted-foreground", children: [ 504 "© ", 505 currentYear, 506 " SkillForge", 507 /* @__PURE__ */ jsxRuntimeExports.jsx("sup", { className: "text-[0.6em] align-super", children: "®" }), 508 ". All rights reserved." 509 ] }) }) 510 ] }) }); 511} 512function cn(...inputs) { 513 return twMerge(clsx(inputs)); 514} 515function formatSessionDate$1(d, opts = { 516 month: "short", 517 day: "numeric", 518 year: "numeric" 519}, locale = "en-US") { 520 if (!d) return "â"; 521 return new Date(d).toLocaleDateString(locale, { 522 timeZone: "UTC", 523 ...opts 524 }); 525} 526const buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", { 527 variants: { 528 variant: { 529 default: "bg-primary text-primary-foreground hover:bg-primary/90", 530 destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", 531 outline: "border border-input bg-transparent text-foreground hover:bg-accent hover:text-accent-foreground", 532 secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", 533 ghost: "hover:bg-accent hover:text-accent-foreground", 534 link: "text-primary underline-offset-4 hover:underline" 535 }, 536 size: { 537 default: "h-10 px-4 py-2", 538 sm: "h-9 rounded-md px-3", 539 lg: "h-11 rounded-md px-8", 540 icon: "h-10 w-10" 541 } 542 }, 543 defaultVariants: { 544 variant: "default", 545 size: "default" 546 } 547}); 548const Button = reactExports.forwardRef(({ 549 className, 550 variant, 551 size, 552 asChild = false, 553 ...props 554}, ref) => { 555 const Comp = asChild ? Slot : "button"; 556 return /* @__PURE__ */ jsxRuntimeExports.jsx(Comp, { className: cn(buttonVariants({ 557 variant, 558 size, 559 className 560 })), ref, ...props }); 561}); 562Button.displayName = "Button"; 563const _authClient = createAuthClient({ 564 baseURL: typeof window !== "undefined" ? window.location.origin : "", 565 plugins: [magicLinkClient()] 566}); 567const { 568 signIn, 569 signUp, 570 signOut 571} = _authClient; 572async function sendMagicLink(email) { 573 try { 574 const callbackURL = `${true ? "https://skillforge.com" : window.location.origin}/student`; 575 const result = await _authClient.signIn.magicLink({ 576 email, 577 callbackURL 578 }); 579 if (false) ; 580 return result; 581 } catch (error) { 582 console.error("Failed to send magic link:", error); 583 throw error; 584 } 585} 586function useSession() { 587 const { 588 data: session, 589 isPending, 590 error 591 } = _authClient.useSession(); 592 return { 593 session, 594 user: (session == null ? void 0 : session.user) ?? null, 595 isPending, 596 error, 597 isAuthenticated: !isPending && !!(session == null ? void 0 : session.user) 598 }; 599} 600function getUserWithRole(user) { 601 return user; 602} 603const CartContext = reactExports.createContext(void 0); 604function useSyncCartToDB(items) { 605 const timerRef = reactExports.useRef(null); 606 const mountedRef = reactExports.useRef(false); 607 reactExports.useEffect(() => { 608 if (!mountedRef.current) { 609 mountedRef.current = true; 610 return; 611 } 612 if (timerRef.current) clearTimeout(timerRef.current); 613 timerRef.current = setTimeout(() => { 614 const payload = items.map((i) => ({ 615 sessionId: i.sessionId, 616 quantity: i.quantity 617 })); 618 fetch("/api/cart/sync", { 619 method: "POST", 620 headers: { 621 "Content-Type": "application/json" 622 }, 623 body: JSON.stringify({ 624 items: payload 625 }) 626 }).catch(() => { 627 }); 628 }, 1500); 629 return () => { 630 if (timerRef.current) clearTimeout(timerRef.current); 631 }; 632 }, [items]); 633} 634function CartProvider({ 635 children 636}) { 637 const [items, setItems] = reactExports.useState(() => { 638 if (typeof window === "undefined") return []; 639 const saved = localStorage.getItem("skillforge-cart"); 640 return saved ? JSON.parse(saved) : []; 641 }); 642 reactExports.useEffect(() => { 643 localStorage.setItem("skillforge-cart", JSON.stringify(items)); 644 }, [items]); 645 useSyncCartToDB(items); 646 const addItem = (item) => { 647 setItems((prev) => { 648 const existing = prev.find((i) => i.sessionId === item.sessionId); 649 if (existing) { 650 return prev.map((i) => i.sessionId === item.sessionId ? { 651 ...i, 652 quantity: Math.min(i.quantity + 1, i.availableSeats) 653 } : i); 654 } 655 return [...prev, { 656 ...item, 657 quantity: 1 658 }]; 659 }); 660 }; 661 const removeItem = (sessionId) => { 662 setItems((prev) => prev.filter((item) => item.sessionId !== sessionId)); 663 }; 664 const updateQuantity = (sessionId, quantity) => { 665 setItems((prev) => prev.map((item) => item.sessionId === sessionId ? { 666 ...item, 667 quantity: Math.max(1, Math.min(quantity, item.availableSeats)) 668 } : item)); 669 }; 670 const clearCart = () => { 671 setItems([]); 672 localStorage.removeItem("skillforge-cart"); 673 fetch("/api/cart/sync", { 674 method: "POST", 675 headers: { 676 "Content-Type": "application/json" 677 }, 678 body: JSON.stringify({ 679 items: [] 680 }) 681 }).catch(() => { 682 }); 683 }; 684 const totalItems = items.reduce((sum, item) => sum + item.quantity, 0); 685 const totalPrice = items.reduce((sum, item) => sum + parseFloat(item.price) * item.quantity, 0); 686 return /* @__PURE__ */ jsxRuntimeExports.jsx(CartContext.Provider, { value: { 687 items, 688 addItem, 689 removeItem, 690 updateQuantity, 691 clearCart, 692 totalItems, 693 totalPrice 694 }, children }); 695} 696function useCart() { 697 const context = reactExports.useContext(CartContext); 698 if (!context) { 699 throw new Error("useCart must be used within CartProvider"); 700 } 701 return context; 702} 703const Sheet = Root;
704const SheetTrigger = Trigger; 705const SheetPortal = Portal; 706const SheetOverlay = reactExports.forwardRef(({ 707 className, 708 ...props 709}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Overlay, { className: cn("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", className), ...props, ref })); 710SheetOverlay.displayName = Overlay.displayName; 711const sheetVariants = cva("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", { 712 variants: { 713 side: { 714 top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", 715 bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", 716 left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", 717 right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm" 718 } 719 }, 720 defaultVariants: { 721 side: "right" 722 } 723}); 724const SheetContent = reactExports.forwardRef(({ 725 side = "right", 726 className, 727 children, 728 ...props 729}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(SheetPortal, { children: [ 730 /* @__PURE__ */ jsxRuntimeExports.jsx(SheetOverlay, {}), 731 /* @__PURE__ */ jsxRuntimeExports.jsxs(Content, { ref, className: cn(sheetVariants({ 732 side 733 }), className), ...props, children: [ 734 children, 735 /* @__PURE__ */ jsxRuntimeExports.jsxs(Close, { className: "absolute right-4 top-4 roun
735ded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary", children: [ 736 /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "h-4 w-4" }), 737 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Close" }) 738 ] }) 739 ] }) 740] })); 741SheetContent.displayName = Content.displayName; 742const SheetHeader = ({ 743 className, 744 ...props 745}) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("flex flex-col space-y-2 text-center sm:text-left", className), ...props }); 746SheetHeader.displayName = "SheetHeader"; 747const SheetTitle = reactExports.forwardRef(({ 748 className, 749 ...props 750}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Title, { ref, className: cn("text-lg font-semibold text-foreground", className), ...props })); 751SheetTitle.displayName = Title.displayName; 752const SheetDescription = reactExports.forwardRef(({ 753 className, 754 ...props 755}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props })); 756SheetDescription.displayName = Description.displayName; 757const Dialog = Root; 758const DialogTrigger = Trigger; 759const DialogPortal = Portal; 760const DialogOverlay = reactExports.forwardRef(({ 761 className, 762 ...props 763}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Overlay, { ref, className: cn("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0", className), ...props })); 764DialogOverlay.displayName = Overlay.displayName; 765const DialogContent = reactExports.forwardRef(({ 766 className, 767 children, 768 ...props 769}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogPortal, { children: [ 770 /* @__PURE__ */ jsxRuntimeExports.jsx(DialogOverlay, {}), 771 /* @__PURE__ */ jsxRuntimeExports.jsxs(Content, { ref, className: cn("fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg", className), ...props, children: [ 772 children, 773 /* @__PURE__ */ jsxRuntimeExports.jsxs(Close, { className: "absolute right-4 top-4 roun
773ded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [ 774 /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "h-4 w-4" }), 775 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "sr-only", children: "Close" }) 776 ] }) 777 ] }) 778] })); 779DialogContent.displayName = Content.displayName; 780const DialogHeader = ({ 781 className, 782 ...props 783}) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left", className), ...props }); 784DialogHeader.displayName = "DialogHeader"; 785const DialogFooter = ({ 786 className, 787 ...props 788}) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2", className), ...props }); 789DialogFooter.displayName = "DialogFooter"; 790const DialogTitle = reactExports.forwardRef(({ 791 className, 792 ...props 793}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props })); 794DialogTitle.displayName = Title.displayName; 795const DialogDescription = reactExports.forwardRef(({ 796 className, 797 ...props 798}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Description, { ref, className: cn("text-sm text-muted-foreground", className), ...props })); 799DialogDescription.displayName = Description.displayName; 800const Collapsible = Root$1; 801const CollapsibleTrigger = CollapsibleTrigger$1; 802const CollapsibleContent = CollapsibleContent$1; 803const Input = reactExports.forwardRef(({ 804 className, 805 type, 806 ...props 807}, ref) => { 808 return /* @__PURE__ */ jsxRuntimeExports.jsx("input", { type, className: cn("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", className), ref, ...props }); 809}); 810Input.displayName = "Input"; 811const labelVariants = cva("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"); 812const Label = reactExports.forwardRef(({ 813 className, 814 ...props 815}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Root$2, { ref, className: cn(labelVariants(), className), ...props })); 816Label.displayName = Root$2.displayName; 817const Card = reactExports.forwardRef(({ 818 className, 819 ...props 820}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("rounded-lg border bg-card text-card-foreground shadow-sm", className), ...props })); 821Card.displayName = "Card"; 822const CardHeader = reactExports.forwardRef(({ 823 className, 824 ...props 825}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("flex flex-col space-y-1.5 p-6", className), ...props })); 826CardHeader.displayName = "CardHeader"; 827const CardTitle = reactExports.forwardRef(({ 828 className, 829 ...props 830}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("text-2xl font-semibold leading-none tracking-tight", className), ...props })); 831CardTitle.displayName = "CardTitle"; 832const CardDescription = reactExports.forwardRef(({ 833 className, 834 ...props 835}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("text-sm text-muted-foreground", className), ...props })); 836CardDescription.displayName = "CardDescription"; 837const CardContent = reactExports.forwardRef(({ 838 className, 839 ...props 840}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("p-6 pt-0", className), ...props })); 841CardContent.displayName = "CardContent"; 842const CardFooter = reactExports.forwardRef(({ 843 className, 844 ...props 845}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: cn("flex items-center p-6 pt-0", className), ...props })); 846CardFooter.displayName = "CardFooter"; 847function StudentInfoForm({ 848 quantity, 849 courseTitle, 850 sessionDate, 851 availableSeats, 852 onSubmit, 853 onCancel, 854 onQuantityChange 855}) { 856 const [students, setStudents] = reactExports.useState(Array.from({ 857 length: quantity 858 }, () => ({ 859 name: "", 860 email: "", 861 company: "" 862 }))); 863 const [errors, setErrors] = reactExports.useState({}); 864 const validateForm = () => { 865 const newErrors = {}; 866 let isValid = true;
867 students.forEach((student, index) => { 868 const studentErrors = {}; 869 if (!student.name.trim()) { 870 studentErrors.name = "Name is required"; 871 isValid = false; 872 } 873 if (!student.email.trim()) { 874 studentErrors.email = "Email is required"; 875 isValid = false; 876 } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(student.email)) { 877 studentErrors.email = "Invalid email address"; 878 isValid = false; 879 } 880 if (!student.company.trim()) { 881 studentErrors.company = "Company is required"; 882 isValid = false; 883 } 884 if (Object.keys(studentErrors).length > 0) { 885 newErrors[index] = studentErrors; 886 } 887 }); 888 setErrors(newErrors); 889 return isValid; 890 }; 891 const handleSubmit = (e) => { 892 e.preventDefault(); 893 if (validateForm()) { 894 onSubmit(students); 895 } 896 }; 897 const updateStudent = (index, field, value) => { 898 var _a2; 899 const updated = [...students]; 900 updated[index] = { 901 ...updated[index], 902 [field]: value 903 }; 904 setStudents(updated); 905 if ((_a2 = errors[index]) == null ? void 0 : _a2[field]) { 906 const newErrors = { 907 ...errors 908 }; 909 delete newErrors[index][field]; 910 if (Object.keys(newErrors[index]).length === 0) { 911 delete newErrors[index]; 912 } 913 setErrors(newErrors); 914 } 915 }; 916 const removeStudent = (index) => { 917 if (students.length <= 1) return; 918 const updated = students.filter((_, i) => i !== index); 919 setStudents(updated); 920 onQuantityChange(updated.length); 921 const newErrors = {}; 922 Object.keys(errors).forEach((key) => { 923 const idx = parseInt(key); 924 if (idx < index) { 925 newErrors[idx] = errors[idx]; 926 } else if (idx > index) { 927 newErrors[idx - 1] = errors[idx]; 928 } 929 }); 930 setErrors(newErrors); 931 }; 932 const addStudent = () => { 933 if (students.length >= availableSeats) return; 934 setStudents([...students, { 935 name: "", 936 email: "", 937 company: "" 938 }]); 939 onQuantityChange(students.length + 1); 940 }; 941 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 bg-black/60 flex items-center justify-center z-[100] p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "w-full max-w-4xl max-h-[90vh] flex flex-col", children: [ 942 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { className: "border-b pb-4 flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-4", children: [
943 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1", children: [ 944 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-xl", children: "Student Information Required" }), 945 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardDescription, { className: "mt-1.5 text-base", children: [ 946 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: courseTitle }), 947 /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}), 948 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm", children: new Date(sessionDate).toLocaleDateString("en-US", { 949 weekday: "long", 950 month: "long", 951 day: "numeric", 952 year: "numeric", 953 timeZone: "UTC" 954 }) }) 955 ] }) 956 ] }), 957 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", onClick: onCancel, className: "flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "h-5 w-5" }) }) 958 ] }) }), 959 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { className: "flex-1 overflow-y-auto p-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
960 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-muted/50 rounded-lg p-3 mb-4 flex items-center justify-between", children: [ 961 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm font-medium", children: [ 962 students.length, 963 " student", 964 students.length > 1 ? "s" : "" 965 ] }), 966 /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: addStudent, className: "gap-2", children: [ 967 /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "h-4 w-4" }), 968 "Add Student" 969 ] }) 970 ] }), 971 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3", children: students.map((student, index) => { 972 var _a2, _b2, _c2, _d2, _e, _f; 973 return /* @__PURE__ */ jsxRuntimeExports.jsx(Card, { className: "border-2 hover:border-primary/50 transition-colors", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardContent, { className: "p-4", children: [ 974 /* @__P
974URE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-3", children: [ 975 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 976 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-8 w-8 rounded-full bg-primary/10 flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-semibold text-primary", children: index + 1 }) }), 977 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-sm font-medium text-muted-foreground", children: [ 978 "Student ", 979 index + 1, 980 " of ", 981 students.length 982 ] }) 983 ] }), 984 students.length > 1 && /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => removeStudent(index), className: "text-destructive hover:text-destructive hover:bg-destructive/10 gap-1", children: [
985 /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "h-4 w-4" }), 986 "Remove" 987 ] }) 988 ] }), 989 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-3", children: [ 990 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 991 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: `name-${index}`, className: "text-xs font-medium", children: [ 992 "Full Name ", 993 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 994 ] }), 995 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: `name-${index}`, value: student.name, onChange: (e) => updateStudent(index, "name", e.target.value), placeholder: "John Doe", className: ((_a2 = errors[index]) == null ? void 0 : _a2.name) ? "border-destructive" : "" }), 996 ((_b2 = errors[index]) == null ? void 0 : _b2.name) && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-destructive", children: errors[index].name }) 997 ] }),
998 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 999 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: `email-${index}`, className: "text-xs font-medium", children: [ 1000 "Email Address ", 1001 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 1002 ] }), 1003 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: `email-${index}`, type: "text", inputMode: "email", value: student.email, onChange: (e) => updateStudent(index, "email", e.target.value), placeholder: "[email protected]", className: ((_c2 = errors[index]) == null ? void 0 : _c2.email) ? "border-destructive" : "" }), 1004 ((_d2 = errors[index]) == null ? void 0 : _d2.email) && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-destructive", children: errors[index].email }) 1005 ] }), 1006 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [
1007 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: `company-${index}`, className: "text-xs font-medium", children: [ 1008 "Company ", 1009 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 1010 ] }), 1011 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: `company-${index}`, value: student.company, onChange: (e) => updateStudent(index, "company", e.target.value), placeholder: "Acme Corp", className: ((_e = errors[index]) == null ? void 0 : _e.company) ? "border-destructive" : "" }), 1012 ((_f = errors[index]) == null ? void 0 : _f.company) && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-destructive", children: errors[index].company }) 1013 ] }) 1014 ] }) 1015 ] }) }, index); 1016 }) }) 1017 ] }) }), 1018 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t p-4 flex gap-3 flex-shrink-0 bg-muted/30", children: [ 1019 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", variant: "outline", onClick: onCancel, className: "w-32", children: "Cancel" }),
1020 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { onClick: handleSubmit, className: "flex-1", size: "lg", children: "Continue to Payment" }) 1021 ] }) 1022 ] }) }); 1023} 1024const RadioGroup = reactExports.forwardRef(({ 1025 className, 1026 ...props 1027}, ref) => { 1028 return /* @__PURE__ */ jsxRuntimeExports.jsx(Root2, { className: cn("grid gap-2", className), ...props, ref }); 1029}); 1030RadioGroup.displayName = Root2.displayName; 1031const RadioGroupItem = reactExports.forwardRef(({ 1032 className, 1033 ...props 1034}, ref) => { 1035 return /* @__PURE__ */ jsxRuntimeExports.jsx(Item2, { ref, className: cn("aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", className), ...props, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Indicator, { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Circle, { className: "h-2.5 w-2.5 fill-current text-current" }) }) }); 1036}); 1037RadioGroupItem.displayName = Item2.displayName; 1038const Checkbox = reactExports.forwardRef(({ 1039 className, 1040 ...props 1041}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Checkbox$1, { ref, className: cn("peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground", className), ...props, children: /* @__PURE__ */ jsxRuntimeExports.jsx(CheckboxIndicator, { className: cn("flex items-center justify-center text-current"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "h-4 w-4" }) }) })); 1042Checkbox.displayName = Checkbox$1.displayName; 1043function Cart() { 1044 const { 1045 items, 1046 removeItem, 1047 updateQuantity, 1048 totalItems, 1049 totalPrice, 1050 clearCart 1051 } = useCart(); 1052 const [open, setOpen] = reactExports.useState(false); 1053 const [collectingInfoFor, setCollectingInfoFor] = reactExports.useState(null); 1054 const [studentData, setStudentData] = reactExports.useState([]); 1055 const [paymentMethod, setPaymentMethod] = reactExports.useState("card"); 1056 const [paymentContact, setPaymentContact] = reactExports.useState({ 1057 name: "", 1058 email: "" 1059 }); 1060 const [showPaymentContactForm, setShowPaymentContactForm] = reactExports.useState(false); 1061 const [cancellationAgreed, setCancellationAgreed] = reactExports.useState(false); 1062 const [showCancellationModal, setShowCancellationModal] = reactExports.useState(false); 1063 const [termsOpen, setTermsOpen] = reactExports.useState(false); 1064 const navigate = useNavigate(); 1065 const handleCheckout = () => { 1066 if (items.length === 0) return; 1067 const allItemsHaveInfo = items.every((item) => { 1068 const data2 = studentData.find((d) => d.sessionId === item.sessionId); 1069 return data2 && data2.students.length === item.quantity; 1070 }); 1071 if (!allItemsHaveInfo) { 1072 const itemNeedingInfo = items.find((item) => { 1073 const data2 = studentData.find((d) => d.sessionId === item.sessionId); 1074 return !data2 || data2.students.length !== item.quantity; 1075 }); 1076 if (itemNeedingInfo) { 1077 setOpen(false); 1078 setCollectingInfoFor(itemNeedingInfo.sessionId); 1079 } 1080 return; 1081 } 1082 if (paymentMethod === "invoice") { 1083 setShowPaymentContactForm(true); 1084 } else { 1085 proceedToStripeCheckout(); 1086 } 1087 }; 1088 const handleStudentInfoSubmit = (sessionId, students) => { 1089 const updatedStudentData = [...studentData.filter((d) => d.sessionId !== sessionId), { 1090 sessionId, 1091 students 1092 }]; 1093 setStudentData(updatedStudentData); 1094 if (!paymentContact.name && !paymentContact.email && students.length > 0) { 1095 setPaymentContact({ 1096 name: students[0].name, 1097 email: students[0].email 1098 }); 1099 } 1100 const item = items.find((i) => i.sessionId === sessionId); 1101 if (item && students.length !== item.quantity) { 1102 updateQuantity(sessionId, students.length); 1103 } 1104 setCollectingInfoFor(null); 1105 const nextItemNeedingInfo = items.find((item2) => { 1106 if (item2.sessionId === sessionId) return false;
1107 const data2 = updatedStudentData.find((d) => d.sessionId === item2.sessionId); 1108 return !data2 || data2.students.length !== item2.quantity; 1109 }); 1110 if (nextItemNeedingInfo) { 1111 setCollectingInfoFor(nextItemNeedingInfo.sessionId); 1112 } else { 1113 if (paymentMethod === "invoice") { 1114 setShowPaymentContactForm(true); 1115 } else { 1116 proceedToStripeCheckout(updatedStudentData); 1117 } 1118 } 1119 }; 1120 const handleQuantityChange = (sessionId, newQuantity) => { 1121 updateQuantity(sessionId, newQuantity); 1122 setStudentData((prev) => { 1123 const existing = prev.find((d) => d.sessionId === sessionId); 1124 if (!existing) return prev; 1125 const updated = prev.filter((d) => d.sessionId !== sessionId); 1126 const students = existing.students.slice(0, newQuantity); 1127 return [...updated, { 1128 sessionId, 1129 students 1130 }]; 1131 }); 1132 }; 1133 const proceedToStripeCheckout = async (currentStudentData) => { 1134 try { 1135 const dataToUse = currentStudentData || studentData; 1136 const itemsWithStudents = items.map((item) => { 1137 const data22 = dataToUse.find((d) => d.sessionId === item.sessionId); 1138 return { 1139 ...item, 1140 students: (data22 == null ? void 0 : data22.students) || [] 1141 }; 1142 }); 1143 const itemsWithoutStudents = itemsWithStudents.filter((item) => !item.students || item.students.length === 0); 1144 if (itemsWithoutStudents.length > 0) { 1145 alert("Please provide student information for all items before checkout."); 1146 return; 1147 } 1148 const response = await fetch("/api/checkout/create-cart-session", { 1149 method: "POST", 1150 headers: { 1151 "Content-Type": "application/json" 1152 }, 1153 body: JSON.stringify({ 1154 items: itemsWithStudents 1155 }) 1156 }); 1157 const data2 = await response.json(); 1158 if (!response.ok) { 1159 alert(data2.message || data2.error || "Failed to create checkout session"); 1160 return; 1161 } 1162 if (data2.url) { 1163 window.open(data2.url, "_blank"); 1164 alert("Checkout page opened in a new tab. Please complete your payment there. Your cart will be cleared after successful payment."); 1165 setOpen(false); 1166 } else { 1167 alert("Failed to create checkout session"); 1168 } 1169 } catch (error) { 1170 console.error("Error creating checkout:", error); 1171 alert("Failed to create checkout session. Please try again."); 1172 } 1173 }; 1174 const proceedToInvoiceCheckout = async () => { 1175 try { 1176 if (!paymentContact.name.trim() || !paymentContact.email.trim()) { 1177 alert("Please provide payment contact information."); 1178 return; 1179 } 1180 if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(paymentContact.email)) { 1181 alert("Please provide a valid email address."); 1182 return; 1183 } 1184 const itemsWithStudents = items.map((item) => { 1185 const data22 = studentData.find((d) => d.sessionId === item.sessionId); 1186 return { 1187 ...item, 1188 students: (data22 == null ? void 0 : data22.students) || [] 1189 }; 1190 }); 1191 const response = await fetch("/api/checkout/create-invoice", { 1192 method: "POST", 1193 headers: { 1194 "Content-Type": "application/json" 1195 }, 1196 body: JSON.stringify({ 1197 items: itemsWithStudents, 1198 paymentContact 1199 }) 1200 }); 1201 const data2 = await response.json(); 1202 if (!response.ok) { 1203 alert(data2.message || data2.error || "Failed to create invoice"); 1204 return; 1205 } 1206 clearCart(); 1207 setStudentData([]); 1208 setShowPaymentContactForm(false); 1209 setCancellationAgreed(false); 1210 setTermsOpen(false); 1211 setOpen(false); 1212 navigate(`/checkout/invoice-confirmation?invoice_number=${encodeURIComponent(data2.invoiceNumber)}`); 1213 } catch (error) { 1214 console.error("Error creating invoice:", error); 1215 alert("Failed to create invoice. Please try again."); 1216 } 1217 }; 1218 const hasStudentInfo = (sessionId, quantity) => { 1219 const data2 = studentData.find((d) => d.sessionId === sessionId); 1220 return data2 && data2.students.length === quantity; 1221 }; 1222 const currentItem = items.find((item) => item.sessionId === collectingInfoFor); 1223 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
1224 collectingInfoFor && currentItem && /* @__PURE__ */ jsxRuntimeExports.jsx(StudentInfoForm, { quantity: currentItem.quantity, courseTitle: currentItem.courseTitle, sessionDate: currentItem.sessionDate, availableSeats: currentItem.availableSeats, onSubmit: (students) => handleStudentInfoSubmit(collectingInfoFor, students), onCancel: () => setCollectingInfoFor(null), onQuantityChange: (newQuantity) => handleQuantityChange(collectingInfoFor, newQuantity) }), 1225 showPaymentContactForm && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background rounded-lg shadow-lg max-w-md w-full p-6 space-y-4", children: [ 1226 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 1227 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold", children: "Payment Contact Information" }), 1228 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Invoice will be sent to this email address with payment instructions." }) 1229 ] }),
1230 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4", children: [ 1231 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 1232 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "contact-name", children: "Contact Name" }), 1233 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "contact-name", value: paymentContact.name, onChange: (e) => setPaymentContact({ 1234 ...paymentContact, 1235 name: e.target.value 1236 }), placeholder: "John Doe" }) 1237 ] }), 1238 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 1239 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "contact-email", children: "Contact Email" }), 1240 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "contact-email", type: "text", inputMode: "email", value: paymentContact.email, onChange: (e) => setPaymentContact({ 1241 ...paymentContact, 1242 email: e.target.value 1243 }), placeholder: "[email protected]" }) 1244 ] }) 1245 ] }),
1246 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [ 1247 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", className: "flex-1", onClick: () => setShowPaymentContactForm(false), children: "Back" }), 1248 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { className: "flex-1", onClick: proceedToInvoiceCheckout, children: "Generate Invoice" }) 1249 ] }) 1250 ] }) }), 1251 /* @__PURE__ */ jsxRuntimeExports.jsxs(Sheet, { open, onOpenChange: setOpen, children: [ 1252 /* @__PURE__ */ jsxRuntimeExports.jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "ghost", size: "icon", className: "relative", children: [ 1253 /* @__PURE__ */ jsxRuntimeExports.jsx(ShoppingCart, { className: "h-5 w-5" }), 1254 totalItems > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute -top-1 -right-1 h-5 w-5 rounded-full bg-primary text-primary-foreground text-xs flex items-center justify-center", children: totalItems }) 1255 ] }) }),
1256 /* @__PURE__ */ jsxRuntimeExports.jsxs(SheetContent, { className: "w-full sm:max-w-lg overflow-y-auto", children: [ 1257 /* @__PURE__ */ jsxRuntimeExports.jsx(SheetHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(SheetTitle, { children: "Shopping Cart" }) }), 1258 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-8 space-y-4", children: items.length === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center py-12", children: [ 1259 /* @__PURE__ */ jsxRuntimeExports.jsx(ShoppingCart, { className: "h-16 w-16 mx-auto text-muted-foreground mb-4" }), 1260 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: "Your cart is empty" }), 1261 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", className: "mt-4", onClick: () => { 1262 setOpen(false); 1263 navigate("/courses"); 1264 }, children: "Browse Courses" }) 1265 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 1266 items.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border rounded-lg p-4 space-y-3", children: [
1267 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-start", children: [ 1268 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1", children: [ 1269 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold", children: item.courseTitle }), 1270 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: new Date(item.sessionDate).toLocaleDateString("en-US", { 1271 weekday: "short", 1272 month: "short", 1273 day: "numeric", 1274 year: "numeric", 1275 timeZone: "UTC" 1276 }) }), 1277 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm font-medium mt-1", children: [ 1278 "$", 1279 item.price, 1280 " ", 1281 item.currency.toUpperCase(), 1282 " per student" 1283 ] }) 1284 ] }), 1285 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "ghost", size: "icon", onClick: () => removeItem(item.sessionId), className: "text-destructive hover:text-destructive", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Trash2, { className: "h-4 w-4" }) }) 1286 ] }),
1287 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between", children: [ 1288 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-muted-foreground", children: "Number of students:" }), 1289 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 1290 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "icon", className: "h-8 w-8", onClick: () => updateQuantity(item.sessionId, item.quantity - 1), disabled: item.quantity <= 1, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Minus, { className: "h-3 w-3" }) }), 1291 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "w-8 text-center font-medium", children: item.quantity }), 1292 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "icon", className: "h-8 w-8", onClick: () => updateQuantity(item.sessionId, item.quantity + 1), children: /* @__PURE__ */ jsxRuntimeExports.jsx(Plus, { className: "h-3 w-3" }) }) 1293 ] }) 1294 ] }), 1295 hasStudentInfo(item.sessionId, item.quantity) && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-green-600 bg-green-50 dark:bg-green-950 px-3 py-2 rounded", children: [
1296 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { className: "h-4 w-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntimeExports.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }), 1297 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Student information provided" }) 1298 ] }), 1299 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center pt-2 border-t", children: [ 1300 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-medium", children: "Subtotal:" }), 1301 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-semibold", children: [ 1302 "$", 1303 (parseFloat(item.price) * item.quantity).toFixed(2), 1304 " ", 1305 item.currency.toUpperCase() 1306 ] }) 1307 ] }), 1308 item.quantity >= item.availableSeats && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-amber-600", children: "Maximum available seats reached" }), 1309 " " 1310 ] }, item.sessionId)),
1311 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t pt-4 space-y-4", children: [ 1312 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between items-center text-lg font-bold", children: [ 1313 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Total:" }), 1314 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 1315 "$", 1316 totalPrice.toFixed(2), 1317 " USD" 1318 ] }) 1319 ] }), 1320 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3 border rounded-lg p-4 bg-muted/30", children: [ 1321 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { className: "text-sm font-semibold", children: "Payment Method" }), 1322 /* @__PURE__ */ jsxRuntimeExports.jsxs(RadioGroup, { value: paymentMethod, onValueChange: (value) => setPaymentMethod(value), children: [ 1323 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2", children: [
1324 /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroupItem, { value: "card", id: "card" }), 1325 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "card", className: "flex items-center gap-2 cursor-pointer font-normal", children: [ 1326 /* @__PURE__ */ jsxRuntimeExports.jsx(CreditCard, { className: "h-4 w-4" }), 1327 "Credit Card (Pay Now)" 1328 ] }) 1329 ] }), 1330 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center space-x-2", children: [ 1331 /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroupItem, { value: "invoice", id: "invoice" }), 1332 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "invoice", className: "flex items-center gap-2 cursor-pointer font-normal", children: [ 1333 /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { className: "h-4 w-4" }), 1334 "Invoice (Pay Later)" 1335 ] }) 1336 ] }) 1337 ] }) 1338 ] }),
1339 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-lg border border-border bg-muted/30 overflow-hidden", children: [ 1340 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-3 p-4", children: [ 1341 /* @__PURE__ */ jsxRuntimeExports.jsx(Checkbox, { id: "cancellation-policy", checked: cancellationAgreed, onCheckedChange: (checked) => setCancellationAgreed(checked === true), className: "mt-0.5 flex-shrink-0" }), 1342 /* @__PURE__ */ jsxRuntimeExports.jsx("label", { htmlFor: "cancellation-policy", className: "text-sm text-muted-foreground leading-relaxed cursor-pointer", children: "By registering, I agree to the cancellation & rescheduling policy and SkillForge's terms & conditions." }) 1343 ] }), 1344 /* @__PURE__ */ jsxRuntimeExports.jsxs(Collapsible, { open: termsOpen, onOpenChange: setTermsOpen, children: [ 1345 /* @__PURE__ */ jsxRuntimeExports.jsxs(CollapsibleTrigger, { className: "w-full flex items-center justify-between px-4 py-2 border-t border-border text-xs text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors", children: [
1346 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "View full terms & conditions" }), 1347 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: `w-3.5 h-3.5 transition-transform duration-200 ${termsOpen ? "rotate-180" : ""}` }) 1348 ] }), 1349 /* @__PURE__ */ jsxRuntimeExports.jsx(CollapsibleContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-4 pb-4 pt-3 border-t border-border space-y-4 text-xs text-muted-foreground leading-relaxed", children: [ 1350 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 1351 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground text-xs uppercase tracking-wide", children: "Agreement Not to Distribute or Share" }), 1352 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "The pricing displayed for each live, online class is for one student to attend. Attending consists of anyone watching the screen cast portion of the instructor presentation, even if that person did not receive a book or is not completing hands-on exercises." }),
1353 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [ 1354 "Sharing of course material or broadcasting the screen cast portion of the presentation for multiple people to view (when not having paid for each individual viewing) is a violation of our service agreement as well as a copyright violation and is ", 1355 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: "expressly prohibited" }), 1356 "." 1357 ] }) 1358 ] }), 1359 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-t border-border" }), 1360 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 1361 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground text-xs uppercase tracking-wide", children: "Cancellation & Rescheduling Policy" }), 1362 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We understand that your needs or schedule might change prior to your class being held. Because our classes are guaranteed to run, even if you are the only student enrolled, we ask that you notify us at least 5 business days in advance if you will not be able to attend your class." }),
1363 /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { className: "list-disc pl-4 space-y-1", children: [ 1364 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 1365 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: "More than 5 business days in advance" }), 1366 " â no cancellation/rescheduling fee." 1367 ] }), 1368 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 1369 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: "5 business days or less in advance" }), 1370 " â fee equaling 30% of total course tuition." 1371 ] }) 1372 ] }) 1373 ] }), 1374 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [ 1375 "Questions? Call us at", 1376 " ", 1377 /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "tel:+18009713203", className: "text-[#4A7A8A] hover:underline font-medium", children: "800-971-3203" }), 1378 ", MonâFri 8:00 AM â 5:00 PM ET." 1379 ] }) 1380 ] }) }) 1381 ] }) 1382 ] }),
1383 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 1384 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { className: "w-full", size: "lg", onClick: handleCheckout, disabled: !cancellationAgreed, children: paymentMethod === "card" ? "Proceed to Payment" : "Generate Invoice" }), 1385 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", className: "w-full", onClick: () => { 1386 if (confirm("Are you sure you want to clear your cart?")) { 1387 clearCart(); 1388 setStudentData([]); 1389 setCancellationAgreed(false); 1390 } 1391 }, children: "Clear Cart" }) 1392 ] }) 1393 ] }) 1394 ] }) }) 1395 ] }) 1396 ] }), 1397 /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open: showCancellationModal, onOpenChange: setShowCancellationModal, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogContent, { className: "max-w-lg", children: [ 1398 /* @__PURE__ */ jsxRuntimeExports.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Cancellation & Rescheduling Policy" }) }),
1399 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3 text-sm text-muted-foreground leading-relaxed", children: [ 1400 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We understand that your needs or schedule might change prior to your class being held. Because our classes are guaranteed to run, even if you are the only student enrolled, we ask that you notify us at least 5 business days in advance if you will not be able to attend your class." }), 1401 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-foreground", children: "Based on when you notify us, the following fees apply:" }), 1402 /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { className: "list-disc pl-5 space-y-1", children: [ 1403 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 1404 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: "More than 5 business days in advance" }), 1405 " ", 1406 "â no cancellation/rescheduling fee." 1407 ] }),
1408 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 1409 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: "5 business days or less in advance" }), 1410 " ", 1411 "â cancellation/rescheduling fee equaling 30% of total course tuition." 1412 ] }) 1413 ] }), 1414 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [ 1415 "Please contact us at", 1416 " ", 1417 /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "tel:+18009713203", className: "text-[#4A7A8A] hover:underline font-medium", children: "800-971-3203" }), 1418 " ", 1419 "if you have any questions about our policy." 1420 ] }) 1421 ] }), 1422 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2 pt-2", children: [ 1423 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", className: "flex-1", onClick: () => setShowCancellationModal(false), children: "Close" }), 1424 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { className: "flex-1 bg-[#FF7A00] hover:bg-[#e06e00] text-white", onClick: () => { 1425 setCancellationAgreed(true); 1426 setShowCancellationModal(false); 1427 }, children: "I Agree" }) 1428 ] }) 1429 ] }) }) 1430 ] }); 1431} 1432const aboutSubmenu = [{ 1433 name: "About SkillForge®", 1434 href: "/about" 1435}, { 1436 name: "Student Reviews", 1437 href: "/about/testimonials" 1438}, { 1439 name: "Our Clients", 1440 href: "/clients" 1441}, { 1442 name: "Blog & Tutorials", 1443 href: "/skillforge-blog" 1444}, { 1445 name: "Careers", 1446 href: "/careers" 1447}]; 1448function Header() { 1449 const [mobileMenuOpen, setMobileMenuOpen] = reactExports.useState(false); 1450 const [aboutOpen, setAboutOpen] = reactExports.useState(false); 1451 const { 1452 session, 1453 isPending 1454 } = useSession(); 1455 const navigate = useNavigate(); 1456 const location = useLocation(); 1457 const dropdownRef = reactExports.useRef(null); 1458 reactExports.useEffect(() => { 1459 function handleClick(e) { 1460 if (dropdownRef.current && !dropdownRef.current.contains(e.target)) { 1461 setAboutOpen(false); 1462 } 1463 } 1464 document.addEventListener("mousedown", handleClick); 1465 return () => document.removeEventListener("mousedown", handleClick); 1466 }, []); 1467 reactExports.useEffect(() => { 1468 setAboutOpen(false); 1469 setMobileMenuOpen(false); 1470 }, [location.pathname]); 1471 const handleSignOut = async () => { 1472 await signOut(); 1473 navigate("/"); 1474 }; 1475 const getPortalLink = () => { 1476 if (!(session == null ? void 0 : session.user)) return null; 1477 const user = getUserWithRole(session.user); 1478 const role = user.role; 1479 if (role === "admin") return { 1480 name: "Admin Portal", 1481 href: "/admin" 1482 }; 1483 if (role === "instructor") return { 1484 name: "Instructor Portal", 1485 href: "/instructor" 1486 }; 1487 return { 1488 name: "My Dashboard", 1489 href: "/student" 1490 }; 1491 }; 1492 const portalLink = getPortalLink(); 1493 const showCart = !isPending; 1494 const isAboutActive = location.pathname.startsWith("/about") || location.pathname === "/clients" || location.pathname === "/skillforge-blog"; 1495 return /* @__PURE__ */ jsxRuntimeExports.jsx("header", { className: "bg-background border-b border-border sticky top-0 z-50", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: [ 1496 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex h-16 items-center justify-between", children: [
1497 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/", className: "flex items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "/assets/skillforge-logo.jpg", alt: "SkillForge®", className: "h-12", fetchPriority: "high", width: 160, height: 48 }) }), 1498 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden md:flex md:items-center md:gap-8", children: [ 1499 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/", className: "text-sm font-medium text-foreground hover:text-primary transition-colors", children: "Home" }), 1500 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", className: "text-sm font-medium text-foreground hover:text-primary transition-colors", children: "Courses" }), 1501 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact-us", className: `text-sm font-medium transition-colors hover:text-primary ${location.pathname === "/contact-us" ? "text-primary" : "text-foreground"}`, children: "Contact" }), 1502 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", ref: dropdownRef, children: [
1503 /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { onClick: () => setAboutOpen((o) => !o), className: `flex items-center gap-1 text-sm font-medium transition-colors hover:text-primary ${isAboutActive ? "text-primary" : "text-foreground"}`, children: [ 1504 "About", 1505 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: `w-4 h-4 transition-transform duration-200 ${aboutOpen ? "rotate-180" : ""}` }) 1506 ] }), 1507 aboutOpen && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute top-full left-1/2 -translate-x-1/2 mt-2 w-52 rounded-xl bg-background shadow-lg py-1 z-50", style: { 1508 border: "1px solid #e5e7eb" 1509 }, children: aboutSubmenu.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: item.href, className: "block px-4 py-2.5 text-sm text-foreground hover:bg-muted transition-colors", children: item.name }, item.href)) }) 1510 ] }) 1511 ] }), 1512 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "hidden md:flex md:items-center md:gap-2", children: [ 1513 showCart && /* @__PURE__ */ jsxRuntimeExports.jsx(Cart, {}), 1514 (session == null ? void 0 : session.user) ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
1515 portalLink && /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "ghost", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: portalLink.href, children: portalLink.name }) }), 1516 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "default", onClick: handleSignOut, children: "Sign Out" }) 1517 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 1518 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "ghost", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/auth", children: "Sign In" }) }), 1519 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "default", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Browse Courses" }) }) 1520 ] }) 1521 ] }), 1522 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex md:hidden items-center gap-2", children: [ 1523 showCart && /* @__PURE__ */ jsxRuntimeExports.jsx(Cart, {}),
1524 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "button", className: "rounded-md p-2 text-foreground hover:bg-muted", onClick: () => setMobileMenuOpen(!mobileMenuOpen), children: mobileMenuOpen ? /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "h-6 w-6" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Menu, { className: "h-6 w-6" }) }) 1525 ] }) 1526 ] }), 1527 mobileMenuOpen && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "md:hidden py-4 space-y-1 border-t border-border", children: [ 1528 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/", className: "block px-3 py-2 text-base font-medium text-foreground hover:bg-muted rounded-md", onClick: () => setMobileMenuOpen(false), children: "Home" }), 1529 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", className: "block px-3 py-2 text-base font-medium text-foreground hover:bg-muted rounded-md", onClick: () => setMobileMenuOpen(false), children: "Courses" }), 1530 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
1531 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "px-3 py-2 text-base font-medium text-foreground", children: "About" }), 1532 aboutSubmenu.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: item.href, className: "block pl-6 pr-3 py-2 text-sm text-muted-foreground hover:bg-muted hover:text-foreground rounded-md", onClick: () => setMobileMenuOpen(false), children: item.name }, item.href)) 1533 ] }), 1534 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact-us", className: "block px-3 py-2 text-base font-medium text-foreground hover:bg-muted rounded-md", onClick: () => setMobileMenuOpen(false), children: "Contact" }), 1535 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pt-4 space-y-2 border-t border-border", children: (session == null ? void 0 : session.user) ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 1536 portalLink && /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: portalLink.href, className: "block px-3 py-2 text-base font-medium text-foreground hover:bg-muted rounded-md", onClick: () => setMobileMenuOpen(false), children: portalLink.name }),
1537 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => { 1538 setMobileMenuOpen(false); 1539 handleSignOut(); 1540 }, className: "block w-full text-left px-3 py-2 text-base font-medium text-foreground hover:bg-muted rounded-md", children: "Sign Out" }) 1541 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 1542 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/auth", className: "block px-3 py-2 text-base font-medium text-foreground hover:bg-muted rounded-md", onClick: () => setMobileMenuOpen(false), children: "Sign In" }), 1543 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", className: "block px-3 py-2 text-base font-medium bg-primary text-primary-foreground hover:bg-primary/90 rounded-md text-center", onClick: () => setMobileMenuOpen(false), children: "Browse Courses" }) 1544 ] }) }) 1545 ] }) 1546 ] }) }); 1547} 1548function Website({ 1549 children, 1550 config = {}, 1551 className 1552}) { 1553 const { 1554 layout = { 1555 maxWidth: "full", 1556 padding: "md", 1557 background: "default", 1558 minHeight: true 1559 } 1560 } = config; 1561 const getBackgroundClass = () => { 1562 switch (layout.background) { 1563 case "muted": 1564 return "bg-muted"; 1565 case "gradient": 1566 return "bg-gradient-to-b from-background to-muted/20"; 1567 default: 1568 return "bg-background"; 1569 } 1570 }; 1571 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn(layout.minHeight !== false && "min-h-screen", getBackgroundClass(), "flex flex-col", className), children }); 1572} 1573const DEFAULT_OG_IMAGE = "https://skillforge.com/assets/skillforge-logo.jpg"; 1574const DEFAULT_TITLE = "SkillForge | Professional Software Training"; 1575const DEFAULT_DESCRIPTION = "SkillForge offers expert-led training in Microsoft Office, Adobe Creative Suite, Azure, Power BI, and more. Live online and on-site classes for individuals and teams."; 1576function RootLayout({ 1577 children 1578}) { 1579 const location = useLocation(); 1580 const isCoursePrintView = new URLSearchParams(location.search).get("course-information") === "print"; 1581 return /* @__PURE__ */ jsxRuntimeExports.jsxs(Website, { children: [ 1582 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
1583 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: DEFAULT_TITLE }), 1584 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: DEFAULT_DESCRIPTION }), 1585 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: DEFAULT_TITLE }), 1586 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: DEFAULT_DESCRIPTION }), 1587 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 1588 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/" }), 1589 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: DEFAULT_OG_IMAGE }), 1590 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 1591 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: DEFAULT_TITLE }), 1592 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: DEFAULT_DESCRIPTION }),
1593 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: DEFAULT_OG_IMAGE }) 1594 ] }), 1595 !isCoursePrintView && /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollRestoration, {}), 1596 !isCoursePrintView && /* @__PURE__ */ jsxRuntimeExports.jsx(Header, {}), 1597 children, 1598 !isCoursePrintView && /* @__PURE__ */ jsxRuntimeExports.jsx(Footer, {}) 1599 ] }); 1600} 1601function ScrollToTop() { 1602 const { 1603 pathname 1604 } = useLocation(); 1605 reactExports.useEffect(() => { 1606 window.scrollTo({ 1607 top: 0, 1608 left: 0, 1609 behavior: "instant" 1610 }); 1611 }, [pathname]); 1612 return null; 1613} 1614function Spinner({ 1615 className 1616}) { 1617 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `inline-block ${className || ""}`, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("svg", { className: "animate-spin h-8 w-8 text-gray-600", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [ 1618 /* @__PURE__ */ jsxRuntimeExports.jsx("circle", { className: "opacity-10", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), 1619 /* @__PURE__ */ jsxRuntimeExports.jsx("path", { className: "opacity-20", fill: "currentColor", d: "m4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }) 1620 ] }) }); 1621} 1622const benefits = [{ 1623 title: "Expert Instructors", 1624 description: "Learn from experienced professionals who bring real-world expertise and practical knowledge to every training session.", 1625 image: "/airo-assets/uploads/benefit-expert-instructors-v2.jpg", 1626 accent: "#FF7A00", 1627 icon: null, 1628 gradient: null, 1629 imagePosition: "center center" 1630}, { 1631 title: "Flexible Delivery Options", 1632 description: "Choose from live online classes you can attend from anywhere, or schedule onsite training delivered at your location.", 1633 image: "/airo-assets/images/courses/microsoft-teams", 1634 accent: "#4A7A8A", 1635 icon: null, 1636 gradient: null, 1637 imagePosition: "center 50%" 1638}, { 1639 title: "Post-Class Support", 1640 description: "Many of our classes come with support from an instructor after class, as well as access to a recorded version of your class to review.", 1641 image: "/airo-assets/uploads/benefit-post-class-support-v2.jpg", 1642 accent: "#FF7A00", 1643 icon: null, 1644 gradient: null, 1645 imagePosition: "center center" 1646}]; 1647function HomePage() { 1648 const [hydrated, setHydrated] = reactExports.useState(false); 1649 reactExports.useEffect(() => { 1650 setHydrated(true); 1651 }, []); 1652 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 1653 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
1654 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Home | SkillForge Instructor-Led Software & Business Skills Training" }), 1655 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "SkillForge delivers expert instructor-led training in Microsoft Office, Excel, Power BI, SharePoint, Azure, leadership, and more. Live online classes and onsite training across North America." }), 1656 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/" }), 1657 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 1658 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/" }), 1659 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "SkillForge | Instructor-Led Software & Business Skills Training" }), 1660 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Expert instructor-led training in Microsoft Office, Excel, Power BI, SharePoint, Azure, leadership, and more. Live online and onsite classes across North America." }),
1661 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 1662 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 1663 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "SkillForge | Instructor-Led Software & Business Skills Training" }), 1664 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "Expert instructor-led training in Microsoft Office, Excel, Power BI, SharePoint, Azure, leadership, and more." }), 1665 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 1666 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "google-site-verification", content: "WE39uGaJLTa66Kv5ec9RFPXtPyXrGics6ya6ZT_4Brc" }), 1667 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 1668 "@context": "https://schema.org", 1669 "@graph": [{ 1670 "@type": "WebSite", 1671 "@id": "https://skillforge.com/#website", 1672 "name": "SkillForge®", 1673 "url": "https://skillforge.com/" 1674 }, { 1675 "@type": "EducationalOrganization", 1676 "@id": "https://skillforge.com/#organization", 1677 "name": "SkillForge®", 1678 "url": "https://skillforge.com", 1679 "logo": { 1680 "@type": "ImageObject", 1681 "url": "https://skillforge.com/assets/skillforge-logo.jpg" 1682 }, 1683 "description": "SkillForge delivers expert instructor-led training in software applications, business skills, leadership development, and professional certifications.", 1684 "foundingDate": "2010-06", 1685 "address": { 1686 "@type": "PostalAddress", 1687 "streetAddress": "2118 Plum Grove Rd. #206", 1688 "addressLocality": "Rolling Meadows", 1689 "addressRegion": "IL", 1690 "postalCode": "60008", 1691 "addressCountry": "US" 1692 }, 1693 "telephone": "800-971-3203", 1694 "email": "[email protected]", 1695 "areaServed": "North America", 1696 "contactPoint": { 1697 "@type": "ContactPoint", 1698 "telephone": "800-971-3203", 1699 "contactType": "customer service", 1700 "areaServed": "US", 1701 "availableLanguage": "English" 1702 }, 1703 "sameAs": [] 1704 }, { 1705 "@type": "WebPage", 1706 "@id": "https://skillforge.com/#webpage", 1707 "url": "https://skillforge.com/", 1708 "name": "SkillForge | Instructor-Led Software & Business Skills Training", 1709 "description": "Expert instructor-led training in Microsoft Office, Excel, Power BI, SharePoint, Azure, leadership, and more. Live online and onsite classes across North America.", 1710 "isPartOf": { 1711 "@id": "https://skillforge.com/#website" 1712 }, 1713 "about": { 1714 "@id": "https://skillforge.com/#organization" 1715 }, 1716 "datePublished": "2010-01-01", 1717 "dateModified": "2026-07-25" 1718 }] 1719 }) }) 1720 ] }), 1721 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [
1722 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "relative border-b border-border", style: { 1723 background: "#f5f6f7" 1724 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative container mx-auto px-6 py-10 md:py-14", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-8 items-center max-w-5xl mx-auto", children: [ 1725 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 1726 opacity: 0, 1727 y: 24 1728 } : false, animate: { 1729 opacity: 1, 1730 y: 0 1731 }, transition: { 1732 duration: 0.5, 1733 ease: "easeOut" 1734 }, className: "flex flex-col gap-4", children: [ 1735 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase", style: { 1736 color: "#FF7A00" 1737 }, children: "Expert Training" }), 1738 /* @__PURE__ */ jsxRuntimeExports.jsxs("h1", { className: "text-3xl md:text-4xl font-bold leading-tight text-foreground", children: [ 1739 "Forge your skills.", 1740 " ",
1741 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { 1742 color: "#FF7A00" 1743 }, children: "Ignite your future." }) 1744 ] }), 1745 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-base text-muted-foreground leading-relaxed", children: "SkillForge delivers instructor-led training courses in software applications, business skills, leadership development, and professional certifications. Choose from live online classes or onsite training delivered at your location." }), 1746 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row gap-3", children: [ 1747 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "text-base px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Browse Courses" }) }), 1748 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", variant: "outline", className: "text-base px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/course-categories/ai", children: "Explore AI Courses" }) }) 1749 ] }) 1750 ] }),
1751 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "hidden md:flex items-end justify-center pb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-end justify-center", children: [ 1752 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 1753 x: -10 1754 } : false, animate: { 1755 x: 0 1756 }, transition: { 1757 duration: 0.5, 1758 ease: "easeOut", 1759 delay: 0.15 1760 }, className: "flex flex-col items-center flex-shrink-0", style: { 1761 zIndex: 1 1762 }, children: [ 1763 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-36 h-36 rounded-full overflow-hidden", style: { 1764 border: "3px solid #4A7A8A", 1765 boxShadow: "0 6px 24px rgba(74,122,138,0.18)" 1766 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "/airo-assets/uploads/hero-circle-2-v4.jpg", alt: "Student learning online", className: "w-full h-full object-cover", width: 144, height: 144, loading: "eager" }) }),
1767 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 text-center rounded-lg px-3 py-1 shadow-sm", style: { 1768 background: "#fff", 1769 border: "1px solid #e5e7eb", 1770 whiteSpace: "nowrap" 1771 }, children: [ 1772 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-bold text-foreground leading-tight", children: "Learn Anywhere" }), 1773 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground leading-tight", children: "Online or onsite" }) 1774 ] }) 1775 ] }), 1776 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 1777 y: 10 1778 } : false, animate: { 1779 y: 0 1780 }, transition: { 1781 duration: 0.5, 1782 ease: "easeOut", 1783 delay: 0.25 1784 }, className: "flex flex-col items-center flex-shrink-0", style: { 1785 zIndex: 3, 1786 marginLeft: -12, 1787 marginRight: -12, 1788 marginBottom: 24 1789 }, children: [
1790 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-44 h-44 rounded-full overflow-hidden", style: { 1791 border: "3px solid #FF7A00", 1792 boxShadow: "0 8px 32px rgba(255,122,0,0.22)" 1793 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "/airo-assets/uploads/hero-circle-1-v3.jpg", alt: "Live instructor-led training", className: "w-full h-full object-cover", width: 176, height: 176, loading: "eager", fetchPriority: "high" }) }), 1794 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 text-center rounded-lg px-3 py-1 shadow-sm", style: { 1795 background: "#fff", 1796 border: "1px solid #FF7A00", 1797 whiteSpace: "nowrap" 1798 }, children: [ 1799 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-bold leading-tight", style: { 1800 color: "#FF7A00" 1801 }, children: "Live Instructor-Led" }), 1802 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground leading-tight", children: "Real-time interaction" }) 1803 ] }) 1804 ] }),
1805 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 1806 x: 10 1807 } : false, animate: { 1808 x: 0 1809 }, transition: { 1810 duration: 0.5, 1811 ease: "easeOut", 1812 delay: 0.35 1813 }, className: "flex flex-col items-center flex-shrink-0", style: { 1814 zIndex: 1 1815 }, children: [ 1816 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-36 h-36 rounded-full overflow-hidden", style: { 1817 border: "3px solid #4A7A8A", 1818 boxShadow: "0 6px 24px rgba(74,122,138,0.18)" 1819 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "/airo-assets/uploads/hero-circle-3-v5.jpg", alt: "Private training workshop", className: "w-full h-full object-cover", width: 144, height: 144, loading: "eager" }) }), 1820 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-2 text-center rounded-lg px-3 py-1 shadow-sm", style: { 1821 background: "#fff", 1822 border: "1px solid #e5e7eb", 1823 whiteSpace: "nowrap" 1824 }, children: [
1825 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-bold text-foreground leading-tight", children: "Private Training" }), 1826 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground leading-tight", children: "Custom team sessions" }) 1827 ] }) 1828 ] }) 1829 ] }) }) 1830 ] }) }) }), 1831 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-5xl px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: benefits.map((benefit, index) => /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 1832 opacity: 0, 1833 y: 24 1834 }, whileInView: { 1835 opacity: 1, 1836 y: 0 1837 }, viewport: { 1838 once: true 1839 }, transition: { 1840 duration: 0.4, 1841 ease: "easeOut", 1842 delay: index * 0.1 1843 }, whileHover: { 1844 y: -4 1845 }, className: "rounded-xl overflow-hidden flex flex-col cursor-default transition-shadow hover:shadow-xl", style: { 1846 border: "1px solid #e5e7eb" 1847 }, children: [
1848 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-48 relative overflow-hidden", children: benefit.image ? /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: benefit.image, alt: benefit.title, className: "w-full h-full", style: { 1849 objectFit: "cover", 1850 objectPosition: benefit.imagePosition ?? "center center" 1851 }, width: 400, height: 192, loading: "lazy" }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-full h-full flex flex-col items-center justify-center gap-4", style: { 1852 background: benefit.gradient ?? "#1e3a4a" 1853 }, children: [ 1854 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "rounded-full flex items-center justify-center", style: { 1855 width: 72, 1856 height: 72, 1857 background: "rgba(255,255,255,0.15)", 1858 border: "2px solid rgba(255,255,255,0.3)" 1859 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Monitor, { size: 36, color: "white", strokeWidth: 1.5 }) }), 1860 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-3", children: ["Live Online", "On-Site", "Hybrid"].map((label) => /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-semibold px-3 py-1 rounded-full", style: { 1861 background: "rgba(255,255,255,0.18)", 1862 color: "white", 1863 border: "1px solid rgba(255,255,255,0.25)" 1864 }, children: label }, label)) }) 1865 ] }) }),
1866 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-1", style: { 1867 background: benefit.accent 1868 } }), 1869 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 flex flex-col gap-3 flex-1 bg-white", children: [ 1870 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-bold text-foreground text-xl", children: benefit.title }), 1871 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-base text-muted-foreground leading-relaxed", children: benefit.description }) 1872 ] }) 1873 ] }, benefit.title)) }) }) }), 1874 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20", style: { 1875 background: "#f5f6f7" 1876 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-5xl px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col md:flex-row items-center gap-12", children: [ 1877 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 1878 opacity: 0, 1879 y: 20 1880 }, whileInView: { 1881 opacity: 1, 1882 y: 0 1883 }, viewport: { 1884 once: true 1885 }, transition: { 1886 duration: 0.5 1887 }, className: "md:w-2/5 flex-shrink-0", children: [
1888 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase mb-3", style: { 1889 color: "#FF7A00" 1890 }, children: "Trusted By" }), 1891 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold text-foreground mb-4", children: "Trusted by Organizations Across North America" }), 1892 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground leading-relaxed mb-4", children: "From small businesses to governmental agencies and Fortune 500 companies, thousands of organizations have trusted us to train their staff." }), 1893 /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/clients", className: "inline-flex items-center gap-1.5 text-sm font-semibold hover:underline", style: { 1894 color: "#FF7A00" 1895 }, children: [ 1896 "View Our Clients ", 1897 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-4 h-4" }) 1898 ] }) 1899 ] }), 1900 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "md:w-3/5 grid grid-cols-3 gap-4", children: [{ 1901 src: "/assets/cis-gray.png", 1902 alt: "Cisco" 1903 }, { 1904 src: "/assets/HP-gray.jpg", 1905 alt: "HP" 1906 }, { 1907 src: "/assets/loc-gray.png", 1908 alt: "Library of Congress" 1909 }, { 1910 src: "/assets/moo-gray.png", 1911 alt: "Mutual of Omaha" 1912 }, { 1913 src: "/assets/sge-gray.png", 1914 alt: "Sage" 1915 }, { 1916 src: "/assets/sie-gray.jpg", 1917 alt: "Siemens" 1918 }].map((logo, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 1919 opacity: 0, 1920 y: 16 1921 }, whileInView: { 1922 opacity: 1, 1923 y: 0 1924 }, viewport: { 1925 once: true 1926 }, transition: { 1927 duration: 0.4, 1928 ease: "easeOut", 1929 delay: i * 0.06 1930 }, className: "flex items-center justify-center rounded-xl p-6 bg-background border border-border", style: { 1931 minHeight: "110px" 1932 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: logo.src, alt: logo.alt, width: 106, height: 54, className: "max-h-16 max-w-full object-contain opacity-60 hover:opacity-90 transition-opacity", loading: "lazy" }) }, logo.alt)) }) 1933 ] }) }) }),
1934 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-5xl px-6", children: [ 1935 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 1936 opacity: 0, 1937 y: 20 1938 }, whileInView: { 1939 opacity: 1, 1940 y: 0 1941 }, viewport: { 1942 once: true 1943 }, transition: { 1944 duration: 0.5 1945 }, className: "text-center mb-12", children: [ 1946 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase mb-3 text-muted-foreground", children: "Student Reviews" }), 1947 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold text-foreground mb-4", children: "What Our Students Say" }), 1948 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center gap-1 mb-2", children: [ 1949 [...Array(5)].map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Star, { className: "w-5 h-5", style: { 1950 fill: "#F5A623", 1951 color: "#F5A623" 1952 } }, i)),
1953 /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "https://www.google.com/search?q=SkillForge&stick=H4sIAAAAAAAAAONgU1I1qLCwMEhLNDVINko0T0oxMje0MqhINjU3TkoxNkkyTzVLNrY0WcTKFZydmZPjll-UngoAQlFfUDYAAAA&ved=2ahUKEwj4rYLD4a34AhUEK0QIHYr9Da0QrMcEegQIAhAC#", target: "_blank", rel: "noopener noreferrer", className: "ml-2 font-semibold text-foreground hover:underline", children: "5 of 5 stars on Google" }) 1954 ] }) 1955 ] }), 1956 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: [{ 1957 title: "Absolutely Fantastic!", 1958 quote: "Jennifer was absolutely fantastic! She delivered several hours of one-on-one training that significantly enhanced my understanding of how to leverage PowerPivot functionality within Microsoft Excel.", 1959 name: "Jim M.", 1960 company: "Bill and Melinda Gates Foundation" 1961 }, { 1962 title: "Expectations Exceeded", 1963 quote: "My expectations were definitely exceeded for this course. I had a bias towards courses with onsite instructors but the flexibility of the online classroom meant that this course was really just as good as any conventionally taught course.", 1964 name: "Michael B.", 1965 company: "Fitchburg State University" 1966 }, { 1967 title: "Excellent Instructor!", 1968 quote: "Aletha was an excellent instructor! Very knowledgeable. The training was interactive and I had plenty of opportunity to ask questions. This was my first time taking an online class â I would recommend SkillForge to anyone.", 1969 name: "Scott H.", 1970 company: "Washington County" 1971 }].map((review, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 1972 opacity: 0, 1973 y: 20 1974 }, whileInView: { 1975 opacity: 1, 1976 y: 0 1977 }, viewport: { 1978 once: true 1979 }, transition: { 1980 duration: 0.4, 1981 ease: "easeOut", 1982 delay: i * 0.1 1983 }, className: "rounded-xl flex flex-col", style: { 1984 border: "1px solid #e5e7eb" 1985 }, children: [
1986 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-1 rounded-t-xl bg-border" }), 1987 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-6 flex flex-col flex-1", children: [ 1988 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-0.5 mb-3", children: [...Array(5)].map((_, s) => /* @__PURE__ */ jsxRuntimeExports.jsx(Star, { className: "w-4 h-4", style: { 1989 fill: "#F5A623", 1990 color: "#F5A623" 1991 } }, s)) }), 1992 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-bold text-foreground mb-3", children: review.title }), 1993 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground leading-relaxed flex-1", children: [ 1994 '"', 1995 review.quote, 1996 '"' 1997 ] }), 1998 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-5 pt-4", style: { 1999 borderTop: "1px solid #d0e4ea" 2000 }, children: [ 2001 /* @__P
2001URE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground text-sm", children: review.name }), 2002 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs mt-0.5 text-muted-foreground", children: review.company }) 2003 ] }) 2004 ] }) 2005 ] }, review.name)) }), 2006 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center mt-10", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/about/testimonials", className: "text-sm font-semibold hover:underline", style: { 2007 color: "#4A7A8A" 2008 }, children: "Read all reviews â" }) }) 2009 ] }) }), 2010 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-background border-t border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-5xl px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 2011 opacity: 1 2012 }, whileInView: { 2013 opacity: 1, 2014 y: 0 2015 }, viewport: { 2016 once: true 2017 }, className: "flex flex-col md:flex-row items-center gap-10", children: [
2018 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 text-center md:text-left", children: [ 2019 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "inline-flex items-center gap-2 mb-4 px-3 py-1 rounded-full border", style: { 2020 background: "#fff4eb", 2021 borderColor: "#ffd4a8" 2022 }, children: [ 2023 /* @__PURE__ */ jsxRuntimeExports.jsx(Youtube, { className: "w-4 h-4", style: { 2024 color: "#FF7A00" 2025 } }), 2026 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-semibold uppercase tracking-wide", style: { 2027 color: "#FF7A00" 2028 }, children: "Free on YouTube" }) 2029 ] }), 2030 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl md:text-3xl font-bold text-foreground mb-3", children: "Not ready to enroll? Start learning free." }), 2031 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-6 max-w-md", children: "Watch course previews, software walkthroughs, and quick-skill videos on the SkillForge® YouTube channel â no signup required." }),
2032 /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: "https://www.youtube.com/skillforge", target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-2 px-6 py-3 rounded-lg font-semibold text-white transition-opacity hover:opacity-90", style: { 2033 background: "#FF7A00" 2034 }, children: [ 2035 /* @__PURE__ */ jsxRuntimeExports.jsx(Youtube, { className: "w-5 h-5" }), 2036 "Visit our channel" 2037 ] }) 2038 ] }), 2039 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0 w-full md:w-80", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: "https://www.youtube.com/skillforge", target: "_blank", rel: "noopener noreferrer", className: "group block rounded-2xl overflow-hidden transition-all duration-300 hover:-translate-y-1 hover:shadow-2xl", "aria-label": "Watch SkillForge on YouTube", style: { 2040 background: "#fff8f2", 2041 border: "2px solid #ffe0c2", 2042 boxShadow: "0 4px 24px rgba(255,122,0,0.10)" 2043 }, children: [
2044 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 px-5 pt-5 pb-4", children: [ 2045 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-xl flex items-center justify-center flex-shrink-0", style: { 2046 background: "#FF7A00" 2047 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Youtube, { className: "w-5 h-5 text-white" }) }), 2048 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 2049 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "font-bold text-sm text-foreground leading-tight", children: [ 2050 "SkillForge", 2051 /* @__PURE__ */ jsxRuntimeExports.jsx("sup", { className: "text-[0.6em]", children: "®" }), 2052 " on YouTube" 2053 ] }), 2054 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs text-muted-foreground", children: "Free training videos" }) 2055 ] }) 2056 ] }), 2057 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-4 pb-2 flex flex-col gap-2", children: [{ 2058 title: "Microsoft Excel", 2059 duration: "18 lessons", 2060 color: "#1d6f42", 2061 icon: "ð", 2062 href: "https://www.youtube.com/playlist?list=PLwLw21RsChcuPF4HitxlMXOaJtXCtMwIx" 2063 }, { 2064 title: "Microsoft Copilot 365", 2065 duration: "Tips & walkthroughs", 2066 color: "#0078d4", 2067 icon: "ð¤", 2068 href: "https://www.youtube.com/@SkillForge/videos" 2069 }, { 2070 title: "Power BI", 2071 duration: "4 videos", 2072 color: "#e8a800", 2073 icon: "ð", 2074 href: "https://www.youtube.com/playlist?list=PLwLw21RsChcuYNijcKSkzzFLo1D4-oZso" 2075 }].map((v) => /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: v.href, target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-3 rounded-xl p-2.5 transition-colors hover:bg-orange-50", style: { 2076 background: "white", 2077 border: "1px solid #f0e8e0" 2078 }, children: [
2079 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-16 h-10 rounded-lg flex items-center justify-center flex-shrink-0 relative overflow-hidden", style: { 2080 background: v.color 2081 }, children: [ 2082 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-lg", children: v.icon }), 2083 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-5 h-5 rounded-full bg-white/30 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { viewBox: "0 0 10 10", className: "w-2.5 h-2.5 fill-white ml-0.5", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntimeExports.jsx("polygon", { points: "2,1 9,5 2,9" }) }) }) }) 2084 ] }), 2085 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [ 2086 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-xs font-semibold text-foreground truncate", children: v.title }),
2087 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-[10px] text-muted-foreground", children: v.duration }) 2088 ] }), 2089 /* @__PURE__ */ jsxRuntimeExports.jsx("svg", { viewBox: "0 0 10 10", className: "w-3 h-3 flex-shrink-0 opacity-30", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntimeExports.jsx("polygon", { points: "2,1 9,5 2,9", fill: "currentColor" }) }) 2090 ] }, v.title)) }), 2091 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-4 mb-4 mt-2 rounded-xl py-2.5 flex items-center justify-center gap-2 font-semibold text-sm text-white transition-opacity group-hover:opacity-90", style: { 2092 background: "#FF7A00" 2093 }, children: [ 2094 /* @__PURE__ */ jsxRuntimeExports.jsx(Youtube, { className: "w-4 h-4" }), 2095 "Watch all videos" 2096 ] }) 2097 ] }) }) 2098 ] }) }) }), 2099 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 text-white", style: { 2100 background: "#4A7A8A" 2101 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-5xl px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 2102 opacity: 0, 2103 y: 20 2104 }, whileInView: { 2105 opacity: 1, 2106 y: 0 2107 }, viewport: { 2108 once: true 2109 }, transition: { 2110 duration: 0.5 2111 }, className: "text-center", children: [
2112 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold", children: "Ready to Start Learning?" }), 2113 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-lg opacity-90 max-w-2xl mx-auto", children: "Join our community of learners and take the next step in your professional development journey." }), 2114 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-8 flex justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "text-lg px-8 font-semibold", style: { 2115 background: "white", 2116 color: "#4A7A8A" 2117 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Explore Courses" }) }) }) 2118 ] }) }) }) 2119 ] }) 2120 ] }); 2121} 2122function AuthPage() { 2123 const navigate = useNavigate(); 2124 const { 2125 session, 2126 isPending 2127 } = useSession(); 2128 const [email, setEmail] = reactExports.useState(""); 2129 const [error, setError] = reactExports.useState(""); 2130 const [loading, setLoading] = reactExports.useState(false); 2131 const [magicLinkSent, setMagicLinkSent] = reactExports.useState(false); 2132 if ((session == null ? void 0 : session.user) && !isPending) { 2133 const user = getUserWithRole(session.user); 2134 const userRole = user.role; 2135 if (userRole === "admin") return /* @__PURE__ */ jsxRuntimeExports.jsx(Navigate, { to: "/admin", replace: true }); 2136 if (userRole === "instructor") return /* @__PURE__ */ jsxRuntimeExports.jsx(Navigate, { to: "/instructor", replace: true }); 2137 return /* @__PURE__ */ jsxRuntimeExports.jsx(Navigate, { to: "/student", replace: true }); 2138 } 2139 const handleSubmit = async (e) => { 2140 e.preventDefault(); 2141 setError(""); 2142 setLoading(true); 2143 setMagicLinkSent(false); 2144 try { 2145 await sendMagicLink(email); 2146 setMagicLinkSent(true); 2147 } catch (err) { 2148 setError("An unexpected error occurred"); 2149 } finally { 2150 setLoading(false); 2151 } 2152 }; 2153 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-h-screen flex items-center justify-center bg-muted px-4 py-12", children: [ 2154 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
2155 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Sign In | SkillForge" }), 2156 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Sign in to your SkillForge student account to access your courses and training materials." }), 2157 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "robots", content: "noindex, nofollow" }), 2158 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/auth" }), 2159 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Sign In | SkillForge" }), 2160 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Sign in to your SkillForge student account." }), 2161 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/auth" }), 2162 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 2163 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }),
2164 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 2165 "@context": "https://schema.org", 2166 "@type": "WebPage", 2167 "name": "Sign In", 2168 "url": "https://skillforge.com/auth", 2169 "isPartOf": { 2170 "@id": "https://skillforge.com/#website" 2171 } 2172 }) }) 2173 ] }), 2174 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "w-full max-w-md", children: [ 2175 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "text-center", children: [ 2176 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "sr-only", children: "Sign In to SkillForge" }), 2177 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center mb-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx(GraduationCap, { className: "h-12 w-12 text-primary" }) }), 2178 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-2xl", children: "Welcome back" }), 2179 /* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: "Enter your email to receive a sign-in link" }) 2180 ] }),
2181 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: magicLinkSent ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4 text-center", children: [ 2182 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-4 bg-green-50 border border-green-200 rounded-md", children: [ 2183 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-green-800 font-medium", children: "Check your email!" }), 2184 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-green-700 mt-2", children: [ 2185 "We've sent a magic link to ", 2186 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: email }), 2187 ". Click the link in the email to sign in." 2188 ] }) 2189 ] }), 2190 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", onClick: () => { 2191 setMagicLinkSent(false); 2192 setEmail(""); 2193 }, className: "w-full", children: "Try a different email" }) 2194 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
2195 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 2196 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "email", children: "Email" }), 2197 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), required: true, disabled: loading, placeholder: "[email protected]", autoComplete: "email" }) 2198 ] }), 2199 error && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-sm text-destructive bg-destructive/10 p-3 rounded-md", children: error }), 2200 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "submit", className: "w-full", disabled: loading, children: loading ? "Sending..." : "Send Magic Link" }), 2201 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center text-sm text-muted-foreground mt-4", children: [ 2202 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-foreground mb-2", children: "First time here?" }),
2203 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Magic links only work for students who have already enrolled in a course." }), 2204 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "mt-2", children: [ 2205 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { type: "button", onClick: () => navigate("/courses"), className: "text-primary hover:underline font-medium", children: "Browse courses" }), 2206 " ", 2207 "to enroll. Your account will be created automatically when you complete your purchase." 2208 ] }) 2209 ] }) 2210 ] }) }) 2211 ] }) 2212 ] }); 2213} 2214const badgeVariants = cva("inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", { 2215 variants: { 2216 variant: { 2217 default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", 2218 secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", 2219 destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", 2220 outline: "text-foreground" 2221 } 2222 }, 2223 defaultVariants: { 2224 variant: "default" 2225 } 2226}); 2227function Badge({ 2228 className, 2229 variant, 2230 ...props 2231}) { 2232 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn(badgeVariants({ 2233 variant 2234 }), className), ...props }); 2235} 2236const Select = Root2$1; 2237const SelectValue = Value; 2238const SelectTrigger = reactExports.forwardRef(({ 2239 className, 2240 children, 2241 ...props 2242}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Trigger$1, { ref, className: cn("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm r
2242ing-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1", className), ...props, children: [ 2243 children, 2244 /* @__PURE__ */ jsxRuntimeExports.jsx(Icon, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "h-4 w-4 opacity-50" }) }) 2245] })); 2246SelectTrigger.displayName = Trigger$1.displayName; 2247const SelectScrollUpButton = reactExports.forwardRef(({ 2248 className, 2249 ...props 2250}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollUpButton, { ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronUp, { className: "h-4 w-4" }) })); 2251SelectScrollUpButton.displayName = ScrollUpButton.displayName; 2252const SelectScrollDownButton = reactExports.forwardRef(({ 2253 className, 2254 ...props 2255}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollDownButton, { ref, className: cn("flex cursor-default items-center justify-center py-1", className), ...props, children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "h-4 w-4" }) })); 2256SelectScrollDownButton.displayName = ScrollDownButton.displayName; 2257const SelectContent = reactExports.forwardRef(({ 2258 className, 2259 children, 2260 position = "popper", 2261 ...props 2262}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Portal$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Content2, { ref, className: cn("relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position, ...props, children: [ 2263 /* @__PURE__ */ jsxRuntimeExports.jsx(SelectScrollUpButton, {}), 2264 /* @__PURE__ */ jsxRuntimeExports.jsx(Viewport, { className: cn("p-1", position === "popper" && "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"), children }), 2265 /* @__PURE__ */ jsxRuntimeExports.jsx(SelectScrollDownButton, {}) 2266] }) })); 2267SelectContent.displayName = Content2.displayName; 2268const SelectLabel = reactExports.forwardRef(({ 2269 className, 2270 ...props 2271}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Label$1, { ref, className: cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className), ...props })); 2272SelectLabel.displayName = Label$1.displayName; 2273const SelectItem = reactExports.forwardRef(({ 2274 className, 2275 children, 2276 ...props 2277}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsxs(Item, { ref, className: cn("relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className), ...props, children: [ 2278 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicator, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "h-4 w-4" }) }) }), 2279 /* @__PURE__ */ jsxRuntimeExports.jsx(ItemText, { children }) 2280] })); 2281SelectItem.displayName = Item.displayName; 2282const SelectSeparator = reactExports.forwardRef(({ 2283 className, 2284 ...props 2285}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Separator, { ref, className: cn("-mx-1 my-1 h-px bg-muted", className), ...props })); 2286SelectSeparator.displayName = Separator.displayName; 2287function CoursesPage() { 2288 const loaderData = useLoaderData(); 2289 const [searchParams, setSearchParams] = useSearchParams(); 2290 const [courses, setCourses] = reactExports.useState((loaderData == null ? void 0 : loaderData.courses) ?? []); 2291 const [categories, setCategories] = reactExports.useState([]); 2292 const [filteredCourses, setFilteredCourses] = reactExports.useState((loaderData == null ? void 0 : loaderData.courses) ?? []); 2293 const searchQuery = searchParams.get("search") || ""; 2294 const [categoryFilter, setCategoryFilter] = reactExports.useState("all"); 2295 const [hydrated, setHydrated] = reactExports.useState(false); 2296 const setSearchQuery = (value) => { 2297 setSearchParams((prev) => { 2298 const next = new URLSearchParams(prev); 2299 if (value) { 2300 next.set("search", value); 2301 } else { 2302 next.delete("search"); 2303 } 2304 return next; 2305 }, {
2306 replace: true 2307 }); 2308 }; 2309 reactExports.useEffect(() => { 2310 var _a2; 2311 setHydrated(true); 2312 const hasLoaderCourses = (((_a2 = loaderData == null ? void 0 : loaderData.courses) == null ? void 0 : _a2.length) ?? 0) > 0; 2313 const fetches = [fetch("/api/categories").then((res) => res.json())]; 2314 if (!hasLoaderCourses) { 2315 fetches.unshift(fetch("/api/courses").then((res) => res.json())); 2316 } 2317 Promise.all(fetches).then((results) => { 2318 if (!hasLoaderCourses) { 2319 const [coursesData, categoriesData] = results; 2320 const coursesArray = Array.isArray(coursesData) ? coursesData : []; 2321 const categoriesArray = Array.isArray(categoriesData) ? categoriesData : []; 2322 const activeCourses = coursesArray.filter((c) => c.isActive !== false); 2323 setCourses(activeCourses); 2324 setCategories(categoriesArray); 2325 } else { 2326 const [categoriesData] = results; 2327 const categoriesArray = Array.isArray(categoriesData) ? categoriesData : []; 2328 setCategories(categoriesArray); 2329 } 2330 }).catch((err) => { 2331 console.error("Error fetching data:", err); 2332 if (!hasLoaderCourses) { 2333 setCourses([]); 2334 setFilteredCourses([]); 2335 } 2336 setCategories([]); 2337 }); 2338 }, []); 2339 const getAllCategoryIds = (categoryId, cats) => { 2340 const ids = [categoryId]; 2341 const findChildren = (parentId, catList) => { 2342 for (const cat of catList) { 2343 if (cat.parentId === parentId) { 2344 ids.push(cat.id); 2345 if (cat.children && cat.children.length > 0) { 2346 cat.children.forEach((child) => { 2347 ids.push(child.id); 2348 findChildren(child.id, catList); 2349 }); 2350 } 2351 } 2352 } 2353 }; 2354 const flattenCategories = (cats2) => { 2355 const result = []; 2356 for (const cat of cats2) { 2357 result.push(cat); 2358 if (cat.children && cat.children.length > 0) { 2359 result.push(...flattenCategories(cat.children)); 2360 } 2361 } 2362 return result; 2363 }; 2364 findChildren(categoryId, flattenCategories(cats)); 2365 return ids; 2366 }; 2367 const flattenCategoriesForDisplay = (cats, level = 0) => { 2368 const result = []; 2369 for (const cat of cats) { 2370 result.push({ 2371 id: cat.id, 2372 name: cat.name, 2373 level 2374 }); 2375 if (cat.children && cat.children.length > 0) { 2376 result.push(...flattenCategoriesForDisplay(cat.children, level
2376+ 1)); 2377 } 2378 } 2379 return result; 2380 }; 2381 reactExports.useEffect(() => { 2382 let filtered = courses; 2383 if (searchQuery) { 2384 const q = searchQuery.toLowerCase(); 2385 filtered = filtered.filter((course) => course.title.toLowerCase().includes(q) || (course.description || "").toLowerCase().includes(q)); 2386 } 2387 if (categoryFilter !== "all") { 2388 const categoryId = parseInt(categoryFilter); 2389 const categoryIds = getAllCategoryIds(categoryId, categories); 2390 filtered = filtered.filter((course) => { 2391 var _a2; 2392 const ids = ((_a2 = course.categoryIds) == null ? void 0 : _a2.length) ? course.categoryIds : course.categoryId ? [course.categoryId] : []; 2393 return ids.some((id) => categoryIds.includes(id)); 2394 }); 2395 } 2396 setFilteredCourses(filtered); 2397 }, [searchQuery, categoryFilter, courses, categories]); 2398 const stripHtml = (html) => html.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim(); 2399 const itemListJsonLd = { 2400 "@context": "https://schema.org", 2401 "@type": "ItemList", 2402 name: "SkillForge Training Courses", 2403 description: "Full catalog of instructor-led professional training courses", 2404 url: "https://skillforge.com/courses", 2405 numberOfItems: courses.length, 2406 itemListElement: courses.map((c, i) => { 2407 var _a2; 2408 return { 2409 "@type": "ListItem", 2410 position: i + 1, 2411 item: { 2412 "@type": "Course", 2413 name: c.title, 2414 url: `https://skillforge.com${c.relativeUrl}`, 2415 description: stripHtml(c.description || "").slice(0, 300), 2416 image: ((_a2 = c.imageUrl) == null ? void 0 : _a2.startsWith("http")) ? c.imageUrl : `https://skillforge.com${c.imageUrl || "/assets/skillforge-logo.jpg"}`, 2417 provider: { 2418 "@type": "Organization", 2419 name: "SkillForge", 2420 url: "https://skillforge.com" 2421 }, 2422 offers: { 2423 "@type": "Offer", 2424 price: c.price, 2425 priceCurrency: "USD", 2426 availability: "https://schema.org/InStock", 2427 url: `https://skillforge.com${c.relativeUrl}` 2428 } 2429 } 2430 }; 2431 }) 2432 }; 2433 const webPageJsonLd = { 2434 "@context": "https://schema.org", 2435 "@type": "CollectionPage", 2436 "@id": "https://skillforge.com/courses#webpage", 2437 name: "Training Courses | Microsoft Office, Excel, Power BI, Azure & More | SkillForge", 2438 url: "https://skillforge.com/courses", 2439 description: "Browse SkillForge's full catalog of instructor-led training courses â Microsoft Office, Excel, Power BI, SharePoint, Azure, SQL, Tableau, leadership, and business skills. Live online and onsite.", 2440 isPartOf: { 2441 "@id": "https://skillforge.com/#website" 2442 }, 2443 about: { 2444 "@id": "https://skillforge.com/#organization" 2445 }, 2446 breadcrumb: { 2447 "@type": "BreadcrumbList", 2448 itemListElement: [{ 2449 "@type": "ListItem", 2450 position: 1, 2451 name: "Home", 2452 item: "https://skillforge.com" 2453 }, { 2454 "@type": "ListItem", 2455 position: 2, 2456 name: "Courses", 2457 item: "https://skillforge.com/courses" 2458 }] 2459 } 2460 }; 2461 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 2462 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
2463 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Training Courses | Microsoft Office, Excel, Power BI, Azure & More | SkillForge" }), 2464 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Browse SkillForge's full catalog of instructor-led training courses â Microsoft Office, Excel, Power BI, SharePoint, Azure, SQL, Tableau, leadership, and business skills. Live online and onsite." }), 2465 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/courses" }), 2466 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 2467 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/courses" }), 2468 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Training Courses | Microsoft Office, Excel, Power BI, Azure & More | SkillForge" }), 2469 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Browse SkillForge's full catalog of instructor-led training courses â Microsoft Office, Excel, Power BI, SharePoint, Azure, SQL, Tableau, leadership, and business skills." }),
2470 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 2471 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 2472 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 2473 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(itemListJsonLd).replace(/</g, "<") }), 2474 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(webPageJsonLd).replace(/</g, "<") }) 2475 ] }), 2476 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-background py-12", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: [ 2477 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 2478 opacity: 0, 2479 y: 20 2480 } : false, animate: { 2481 opacity: 1, 2482 y: 0 2483 }, transition: { 2484 duration: 0.5 2485 }, className: "text-center mb-12", children: [
2486 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-foreground", children: "Our Courses" }), 2487 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-4 text-lg text-muted-foreground", children: "Explore our comprehensive catalog of professional training programs" }) 2488 ] }), 2489 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 2490 opacity: 0, 2491 y: 20 2492 } : false, animate: { 2493 opacity: 1, 2494 y: 0 2495 }, transition: { 2496 duration: 0.5, 2497 delay: 0.1 2498 }, className: "mb-8 space-y-4", children: [ 2499 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative", children: [ 2500 /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-5 w-5 text-muted-foreground" }), 2501 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { type: "text", placeholder: "Search courses...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "pl-10" }) 2502 ] }),
2503 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: categoryFilter, onValueChange: setCategoryFilter, children: [ 2504 /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "All Categories" }) }), 2505 /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectContent, { children: [ 2506 /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: "all", children: "All Categories" }), 2507 flattenCategoriesForDisplay(categories).map((cat) => /* @__PURE__ */ jsxRuntimeExports.jsxs(SelectItem, { value: cat.id.toString(), children: [ 2508 "Â ".repeat(cat.level * 4), 2509 cat.name 2510 ] }, cat.id)) 2511 ] }) 2512 ] }) }) 2513 ] }), 2514 filteredCourses.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", children: filteredCourses.map((course) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "h-full flex flex-col hover:shadow-lg transition-all hover:-translate-y-1", children: [
2515 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "aspect-video overflow-hidden rounded-t-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: course.imageUrl, alt: course.title, className: "w-full h-full object-cover", width: 400, height: 225, loading: "lazy" }) }), 2516 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [ 2517 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-2 mb-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", children: course.category }) }), 2518 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-xl", children: course.title }), 2519 /* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { className: "line-clamp-2 prose prose-sm max-w-none prose-p:my-0 prose-p:inline", dangerouslySetInnerHTML: { 2520 __html: course.description 2521 } }) 2522 ] }), 2523 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { className: "flex-grow", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-4 text-sm text-muted-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1", children: [
2524 /* @__PURE__ */ jsxRuntimeExports.jsx(Calendar, { className: "h-4 w-4" }), 2525 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: course.duration }) 2526 ] }) }) }), 2527 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardFooter, { className: "flex items-center justify-between", children: [ 2528 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-2xl font-bold text-foreground", children: [ 2529 "$", 2530 parseFloat(course.price).toFixed(2) 2531 ] }), 2532 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: course.relativeUrl, children: "View Details" }) }) 2533 ] }) 2534 ] }) }, course.id)) }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-center py-12", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: "No courses found matching your criteria." }) }) 2535 ] }) }) 2536 ] }); 2537} 2538function GroupTrainingModal({ 2539 open, 2540 onOpenChange, 2541 courseTitle 2542}) { 2543 const [submitted, setSubmitted] = reactExports.useState(false); 2544 const [submitting, setSubmitting] = reactExports.useState(false); 2545 const [error, setError] = reactExports.useState(""); 2546 const [form, setForm] = reactExports.useState({ 2547 name: "", 2548 email: "", 2549 company: "", 2550 deliveryMode: "online", 2551 city: "", 2552 state: "", 2553 studentCount: "" 2554 }); 2555 const handleChange = (field, value) => { 2556 setForm((prev) => ({ 2557 ...prev, 2558 [field]: value 2559 })); 2560 setError(""); 2561 }; 2562 const handleSubmit = async (e) => { 2563 e.preventDefault(); 2564 setSubmitting(true); 2565 setError(""); 2566 try { 2567 const res = await fetch("/api/group-training-requests", { 2568 method: "POST", 2569 headers: { 2570 "Content-Type": "application/json" 2571 }, 2572 body: JSON.stringify({ 2573 name: form.name, 2574 email: form.email, 2575 company: form.company || void 0, 2576 courseTitle, 2577 deliveryMode: form.deliveryMode, 2578 city: form.deliveryMode === "onsite" ? form.city : void 0, 2579 state: form.deliveryMode === "onsite" ? form.state : void 0, 2580 studentCount: form.studentCount 2581 }) 2582 }); 2583 if (!res.ok) { 2584 const data2 = await res.json(); 2585 throw new Error(data2.error || "Submission failed"); 2586 } 2587 setSubmitted(true); 2588 } catch (err) { 2589 setError(err instanceof Error ? err.message : "Something went wrong. Please try again."); 2590 } finally { 2591 setSubmitting(false); 2592 } 2593 }; 2594 const handleClose = (open2) => { 2595 if (!open2) { 2596 setSubmitted(false); 2597 setError(""); 2598 setForm({ 2599 name: "", 2600 email: "", 2601 company: "", 2602 deliveryMode: "online", 2603 city: "", 2604 state: "", 2605 studentCount: "" 2606 }); 2607 } 2608 onOpenChange(open2); 2609 }; 2610 return /* @__PURE__ */ jsxRuntimeExports.jsx(Dialog, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogContent, { className: "sm:max-w-lg", children: submitted ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "py-8 text-center", children: [ 2611 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "h-14 w-14 text-green-500 mx-auto mb-4" }), 2612 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-xl font-semibold text-foreground mb-2", children: "Request Received!" }), 2613 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-muted-foreground mb-6", children: [ 2614 "Thank you! A member of our team will be in touch shortly with group pricing details for", 2615 " ",
2616 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: courseTitle }), 2617 "." 2618 ] }), 2619 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { onClick: () => handleClose(false), children: "Close" }) 2620 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 2621 /* @__PURE__ */ jsxRuntimeExports.jsxs(DialogHeader, { children: [ 2622 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [ 2623 /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "h-5 w-5 text-primary" }), 2624 /* @__PURE__ */ jsxRuntimeExports.jsx(DialogTitle, { children: "Request Group Training Pricing" }) 2625 ] }), 2626 /* @__PURE__ */ jsxRuntimeExports.jsx(DialogDescription, { children: "Fill out the form below and we'll get back to you with custom pricing for your team." }) 2627 ] }), 2628 /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, className: "space-y-4 mt-2", children: [
2629 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 2630 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "courseTitle", children: "Course" }), 2631 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "courseTitle", value: courseTitle, readOnly: true, className: "bg-muted text-muted-foreground" }) 2632 ] }), 2633 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 2634 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "name", children: [ 2635 "Your Name ", 2636 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 2637 ] }), 2638 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "name", placeholder: "Jane Smith", value: form.name, onChange: (e) => handleChange("name", e.target.value), required: true }) 2639 ] }), 2640 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 2641 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "email", children: [ 2642 "Email Address ",
2643 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 2644 ] }), 2645 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "email", type: "email", placeholder: "[email protected]", value: form.email, onChange: (e) => handleChange("email", e.target.value), required: true }) 2646 ] }), 2647 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 2648 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "company", children: [ 2649 "Company ", 2650 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground text-xs font-normal", children: "(optional)" }) 2651 ] }), 2652 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "company", placeholder: "Acme Corp", value: form.company, onChange: (e) => handleChange("company", e.target.value) }) 2653 ] }), 2654 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-2", children: [ 2655 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { children: [ 2656 "Training Format ",
2657 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 2658 ] }), 2659 /* @__PURE__ */ jsxRuntimeExports.jsxs(RadioGroup, { value: form.deliveryMode, onValueChange: (val) => handleChange("deliveryMode", val), className: "flex gap-6", children: [ 2660 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 2661 /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroupItem, { value: "online", id: "online" }), 2662 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "online", className: "cursor-pointer font-normal", children: "Live Online" }) 2663 ] }), 2664 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 2665 /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroupItem, { value: "onsite", id: "onsite" }), 2666 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "onsite", className: "cursor-pointer font-normal", children: "Onsite" }) 2667 ] }) 2668 ] }) 2669 ] }), 2670 form.deliveryMode === "onsite" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
2671 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 2672 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "city", children: [ 2673 "City ", 2674 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 2675 ] }), 2676 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "city", placeholder: "Chicago", value: form.city, onChange: (e) => handleChange("city", e.target.value), required: true }) 2677 ] }), 2678 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 2679 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "state", children: [ 2680 "State ", 2681 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 2682 ] }), 2683 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "state", placeholder: "IL", value: form.state, onChange: (e) => handleChange("state", e.target.value), required: true }) 2684 ] }) 2685 ] }),
2686 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 2687 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "studentCount", children: [ 2688 "Approximate Number of Students ", 2689 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 2690 ] }), 2691 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "studentCount", type: "number", min: "2", placeholder: "e.g. 10", value: form.studentCount, onChange: (e) => handleChange("studentCount", e.target.value), required: true }) 2692 ] }), 2693 error && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-destructive", children: error }), 2694 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-end gap-3 pt-2", children: [ 2695 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "button", variant: "outline", onClick: () => handleClose(false), children: "Cancel" }), 2696 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "submit", disabled: submitting, children: submitting ? "Submitting..." : "Submit Request" }) 2697 ] }) 2698 ] }) 2699 ] }) }) }); 2700} 2701function parseFaqForJsonLd(html) { 2702 var _a2; 2703 if (!html) return []; 2704 const pairs = []; 2705 const dtMatches = [...html.matchAll(/<dt[^>]*>([\s\S]*?)<\/dt>/gi)]; 2706 const ddMatches = [...html.matchAll(/<dd[^>]*>([\s\S]*?)<\/dd>/gi)]; 2707 for (let i = 0; i < dtMatches.length; i++) { 2708 const q = stripTags(dtMatches[i][1]).trim(); 2709 const a = stripTags(((_a2 = ddMatches[i]) == null ? void 0 : _a2[1]) ?? "").trim(); 2710 if (q) pairs.push({ 2711 q, 2712 a 2713 }); 2714 } 2715 return pairs; 2716} 2717function htmlToPlainFaq(html) { 2718 if (!html) return ""; 2719 const trimmed = html.trim(); 2720 if (!trimmed.startsWith("<")) return trimmed; 2721 const pairs = parseFaqForJsonLd(trimmed); 2722 if (!pairs.length) return stripTags(trimmed); 2723 return pairs.map(({ 2724 q, 2725 a 2726 }) => `Q: ${q} 2727A: ${a}`).join("\n\n"); 2728} 2729function stripTags(str) { 2730 return str.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim(); 2731} 2732const Accordion = Root2$2; 2733const AccordionItem = reactExports.forwardRef(({ 2734 className, 2735 ...props 2736}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Item$1, { ref, className: cn("border-b", className), ...props })); 2737AccordionItem.displayName = "AccordionItem"; 2738const AccordionTrigger = reactExports.forwardRef(({ 2739 className, 2740 children, 2741 ...props 2742}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Header$1, { className: "flex", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Trigger2, { ref, className: cn("flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180", className), ...props, children: [ 2743 children, 2744 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-200" }) 2745] }) })); 2746AccordionTrigger.displayName = Trigger2.displayName; 2747const AccordionContent = reactExports.forwardRef(({ 2748 className, 2749 children, 2750 ...props 2751}, ref) => /* @__PURE__ */ jsxRuntimeExports.jsx(Content2$1, { ref, className: "overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down", ...props, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: cn("pb-4 pt-0", className), children }) })); 2752AccordionContent.displayName = Content2$1.displayName; 2753function FaqAccordion({ 2754 html, 2755 className 2756}) { 2757 const pairs = parseFaqForJsonLd(html); 2758 if (!pairs.length) return null; 2759 return /* @__PURE__ */ jsxRuntimeExports.jsx(Accordion, { type: "single", collapsible: true, className, children: pairs.map(({ 2760 q, 2761 a 2762 }, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs(AccordionItem, { value: `faq-${i}`, children: [ 2763 /* @__PURE__ */ jsxRuntimeExports.jsx(AccordionTrigger, { className: "text-left font-semibold text-foreground hover:no-underline", children: q }), 2764 /* @__PURE__ */ jsxRuntimeExports.jsx(AccordionContent, { className: "text-muted-foreground leading-relaxed", children: a }) 2765 ] }, i)) }); 2766} 2767function CourseInformationDownload({ 2768 course 2769}) { 2770 const openPrintableCourseInformation = () => { 2771 const url = new URL(window.location.href); 2772 url.searchParams.set("course-information", "print"); 2773 window.open(url.toString(), "_blank", "noopener,noreferrer"); 2774 }; 2775 return /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { type: "button", variant: "outline", onClick: openPrintableCourseInformation, className: "course-print-hide gap-2", "aria-label": `Download course information PDF for ${course.title}`, children: [
2776 /* @__PURE__ */ jsxRuntimeExports.jsx(FileDown, { className: "h-4 w-4" }), 2777 " Download course information PDF" 2778 ] }); 2779} 2780function Detail({ 2781 label, 2782 value 2783}) { 2784 if (!value) return null; 2785 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "print-detail", children: [ 2786 /* @__PURE__ */ jsxRuntimeExports.jsx("dt", { children: label }), 2787 /* @__PURE__ */ jsxRuntimeExports.jsx("dd", { children: value }) 2788 ] }); 2789} 2790function Section$1({ 2791 title, 2792 html 2793}) { 2794 if (!html) return null; 2795 return /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "print-section", children: [ 2796 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { children: title }), 2797 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "print-copy", dangerouslySetInnerHTML: { 2798 __html: html 2799 } }) 2800 ] }); 2801} 2802function CoursePrintableInformation({ 2803 course 2804}) { 2805 var _a2; 2806 return /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "course-print-document", children: [ 2807 /* @__PURE__ */ jsxRuntimeExports.jsxs("header", { className: "print-header", children: [
2808 /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "/assets/skillforge-logo.jpg", alt: "SkillForge", width: 274, height: 82 }), 2809 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 2810 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "Course information" }), 2811 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "800-971-3203 · [email protected]" }) 2812 ] }) 2813 ] }), 2814 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "print-rule" }), 2815 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "print-intro", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "print-title", children: [ 2816 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [ 2817 course.courseId, 2818 " · ", 2819 course.category 2820 ] }), 2821 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { children: course.title }), 2822 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { dangerouslySetInnerHTML: { 2823 __html: course.description 2824 } }) 2825 ] }) }), 2826 /* @__PURE__ */ jsxRuntimeExports.jsxs("dl", { className: "print-details", children: [
2827 /* @__PURE__ */ jsxRuntimeExports.jsx(Detail, { label: "Duration", value: course.duration }), 2828 /* @__PURE__ */ jsxRuntimeExports.jsx(Detail, { label: "Level", value: course.level }), 2829 /* @__PURE__ */ jsxRuntimeExports.jsx(Detail, { label: "Course fee", value: course.price ? `$${Number(course.price).toFixed(2)}` : void 0 }), 2830 /* @__PURE__ */ jsxRuntimeExports.jsx(Detail, { label: "Versions", value: (_a2 = course.versionsSupported) == null ? void 0 : _a2.replace(/<[^>]+>/g, " ") }) 2831 ] }), 2832 /* @__PURE__ */ jsxRuntimeExports.jsx(Section$1, { title: "Who should take this course", html: course.courseAudience }), 2833 /* @__PURE__ */ jsxRuntimeExports.jsx(Section$1, { title: "What youâll learn", html: course.courseObjectives }), 2834 /* @__PURE__ */ jsxRuntimeExports.jsx(Section$1, { title: "Course content", html: course.courseSyllabus }), 2835 /* @__PURE__ */ jsxRuntimeExports.jsx(Section$1, { title: "Prerequisites", html: course.prerequisites }), 2836 /* @__PURE__ */ jsxRuntimeExports.jsx(Section$1, { title: "Why SkillForge", html: course.whySkillForge }), 2837 /* @__PURE__ */ jsxRuntimeExports.jsx(Section$1, { title: "Certification", html: course.certification }), 2838 /* @__PURE__ */ jsxRuntimeExports.jsx(Section$1, { title: "Frequently asked questions", html: course.faq }), 2839 /* @__PURE__ */ jsxRuntimeExports.jsxs("footer", { className: "print-footer", children: [
2840 /* @__PURE__ */ jsxRuntimeExports.jsx(FileText, { size: 14 }), 2841 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "SkillForge professional training" }), 2842 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "skillforge.com" }) 2843 ] }) 2844 ] }); 2845} 2846function CourseDetailPage() { 2847 var _a2, _b2, _c2; 2848 const { 2849 slug 2850 } = useParams(); 2851 const location = useLocation(); 2852 const printRequested = new URLSearchParams(location.search).get("course-information") === "print"; 2853 const { 2854 addItem, 2855 items 2856 } = useCart(); 2857 const loaderData = useLoaderData(); 2858 const [course, setCourse] = reactExports.useState((loaderData == null ? void 0 : loaderData.course) ?? null); 2859 const [sessions, setSessions] = reactExports.useState((loaderData == null ? void 0 : loaderData.sessions) ?? []); 2860 const [loading, setLoading] = reactExports.useState(loaderData == null); 2861 const [addedToCart, setAddedToCart] = reactExports.useState(null); 2862 const [groupModalOpen, setGroupModalOpen] = reactExports.useState(false); 2863 reactExports.useEffect(() => { 2864 if (!loaderData) return; 2865 setCourse(loaderData.course); 2866 setSessions(loaderData.sessions); 2867 setLoading(false); 2868 }, [loaderData]); 2869 reactExports.useEffect(() => { 2870 window.scrollTo(0, 0); 2871 }, [slug]); 2872 reactExports.useEffect(() => { 2873 if (!printRequested || loading || !course) return; 2874 let printStarted = false; 2875 let printMediaActivated = false; 2876 const printMedia = window.matchMedia("print"); 2877 const closePrintPreview = () => window.close(); 2878 const handlePrintMediaChange = (event) => { 2879 if (event.matches) { 2880 printMediaActivated = true; 2881 } else if (printMediaActivated) { 2882 closePrintPreview(); 2883 } 2884 }; 2885 const handleWindowFocus = () => { 2886 if (printStarted) window.setTimeout(closePrintPreview, 100); 2887 }; 2888 const timer = window.setTimeout(() => { 2889 printStarted = true; 2890 window.print(); 2891 window.setTimeout(() => window.addEventListener("focus", handleWindowFocus, { 2892 once: true 2893 }), 1e3); 2894 }, 500); 2895 printMedia.addEventListener("change", handlePrintMediaChange); 2896 window.addEventListener("afterprint", closePrintPreview, { 2897 once: true 2898 }); 2899 return () => { 2900 window.clearTimeout(timer); 2901 printMedia.removeEventListener("change", handlePrintMediaChange); 2902 window.removeEventListener("afterprint", closePrintPreview); 2903 window.removeEventListener("focus", handleWindowFocus); 2904 }; 2905 }, [course, loading, printRequested]); 2906 reactExports.useEffect(() => { 2907 if (loaderData != null || !slug) return; 2908 fetch(`/api/courses/${slug}`, { 2909 cache: "no-store" 2910 }).then((res) => { 2911 if (!res.ok) throw new Error(`Course not found (${res.status})`); 2912 return res.json(); 2913 }).then(async (courseData) => { 2914 if (!courseData || courseData.error) throw new Error((courseData == null ? void 0 : courseData.error) || "Course not found"); 2915 setCourse(courseData); 2916 const sessionsData = await fetch(`/api/sessions?courseId=${courseData.id}`).then((r) => r.json()); 2917 const sessionsArray = Array.isArray(sessionsData) ? sessionsData : []; 2918 const sessionsWithCounts = await Promise.all(sessionsArray.map(async (sessionData) => { 2919 try { 2920 const enrollmentsRes = await fetch(`/api/enrollments/session/${sessionData.session.id}`); 2921 const enrollments = await enrollmentsRes.json(); 2922 return { 2923 ...sessionData, 2924 enrolledCount: Array.isArray(enrollments) ? enrollments.length : 0 2925 }; 2926 } catch { 2927 return { 2928 ...sessionData, 2929 enrolledCount: 0 2930 }; 2931 } 2932 })); 2933 const now = /* @__PURE__ */ new Date(); 2934 const threeMonthsOut = new Date(now); 2935 threeMonthsOut.setMonth(threeMonthsOut.getMonth() + 3); 2936 const filtered = sessionsWithCounts.filter((s) => { 2937 const start = new Date(s.session.startDate); 2938 return start >= now && start <= threeMonthsOut; 2939 }).sort((a, b) => new Date(a.session.startDate).getTime() - new Date(b.session.startDate).getTime()); 2940 setSessions(filtered);
2941 setLoading(false); 2942 }).catch((err) => { 2943 console.error("Error fetching course details:", err); 2944 setLoading(false); 2945 }); 2946 }, [slug, loaderData]); 2947 reactExports.useEffect(() => { 2948 var _a3; 2949 if (!((_a3 = loaderData == null ? void 0 : loaderData.sessions) == null ? void 0 : _a3.length)) return; 2950 Promise.all(loaderData.sessions.map(async (s) => { 2951 try { 2952 const res = await fetch(`/api/enrollments/session/${s.session.id}`); 2953 const enrollments = await res.json(); 2954 return { 2955 ...s, 2956 enrolledCount: Array.isArray(enrollments) ? enrollments.length : 0 2957 }; 2958 } catch { 2959 return s; 2960 } 2961 })).then((updated) => setSessions(updated)); 2962 }, [loaderData]); 2963 const handleAddToCart = (sessionData) => { 2964 if (!course) return; 2965 const enrolledCount = sessionData.enrolledCount || 0; 2966 const availableSeats = sessionData.session.maxStudents - enrolledCount; 2967 addItem({ 2968 sessionId: sessionData.session.id, 2969 courseId: course.id, 2970 courseTitle: course.title, 2971 sessionDate: sessionData.session.startDate, 2972 price: course.price, 2973 currency: "usd", 2974 maxStudents: sessionData.session.maxStudents, 2975 availableSeats 2976 }); 2977 setAddedToCart(sessionData.session.id); 2978 setTimeout(() => setAddedToCart(null), 2e3); 2979 }; 2980 const isInCart = (sessionId) => { 2981 return items.some((item) => item.sessionId === sessionId); 2982 }; 2983 if (loading) { 2984 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-background flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: "Loading course details..." }) }); 2985 } 2986 if (!course) { 2987 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-screen bg-background flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [
2988 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-4", children: "Course not found" }), 2989 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Back to Courses" }) }) 2990 ] }) }); 2991 } 2992 if (printRequested) { 2993 return /* @__PURE__ */ jsxRuntimeExports.jsx(CoursePrintableInformation, { course }); 2994 } 2995 const canonicalUrl = `https://skillforge.com${course.relativeUrl}`; 2996 const titleSuffix = /\btraining\b/i.test(course.title.trim().split(" ").slice(-1)[0]) ? "Course" : "Training Course"; 2997 const pageTitle = `${course.title} ${titleSuffix} | SkillForge`; 2998 const stripHtml = (html) => html.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim(); 2999 const buildMetaDescription = () => { 3000 const parts = []; 3001 const modes = new Set(sessions.map((s) => s.session.deliveryMode)); 3002 const deliveryLabel = modes.has("onsite") && modes.has("online") ? "Live online & onsite instructor-led" : modes.has("onsite") ? "Onsite instructor-led" : "Live online instructor-led"; 3003 parts.push(`${deliveryLabel} ${course.title} training.`); 3004 if (course.duration) parts.push(`${course.duration}.`); 3005 if (course.price && Number(course.price) > 0) { 3006 parts.push(`From ${Number(course.price).toLocaleString()}.`); 3007 } 3008 parts.push("Small class sizes. Expert instructors. Enroll today."); 3009 const candidate = parts.join(" "); 3010 if (candidate.length >= 80) return candidate.substring(0, 160); 3011 return stripHtml(course.description).substring(0, 160); 3012 }; 3013 const metaDescription = buildMetaDescription(); 3014 const courseSchema = { 3015 "@context": "https://schema.org", 3016 "@type": "Course", 3017 name: course.title, 3018 description: stripHtml(course.description), 3019 url: canonicalUrl, 3020 image: course.imageUrl || "https://skillforge.com/assets/skillforge-logo.jpg", 3021 provider: { 3022 "@type": "Organization", 3023 name: "SkillForge", 3024 url: "https://skillforge.com", 3025 logo: "https://skillforge.com/assets/skillforge-logo.jpg" 3026 }, 3027 offers: { 3028 "@type": "Offer", 3029 price: course.price, 3030 priceCurrency: "USD", 3031 url: canonicalUrl, 3032 availability: sessions.length > 0 ? "https://schema.org/InStock" : "https://schema.org/OutOfStock" 3033 }, 3034 ...course.level && { 3035 educationalLevel: course.level 3036 }, 3037 ...course.duration && { 3038 timeRequired: course.duration 3039 }, 3040 ...course.whySkillForge && { 3041 teaches: stripHtml(course.whySkillForge).substring(0, 500) 3042 }, 3043 ...sessions.length > 0 && { 3044 hasCourseInstance: sessions.map((s) => ({ 3045 "@type": "CourseInstance", 3046 courseMode: s.session.deliveryMode === "onsite" ? "onsite" : "online", 3047 startDate: s.session.startDate ? new Date(s.session.startDate).toISOString().split("T")[0] : void 0, 3048 endDate: s.session.endDate ? new Date(s.session.endDate).toISOString().split("T")[0] : void 0, 3049 ...s.session.startTime && { 3050 courseSchedule: { 3051 "@type": "Schedule", 3052 startTime: s.session.startTime, 3053 endTime: s.session.endTime || void 0, 3054 scheduleTimezone: s.session.timezone || "America/Chicago" 3055 } 3056 }, 3057 ...s.instructor && { 3058 instructor: { 3059 "@type": "Person", 3060 name: s.instructor.name 3061 } 3062 }, 3063 offers: { 3064 "@type": "Offer", 3065 price: course.price, 3066 priceCurrency: "USD", 3067 url: canonicalUrl, 3068 availability: (s.enrolledCount || 0) < s.session.maxStudents ? "https://schema.org/InStock" : "https://schema.org/SoldOut" 3069 } 3070 })) 3071 } 3072 }; 3073 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 3074 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
3075 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: pageTitle }), 3076 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: metaDescription }), 3077 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: canonicalUrl }), 3078 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 3079 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: canonicalUrl }), 3080 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: pageTitle }), 3081 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: metaDescription }), 3082 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: ((_a2 = course.imageUrl) == null ? void 0 : _a2.startsWith("http")) ? course.imageUrl : `https://skillforge.com${course.imageUrl || "/assets/skillforge-logo.jpg"}` }), 3083 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "twitter:card", content: "summary_large_image" }),
3084 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "twitter:url", content: canonicalUrl }), 3085 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "twitter:title", content: pageTitle }), 3086 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "twitter:description", content: metaDescription }), 3087 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "twitter:image", content: ((_b2 = course.imageUrl) == null ? void 0 : _b2.startsWith("http")) ? course.imageUrl : `https://skillforge.com${course.imageUrl || "/assets/skillforge-logo.jpg"}` }), 3088 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(courseSchema) }), 3089 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 3090 "@context": "https://schema.org", 3091 "@type": "BreadcrumbList", 3092 itemListElement: [{ 3093 "@type": "ListItem", 3094 position: 1, 3095 name: "Home", 3096 item: "https://skillforge.com/" 3097 }, { 3098 "@type": "ListItem", 3099 position: 2, 3100 name: "Courses", 3101 item: "https://skillforge.com/courses" 3102 }, { 3103 "@type": "ListItem", 3104 position: 3, 3105 name: course.title, 3106 item: canonicalUrl 3107 }] 3108 }) }), 3109 course.faq && parseFaqForJsonLd(course.faq).length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 3110 "@context": "https://schema.org", 3111 "@type": "FAQPage", 3112 mainEntity: parseFaqForJsonLd(course.faq).map(({ 3113 q, 3114 a 3115 }) => ({ 3116 "@type": "Question", 3117 name: q, 3118 acceptedAnswer: { 3119 "@type": "Answer", 3120 text: a 3121 } 3122 })) 3123 }) }) 3124 ] }), 3125 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background", children: [
3126 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative bg-gradient-to-br from-primary/10 via-background to-secondary/10 py-12 border-b", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: [ 3127 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "ghost", className: "course-print-hide mb-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses", children: [ 3128 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "h-4 w-4 mr-2" }), 3129 "Back to Courses" 3130 ] }) }), 3131 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3132 opacity: 0, 3133 y: 20 3134 }, animate: { 3135 opacity: 1, 3136 y: 0 3137 }, transition: { 3138 duration: 0.5 3139 }, className: "grid grid-cols-1 lg:grid-cols-3 gap-8", children: [ 3140 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "lg:col-span-1", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "aspect-square overflow-hidden rounded-lg shadow-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: course.imageUrl, alt: course.title, className: "w-full h-full object-cover", width: 600, height: 600, loading: "eager", fetchPriority: "high" }) }) }),
3141 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "lg:col-span-2", children: [ 3142 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-4", children: [ 3143 /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", className: "text-sm", children: course.category }), 3144 course.courseId && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: "text-sm font-mono", children: course.courseId }) 3145 ] }), 3146 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-4 mb-4 sm:flex-row sm:items-start sm:justify-between", children: [ 3147 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-foreground", children: course.title }), 3148 /* @__PURE__ */ jsxRuntimeExports.jsx(CourseInformationDownload, { course }) 3149 ] }), 3150 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: `text-muted-foreground mb-6 prose prose-base max-w-none prose-p:my-2 prose-p:first:mt-0 ${(((_c2 = course.description) == null ? void 0 : _c2.length) ?? 0) > 300 ? "text-base" : "text-lg"}`, dangerouslySetInnerHTML: { 3151 __html: course.description 3152 } }),
3153 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 md:grid-cols-4 gap-4", children: [ 3154 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground", children: [ 3155 /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "h-5 w-5 text-primary" }), 3156 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 3157 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Duration" }), 3158 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-foreground", children: course.duration }) 3159 ] }) 3160 ] }), 3161 course.versionsSupported && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground md:col-span-2", children: [ 3162 /* @__PURE__ */ jsxRuntimeExports.jsx(Tag, { className: "h-6 w-6 text-primary shrink-0" }),
3163 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 3164 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Versions" }), 3165 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "font-medium text-foreground prose prose-sm max-w-none prose-p:my-0 prose-p:inline", dangerouslySetInnerHTML: { 3166 __html: course.versionsSupported 3167 } }) 3168 ] }) 3169 ] }), 3170 !course.versionsSupported && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-muted-foreground md:col-span-2", children: [ 3171 /* @__PURE__ */ jsxRuntimeExports.jsx(Tag, { className: "h-6 w-6 text-primary shrink-0" }), 3172 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 3173 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Versions" }), 3174 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-medium text-foreground", children: "N/A" }) 3175 ] }) 3176 ] }),
3177 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center justify-end", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "text-3xl font-bold text-foreground", children: [ 3178 "$", 3179 parseFloat(course.price).toFixed(2) 3180 ] }) }) 3181 ] }) 3182 ] }) 3183 ] }), 3184 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3185 opacity: 0, 3186 y: 10 3187 }, animate: { 3188 opacity: 1, 3189 y: 0 3190 }, transition: { 3191 duration: 0.5, 3192 delay: 0.15 3193 }, className: `mt-8 grid gap-3 ${course.offersPostClassSupport ? "grid-cols-2 md:grid-cols-5" : "grid-cols-2 md:grid-cols-4"}`, children: [ 3194 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center text-center gap-2 p-4 rounded-lg bg-background/70 border border-border shadow-sm", children: [ 3195 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-9 w-9 rounded-full bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Video, { className: "h-4 w-4 text-primary" }) }),
3196 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-semibold text-foreground leading-tight", children: "Live, Instructor-Led Training" }) 3197 ] }), 3198 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center text-center gap-2 p-4 rounded-lg bg-background/70 border border-border shadow-sm", children: [ 3199 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-9 w-9 rounded-full bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(CirclePlay, { className: "h-4 w-4 text-primary" }) }), 3200 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-semibold text-foreground leading-tight", children: "Up to One Year Access to Recorded Course" }) 3201 ] }), 3202 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center text-center gap-2 p-4 rounded-lg bg-background/70 border border-border shadow-sm", children: [ 3203 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-9 w-9 rounded-full bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Wrench, { className: "h-4 w-4 text-primary" }) }),
3204 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-semibold text-foreground leading-tight", children: "Hands-On Exercises" }) 3205 ] }), 3206 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center text-center gap-2 p-4 rounded-lg bg-background/70 border border-border shadow-sm", children: [ 3207 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-9 w-9 rounded-full bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Award, { className: "h-4 w-4 text-primary" }) }), 3208 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-semibold text-foreground leading-tight", children: "Certificate of Completion" }) 3209 ] }), 3210 course.offersPostClassSupport && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center text-center gap-2 p-4 rounded-lg bg-background/70 border border-border shadow-sm", children: [ 3211 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-9 w-9 rounded-full bg-primary/10 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "h-4 w-4 text-primary" }) }),
3212 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-semibold text-foreground leading-tight", children: "Six Months of Post-Class Instructor Support" }) 3213 ] }) 3214 ] }) 3215 ] }) }), 3216 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 py-12", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-8", children: [ 3217 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3218 opacity: 0, 3219 y: 20 3220 }, animate: { 3221 opacity: 1, 3222 y: 0 3223 }, transition: { 3224 duration: 0.5, 3225 delay: 0.2 3226 }, className: "lg:col-span-2 space-y-8", children: [ 3227 course.courseAudience && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 3228 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [
3229 /* @__PURE__ */ jsxRuntimeExports.jsx(Target, { className: "h-5 w-5 text-primary" }), 3230 "Who Should Take This Course" 3231 ] }) }), 3232 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground prose prose-base max-w-none prose-ul:list-disc prose-ul:pl-5 prose-ul:space-y-1 prose-ol:list-decimal prose-ol:pl-5 prose-ol:space-y-1 prose-li:my-1 prose-p:my-2", dangerouslySetInnerHTML: { 3233 __html: course.courseAudience 3234 } }) }) 3235 ] }), 3236 course.courseObjectives && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 3237 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 3238 /* @__PURE__ */ jsxRuntimeExports.jsx(Award, { className: "h-5 w-5 text-primary" }), 3239 "What You'll Learn" 3240 ] }) }), 3241 /* @__P
3241URE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground prose prose-base max-w-none prose-ul:list-disc prose-ul:pl-5 prose-ul:space-y-1 prose-ol:list-decimal prose-ol:pl-5 prose-ol:space-y-1 prose-li:my-1 prose-p:my-2", dangerouslySetInnerHTML: { 3242 __html: course.courseObjectives 3243 } }) }) 3244 ] }), 3245 course.courseSyllabus && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 3246 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 3247 /* @__PURE__ */ jsxRuntimeExports.jsx(BookOpen, { className: "h-5 w-5 text-primary" }), 3248 "Course Content" 3249 ] }) }), 3250 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground prose prose-base max-w-none prose-ul:list-disc prose-ul:pl-5 prose-ul:space-y-1 prose-ol:list-decimal prose-ol:pl-5 prose-ol:space-y-1 prose-li:my-1 prose-p:my-2", dangerouslySetInnerHTML: { 3251 __html: course.courseSyllabus 3252 } }) }) 3253 ] }), 3254 course.prerequisites && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [
3255 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 3256 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "h-5 w-5 text-primary" }), 3257 "Prerequisites" 3258 ] }) }), 3259 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground prose prose-base max-w-none prose-ul:list-disc prose-ul:pl-5 prose-ul:space-y-1 prose-ol:list-decimal prose-ol:pl-5 prose-ol:space-y-1 prose-li:my-1 prose-p:my-2", dangerouslySetInnerHTML: { 3260 __html: course.prerequisites 3261 } }) }) 3262 ] }), 3263 course.whySkillForge && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 3264 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [
3265 /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "h-5 w-5 text-primary" }), 3266 "Why SkillForge for Live Training?" 3267 ] }) }), 3268 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground prose prose-base max-w-none prose-ul:list-disc prose-ul:pl-5 prose-ul:space-y-1 prose-ol:list-decimal prose-ol:pl-5 prose-ol:space-y-1 prose-li:my-1 prose-p:my-2", dangerouslySetInnerHTML: { 3269 __html: course.whySkillForge 3270 } }) }) 3271 ] }), 3272 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 3273 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 3274 /* @__PURE__ */ jsxRuntimeExports.jsx(Award, { className: "h-5 w-5 text-primary" }), 3275 "Certification" 3276 ] }) }), 3277 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: course.certification ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-muted-foreground", children: [
3278 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-2", children: "This course helps prepare students for the following certification exam:" }), 3279 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "prose prose-base max-w-none prose-p:my-2 prose-p:first:mt-0", dangerouslySetInnerHTML: { 3280 __html: course.certification 3281 } }) 3282 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: "This course does not align to a specific exam or certification." }) }) 3283 ] }), 3284 course.faq && /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { children: [ 3285 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 3286 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleHelp, { className: "h-5 w-5 text-primary" }), 3287 "Frequently Asked Questions" 3288 ] }) }), 3289 /* @__P
3289URE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(FaqAccordion, { html: course.faq }) }) 3290 ] }) 3291 ] }), 3292 /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 3293 opacity: 0, 3294 x: 20 3295 }, animate: { 3296 opacity: 1, 3297 x: 0 3298 }, transition: { 3299 duration: 0.5, 3300 delay: 0.3 3301 }, className: "course-print-hide lg:col-span-1", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "sticky top-20 max-h-[calc(100vh-5.5rem)] flex flex-col", children: [ 3302 /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "shadow-lg flex flex-col min-h-0 overflow-hidden", children: [ 3303 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "bg-primary/5 flex-shrink-0", children: [ 3304 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardTitle, { className: "flex items-center gap-2", children: [ 3305 /* @__PURE__ */ jsxRuntimeExports.jsx(Calendar, { className: "h-5 w-5 text-primary" }), 3306 "Available Sessions" 3307 ] }),
3308 /* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { children: "Select a session to enroll" }) 3309 ] }), 3310 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { className: "p-0 flex flex-col min-h-0", children: sessions.length > 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "divide-y overflow-y-auto flex-1 min-h-0", children: sessions.map((sessionData, index) => { 3311 const enrolledCount = sessionData.enrolledCount || 0; 3312 const availableSeats = sessionData.session.maxStudents - enrolledCount; 3313 const isFullyBooked = availableSeats <= 0; 3314 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-4 hover:bg-muted/50 transition-colors", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3", children: [ 3315 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 3316 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground", children: formatSessionDate$1(sessionData.session.startDate, { 3317 weekday: "short", 3318 month: "short", 3319 day: "numeric", 3320 year: "numeric" 3321 }) }), 3322 sessionData.session.startDate !== sessionData.session.endDate && /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-sm text-muted-foreground", children: [ 3323 "to", 3324 " ", 3325 formatSessionDate$1(sessionData.session.endDate, { 3326 weekday: "short", 3327 month: "short", 3328 day: "numeric" 3329 }) 3330 ] }) 3331 ] }),
3332 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start gap-2 text-sm text-muted-foreground", children: [ 3333 /* @__PURE__ */ jsxRuntimeExports.jsx(MapPin, { className: "h-4 w-4 mt-0.5 flex-shrink-0" }), 3334 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: sessionData.session.deliveryMode === "online" ? "Live Online" : sessionData.session.location || "Location TBD" }) 3335 ] }), 3336 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [ 3337 /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "h-4 w-4 flex-shrink-0" }), 3338 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { children: [ 3339 sessionData.session.startTime, 3340 " - ", 3341 sessionData.session.endTime, 3342 " ", 3343 sessionData.session.timezone 3344 ] }) 3345 ] }),
3346 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { className: "w-full", size: "sm", onClick: () => handleAddToCart(sessionData), disabled: addedToCart === sessionData.session.id || isInCart(sessionData.session.id) || isFullyBooked, variant: isFullyBooked ? "outline" : "default", children: isFullyBooked ? "Fully Booked" : addedToCart === sessionData.session.id ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 3347 /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "h-4 w-4 mr-2" }), 3348 "Added!" 3349 ] }) : isInCart(sessionData.session.id) ? "In Cart" : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 3350 /* @__PURE__ */ jsxRuntimeExports.jsx(ShoppingCart, { className: "h-4 w-4 mr-2" }), 3351 "Add to Cart" 3352 ] }) }) 3353 ] }) }, sessionData.session.id); 3354 }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-8 text-center", children: [
3355 /* @__PURE__ */ jsxRuntimeExports.jsx(Calendar, { className: "h-12 w-12 text-muted-foreground mx-auto mb-4" }), 3356 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-2", children: "No sessions currently available" }), 3357 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Check back soon for upcoming dates" }) 3358 ] }) }) 3359 ] }), 3360 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-4 rounded-lg border border-border bg-muted/40 p-4 text-center", children: [ 3361 /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "h-7 w-7 text-primary mx-auto mb-2" }), 3362 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-medium text-foreground mb-1", children: "Training a team?" }), 3363 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground mb-3", children: "Get custom pricing for groups of 5 or more." }),
3364 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "sm", className: "w-full", onClick: () => setGroupModalOpen(true), children: "Request Group Pricing" }) 3365 ] }) 3366 ] }) }) 3367 ] }) }), 3368 /* @__PURE__ */ jsxRuntimeExports.jsx(GroupTrainingModal, { open: groupModalOpen, onOpenChange: setGroupModalOpen, courseTitle: course.title }) 3369 ] }) 3370 ] }); 3371} 3372const differentiators = [{ 3373 icon: BookOpen, 3374 title: "Our Teaching Methodology", 3375 description: 'In all of our classes, we use a "Show, Do, Review" methodology. Instructors demonstrate how to complete a task, students then practice hands-on, and finally we review to ensure everyone understands before moving on.' 3376}, { 3377 icon: Users, 3378 title: "Our Instructors", 3379 description: "Our instructors are the heart of our company. We select only the best trainers â experts with years of hands-on experience and a genuine passion for teaching. That passion is what turns a good class into a truly amazing one." 3380}, { 3381 icon: Headphones, 3382 title: "Our Support", 3383 description: "Learning doesn't stop when class ends. We offer six months of instructor email support for most courses, and one year of access to a recorded video of your class. We're committed to your success after you return to work." 3384}, { 3385 icon: MonitorPlay, 3386 title: "How We Deliver", 3387 description: "We deliver courses in multiple formats: live instructor-led online classes, private group onsite or online sessions, and self-paced eLearning. Whatever works best for you or your team, we have an option." 3388}]; 3389const testimonials$2 = [{ 3390 quote: "I really enjoy the hands-on nature of the courses, without having to travel. The access to the instructors after the class is a great benefit. I always plan for a challenging project after the class to take advantage of their guidance!", 3391 name: "Tracy R.", 3392 company: "Port of Seattle" 3393}, { 3394 quote: "I have been working with the course content for almost 10 years, and was still able to learn something new. Our instructor was clear and concise and kept us on track and on time. Awesome!", 3395 name: "R.V.", 3396 company: "HealthHelp" 3397}, { 3398 quote: "I had no experience with Crystal Reports at the beginning of the week and now I feel comfortable enough to create basic to intermediate reports all on my own. Joel was a wonderful instructor and provided real-life feedback.", 3399 name: "Kim Y.", 3400 company: "Aramco" 3401}]; 3402const clients$1 = ["Fortune 500 Companies", "Government Agencies", "Universities & Colleges", "Healthcare Organizations", "Financial Institutions", "Small & Mid-size Businesses"]; 3403function AboutPage() { 3404 const [hydrated, setHydrated] = reactExports.useState(false); 3405 reactExports.useEffect(() => { 3406 setHydrated(true); 3407 }, []); 3408 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 3409 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
3410 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "About SkillForge | Expert Instructor-Led Training Since 2010" }), 3411 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Learn about SkillForge â a different kind of training company based outside Chicago, delivering expert instructor-led training across North America since 2010." }), 3412 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/about" }), 3413 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 3414 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/about" }), 3415 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "About SkillForge | Expert Instructor-Led Training Since 2010" }), 3416 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "A different kind of training company based outside Chicago, delivering expert instructor-led training across North America since 2010." }),
3417 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 3418 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 3419 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "About SkillForge | Expert Instructor-Led Training Since 2010" }), 3420 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "A different kind of training company based outside Chicago, delivering expert instructor-led training across North America since 2010." }), 3421 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 3422 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 3423 "@context": "https://schema.org", 3424 "@type": "BreadcrumbList", 3425 itemListElement: [{ 3426 "@type": "ListItem", 3427 position: 1, 3428 name: "Home", 3429 item: "https://skillforge.com/" 3430 }, { 3431 "@type": "ListItem", 3432 position: 2, 3433 name: "About", 3434 item: "https://skillforge.com/about" 3435 }] 3436 }) }),
3437 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 3438 "@context": "https://schema.org", 3439 "@type": "AboutPage", 3440 "name": "About SkillForge® | Expert Instructor-Led Training Since 2010", 3441 "description": "A different kind of training company based outside Chicago, delivering expert instructor-led training across North America since 2010.", 3442 "url": "https://skillforge.com/about", 3443 "publisher": { 3444 "@type": "EducationalOrganization", 3445 "name": "SkillForge®", 3446 "url": "https://skillforge.com" 3447 } 3448 }) }) 3449 ] }), 3450 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "relative overflow-hidden border-b border-border", style: { 3451 background: "#f5f6f7" 3452 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative container mx-auto px-6 py-16 md:py-20", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-10 items-center max-w-5xl mx-auto", children: [
3453 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 3454 opacity: 0, 3455 y: 24 3456 } : false, animate: { 3457 opacity: 1, 3458 y: 0 3459 }, transition: { 3460 duration: 0.5, 3461 ease: "easeOut" 3462 }, children: [ 3463 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase mb-4", style: { 3464 color: "#FF7A00" 3465 }, children: "About Us" }), 3466 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl md:text-5xl font-bold mb-6 leading-tight text-foreground", children: "We're a Different Kind of Training Company." }), 3467 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-muted-foreground leading-relaxed", children: "Based just outside of Chicago, SkillForge delivers training to companies, institutions, and individuals across North America. We believe learning requires real interaction â and that students always deserve access to an expert instructor." }) 3468 ] }),
3469 /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: hydrated ? { 3470 opacity: 0, 3471 x: 24 3472 } : false, animate: { 3473 opacity: 1, 3474 x: 0 3475 }, transition: { 3476 duration: 0.55, 3477 ease: "easeOut", 3478 delay: 0.15 3479 }, className: "hidden md:grid grid-cols-2 gap-4", children: [{ 3480 value: "2010", 3481 label: "Founded" 3482 }, { 3483 value: "3,500+", 3484 label: "Courses Delivered" 3485 }, { 3486 value: "10,000+", 3487 label: "Students Trained" 3488 }, { 3489 value: "50+", 3490 label: "Course Topics" 3491 }].map((stat, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl p-6 bg-white flex flex-col justify-center", style: { 3492 border: "1px solid #e5e7eb", 3493 borderTop: `3px solid ${i % 2 === 0 ? "#FF7A00" : "#4A7A8A"}` 3494 }, children: [ 3495 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-3xl font-bold text-foreground", children: stat.value }), 3496 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mt-1", children: stat.label }) 3497 ] }, stat.label)) }) 3498 ] }) }) }), 3499 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-16 items-start max-w-5xl mx-auto", children: [
3500 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3501 opacity: 0, 3502 x: -24 3503 }, whileInView: { 3504 opacity: 1, 3505 x: 0 3506 }, viewport: { 3507 once: true 3508 }, transition: { 3509 duration: 0.5, 3510 ease: "easeOut" 3511 }, children: [ 3512 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase text-primary mb-3", children: "Our Story" }), 3513 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-foreground mb-6", children: "Founded on a Belief That Learning Should Be Interactive" }), 3514 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground leading-relaxed mb-4", children: "You can't ask questions when you're watching a video. That simple truth is at the heart of everything we do. In all of our classes â whether self-paced, online, or in-person â students always have access to an instructor, both during and after class." }),
3515 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground leading-relaxed mb-4", children: "Our instructors are experts in their field with years of hands-on experience and multiple certifications. For them â and for us â training isn't just a job. It's a calling." }), 3516 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground leading-relaxed", children: "SkillForge was founded in 2010 and has since trained thousands of professionals at organizations ranging from small businesses to Fortune 500 companies and government agencies across North America." }) 3517 ] }), 3518 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3519 opacity: 0, 3520 x: 24 3521 }, whileInView: { 3522 opacity: 1, 3523 x: 0 3524 }, viewport: { 3525 once: true 3526 }, transition: { 3527 duration: 0.5, 3528 ease: "easeOut", 3529 delay: 0.1 3530 }, className: "flex flex-col gap-4", children: [ 3531 [{ 3532 icon: Users, 3533 accent: "#FF7A00", 3534 title: "Always a Live Instructor", 3535 description: "Every class is led by a real expert â not a recording. Ask questions, get answers, and learn the way humans learn best." 3536 }, { 3537 icon: Headphones, 3538 accent: "#4A7A8A", 3539 title: "Access to Support After Class", 3540 description: "Have a question after class ends? Reach out to your instructor directly. We don't disappear when the session is over.*" 3541 }, { 3542 icon: BookOpen, 3543 accent: "#FF7A00", 3544 title: "Classes Guaranteed to Run", 3545 description: "When you register, your class runs. We don't cancel on you at the last minute â your time is too valuable for that." 3546 }].map((item, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3547 opacity: 0, 3548 y: 16 3549 }, whileInView: { 3550 opacity: 1, 3551 y: 0 3552 }, viewport: { 3553 once: true 3554 }, transition: { 3555 duration: 0.4, 3556 ease: "easeOut", 3557 delay: 0.15 + i * 0.1 3558 }, className: "flex gap-4 rounded-xl p-5 bg-background", style: { 3559 border: "1px solid #e5e7eb", 3560 borderLeft: `4px solid ${item.accent}` 3561 }, children: [
3562 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-10 h-10 rounded-lg flex items-center justify-center flex-shrink-0 mt-0.5", style: { 3563 background: item.accent === "#FF7A00" ? "rgba(255,122,0,0.08)" : "rgba(74,122,138,0.08)" 3564 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(item.icon, { className: "w-5 h-5", style: { 3565 color: item.accent 3566 } }) }), 3567 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 3568 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-bold text-foreground mb-1", children: item.title }), 3569 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: item.description }) 3570 ] }) 3571 ] }, item.title)), 3572 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground mt-2 pl-1", children: "* Post-class instructor support available for most courses." }) 3573 ] }) 3574 ] }) }) }), 3575 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20", style: { 3576 background: "#f5f9fa" 3577 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6", children: [
3578 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3579 opacity: 0, 3580 y: 20 3581 }, whileInView: { 3582 opacity: 1, 3583 y: 0 3584 }, viewport: { 3585 once: true 3586 }, transition: { 3587 duration: 0.5, 3588 ease: "easeOut" 3589 }, className: "text-center max-w-2xl mx-auto mb-14", children: [ 3590 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase text-primary mb-3", children: "What Sets Us Apart" }), 3591 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-foreground", children: "The SkillForge Difference" }) 3592 ] }), 3593 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid md:grid-cols-2 gap-8 max-w-5xl mx-auto", children: differentiators.map((item, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3594 opacity: 0, 3595 y: 20 3596 }, whileInView: { 3597 opacity: 1, 3598 y: 0 3599 }, viewport: { 3600 once: true 3601 }, transition: { 3602 duration: 0.4, 3603 ease: "easeOut", 3604 delay: i * 0.08 3605 }, className: "bg-background rounded-xl p-8 border border-border", children: [
3606 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-12 h-12 rounded-lg flex items-center justify-center mb-5", style: { 3607 background: "rgba(255,122,0,0.1)" 3608 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(item.icon, { className: "w-6 h-6", style: { 3609 color: "#FF7A00" 3610 } }) }), 3611 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-bold text-foreground mb-3", children: item.title }), 3612 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground leading-relaxed", children: item.description }) 3613 ] }, item.title)) }) 3614 ] }) }), 3615 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6", children: [ 3616 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3617 opacity: 0, 3618 y: 20 3619 }, whileInView: { 3620 opacity: 1, 3621 y: 0 3622 }, viewport: { 3623 once: true 3624 }, transition: { 3625 duration: 0.5, 3626 ease: "easeOut" 3627 }, className: "text-center max-w-2xl mx-auto mb-14", children: [
3628 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase mb-3 text-muted-foreground", children: "Student Reviews" }), 3629 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-foreground", children: "What Our Students Say" }) 3630 ] }), 3631 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid md:grid-cols-3 gap-8 max-w-5xl mx-auto", children: testimonials$2.map((t, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3632 opacity: 0, 3633 y: 20 3634 }, whileInView: { 3635 opacity: 1, 3636 y: 0 3637 }, viewport: { 3638 once: true 3639 }, transition: { 3640 duration: 0.4, 3641 ease: "easeOut", 3642 delay: i * 0.1 3643 }, className: "rounded-xl p-8 bg-background", style: { 3644 border: "1px solid #e5e7eb", 3645 background: "#f9fafb" 3646 }, children: [ 3647 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-0.5 mb-4", children: [...Array(5)].map((_, s) => /* @__PURE__ */ jsxRuntimeExports.jsx(Star, { className: "w-4 h-4", style: { 3648 fill: "#F5A623", 3649 color: "#F5A623" 3650 } }, s)) }),
3651 /* @__PURE__ */ jsxRuntimeExports.jsx(Quote, { className: "w-7 h-7 mb-4 text-muted-foreground opacity-40" }), 3652 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground leading-relaxed mb-6 text-sm", children: t.quote }), 3653 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pt-4 border-t border-border", children: [ 3654 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground", children: t.name }), 3655 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: t.company }) 3656 ] }) 3657 ] }, t.name)) }), 3658 /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 3659 opacity: 0, 3660 y: 16 3661 }, whileInView: { 3662 opacity: 1, 3663 y: 0 3664 }, viewport: { 3665 once: true 3666 }, transition: { 3667 duration: 0.4, 3668 ease: "easeOut", 3669 delay: 0.3 3670 }, className: "text-center mt-12", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "gap-2 font-semibold", style: { 3671 background: "#4A7A8A", 3672 color: "white", 3673 border: "none" 3674 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/about/testimonials", children: [ 3675 "View All Reviews ",
3676 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-4 h-4" }) 3677 ] }) }) }) 3678 ] }) }), 3679 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6", children: [ 3680 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3681 opacity: 0, 3682 y: 20 3683 }, whileInView: { 3684 opacity: 1, 3685 y: 0 3686 }, viewport: { 3687 once: true 3688 }, transition: { 3689 duration: 0.5, 3690 ease: "easeOut" 3691 }, className: "text-center max-w-2xl mx-auto mb-12", children: [ 3692 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase text-primary mb-3", children: "Trusted By" }), 3693 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-foreground", children: "Organizations Across North America" }), 3694 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mt-4", children: "From small businesses to government agencies and Fortune 500 companies, thousands of organizations have trusted SkillForge to train their staff." }),
3695 /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/clients", className: "inline-flex items-center gap-1.5 text-sm font-semibold mt-4 hover:underline", style: { 3696 color: "#FF7A00" 3697 }, children: [ 3698 "View Our Clients ", 3699 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-4 h-4" }) 3700 ] }) 3701 ] }), 3702 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 gap-4 max-w-3xl mx-auto", children: clients$1.map((client, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 3703 opacity: 0, 3704 scale: 0.95 3705 }, whileInView: { 3706 opacity: 1, 3707 scale: 1 3708 }, viewport: { 3709 once: true 3710 }, transition: { 3711 duration: 0.3, 3712 ease: "easeOut", 3713 delay: i * 0.06 3714 }, className: "rounded-lg px-5 py-4 text-center text-sm font-medium", style: { 3715 background: "#f5f9fa", 3716 border: "1px solid #d0e4ea", 3717 color: "#4A7A8A" 3718 }, children: client }, client)) }) 3719 ] }) }), 3720 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20", style: { 3721 background: "#FF7A00" 3722 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3723 opacity: 0, 3724 y: 20 3725 }, whileInView: { 3726 opacity: 1, 3727 y: 0 3728 }, viewport: { 3729 once: true 3730 }, transition: { 3731 duration: 0.5, 3732 ease: "easeOut" 3733 }, className: "max-w-2xl mx-auto", children: [
3734 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-white mb-4", children: "Ready to Experience the Difference?" }), 3735 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-white/80 mb-8 text-lg", children: "Browse our full course catalog and find the right training for you or your team." }), 3736 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "gap-2 font-semibold", style: { 3737 background: "white", 3738 color: "#FF7A00" 3739 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses", children: [ 3740 "View Our Courses ", 3741 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-4 h-4" }) 3742 ] }) }) 3743 ] }) }) }) 3744 ] }); 3745} 3746const testimonials$1 = [{ 3747 title: "Thank You!", 3748 quote: "Donna was an excellent instructor! It was easy to follow along with her and the book. I highly recommend SkillForge for all your training needs!", 3749 name: "Diana S.", 3750 company: "U.S. Foods" 3751}, { 3752 title: "Great Trainer", 3753 quote: "Great trainer. She answered all my questions and went above and beyond by showing me a few extra things.", 3754 name: "Mike L.", 3755 company: "Journeys" 3756}, { 3757 title: "Love the Course", 3758 quote: "Dan (my teacher) was a great teacher. It was an online class and he was able to keep me interested in the topic the entire day for 2 days. The course material was very easy and clear. I was able to do the labs without any trouble. I will recommend my manager to use this training company and teacher.", 3759 name: "Uyen Q.", 3760 company: "San Diego County" 3761}, { 3762 title: "Excellent Instructor!", 3763 quote: "Aletha was an excellent instructor! Very knowledgeable. The training was interactive and I had plenty of opportunity to ask questions. She checked in with me often to make sure I understood the material. This was my first time taking an online class. I would recommend SkillForge to anyone considering a live instructor-led online class.", 3764 name: "Scott H.", 3765 company: "Washington County" 3766}, { 3767 title: "Positive Experience", 3768 quote: "This is my first experience taking an online/instructor-led class. I was a little hesitant at first but it was a very positive experience! My instructor was very easy to talk to, was a great listener and was very knowledgeable. I tend to ask a lot of questions, and he was very patient. I will not hesitate to take an online instructor-led class in the future!", 3769 name: "Julie R.", 3770 company: "Ultraflote" 3771}, { 3772 title: "Absolutely Fantastic!", 3773 quote: "Jennifer was absolutely fantastic! She delivered several hours of one-on-one training that significantly enhanced my understanding of how to leverage PowerPivot functionality within Microsoft Excel. She was a consummate professional, and I would highly recommend her to anyone interested in this course or any of the others she delivers.", 3774 name: "Jim M.", 3775 company: "Bill and Melinda Gates Foundation" 3776}, { 3777 title: "Excellent Learning Experience", 3778 quote: "This was an excellent learning experience. I started the class with some knowledge of the content, so the pace worked very well for me.", 3779 name: "Debbie M.", 3780 company: "Pharmacists Mutual Insurance" 3781}, { 3782 title: "Awesome Trainer", 3783 quote: "I really enjoyed the MS Access class. It was very informative and very easy to understand. It was great that it was a live instructor and Seth was able to answer questions on the spot. Seth was an awesome trainer and I would highly recommend him!", 3784 name: "Denise M.", 3785 company: "Fossil" 3786}, { 3787 title: "Absolutely Amazing", 3788 quote: "Andrew (our instructor) was ABSOLUTELY AMAZING â he met our needs and was very good at showing everything we needed to know about MS Project. I would absolutely recommend him to everyone! Thanks to him, I will be recommending your company to ours, and will be using him for Excel training.", 3789 name: "Eva B.", 3790 company: "Lam Research" 3791}, { 3792 title: "Expectations Exceeded", 3793 quote: "My expectations were definitely exceeded for this course. I had a bias towards courses with onsite instructors but the flexibility of the online classroom meant that this course was really just as good as any conventionally taught course. Donna was very professional, knowledgeable, and helpful.", 3794 name: "Michael B.", 3795 company: "Fitchburg State University" 3796}, { 3797 title: "Enjoyed the Class", 3798 quote: "Enjoyed the class. Rodney was accommodating, yet stayed on task. Gave plenty of time to ask questions to any level of detail we wanted.", 3799 name: "David C.", 3800 company: "Siemens Energy" 3801}, { 3802 title: "Very Much Enjoyed", 3803 quote: "I very much enjoyed this Crystal Reports class. Seth did a great job of trying to make it fun and interesting. He covered the lessons thoroughly, at a good pace â not too fast or slow. He was happy to answer all my questions. I am recommending this type of training to anyone who asks!", 3804 name: "Nicole B.", 3805 company: "City of Windsor" 3806}]; 3807function TestimonialsPage() { 3808 const [hydrated, setHydrated] = reactExports.useState(false); 3809 reactExports.useEffect(() => { 3810 setHydrated(true); 3811 }, []); 3812 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
3813 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [ 3814 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Student Reviews & Testimonials | SkillForge" }), 3815 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "See what SkillForge students say about their training experience. Real reviews from professionals at organizations across North America." }), 3816 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/about/testimonials" }), 3817 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 3818 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/about/testimonials" }), 3819 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Student Reviews & Testimonials | SkillForge" }), 3820 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "See what SkillForge students say about their training experience. Real reviews from professionals at organizations across North America." }),
3821 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 3822 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 3823 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Student Reviews & Testimonials | SkillForge" }), 3824 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "See what SkillForge students say about their training experience. Real reviews from professionals at organizations across North America." }), 3825 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 3826 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 3827 "@context": "https://schema.org", 3828 "@type": "BreadcrumbList", 3829 itemListElement: [{ 3830 "@type": "ListItem", 3831 position: 1, 3832 name: "Home", 3833 item: "https://skillforge.com/" 3834 }, { 3835 "@type": "ListItem", 3836 position: 2, 3837 name: "About", 3838 item: "https://skillforge.com/about" 3839 }, { 3840 "@type": "ListItem", 3841 position: 3, 3842 name: "Testimonials", 3843 item: "https://skillforge.com/about/testimonials" 3844 }] 3845 }) }),
3846 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 3847 "@context": "https://schema.org", 3848 "@type": "WebPage", 3849 "name": "Student Reviews & Testimonials | SkillForge", 3850 "description": "See what SkillForge students say about their training experience. Real reviews from professionals at organizations across North America.", 3851 "url": "https://skillforge.com/about/testimonials", 3852 "publisher": { 3853 "@type": "EducationalOrganization", 3854 "name": "SkillForge", 3855 "url": "https://skillforge.com" 3856 } 3857 }) }) 3858 ] }), 3859 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "relative overflow-hidden border-b border-border", style: { 3860 background: "#f5f6f7" 3861 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative container mx-auto px-6 py-16 md:py-20", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-10 items-center max-w-5xl mx-auto", children: [
3862 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: hydrated ? { 3863 opacity: 0, 3864 y: 24 3865 } : false, animate: { 3866 opacity: 1, 3867 y: 0 3868 }, transition: { 3869 duration: 0.5, 3870 ease: "easeOut" 3871 }, children: [ 3872 /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "flex items-center gap-2 text-sm mb-5 text-muted-foreground", children: [ 3873 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/about", className: "hover:text-foreground transition-colors", children: "About" }), 3874 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "/" }), 3875 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-foreground", children: "Student Reviews" }) 3876 ] }), 3877 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase mb-4", style: { 3878 color: "#FF7A00" 3879 }, children: "Student Reviews" }), 3880 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl md:text-5xl font-bold mb-6 leading-tight text-foreground", children: "What Our Students Say" }),
3881 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-muted-foreground leading-relaxed mb-6", children: "You don't have to take our word for it. See what students say about their experience in a SkillForge class â from Fortune 500 employees to government professionals." }), 3882 /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: "https://www.google.com/search?q=SkillForge&stick=H4sIAAAAAAAA_-NgU1I1qLCwMEhLNDVINko0T0oxMje0MqhINjU3TkoxNkkyTzVLNrY0WcTKFZydmZPjll-UngoAQlFfUDYAAAA&hl=en&mat=CX6ApG7g3nsyElcBTVDHnjKjn8M20qcHgbVbYo-MR5WGKCUeJo7OeT2ZT5ZScPhypgWCSiyy1W09XuN5G41BPZAFqPwJXXNJNKqs1GI-RG1PfPewNInvu0C1WUftiiBH_KM&authuser=1&ved=2ahUKEwii3vbihpSUAxUkPt4AHZUMM_sQ-MgIegQIFhAi#", target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-3 rounded-xl px-5 py-3 transition-shadow hover:shadow-md", style: { 3883 background: "white", 3884 border: "1px solid #e5e7eb" 3885 }, children: [ 3886 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-0.5", children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Star, { className: "w-4 h-4", style: { 3887 fill: "#F5A623", 3888 color: "#F5A623" 3889 } }, i)) }),
3890 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm font-semibold text-foreground", children: "5 of 5 stars on Google" }) 3891 ] }) 3892 ] }), 3893 /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: hydrated ? { 3894 opacity: 0, 3895 x: 24 3896 } : false, animate: { 3897 opacity: 1, 3898 x: 0 3899 }, transition: { 3900 duration: 0.55, 3901 ease: "easeOut", 3902 delay: 0.15 3903 }, className: "hidden md:block", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-2xl p-8 bg-white", style: { 3904 border: "1px solid #e5e7eb", 3905 borderLeft: "4px solid #4A7A8A" 3906 }, children: [ 3907 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-0.5 mb-5", children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Star, { className: "w-4 h-4", style: { 3908 fill: "#F5A623", 3909 color: "#F5A623" 3910 } }, i)) }), 3911 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-foreground leading-relaxed mb-6 italic", children: '"Jennifer was absolutely fantastic! She delivered several hours of one-on-one training that significantly enhanced my understanding of how to leverage PowerPivot functionality within Microsoft Excel."' }),
3912 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "pt-5", style: { 3913 borderTop: "1px solid #e5e7eb" 3914 }, children: [ 3915 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-bold text-foreground", children: "Jim M." }), 3916 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mt-0.5", children: "Bill and Melinda Gates Foundation" }) 3917 ] }) 3918 ] }) }) 3919 ] }) }) }), 3920 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "columns-1 md:columns-2 lg:columns-3 gap-6 max-w-6xl mx-auto", children: testimonials$1.map((t, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3921 opacity: 0, 3922 y: 20 3923 }, whileInView: { 3924 opacity: 1, 3925 y: 0 3926 }, viewport: { 3927 once: true 3928 }, transition: { 3929 duration: 0.4, 3930 ease: "easeOut", 3931 delay: i % 3 * 0.08 3932 }, className: "break-inside-avoid mb-6 bg-background rounded-xl flex flex-col", style: { 3933 border: "1px solid #d0e4ea" 3934 }, children: [
3935 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-1 rounded-t-xl", style: { 3936 background: "linear-gradient(90deg, #FF7A00, #ffb366)" 3937 } }), 3938 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-7 flex flex-col flex-1", children: [ 3939 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-0.5 mb-4", children: [...Array(5)].map((_, s) => /* @__PURE__ */ jsxRuntimeExports.jsx(Star, { className: "w-4 h-4", style: { 3940 fill: "#FF7A00", 3941 color: "#FF7A00" 3942 } }, s)) }), 3943 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-bold text-foreground text-base mb-3", children: t.title }), 3944 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative flex-1", children: [ 3945 /* @__PURE__ */ jsxRuntimeExports.jsx(Quote, { className: "absolute -top-1 -left-1 w-6 h-6", style: { 3946 color: "rgba(74,122,138,0.25)" 3947 } }), 3948 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground text-sm leading-relaxed pl-4", children: t.quote }) 3949 ] }),
3950 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-5 pt-4", style: { 3951 borderTop: "1px solid #d0e4ea" 3952 }, children: [ 3953 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground text-sm", children: t.name }), 3954 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs mt-0.5", style: { 3955 color: "#4A7A8A" 3956 }, children: t.company }) 3957 ] }) 3958 ] }) 3959 ] }, t.name)) }) }) }), 3960 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20", style: { 3961 background: "#FF7A00" 3962 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 3963 opacity: 0, 3964 y: 20 3965 }, whileInView: { 3966 opacity: 1, 3967 y: 0 3968 }, viewport: { 3969 once: true 3970 }, transition: { 3971 duration: 0.5, 3972 ease: "easeOut" 3973 }, className: "max-w-2xl mx-auto", children: [ 3974 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-white mb-4", children: "Ready to Have Your Own Amazing Learning Experience?" }),
3975 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-white/80 mb-8 text-lg", children: "Browse our full course catalog and find the right training for you or your team." }), 3976 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "gap-2 font-semibold", style: { 3977 background: "white", 3978 color: "#FF7A00" 3979 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses", children: [ 3980 "View Our Courses ", 3981 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-4 h-4" }) 3982 ] }) }) 3983 ] }) }) }) 3984 ] }); 3985} 3986const clients = ["Accenture", "ADP", "American Express", "Army Corps of Engineers", "Blinds.com", "Bob Evans Farms", "Booz Allen Hamilton", "Capital Crossing Servicing Company", "Cigna", "Cisco Systems, Inc.", "CME Group", "ConAgra Foods, Inc.", "Department of Labor", "Department of Veterans Affairs", "Devry", "Discover Financial Services", "Equifax", "Excellus", "Fannie Mae", "Federal Aviation Administration", "Federal Reserve Bank of St. Louis", "GE Water and Process Technologies", "General Services Administration (GSA)", "Hunter Douglas", "Indiana University Health", "Integra", "Kaiser Permanente", "Matrix Health", "McGladrey", "Newberry College", "Northern Arizona Healthcare", "Nuclear Energy Institute", "Office of Naval Intelligence", "Office of the Attorney General", "Parker Hannifin", "PayPal", "Pearson Education", "Purdue University", "Seagate Technology LLC", "State of Alaska", "Sysmex", "T-Mobile", "Teachers Retirement Association", "The Salk Institute for Biological Studies", "Thomson Reuters", "United Actuarial Services", "United Health", "US Department of Education, Federal Student Aid", "Verizon", "Wellpoint", "Wells Fargo", "Whole Foods Market", "YMCA Youth & Family Services", "Zions Bancorporation"]; 3987function ClientsPage() { 3988 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [ 3989 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
3990 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Our Clients | SkillForge Training" }), 3991 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "SkillForge has trained professionals at organizations ranging from Fortune 500 companies to government agencies across North America." }), 3992 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/clients" }), 3993 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 3994 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/clients" }), 3995 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Our Clients | SkillForge Training" }), 3996 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "SkillForge has trained professionals at organizations ranging from Fortune 500 companies to government agencies across North America." }), 3997 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }),
3998 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 3999 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Our Clients | SkillForge Training" }), 4000 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "SkillForge has trained professionals at organizations ranging from Fortune 500 companies to government agencies across North America." }), 4001 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 4002 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 4003 "@context": "https://schema.org", 4004 "@type": "BreadcrumbList", 4005 itemListElement: [{ 4006 "@type": "ListItem", 4007 position: 1, 4008 name: "Home", 4009 item: "https://skillforge.com/" 4010 }, { 4011 "@type": "ListItem", 4012 position: 2, 4013 name: "Our Clients", 4014 item: "https://skillforge.com/clients" 4015 }] 4016 }) }),
4017 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 4018 "@context": "https://schema.org", 4019 "@type": "WebPage", 4020 "name": "Our Clients | SkillForge Training", 4021 "description": "SkillForge has trained professionals at organizations ranging from Fortune 500 companies to government agencies across North America.", 4022 "url": "https://skillforge.com/clients", 4023 "publisher": { 4024 "@type": "EducationalOrganization", 4025 "name": "SkillForge", 4026 "url": "https://skillforge.com" 4027 } 4028 }) }) 4029 ] }), 4030 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "border-b border-border", style: { 4031 background: "#f5f6f7" 4032 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 py-16 md:py-20", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-10 items-center max-w-5xl mx-auto", children: [ 4033 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 4034 opacity: 0, 4035 y: 24 4036 }, animate: { 4037 opacity: 1, 4038 y: 0 4039 }, transition: { 4040 duration: 0.5, 4041 ease: "easeOut" 4042 }, children: [
4043 /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "flex items-center gap-2 text-sm mb-5 text-muted-foreground", children: [ 4044 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/about", className: "hover:text-foreground transition-colors", children: "About" }), 4045 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: "/" }), 4046 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-foreground", children: "Our Clients" }) 4047 ] }), 4048 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase mb-4", style: { 4049 color: "#FF7A00" 4050 }, children: "Our Clients" }), 4051 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl md:text-5xl font-bold mb-6 leading-tight text-foreground", children: "Trusted by Organizations Across North America" }), 4052 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-muted-foreground leading-relaxed", children: "From small businesses to Fortune 500 companies and government agencies, thousands of organizations have trusted SkillForge to train their staff." }) 4053 ] }),
4054 /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 4055 opacity: 0, 4056 x: 24 4057 }, animate: { 4058 opacity: 1, 4059 x: 0 4060 }, transition: { 4061 duration: 0.55, 4062 ease: "easeOut", 4063 delay: 0.15 4064 }, className: "hidden md:grid grid-cols-2 gap-4", children: [{ 4065 value: "3,500+", 4066 label: "Courses Delivered" 4067 }, { 4068 value: "10,000+", 4069 label: "Students Trained" 4070 }, { 4071 value: "50+", 4072 label: "Course Topics" 4073 }, { 4074 value: "2010", 4075 label: "Founded" 4076 }].map((stat, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl p-6 bg-white flex flex-col justify-center", style: { 4077 border: "1px solid #e5e7eb", 4078 borderTop: `3px solid ${i % 2 === 0 ? "#FF7A00" : "#4A7A8A"}` 4079 }, children: [ 4080 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-3xl font-bold text-foreground", children: stat.value }), 4081 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mt-1", children: stat.label }) 4082 ] }, stat.label)) }) 4083 ] }) }) }), 4084 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-5xl mx-auto", children: [
4085 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 4086 opacity: 0, 4087 y: 20 4088 }, whileInView: { 4089 opacity: 1, 4090 y: 0 4091 }, viewport: { 4092 once: true 4093 }, transition: { 4094 duration: 0.5 4095 }, className: "mb-10", children: [ 4096 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-foreground", children: "Organizations We've Trained" }), 4097 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mt-2", children: "A partial list of organizations whose employees have attended SkillForge training." }) 4098 ] }), 4099 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-3", children: clients.map((client, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 4100 opacity: 0, 4101 y: 12 4102 }, whileInView: { 4103 opacity: 1, 4104 y: 0 4105 }, viewport: { 4106 once: true 4107 }, transition: { 4108 duration: 0.3, 4109 ease: "easeOut", 4110 delay: Math.min(i * 0.02, 0.4) 4111 }, className: "rounded-lg px-5 py-3 text-sm font-medium text-foreground", style: { 4112 background: "#f9fafb", 4113 border: "1px solid #e5e7eb", 4114 borderLeft: "3px solid #4A7A8A" 4115 }, children: client }, client)) }) 4116 ] }) }) }), 4117 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20", style: { 4118 background: "#FF7A00" 4119 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 text-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 4120 opacity: 0, 4121 y: 20 4122 }, whileInView: { 4123 opacity: 1, 4124 y: 0 4125 }, viewport: { 4126 once: true 4127 }, transition: { 4128 duration: 0.5 4129 }, className: "max-w-2xl mx-auto", children: [
4130 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-white mb-4", children: "Ready to Join Them?" }), 4131 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-white/80 mb-8 text-lg", children: "Browse our full course catalog and find the right training for your team." }), 4132 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "gap-2 font-semibold text-base", style: { 4133 background: "white", 4134 color: "#FF7A00", 4135 border: "none" 4136 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses", children: [ 4137 "Explore Courses ", 4138 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-4 h-4" }) 4139 ] }) }) 4140 ] }) }) }) 4141 ] }); 4142} 4143function useDebounce(value, delay) { 4144 const [debounced, setDebounced] = reactExports.useState(value); 4145 reactExports.useEffect(() => { 4146 const t = setTimeout(() => setDebounced(value), delay); 4147 return () => clearTimeout(t); 4148 }, [value, delay]); 4149 return debounced; 4150} 4151function BlogPage() { 4152 const loaderData = useLoaderData(); 4153 const loaderHasPosts = loaderData != null && loaderData.posts.length > 0; 4154 const [data2, setData] = reactExports.useState(loaderHasPosts ? loaderData : null); 4155 const [loading, setLoading] = reactExports.useState(!loaderHasPosts); 4156 const [error, setError] = reactExports.useState(null); 4157 const [page, setPage] = reactExports.useState(1); 4158 const [searchInput, setSearchInput] = reactExports.useState(""); 4159 const searchRef = reactExports.useRef(null); 4160 const debouncedSearch = useDebounce(searchInput, 400); 4161 reactExports.useEffect(() => { 4162 setPage(1); 4163 }, [debouncedSearch]); 4164 const seededFromLoader = reactExports.useRef(loaderHasPosts); 4165 reactExports.useEffect(() => { 4166 if (seededFromLoader.current && page === 1 && !debouncedSearch) { 4167 seededFromLoader.current = false; 4168 return; 4169 } 4170 seededFromLoader.current = false; 4171 setLoading(true); 4172 setError(null); 4173 const params = new URLSearchParams({ 4174 page: String(page), 4175 per_page: "12" 4176 }); 4177 if (debouncedSearch) params.set("search", debouncedSearch); 4178 fetch(`/api/blog?${params}`).then((r) => r.json()).then((d) => { 4179 setData(d); 4180 setLoading(false); 4181 }).catch(() => { 4182 setError("Could not load posts. Please try again."); 4183 setLoading(false); 4184 }); 4185 }, [page, debouncedSearch]); 4186 const handlePageChange = (newPage) => { 4187 setPage(newPage); 4188 window.scrollTo({ 4189 top: 0, 4190 behavior: "smooth" 4191 }); 4192 }; 4193 const clearFilters = () => { 4194 var _a2; 4195 setSearchInput(""); 4196 (_a2 = searchRef.current) == null ? void 0 : _a2.focus(); 4197 }; 4198 const hasActiveFilters = !!searchInput; 4199 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [ 4200 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
4201 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Blog & Tutorials | SkillForge" }), 4202 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Free software training tips, tutorials, and how-to guides from the SkillForge instructor team." }), 4203 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/skillforge-blog" }), 4204 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 4205 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/skillforge-blog" }), 4206 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Blog & Tutorials | SkillForge" }), 4207 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Free software training tips, tutorials, and how-to guides from the SkillForge instructor team." }), 4208 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }),
4209 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 4210 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Blog & Tutorials | SkillForge" }), 4211 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "Free software training tips, tutorials, and how-to guides from the SkillForge instructor team." }), 4212 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 4213 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 4214 "@context": "https://schema.org", 4215 "@type": "Blog", 4216 "@id": "https://skillforge.com/skillforge-blog#blog", 4217 name: "SkillForge Blog & Tutorials", 4218 description: "Free software training tips, tutorials, and how-to guides from the SkillForge instructor team.", 4219 url: "https://skillforge.com/skillforge-blog", 4220 publisher: { 4221 "@type": "EducationalOrganization", 4222 "@id": "https://skillforge.com/#organization", 4223 name: "SkillForge", 4224 url: "https://skillforge.com" 4225 }, 4226 isPartOf: { 4227 "@id": "https://skillforge.com/#website" 4228 } 4229 }) }),
4230 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 4231 "@context": "https://schema.org", 4232 "@type": "BreadcrumbList", 4233 itemListElement: [{ 4234 "@type": "ListItem", 4235 position: 1, 4236 name: "Home", 4237 item: "https://skillforge.com/" 4238 }, { 4239 "@type": "ListItem", 4240 position: 2, 4241 name: "Blog & Tutorials", 4242 item: "https://skillforge.com/skillforge-blog" 4243 }] 4244 }) }) 4245 ] }), 4246 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "border-b border-border", style: { 4247 background: "#f5f6f7" 4248 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 py-14 md:py-18 max-w-5xl", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 4249 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold tracking-widest uppercase mb-3", style: { 4250 color: "#FF7A00" 4251 }, children: "Blog & Tutorials" }),
4252 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl md:text-5xl font-bold mb-4 leading-tight text-foreground", children: "Free Tips & Tutorials" }), 4253 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-muted-foreground max-w-2xl mb-8", children: "Short how-to guides and video tutorials from our instructor team â covering Microsoft Office, Power BI, Crystal Reports, and more." }), 4254 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative max-w-lg", children: [ 4255 /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-muted-foreground pointer-events-none" }), 4256 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { ref: searchRef, type: "text", placeholder: "Search tutorials...", value: searchInput, onChange: (e) => setSearchInput(e.target.value), className: "pl-9 pr-9 bg-background h-11 text-base" }), 4257 searchInput && /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => setSearchInput(""), className: "absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors", "aria-label": "Clear search", children: /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-4 h-4" }) }) 4258 ] }) 4259 ] }) }) }), 4260 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-10 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6 max-w-5xl", children: [ 4261 hasActiveFilters && !loading && data2 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-6", children: [
4262 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: data2.total === 0 ? "No posts found" : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 4263 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground", children: data2.total }), 4264 " post", 4265 data2.total !== 1 ? "s" : "", 4266 " found", 4267 debouncedSearch && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 4268 " matching ", 4269 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "font-medium text-foreground", children: [ 4270 '"', 4271 debouncedSearch, 4272 '"' 4273 ] }) 4274 ] }) 4275 ] }) }), 4276 /* @__PURE__ */ jsxRuntimeExports.jsxs("button", { onClick: clearFilters, className: "text-sm flex items-center gap-1 hover:underline", style: { 4277 color: "#FF7A00" 4278 }, children: [ 4279 /* @__PURE__ */ jsxRuntimeExports.jsx(X, { className: "w-3 h-3" }), 4280 " Clear filters" 4281 ] }) 4282 ] }), 4283 loading && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid md:grid-cols-3 gap-6", children: [...Array(12)].map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl overflow-hidden animate-pulse", style: { 4284 border: "1px solid #e5e7eb" 4285 }, children: [
4286 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-44 bg-muted" }), 4287 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5", children: [ 4288 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-3 bg-muted rounded w-1/3 mb-3" }), 4289 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-4 bg-muted rounded w-full mb-2" }), 4290 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-4 bg-muted rounded w-3/4 mb-4" }), 4291 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-3 bg-muted rounded w-1/2" }) 4292 ] }) 4293 ] }, i)) }), 4294 error && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center py-20", children: [ 4295 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: error }), 4296 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { className: "mt-4", onClick: () => setPage(1), children: "Try Again" }) 4297 ] }), 4298 !loading && !error && data2 && data2.posts.length === 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center py-24", children: [
4299 /* @__PURE__ */ jsxRuntimeExports.jsx(Search, { className: "w-10 h-10 mx-auto mb-4 text-muted-foreground opacity-40" }), 4300 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-medium text-foreground mb-1", children: "No posts found" }), 4301 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mb-6", children: "Try a different search term or browse all categories." }), 4302 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", onClick: clearFilters, children: "Clear filters" }) 4303 ] }), 4304 data2 && !loading && data2.posts.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 4305 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid md:grid-cols-3 gap-6", children: data2.posts.map((post, i) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: `/skillforge-blog/${post.slug.replace(/^\/*(skillforge-blog\/)?/, "")}`, className: "group rounded-xl overflow-hidden flex flex-col bg-background hover:shadow-md transition-shadow duration-200 h-full", style: { 4306 border: "1px solid #e5e7eb", 4307 display: "flex" 4308 }, children: [
4309 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "overflow-hidden bg-muted flex-shrink-0", style: { 4310 aspectRatio: "16/9" 4311 }, children: post.featuredImage ? /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: post.featuredImage, alt: post.title, className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300", width: 400, height: 225, loading: "lazy", decoding: "async" }) : /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "w-full h-full flex items-center justify-center", style: { 4312 background: "#f5f9fa" 4313 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-3xl font-bold", style: { 4314 color: "#d0e4ea" 4315 }, children: "SF" }) }) }), 4316 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 flex flex-col flex-1", children: [ 4317 post.categories[0] && /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-xs font-semibold uppercase tracking-wide mb-2 inline-block", style: { 4318 color: "#4A7A8A" 4319 }, children: post.categories[0].name }),
4320 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "font-bold text-foreground leading-snug mb-2 group-hover:text-primary transition-colors line-clamp-2", children: post.title }), 4321 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed mb-4 line-clamp-3 flex-1", children: post.excerpt }), 4322 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center text-xs text-muted-foreground pt-3", style: { 4323 borderTop: "1px solid #e5e7eb" 4324 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1", children: [ 4325 /* @__PURE__ */ jsxRuntimeExports.jsx(Calendar, { className: "w-3 h-3" }), 4326 post.date ? format(new Date(post.date), "MMM d, yyyy") : "Unknown date" 4327 ] }) }) 4328 ] }) 4329 ] }) }, post.id)) }), 4330 data2.totalPages > 1 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-center gap-3 mt-12", children: [
4331 /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "sm", onClick: () => handlePageChange(page - 1), disabled: page <= 1, className: "gap-1", children: [ 4332 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronLeft, { className: "w-4 h-4" }), 4333 " Previous" 4334 ] }), 4335 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-1", children: Array.from({ 4336 length: Math.min(data2.totalPages, 7) 4337 }, (_, i) => { 4338 let pageNum; 4339 if (data2.totalPages <= 7) { 4340 pageNum = i + 1; 4341 } else if (page <= 4) { 4342 pageNum = i + 1; 4343 } else if (page >= data2.totalPages - 3) { 4344 pageNum = data2.totalPages - 6 + i; 4345 } else { 4346 pageNum = page - 3 + i; 4347 } 4348 return /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => handlePageChange(pageNum), className: `w-8 h-8 rounded text-sm font-medium transition-colors ${pageNum === page ? "text-white" : "text-muted-foreground hover:bg-muted"}`, style: pageNum === page ? { 4349 background: "#4A7A8A" 4350 } : {}, children: pageNum }, pageNum); 4351 }) }),
4352 /* @__PURE__ */ jsxRuntimeExports.jsxs(Button, { variant: "outline", size: "sm", onClick: () => handlePageChange(page + 1), disabled: page >= data2.totalPages, className: "gap-1", children: [ 4353 "Next ", 4354 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "w-4 h-4" }) 4355 ] }) 4356 ] }), 4357 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-center text-sm text-muted-foreground mt-6", children: [ 4358 "Showing ", 4359 data2.posts.length, 4360 " of ", 4361 data2.total, 4362 " posts" 4363 ] }) 4364 ] }) 4365 ] }) }) 4366 ] }); 4367} 4368function RelatedCoursesCTA({ 4369 slug 4370}) { 4371 const [courses, setCourses] = reactExports.useState([]); 4372 const [loaded, setLoaded] = reactExports.useState(false); 4373 reactExports.useEffect(() => { 4374 if (!slug) return; 4375 fetch(`/api/blog/${encodeURIComponent(slug)}/related-courses`).then((r) => r.ok ? r.json() : []).then((data2) => { 4376 setCourses(data2 ?? []); 4377 setLoaded(true); 4378 }).catch(() => setLoaded(true)); 4379 }, [slug]); 4380 if (!loaded || courses.length === 0) return null; 4381 return /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.section, { initial: { 4382 opacity: 0, 4383 y: 24 4384 }, animate: { 4385 opacity: 1, 4386 y: 0 4387 }, transition: { 4388 duration: 0.4, 4389 ease: "easeOut" 4390 }, className: "mt-12 rounded-2xl overflow-hidden border border-border", "aria-label": "Related training courses", children: [ 4391 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-6 py-4 flex items-center gap-3", style: { 4392 background: "hsl(var(--primary))" 4393 }, children: [
4394 /* @__PURE__ */ jsxRuntimeExports.jsx(BookOpen, { className: "w-5 h-5 text-primary-foreground shrink-0" }), 4395 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary-foreground", children: "Want to go deeper? We teach this." }) 4396 ] }), 4397 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "divide-y divide-border bg-card", children: courses.map((course) => { 4398 var _a2; 4399 return /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: course.relativeUrl, className: "flex items-start gap-4 px-6 py-4 hover:bg-muted/50 transition-colors group", children: [ 4400 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-0.5 w-9 h-9 rounded-lg flex items-center justify-center shrink-0", style: { 4401 background: "hsl(var(--primary) / 0.1)" 4402 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(BookOpen, { className: "w-4 h-4", style: { 4403 color: "hsl(var(--primary))" 4404 } }) }), 4405 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [
4406 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground group-hover:text-primary transition-colors leading-snug", children: course.title }), 4407 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground mt-0.5 line-clamp-2", children: (_a2 = course.description) == null ? void 0 : _a2.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim() }), 4408 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2 mt-2", children: course.duration && /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 text-xs font-medium px-2 py-0.5 rounded-full bg-muted text-muted-foreground", children: [ 4409 /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "w-3 h-3" }), 4410 course.duration 4411 ] }) }) 4412 ] }), 4413 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-4 h-4 text-muted-foreground group-hover:text-primary group-hover:translate-x-0.5 transition-all mt-1 shrink-0" }) 4414 ] }, course.id); 4415 }) }), 4416 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "px-6 py-3 bg-muted/40 border-t border-border flex items-center justify-between", children: [
4417 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs text-muted-foreground", children: "Instructor-led, live online classes â small groups, real experts." }), 4418 /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses", className: "text-xs font-semibold flex items-center gap-1 hover:underline", style: { 4419 color: "hsl(var(--primary))" 4420 }, children: [ 4421 "Browse all courses ", 4422 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "w-3 h-3" }) 4423 ] }) 4424 ] }) 4425 ] }); 4426} 4427function sanitizeBlogContent(html) { 4428 if (!html || html.length > 2e6) return html || ""; 4429 html = html.replace(/<div[^>]{0,500}class="[^"]{0,200}lyMe[^"]{0,200}"[^>]{0,500}id="WYL_([^"]{1,50})"[^>]{0,500}>[\s\S]{0,5000}?<\/div>\s*<\/div>\s*<\/div>/g, (_m, id) => `<div class="wp-video-embed"><iframe src="https://www.youtube.com/embed/${id}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>`); 4430 html = html.replace(/<div[^>]{0,500}class="lyte-wrapper"[^>]{0,500}>[\s\S]{0,5000}?id="lyte_([^"]{1,50})"[\s\S]{0,5000}?<\/div>\s*<\/div>/g, (_m, id) => `<div class="wp-video-embed"><iframe src="https://www.youtube.com/embed/${id}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>`); 4431 html = html.replace(/<figure[^>]{0,500}class="[^"]{0,200}wp-block-embed[^"]{0,200}youtube[^"]{0,200}"[^>]{0,500}>[\s\S]{0,5000}?https?:\/\/(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/)([A-Za-z0-9_-]{11})[^\s<"]{0,200}[\s\S]{0,5000}?<\/figure>/gi, (_m, id) => `<div class="wp-video-embed"><iframe src="https://www.youtube.com/embed/${id}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>`); 4432 html = html.replace(/<p[^>]{0,500}>\s*(?:<a[^>]{0,500}>)?\s*(https?:\/\/(?:www\.)?(?:youtube\.com\/watch\?[^\s<"]{0,200}v=|youtu\.be\/)([A-Za-z0-9_-]{11})[^\s<"]{0,200})\s*(?:<\/a>)?\s*<\/p>/gi, (_m, _url, id) => `<div class="wp-video-embed"><iframe src="https://www.youtube.com/embed/${id}" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy"></iframe></div>`); 4433 html = html.replace(/https:\/\/skillforge\.com\/wp-content\/plugins\/wp-youtube-lyte\/lyteCache\.php\?origThumbUrl=([^"&\s]+)/g, (_m, encoded) => { 4434 try { 4435 return decodeURIComponent(encoded); 4436 } catch { 4437 return _m; 4438 } 4439 }); 4440 return html; 4441} 4442const videoCss = ` 4443 .wp-video-embed { 4444 position: relative; 4445 margin: 1.5rem 0; 4446 border-radius: 0.5rem; 4447 overflow: hidden; 4448 aspect-ratio: 16 / 9; 4449 background: #000; 4450 } 4451 .wp-video-embed iframe { 4452 position: absolute; 4453 inset: 0; 4454 width: 100%; 4455 height: 100%; 4456 display: block; 4457 border: none; 4458 border-radius: 0.5rem; 4459 } 4460 .wp-content iframe { max-width: 100%; border-radius: 0.5rem; } 4461 .wp-content .wp-block-embed { margin: 1.5rem 0; } 4462`; 4463function htmlToText(html) { 4464 return html.replace(/<[^>]*>/g, " ").replace(/\s+/g, " ").trim(); 4465} 4466function detectHowTo(title, content) { 4467 const titleLower = title.toLowerCase(); 4468 if (titleLower.startsWith("how to") || titleLower.startsWith("how do") || titleLower.includes(": how to")) return true; 4469 const olMatches = content.match(/<li[^>]*>/g); 4470 const hasOl = /<ol[^>]*>/.test(content) && ((olMatches == null ? void 0 : olMatches.length) ?? 0) >= 3; 4471 if (hasOl) return true; 4472 if (/step\s+\d+|<h[2-4][^>]*>\s*\d+[\.\)]/i.test(content)) return true; 4473 return false; 4474} 4475function extractSteps(content) { 4476 const steps = []; 4477 const olMatch = content.match(/<ol[^>]*>([\s\S]*?)<\/ol>/i); 4478 if (olMatch) { 4479 const liMatches = [...olMatch[1].matchAll(/<li[^>]*>([\s\S]*?)<\/li>/gi)]; 4480 liMatches.forEach((m, i) => { 4481 const text = htmlToText(m[1]).replace(/\s+/g, " ").trim(); 4482 if (text) steps.push({ 4483 name: `Step ${i + 1}`, 4484 text 4485 }); 4486 }); 4487 if (steps.length >= 2) return steps; 4488 } 4489 const headingMatches = [...content.matchAll(/<h[23][^>]*>([\s\S]*?)<\/h[23]>([\s\S]*?)(?=<h[23]|$)/gi)];
4490 headingMatches.forEach((m, i) => { 4491 const name = htmlToText(m[1]).trim(); 4492 const bodyHtml = m[2].match(/<p[^>]*>([\s\S]*?)<\/p>/i); 4493 const text = bodyHtml ? htmlToText(bodyHtml[1]).trim() : ""; 4494 if (name) steps.push({ 4495 name: `Step ${i + 1}: ${name}`, 4496 text 4497 }); 4498 }); 4499 return steps; 4500} 4501function BlogPostPage() { 4502 var _a2, _b2; 4503 const { 4504 slug 4505 } = useParams(); 4506 const loaderData = useLoaderData(); 4507 const [post, setPost] = reactExports.useState(loaderData ?? null); 4508 const [loading, setLoading] = reactExports.useState(loaderData == null); 4509 const [notFound, setNotFound] = reactExports.useState(false); 4510 reactExports.useEffect(() => { 4511 if (loaderData != null || !slug) return; 4512 setLoading(true); 4513 setNotFound(false); 4514 fetch(`/api/blog/${encodeURIComponent(slug)}`).then((r) => { 4515 if (r.status === 404) { 4516 setNotFound(true); 4517 setLoading(false); 4518 return null; 4519 } 4520 return r.json(); 4521 }).then((d) => { 4522 if (d) { 4523 setPost(d); 4524 setLoading(false); 4525 } 4526 }).catch(() => { 4527 setNotFound(true); 4528 setLoading(false); 4529 }); 4530 }, [slug, loaderData]); 4531 if (loading) { 4532 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 py-20 max-w-3xl", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "animate-pulse space-y-4", children: [
4533 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-8 bg-muted rounded w-3/4" }), 4534 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-4 bg-muted rounded w-1/3" }), 4535 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-64 bg-muted rounded mt-8" }), 4536 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-3 mt-8", children: [...Array(8)].map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "h-4 bg-muted rounded" }, i)) }) 4537 ] }) }); 4538 } 4539 if (notFound || !post) { 4540 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6 py-32 max-w-3xl text-center", children: [ 4541 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-bold mb-4", children: "Post not found" }), 4542 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-8", children: "This post may not have been imported yet." }), 4543 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/skillforge-blog", children: [
4544 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "w-4 h-4 mr-2" }), 4545 " Back to Blog" 4546 ] }) }) 4547 ] }); 4548 } 4549 const bareSlug = post.slug.replace(/^\//, ""); 4550 const postUrl = `https://skillforge.com/skillforge-blog/${bareSlug}`; 4551 const isHowTo = detectHowTo(post.title, post.content); 4552 const steps = isHowTo ? extractSteps(post.content) : []; 4553 const plainExcerpt = post.excerpt ? htmlToText(post.excerpt) : `${post.title} â SkillForge training tips and tutorials.`; 4554 const wordCount = htmlToText(post.content).split(/\s+/).filter(Boolean).length; 4555 const courseLinks = []; 4556 const courseLinkRe = /<a\s+href="(https:\/\/skillforge\.com\/courses\/[^"]+)"[^>]*title="([^"]+)"/gi; 4557 let clMatch; 4558 while ((clMatch = courseLinkRe.exec(post.content)) !== null) { 4559 const url = clMatch[1]; 4560 const title = clMatch[2].replace(" training course", ""); 4561 if (!courseLinks.some((c) => c.url === url)) courseLinks.push({ 4562 title, 4563 url 4564 }); 4565 } 4566 const SOFTWARE_MENTIONS = ["Microsoft Excel", "Microsoft Word", "Microsoft PowerPoint", "Microsoft Access", "Microsoft Outlook", "Microsoft Teams", "Microsoft Project", "Microsoft SharePoint", "Power BI", "Power Automate", "PowerApps", "Microsoft Copilot", "Adobe Acrobat", "Tableau", "Crystal Reports", "SQL Server"]; 4567 const mentionedSoftware = SOFTWARE_MENTIONS.filter((name) => post.content.toLowerCase().includes(name.toLowerCase())); 4568 const faqPairs = []; 4569 const faqRe = /<h[2-4][^>]*>(.*?\?)<\/h[2-4]>\s*<p[^>]*>([\s\S]*?)<\/p>/gi; 4570 let faqMatch; 4571 while ((faqMatch = faqRe.exec(post.content)) !== null) { 4572 const question = htmlToText(faqMatch[1]).trim(); 4573 const answer = htmlToText(faqMatch[2]).trim(); 4574 if (question && answer) faqPairs.push({ 4575 question, 4576 answer 4577 }); 4578 } 4579 const articleSchema = { 4580 "@context": "https://schema.org", 4581 "@type": "Article", 4582 headline: post.title, 4583 description: plainExcerpt, 4584 url: postUrl, 4585 wordCount, 4586 datePublished: post.date ? new Date(post.date).toISOString() : void 0, 4587 dateModified: post.updatedAt ? new Date(post.updatedAt).toISOString() : void 0, 4588 author: { 4589 "@type": "Person", 4590 name: post.author || "SkillForge" 4591 }, 4592 publisher: { 4593 "@type": "Organization", 4594 name: "SkillForge", 4595 url: "https://skillforge.com", 4596 logo: { 4597 "@type": "ImageObject", 4598 url: "https://skillforge.com/assets/skillforge-logo.jpg" 4599 } 4600 }, 4601 ...post.featuredImage && { 4602 image: { 4603 "@type": "ImageObject", 4604 url: post.featuredImage 4605 } 4606 }, 4607 ...((_a2 = post.categories) == null ? void 0 : _a2.length) > 0 && { 4608 keywords: post.categories.map((c) => c.name).join(", ") 4609 }, 4610 // Courses linked in the post body â tells Google what this article is about 4611 ...courseLinks.length > 0 && { 4612 about: courseLinks.map((c) => ({ 4613 "@type": "Course", 4614 name: c.title, 4615 url: c.url, 4616 provider: { 4617 "@type": "Organization", 4618 name: "SkillForge", 4619 url: "https://skillforge.com" 4620 } 4621 })) 4622 }, 4623 // Software products mentioned in the post body 4624 ...mentionedSoftware.length > 0 && { 4625 mentions: mentionedSoftware.map((name) => ({ 4626 "@type": "SoftwareApplication", 4627 name 4628 })) 4629 }, 4630 mainEntityOfPage: { 4631 "@type": "WebPage", 4632 "@id": postUrl 4633 } 4634 }; 4635 const howToSchema = isHowTo && steps.length >= 2 ? { 4636 "@context": "https://schema.org", 4637 "@type": "HowTo", 4638 name: post.title, 4639 description: plainExcerpt, 4640 url: postUrl, 4641 ...post.featuredImage && { 4642 image: post.featuredImage 4643 }, 4644 step: steps.map((s) => ({ 4645 "@type": "HowToStep", 4646 name: s.name, 4647 text: s.text 4648 })) 4649 } : null; 4650 const videoSchemas = []; 4651 const ytEmbedRe = /youtube\.com\/embed\/([A-Za-z0-9_-]{11})/g; 4652 let ytMatch; 4653 const sanitized = sanitizeBlogContent(post.content); 4654 while ((ytMatch = ytEmbedRe.exec(sanitized)) !== null) { 4655 const videoId = ytMatch[1]; 4656 if (!videoSchemas.some((v) => { 4657 var _a3; 4658 return (_a3 = v.embedUrl) == null ? void 0 : _a3.includes(videoId); 4659 })) { 4660 videoSchemas.push({ 4661 "@context": "https://schema.org", 4662 "@type": "VideoObject",
4663 name: post.title, 4664 description: plainExcerpt, 4665 embedUrl: `https://www.youtube.com/embed/${videoId}`, 4666 url: `https://www.youtube.com/watch?v=${videoId}`, 4667 thumbnailUrl: `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`, 4668 uploadDate: post.date ? new Date(post.date).toISOString() : void 0, 4669 publisher: { 4670 "@type": "Organization", 4671 name: "SkillForge", 4672 url: "https://skillforge.com" 4673 } 4674 }); 4675 } 4676 } 4677 const faqSchema = !isHowTo && faqPairs.length >= 2 ? { 4678 "@context": "https://schema.org", 4679 "@type": "FAQPage", 4680 mainEntity: faqPairs.map((pair) => ({ 4681 "@type": "Question", 4682 name: pair.question, 4683 acceptedAnswer: { 4684 "@type": "Answer", 4685 text: pair.answer 4686 } 4687 })) 4688 } : null; 4689 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col", children: [ 4690 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [ 4691 /* @__PURE__ */ jsxRuntimeExports.jsxs("title", { children: [ 4692 post.title, 4693 " | SkillForge Blog" 4694 ] }),
4695 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: plainExcerpt }), 4696 post.status === "draft" && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "robots", content: "noindex, nofollow" }), 4697 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: postUrl }), 4698 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: post.title }), 4699 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: plainExcerpt }), 4700 post.featuredImage && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: post.featuredImage }), 4701 !post.featuredImage && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 4702 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "article" }), 4703 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: postUrl }), 4704 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }),
4705 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: post.title }), 4706 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: plainExcerpt }), 4707 post.featuredImage && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: post.featuredImage }), 4708 !post.featuredImage && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 4709 post.date && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "article:published_time", content: new Date(post.date).toISOString() }), 4710 post.updatedAt && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "article:modified_time", content: new Date(post.updatedAt).toISOString() }), 4711 post.author && /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "article:author", content: post.author }), 4712 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(articleSchema) }),
4713 howToSchema && /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(howToSchema) }), 4714 faqSchema && /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(faqSchema) }), 4715 videoSchemas.map((vs, i) => /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(vs) }, i)), 4716 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 4717 "@context": "https://schema.org", 4718 "@type": "BreadcrumbList", 4719 itemListElement: [{ 4720 "@type": "ListItem", 4721 position: 1, 4722 name: "Home", 4723 item: "https://skillforge.com/" 4724 }, { 4725 "@type": "ListItem", 4726 position: 2, 4727 name: "Blog & Tutorials", 4728 item: "https://skillforge.com/skillforge-blog" 4729 }, { 4730 "@type": "ListItem", 4731 position: 3, 4732 name: post.title, 4733 item: postUrl 4734 }] 4735 }) }) 4736 ] }), 4737 post.featuredImage && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "w-full overflow-hidden relative flex items-center justify-center", style: { 4738 height: "420px", 4739 background: "#111" 4740 }, children: [
4741 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 scale-110", style: { 4742 backgroundImage: `url(${post.featuredImage})`, 4743 backgroundSize: "cover", 4744 backgroundPosition: "center", 4745 filter: "blur(18px) brightness(0.45)" 4746 } }), 4747 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative z-10 flex items-center justify-center", style: { 4748 maxHeight: "420px", 4749 padding: "16px" 4750 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { style: { 4751 background: "#fff", 4752 borderRadius: "6px", 4753 padding: "8px", 4754 display: "flex", 4755 alignItems: "center", 4756 justifyContent: "center" 4757 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: post.featuredImage, alt: post.title, className: "object-contain", style: { 4758 maxHeight: "380px", 4759 maxWidth: "100%", 4760 display: "block" 4761 }, loading: "eager", fetchPriority: "high", decoding: "sync" }) }) }) 4762 ] }), 4763 /* @__PURE__ */ jsxRuntimeExports.jsxs("article", { className: "container mx-auto px-6 py-12 max-w-3xl", children: [
4764 /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/skillforge-blog", className: "inline-flex items-center gap-1.5 text-sm mb-8 hover:underline", style: { 4765 color: "#4A7A8A" 4766 }, children: [ 4767 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "w-4 h-4" }), 4768 " Back to Blog" 4769 ] }), 4770 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 4771 opacity: 0, 4772 y: 20 4773 }, animate: { 4774 opacity: 1, 4775 y: 0 4776 }, transition: { 4777 duration: 0.4, 4778 ease: "easeOut" 4779 }, children: [ 4780 (((_b2 = post.categories) == null ? void 0 : _b2.length) ?? 0) > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2 mb-4", children: (post.categories ?? []).map((cat) => /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "inline-flex items-center gap-1 text-xs font-semibold uppercase tracking-wide px-2.5 py-1 rounded-full", style: { 4781 background: "#f0f6f8", 4782 color: "#4A7A8A" 4783 }, children: [
4784 /* @__PURE__ */ jsxRuntimeExports.jsx(Tag, { className: "w-3 h-3" }), 4785 cat.name 4786 ] }, cat.id)) }), 4787 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-3xl md:text-4xl font-bold leading-tight text-foreground mb-5", children: post.title }), 4788 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-4 text-sm text-muted-foreground mb-10 pb-8", style: { 4789 borderBottom: "1px solid #e5e7eb" 4790 }, children: [ 4791 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [ 4792 /* @__PURE__ */ jsxRuntimeExports.jsx(Calendar, { className: "w-4 h-4" }), 4793 post.date ? format(new Date(post.date), "MMMM d, yyyy") : "Unknown date" 4794 ] }), 4795 post.updatedAt && post.date && (() => { 4796 const published = new Date(post.date).getTime(); 4797 const updated = new Date(post.updatedAt).getTime(); 4798 return updated - published > 24 * 60 * 60 * 1e3 ? /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [
4799 /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "w-4 h-4" }), 4800 "Updated ", 4801 format(new Date(post.updatedAt), "MMMM d, yyyy") 4802 ] }) : null; 4803 })() 4804 ] }), 4805 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "wp-content prose prose-slate max-w-none", dangerouslySetInnerHTML: { 4806 __html: sanitized 4807 } }) 4808 ] }), 4809 /* @__PURE__ */ jsxRuntimeExports.jsx(RelatedCoursesCTA, { slug: post.slug }), 4810 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mt-16 pt-8", style: { 4811 borderTop: "1px solid #e5e7eb" 4812 }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "outline", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/skillforge-blog", children: [ 4813 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowLeft, { className: "w-4 h-4 mr-2" }), 4814 " Back to Blog" 4815 ] }) }) }) 4816 ] }), 4817 /* @__PURE__ */ jsxRuntimeExports.jsx("style", { children: ` 4818 .wp-content h1, .wp-content h2, .wp-content h3, .wp-content h4 { 4819 font-weight: 700; 4820 line-height: 1.3; 4821 margin-top: 2rem; 4822 margin-bottom: 0.75rem; 4823 color: hsl(var(--foreground)); 4824 } 4825 .wp-content h2 { font-size: 1.5rem; } 4826 .wp-content h3 { font-size: 1.25rem; } 4827 .wp-content h4 { font-size: 1.1rem; } 4828 .wp-content p { margin-bottom: 1.25rem; line-height: 1.75; color: hsl(var(--foreground)); } 4829 .wp-content a { color: #4A7A8A; text-decoration: underline; } 4830 .wp-content a:hover { color: #FF7A00; } 4831 .wp-content ul, .wp-content ol { margin: 1rem 0 1.25rem 1.5rem; } 4832 .wp-content ul { list-style-type: disc; } 4833 .wp-content ol { list-style-type: decimal; } 4834 .wp-content li { margin-bottom: 0.4rem; line-height: 1.7; } 4835 .wp-content img { max-width: 100%; height: auto; border-radius: 0.5rem; margin: 1.5rem 0; } 4836 .wp-content blockquote { 4837 border-left: 4px solid #4A7A8A; 4838 padding: 0.75rem 1.25rem; 4839 margin: 1.5rem 0; 4840 background: #f5f9fa; 4841 border-radius: 0 0.375rem 0.375rem 0; 4842 font-style: italic; 4843 color: hsl(var(--muted-foreground)); 4844 } 4845 .wp-content pre, .wp-content code { 4846 background: #f5f6f7; 4847 border-radius: 0.375rem; 4848 font-family: monospace; 4849 font-size: 0.875rem; 4850 } 4851 .wp-content pre { padding: 1rem 1.25rem; overflow-x: auto; margin: 1.25rem 0; } 4852 .wp-content code { padding: 0.15rem 0.4rem; } 4853 .wp-content table { width: 100%; border-collapse: collapse; margin: 1.5rem 0; font-size: 0.9rem; } 4854 .wp-content th, .wp-content td { padding: 0.6rem 0.9rem; border: 1px solid #e5e7eb; text-align: left; } 4855 .wp-content th { background: #f5f6f7; font-weight: 600; } 4856 .wp-content figure { margin: 1.5rem 0; } 4857 .wp-content figcaption { font-size: 0.8rem; color: hsl(var(--muted-foreground)); text-align: center; margin-top: 0.5rem; } 4858 .wp-content .wp-block-image { margin: 1.5rem 0; } 4859 ${videoCss} 4860 .wp-content strong { font-weight: 700; } 4861 .wp-content em { font-style: italic; } 4862 .wp-content hr { border: none; border-top: 1px solid #e5e7eb; margin: 2rem 0; } 4863 ` }) 4864 ] }); 4865} 4866const Textarea = reactExports.forwardRef(({ 4867 className, 4868 ...props 4869}, ref) => { 4870 return /* @__PURE__ */ jsxRuntimeExports.jsx("textarea", { className: cn("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", className), ref, ...props }); 4871}); 4872Textarea.displayName = "Textarea"; 4873const contactInfo = [{ 4874 icon: Phone, 4875 label: "Phone", 4876 value: "800-971-3203", 4877 href: "tel:+18009713203" 4878}, { 4879 icon: Mail, 4880 label: "Email", 4881 value: "[email protected]", 4882 href: "mailto:[email protected]" 4883}, { 4884 icon: MapPin, 4885 label: "Location", 4886 value: "Serving clients nationwide â online & onsite", 4887 href: null 4888}, { 4889 icon: Clock, 4890 label: "Hours", 4891 value: "MonâFri, 8:00 AM â 5:00 PM ET", 4892 href: null 4893}]; 4894const inquiryTypes = ["General Question", "Course Information", "Group / Corporate Training", "Onsite Training Request", "Pricing & Invoicing", "Technical Support", "Other"]; 4895function ContactUsPage() { 4896 const [form, setForm] = reactExports.useState({ 4897 name: "", 4898 email: "", 4899 phone: "", 4900 company: "", 4901 inquiryType: "", 4902 message: "" 4903 }); 4904 const [submitting, setSubmitting] = reactExports.useState(false); 4905 const [submitted, setSubmitted] = reactExports.useState(false); 4906 const [error, setError] = reactExports.useState(""); 4907 function handleChange(field, value) { 4908 setForm((prev) => ({ 4909 ...prev, 4910 [field]: value 4911 })); 4912 } 4913 async function handleSubmit(e) { 4914 e.preventDefault(); 4915 if (!form.name || !form.email || !form.message) return; 4916 setSubmitting(true); 4917 setError(""); 4918 try { 4919 const res = await fetch("/api/contact", { 4920 method: "POST", 4921 headers: { 4922 "Content-Type": "application/json" 4923 }, 4924 body: JSON.stringify(form) 4925 }); 4926 if (!res.ok) throw new Error("Failed to send"); 4927 setSubmitted(true); 4928 } catch { 4929 setError("Something went wrong. Please try emailing us directly at [email protected]."); 4930 } finally { 4931 setSubmitting(false); 4932 } 4933 } 4934 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
4935 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [ 4936 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Contact Us | SkillForge Training" }), 4937 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Get in touch with SkillForge. Ask about courses, group training, pricing, or onsite options. We're here to help." }), 4938 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/contact-us" }), 4939 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 4940 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/contact-us" }), 4941 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Contact Us | SkillForge Training" }), 4942 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Get in touch with SkillForge. Ask about courses, group training, pricing, or onsite options. We're here to help." }),
4943 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 4944 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 4945 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Contact Us | SkillForge Training" }), 4946 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "Get in touch with SkillForge. Ask about courses, group training, pricing, or onsite options. We're here to help." }), 4947 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 4948 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 4949 "@context": "https://schema.org", 4950 "@type": "BreadcrumbList", 4951 itemListElement: [{ 4952 "@type": "ListItem", 4953 position: 1, 4954 name: "Home", 4955 item: "https://skillforge.com/" 4956 }, { 4957 "@type": "ListItem", 4958 position: 2, 4959 name: "Contact Us", 4960 item: "https://skillforge.com/contact-us" 4961 }] 4962 }) }),
4963 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 4964 "@context": "https://schema.org", 4965 "@type": "ContactPage", 4966 "name": "Contact Us | SkillForge Training", 4967 "description": "Get in touch with SkillForge. Ask about courses, group training, pricing, or onsite options.", 4968 "url": "https://skillforge.com/contact-us", 4969 "publisher": { 4970 "@type": "EducationalOrganization", 4971 "name": "SkillForge", 4972 "url": "https://skillforge.com" 4973 } 4974 }) }) 4975 ] }), 4976 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "bg-[#4A7A8A] text-white py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 4977 opacity: 0, 4978 y: 16 4979 }, animate: { 4980 opacity: 1, 4981 y: 0 4982 }, transition: { 4983 duration: 0.4, 4984 ease: "easeOut" 4985 }, children: [
4986 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold mb-3", children: "Contact Us" }), 4987 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg text-white/80 max-w-xl", children: "Have a question about a course, need a group training quote, or want to schedule onsite training? We'd love to hear from you." }) 4988 ] }) }) }), 4989 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-12", children: [ 4990 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 4991 opacity: 0, 4992 x: -16 4993 }, animate: { 4994 opacity: 1, 4995 x: 0 4996 }, transition: { 4997 duration: 0.4, 4998 delay: 0.1, 4999 ease: "easeOut" 5000 }, className: "space-y-8", children: [ 5001 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
5002 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-semibold text-foreground mb-6", children: "Get in Touch" }), 5003 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-5", children: contactInfo.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-4", children: [ 5004 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex-shrink-0 w-10 h-10 rounded-lg bg-[#FF7A00]/10 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(item.icon, { className: "w-5 h-5 text-[#FF7A00]" }) }), 5005 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5006 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wide mb-0.5", children: item.label }), 5007 item.href ? /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: item.href, className: "text-sm text-foreground hover:text-[#FF7A00] transition-colors", children: item.value }) : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-foreground", children: item.value }) 5008 ] }) 5009 ] }, item.label)) }) 5010 ] }),
5011 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "border-t border-border pt-8", children: [ 5012 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-sm font-semibold text-foreground mb-4 uppercase tracking-wide", children: "Quick Links" }), 5013 /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { className: "space-y-2 text-sm", children: [ 5014 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "/courses", className: "text-[#4A7A8A] hover:underline", children: "Browse all courses" }) }), 5015 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "/about", className: "text-[#4A7A8A] hover:underline", children: "About SkillForge" }) }), 5016 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "/student", className: "text-[#4A7A8A] hover:underline", children: "Student portal" }) }) 5017 ] }) 5018 ] }) 5019 ] }),
5020 /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 5021 opacity: 0, 5022 y: 16 5023 }, animate: { 5024 opacity: 1, 5025 y: 0 5026 }, transition: { 5027 duration: 0.4, 5028 delay: 0.15, 5029 ease: "easeOut" 5030 }, className: "lg:col-span-2", children: submitted ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col items-center justify-center py-20 text-center", children: [ 5031 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "w-14 h-14 text-green-500 mb-4" }), 5032 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-foreground mb-2", children: "Message Sent!" }), 5033 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground max-w-sm", children: "Thanks for reaching out. We'll get back to you within one business day." }), 5034 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", className: "mt-6", onClick: () => { 5035 setSubmitted(false); 5036 setForm({ 5037 name: "", 5038 email: "", 5039 phone: "", 5040 company: "", 5041 inquiryType: "", 5042 message: "" 5043 }); 5044 }, children: "Send another message" }) 5045 ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("form", { onSubmit: handleSubmit, className: "space-y-6", children: [
5046 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-semibold text-foreground", children: "Send Us a Message" }), 5047 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: [ 5048 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 5049 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "name", children: [ 5050 "Full Name ", 5051 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 5052 ] }), 5053 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "name", value: form.name, onChange: (e) => handleChange("name", e.target.value), placeholder: "Jane Smith", required: true }) 5054 ] }), 5055 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 5056 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "email", children: [ 5057 "Email Address ", 5058 /* @__P
5058URE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 5059 ] }), 5060 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "email", type: "email", value: form.email, onChange: (e) => handleChange("email", e.target.value), placeholder: "[email protected]", required: true }) 5061 ] }), 5062 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 5063 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "phone", children: "Phone Number" }), 5064 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "phone", type: "tel", value: form.phone, onChange: (e) => handleChange("phone", e.target.value), placeholder: "(555) 000-0000" }) 5065 ] }), 5066 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 5067 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "company", children: "Company / Organization" }), 5068 /* @__PURE__ */ jsxRuntimeExports.jsx(Input, { id: "company", value: form.company, onChange: (e) => handleChange("company", e.target.value), placeholder: "Acme Corp" }) 5069 ] }) 5070 ] }),
5071 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 5072 /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { htmlFor: "inquiryType", children: "What can we help you with?" }), 5073 /* @__PURE__ */ jsxRuntimeExports.jsxs(Select, { value: form.inquiryType, onValueChange: (v) => handleChange("inquiryType", v), children: [ 5074 /* @__PURE__ */ jsxRuntimeExports.jsx(SelectTrigger, { id: "inquiryType", children: /* @__PURE__ */ jsxRuntimeExports.jsx(SelectValue, { placeholder: "Select an inquiry type" }) }), 5075 /* @__PURE__ */ jsxRuntimeExports.jsx(SelectContent, { children: inquiryTypes.map((t) => /* @__PURE__ */ jsxRuntimeExports.jsx(SelectItem, { value: t, children: t }, t)) }) 5076 ] }) 5077 ] }), 5078 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-1.5", children: [ 5079 /* @__PURE__ */ jsxRuntimeExports.jsxs(Label, { htmlFor: "message", children: [ 5080 "Message ", 5081 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-destructive", children: "*" }) 5082 ] }),
5083 /* @__PURE__ */ jsxRuntimeExports.jsx(Textarea, { id: "message", value: form.message, onChange: (e) => handleChange("message", e.target.value), placeholder: "Tell us about your training needs, questions, or anything else we can help with...", rows: 6, required: true }) 5084 ] }), 5085 error && /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-destructive", children: error }), 5086 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { type: "submit", disabled: submitting || !form.name || !form.email || !form.message, className: "bg-[#FF7A00] hover:bg-[#e06e00] text-white", children: submitting ? "Sending..." : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 5087 /* @__PURE__ */ jsxRuntimeExports.jsx(Send, { className: "w-4 h-4 mr-2" }), 5088 "Send Message" 5089 ] }) }) 5090 ] }) }) 5091 ] }) }) }) 5092 ] }); 5093} 5094const faqs = [{ 5095 id: "recorded", 5096 question: "Is this a recorded video class?", 5097 answer: "Our live, instructor-led online classes are not recorded eLearning! These are live, hands-on classes where you will watch your instructor demonstrate skills and then get the chance to practice yourself, all while your instructor remains in the classroom with you available to answer questions or give assistance." 5098}, { 5099 id: "questions", 5100 question: "Am I able to ask questions during class?", 5101 answer: "Yes! You can ask questions at any time. We recommend using a USB headset with microphone (if you have one) for audio, or you can also dial-in via telephone if you prefer. And, if you'd like to chat with your instructor privately, our online classroom provides a private chat function as well." 5102}, { 5103 id: "connect", 5104 question: "How do I connect to the class?", 5105 answer: "After registering, you will receive an email from us with a link to join your class. We use Zoom in our online classroom. Some students may be prompted to install Zoom, but it is a quick, automatic download and works in virtually every network environment with no issues. It is also possible to join the class without downloading Zoom, directly from your browser. Please contact us at 800-971-3203 if you have additional questions." 5106}, { 5107 id: "equipment", 5108 question: "What equipment will I need?", 5109 answer: `To attend class, you will need a Windows PC or laptop (Mac OS is supported for some courses â please refer to your specific course's "Versions" section to check). While having a second monitor is helpful, it is not required for class. And, of course, you will want a reliable internet connection to join the class.` 5110}, { 5111 id: "software", 5112 question: "Do I need the software for the class I'm taking?", 5113 answer: "In order to complete the hands-on exercises and labs in each course, you will need the software installed locally on your machine. So, if you are taking an Excel Introduction class, for instance, you will need Excel installed. Most software companies provide a free trial version that can be used in class. Please contact us if you are not sure about how to obtain the software you need." 5114}, { 5115 id: "recordings", 5116 question: "Are the classes recorded?", 5117 answer: "Many of our courses offer one year access to a recorded version of the class included in the price. Please refer to the specific course you are interested in to see if this option is included." 5118}, { 5119 id: "cancellation-low", 5120 question: "Will my class be cancelled if not enough students enroll?", 5121 answer: "No! All of our live, online classes are guaranteed not to be cancelled for low enrollment. Even if you are the only student enrolled, your class will still run." 5122}, { 5123 id: "times", 5124 question: "What are the class times?", 5125 answer: "Our live, online classes are either offered at 10:00 AM â 5:00 PM Eastern Time or 9:00 AM â 5:00 PM Eastern Time. Please refer to your course for the specific time it is offered." 5126}, { 5127 id: "sharing-policy", 5128 question: "Can I share or broadcast the class with others?", 5129 answer: null, 5130 answerHtml: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3 text-sm text-muted-foreground leading-relaxed", children: [
5131 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "The pricing displayed for each live, online class is for one student to attend. Attending consists of anyone watching the screen cast portion of the instructor presentation, even if that person did not receive a book or is not completing hands-on exercises." }), 5132 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { children: [ 5133 "Sharing of course material or broadcasting the screen cast portion of the presentation for multiple people to view (when not having paid for each individual viewing) is a violation of our service agreement as well as a copyright violation and is", 5134 " ", 5135 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "text-foreground", children: "expressly prohibited" }), 5136 "." 5137 ] }) 5138 ] }) 5139}, { 5140 id: "cancellation-policy", 5141 question: "What is your cancellation policy?", 5142 answer: null, 5143 answerHtml: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-3 text-sm text-muted-foreground leading-relaxed", children: [ 5144 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We understand that your needs or schedule might change prior to your class being held. Because our classes are guaranteed to run, even if you are the only student enrolled, we ask that you notify us at least 5 business days in advance if you will not be able to attend your class. Based on when you notify us of your registration cancellation/rescheduling, the following fees will apply:" }), 5145 /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { className: "list-disc pl-5 space-y-1", children: [
5146 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 5147 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "text-foreground", children: "More than 5 business days in advance" }), 5148 " â no cancellation/rescheduling fee." 5149 ] }), 5150 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 5151 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { className: "text-foreground", children: "5 business days or less in advance" }), 5152 " â cancellation/rescheduling fee equaling 30% of total course tuition." 5153 ] }) 5154 ] }) 5155 ] }) 5156}, { 5157 id: "certificate", 5158 question: "Do I receive a certificate showing I completed the class?", 5159 answer: "Yes. Once you have completed the class, we will email your certificate to you." 5160}]; 5161function FaqPage() { 5162 const faqSchema = { 5163 "@context": "https://schema.org", 5164 "@type": "FAQPage", 5165 mainEntity: [{ 5166 "@type": "Question", 5167 name: "Is this a recorded video class?", 5168 acceptedAnswer: { 5169 "@type": "Answer", 5170 text: "Our live, instructor-led online classes are not recorded eLearning! These are live, hands-on classes where you will watch your instructor demonstrate skills and then get the chance to practice yourself, all while your instructor remains in the classroom with you available to answer questions or give assistance." 5171 } 5172 }, { 5173 "@type": "Question", 5174 name: "Am I able to ask questions during class?", 5175 acceptedAnswer: { 5176 "@type": "Answer", 5177 text: "Yes! You can ask questions at any time. We recommend using a USB headset with microphone (if you have one) for audio, or you can also dial-in via telephone if you prefer. And, if you'd like to chat with your instructor privately, our online classroom provides a private chat function as well." 5178 } 5179 }, { 5180 "@type": "Question", 5181 name: "How do I connect to the class?", 5182 acceptedAnswer: { 5183 "@type": "Answer", 5184 text: "After registering, you will receive an email from us with a link to join your class. We use Zoom in our online classroom. Some students may be prompted to install Zoom, but it is a quick, automatic download and works in virtually every network environment with no issues. It is also possible to join the class without downloading Zoom, directly from your browser. Please contact us at 800-971-3203 if you have additional questions." 5185 } 5186 }, { 5187 "@type": "Question", 5188 name: "What equipment will I need?", 5189 acceptedAnswer: { 5190 "@type": "Answer", 5191 text: `To attend class, you will need a Windows PC or laptop (Mac OS is supported for some courses â please refer to your specific course's "Versions" section to check). While having a second monitor is helpful, it is not required for class. And, of course, you will want a reliable internet connection to join the class.` 5192 } 5193 }, { 5194 "@type": "Question", 5195 name: "Do I need the software for the class I'm taking?", 5196 acceptedAnswer: { 5197 "@type": "Answer", 5198 text: "In order to complete the hands-on exercises and labs in each course, you will need the software installed locally on your machine. So, if you are taking an Excel Introduction class, for instance, you will need Excel installed. Most software companies provide a free trial version that can be used in class. Please contact us if you are not sure about how to obtain the software you need." 5199 } 5200 }, { 5201 "@type": "Question", 5202 name: "Are the classes recorded?", 5203 acceptedAnswer: { 5204 "@type": "Answer", 5205 text: "Many of our courses offer one year access to a recorded version of the class included in the price. Please refer to the specific course you are interested in to see if this option is included." 5206 } 5207 }, { 5208 "@type": "Question", 5209 name: "Will my class be cancelled if not enough students enroll?", 5210 acceptedAnswer: { 5211 "@type": "Answer", 5212 text: "No! All of our live, online classes are guaranteed not to be cancelled for low enrollment. Even if you are the only student enrolled, your class will still run." 5213 } 5214 }, {
5215 "@type": "Question", 5216 name: "What are the class times?", 5217 acceptedAnswer: { 5218 "@type": "Answer", 5219 text: "Our live, online classes are either offered at 10:00 AM â 5:00 PM Eastern Time or 9:00 AM â 5:00 PM Eastern Time. Please refer to your course for the specific time it is offered." 5220 } 5221 }, { 5222 "@type": "Question", 5223 name: "Can I share or broadcast the class with others?", 5224 acceptedAnswer: { 5225 "@type": "Answer", 5226 text: "The pricing displayed for each live, online class is for one student to attend. Attending consists of anyone watching the screen cast portion of the instructor presentation, even if that person did not receive a book or is not completing hands-on exercises. Sharing of course material or broadcasting the screen cast portion of the presentation for multiple people to view (when not having paid for each individual viewing) is a violation of our service agreement as well as a copyright violation and is expressly prohibited." 5227 } 5228 }, { 5229 "@type": "Question", 5230 name: "What is your cancellation policy?", 5231 acceptedAnswer: { 5232 "@type": "Answer", 5233 text: "We understand that your needs or schedule might change prior to your class being held. Because our classes are guaranteed to run, even if you are the only student enrolled, we ask that you notify us at least 5 business days in advance if you will not be able to attend your class. More than 5 business days in advance: no cancellation/rescheduling fee. 5 business days or less in advance: cancellation/rescheduling fee equaling 30% of total course tuition." 5234 } 5235 }, { 5236 "@type": "Question", 5237 name: "Do I receive a certificate showing I completed the class?", 5238 acceptedAnswer: { 5239 "@type": "Answer", 5240 text: "Yes. Once you have completed the class, we will email your certificate to you." 5241 } 5242 }] 5243 }; 5244 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 5245 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
5246 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "FAQ | Instructor-Led Online Class Questions | SkillForge" }), 5247 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Answers to frequently asked questions about SkillForge's live, instructor-led online training classes â equipment, software, cancellation policy, and more." }), 5248 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/instructor-led-online-class-faqs" }), 5249 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 5250 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/instructor-led-online-class-faqs" }), 5251 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Instructor-Led Online Class FAQs | SkillForge" }), 5252 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Answers to frequently asked questions about SkillForge's live, instructor-led online training classes â equipment, software, cancellation policy, and more." }),
5253 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 5254 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 5255 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Instructor-Led Online Class FAQs | SkillForge" }), 5256 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "Answers to frequently asked questions about SkillForge's live, instructor-led online training classes â equipment, software, cancellation policy, and more." }), 5257 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 5258 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 5259 "@context": "https://schema.org", 5260 "@type": "BreadcrumbList", 5261 itemListElement: [{ 5262 "@type": "ListItem", 5263 position: 1, 5264 name: "Home", 5265 item: "https://skillforge.com/" 5266 }, { 5267 "@type": "ListItem", 5268 position: 2, 5269 name: "FAQs", 5270 item: "https://skillforge.com/instructor-led-online-class-faqs" 5271 }] 5272 }) }),
5273 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(faqSchema) }) 5274 ] }), 5275 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "bg-[#4A7A8A] text-white py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 5276 opacity: 0, 5277 y: 16 5278 }, animate: { 5279 opacity: 1, 5280 y: 0 5281 }, transition: { 5282 duration: 0.4, 5283 ease: "easeOut" 5284 }, className: "flex items-start gap-4", children: [ 5285 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleHelp, { className: "w-10 h-10 flex-shrink-0 opacity-80 mt-1" }), 5286 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5287 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold leading-tight", children: "Instructor-Led Online Class FAQs" }), 5288 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-3 text-lg text-white/80 max-w-2xl", children: "Everything you need to know about attending a live, online training class with SkillForge." }) 5289 ] }) 5290 ] }) }) }), 5291 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-12", children: [
5292 /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 5293 opacity: 0, 5294 y: 16 5295 }, animate: { 5296 opacity: 1, 5297 y: 0 5298 }, transition: { 5299 duration: 0.4, 5300 delay: 0.1, 5301 ease: "easeOut" 5302 }, className: "lg:col-span-2", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Accordion, { type: "single", collapsible: true, className: "space-y-3", children: faqs.map((faq) => /* @__PURE__ */ jsxRuntimeExports.jsxs(AccordionItem, { value: faq.id, className: "border border-border rounded-xl px-5 data-[state=open]:border-[#4A7A8A]", children: [ 5303 /* @__PURE__ */ jsxRuntimeExports.jsx(AccordionTrigger, { className: "text-left font-semibold text-foreground hover:no-underline py-5", children: faq.question }), 5304 /* @__PURE__ */ jsxRuntimeExports.jsx(AccordionContent, { className: "pb-5", children: faq.answerHtml ? faq.answerHtml : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: faq.answer }) }) 5305 ] }, faq.id)) }) }),
5306 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 5307 opacity: 0, 5308 x: 16 5309 }, animate: { 5310 opacity: 1, 5311 x: 0 5312 }, transition: { 5313 duration: 0.4, 5314 delay: 0.15, 5315 ease: "easeOut" 5316 }, className: "space-y-6", children: [ 5317 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-card p-6 space-y-4", children: [ 5318 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 5319 /* @__PURE__ */ jsxRuntimeExports.jsx(MessageCircle, { className: "w-5 h-5 text-[#FF7A00]" }), 5320 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground text-lg", children: "Still have questions?" }) 5321 ] }), 5322 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: "Don't see your question here? Our team is happy to help â reach out and we'll get back to you promptly." }),
5323 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, className: "w-full bg-[#FF7A00] hover:bg-[#e06e00] text-white", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact-us", children: "Contact Us" }) }), 5324 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground text-center", children: [ 5325 "Or call us at", 5326 " ", 5327 /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "tel:+18009713203", className: "text-[#4A7A8A] hover:underline", children: "800-971-3203" }), 5328 /* @__PURE__ */ jsxRuntimeExports.jsx("br", {}), 5329 "MonâFri, 8:00 AM â 5:00 PM ET" 5330 ] }) 5331 ] }), 5332 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-muted/40 p-6 space-y-3", children: [ 5333 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground", children: "Ready to register?" }), 5334 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Browse our full catalog of live, instructor-led online courses." }),
5335 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "outline", className: "w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Browse Courses" }) }) 5336 ] }), 5337 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl bg-[#4A7A8A]/10 border border-[#4A7A8A]/20 p-6 space-y-2", children: [ 5338 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-[#4A7A8A]", children: "Guaranteed to run" }), 5339 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: "Every live online class is guaranteed not to be cancelled for low enrollment â even if you're the only student registered." }) 5340 ] }) 5341 ] }) 5342 ] }) }) }) 5343 ] }); 5344} 5345const skillAreas = ["Microsoft Excel (Introduction, Intermediate, Advanced, VBA, Power Pivot, Dashboards, Data Analysis)", "Microsoft Word (Introduction, Intermediate, Advanced)", "Microsoft PowerPoint (Introduction, Advanced)", "Microsoft Access (Introduction, Advanced, VBA)", "Microsoft Outlook (Introduction, Advanced)", "Microsoft SharePoint (Site User, Site Owner, Advanced Owner, Power User, Administrator)", "Microsoft Project", "Microsoft Teams", "Office 365 / Microsoft 365", "Power Platform (Power BI, Power Automate, PowerApps, Power Platform Fundamentals)", "Microsoft Copilot & AI Tools", "Azure (Fundamentals, Administration, Development, Security, SQL, Infrastructure)", "Microsoft 365 Administration (Endpoint, Messaging, Security)", "PowerShell", "Crystal Reports (Introduction, Intermediate)", "SQL (Introduction, Advanced, SQL Databases)", "Tableau (Introduction, Intermediate)", "Business Skills (Communication, Customer Service, Presentation Skills, Time Management, Leadership)", "Project Management"]; 5346const whyUs = [{ 5347 title: "Trainers at the center", 5348 body: "Our company was founded by trainers. We firmly believe the trainer is the center of our business and strive to provide the best environment for you to shine in every engagement." 5349}, { 5350 title: "Competitive compensation", 5351 body: "We ensure the key success components are in place â from our systems to our compensation â so each training delivery can be exceptional." 5352}, { 5353 title: "Flexible delivery", 5354 body: "Many courses are delivered at the client's physical site, but we also offer a regular schedule of live, instructor-led online courses that can be delivered from home." 5355}, { 5356 title: "Full classroom support", 5357 body: "We provide courseware, classroom support, and everything you need so you can focus on what you do best â delivering outstanding training." 5358}]; 5359function CareersPage() { 5360 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 5361 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
5362 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Careers | Contract Trainers & Instructors | SkillForge" }), 5363 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Join SkillForge as a contract trainer or instructor. We're seeking experts in Microsoft Office, Adobe, SQL, SharePoint, Tableau, and more." }), 5364 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/careers" }), 5365 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 5366 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/careers" }), 5367 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Careers â Contract Trainers & Instructors | SkillForge" }), 5368 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Join SkillForge as a contract trainer or instructor. We're seeking experts in Microsoft Office, Adobe, SQL, SharePoint, Tableau, and more." }),
5369 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 5370 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 5371 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Careers â Contract Trainers & Instructors | SkillForge" }), 5372 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "Join SkillForge as a contract trainer or instructor. We're seeking experts in Microsoft Office, Adobe, SQL, SharePoint, Tableau, and more." }), 5373 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 5374 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 5375 "@context": "https://schema.org", 5376 "@type": "BreadcrumbList", 5377 itemListElement: [{ 5378 "@type": "ListItem", 5379 position: 1, 5380 name: "Home", 5381 item: "https://skillforge.com/" 5382 }, { 5383 "@type": "ListItem", 5384 position: 2, 5385 name: "Careers", 5386 item: "https://skillforge.com/careers" 5387 }] 5388 }) }),
5389 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 5390 "@context": "https://schema.org", 5391 "@type": "WebPage", 5392 "name": "Careers â Contract Trainers & Instructors | SkillForge", 5393 "description": "Join SkillForge as a contract trainer or instructor. We seek experts in Microsoft Office, Adobe, SQL, SharePoint, Tableau, and more.", 5394 "url": "https://skillforge.com/careers", 5395 "publisher": { 5396 "@type": "EducationalOrganization", 5397 "name": "SkillForge", 5398 "url": "https://skillforge.com" 5399 } 5400 }) }) 5401 ] }), 5402 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "bg-[#4A7A8A] text-white py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 5403 opacity: 0, 5404 y: 16 5405 }, animate: { 5406 opacity: 1, 5407 y: 0 5408 }, transition: { 5409 duration: 0.4, 5410 ease: "easeOut" 5411 }, className: "flex items-start gap-4", children: [
5412 /* @__PURE__ */ jsxRuntimeExports.jsx(Briefcase, { className: "w-10 h-10 flex-shrink-0 opacity-80 mt-1" }), 5413 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5414 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold leading-tight", children: "Careers â Contract Trainers & Instructors" }), 5415 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-3 text-lg text-white/80 max-w-2xl", children: "Are you an expert in your field? Do you pride yourself on delivering training that consistently thrills your clients? If so, we'd love to speak with you." }) 5416 ] }) 5417 ] }) }) }), 5418 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-12", children: [ 5419 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 5420 opacity: 0, 5421 y: 16 5422 }, animate: { 5423 opacity: 1, 5424 y: 0 5425 }, transition: { 5426 duration: 0.4, 5427 delay: 0.1, 5428 ease: "easeOut" 5429 }, className: "lg:col-span-2 space-y-8", children: [
5430 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5431 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-foreground mb-4", children: "About Us" }), 5432 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "space-y-4 text-muted-foreground leading-relaxed", children: [ 5433 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "SkillForge is a technical and business skills training company, delivering training to companies and individuals across North America. Our company was founded by trainers with years of experience in the industry." }), 5434 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We firmly believe that the trainer is the center of our business, and we strive to provide the best environment for trainers to shine in each and every engagement. From our systems to our compensation to our classroom support to our courseware, we ensure the key success components are in place so that each training delivery can be exceptional." }),
5435 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Many of our courses are delivered at our client's physical site, but we also offer a regular schedule of live, instructor-led online courses. Our online live courses can be delivered while working from home. We are seeking trainers interested in either type of delivery." }) 5436 ] }) 5437 ] }), 5438 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5439 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-foreground mb-5", children: "Why SkillForge?" }), 5440 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: whyUs.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-muted/40 p-5", children: [ 5441 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground mb-1.5", children: item.title }), 5442 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: item.body }) 5443 ] }, item.title)) }) 5444 ] }),
5445 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5446 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-2xl font-bold text-foreground mb-4", children: "Skills We're Looking For" }), 5447 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-4", children: "SkillForge is actively seeking trainers with expertise in the following areas:" }), 5448 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "space-y-2", children: skillAreas.map((skill) => /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { className: "flex items-start gap-2.5", children: [ 5449 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheck, { className: "w-4 h-4 mt-0.5 flex-shrink-0 text-[#FF7A00]" }), 5450 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-sm text-foreground", children: skill }) 5451 ] }, skill)) }) 5452 ] }) 5453 ] }), 5454 /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 5455 opacity: 0, 5456 x: 16 5457 }, animate: { 5458 opacity: 1, 5459 x: 0 5460 }, transition: { 5461 duration: 0.4, 5462 delay: 0.15, 5463 ease: "easeOut" 5464 }, className: "space-y-6", children: [
5465 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-card p-6 space-y-4", children: [ 5466 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 5467 /* @__PURE__ */ jsxRuntimeExports.jsx(Send, { className: "w-5 h-5 text-[#FF7A00]" }), 5468 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground text-lg", children: "Apply Now" }) 5469 ] }), 5470 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: "Send us your current resume and a brief overview of your training experience. If your skills match one of our current needs, we'll reach out for an in-depth interview." }), 5471 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, className: "w-full bg-[#FF7A00] hover:bg-[#e06e00] text-white", children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "mailto:[email protected]?subject=Contract Trainer Application", children: "Email Your Resume" }) }),
5472 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground text-center", children: [ 5473 "Send to", 5474 " ", 5475 /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "mailto:[email protected]", className: "text-[#4A7A8A] hover:underline", children: "[email protected]" }) 5476 ] }) 5477 ] }), 5478 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-muted/40 p-6 space-y-3", children: [ 5479 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground", children: "Have Questions?" }), 5480 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Not sure if you're a fit? Reach out through our contact form and we'll be happy to chat." }), 5481 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "outline", className: "w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact-us", children: "Contact Us" }) }) 5482 ] }),
5483 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-xl border border-border bg-muted/40 p-6 space-y-3", children: [ 5484 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground", children: "Learn More About SkillForge" }), 5485 /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { className: "space-y-2 text-sm", children: [ 5486 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/about", className: "text-[#4A7A8A] hover:underline", children: "About SkillForge" }) }), 5487 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", className: "text-[#4A7A8A] hover:underline", children: "Browse our course catalog" }) }), 5488 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/about/testimonials", className: "text-[#4A7A8A] hover:underline", children: "Student testimonials" }) }) 5489 ] }) 5490 ] }) 5491 ] }) 5492 ] }) }) }) 5493 ] }); 5494} 5495function PrivacyPolicyPage() { 5496 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 5497 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
5498 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Privacy Policy | SkillForge" }), 5499 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "SkillForge's privacy policy â how we collect, use, and protect your personal information." }), 5500 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "robots", content: "noindex, follow" }), 5501 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/privacy-policy" }), 5502 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 5503 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: "https://skillforge.com/privacy-policy" }), 5504 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Privacy Policy | SkillForge" }), 5505 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "SkillForge's privacy policy â how we collect, use, and protect your personal information." }),
5506 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com/assets/skillforge-logo.jpg" }), 5507 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary" }), 5508 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Privacy Policy | SkillForge" }), 5509 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "SkillForge's privacy policy â how we collect, use, and protect your personal information." }) 5510 ] }), 5511 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "bg-[#4A7A8A] text-white py-14", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 flex items-center gap-4", children: [ 5512 /* @__PURE__ */ jsxRuntimeExports.jsx(Shield, { className: "w-9 h-9 flex-shrink-0 opacity-80" }), 5513 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5514 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold", children: "Privacy Policy" }),
5515 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-white/75 mt-1 text-sm", children: "Last modified: April 27, 2026" }) 5516 ] }) 5517 ] }) }), 5518 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-14 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mx-auto max-w-3xl px-4 sm:px-6 lg:px-8 prose prose-slate max-w-none", children: [ 5519 /* @__PURE__ */ jsxRuntimeExports.jsxs(Section, { title: "What information do we collect?", children: [ 5520 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We collect information from you when you register on our site, place an order, subscribe to our newsletter, respond to a survey, or fill out a form." }), 5521 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "When ordering or registering on our site, as appropriate, you may be asked to enter your name, e-mail address, mailing address, phone number, or credit card information. You may, however, visit our site anonymously." }) 5522 ] }),
5523 /* @__PURE__ */ jsxRuntimeExports.jsxs(Section, { title: "What do we use your information for?", children: [ 5524 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Any of the information we collect from you may be used in one of the following ways:" }), 5525 /* @__PURE__ */ jsxRuntimeExports.jsxs("ul", { children: [ 5526 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 5527 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "To personalize your experience" }), 5528 " â your information helps us to better respond to your individual needs." 5529 ] }), 5530 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 5531 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "To improve our website" }), 5532 " â we continually strive to improve our website offerings based on the information and feedback we receive from you." 5533 ] }), 5534 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 5535 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "To improve customer service" }), 5536 " â your information helps us to more effectively respond to your customer service requests and support needs." 5537 ] }),
5538 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 5539 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "To process transactions" }), 5540 " â your information, whether public or private, will not be sold, exchanged, transferred, or given to any other company for any reason whatsoever, without your consent, other than for the express purpose of delivering the purchased product or service requested." 5541 ] }), 5542 /* @__PURE__ */ jsxRuntimeExports.jsx("li", { children: /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "To administer a contest, promotion, survey, or other site feature." }) }), 5543 /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { children: [ 5544 /* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: "To send periodic emails" }), 5545 " â the email address you provide for order processing may be used to send you information and updates pertaining to your order, in addition to receiving occasional company news, updates, related product or service information, etc." 5546 ] }) 5547 ] }),
5548 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "Note: If at any time you would like to unsubscribe from receiving future emails, we include detailed unsubscribe instructions at the bottom of each email." }) 5549 ] }), 5550 /* @__PURE__ */ jsxRuntimeExports.jsxs(Section, { title: "How do we protect your information?", children: [ 5551 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We implement a variety of security measures to maintain the safety of your personal information when you place an order. We offer the use of a secure server. All supplied sensitive/credit information is transmitted via Secure Socket Layer (SSL) technology and then encrypted into our payment gateway provider's database, accessible only by those authorized with special access rights to such systems, who are required to keep the information confidential." }), 5552 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "After a transaction, your private information (credit cards, social security numbers, financials, etc.) will not be stored on our servers." }) 5553 ] }),
5554 /* @__PURE__ */ jsxRuntimeExports.jsxs(Section, { title: "Do we use cookies?", children: [ 5555 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Yes. Cookies are small files that a site or its service provider transfers to your computer's hard drive through your web browser (if you allow) that enables the site's or service provider's systems to recognize your browser and capture and remember certain information." }), 5556 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We use cookies to help us remember and process the items in your shopping cart and to understand and save your preferences for future visits." }), 5557 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "If you prefer, you can choose to have your computer warn you each time a cookie is being sent, or you can choose to turn off all cookies via your browser settings. Like most websites, if you turn your cookies off, some of our services may not function properly. However, you can still place orders by contacting customer service." }) 5558 ] }),
5559 /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { title: "Do we disclose any information to outside parties?", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our website, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others' rights, property, or safety. However, non-personally identifiable visitor information may be provided to other parties for marketing, advertising, or other uses." }) }), 5560 /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { title: "Third party links", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Occasionally, at our discretion, we may include or offer third-party products or services on our website. These third-party sites have separate and independent privacy policies. We therefore have no responsibility or liability for the content and activities of these linked sites. Nonetheless, we seek to protect the integrity of our site and welcome any feedback about these sites." }) }),
5561 /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { title: "California Online Privacy Protection Act Compliance", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Because we value your privacy we have taken the necessary precautions to be in compliance with the California Online Privacy Protection Act. We therefore will not distribute your personal information to outside parties without your consent." }) }), 5562 /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { title: "Children's Online Privacy Protection Act Compliance", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "We are in compliance with the requirements of COPPA (Children's Online Privacy Protection Act). We do not collect any information from anyone under 13 years of age. Our website, products, and services are all directed to people who are at least 13 years old or older." }) }), 5563 /* @__PURE__ */ jsxRuntimeExports.jsx(Section, { title: "Your Consent", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "By using our site, you consent to our privacy policy." }) }),
5564 /* @__PURE__ */ jsxRuntimeExports.jsxs(Section, { title: "Changes to our Privacy Policy", children: [ 5565 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "If we decide to change our privacy policy, we will post those changes on this page and/or update the Privacy Policy modification date below." }), 5566 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", children: "This policy was last modified on 4/27/2026." }) 5567 ] }), 5568 /* @__PURE__ */ jsxRuntimeExports.jsxs(Section, { title: "Contacting Us", children: [ 5569 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "If there are any questions regarding this privacy policy you may contact us using the information below." }), 5570 /* @__PURE__ */ jsxRuntimeExports.jsxs("address", { className: "not-italic text-sm space-y-1 mt-3 text-foreground", children: [ 5571 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold", children: "SkillForge" }), 5572 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "2118 Plum Grove Rd. #206" }),
5573 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: "Rolling Meadows, IL 60008 USA" }), 5574 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "mailto:[email protected]", className: "text-[#4A7A8A] hover:underline", children: "[email protected]" }) }), 5575 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "tel:+18009713203", className: "text-[#4A7A8A] hover:underline", children: "800-971-3203" }) }) 5576 ] }), 5577 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "mt-6", children: [ 5578 "You can also reach us via our", 5579 " ", 5580 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact-us", className: "text-[#4A7A8A] hover:underline", children: "contact form" }), 5581 "." 5582 ] }) 5583 ] }) 5584 ] }) }) 5585 ] }); 5586} 5587function Section({ 5588 title, 5589 children 5590}) { 5591 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-10", children: [ 5592 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-xl font-semibold text-foreground mb-3 pb-2 border-b border-border", children: title }), 5593 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground space-y-3 text-sm leading-relaxed [&_ul]:list-disc [&_ul]:pl-5 [&_ul]:space-y-2 [&_strong]:text-foreground", children }) 5594 ] }); 5595} 5596const BENEFIT_ICONS = [CircleCheckBig, BookOpen, Users, Award, Calendar, CircleCheckBig]; 5597const SITE_URL = "https://skillforge.com"; 5598function groupAiCourses(courses) { 5599 const leadershipKeywords = ["agentic", "agenticai", "agz", "strategy", "governance", "executive", "leadership", "manager", "management", "bizbiz", "certnexus", "business leader", "transformation"]; 5600 const devKeywords = ["developer", "development", "admin", "administrator", "it pro", "power automate", "power apps", "api", "technical", "engineering", "architect", "devops", "programming", "code", "coding"]; 5601 const leadership = []; 5602 const dev = []; 5603 const business = []; 5604 for (const course of courses) { 5605 const t = course.title.toLowerCase(); 5606 if (leadershipKeywords.some((kw) => t.includes(kw))) { 5607 leadership.push(course); 5608 } else if (devKeywords.some((kw) => t.includes(kw))) { 5609 dev.push(course); 5610 } else { 5611 business.push(course); 5612 } 5613 } 5614 const groups = []; 5615 if (business.length > 0) { 5616 groups.push({ 5617 label: "For Business Users", 5618 description: "Practical AI skills for everyday professionals â learn to use ChatGPT, Claude, Copilot, and generative AI tools to work faster and smarter.", 5619 courses: business 5620 }); 5621 } 5622 if (leadership.length > 0) { 5623 groups.push({ 5624 label: "For Managers & Leadership", 5625 description: "Strategic AI training for leaders â evaluate AI initiatives, govern responsible use, and build an AI-ready organization.", 5626 courses: leadership 5627 }); 5628 } 5629 if (dev.length > 0) { 5630 groups.push({ 5631 label: "For Developers & IT Admins", 5632 description: "Technical AI training for builders and administrators â integrate AI into applications, automate workflows, and manage AI deployments.", 5633 courses: dev 5634 }); 5635 } 5636 return groups; 5637} 5638function CourseCard({ 5639 course 5640}) { 5641 return /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "h-full flex flex-col hover:shadow-lg transition-all hover:-translate-y-1", children: [ 5642 course.imageUrl && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "aspect-video overflow-hidden rounded-t-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: course.imageUrl, alt: course.title, className: "w-full h-full object-cover", width: 400, height: 225, loading: "lazy" }) }), 5643 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { children: [
5644 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 flex-wrap mb-1", children: [ 5645 course.level && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "secondary", children: course.level }), 5646 course.offersPostClassSupport && /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { variant: "outline", className: "text-xs border-primary/40 text-primary", children: "6-mo support" }) 5647 ] }), 5648 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-xl leading-snug", children: course.title }), 5649 /* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { className: "line-clamp-2 prose prose-sm max-w-none prose-p:my-0 prose-p:inline", dangerouslySetInnerHTML: { 5650 __html: course.description 5651 } }) 5652 ] }), 5653 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { className: "flex-grow", children: course.duration && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [ 5654 /* @__P
5654URE__ */ jsxRuntimeExports.jsx(Calendar, { className: "h-4 w-4 shrink-0" }), 5655 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: course.duration }) 5656 ] }) }), 5657 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardFooter, { className: "flex items-center justify-between", children: [ 5658 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-2xl font-bold text-foreground", children: [ 5659 "$", 5660 parseFloat(course.price || "0").toFixed(2) 5661 ] }), 5662 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: course.relativeUrl, children: "View Details" }) }) 5663 ] }) 5664 ] }); 5665} 5666function CategoryPageTemplate({ 5667 data: initialData, 5668 slug, 5669 canonicalPath 5670}) { 5671 const [data2, setData] = reactExports.useState(initialData); 5672 const [loading, setLoading] = reactExports.useState(!initialData); 5673 const [blogIndex, setBlogIndex] = reactExports.useState(0); 5674 const blogIntervalRef = reactExports.useRef(null); 5675 reactExports.useEffect(() => { 5676 if (initialData) { 5677 setData(initialData); 5678 setLoading(false); 5679 return; 5680 } 5681 setData(null); 5682 setLoading(true); 5683 let cancelled = false; 5684 fetch(`/api/category-pages/${encodeURIComponent(slug)}`).then((r) => r.ok ? r.json() : Promise.reject(r.status)).then((json) => { 5685 if (!cancelled) { 5686 setData({ 5687 ...json, 5688 canonicalPath 5689 }); 5690 setLoading(false); 5691 } 5692 }).catch(() => { 5693 if (!cancelled) setLoading(false); 5694 }); 5695 return () => { 5696 cancelled = true; 5697 }; 5698 }, [slug, canonicalPath, initialData]); 5699 reactExports.useEffect(() => { 5700 if (loading || !data2) return; 5701 const hash = window.location.hash.slice(1); 5702 if (!hash) return; 5703 const t = setTimeout(() => { 5704 const el = document.getElementById(hash); 5705 if (el) el.scrollIntoView({ 5706 behavior: "smooth", 5707 block: "start" 5708 }); 5709 }, 120); 5710 return () => clearTimeout(t); 5711 }, [loading, data2]); 5712 if (loading) { 5713 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
5714 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [ 5715 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Loading⦠| SkillForge" }), 5716 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "robots", content: "noindex, nofollow" }) 5717 ] }), 5718 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-[60vh] flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "text-muted-foreground text-lg animate-pulse", children: "Loading..." }) }) 5719 ] }); 5720 } 5721 if (!data2) { 5722 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 5723 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [ 5724 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Training Courses | SkillForge" }), 5725 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Browse instructor-led training courses at SkillForge." }), 5726 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "robots", content: "noindex, nofollow" }) 5727 ] }),
5728 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-[60vh] flex items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center", children: [ 5729 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground text-lg mb-4", children: "Category not found." }), 5730 /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "/courses", className: "text-primary underline", children: "Browse all courses" }) 5731 ] }) }) 5732 ] }); 5733 } 5734 const { 5735 name, 5736 pageTitle, 5737 pageIntro, 5738 metaDescription, 5739 benefits: benefits2, 5740 faq, 5741 courses, 5742 blogPosts 5743 } = data2; 5744 const canonicalUrl = `${SITE_URL}${canonicalPath}`; 5745 const ogImage = `${SITE_URL}/assets/skillforge-logo.jpg`; 5746 const prevBlog = () => { 5747 if (blogIntervalRef.current) clearInterval(blogIntervalRef.current); 5748 setBlogIndex((i) => (i - 1 + blogPosts.length) % blogPosts.length); 5749 }; 5750 const nextBlog = () => { 5751 if (blogIntervalRef.current) clearInterval(blogIntervalRef.current); 5752 setBlogIndex((i) => (i + 1) % blogPosts.length); 5753 }; 5754 const faqItems = faq ? parseFaqForJsonLd(faq) : []; 5755 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 5756 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
5757 /* @__PURE__ */ jsxRuntimeExports.jsxs("title", { children: [ 5758 pageTitle, 5759 " | SkillForge" 5760 ] }), 5761 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: metaDescription || `Live instructor-led ${name} training courses. Small class sizes, expert instructors, hands-on practice.` }), 5762 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: canonicalUrl }), 5763 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: `${pageTitle} | SkillForge` }), 5764 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: metaDescription || "" }), 5765 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: canonicalUrl }), 5766 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 5767 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: ogImage }), 5768 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }),
5769 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: `${pageTitle} | SkillForge` }), 5770 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: metaDescription || "" }), 5771 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: ogImage }), 5772 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 5773 "@context": "https://schema.org", 5774 "@type": "ItemList", 5775 name: pageTitle, 5776 description: metaDescription, 5777 url: canonicalUrl, 5778 numberOfItems: courses.length, 5779 itemListElement: courses.map((c, i) => { 5780 var _a2; 5781 return { 5782 "@type": "ListItem", 5783 position: i + 1, 5784 item: { 5785 "@type": "Course", 5786 name: c.title, 5787 url: `${SITE_URL}${c.relativeUrl}`, 5788 description: (_a2 = c.description) == null ? void 0 : _a2.replace(/<[^>]+>/g, "").slice(0, 300), 5789 provider: { 5790 "@type": "Organization", 5791 name: "SkillForge", 5792 url: SITE_URL 5793 }, 5794 offers: { 5795 "@type": "Offer", 5796 price: c.price, 5797 priceCurrency: "USD", 5798 availability: "https://schema.org/InStock", 5799 url: `${SITE_URL}${c.relativeUrl}` 5800 } 5801 } 5802 }; 5803 }) 5804 }) }),
5805 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 5806 "@context": "https://schema.org", 5807 "@type": "BreadcrumbList", 5808 itemListElement: [{ 5809 "@type": "ListItem", 5810 position: 1, 5811 name: "Home", 5812 item: SITE_URL 5813 }, { 5814 "@type": "ListItem", 5815 position: 2, 5816 name: "Courses", 5817 item: `${SITE_URL}/courses` 5818 }, { 5819 "@type": "ListItem", 5820 position: 3, 5821 name, 5822 item: canonicalUrl 5823 }] 5824 }) }), 5825 faqItems.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify({ 5826 "@context": "https://schema.org", 5827 "@type": "FAQPage", 5828 mainEntity: faqItems.map(({ 5829 q, 5830 a 5831 }) => ({ 5832 "@type": "Question", 5833 name: q, 5834 acceptedAnswer: { 5835 "@type": "Answer", 5836 text: a 5837 } 5838 })) 5839 }) }) 5840 ] }), 5841 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "bg-gradient-to-br from-primary/10 via-background to-accent/10 py-12 px-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "max-w-4xl mx-auto", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(motion.div, { initial: { 5842 opacity: 1, 5843 y: 0 5844 }, animate: { 5845 opacity: 1, 5846 y: 0 5847 }, transition: { 5848 duration: 0.5 5849 }, children: [
5850 /* @__PURE__ */ jsxRuntimeExports.jsxs("nav", { className: "flex items-center gap-2 text-sm text-muted-foreground mb-4", "aria-label": "Breadcrumb", children: [ 5851 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", className: "hover:text-primary transition-colors", children: "All Courses" }), 5852 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { "aria-hidden": "true", children: "/" }), 5853 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-foreground font-medium", children: name }) 5854 ] }), 5855 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl md:text-5xl font-bold mb-4 text-foreground", children: pageTitle }), 5856 slug === "ai" && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-6", children: [ 5857 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xs font-semibold uppercase tracking-widest text-muted-foreground mb-2", children: "Jump to:" }), 5858 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: [{ 5859 label: "Business Users", 5860 anchor: "For Business Users" 5861 }, { 5862 label: "Managers & Leadership", 5863 anchor: "For Managers & Leadership" 5864 }, { 5865 label: "Developers & IT Admins", 5866 anchor: "For Developers & IT Admins" 5867 }].map(({ 5868 label, 5869 anchor 5870 }) => /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: `#${encodeURIComponent(anchor)}`, className: "inline-flex items-center gap-1.5 rounded-full border border-primary/40 bg-background px-4 py-2 text-sm font-medium text-foreground hover:border-primary hover:text-primary transition-colors", children: [ 5871 label,
5872 /* @__PURE__ */ jsxRuntimeExports.jsx(ArrowRight, { className: "h-3.5 w-3.5 opacity-60" }) 5873 ] }, label)) }) 5874 ] }), 5875 pageIntro && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "prose prose-lg max-w-none prose-p:text-muted-foreground prose-p:leading-relaxed prose-p:mb-5 prose-p:text-base prose-strong:text-foreground prose-strong:font-semibold prose-ul:text-muted-foreground prose-ul:mt-2 prose-li:my-1 prose-headings:text-foreground", dangerouslySetInnerHTML: { 5876 __html: pageIntro 5877 } }), 5878 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mt-6 flex flex-wrap gap-3", children: [ 5879 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { size: "lg", asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx("a", { href: "#courses", children: "View Courses" }) }), 5880 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { size: "lg", variant: "outline", asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact-us", children: "Request Private Training" }) }) 5881 ] }) 5882 ] }) }) }), 5883 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { id: "courses", className: "py-20 px-4 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto", children: [
5884 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-12", children: [ 5885 /* @__PURE__ */ jsxRuntimeExports.jsxs("h2", { className: "text-3xl font-bold mb-3", children: [ 5886 name, 5887 " Courses" 5888 ] }), 5889 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-muted-foreground text-lg", children: [ 5890 courses.length, 5891 " course", 5892 courses.length !== 1 ? "s" : "", 5893 " available â all taught live by expert instructors." 5894 ] }) 5895 ] }), 5896 courses.length > 0 ? slug === "ai" ? ( 5897 /* ââ AI: grouped by audience ââ */ 5898 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-16", children: groupAiCourses(courses).map((group) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { id: encodeURIComponent(group.label), children: [ 5899 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8 pb-4 border-b border-border", children: [ 5900 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-2xl font-bold mb-2", children: group.label }),
5901 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: group.description }) 5902 ] }), 5903 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", children: group.courses.map((course) => /* @__PURE__ */ jsxRuntimeExports.jsx(CourseCard, { course }, course.id)) }) 5904 ] }, group.label)) }) 5905 ) : ( 5906 /* ââ All other categories: flat grid ââ */ 5907 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", children: courses.map((course) => /* @__PURE__ */ jsxRuntimeExports.jsx(CourseCard, { course }, course.id)) }) 5908 ) : /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center py-16 border border-dashed rounded-xl", children: [ 5909 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground text-lg", children: "No courses found for this category yet." }), 5910 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { className: "mt-4", asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Browse All Courses" }) }) 5911 ] }) 5912 ] }) }), 5913 benefits2.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 px-4 bg-muted/40", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto", children: [
5914 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center mb-12", children: [ 5915 /* @__PURE__ */ jsxRuntimeExports.jsxs("h2", { className: "text-3xl font-bold mb-3", children: [ 5916 "Why Choose SkillForge for ", 5917 name, 5918 " Training?" 5919 ] }), 5920 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground text-lg max-w-2xl mx-auto", children: "We've been delivering expert-led training since 2010. Here's what sets us apart." }) 5921 ] }), 5922 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6", children: benefits2.map((benefit, index) => { 5923 const Icon2 = BENEFIT_ICONS[index % BENEFIT_ICONS.length]; 5924 return /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "h-full border-0 shadow-sm bg-background", children: [ 5925 /* @__PURE__ */ jsxRuntimeExports.jsx(CardHeader, { className: "pb-3", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
5926 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-2 rounded-lg bg-primary/10", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Icon2, { className: "h-5 w-5 text-primary" }) }), 5927 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base font-semibold", children: benefit.title }) 5928 ] }) }), 5929 /* @__PURE__ */ jsxRuntimeExports.jsx(CardContent, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground leading-relaxed", children: benefit.description }) }) 5930 ] }, index); 5931 }) }) 5932 ] }) }), 5933 blogPosts.length > 0 && /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 px-4 bg-background", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-7xl mx-auto", children: [ 5934 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-end justify-between mb-10", children: [ 5935 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 5936 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold mb-2", children: "From the SkillForge Blog" }),
5937 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-muted-foreground", children: [ 5938 "Tips, tutorials, and insights on ", 5939 name, 5940 "." 5941 ] }) 5942 ] }), 5943 blogPosts.length > 3 && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [ 5944 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "icon", onClick: prevBlog, "aria-label": "Previous post", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronLeft, { className: "h-4 w-4" }) }), 5945 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "icon", onClick: nextBlog, "aria-label": "Next post", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "h-4 w-4" }) }) 5946 ] }) 5947 ] }), 5948 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6 overflow-hidden", children: [0, 1, 2].map((offset) => { 5949 const post = blogPosts[(blogIndex + offset) % blogPosts.length]; 5950 if (!post) return null; 5951 return /* @__PURE__ */ jsxRuntimeExports.jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsxRuntimeExports.jsx(motion.div, { initial: { 5952 opacity: 1, 5953 x: 0 5954 }, animate: { 5955 opacity: 1, 5956 x: 0 5957 }, exit: { 5958 opacity: 0, 5959 x: -20 5960 }, transition: { 5961 duration: 0.35, 5962 delay: offset * 0.05 5963 }, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Card, { className: "h-full flex flex-col hover:shadow-md transition-shadow", children: [ 5964 post.featuredImage && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "aspect-video overflow-hidden rounded-t-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: post.featuredImage, alt: post.title, className: "w-full h-full object-cover", width: 400, height: 225, loading: "lazy" }) }),
5965 /* @__PURE__ */ jsxRuntimeExports.jsxs(CardHeader, { className: "flex-grow", children: [ 5966 /* @__PURE__ */ jsxRuntimeExports.jsx(CardTitle, { className: "text-base font-semibold leading-snug line-clamp-2", children: post.title }), 5967 post.excerpt && /* @__PURE__ */ jsxRuntimeExports.jsx(CardDescription, { className: "line-clamp-3 text-sm prose prose-sm max-w-none prose-p:my-0", dangerouslySetInnerHTML: { 5968 __html: post.excerpt 5969 } }) 5970 ] }), 5971 /* @__PURE__ */ jsxRuntimeExports.jsx(CardFooter, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { variant: "outline", size: "sm", asChild: true, className: "w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: `/${post.slug}`, children: "Read Article" }) }) }) 5972 ] }) }) }, `${blogIndex}-${offset}`); 5973 }) }), 5974 blogPosts.length > 3 && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center gap-2 mt-8", children: blogPosts.map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => { 5975 if (blogIntervalRef.current) clearInterval(blogIntervalRef.current); 5976 setBlogIndex(i); 5977 }, className: `w-2 h-2 rounded-full transition-all ${i === blogIndex % blogPosts.length ? "bg-primary w-6" : "bg-muted-foreground/30"}`, "aria-label": `Go to post ${i + 1}` }, i)) }) 5978 ] }) }), 5979 faq && /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 px-4 bg-muted/30", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-3xl mx-auto", children: [
5980 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3 mb-8", children: [ 5981 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleHelp, { className: "h-6 w-6 text-primary flex-shrink-0" }), 5982 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold", children: "Frequently Asked Questions" }) 5983 ] }), 5984 /* @__PURE__ */ jsxRuntimeExports.jsx(FaqAccordion, { html: faq }) 5985 ] }) }), 5986 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 px-4 bg-primary text-primary-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-3xl mx-auto text-center", children: [ 5987 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold mb-4", children: "Ready to Get Started?" }), 5988 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-primary-foreground/80 text-lg mb-8", children: "Join thousands of professionals who've advanced their careers with SkillForge training." }), 5989 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap justify-center gap-4", children: [
5990 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { size: "lg", variant: "secondary", asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsxs("a", { href: "#courses", children: [ 5991 "Browse ", 5992 name, 5993 " Courses" 5994 ] }) }), 5995 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { size: "lg", variant: "outline", className: "border-primary-foreground/40 text-primary-foreground hover:bg-primary-foreground/10", asChild: true, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact-us", children: "Talk to Us" }) }) 5996 ] }) 5997 ] }) }) 5998 ] }); 5999} 6000function CategoryPage$F() { 6001 const data2 = useLoaderData(); 6002 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "ai", canonicalPath: "/course-categories/ai" }); 6003} 6004function CategoryPage$E() { 6005 const data2 = useLoaderData(); 6006 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "adobe", canonicalPath: "/course-categories/adobe" }); 6007} 6008function CategoryPage$D() { 6009 const data2 = useLoaderData(); 6010 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "acrobat", canonicalPath: "/course-categories/adobe/acrobat" }); 6011} 6012function CategoryPage$C() { 6013 const data2 = useLoaderData(); 6014 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "illustrator", canonicalPath: "/course-categories/adobe/illustrator" }); 6015} 6016function CategoryPage$B() { 6017 const data2 = useLoaderData(); 6018 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "indesign", canonicalPath: "/course-categories/adobe/indesign" }); 6019} 6020function CategoryPage$A() { 6021 const data2 = useLoaderData(); 6022 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "photoshop", canonicalPath: "/course-categories/adobe/photoshop" }); 6023} 6024function CategoryPage$z() { 6025 const data2 = useLoaderData(); 6026 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "business-skills", canonicalPath: "/course-categories/business-skills" }); 6027} 6028function CategoryPage$y() { 6029 const data2 = useLoaderData(); 6030 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "communication-skills", canonicalPath: "/course-categories/business-skills/communication-skills" }); 6031} 6032function CategoryPage$x() { 6033 const data2 = useLoaderData(); 6034 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "customer-service", canonicalPath: "/course-categories/business-skills/customer-service" }); 6035} 6036function CategoryPage$w() { 6037 const data2 = useLoaderData(); 6038 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "presentation-skills", canonicalPath: "/course-categories/business-skills/presentation-skills" }); 6039} 6040function CategoryPage$v() { 6041 const data2 = useLoaderData(); 6042 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "time-management", canonicalPath: "/course-categories/business-skills/time-management" }); 6043} 6044function CategoryPage$u() { 6045 const data2 = useLoaderData(); 6046 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "crystal-reports", canonicalPath: "/course-categories/crystal-reports" }); 6047} 6048function CategoryPage$t() { 6049 const data2 = useLoaderData(); 6050 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "introduction", canonicalPath: "/course-categories/crystal-reports/introduction" }); 6051} 6052function CategoryPage$s() { 6053 const data2 = useLoaderData(); 6054 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "intermediate", canonicalPath: "/course-categories/crystal-reports/intermediate" }); 6055} 6056function CategoryPage$r() { 6057 const data2 = useLoaderData(); 6058 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "microsoft", canonicalPath: "/course-categories/microsoft" }); 6059} 6060function CategoryPage$q() { 6061 const data2 = useLoaderData(); 6062 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "excel", canonicalPath: "/course-categories/microsoft/excel" }); 6063} 6064function CategoryPage$p() { 6065 const data2 = useLoaderData(); 6066 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "word", canonicalPath: "/course-categories/microsoft/word" }); 6067} 6068function CategoryPage$o() { 6069 const data2 = useLoaderData(); 6070 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "powerpoint", canonicalPath: "/course-categories/microsoft/powerpoint" }); 6071} 6072function CategoryPage$n() { 6073 const data2 = useLoaderData(); 6074 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "access", canonicalPath: "/course-categories/microsoft/access" }); 6075} 6076function CategoryPage$m() { 6077 const data2 = useLoaderData(); 6078 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "outlook", canonicalPath: "/course-categories/microsoft/outlook" }); 6079} 6080function CategoryPage$l() { 6081 const data2 = useLoaderData(); 6082 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "project", canonicalPath: "/course-categories/microsoft/project" }); 6083} 6084function CategoryPage$k() { 6085 const data2 = useLoaderData(); 6086 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "sharepoint", canonicalPath: "/course-categories/microsoft/sharepoint" }); 6087} 6088function CategoryPage$j() { 6089 const data2 = useLoaderData(); 6090 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "power-bi", canonicalPath: "/course-categories/microsoft/power-bi" }); 6091} 6092function CategoryPage$i() { 6093 const data2 = useLoaderData(); 6094 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "copilot", canonicalPath: "/course-categories/microsoft/copilot" }); 6095} 6096function CategoryPage$h() { 6097 const data2 = useLoaderData(); 6098 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "teams", canonicalPath: "/course-categories/microsoft/teams" }); 6099} 6100function CategoryPage$g() { 6101 const data2 = useLoaderData(); 6102 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "microsoft-technical", canonicalPath: "/course-categories/microsoft-technical" }); 6103} 6104function CategoryPage$f() { 6105 const data2 = useLoaderData(); 6106 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "azure", canonicalPath: "/course-categories/microsoft-technical/azure" }); 6107} 6108function CategoryPage$e() { 6109 const data2 = useLoaderData(); 6110 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "powershell", canonicalPath: "/course-categories/microsoft-technical/powershell" }); 6111} 6112function CategoryPage$d() { 6113 const data2 = useLoaderData(); 6114 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "microsoft-365", canonicalPath: "/course-categories/microsoft-technical/microsoft-365" }); 6115} 6116function CategoryPage$c() { 6117 const data2 = useLoaderData(); 6118 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "power-apps", canonicalPath: "/course-categories/microsoft-technical/power-apps" }); 6119} 6120function CategoryPage$b() { 6121 const data2 = useLoaderData(); 6122 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "power-automate", canonicalPath: "/course-categories/microsoft-technical/power-automate" }); 6123} 6124function CategoryPage$a() { 6125 const data2 = useLoaderData(); 6126 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "security", canonicalPath: "/course-categories/microsoft-technical/security" }); 6127} 6128function CategoryPage$9() { 6129 const data2 = useLoaderData(); 6130 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "project-management", canonicalPath: "/course-categories/project-management" }); 6131}
6132function CategoryPage$8() { 6133 const data2 = useLoaderData(); 6134 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "agile-and-scrum", canonicalPath: "/course-categories/project-management/agile-and-scrum" }); 6135} 6136function CategoryPage$7() { 6137 const data2 = useLoaderData(); 6138 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "project-management-training", canonicalPath: "/course-categories/project-management/project-management-training" }); 6139} 6140function CategoryPage$6() { 6141 const data2 = useLoaderData(); 6142 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "sql", canonicalPath: "/course-categories/sql" }); 6143} 6144function CategoryPage$5() { 6145 const data2 = useLoaderData(); 6146 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "sql-introduction", canonicalPath: "/course-categories/sql/sql-introduction" }); 6147} 6148function CategoryPage$4() { 6149 const data2 = useLoaderData(); 6150 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "sql-advanced", canonicalPath: "/course-categories/sql/sql-advanced" }); 6151} 6152function CategoryPage$3() { 6153 const data2 = useLoaderData(); 6154 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "introduction-to-sql-databases", canonicalPath: "/course-categories/sql/introduction-to-sql-databases" }); 6155} 6156function CategoryPage$2() { 6157 const data2 = useLoaderData(); 6158 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "tableau", canonicalPath: "/course-categories/tableau" }); 6159} 6160function CategoryPage$1() { 6161 const data2 = useLoaderData(); 6162 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "tableau-introduction", canonicalPath: "/course-categories/tableau/tableau-introduction" }); 6163} 6164function CategoryPage() { 6165 const data2 = useLoaderData(); 6166 return /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPageTemplate, { data: data2, slug: "tableau-intermediate", canonicalPath: "/course-categories/tableau/tableau-intermediate" }); 6167} 6168let landingPages$1 = []; 6169function setLandingPages(pages2) { 6170 landingPages$1 = pages2; 6171} 6172function getPageBySlugUnfiltered(slug) { 6173 return landingPages$1.find((p) => p.slug === slug) || null; 6174} 6175const schemas = { 6176 data: { 6177 landingPages: arrayType(objectType({ 6178 "id": stringType(), 6179 "slug": stringType(), 6180 "componentPath": stringType(), 6181 "startDate": stringType(), 6182 "endDate": stringType(), 6183 "status": stringType(), 6184 "campaignId": stringType() 6185 })) 6186 }, 6187 pages: { 6188 microsoft_copilot_training: objectType({ 6189 "hero": objectType({ 6190 "badge": stringType(), 6191 "title": stringType(), 6192 "lead": stringType(), 6193 "supporting": stringType(), 6194 "cta": stringType() 6195 }), 6196 "benefits": objectType({ 6197 "title": stringType(), 6198 "body": stringType(), 6199 "items": arrayType(objectType({ 6200 "title": stringType(), 6201 "body": stringType(), 6202 "id": stringType() 6203 })) 6204 }), 6205 "learning": objectType({ 6206 "title": stringType(), 6207 "body": stringType(), 6208 "outcomes": arrayType(objectType({ 6209 "text": stringType(), 6210 "id": stringType() 6211 })) 6212 }), 6213 "details": objectType({ 6214 "title": stringType(), 6215 "rows": arrayType(objectType({ 6216 "label": stringType(), 6217 "value": stringType(), 6218 "id": stringType() 6219 })), 6220 "cta": stringType() 6221 }), 6222 "audience": objectType({ 6223 "title": stringType(), 6224 "body": stringType(), 6225 "items": arrayType(objectType({ 6226 "text": stringType(), 6227 "id": stringType() 6228 })), 6229 "asideLabel": stringType(), 6230 "asideTitle": stringType(), 6231 "asideBody": stringType() 6232 }), 6233 "courses": objectType({ 6234 "title": stringType(), 6235 "body": stringType(), 6236 "items": arrayType(objectType({ 6237 "title": stringType(), 6238 "description": stringType(), 6239 "href": stringType(), 6240 "id": stringType() 6241 })), 6242 "cta": stringType() 6243 }), 6244 "finalCta": objectType({ 6245 "title": stringType(), 6246 "body": stringType(), 6247 "primaryCta": stringType(), 6248 "secondaryCta": stringType(), 6249 "questions": stringType(), 6250 "contact": stringType() 6251 }) 6252 }), 6253 manual_viewer: objectType({ 6254 "gate": objectType({ 6255 "title": stringType(), 6256 "description": stringType(), 6257 "codePlaceholder": stringType(), 6258 "codeLabel": stringType(), 6259 "unlockButton": stringType() 6260 }) 6261 }) 6262 } 6263}; 6264const identity = { parse: (v) => v }; 6265const pages = { 6266 "manual_viewer": (((_a = schemas.pages) == null ? void 0 : _a.manual_viewer) ?? schemas.manual_viewer ?? identity).parse({ 6267 "gate": { 6268 "title": "Access Required", 6269 "description": "Enter your access code to view this manual.", 6270 "codePlaceholder": "Enter access code", 6271 "codeLabel": "Access Code", 6272 "unlockButton": "Unlock Manual" 6273 } 6274 }), 6275 "microsoft_copilot_training": (((_b = schemas.pages) == null ? void 0 : _b.microsoft_copilot_training) ?? schemas.microsoft_copilot_training ?? identity).parse({ 6276 "hero": { 6277 "badge": "Live Instructor-Led Training · Three Copilot Courses · $245 each", 6278 "title": "Microsoft Copilot training for the work you do every day", 6279 "lead": "Choose a focused, instructor-led course for Excel, PowerPoint, or finance workflows â and start using Copilot with greater clarity and confidence.", 6280 "supporting": "Live instructor. Small class. Real workplace scenarios. Leave with practical skills you can put to work right away.", 6281 "cta": "Explore the courses" 6282 }, 6283 "benefits": { 6284 "title": "Why take Microsoft Copilot training?", 6285 "body": "Copilot is already part of the Microsoft 365 tools many professionals use every day. These focused courses show you how to get useful results while keeping your expertise and judgment in the loop.", 6286 "items": [ 6287 { 6288 "title": "Save time on routine work", 6289 "body": "Use Copilot to create stronger first drafts, summarize information, and speed up tasks that normally take more time.", 6290 "id": "vygJ71nKoPZ4WF93g14rx" 6291 }, 6292 { 6293 "title": "Work with more confidence", 6294 "body": "Learn how to give Copilot useful context, evaluate its output, and make the results fit the job at hand.", 6295 "id": "PzhIthm1Salhdmozvn-A9" 6296 }, 6297 { 6298 "title": "Practical from the first hour", 6299 "body": "Follow real workplace examples with a live instructor, so you build habits you can use the same day.", 6300 "id": "dsK6PDUhQbSY2aIdN0nHs" 6301 } 6302 ] 6303 }, 6304 "learning": { 6305 "title": "What you'll learn", 6306 "body": "The core Copilot practices that carry across Microsoft 365, taught in the order you would actually use them.", 6307 "outcomes": [ 6308 { 6309 "text": "Write clear, specific prompts that get better results", 6310 "id": "tHElaMNTZfy-cw2MQeTL9" 6311 }, 6312 { 6313 "text": "Use Copilot to draft, summarize, analyze, and refine work", 6314 "id": "FIGMUYkVr_gWPZS1X4Y9j" 6315 }, 6316 { 6317 "text": "Review AI output for accuracy, context, and audience",
6318 "id": "2DgK_H-zIFs2o_32SP-TR" 6319 }, 6320 { 6321 "text": "Apply Copilot in Excel and PowerPoint workflows", 6322 "id": "EEltNH-NYUIc-EAhlr7jY" 6323 }, 6324 { 6325 "text": "Build repeatable habits for using Copilot responsibly", 6326 "id": "48YHqIiM1_1vT77E29f5e" 6327 } 6328 ] 6329 }, 6330 "details": { 6331 "title": "Course details", 6332 "rows": [ 6333 { 6334 "label": "Format", 6335 "value": "Live online or onsite at your location", 6336 "id": "YRTirwPKBEt1lKUA-rKkH" 6337 }, 6338 { 6339 "label": "Duration", 6340 "value": "4 hours (half day)", 6341 "id": "mP0UaH9w7wp1YQbapRa-j" 6342 }, 6343 { 6344 "label": "Class size", 6345 "value": "Small class sizes", 6346 "id": "bezsrDm0PNntl0h-46sVx" 6347 }, 6348 { 6349 "label": "Level", 6350 "value": "Introductory", 6351 "id": "nxLPeQ77uz2BNHxsG7NB5" 6352 }, 6353 { 6354 "label": "Price", 6355 "value": "$245 per person", 6356 "id": "PdbSI7ON9e8pcNf7Wi1xH" 6357 }, 6358 { 6359 "label": "Copilot requirement", 6360 "value": "A paid Microsoft 365 Copilot add-on is required â not Microsoft 365 with Copilot Chat alone. Look for the Copilot icon floating on screen or in your app ribbon to confirm you have it.", 6361 "id": "WwIVElS16hC8TjNLFSC4U" 6362 } 6363 ], 6364 "cta": "View all courses" 6365 }, 6366 "audience": { 6367 "title": "Who should attend?", 6368 "body": "These courses are designed for professionals who use Microsoft 365 and want practical, responsible ways to bring Copilot into their daily work.", 6369 "items": [ 6370 { 6371 "text": "Excel users who want help with formulas, analysis, and reporting", 6372 "id": "Gdp_CmgbaApr70OF0CmTj" 6373 }, 6374 { 6375 "text": "Finance professionals working with models, budgets, and data", 6376 "id": "oa-YfYia98Vo8DEgOyr1V" 6377 }, 6378 { 6379 "text": "Professionals who create documents, summaries, or presentations", 6380 "id": "iVtboJVnbs0jXFMqUlLUd" 6381 }, 6382 { 6383 "text": "Teams looking for a shared, thoughtful approach to Copilot", 6384 "id": "0UjXGrV3YdfqBKeMfltPO" 6385 } 6386 ], 6387 "asideLabel": "Not sure where to begin?", 6388 "asideTitle": "Start with the Microsoft application that is most central to your day.", 6389 "asideBody": "Choose Excel for data and reporting, Finance for advanced spreadsheet workflows, or PowerPoint for creating stronger presentations. No previous Copilot experience is required." 6390 }, 6391 "courses": { 6392 "title": "Choose your Copilot course", 6393 "body": "Choose live online training or bring the course onsite to your location. Pick the course that fits the work you want to improve.", 6394 "items": [ 6395 { 6396 "title": "Using Copilot in Excel", 6397 "description": "Use plain-English prompts for formulas, analysis, summaries, and spreadsheet tasks.", 6398 "href": "/courses/copilot-excel", 6399 "id": "pfCKaU5mcuPEH9Mo6Sz6m" 6400 }, 6401 { 6402 "title": "Copilot in Excel for Finance Professionals", 6403 "description": "Apply Copilot to finance-focused Excel workflows, analysis, and reporting.", 6404 "href": "/courses/copilot-excel-finance", 6405 "id": "wiUPEHNugMgDXMUCpueLn" 6406 }, 6407 { 6408 "title": "Using Copilot in PowerPoint", 6409 "description": "Create clearer presentation content, structure, and speaker-ready materials.", 6410 "href": "/courses/copilot-powerpoint", 6411 "id": "kcGZpOoQ3i55iNm51zw3b" 6412 } 6413 ], 6414 "cta": "View course dates and enroll" 6415 }, 6416 "finalCta": { 6417 "title": "Ready to make Copilot useful?", 6418 "body": "Choose a live SkillForge course and build practical skills for the Microsoft 365 work you already do.", 6419 "primaryCta": "Explore Copilot courses", 6420 "secondaryCta": "Browse all courses", 6421 "questions": "Questions?", 6422 "contact": "Contact us" 6423 } 6424 }) 6425}; 6426const data = { 6427 "blog": (((_c = schemas.data) == null ? void 0 : _c.blog) ?? schemas.blog ?? identity).parse([ 6428 { 6429 "slug": "copilot-excel-less-painful", 6430 "campaignId": "7jvkst38abi2", 6431 "id": "blog-post-nw31f4csvv8x", 6432 "title": "5 Ways Microsoft Copilot Makes Excel Less Painful", 6433 "publishedAt": "2026-09-07T04:00:00.000Z", 6434 "published": true, 6435 "tags": [ 6436 "Microsoft Copilot", 6437 "Excel", 6438 "Productivity", 6439 "AI Tools", 6440 "Microsoft 365" 6441 ], 6442 "excerpt": "From writing formulas to summarizing data, here are five real ways Copilot in Excel cuts the tedious work out of your day â with step-by-step examples you can try right now.", 6443 "featuredImage": "/airo-assets/images/blog/copilot-excel-less-painful", 6444 "imageUrl": "/airo-assets/images/blog/copilot-excel-less-painful", 6445 "content": `If you've spent any time in Excel, you know the feeling: a deadline is approaching, your spreadsheet is a mess, and
6445you're staring at a formula that refuses to cooperate. Microsoft Copilot won't fix your deadline, but it will fix the formula â and a lot more besides. 6446 6447Copilot is an AI assistant built directly into Excel as part of Microsoft 365. It understands natural language, which means you can describe what you want in plain English and it figures out the how. No syntax memorization. No tutorial rabbit holes. Just results. 6448 6449Here are five ways Copilot in Excel is changing how professionals work with data every day â along with concrete examples and prompts you can use immediately. 6450 6451--- 6452 6453## 1. Write formulas in plain English 6454 6455This is the one that gets people. Instead of hunting through documentation to remember the exact syntax for \`XLOOKUP\`, \`SUMIFS\`, or \`INDEX/MATCH\`, you just describe what you want and Copilot writes the formula for you. 6456 6457### How to do it 6458 64591. Open your Excel workbook and make sure your data is formatted as a table (select your data range, then press **Ctrl + T**). Copilot works best with structured tables. 64602. Click the **Copilot** button in the Home ribbon (you'll see it on the far right). 64613. In the Copilot panel that opens, type your request in plain English. 64624. Review the formula Copilot suggests, then click **Insert Column** or **Copy** to use it. 6463 6464### Example prompts to try 6465 6466- *"Add a column that shows the total sales for each rep where the region is East."* 6467- *"Show me the average order value for customers who placed more than three orders."* 6468- *"Create a formula that flags any row where the margin is below 15%."* 6469 6470Copilot writes the formula, explains what it does, and lets you insert it with one click. If the result isn't quite right, you can refine it conversationally â type *"adjust that to only include orders from Q3"* and it updates accordingly. No Stack Overflow required. 6471 6472This is especially powerful for functions that are genuinely hard to remember: \`XLOOKUP\` with multiple conditions, nested \`IF\` statements, or anything involving \`INDIRECT\` or \`OFFSET\`. You describe the logic; Copilot handles the syntax. 6473 6474--- 6475 6476## 2. Summarize large datasets instantly 6477 6478Got a table with thousands of rows and a manager asking for a quick read on what's in it? Copilot can give you a plain-language summary â key trends, outliers, totals, and patterns â without you building a single pivot table. 6479 6480### How to do it 6481 64821. With your data table selected, open the Copilot panel. 64832. Ask for a summary in plain language. 64843. Copilot returns a written analysis. You can follow up with more specific questions to drill deeper. 6485 6486### Example prompts to try 6487 6488- *"Summarize this data. What are the main trends?"* 6489- *"Which product category has the highest average revenue per order?"* 6490- *"What does this dataset tell me about customer behavior over the last six months?"* 6491- *"Give me a three-sentence executive summary of this sales data."* 6492 6493This is particularly useful when you inherit someone else's spreadsheet and need to get oriented quickly. Instead of spending 20 minutes reverse-engineering what the data represents and how it's structured, you ask Copilot and get a plain-English briefing in seconds. 6494 6495It's not a replacement for deep analysis â but for a quick "what am I looking at here?" it's remarkably fast, and it often surfaces things you'd have missed on a first pass. 6496 6497--- 6498 6499## 3. Highlight and explain anomalies 6500 6501One of the more underrated Copilot capabilities is anomaly detection. You can ask it to scan your data and flag things that look unusual â a spike in a metric, a missing value pattern, a number that's way outside the norm â and it explains what it found in plain language. 6502 6503### How to do it 6504 65051. Open the Copilot panel with your data table active. 65062. Ask Copilot to look for anomalies, outliers, or unusual patterns. 65073. Copilot highlights the relevant rows or cells and explains what it found and why it flagged them. 6508 6509### Example prompts to try 6510 6511- *"Are there any outliers in the revenue column?"* 6512- *"Flag any rows where the order quantity seems unusually high compared to the rest of the data."* 6513- *"Are there any missing values or gaps in this dataset I should know about?"* 6514- *"Which months show a significant deviation from the average? Explain why they stand out."* 6515 6516The key difference from just sorting a column is context. Copilot doesn't just highlight a cell â it tells you *why* it's unusual relative to the rest of the data. For anyone doing financial review, operations reporting, or quality control, this alone can save significant time and catch errors that would otherwise slip through. 6517 6518--- 6519 6520## 4. Clean messy data without formulas 6521 6522Inconsistent date formats. Mixed capitalization. Extra spaces. Duplicate entries. Columns that should be split. These are the small annoyances that eat up disproportionate amounts of time â and they're exactly the kind of tedious, repetitive work that Copilot handles well. 6523 6524### How to do it 6525
65261. Open the Copilot panel with your messy data table selected. 65272. Describe the problem in plain English. 65283. Copilot suggests the fix â often as a new column or a transformation you can apply with one click. 6529 6530### Example prompts to try 6531 6532- *"Standardize the date format in the Order Date column to MM/DD/YYYY."* 6533- *"The City column has inconsistent capitalization â fix it so every city name is title case."* 6534- *"Split the Full Name column into separate First Name and Last Name columns."* 6535- *"Find and remove duplicate rows based on the Customer ID column."* 6536- *"The phone numbers in column D have inconsistent formatting â strip everything except the digits."* 6537 6538Before Copilot, fixing these issues meant writing \`TRIM\`, \`PROPER\`, \`TEXT\`, \`LEFT\`, \`RIGHT\`, and \`SUBSTITUTE\` formulas â or doing it manually. Now you describe the problem and Copilot proposes the solution. You review it, apply it, and move on. 6539 6540--- 6541 6542## 5. Generate charts and visualizations on demand 6543 6544Instead of manually selecting data ranges, choosing a chart type, adjusting axes, and tweaking labels, you can ask Copilot to create a visualization and it builds it for you. You can then refine it from there. 6545 6546### How to do it 6547 65481. Open the Copilot panel with your data table active. 65492. Describe the chart you want â what data to show, what type of chart, and any grouping or filtering. 65503. Copilot generates the chart and inserts it into your workbook. You can ask it to adjust the chart type, change colors, or add a title. 6551 6552### Example prompts to try 6553 6554- *"Create a bar chart comparing monthly revenue by region for Q3."* 6555- *"Show me a line chart of weekly sales over the past 12 months."* 6556- *"Build a pie chart showing the revenue breakdown by product category."* 6557- *"Create a chart that shows the top 10 customers by total spend."* 6558- *"Add a trendline to the sales chart and label the highest and lowest months."* 6559 6560This is particularly useful for people who need to produce reports regularly but aren't Excel power users. The chart creation workflow in Excel has always had a learning curve â choosing the right chart type, getting the data range right, formatting axes. Copilot collapses most of that into a single conversational request. 6561 6562--- 6563 6564## Putting it all together: a real-world example 6565 6566Say you've just received a monthly sales export from your CRM â 3,000 rows, inconsistent formatting, and your manager wants a summary and a chart by end of day. 6567 6568Here's how you'd work through it with Copilot: 6569 65701. **Clean the data first.** *"Standardize the date format in the Sale Date column and fix the capitalization in the Region column."* 65712. **Get oriented.** *"Summarize this dataset. What are the top-performing regions and products?"* 65723. **Check for problems.** *"Are there any anomalies in the revenue figures I should flag before I send this to my manager?"* 65734. **Build the formula you need.** *"Add a column showing each rep's revenue as a percentage of their region's total."* 65745. **Create the chart.** *"Build a bar chart comparing total revenue by region for this month."* 6575 6576What used to take 90 minutes of formula-writing, pivot table building, and manual cleanup now takes 15. That's the real value proposition of Copilot in Excel â not that it does things you couldn't do before, but that it removes the friction from things you were already doing. 6577 6578--- 6579 6580## What you need to get started 6581 6582To use Copilot in Excel, you need: 6583 6584- **Microsoft 365 Copilot license** â this is separate from a standard Microsoft 365 subscription. Check with your IT department or Microsoft 365 admin to confirm your organization has it enabled. 6585- **Excel for Microsoft 365** â the desktop app (Windows or Mac) or Excel on the web. Copilot is not available in older standalone versions of Excel. 6586- **Data formatted as a table** â Copilot works best when your data is in a proper Excel table (Ctrl + T). It can work with regular ranges, but table formatting gives it more context to work with. 6587 6588If you're not sure whether your organization has Copilot licenses, the easiest way to check is to open Excel and look for the Copilot button in the Home ribbon. If it's there and active, you're good to go. 6589 6590--- 6591 6592The common thread across all five of these is time. Copilot doesn't replace Excel knowledge â it removes the friction that slows you down when you already know what you want to accomplish. The more you use it, the more natural it becomes to reach for it first. 6593 6594If you want to see all of this in action with a live instructor â working through real examples, asking questions, and building the habit in a structured environment â [our half-day Copilot in Excel training](/lp/copilot-excel-awareness?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_wY-6NGGGDJAKBXsOgA3SMqQ-O8xcWnwRaIJJvzaf_xE&utm_content=act_glcwGqiyEzTcVJ68nyVScmLn8DcslC264oHXa5Y5Fws&utm_term=topic_copilot-excel) covers each of these areas hands-on. Sessions run from September through December 2026, with morning and afternoon options available. Maximum 20 participants per session so everyone gets time with the instructor. 6595 6596--- 6597 6598## Take the same practical approach into PowerPoint 6599 6600Excel is often the fastest place to see Copilotâs value because the work is concrete: clean the data, ask a question, review a formula, and create a chart. The same prompt-and-review habit matters in PowerPoint. 6601
6602Try this simple workflow when you need to turn an approved Excel summary into a presentation: 6603 66041. **Start with reviewed numbers.** Confirm the totals, labels, and key takeaway in Excel before asking Copilot to help you communicate them. 66052. **Give Copilot a clear audience.** Ask for a concise outline for a leadership update, a customer discussion, or a team meeting. 66063. **Request a structure, not blind automation.** Try: *âCreate a five-slide outline that explains the Q3 sales trend, the main driver, and the decision we need from leadership.â* 66074. **Review every claim and visual.** Check that the narrative matches the Excel source and that the slides use the right level of detail. 6608 6609That is the core skill across both courses: use Copilot to get a stronger starting point, then apply your judgment before anything is shared. [Explore live Copilot training for Excel and PowerPoint](/lp/microsoft-copilot-training?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_hpuKwX7YPBDTy2b-6Mwu0SbMsMmGOGPd_bb7GgIF-4s&utm_content=act_te21S83Rg7FCVkaQWqnhmRrEb1a3n1ICiUi8z3ylpn8&utm_term=topic_copilot-excel-powerpoint-workflow).` 6610 }, 6611 { 6612 "slug": "copilot-excel-worth-learning", 6613 "campaignId": "7jvkst38abi2", 6614 "id": "blog-post-1mhz5bt33hl2", 6615 "title": "Is Copilot in Excel Worth Learning? Here's What to Expect", 6616 "publishedAt": "2026-09-09T04:00:00.000Z", 6617 "published": true, 6618 "tags": [ 6619 "Microsoft Copilot", 6620 "Excel", 6621 "Professional Development", 6622 "AI Tools", 6623 "Training" 6624 ], 6625 "excerpt": "Wondering whether learning Copilot in Excel is worth your time? Here's an honest look at what it can and can't do, who benefits most, and how to get up to speed quickly.", 6626 "featuredImage": "/airo-assets/images/blog/copilot-excel-worth-learning", 6627 "imageUrl": "/airo-assets/images/blog/copilot-excel-worth-learning", 6628 "content": `Every few years a new tool comes along that promises to change how you work. Most of them don't. Microsoft Copilot in Excel is different â but it's worth being clear-eyed about what "different" actually means before you invest time in learning it. 6629 6630This post gives you an honest look at what Copilot in Excel can do, who benefits most, what it won't do, and how to actually get started â including the specific steps to take on your first day using it. 6631 6632--- 6633 6634## What Copilot in Excel actually does 6635 6636Copilot is an AI assistant built into Excel as part of the Microsoft 365 Copilot subscription. It sits in a panel on the right side of your screen and lets you interact with your spreadsheets using natural language. 6637 6638In practical terms, that means you can: 6639 6640- **Ask for formulas** by describing what you want in plain English, and Copilot writes the syntax for you 6641- **Get a plain-language summary** of what's in a dataset without building pivot tables 6642- **Request charts and visualizations** by describing what you want to show 6643- **Find anomalies and outliers** by asking Copilot to scan your data for unusual patterns 6644- **Clean and transform data** by describing the problem â inconsistent formatting, duplicate rows, columns that need splitting â and letting Copilot propose the fix 6645 6646It's not magic. It works best when your data is reasonably well-structured (ideally formatted as an Excel table) and your requests are clear and specific. But within those parameters, it's genuinely fast and useful in ways that matter for day-to-day work. 6647 6648--- 6649 6650## Who benefits most from Copilot in Excel 6651 6652Not everyone will get the same value from Copilot. Here's an honest breakdown of who benefits most â and why. 6653 6654### Regular Excel users who aren't power users 6655 6656If you use Excel daily but don't consider yourself an expert, Copilot closes a lot of the gap. Tasks that previously required knowing advanced functions â \`XLOOKUP\`, nested \`IF\` statements, \`SUMPRODUCT\` â are now accessible through plain-English requests. You describe the logic; Copilot handles the syntax. 6657 6658This doesn't mean you can skip learning Excel fundamentals. Understanding what a formula is doing is still important, especially before you rely on it for financial calculations. But Copilot dramatically lowers the barrier to getting things done. 6659 6660### People who produce recurring reports 6661 6662If you build the same reports week after week â sales summaries, operational dashboards, financial reviews â Copilot can dramatically speed up the repetitive parts: summarizing data, generating charts, formatting outputs. The first time you build a report with Copilot's help, you'll notice the difference. By the third or fourth time, the workflow becomes second nature. 6663 6664### Anyone who inherits spreadsheets 6665 6666Getting oriented in someone else's workbook is tedious. You don't know
6666what the columns mean, how the formulas work, or what the data represents. Copilot can explain what's in a dataset, describe the structure of a formula, and help you understand the logic behind a workbook you didn't build. What used to take 30 minutes of reverse-engineering can take five. 6667 6668### Finance, operations, and HR professionals 6669 6670These roles tend to involve a lot of data work that isn't highly technical but is time-consuming: reconciling figures, flagging anomalies, producing summaries, cleaning exports from other systems. Copilot handles a lot of that middle ground well â the work that's too repetitive to be interesting but too important to skip. 6671 6672### Managers and team leads who need data on demand 6673 6674If you regularly need to pull quick answers from data â "what's our close rate this quarter compared to last?" â but don't have time to build a proper analysis, Copilot lets you ask the question directly and get an answer in plain language. It's not a replacement for a data analyst, but for ad-hoc questions it's remarkably capable. 6675 6676--- 6677 6678## What Copilot in Excel won't do 6679 6680Being honest about the limitations matters, because overpromising leads to frustration. 6681 6682**It won't replace deep Excel expertise.** Complex financial modeling, advanced VBA automation, Power Query transformations, and highly customized analytical work still require real Excel knowledge. Copilot is a productivity multiplier for people who already know what they want to accomplish â it's not a substitute for understanding the tool. 6683 6684**It requires a Microsoft 365 Copilot license.** This is a separate, paid add-on to Microsoft 365 â it's not included in standard Microsoft 365 Business or Enterprise plans. Your organization may or may not have it. Check with your IT department or Microsoft 365 admin before assuming you have access. 6685 6686**It's not infallible.** Copilot can generate formulas that look right but have subtle errors, especially with complex logic or ambiguous data structures. You should always review formulas before relying on them, particularly for financial calculations. Think of it as a capable assistant, not an authority. 6687 6688**It works best with structured data.** If your spreadsheet is a mess â merged cells, inconsistent column headers, data mixed with notes â Copilot will struggle. Cleaning up your data structure first pays dividends. 6689 6690**It doesn't learn your specific business context.** Copilot doesn't know that "Region 4" means the Southeast, or that your company's fiscal year starts in October. You'll need to provide that c
6690ontext in your prompts, or build it into your data structure. 6691 6692--- 6693 6694## Is the learning curve steep? 6695 6696No. That's one of the more pleasant surprises about Copilot in Excel. 6697 6698If you're already comfortable in Excel, picking up Copilot is mostly about learning how to phrase requests effectively. The core skill is prompt clarity: being specific about what data you want to work with, what you want Copilot to do with it, and what the output should look like. 6699 6700A few principles that make a big difference: 6701 6702- **Be specific about columns and tables.** Instead of "summarize the data," say "summarize the Sales table, focusing on revenue by region." 6703- **State the output format you want.** "Add a new column" vs. "give me a summary in the chat panel" vs. "create a chart" â Copilot needs to know what form you want the answer in. 6704- **Iterate conversationally.** If the first result isn't quite right, don't start over â refine it. "Adjust that to only include Q3 data" or "change the chart to a line chart instead" works well. 6705- **Ask follow-up questions.** Copilot maintains context within a session. You can ask "why did you use SUMIFS instead of SUMPRODUCT there?" and get a real explanation. 6706 6707A half-day of focused training is enough to get genuinely productive with Copilot. The bigger adjustment is mental: learning to reach for Copilot first instead of defaulting to doing things manually. That habit shift takes a little time, but it comes quickly once you've seen what it can do. 6708 6709--- 6710 6711## How to get started with Copilot in Excel: a step-by-step guide 6712 6713If you have access to Microsoft 365 Copilot and want to start using it in Excel today, here's exactly how to do it. 6714 6715### Step 1: Confirm you have access 6716 6717Open Excel and look for the **Copilot** button in the Home ribbon (far right side). If it's there and clickable, you're ready. If it's grayed out or missing, contact your Microsoft 365 admin â your organization may need to enable the license. 6718 6719### Step 2: Format your data as a table 6720 6721Copilot works significantly better with data formatted as an Excel table. 6722 67231. Select your data range (including headers). 67242. Press **Ctrl + T** (or go to Insert > Table). 67253. Make sure "My table has headers" is checked, then click OK. 67264. Give your table a descriptive name in the Table Design tab (e.g., "SalesData" instead of "Table1"). This helps Copilot reference it accurately. 6727
6728### Step 3: Open the Copilot panel 6729 6730Click the **Copilot** button in the Home ribbon. A panel opens on the right side of your screen. This is where you'll type your requests. 6731 6732### Step 4: Start with a summary 6733 6734For your first prompt, ask for a summary of your data. This is the lowest-risk way to see Copilot in action and verify it understands your dataset correctly. 6735 6736Try: *"Summarize this table. What are the main trends?"* 6737 6738Review what it returns. If it misunderstands something â references the wrong column, for example â that's useful feedback for how to structure your prompts going forward. 6739 6740### Step 5: Ask for a formula 6741 6742Next, try asking for a formula that you'd normally have to look up or think through carefully. 6743 6744Try: *"Add a column that calculates each row's revenue as a percentage of the total revenue in the table."* 6745 6746Copilot will write the formula and show you a preview. Click **Insert Column** to add it to your table. Check the results against a few rows manually to confirm it's correct. 6747 6748### Step 6: Request a visualization 6749 6750Finally, ask for a chart. 6751 6752Try: *"Create a bar chart showing total revenue by [your category column]."* 6753 6754Copilot generates the chart and inserts it into your workbook. You can follow up with refinements: *"Change it to a horizontal bar chart"* or *"Add data labels to each bar."* 6755 6756### Step 7: Build the habit 6757 6758The most important step is the one that happens after you close Excel: the next time you're about to write a formula from memory or build a pivot table manually, pause and ask Copilot first. Even if you know how to do it yourself, doing it through Copilot is usually faster â and over time, you'll develop a sense of exactly when to reach for it and when to work directly. 6759 6760--- 6761 6762## A realistic picture of the productivity gain 6763 6764The productivity gains from Copilot in Excel aren't evenly distributed. Some tasks see dramatic improvements; others see little change. 6765 6766**High impact:** 6767- Writing complex formulas you'd otherwise need to look up 6768- Summarizing large datasets for quick briefings 6769- Cleaning and standardizing messy data exports 6770- Generating charts for recurring reports 6771- Getting oriented in an unfamiliar workbook 6772 6773**Moderate impact:** 6774- Formatting and layout tasks 6775- Simple calculations you already know how to do 6776- Building pivot tables (Copilot can help, but pivot tables aren't hard once you know them) 6777 6778**Low or no impact:** 6779- Complex financial models with custom logic 6780- VBA macros and automation 6781- Power Query transformations 6782- Highly customized analytical work 6783 6784If a significant portion of your Excel time falls into the high-impact category â and for most business professionals it does â then Copilot is worth learning. The ROI is real and measurable. 6785 6786--- 6787 6788## The bottom line 6789 6790If your organization has Microsoft 365 Copilot licenses and you spend meaningful time in Excel, learning to use Copilot effectively is one of the higher-ROI investments you can make in your own productivity right now. The skill gap between people who use it well and people who don't is real and growing. 6791 6792The good news is that the learning curve is genuinely shallow. A half-day of focused, hands-on training is enough to get productive â and the skills transfer immediately to your actual work. 6793 6794If you want a structured introduction with a live instructor, [our Copilot in Excel half-day training](/lp/copilot-excel-awareness?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_wY-6NGGGDJAKBXsOgA3SMqQ-O8xcWnwRaIJJvzaf_xE&utm_content=act_OKsyC0_j0_psKnCMtEfQi1b2Qenq3-0Qu8t4E9AsYa8&utm_term=topic_copilot-excel) is designed exactly for this â practical, instructor-led, and focused on the skills that matter most in day-to-day work. Sessions are available from September through December 2026, with morning and afternoon options and a maximum of 20 participants per session. 6795 6796 6797--- 6798 6799## How Excel and PowerPoint skills work together 6800 6801Many real assignments do not end when the spreadsheet is finished. You analyze the numbers in Excel, explain the result in PowerPoint, and then answer questions from the people making decisions. Copilot can support each stage, but only when you use a deliberate workflow. 6802 6803### A simple handoff from analysis to presentation 6804 68051. **Use Excel to test the story.** Ask Copilot to summarize a table, identify trends, and flag exceptions. Verify the findings yourself. 68062. **Write down the takeaway.** Before opening PowerPoint, state the point in one sentence: what changed, why it matters, and what decision is needed. 68073. **Ask for a presentation outline.** In PowerPoint, try: *âCreate a short executive presentation that explains this finding, the supporting evidence, and the recommended next step.â* 68084. **Refine for the audience.** Ask Copilot to make the language clearer, shorten crowded slides, or create speaker notes â then check that it has not changed the meaning. 6809 6810Learning both Copilot in Excel and Copilot in PowerPoint helps you move from data to a clear message without treating the AI output as final. [Explore the live Excel and PowerPoint Copilot courses](/lp/microsoft-copilot-training?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_hpuKwX7YPBDTy2b-6Mwu0SbMsMmGOGPd_bb7GgIF-4s&utm_content=act_2O8-s1fVv-0o4tnyUsm4Oj6K5BtVPSIMM4R6ceNvtNw&utm_term=topic_copilot-excel-powerpoint-workflow).` 6811 }, 6812 { 6813 "slug": "microsoft-copilot-confidence", 6814 "campaignId": "7jvkst38abi2", 6815 "id": "blog-post-da73kvvloya8", 6816 "title": "Build Confidence with Microsoft Copilot", 6817 "publishedAt": "2026-09-11T04:00:00.000Z", 6818 "published": true, 6819 "tags": [ 6820 "Microsoft Copilot", 6821 "AI Adoption", 6822 "Microsoft 365", 6823 "Workplace Learning" 6824 ], 6825 "excerpt": "A practical framework for helping teams move from curiosity about Microsoft Copilot to confident, responsible everyday use.", 6826 "featuredImage": "/airo-assets/images/blog/microsoft-copilot-confidence", 6827 "author": "SkillForge Team", 6828 "category": "Workplace Learning", 6829 "seoTitle": "Build Confidence with Microsoft Copilot", 6830 "seoDescription": "Help your team adopt Microsoft Copilot with practical training, thoughtful review, and everyday workplace examples.", 6831 "content": "Most teams do not need another reminder that artificial intelligence is changing workplace tools. What they need is a sensible way to decide where Microsoft Copilot fits, how to use it responsibly, and how to avoid wasting time on output that does not help.\n\nConfidence is built through practice. A clear learning plan gives professionals permission to try useful tasks, ask better questions, and improve results before they reach a colleague or customer.\n\n## Begin with a clear purpose\n\nCopilot adoption often stalls when the goal is too broad. âUse AI moreâ is not practical instruction. A stronger starting point connects the tool to a real challenge: reducing time spent preparing a recurring update, organizing a project summary, or improving a first draft.\n\nAsk teams to identify tasks that are frequent, time-consuming, and easy to review. Those are usually better candidates than work that is highly sensitive or entirely unfamiliar.\n\n## Teach people how to supply context\n\nCopilot does not see the full situation unless you provide it. Better outcomes come from explaining the relevant information, desired format, audience, and limits. A request to summarize material should state which source to use, how much detail to retain, and what the reader needs to do next.\n\n### Practice the prompt-and-review loop\n\nA helpful routine looks like this:\n\n1. Describe the task and audience clearly.\n2. Provide the source or context Copilot needs.\n3. Ask for a defined format, such as a short brief or presentation outline.\n4. Review the response against the original material.\n5. Refine the request when the result is
6831incomplete or off target.\n\nThis loop is more valuable than memorizing a list of âperfect prompts.â It teaches people how to think with the tool while keeping responsibility for the final work.\n\n## Make review visible\n\nFast output is only useful when it is accurate and appropriate. Teams should expect to check Copilotâs work, not treat the first answer as finished. This is particularly important for numbers, claims, policy-sensitive language, and content that represents the organization externally.\n\nA simple shared standard helps: verify facts, remove anything unsupported, adjust language for the audience, and use professional judgment before sharing. When leaders model this behavior, it reinforces that responsible use is part of good work.\n\n## Learn through familiar Microsoft 365 scenarios\n\nConfidence grows faster when examples resemble the work people already perform. In Excel, teams might explore a well-structured data set, identify trends, or create a starting point for a report. In PowerPoint, they might build a narrative outline from a project brief and improve slide clarity. In documents, they can use Copilot to propose a first draft, then add their expertise and voice.\n\nThe common thread is not a flashy demonstration. It is seeing a real task move forward with less friction and the same attention to quality.\n\n## Share what works without forcing one workflow\n\nDifferent roles need different approaches. A finance professional, project manager, and communications lead will not use Copilot in identical ways. What they can share is the practice behind strong results: provide relevant context, make a specific request, review carefully, and keep improving.\n\nEncourage people to share effective tasks, prompts they refined, and review steps that prevented mistakes. This creates a library of useful habits while allowing each role to retain its own expertise.\n\n## Turn curiosity into capability\n\nMicrosoft Copilot is most valuable when it supports thoughtful work, not when it simply generates more text. Practical training gives professionals structure to experiment with purpose, confidence to question what they see, and skills to apply the tool where it matters.\n\nStart with the work your team already does. Choose a manageable task, make the outcome clear, and practice the prompt-and-review loop together. Over time, that is how curiosity becomes dependable capability.\n\nLooking for a practical place to start? [Explore SkillForge Microsoft Copilot training](/lp/microsoft-copilot-training?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_hpuKwX7YPBDTy2b-6Mwu0SbMsMmGOGPd_bb7GgIF-4s&utm_content=act_cxwgk6wYv5PNlCRDMFi32feqSlhLuHWExt-YdXDPCz4&utm_term=topic_copilot-confidence).\n\n\n---\n\n## Put confidence into practice: two starter workflows\n\nA useful way to build confidence is to start with a small, familiar task and make review part of the process. These two workflows give teams a repeatable place to begin.\n\n### In Excel: turn a table into a checked insight\n\n1. Format the data as a table and make sure column names are clear.\n2. Ask Copilot: *âSummarize the trends in this table and identify any unusual changes by month.â*\n3. Follow up: *âShow the figures that support the most important trend.â*\n4. Check the result against the workbook before using it in a report or decision.\n\n### In PowerPoint: turn an approved idea into a clear story\n\n1. Start with a verified finding, a rough outline, or approved source material.\n2. Ask Copilot: *âCreate a concise five-slide structure for explaining this result to a non-technical audience.â*\n3. Request revisions for tone, length, or speaker notes.\n4. Confirm that every slide reflects the source and matches the audienceâs needs.\n\nThe goal is not to hand work over to Copilot. It is to use its first draft as a faster starting point while your team remains accountable for the final answer. [Build these habits in live Copilot training for Excel and PowerPoint](/lp/microsoft-copilot-training?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_hpuKwX7YPBDTy2b-6Mwu0SbMsMmGOGPd_bb7GgIF-4s&utm_content=act_cxwgk6wYv5PNlCRDMFi32feqSlhLuHWExt-YdXDPCz4&utm_term=topic_copilot-excel-powerpoint-workflow)." 6832 }, 6833 { 6834 "slug": "microsoft-copilot-training-value", 6835 "campaignId": "7jvkst38abi2", 6836 "id": "blog-post-332j8fme5ilx", 6837 "title": "Where Microsoft Copilot Training Delivers Value", 6838 "publishedAt": "2026-09-13T04:00:00.000Z", 6839 "published": true, 6840 "tags": [ 6841 "Microsoft Copilot", 6842 "Microsoft 365", 6843 "Professional Development", 6844 "AI Training" 6845 ], 6846 "excerpt": "See where practical Microsoft Copilot training can support better work, stronger judgment, and more confident use across your team.", 6847 "featuredImage": "/airo-assets/images/blog/microsoft-copilot-training-value", 6848 "author": "SkillForge Team", 6849 "category": "Professional Development", 6850 "seoTitle": "Where Microsoft Copilot Training Delivers Value", 6851 "seoDescription": "Learn where practical Microsoft Copilot training can deliver value for business professionals and team
6851s.", 6852 "content": "Microsoft Copilot can support better everyday work, but value does not come from access alone. It comes from practical skill, clear expectations, and good judgment. Training gives teams a shared starting point for using Copilot with the Microsoft 365 tools they already know.\n\n## Start with work that repeats\n\nThe best place to begin is usually not the most impressive use case. It is the task that comes up often enough to matter: a weekly report, a client update, a project recap, or a presentation outline. Copilot can help create momentum while you remain responsible for the final result.\n\nUseful starting points include:\n\n- Turning meeting notes into clear follow-up actions\n- Preparing a first draft from existing source material\n- Finding themes in a long document or structured data set\n- Building an outline for a presentation\n- Rephrasing content for a different audience\n\n## Better prompts create better starting points\n\nA useful prompt explains the desired outcome, audience, source information, constraints, and format. Rather than asking Copilot to simply write an email, identify the readers, the decision they need to make, and the tone the message needs. You own the message; Copilot helps you create an informed first version faster.\n\n### Give the tool context and a result\n\nWhen people practice with familiar workplace scenarios, prompting becomes a repeatable habit rather than a novelty. They can see how a small amount of relevant context changes the quality of a result and learn how to refine a response when it misses the mark.\n\n## Use Copilot to support judgment\n\nCopilot can summarize, organize, and propose. It cannot know every business nuance, policy requirement, or relationship consideration behind your work. Review is essential, especially for data, customer communications, financial material, and high-stakes decisions.\n\nA strong review routine is straightforward:\n\n1. Check facts against source material.\n2. Confirm names, numbers, and dates.\n3. Adjust the tone for the intended audience.\n4. Remove unsupported claims or confidential detail.\n5. Add the experience and context only a person can provide.\n\n## Match learning to real Microsoft tools\n\nThe most useful Copilot training connects directly with actual workflows. Excel users may want to examine patterns and improve reporting. PowerPoint users may need help organizing a story and shaping clearer slides. Across Microsoft 365, professionals need a dependable approach for drafting and refining communication.\n\nShared training helps a team build a common language for prompts, review, and appropriate use. It creates better conversations about where Copilot can save time without weakening quality.\n\n## Make the first step practical\n\nChoose one frequent task, define what good output looks like, and practice giving Copilot the right context. Review the result, improve the prompt, and notice where the tool helps. The goal is not to use Copilot for everything. The goal is to use it well when it can help.\n\nReady to help your team build those skills? [Explore SkillForge Microsoft Copilot training](/lp/microsoft-copilot-training?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_hpuKwX7YPBDTy2b-6Mwu0SbMsMmGOGPd_bb7GgIF-4s&utm_content=act_8evb50pUI9kc1fJTtWHcA8mP3r0_wJ3db17WzazosQI&utm_term=topic_copilot-training-value).\n\n\n---\n\n## How to choose a first Copilot workflow\n\nThe best first use case is small enough to review quickly and common enough to repeat. Start with work that already has a clear owner and a clear definition of âgood.â\n\n### Choose Excel when the question begins with data\n\nUse the Excel course when your team spends time cleaning reports, writing formulas, finding patterns, or translating a table into a summary. A practical first exercise is to ask Copilot for a trend summary, verify it against the source, then request a chart that supports the verified conclusion.\n\n### Choose PowerPoint when the question is how to communicate\n\nUse the PowerPoint course when your team needs to turn approved ideas or analysis into clearer slides. Start by asking Copilot for an outline tailored to a specific audie
6852nce, then refine the slide language and speaker notes while checking every statement against the source material.\n\n### Use a repeatable review checklist\n\nBefore sharing any Copilot-assisted work, ask:\n\n- Is the source information current and complete?\n- Did I give Copilot enough context about the audience and outcome?\n- Can I verify the figures, claims, and wording?\n- Does the final Excel analysis or PowerPoint presentation reflect my professional judgment?\n\nThis approach turns Copilot from a novelty into a useful part of everyday work. [Explore live Copilot training for Excel and PowerPoint](/lp/microsoft-copilot-training?utm_source=blog-aab&utm_medium=blog&utm_campaign=cmp_hpuKwX7YPBDTy2b-6Mwu0SbMsMmGOGPd_bb7GgIF-4s&utm_content=act_8evb50pUI9kc1fJTtWHcA8mP3r0_wJ3db17WzazosQI&utm_term=topic_copilot-excel-powerpoint-workflow)." 6853 } 6854 ]), 6855 "landingPages": (((_d = schemas.data) == null ? void 0 : _d.landingPages) ?? schemas.landingPages ?? identity).parse([ 6856 { 6857 "id": "lp-yrifcprb5i55", 6858 "slug": "copilot-excel-awareness", 6859 "componentPath": "./copilot-excel-awareness.tsx", 6860 "startDate": "2026-08-25", 6861 "endDate": "2026-09-22", 6862 "status": "scheduled", 6863 "campaignId": "sbzbrajv8ujs" 6864 }, 6865 { 6866 "id": "lp-4zkc57q5v6mw", 6867 "slug": "microsoft-copilot-training", 6868 "componentPath": "./microsoft-copilot-training.tsx", 6869 "startDate": "2026-09-07", 6870 "endDate": "2026-10-13", 6871 "status": "published", 6872 "campaignId": "7jvkst38abi2" 6873 } 6874 ]) 6875}; 6876const manual_viewer = pages.manual_viewer; 6877const microsoft_copilot_training = pages.microsoft_copilot_training; 6878const landingPages = data.landingPages; 6879function formatSessionDate(startDate) { 6880 return new Intl.DateTimeFormat("en-US", { 6881 month: "long", 6882 day: "numeric", 6883 year: "numeric", 6884 timeZone: "UTC" 6885 }).format(new Date(startDate)); 6886} 6887function formatSessionTime(session) { 6888 return `${session.startTime} â ${session.endTime} ${session.timezone}`; 6889} 6890const outcomes = ["Use plain-English prompts to generate formulas and functions instantly", "Summarize and analyze large datasets without pivot tables", "Automate repetitive tasks â no macros or VBA required", "Spot trends and anomalies with AI-powered insights", "Clean and transform messy data in seconds"]; 6891const testimonials = [{ 6892 name: "Rachel M.", 6893 role: "Financial Analyst", 6894 quote: "I used to spend half my Monday building reports. After this course I have them done before my first coffee.", 6895 stars: 5 6896}, { 6897 name: "David K.", 6898 role: "Operations Manager", 6899 quote: "The instructor kept it practical. Every example was something I could use the same afternoon.", 6900 stars: 5 6901}, { 6902 name: "Priya S.", 6903 role: "HR Business Partner", 6904 quote: "I was skeptical about AI tools but this course made Copilot feel completely approachable.", 6905 stars: 5 6906}]; 6907function CopilotExcelAwarenessPage() { 6908 const enrollUrl = "/courses/copilot-excel"; 6909 const loaderData = useLoaderData(); 6910 const [sessions, setSessions] = reactExports.useState((loaderData == null ? void 0 : loaderData.sessions) ?? null); 6911 reactExports.useEffect(() => { 6912 if (sessions !== null) return; 6913 let active = true; 6914 fetch("/api/sessions?courseId=115").then((response) => response.ok ? response.json() : Promise.reject()).then((data2) => { 6915 if (!active || !Array.isArray(data2)) return; 6916 const grouped = data2.filter(({ 6917 session 6918 }) => session.status !== "cancelled" && session.status !== "completed").reduce((groups, item) => { 6919 const date = formatSessionDate(item.session.startDate); 6920 const time = formatSessionTime(item.session); 6921 const existing = groups.find((group) => group.date === date); 6922 if (existing) { 6923 if (!existing.times.includes(time)) existing.times.push(time); 6924 } else { 6925 groups.push({ 6926 date, 6927 times: [time] 6928 }); 6929 } 6930 return groups; 6931 }, []); 6932 setSessions(grouped); 6933 }).catch(() => { 6934 if (active) setSessions([]); 6935 }); 6936 return () => { 6937 active = false;
6938 }; 6939 }, [sessions]); 6940 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 6941 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [ 6942 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Using Copilot in Excel â Half-Day Live Training â SkillForge" }), 6943 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Learn to use Microsoft Copilot in Excel in just 4 hours. Live, instructor-led online training. Sessions from September 2026. Only $245. Max 20 seats." }), 6944 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: "https://skillforge.com/lp/copilot-excel-awareness" }), 6945 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Using Copilot in Excel â Half-Day Live Training | SkillForge" }), 6946 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Stop spending hours on spreadsheets. Learn Microsoft Copilot in Excel in a focused half-day live class. Sessions from Sep 1, 2026." }),
6947 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }) 6948 ] }), 6949 /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "bg-background", children: [ 6950 /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "relative overflow-hidden", children: [ 6951 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 bg-cover bg-center", style: { 6952 backgroundImage: "url(/airo-assets/images/pages/lp/copilot-excel-awareness/hero)" 6953 } }), 6954 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 pointer-events-none bg-foreground/75" }), 6955 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative container mx-auto px-6 py-24 md:py-32 max-w-5xl", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-2xl", children: [ 6956 /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { className: "mb-5 text-xs px-3 py-1 font-semibold bg-primary text-primary-foreground", children: "Half-Day Live Training · Online · $245" }),
6957 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl md:text-5xl font-bold text-background leading-tight mb-5", children: "Using Copilot in Excel" }), 6958 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-xl text-background/85 mb-4 leading-relaxed font-medium", children: "A focused 4-hour class that shows you exactly how to use Microsoft Copilot inside Excel â from writing formulas with plain English to analyzing data without pivot tables." }), 6959 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-base text-background/70 mb-8 leading-relaxed", children: "Live instructor. Small class. Real spreadsheets. You'll leave with skills you can put to work the same afternoon." }), 6960 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap gap-5 mb-8 text-sm text-background/70", children: [ 6961 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [ 6962 /* @__PURE__ */ jsxRuntimeExports.jsx(Monitor, { className: "w-4 h-4" }), 6963 " Online, instructor-led" 6964 ] }),
6965 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [ 6966 /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "w-4 h-4" }), 6967 " 4 hours" 6968 ] }), 6969 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [ 6970 /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "w-4 h-4" }), 6971 " Max 20 seats" 6972 ] }) 6973 ] }), 6974 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "text-base font-semibold", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: enrollUrl, children: [ 6975 "Enroll now ", 6976 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "w-4 h-4 ml-1" }) 6977 ] }) }) 6978 ] }) }) 6979 ] }), 6980 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-muted/40 border-b border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6 max-w-5xl", children: [
6981 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center mb-12", children: [ 6982 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold text-foreground mb-3", children: "Why take this course?" }), 6983 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground max-w-2xl mx-auto", children: "Copilot is already inside Excel for most Microsoft 365 users â but most people don't know how to use it effectively. This course closes that gap in half a day." }) 6984 ] }), 6985 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: [{ 6986 icon: /* @__PURE__ */ jsxRuntimeExports.jsx(Zap, { className: "w-6 h-6 text-primary" }), 6987 title: "Save hours every week", 6988 body: "Tasks that used to take 30 minutes â building formulas, cleaning data, summarizing tables â take seconds with Copilot. You'll feel the difference immediately." 6989 }, { 6990 icon: /* @__PURE__ */ jsxRuntimeExports.jsx(ChartNoAxesColumn, { className: "w-6 h-6 text-primary" }), 6991 title: "Analyze data without the complexity", 6992 body: "Ask Copilot to spot trends, flag anomalies, or summarize a dataset in plain English. No pivot tables, no advanced functions â just answers." 6993 }, { 6994 icon: /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "w-6 h-6 text-primary" }), 6995 title: "Practical from the first hour", 6996 body: "Every exercise uses real-world spreadsheet scenarios. You follow along with Copilot active, so you build muscle memory â not just notes." 6997 }].map((card) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background rounded-xl border border-border p-6", children: [
6998 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "mb-4", children: card.icon }), 6999 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "font-semibold text-foreground mb-2", children: card.title }), 7000 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground text-sm leading-relaxed", children: card.body }) 7001 ] }, card.title)) }) 7002 ] }) }), 7003 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-background border-b border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 max-w-5xl", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-12 items-start", children: [ 7004 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 7005 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold text-foreground mb-2", children: "What you'll learn" }), 7006 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-8", children: "The course covers the core Copilot capabilities that Excel users reach for most â taught in the order you'd actually use them." }),
7007 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "space-y-3", children: outcomes.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { className: "flex items-start gap-3", children: [ 7008 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "w-5 h-5 mt-0.5 shrink-0 text-primary" }), 7009 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-foreground", children: item }) 7010 ] }, item)) }) 7011 ] }), 7012 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "rounded-2xl overflow-hidden border border-border shadow-sm", children: [ 7013 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-muted px-6 py-5 border-b border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground", children: "Course details" }) }), 7014 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "divide-y divide-border", children: [{ 7015 label: "Course", 7016 value: "Using Copilot in Excel" 7017 }, { 7018 label: "Duration", 7019 value: "4 hours (half day)" 7020 }, { 7021 label: "Format", 7022 value: "Live, instructor-led online" 7023 }, { 7024 label: "Class size", 7025 value: "Max 20 participants" 7026 }, { 7027 label: "Level", 7028 value: "Introductory" 7029 }, { 7030 label: "Price", 7031 value: "$245 per person" 7032 }, { 7033 label: "Prerequisite", 7034 value: "Basic Excel familiarity" 7035 }].map(({ 7036 label, 7037 value 7038 }) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex justify-between px-6 py-3 text-sm", children: [
7039 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-muted-foreground", children: label }), 7040 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-medium text-foreground text-right", children: value }) 7041 ] }, label)) }), 7042 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "px-6 py-5 bg-muted/40", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "sm", className: "w-full font-semibold", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: enrollUrl, children: [ 7043 "Enroll now ", 7044 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "w-4 h-4 ml-1" }) 7045 ] }) }) }) 7046 ] }) 7047 ] }) }) }), 7048 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-muted/40 border-b border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "container mx-auto px-6 max-w-5xl", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid md:grid-cols-2 gap-12 items-center", children: [
7049 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 7050 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold text-foreground mb-4", children: "Who should attend?" }), 7051 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground mb-6", children: "This course is designed for anyone who uses Excel regularly and wants to get more done in less time. You don't need to be an Excel expert â you just need to be comfortable opening a spreadsheet." }), 7052 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "space-y-2", children: ["Analysts who build reports and want to speed up the process", "Finance and operations professionals who live in spreadsheets", "Managers who need quick data summaries without the manual work", "Anyone with Microsoft 365 who hasn't explored Copilot yet"].map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { className: "flex items-start gap-3 text-sm text-foreground", children: [ 7053 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "w-4 h-4 mt-0.5 shrink-0 text-primary" }),
7054 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: item }) 7055 ] }, item)) }) 7056 ] }), 7057 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background rounded-2xl border border-border p-8", children: [ 7058 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm font-semibold text-primary mb-2", children: "Not sure if this is right for you?" }), 7059 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-foreground font-semibold text-lg mb-3", children: "If you use Excel more than twice a week, this course will pay for itself in the first day back at your desk." }), 7060 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground text-sm", children: "The only prerequisite is basic Excel familiarity â knowing how to open a file, enter data, and navigate cells. Copilot experience is not required." }) 7061 ] }) 7062 ] }) }) }), 7063 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-background border-b border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6 max-w-5xl", children: [
7064 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center mb-10", children: [ 7065 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold text-foreground mb-3", children: "Upcoming sessions" }), 7066 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: "All sessions run online. Choose the date and time that fits your schedule." }) 7067 ] }), 7068 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 mb-8", children: sessions === null ? /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "col-span-full text-center text-sm text-muted-foreground", children: "Loading upcoming sessionsâ¦" }) : sessions.length > 0 ? sessions.map((s) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-muted/40 rounded-xl border border-border p-5", children: [ 7069 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-3", children: [
7070 /* @__PURE__ */ jsxRuntimeExports.jsx(Calendar, { className: "w-4 h-4 shrink-0 text-primary" }), 7071 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "font-semibold text-foreground text-sm", children: s.date }) 7072 ] }), 7073 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "space-y-1", children: s.times.map((t) => /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-xs text-muted-foreground flex items-center gap-1.5", children: [ 7074 /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "w-3 h-3 shrink-0" }), 7075 " ", 7076 t 7077 ] }, t)) }) 7078 ] }, s.date)) : /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "col-span-full text-center text-sm text-muted-foreground", children: "New sessions are being scheduled. View the course page for the latest availability." }) }) 7079 ] }) }), 7080 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-16 bg-muted/40 border-b border-border", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6 max-w-5xl", children: [
7081 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "text-center mb-10", children: [ 7082 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl font-bold text-foreground mb-3", children: "What attendees say" }), 7083 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: "Hear from professionals who've taken the course." }) 7084 ] }), 7085 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: testimonials.map((t) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "bg-background rounded-xl border border-border p-6", children: [ 7086 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex gap-0.5 mb-4", children: Array.from({ 7087 length: t.stars 7088 }).map((_, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(Star, { className: "w-4 h-4 fill-current text-primary" }, i)) }), 7089 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "text-foreground mb-4 leading-relaxed", children: [ 7090 '"', 7091 t.quote, 7092 '"' 7093 ] }),
7094 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 7095 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground text-sm", children: t.name }), 7096 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground text-xs", children: t.role }) 7097 ] }) 7098 ] }, t.name)) }) 7099 ] }) }), 7100 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "py-20 bg-primary", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto px-6 max-w-3xl text-center", children: [ 7101 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-3xl md:text-4xl font-bold text-primary-foreground mb-4", children: "Ready to get more out of Excel?" }), 7102 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-primary-foreground/80 text-lg mb-8", children: "Seats are limited to 20 per session. Enroll today and choose the date that works for you." }), 7103 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex flex-col sm:flex-row gap-4 justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", variant: "secondary", className: "text-base font-semibold", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: enrollUrl, children: [ 7104 "View all sessions ",
7105 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "w-4 h-4 ml-1" }) 7106 ] }) }) }) 7107 ] }) }) 7108 ] }) 7109 ] }); 7110} 7111function MicrosoftCopilotTrainingPage({ 7112 startDate, 7113 endDate 7114}) { 7115 const [searchParams] = useSearchParams(); 7116 const configuredStart = startDate ? startDate + "T00:00:00Z" : ""; 7117 const configuredEnd = endDate ? endDate + "T23:59:59Z" : ""; 7118 const previewStart = searchParams.get("__preview_start"); 7119 const previewEnd = searchParams.get("__preview_end"); 7120 const isPreviewState = Boolean(previewStart && previewEnd); 7121 const activeStart = isPreviewState ? previewStart : configuredStart; 7122 const activeEnd = isPreviewState ? previewEnd : configuredEnd; 7123 const now = Date.now(); 7124 const startMs = new Date(activeStart).getTime(); 7125 const endMs = new Date(activeEnd).getTime(); 7126 const hasStarted = Number.isNaN(startMs) || now >= startMs; 7127 const hasEnded = !Number.isNaN(endMs) && now >= endMs; 7128 const pageUrl = "https://skillforge.com/lp/microsoft-copilot-training"; 7129 const heroImage = "/airo-assets/images/pages/lp/microsoft-copilot-training/hero"; 7130 const schema = { 7131 "@context": "https://schema.org", 7132 "@type": "WebPage", 7133 name: "Microsoft Copilot Training | SkillForge", 7134 url: pageUrl, 7135 isPartOf: { 7136 "@id": "https://skillforge.com/#website" 7137 }, 7138 about: { 7139 "@id": "https://skillforge.com/#organization" 7140 } 7141 }; 7142 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 7143 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [
7144 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Microsoft Copilot Training | SkillForge" }), 7145 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Build practical Microsoft Copilot skills through live online or onsite training for Excel, Finance, and PowerPoint from SkillForge." }), 7146 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: pageUrl }), 7147 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:title", content: "Microsoft Copilot Training | SkillForge" }), 7148 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:description", content: "Practical live Copilot training for Excel, finance, and PowerPoint workflows." }), 7149 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:type", content: "website" }), 7150 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:url", content: pageUrl }), 7151 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { property: "og:image", content: "https://skillforge.com" + heroImage }),
7152 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:card", content: "summary_large_image" }), 7153 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:title", content: "Microsoft Copilot Training | SkillForge" }), 7154 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:description", content: "Practical live Copilot training for Excel, finance, and PowerPoint workflows." }), 7155 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "twitter:image", content: "https://skillforge.com" + heroImage }), 7156 /* @__PURE__ */ jsxRuntimeExports.jsx("script", { type: "application/ld+json", children: JSON.stringify(schema) }) 7157 ] }), 7158 hasEnded ? /* @__PURE__ */ jsxRuntimeExports.jsx("main", { className: "bg-background py-24", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "mx-auto max-w-2xl px-6 text-center", children: [ 7159 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-foreground", children: "Build practical Microsoft Copilot skills" }),
7160 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-5 text-muted-foreground", children: "This focused training window has ended, but SkillForge courses are available year-round." }), 7161 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, className: "mt-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Explore courses" }) }) 7162 ] }) }) : !hasStarted ? /* @__PURE__ */ jsxRuntimeExports.jsx("main", { className: "bg-background py-24", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "mx-auto max-w-2xl px-6 text-center", children: [ 7163 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-4xl font-bold text-foreground", children: "Practical Microsoft Copilot training is coming soon" }), 7164 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-5 text-muted-foreground", children: "Get ready to learn how Copilot can support the work you already do in Microsoft 365." }), 7165 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, className: "mt-8", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: "Browse current courses" }) }) 7166 ] }) }) : /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { className: "bg-background", children: [
7167 /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "relative overflow-hidden", children: [ 7168 /* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: heroImage, alt: "Business team using productivity software in an office", width: "1600", height: "900", loading: "eager", fetchPriority: "high", className: "absolute inset-0 h-full w-full object-cover" }), 7169 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pointer-events-none absolute inset-0 bg-gradient-to-r from-gray-900/90 to-gray-900/55" }), 7170 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative container mx-auto max-w-5xl px-6 py-24 md:py-32", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "max-w-2xl", children: [ 7171 /* @__PURE__ */ jsxRuntimeExports.jsx(Badge, { className: "mb-5 bg-primary px-3 py-1 text-xs font-semibold text-primary-foreground", children: microsoft_copilot_training.hero.badge }), 7172 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "mb-5 text-4xl font-bold leading-tight text-background md:text-5xl", style: { 7173 whiteSpace: "pre-line" 7174 }, children: microsoft_copilot_training.hero.title }),
7175 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-4 text-xl font-medium leading-relaxed text-background", style: { 7176 whiteSpace: "pre-line" 7177 }, children: microsoft_copilot_training.hero.lead }), 7178 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-8 text-base leading-relaxed text-background", style: { 7179 whiteSpace: "pre-line" 7180 }, children: microsoft_copilot_training.hero.supporting }), 7181 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-8 flex flex-wrap gap-5 text-sm text-background", children: [ 7182 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [ 7183 /* @__PURE__ */ jsxRuntimeExports.jsx(Monitor, { className: "h-4 w-4" }), 7184 "Online or onsite" 7185 ] }), 7186 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [ 7187 /* @__PURE__ */ jsxRuntimeExports.jsx(Clock, { className: "h-4 w-4" }), 7188 "4 hours per course" 7189 ] }),
7190 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { className: "flex items-center gap-1.5", children: [ 7191 /* @__PURE__ */ jsxRuntimeExports.jsx(Users, { className: "h-4 w-4" }), 7192 "Small class sizes" 7193 ] }) 7194 ] }), 7195 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", className: "text-base font-semibold", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "#courses", children: [ 7196 microsoft_copilot_training.hero.cta, 7197 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-1 h-4 w-4" }) 7198 ] }) }) 7199 ] }) }) 7200 ] }), 7201 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "border-b border-border bg-muted py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto max-w-5xl px-6", children: [ 7202 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-12 text-center", children: [ 7203 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-3 text-3xl font-bold text-foreground", style: { 7204 whiteSpace: "pre-line" 7205 }, children: microsoft_copilot_training.benefits.title }),
7206 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mx-auto max-w-2xl text-muted-foreground", style: { 7207 whiteSpace: "pre-line" 7208 }, children: microsoft_copilot_training.benefits.body }) 7209 ] }), 7210 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-3", children: microsoft_copilot_training.benefits.items.map((item, index) => /* @__PURE__ */ jsxRuntimeExports.jsxs("article", { className: "rounded-xl border border-border bg-background p-6", children: [ 7211 index === 0 ? /* @__PURE__ */ jsxRuntimeExports.jsx(Zap, { className: "mb-4 h-6 w-6 text-primary" }) : index === 1 ? /* @__PURE__ */ jsxRuntimeExports.jsx(ChartNoAxesColumn, { className: "mb-4 h-6 w-6 text-primary" }) : /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { className: "mb-4 h-6 w-6 text-primary" }), 7212 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "mb-2 font-semibold text-foreground", style: { 7213 whiteSpace: "pre-line" 7214 }, children: item.title }),
7215 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm leading-relaxed text-muted-foreground", style: { 7216 whiteSpace: "pre-line" 7217 }, children: item.body }) 7218 ] }, item.id)) }) 7219 ] }) }), 7220 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "border-b border-border bg-background py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto grid max-w-5xl items-start gap-12 px-6 md:grid-cols-2", children: [ 7221 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 7222 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-2 text-3xl font-bold text-foreground", style: { 7223 whiteSpace: "pre-line" 7224 }, children: microsoft_copilot_training.learning.title }), 7225 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-8 text-muted-foreground", style: { 7226 whiteSpace: "pre-line" 7227 }, children: microsoft_copilot_training.learning.body }), 7228 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "flex flex-col gap-3", children: microsoft_copilot_training.learning.outcomes.map((outcome) => /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { className: "flex items-start gap-3", children: [
7229 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "mt-0.5 h-5 w-5 shrink-0 text-primary" }), 7230 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-foreground", style: { 7231 whiteSpace: "pre-line" 7232 }, children: outcome.text }) 7233 ] }, outcome.id)) }) 7234 ] }), 7235 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "overflow-hidden rounded-2xl border border-border shadow-sm", children: [ 7236 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "border-b border-border bg-muted px-6 py-5", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "font-semibold text-foreground", style: { 7237 whiteSpace: "pre-line" 7238 }, children: microsoft_copilot_training.details.title }) }), 7239 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "divide-y divide-border", children: microsoft_copilot_training.details.rows.map((row) => /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-start justify-between gap-6 px-6 py-3 text-sm", children: [
7240 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "shrink-0 text-muted-foreground", style: { 7241 whiteSpace: "pre-line" 7242 }, children: row.label }), 7243 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "max-w-sm text-right font-medium leading-relaxed text-foreground", style: { 7244 whiteSpace: "pre-line" 7245 }, children: row.value }) 7246 ] }, row.id)) }), 7247 /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "bg-muted px-6 py-5", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "sm", className: "w-full font-semibold", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "#courses", children: [ 7248 microsoft_copilot_training.details.cta, 7249 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-1 h-4 w-4" }) 7250 ] }) }) }) 7251 ] }) 7252 ] }) }), 7253 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "border-b border-border bg-muted py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto grid max-w-5xl items-center gap-12 px-6 md:grid-cols-2", children: [
7254 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [ 7255 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-4 text-3xl font-bold text-foreground", style: { 7256 whiteSpace: "pre-line" 7257 }, children: microsoft_copilot_training.audience.title }), 7258 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-6 text-muted-foreground", style: { 7259 whiteSpace: "pre-line" 7260 }, children: microsoft_copilot_training.audience.body }), 7261 /* @__PURE__ */ jsxRuntimeExports.jsx("ul", { className: "flex flex-col gap-2", children: microsoft_copilot_training.audience.items.map((item) => /* @__PURE__ */ jsxRuntimeExports.jsxs("li", { className: "flex items-start gap-3 text-sm text-foreground", children: [ 7262 /* @__PURE__ */ jsxRuntimeExports.jsx(CircleCheckBig, { className: "mt-0.5 h-4 w-4 shrink-0 text-primary" }), 7263 /* @__PURE__ */ jsxRuntimeExports.jsx("span", { style: { 7264 whiteSpace: "pre-line" 7265 }, children: item.text }) 7266 ] }, item.id)) }) 7267 ] }),
7268 /* @__PURE__ */ jsxRuntimeExports.jsxs("aside", { className: "rounded-2xl border border-border bg-background p-8", children: [ 7269 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-2 text-sm font-semibold text-primary", style: { 7270 whiteSpace: "pre-line" 7271 }, children: microsoft_copilot_training.audience.asideLabel }), 7272 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-3 text-lg font-semibold text-foreground", style: { 7273 whiteSpace: "pre-line" 7274 }, children: microsoft_copilot_training.audience.asideTitle }), 7275 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-muted-foreground", style: { 7276 whiteSpace: "pre-line" 7277 }, children: microsoft_copilot_training.audience.asideBody }) 7278 ] }) 7279 ] }) }), 7280 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { id: "courses", className: "border-b border-border bg-background py-16", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto max-w-5xl px-6", children: [
7281 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "mb-10 text-center", children: [ 7282 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-3 text-3xl font-bold text-foreground", style: { 7283 whiteSpace: "pre-line" 7284 }, children: microsoft_copilot_training.courses.title }), 7285 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", style: { 7286 whiteSpace: "pre-line" 7287 }, children: microsoft_copilot_training.courses.body }) 7288 ] }), 7289 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3", children: [ 7290 /* @__PURE__ */ jsxRuntimeExports.jsxs("article", { className: "flex flex-col rounded-xl border border-border bg-muted p-5", children: [ 7291 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-foreground", style: { 7292 whiteSpace: "pre-line" 7293 }, children: microsoft_copilot_training.courses.items[0].title }),
7294 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-3 flex-1 text-sm leading-relaxed text-muted-foreground", style: { 7295 whiteSpace: "pre-line" 7296 }, children: microsoft_copilot_training.courses.items[0].description }), 7297 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "outline", className: "mt-6 w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses/copilot-excel", children: [ 7298 "View course ", 7299 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-1 h-4 w-4" }) 7300 ] }) }) 7301 ] }), 7302 /* @__PURE__ */ jsxRuntimeExports.jsxs("article", { className: "flex flex-col rounded-xl border border-border bg-muted p-5", children: [ 7303 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-foreground", style: { 7304 whiteSpace: "pre-line" 7305 }, children: microsoft_copilot_training.courses.items[1].title }),
7306 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-3 flex-1 text-sm leading-relaxed text-muted-foreground", style: { 7307 whiteSpace: "pre-line" 7308 }, children: microsoft_copilot_training.courses.items[1].description }), 7309 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "outline", className: "mt-6 w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses/copilot-excel-finance", children: [ 7310 "View course ", 7311 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-1 h-4 w-4" }) 7312 ] }) }) 7313 ] }), 7314 /* @__PURE__ */ jsxRuntimeExports.jsxs("article", { className: "flex flex-col rounded-xl border border-border bg-muted p-5", children: [ 7315 /* @__PURE__ */ jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold text-foreground", style: { 7316 whiteSpace: "pre-line" 7317 }, children: microsoft_copilot_training.courses.items[2].title }),
7318 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mt-3 flex-1 text-sm leading-relaxed text-muted-foreground", style: { 7319 whiteSpace: "pre-line" 7320 }, children: microsoft_copilot_training.courses.items[2].description }), 7321 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, variant: "outline", className: "mt-6 w-full", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "/courses/copilot-powerpoint", children: [ 7322 "View course ", 7323 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-1 h-4 w-4" }) 7324 ] }) }) 7325 ] }) 7326 ] }) 7327 ] }) }), 7328 /* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "bg-primary py-20", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "container mx-auto max-w-3xl px-6 text-center", children: [ 7329 /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "mb-4 text-3xl font-bold text-primary-foreground md:text-4xl", style: { 7330 whiteSpace: "pre-line" 7331 }, children: microsoft_copilot_training.finalCta.title }),
7332 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "mb-8 text-lg text-primary-foreground", style: { 7333 whiteSpace: "pre-line" 7334 }, children: microsoft_copilot_training.finalCta.body }), 7335 /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col justify-center gap-4 sm:flex-row", children: [ 7336 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", variant: "secondary", className: "text-base font-semibold", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Link, { to: "#courses", children: [ 7337 microsoft_copilot_training.finalCta.primaryCta, 7338 /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-1 h-4 w-4" }) 7339 ] }) }), 7340 /* @__PURE__ */ jsxRuntimeExports.jsx(Button, { asChild: true, size: "lg", variant: "outline", className: "border-primary-foreground bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/courses", children: microsoft_copilot_training.finalCta.secondaryCta }) }) 7341 ] }),
7342 /* @__PURE__ */ jsxRuntimeExports.jsxs("p", { className: "mt-6 text-sm text-primary-foreground", children: [ 7343 /* @__PURE__ */ jsxRuntimeExports.jsxs("span", { style: { 7344 whiteSpace: "pre-line" 7345 }, children: [ 7346 microsoft_copilot_training.finalCta.questions, 7347 " " 7348 ] }), 7349 /* @__PURE__ */ jsxRuntimeExports.jsx(Link, { to: "/contact", className: "underline", children: microsoft_copilot_training.finalCta.contact }), 7350 "." 7351 ] }) 7352 ] }) }) 7353 ] }) 7354 ] }); 7355} 7356const normalize = (p) => p.startsWith("./") ? p : `./${p.replace(/^\//, "")}`; 7357const pageModules = { 7358 "./copilot-excel-awareness.tsx": { 7359 default: CopilotExcelAwarenessPage 7360 }, 7361 "./microsoft-copilot-training.tsx": { 7362 default: MicrosoftCopilotTrainingPage 7363 } 7364}; 7365const manifest = landingPages ?? []; 7366const componentLoaders = {}; 7367for (const entry of manifest) { 7368 const mod = pageModules[normalize(entry.componentPath)]; 7369 if (mod == null ? void 0 : mod.default) componentLoaders[entry.slug] = mod.default; 7370} 7371setLandingPages(manifest.map((e) => ({ 7372 id: e.id, 7373 slug: e.slug, 7374 startDate: e.startDate, 7375 endDate: e.endDate, 7376 status: e.status 7377}))); 7378function LandingPage() { 7379 const { 7380 slug 7381 } = useParams(); 7382 const canonicalUrl = `https://skillforge.com/lp/${slug ?? ""}`; 7383 const page = slug ? getPageBySlugUnfiltered(slug) : null; 7384 const Page = slug ? componentLoaders[slug] : void 0; 7385 if (typeof window !== "undefined" && slug && page && Page) { 7386 sessionStorage.removeItem(`__lp_reload:${slug}`); 7387 } 7388 if (!page || !Page) { 7389 if (typeof window !== "undefined") console.warn(`[landing-page] no page found for slug "${slug}" â redirecting home`); 7390 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
7391 /* @__PURE__ */ jsxRuntimeExports.jsxs(Helmet, { children: [ 7392 /* @__PURE__ */ jsxRuntimeExports.jsx("title", { children: "Training Courses | SkillForge" }), 7393 /* @__PURE__ */ jsxRuntimeExports.jsx("meta", { name: "description", content: "Explore instructor-led technology and business training courses from SkillForge." }), 7394 /* @__PURE__ */ jsxRuntimeExports.jsx("link", { rel: "canonical", href: canonicalUrl }) 7395 ] }), 7396 /* @__PURE__ */ jsxRuntimeExports.jsxs("main", { children: [ 7397 /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "sr-only", children: "Training Courses" }), 7398 /* @__PURE__ */ jsxRuntimeExports.jsx(Navigate, { to: "/", replace: true }) 7399 ] }) 7400 ] }); 7401 } 7402 return /* @__PURE__ */ jsxRuntimeExports.jsx(Page, { startDate: page.startDate, endDate: page.endDate }); 7403} 7404function lazyWithReload$1(factory) { 7405 return reactExports.lazy(() => factory().catch((err) => { 7406 const msg = err instanceof Error ? err.message : String(err); 7407 const isChunkError = msg.includes("dynamically imported module") || msg.includes("Failed to fetch dynamically imported module") || msg.includes("Importing a module script failed") || msg.includes("error loading dynamically imported module"); 7408 if (isChunkError && typeof window !== "undefined") { 7409 const key = `chunk_reload_${window.location.pathname}`; 7410 if (!sessionStorage.getItem(key)) { 7411 sessionStorage.setItem(key, "1"); 7412 window.location.reload(); 7413 return new Promise(() => { 7414 }); 7415 } 7416 } 7417 throw err; 7418 })); 7419} 7420const NotFoundPage = lazyWithReload$1(() => __vitePreload(() => import("./_404-CJ5XVNv6.js"), true ? __vite__mapDeps([0,1,2]) : void 0)); 7421const PowerPivotBook = lazyWithReload$1(() => __vitePreload(() => import("./powerpivot-book-CUVPBfij.js"), true ? __vite__mapDeps([3,1,2,4]) : void 0)); 7422const CopilotExcelBook = lazyWithReload$1(() => __vitePreload(() => import("./copilot-excel-book-DFIX0nXb.js"), true ? __vite__mapDeps([5,1,2,4]) : void 0)); 7423const ManualViewer = lazyWithReload$1(() => __vitePreload(() => import("./_id_-BnDw6l9Y.js"), true ? __vite__mapDeps([6,1,2,4]) : void 0)); 7424const StudentDashboard = lazyWithReload$1(() => __vitePreload(() => import("./student-8iMTkCO3.js"), true ? __vite__mapDeps([7,1,2,8,4,9]) : void 0)); 7425const InstructorDashboard = lazyWithReload$1(() => __vitePreload(() => import("./instructor-B8sJKUi6.js"), true ? __vite__mapDeps([10,1,2,8,11,9]) : void 0)); 7426const InstructorBlog = lazyWithReload$1(() => __vitePreload(() => import("./instructor-blog-W6A6aBBN.js"), true ? __vite__mapDeps([12,1,2,13,8]) : void 0)); 7427const AdminDashboard = lazyWithReload$1(() => __vitePreload(() => import("./admin-mwydos7a.js"), true ? __vite__mapDeps([14,1,2,8,13,11,4,9]) : void 0)); 7428const CheckoutSuccess = lazyWithReload$1(() => __vitePreload(() => import("./success-CrklEs3W.js"), true ? __vite__mapDeps([15,1,2]) : void 0)); 7429const CheckoutCancel = lazyWithReload$1(() => __vitePreload(() => import("./cancel-C43VT2ZE.js"), true ? __vite__mapDeps([16,1,2]) : void 0)); 7430const InvoiceConfirmation = lazyWithReload$1(() => __vitePreload(() => import("./invoice-confirmation-DnOZWkI0.js"), true ? __vite__mapDeps([17,1,2]) : void 0)); 7431const InvoicePaymentSuccess = lazyWithReload$1(() => __vitePreload(() => import("./invoice-payment-success-E47MHV7Z.js"), true ? __vite__mapDeps([18,1,2]) : void 0)); 7432const StaffLogin = lazyWithReload$1(() => __vitePreload(() => import("./staff-login-CdvqelaB.js"), true ? __vite__mapDeps([19,1,2,8]) : void 0)); 7433const ResetPassword = lazyWithReload$1(() => __vitePreload(() => import("./reset-password-Chmuuhq4.js"), true ? __vite__mapDeps([20,1,2]) : void 0)); 7434const ResetPasswordConfirm = lazyWithReload$1(() => __vitePreload(() => import("./reset-password-confirm-DHEAQV0b.js"), true ? __vite__mapDeps([21,1,2]) : void 0)); 7435const TestEnrollment = lazyWithReload$1(() => __vitePreload(() => import("./test-enrollment-D0tBRKFX.js"), true ? __vite__mapDeps([22,1,2]) : void 0)); 7436const TestMagicLink = lazyWithReload$1(() => __vitePreload(() => import("./test-magic-link-Cw5A0QFT.js"), true ? __vite__mapDeps([23,1,2,4]) : void 0)); 7437const DevResetPassword = lazyWithReload$1(() => __vitePreload(() => import("./dev-reset-password-C2khYBJ4.js"), true ? __vite__mapDeps([24,1,2]) : void 0)); 7438const UnsubscribePage = lazyWithReload$1(() => __vitePreload(() => import("./unsubscribe-BjwoSPno.js"), true ? __vite__mapDeps([25,1,2]) : void 0)); 7439const SurveyPage = lazyWithReload$1(() => __vitePreload(() => import("./_token_-CIiEJRHv.js"), true ? __vite__mapDeps([26,1,2]) : void 0)); 7440async function courseLoader({ 7441 params 7442}) { 7443 return null; 7444} 7445async function coursesLoader() { 7446 return null; 7447} 7448async function categoryPageLoader(_slug, _canonicalPath) { 7449 return null; 7450} 7451async function copilotExcelAwarenessLoader() { 7452 return null; 7453} 7454async function blogListLoader() { 7455 return null; 7456} 7457async function blogPostLoader({ 7458 params 7459}) { 7460 return null; 7461} 7462function RouteError() { 7463 const error = useRouteError(); 7464 const is404 = isRouteErrorResponse(error) && error.status === 404; 7465 const isChunkError = error instanceof Error && (error.message.includes("dynamically imported module") || error.message.includes("Failed to fetch dynamically imported module") || error.message.includes("error loading dynamically imported module")); 7466 if (is404) { 7467 if (typeof window !== "undefined") window.location.replace("/404"); 7468 return null; 7469 } 7470 if (isChunkError) { 7471 return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "min-h-[60vh] flex flex-col items-center justify-center gap-4 px-4 text-center", children: [
7472 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-lg font-semibold text-foreground", children: "This page was updated" }), 7473 /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground max-w-sm", children: "A new version of SkillForge was just deployed. Please refresh the page to continue." }), 7474 /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => window.location.reload(), className: "mt-2 px-5 py-2 rounded-md bg-primary text-primary-foreground text-sm font-medium hover:opacity-90 transition-opacity", children: "Refresh now" }) 7475 ] }); 7476 } 7477 return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "min-h-[60vh] flex items-center justify-center px-4", children: /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-muted-foreground", children: "Something went wrong loading this page. Please try again." }) }); 7478} 7479const BlogPostError = RouteError; 7480const routes = [ 7481 { 7482 path: "/", 7483 element: /* @__PURE__ */ jsxRuntimeExports.jsx(HomePage, {}) 7484 }, 7485 { 7486 path: "/auth", 7487 element: /* @__PURE__ */ jsxRuntimeExports.jsx(AuthPage, {}) 7488 }, 7489 { 7490 path: "/auth/staff", 7491 element: /* @__PURE__ */ jsxRuntimeExports.jsx(StaffLogin, {}) 7492 }, 7493 { 7494 path: "/auth/reset-password", 7495 element: /* @__PURE__ */ jsxRuntimeExports.jsx(ResetPassword, {}) 7496 }, 7497 { 7498 path: "/auth/reset-password/confirm", 7499 element: /* @__PURE__ */ jsxRuntimeExports.jsx(ResetPasswordConfirm, {}) 7500 }, 7501 // ââ Course category pages (static, cache-backed) âââââââââââââââââââââââââ 7502 // Each route has its own loader that reads from the in-memory category cache. 7503 // No per-request DB queries, no dynamic slug resolution, no soft 404 risk. 7504 { 7505 path: "/course-categories/ai", 7506 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$F, {}), 7507 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7508 loader: () => categoryPageLoader() 7509 }, 7510 { 7511 path: "/course-categories/adobe", 7512 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$E, {}), 7513 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7514 loader: () => categoryPageLoader() 7515 }, 7516 { 7517 path: "/course-categories/adobe/acrobat", 7518 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$D, {}), 7519 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7520 loader: () => categoryPageLoader() 7521 }, 7522 { 7523 path: "/course-categories/adobe/illustrator", 7524 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$C, {}), 7525 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7526 loader: () => categoryPageLoader() 7527 }, 7528 { 7529 path: "/course-categories/adobe/indesign", 7530 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$B, {}), 7531 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7532 loader: () => categoryPageLoader() 7533 }, 7534 { 7535 path: "/course-categories/adobe/photoshop", 7536 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$A, {}), 7537 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7538 loader: () => categoryPageLoader() 7539 }, 7540 { 7541 path: "/course-categories/business-skills", 7542 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$z, {}), 7543 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7544 loader: () => categoryPageLoader() 7545 }, 7546 { 7547 path: "/course-categories/business-skills/communication-skills", 7548 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$y, {}), 7549 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7550 loader: () => categoryPageLoader() 7551 }, 7552 { 7553 path: "/course-categories/business-skills/customer-service", 7554 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$x, {}), 7555 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7556 loader: () => categoryPageLoader() 7557 }, 7558 { 7559 path: "/course-categories/business-skills/presentation-skills", 7560 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$w, {}), 7561 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7562 loader: () => categoryPageLoader() 7563 }, 7564 { 7565 path: "/course-categories/business-skills/time-management", 7566 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$v, {}), 7567 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7568 loader: () => categoryPageLoader() 7569 }, 7570 { 7571 path: "/course-categories/crystal-reports", 7572 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$u, {}), 7573 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7574 loader: () => categoryPageLoader() 7575 }, 7576 { 7577 path: "/course-categories/crystal-reports/introduction", 7578 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$t, {}), 7579 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7580 loader: () => categoryPageLoader() 7581 }, 7582 { 7583 path: "/course-categories/crystal-reports/intermediate", 7584 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$s, {}), 7585 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7586 loader: () => categoryPageLoader() 7587 }, 7588 { 7589 path: "/course-categories/microsoft", 7590 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$r, {}), 7591 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7592 loader: () => categoryPageLoader() 7593 }, 7594 { 7595 path: "/course-categories/microsoft/excel", 7596 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$q, {}), 7597 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7598 loader: () => categoryPageLoader() 7599 }, 7600 { 7601 path: "/course-categories/microsoft/word", 7602 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$p, {}), 7603 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7604 loader: () => categoryPageLoader() 7605 }, 7606 { 7607 path: "/course-categories/microsoft/powerpoint", 7608 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$o, {}), 7609 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7610 loader: () => categoryPageLoader() 7611 }, 7612 { 7613 path: "/course-categories/microsoft/access", 7614 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$n, {}), 7615 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7616 loader: () => categoryPageLoader() 7617 }, 7618 { 7619 path: "/course-categories/microsoft/outlook", 7620 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$m, {}), 7621 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7622 loader: () => categoryPageLoader() 7623 }, 7624 { 7625 path: "/course-categories/microsoft/project", 7626 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$l, {}), 7627 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7628 loader: () => categoryPageLoader() 7629 }, 7630 { 7631 path: "/course-categories/microsoft/sharepoint", 7632 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$k, {}), 7633 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7634 loader: () => categoryPageLoader() 7635 }, 7636 { 7637 path: "/course-categories/microsoft/power-bi", 7638 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$j, {}), 7639 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7640 loader: () => categoryPageLoader() 7641 }, 7642 { 7643 path: "/course-categories/microsoft/copilot", 7644 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$i, {}), 7645 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7646 loader: () => categoryPageLoader() 7647 }, 7648 { 7649 path: "/course-categories/microsoft/teams", 7650 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$h, {}), 7651 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7652 loader: () => categoryPageLoader() 7653 }, 7654 { 7655 path: "/course-categories/microsoft-technical", 7656 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$g, {}), 7657 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7658 loader: () => categoryPageLoader() 7659 }, 7660 { 7661 path: "/course-categories/microsoft-technical/azure", 7662 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$f, {}), 7663 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7664 loader: () => categoryPageLoader() 7665 }, 7666 { 7667 path: "/course-categories/microsoft-technical/powershell", 7668 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$e, {}), 7669 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7670 loader: () => categoryPageLoader() 7671 }, 7672 { 7673 path: "/course-categories/microsoft-technical/microsoft-365", 7674 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$d, {}), 7675 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7676 loader: () => categoryPageLoader() 7677 }, 7678 { 7679 path: "/course-categories/microsoft-technical/power-apps", 7680 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$c, {}), 7681 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7682 loader: () => categoryPageLoader() 7683 }, 7684 { 7685 path: "/course-categories/microsoft-technical/power-automate", 7686 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$b, {}), 7687 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7688 loader: () => categoryPageLoader() 7689 }, 7690 { 7691 path: "/course-categories/microsoft-technical/security", 7692 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$a, {}), 7693 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7694 loader: () => categoryPageLoader() 7695 }, 7696 { 7697 path: "/course-categories/project-management", 7698 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$9, {}), 7699 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7700 loader: () => categoryPageLoader() 7701 }, 7702 { 7703 path: "/course-categories/project-management/agile-and-scrum", 7704 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$8, {}), 7705 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7706 loader: () => categoryPageLoader() 7707 }, 7708 { 7709 path: "/course-categories/project-management/project-management-training", 7710 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$7, {}), 7711 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7712 loader: () => categoryPageLoader() 7713 }, 7714 { 7715 path: "/course-categories/sql", 7716 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$6, {}), 7717 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7718 loader: () => categoryPageLoader() 7719 }, 7720 { 7721 path: "/course-categories/sql/sql-introduction", 7722 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$5, {}), 7723 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7724 loader: () => categoryPageLoader() 7725 }, 7726 { 7727 path: "/course-categories/sql/sql-advanced", 7728 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$4, {}), 7729 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7730 loader: () => categoryPageLoader() 7731 }, 7732 { 7733 path: "/course-categories/sql/introduction-to-sql-databases", 7734 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$3, {}), 7735 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7736 loader: () => categoryPageLoader() 7737 }, 7738 { 7739 path: "/course-categories/tableau", 7740 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$2, {}), 7741 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7742 loader: () => categoryPageLoader() 7743 }, 7744 { 7745 path: "/course-categories/tableau/tableau-introduction", 7746 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage$1, {}), 7747 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7748 loader: () => categoryPageLoader() 7749 }, 7750 { 7751 path: "/course-categories/tableau/tableau-intermediate", 7752 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CategoryPage, {}), 7753 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}), 7754 loader: () => categoryPageLoader() 7755 }, 7756 { 7757 path: "/courses", 7758 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CoursesPage, {}), 7759 loader: coursesLoader, 7760 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7761 }, 7762 { 7763 path: "/about", 7764 element: /* @__PURE__ */ jsxRuntimeExports.jsx(AboutPage, {}) 7765 }, 7766 { 7767 path: "/contact-us", 7768 element: /* @__PURE__ */ jsxRuntimeExports.jsx(ContactUsPage, {}) 7769 }, 7770 { 7771 path: "/privacy-policy", 7772 element: /* @__PURE__ */ jsxRuntimeExports.jsx(PrivacyPolicyPage, {}) 7773 }, 7774 { 7775 path: "/careers", 7776 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CareersPage, {}) 7777 }, 7778 { 7779 path: "/instructor-led-online-class-faqs", 7780 element: /* @__PURE__ */ jsxRuntimeExports.jsx(FaqPage, {}) 7781 }, 7782 { 7783 path: "/unsubscribe", 7784 element: /* @__PURE__ */ jsxRuntimeExports.jsx(UnsubscribePage, {}) 7785 }, 7786 { 7787 path: "/about/testimonials", 7788 element: /* @__PURE__ */ jsxRuntimeExports.jsx(TestimonialsPage, {}) 7789 }, 7790 { 7791 path: "/clients", 7792 element: /* @__PURE__ */ jsxRuntimeExports.jsx(ClientsPage, {}) 7793 }, 7794 { 7795 path: "/skillforge-blog", 7796 element: /* @__PURE__ */ jsxRuntimeExports.jsx(BlogPage, {}), 7797 loader: blogListLoader, 7798 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7799 }, 7800 { 7801 path: "/skillforge-blog/:slug", 7802 element: /* @__PURE__ */ jsxRuntimeExports.jsx(BlogPostPage, {}), 7803 loader: blogPostLoader, 7804 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(BlogPostError, {}) 7805 }, 7806 { 7807 path: "/:slug", 7808 element: /* @__PURE__ */ jsxRuntimeExports.jsx(BlogPostPage, {}), 7809 loader: blogPostLoader, 7810 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(BlogPostError, {}) 7811 }, 7812 { 7813 path: "/courses/:slug", 7814 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CourseDetailPage, {}), 7815 loader: courseLoader, 7816 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7817 }, 7818 { 7819 path: "/powerpivot-book", 7820 element: /* @__PURE__ */ jsxRuntimeExports.jsx(PowerPivotBook, {}), 7821 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7822 }, 7823 { 7824 path: "/copilot-excel-book", 7825 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CopilotExcelBook, {}), 7826 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7827 }, 7828 { 7829 path: "/manuals/:id/view",
7830 element: /* @__PURE__ */ jsxRuntimeExports.jsx(ManualViewer, {}), 7831 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7832 }, 7833 { 7834 path: "/student", 7835 element: /* @__PURE__ */ jsxRuntimeExports.jsx(StudentDashboard, {}), 7836 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7837 }, 7838 { 7839 path: "/instructor", 7840 element: /* @__PURE__ */ jsxRuntimeExports.jsx(InstructorDashboard, {}), 7841 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7842 }, 7843 { 7844 path: "/instructor/blog", 7845 element: /* @__PURE__ */ jsxRuntimeExports.jsx(InstructorBlog, {}), 7846 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7847 }, 7848 { 7849 path: "/admin", 7850 element: /* @__PURE__ */ jsxRuntimeExports.jsx(AdminDashboard, {}), 7851 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7852 }, 7853 { 7854 path: "/checkout/success", 7855 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CheckoutSuccess, {}) 7856 }, 7857 { 7858 path: "/checkout/cancel", 7859 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CheckoutCancel, {}) 7860 }, 7861 { 7862 path: "/checkout/invoice-confirmation", 7863 element: /* @__PURE__ */ jsxRuntimeExports.jsx(InvoiceConfirmation, {}) 7864 }, 7865 { 7866 path: "/invoice-payment-success", 7867 element: /* @__PURE__ */ jsxRuntimeExports.jsx(InvoicePaymentSuccess, {}) 7868 }, 7869 { 7870 path: "/test-enrollment", 7871 element: /* @__PURE__ */ jsxRuntimeExports.jsx(TestEnrollment, {}) 7872 }, 7873 { 7874 path: "/test-magic-link", 7875 element: /* @__PURE__ */ jsxRuntimeExports.jsx(TestMagicLink, {}) 7876 }, 7877 { 7878 path: "/dev-reset-password", 7879 element: /* @__PURE__ */ jsxRuntimeExports.jsx(DevResetPassword, {}) 7880 }, 7881 { 7882 path: "/survey/:token", 7883 element: /* @__PURE__ */ jsxRuntimeExports.jsx(SurveyPage, {}) 7884 }, 7885 { 7886 // ââ SSR landing pages â specific slugs registered before the generic catch-all ââ 7887 // The generic /lp/:slug route uses lp/index.tsx which resolves components via 7888 // an eager glob at module-load time. On the server that glob resolves to an 7889 // empty object (no window, module state never populated), so SSR always hits 7890 // the "page not found" branch and renders <Navigate to="/" replace />. 7891 // Registering specific slugs as direct routes with their own SSR loaders 7892 // bypasses lp/index.tsx entirely and gives crawlers fully-rendered HTML. 7893 path: "/lp/copilot-excel-awareness", 7894 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CopilotExcelAwarenessPage, {}), 7895 loader: copilotExcelAwarenessLoader, 7896 errorElement: /* @__PURE__ */ jsxRuntimeExports.jsx(RouteError, {}) 7897 }, 7898 { 7899 path: "/lp/:slug", 7900 element: /* @__PURE__ */ jsxRuntimeExports.jsx(LandingPage, {}) 7901 }, 7902 { 7903 path: "*", 7904 element: /* @__PURE__ */ jsxRuntimeExports.jsx(NotFoundPage, {}) 7905 } 7906]; 7907const Toaster = ({ 7908 ...props 7909}) => { 7910 return /* @__PURE__ */ jsxRuntimeExports.jsx(Toaster$1, { theme: "system", className: "toaster group", toastOptions: { 7911 classNames: { 7912 toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg", 7913 description: "group-[.toast]:text-muted-foreground", 7914 actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground", 7915 cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground" 7916 } 7917 }, ...props }); 7918}; 7919function lazyWithReload(factory) { 7920 return reactExports.lazy(() => factory().catch((err) => { 7921 const msg = err instanceof Error ? err.message : String(err); 7922 const isChunkError = msg.includes("dynamically imported module") || msg.includes("Failed to fetch dynamically imported module") || msg.includes("Importing a module script failed") || msg.includes("error loading dynamically imported module"); 7923 if (isChunkError && typeof window !== "undefined") { 7924 const key = `chunk_reload_${window.location.pathname}`; 7925 if (!sessionStorage.getItem(key)) { 7926 sessionStorage.setItem(key, "1"); 7927 window.location.reload(); 7928 return new Promise(() => { 7929 }); 7930 } 7931 } 7932 throw err; 7933 })); 7934} 7935const SignPage = lazyWithReload(() => __vitePreload(() => import("./_slug_-CNFgW9eQ.js"), true ? __vite__mapDeps([27,1,2]) : void 0)); 7936const SignDonePage = lazyWithReload(() => __vitePreload(() => import("./done-D8SGsd7a.js"), true ? __vite__mapDeps([28,1,2]) : void 0)); 7937const SpinnerFallback = () => /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex justify-center py-8 h-screen items-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Spinner, {}) }); 7938const router = createBrowserRouter([ 7939 // Standalone routes â no RootLayout, no header/footer 7940 { 7941 path: "/sign/:slug", 7942 element: /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx(SpinnerFallback, {}), children: /* @__PURE__ */ jsxRuntimeExports.jsx(SignPage, {}) }) 7943 }, 7944 { 7945 path: "/sign/:slug/done", 7946 element: /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx(SpinnerFallback, {}), children: /* @__PURE__ */ jsxRuntimeExports.jsx(SignDonePage, {}) }) 7947 }, 7948 // Main layout routes â wrapped in RootLayout 7949 { 7950 path: "/", 7951 element: /* @__PURE__ */ jsxRuntimeExports.jsx(CartProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(reactExports.Suspense, { fallback: /* @__PURE__ */ jsxRuntimeExports.jsx(SpinnerFallback, {}), children: /* @__PURE__ */ jsxRuntimeExports.jsx(RootLayout, { children: /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
7952 /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollToTop, {}), 7953 /* @__PURE__ */ jsxRuntimeExports.jsx(Outlet, {}) 7954 ] }) }) }) }), 7955 children: routes 7956 } 7957]); 7958function App() { 7959 return /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [ 7960 /* @__PURE__ */ jsxRuntimeExports.jsx(RouterProvider$1, { router }), 7961 /* @__PURE__ */ jsxRuntimeExports.jsx(Toaster, {}), 7962 /* @__PURE__ */ jsxRuntimeExports.jsx(HybridChatWidget, {}) 7963 ] }); 7964} 7965const queryClient = new QueryClient({ 7966 defaultOptions: { 7967 queries: { 7968 staleTime: 1e3 * 60 * 5, 7969 // 5 minutes 7970 gcTime: 1e3 * 60 * 10, 7971 // 10 minutes (formerly cacheTime) 7972 retry: 1, 7973 refetchOnWindowFocus: false 7974 }, 7975 mutations: { 7976 retry: 0 7977 } 7978 } 7979}); 7980const rootElement = document.getElementById("app"); 7981if (!rootElement) throw new Error("Root element not found"); 7982const root = ReactDOM.createRoot(rootElement); 7983root.render(/* @__PURE__ */ jsxRuntimeExports.jsx(React.StrictMode, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(HelmetProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsxRuntimeExports.jsx(App, {}) }) }) })); 7984export { 7985 SheetContent as A, 7986 Button as B, 7987 Card as C, 7988 Dialog as D, 7989 SheetHeader as E, 7990 SheetTitle as F, 7991 SheetDescription as G, 7992 signOut as H, 7993 Input as I, 7994 buttonVariants as J, 7995 signIn as K, 7996 Label as L, 7997 sendMagicLink as M, 7998 RadioGroup as R, 7999 Select as S, 8000 Textarea as T, 8001 CardHeader as a, 8002 CardTitle as b, 8003 CardDescription as c, 8004 CardContent as d, 8005 useCart as e, 8006 Badge as f, 8007 getUserWithRole as g, 8008 formatSessionDate$1 as h, 8009 cn as i, 8010 SelectTrigger as j, 8011 SelectValue as k, 8012 SelectContent as l, 8013 manual_viewer as m, 8014 SelectItem as n, 8015 DialogContent as o, 8016 DialogHeader as p, 8017 DialogTitle as q, 8018 DialogDescription as r, 8019 sanitizeBlogContent as s, 8020 htmlToPlainFaq as t, 8021 useSession as u, 8022 videoCss as v, 8023 DialogFooter as w, 8024 RadioGroupItem as x, 8025 DialogTrigger as y, 8026 Sheet as z 8027};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.