1import{r as p,j as e}from"./react-vendor-C-_weJGF.js";import{h as r,B as m}from"./index-DiEum5Ju.js";import{B as y}from"./badge-TGWIF5-T.js";import{A as b,S as x,R as f,b as g,bq as v,h as w,aS as _,ad as k,as as j}from"./icons-BZJMmL1V.js";import"./query-DA-B5yju.js";import"./radix-CMA3xQgM.js";import"./supabase-BppBjPB2.js";import"./motion-CfmjrLVm.js";const $=1,N="1e4e7885-c6a8-442e-82a9-8602c72b1ffc",S="2c56995b-e94e-4a31-8e1d-dac703a4029b",T="/__l5e/assets-v1/1e4e7885-c6a8-442e-82a9-8602c72b1ffc/demo-dashboard.webp",C="a/v1/2c56995b-e94e-4a31-8e1d-dac703a4029b/1e4e7885-c6a8-442e-82a9-8602c72b1ffc/demo-dashboard.webp",z="demo-dashboard.webp",R=34820,M="image/webp",A="2026-07-09T20:20:02Z",E={version:$,asset_id:N,project_id:S,url:T,r2_key:C,original_filename:z,size:R,content_type:M,created_at:A},P=1,Z="061ab15b-0992-44a4-834d-d36e1394d9ab",q="2c56995b-e94e-4a31-8e1d-dac703a4029b",B="/__l5e/assets-v1/061ab15b-0992-44a4-834d-d36e1394d9ab/demo-schedule.webp",D="a/v1/2c56995b-e94e-4a31-8e1d-dac703a4029b/061ab15b-0992-44a4-834d-d36e1394d9ab/demo-schedule.webp",L="demo-schedule.webp",U=58378,I="image/webp",O="2026-07-09T20:20:13Z",V={version:P,asset_id:Z,project_id:q,url:B,r2_key:D,original_filename:L,size:U,content_type:I,created_at:O},W=1,F="06b7804f-6534-4507-96f5-bd2fd5ee9bcd",G="2c56995b-e94e-4a31-8e1d-dac703a4029b",K="/__l5e/assets-v1/06b7804f-6534-4507-96f5-bd2fd5ee9bcd/demo-routing.webp",H="a/v1/2c56995b-e94e-4a31-8e1d-dac703a4029b/06b7804f-6534-4507-96f5-bd2fd5ee9bcd/demo-routing.webp",Y="demo-routing.webp",J=97542,Q="image/webp",X="2026-07-09T20:20:10Z",ee={version:W,asset_id:F,project_id:G,url:K,r2_key:H,original_filename:Y,size:J,content_type:Q,created_at:X},te=1,ae="7f6e8ef9-6917-47a9-b2eb-9d99852079c3",se="2c56995b-e94e-4a31-8e1d-dac703a4029b",ie="/__l5e/assets-v1/7f6e8ef9-6917-47a9-b2eb-9d99852079c3/demo-map.webp",oe="a/v1/2c56995b-e94e-4a31-8e1d-dac703a4029b/7f6e8ef9-6917-47a9-b2eb-9d99852079c3/demo-map.webp",re="demo-map.webp",ne=123512,de="image/webp",ce="2026-07-09T20:20:04Z",le={version:te,asset_id:ae,project_id:se,url:ie,r2_key:oe,original_filename:re,size:ne,content_type:de,created_at:ce},pe=1,me="4be58360-cefb-4d86-af27-0d9f65edfc81",be="2c56995b-e94e-4a31-8e1d-dac703a4029b",he="/__l5e/assets-v1/4be58360-cefb-4d86-af27-0d9f65edfc81/demo-territories.webp",ue="a/v1/2c56995b-e94e-4a31-8e1d-dac703a4029b/4be58360-cefb-4d86-af27-0d9f65edfc81/demo-territories.webp",ye="demo-territories.webp",xe=108448,fe="image/webp",ge="2026-07-09T20:20:19Z",ve={version:pe,asset_id:me,project_id:be,url:he,r2_key:ue,original_filename:ye,size:xe,content_type:fe,created_at:ge},we=1,_e="f995763f-465e-4cba-aa0c-99e671d87afe",ke="2c56995b-e94e-4a31-8e1d-dac703a4029b",je="/__l5e/assets-v1/f995763f-465e-4cba-aa0c-99e671d87afe/demo-reports.webp",$e="a/v1/2c56995b-e94e-4a31-8e1d-dac703a4029b/f995763f-465e-4cba-aa0c-99e671d87afe/demo-reports.webp",Ne="demo-reports.webp",Se=33434,Te="image/webp",Ce="2026-07-09T20:20:07Z",ze={version:we,asset_id:_e,project_id:ke,url:je,r2_key:$e,original_filename:Ne,size:Se,content_type:Te,created_at:Ce},Re=1,Me="ca7814cc-c5e6-4530-968e-740fc7eaca80",Ae="2c56995b-e94e-4a31-8e1d-dac703a4029b",Ee="/__l5e/assets-v1/ca7814cc-c5e6-4530-968e-740fc7eaca80/demo-technicians.webp",Pe="a/v1/2c56995b-e94e-4a31-8e1d-dac703a4029b/ca7814cc-c5e6-4530-968e-740fc7eaca80/demo-technicians.webp",Ze="demo-technicians.webp",qe=23180,Be="image/webp",De="2026-07-09T20:20:16Z",Le={version:Re,asset_id:Me,project_id:Ae,url:Ee,r2_key:Pe,original_filename:Ze,size:qe,content_type:Be,created_at:De},Ue="https://medroute360.com/signup",c=[{key:"planner",label:"Route Planner",icon:f,path:"app.medroute360.com/routing",image:ee.url,headline:"Build an entire week in one click",blurb:"Load unrouted visits, then let the engine sequence stops across every tech and every day, honoring time windows, lunches, and home base.",hotspots:[{id:"p1",x:39,y:20.5,title:"Route Week",body:"Runs multi-day optimization across all techs. Preview first, save when it looks right."},{id:"p2",x:13,y:47,title:"Visit queue",body:"Filter unscheduled or routed visits. Drag any of them onto a specific day to override the engine."},{id:"p3",x:75,y:45,title:"Live map preview",body:"See the proposed route as it builds. Pins recolor by technician."},{id:"p4",x:68,y:84,title:"Weekly timeline",body:"Per-day totals for visits, drive time, and miles. Clicking a day drills in."}]},{key:"schedule",label:"Weekly Schedule",icon:g,path:"app.medroute360.com/visits?view=calendar",image:V.url,headline:"Every visit, every tech, one calendar",blurb:"Filter by status or te
1ch, drag visits between days, and confirm appointments straight from the card, with ETAs that update automatically.",hotspots:[{id:"s1",x:30,y:25,title:"Status filters",body:"One-tap slicing by scheduled, planned, completed, missed, or cancelled."},{id:"s2",x:34,y:30.5,title:"Tech color legend",body:"Every visit card inherits its technician color for instant scanability."},{id:"s3",x:65,y:58,title:"Confirm from the card",body:"Confirm a visit without leaving the calendar, no modals, no extra clicks."},{id:"s4",x:89,y:43,title:"Unscheduled bucket",body:"Everything that still needs a home shows here until it lands on a day."}]},{key:"map",label:"Live Map",icon:v,path:"app.medroute360.com/routing?view=map",image:le.url,headline:"A real Google Map, colored by tech",blurb:"See every stop, home base, and end-of-day office on a live map with turn-by-turn ready to hand off to the field team.",hotspots:[{id:"m1",x:52,y:55,title:"Numbered stops",body:"Sequence numbers match the route timeline. Techs know exactly where they are in the day."},{id:"m2",x:88,y:39,title:"Stops list",body:"Every stop with status pill. Click a row to jump the map camera to it."},{id:"m3",x:69,y:87,title:"Route legend",body:"Miles and stop counts per technician, live as you tweak the plan."},{id:"m4",x:47,y:22,title:"Start / End controls",body:"Choose Home, Office, or a custom depot as bookends for each day."}]},{key:"territories",label:"Territories",icon:w,path:"app.medroute360.com/routing?view=territories",image:ve.url,headline:"Draw territories, balance the load",blurb:"Sketch polygons on the map, assign a tech to each, and instantly see patient distribution, including anyone stranded outside coverage.",hotspots:[{id:"t1",x:46,y:21,title:"Draw a territory",body:"Trace a polygon on the map. Snap boundaries and multi-shape support included."},{id:"t2",x:32,y:30,title:"Priority pills",body:"P0/P1/P2 badges rank overlapping territories so routing knows which wins."},{id:"t3",x:32,y:45,title:"Re-assign all",body:"Bulk push every affected patient to their new territory owner in one action."},{id:"t4",x:76,y:68,title:"Coverage dots",body:"Green = assigned patient, orange = unassigned. Spot gaps in seconds."}]},{key:"reports",label:"Reports",icon:_,path:"app.medroute360.com/reports",image:ze.url,headline:"Operations analytics that export cleanly",blurb:"Track visits, mileage, drive time, and on-time performance. Download reimbursement-ready CSVs for finance in one click.",hotspots:[{id:"r1",x:27,y:19.5,title:"One-click CSV",body:"Mileage, visit log, and tech performance exports, formatted for payroll and accounting."},{id:"r2",x:45,y:31,title:"Mileage metrics",body:"Total miles plus miles-per-visit so you can spot inefficient days."},{id:"r3",x:84,y:62,title:"Visits per day",body:"Instant sanity check on daily capacity utilization."},{id:"r4",x:37,y:92,title:"Completion mix",body:"Completed, planned, and missed split. Click through to the underlying visits."}]},{key:"dashboard",label:"Dashboard",icon:k,path:"app.medroute360.com/dashboard",image:E.url,headline:"Your day at a glance",blurb:"The first thing admins see every morning: today's visits, this week's workload, and whether anyone is still unscheduled.",hotspots:[{id:"d1",x:27,y:32,title:"Today",body:"Confirmed vs. unconfirmed visits for the current day, with jump-to detail."},{id:"d2",x:68,y:32,title:"Unscheduled alert",body:"Zero means everyone has a home. A nonzero number turns amber and links straight to the queue."},{id:"d3",x:66,y:55,title:"Today's visit stream",body:"Live status per visit: Completed, Planned, En route, with quick actions."},{id:"d4",x:94,y:32,title:"Field team",body:"Techs on duty and total active patients they cover."}]},{key:"team",label:"Team",icon:j,path:"app.medroute360.com/technicians",image:Le.url,headline:"Roster, availability, and approvals",blurb
1:"Manage technicians, weekly availability, and time-off approvals from one place. Roles gate what each person can see.",hotspots:[{id:"te1",x:27,y:12,title:"Roster / Approvals",body:"Toggle between the active roster and pending time-off requests."},{id:"te2",x:30,y:39,title:"Working days",body:"Compact weekly availability preview. Click the card to edit ranges and blackout dates."},{id:"te3",x:93,y:20,title:"Add technician",body:"Send an invite email and pre-assign role, territory, and default availability in one step."}]}];function Ye(){const[l,h]=p.useState(c[0].key),[o,n]=p.useState(null),a=c.find(t=>t.key===l),i=a.hotspots.find(t=>t.id===o)??null,u=t=>{h(t),n(null)};return e.jsx("section",{id:"demo",className:"border-t border-border bg-card/30",children:e.jsxs("div",{className:"mx-auto max-w-6xl px-4 py-20 sm:px-6 sm:py-24",children:[e.jsxs("div",{className:"mx-auto max-w-2xl text-center",children:[e.jsx("span",{className:"text-xs font-medium uppercase tracking-wider text-primary",children:"Try it live"}),e.jsx("h2",{className:"mt-3 font-display text-3xl font-semibold tracking-tight sm:text-4xl",children:"Take a tour of the real app"}),e.jsx("p",{className:"mt-4 text-muted-foreground",children:"Every tab below is an actual screenshot from MedRoute 360. Click the numbered pins to see what each control does."})]}),e.jsxs("div",{className:"mx-auto mt-10 grid gap-6 lg:grid-cols-[220px_1fr]",children:[e.jsx("div",{className:"lg:sticky lg:top-24 lg:self-start",children:e.jsx("div",{className:"flex gap-2 overflow-x-auto pb-1 lg:flex-col lg:overflow-visible lg:pb-0",children:c.map(t=>{const d=t.icon,s=t.key===l;return e.jsxs("button",{onClick:()=>u(t.key),className:r("group flex items-center gap-3 whitespace-nowrap rounded-lg border px-3 py-2.5 text-left text-sm font-medium transition-all",s?"border-primary/40 bg-primary/10 text-primary shadow-sm":"border-border bg-card text-muted-foreground hover:border-border/80 hover:text-foreground"),children:[e.jsx(d,{className:r("h-4 w-4 flex-shrink-0",s&&"text-primary")}),e.jsx("span",{children:t.label}),e.jsx(b,{className:r("ml-auto h-3.5 w-3.5 opacity-0 transition-opacity",s&&"opacity-100")})]},t.key)})})}),e.jsxs("div",{children:[e.jsxs("div",{className:"flex flex-wrap items-end justify-between gap-4",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 text-xs uppercase tracking-wider text-primary",children:[e.jsx(x,{className:"h-3.5 w-3.5"}),a.label]}),e.jsx("h3",{className:"mt-1 font-display text-2xl font-semibold tracking-tight",children:a.headline}),e.jsx("p",{className:"mt-1.5 max-w-xl text-sm text-muted-foreground",children:a.blurb})]}),e.jsxs(y,{variant:"outline",className:"border-border bg-card text-[11px] text-muted-foreground",children:[a.hotspots.length," interactive spots"]})]}),e.jsxs("div",{className:"mt-5 overflow-hidden rounded-xl border border-border bg-background shadow-2xl",children:[e.jsxs("div",{className:"flex items-center gap-3 border-b border-border bg-muted/40 px-4 py-2",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"h-2.5 w-2.5 rounded-full bg-red-400/80"}),e.jsx("span",{className:"h-2.5 w-2.5 rounded-full bg-yellow-400/80"}),e.jsx("span",{className:"h-2.5 w-2.5 rounded-full bg-green-400/80"})]}),e.jsxs("div",{className:"mx-auto flex max-w-full items-center gap-2 truncate rounded-md border border-border bg-background/70 px-3 py-1 text-[11px] text-muted-foreground",children:[e.jsx("span",{className:"h-1.5 w-1.5 rounded-full bg-primary"}),a.path]}),e.jsx("div",{className:"w-16"})]}),e.jsxs("div",{className:"relative isolate",children:[e.jsx("img",{src:a.image,alt:`${a.label} screenshot`,loading:"lazy",decoding:"async",width:1440,height:900,className:"block h-auto w-full animate-in fade-in duration-500"},a.image),a.hotspots.map((t,d)=>{const s=o===t.id;return e.jsx("button",{onClick:()=>n(s?null:t.id),className:"absolute -translate-x-1/2 -translate-y-1/2",style:{left:`${t.x}%`,top:`${t.y}%`},"aria-label":t.title,children:e.jsxs("span",{className:r("relative flex h-7 w-7 items-center justify-center rounded-full text-[11px] font-semibold text-primary-foreground shadow-lg transition-transform",s?"scale-110 bg-primary ring-4 ring-primary/30":"bg-primary hover:scale-110"),children:[!s&&e.jsx("span",{className:"absolute inset-0 -z-10 animate-ping rounded-full bg-primary/60"}),d+1]})},t.id)}),i&&e.jsxs("div",{className:"pointer-events-none absolute z-10 w-[240px] -translate-x-1/2 roun
1ded-lg border border-border bg-popover px-3.5 py-2.5 text-left text-xs shadow-xl animate-in fade-in zoom-in-95 duration-150",style:{left:`${Math.min(Math.max(i.x,15),85)}%`,top:`calc(${i.y}% + 28px)`},children:[e.jsx("p",{className:"text-[11px] font-semibold uppercase tracking-wider text-primary",children:i.title}),e.jsx("p",{className:"mt-1 leading-relaxed text-popover-foreground",children:i.body})]})]})]}),e.jsxs("div",{className:"mt-4 flex flex-wrap items-center justify-between gap-3 rounded-lg border border-dashed border-border bg-card/40 px-4 py-3",children:[e.jsx("p",{className:"text-xs text-muted-foreground",children:o?"Click another pin to explore, or switch tabs on the left.":"Click any numbered pin on the screenshot to see what it does."}),e.jsxs("div",{className:"flex gap-2",children:[o&&e.jsx(m,{size:"sm",variant:"ghost",onClick:()=>n(null),children:"Clear"}),e.jsx(m,{asChild:!0,size:"sm",children:e.jsxs("a",{href:Ue,target:"_blank",rel:"noopener noreferrer",children:["Try MedRoute 360 free",e.jsx(b,{className:"ml-1 h-3.5 w-3.5"})]})})]})]})]})]})]})})}export{Ye as default};
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.