PageSourceSearch

https://hanttrail-8fwxhbgl.manus.space/assets/NationalTrailPage--0YSw-NC.js

js hanttrail-8fwxhbgl.manus.space collected 2026-10-03 05:03:25 UTC 43,043 bytes, 6 lines download raw bytes

1import{c as ha,H as ua,W as Ta,q as ba,s as m,r as x,j as a,aq as la,F as k,B as g}from"./index-CqGqwWKp.js";import{t as ia}from"./subscriptionPlans-BhNHOzcV.js";import{B as ja}from"./badge-CajhVRbo.js";import{I}from"./input-C-dhHZfz.js";import{A as fa}from"./arrow-left-BstHR7w2.js";import{C as ra}from"./chevron-left-BVmVB8Vs.js";import{T as ca}from"./trees-CgkaeD5n.js";import{E as aa}from"./external-link-Cv3lCqbB.js";import{S as O}from"./search-X9xeeq-b.js";import{M as S}from"./map-pin-DifvMV2M.js";import{C as Pa}from"./clock-Sbq_3bEj.js";import{C as ya}from"./chevron-right-D_p0tWne.js";import{T as va}from"./trash-2-BogXypcZ.js";import{C as wa}from"./circle-check-big-7cb6kGpN.js";import"./useComposition-CjDhl5L8.js";import"./usePersistFn-DaDCSoQ3.js";/**
2 * @license lucide-react v0.453.0 - ISC
3 *
4 * This source code is licensed under the ISC license.
5 * See the LICENSE file in the root directory of this source tree.
6 */const Ca=ha("Construction",[["rect",{x:"2",y:"6",width:"20",height:"8",rx:"1",key:"1estib"}],["path",{d:"M17 14v7",key:"7m2elx"}],["path",{d:"M7 14v7",key:"1cm7wv"}],["path",{d:"M17 3v3",key:"1v4jwn"}],["path",{d:"M7 3v3",key:"7o6guu"}],["path",{d:"M10 14 2.3 6.3",key:"1023jk"}],["path",{d:"m14 6 7.7 7.7",key:"1s8pl2"}],["path",{d:"m8 6 8 8",key:"hl96qh"}]]),Y=[{id:"국가숲길",label:"국가숲길",available:!0,color:"bg-emerald-700"},{id:"해파랑길",label:"해파랑길",available:!0,color:"bg-cyan-600"},{id:"남파랑길",label:"남파랑길",available:!0,color:"bg-blue-600"},{id:"서해랑길",label:"서해랑길",available:!0,color:"bg-teal-600"},{id:"DMZ평화의길",label:"DMZ 평화의 길",available:!0,color:"bg-green-700"},{id:"동서트레일",label:"동서트레일",available:!0,color:"bg-orange-700"},{id:"내완보현황",label:"내 완보현황",available:!0,color:"bg-blue-700"}],ka={1:"bg-green-100 text-green-800",2:"bg-yellow-100 text-yellow-800",3:"bg-red-100 text-red-800"},Sa={1:"하",2:"중",3:"상"},La={"FOREST-DMZ":"from-green-800 to-green-600","FOREST-NAEPOMUN":"from-amber-700 to-amber-500","FOREST-DAEGWALLYEONG":"from-sky-700 to-sky-500","FOREST-BAEKDUDAEGAN":"from-purple-800 to-purple-600","FOREST-ULJIN":"from-emerald-800 to-emerald-600","FOREST-JIRISAN":"from-teal-700 to-teal-500","FOREST-HALLASAN":"from-cyan-700 to-cyan-500","FOREST-GWANGNEUNG":"from-lime-700 to-lime-500","FOREST-DAEJEON":"from-emerald-800 to-teal-500"};function qa(){const[U,N]=ua(),z=Ta(),{user:K,isAuthenticated:Z}=ba(),{data:_}=m.subscription.myStatus.useQuery(void 0,{enabled:Z});_?.planTier;const h=new URLSearchParams(z),f=h.get("tab"),L=h.get("forestTrail"),[i,B]=x.useState(f&&Y.some(e=>e.id===f)?f:"국가숲길"),[c,d]=x.useState(""),[p,s]=x.useState(1),[r,o]=x.useState(L??null),[n,b]=x.useState({show:!1,closures:[],pendingAction:null}),M=30,u=Y.find(e=>e.id===i),{data:j,isLoading:F,error:ea}=m.durunubi.getCachedCourses.useQuery({trailName:i},{enabled:u.available&&i!=="국가숲길"&&i!=="DMZ평화의길"&&i!=="동서트레일"}),{data:P,isLoading:A}=m.nationalTrails.getForestCourses.useQuery({trailTag:"EWT"},{enabled:i==="동서트레일"}),G=x.useMemo(()=>P?c.trim()?P.filter(e=>e.segmentName.includes(c)):P:[],[P,c]),{data:y,isLoading:E}=m.nationalTrails.getForestCourses.useQuery({trailTag:"DMZ"},{enabled:i==="DMZ평화의길"&&!!K}),Q=x.useMemo(()=>y?c.trim()?y.filter(e=>e.segmentName.includes(c)):y:[],[y,c]),{data:na}=m.trailClosures.list.useQuery({trailTag:r??void 0},{enabled:i==="국가숲길"}),{data:W,isLoading:ta}=m.nationalTrails.getForestTrailList.useQuery(void 0,{enabled:i==="국가숲길"}),{data:v,isLoading:R}=m.nationalTrails.getForestCourses.useQuery({trailTag:r??""},{enabled:i==="국가숲길"&&!!r}),q=x.useMemo(()=>j?.items?c.trim()?j.items.filter(e=>e.name.includes(c)||e.sigun.includes(c)):j.items:[],[j?.items,c]),J=x.useMemo(()=>v?c.trim()?v.filter(e=>e.segmentName.includes(c)):v:[],[v,c]),D=Math.ceil(q.length/M),sa=q.slice((p-1)*M,p*M),V=(e,l)=>{const t=new URLSearchParams;t.set("tab",e),l&&t.set("forestTrail",l),window.history.replaceState(null,"",`/national-trail?${t.toString()}`)},oa=e=>{B(e),d(""),s(1),o(null),V(e,null)},xa=e=>{o(e),d(""),V("국가숲길",e)},da=()=>{o(null),d(""),V("국가숲길",null)},$=()=>{const e=new URLSearchParams;return e.set("tab",i),r&&e.set("forestTrail",r),`/national-trail?${e.toString()}`},ga=e=>{if(!e.hasOfficialGpx)return;const l=new URLSearchParams({courseName:e.name,durunubiTrailId:String(e.id),returnPath:$()});N(`/track-map?${l.toString()}`)},X=(e,l)=>{new Date().toISOString().slice(0,10);const t=(na??[]).filter(T=>!(T.courseName&&!e.includes(T.courseName)&&!T.courseName.includes(e)));t.length>0?b({show:!0,closures:t,pendingAction:l}):l()},H=e=>{const l=new URLSearchParams({courseName:e.segmentName,trailMapTrackId:`foresttrail-${e.id}`,returnPath:$()});N(`/track-map?${l.toString()}`)},ma=e=>{const l=new URLSearchParams({type:"durunubi",id:e.crsIdx,name:e.name,durunubiTrailId:String(e.id),sigun:e.sigun,distanceKm:String(e.distanceKm),durationMin:String(e.durationMin),level:String(e.level),summary:e.summary,returnPath:$()});N(`/national-trail/course?${l.toString()}`)},pa={"8코스":{url:"https://pajuecoroad.com",name:"파주 임진강변 생태탐방로"},"16코스":{url:"https://cafe.naver.com/cwgpw",name:"네이버 카페"},"26코스":{url:"https://stour.ticketplay.zone/portal/index",name:"양구안보관광"},"30코스":{phone:"033-463-7077"}},Na=e=>{for(const[l,t]of Object.entries(pa))if(e.includes(l))return t;return{}},w=e=>{const l=new URLSearchParams({type:"db",id:String(e.id),name:e.segmentName,trailMapTrackId:`foresttrail-${e.id}`,trailTag:e.trailTag,distanceKm:String(e.distanceKm),returnPath:$()});if(e.pointCount&&l.set("pointCount",String(e.pointCount)),e.durunubiCrsIdx&&l.set("durunubiCrsIdx",e.durunubiCrsIdx),e.isReservation){l.set("isReservation","1");const t=Na(e.segmentName);t.url&&l.set("reservationUrl",t.url),t.name&&l.set("reservationName",t.name),t.phone&&l.set("reservationPhone",t.ph
6one)}N(`/national-trail/course?${l.toString()}`)};return a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:303",className:"flex flex-col h-screen bg-gray-950 text-white",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:305",className:"flex items-center gap-3 px-4 py-3 bg-gray-900 border-b border-gray-800",children:[i==="국가숲길"&&r?a.jsx("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:307",onClick:da,className:"text-gray-400 hover:text-white",children:a.jsx(fa,{"data-loc":"client/src/pages/NationalTrailPage.tsx:311",className:"w-6 h-6"})}):a.jsx("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:314",onClick:()=>N("/"),className:"text-gray-400 hover:text-white",children:a.jsx(ra,{"data-loc":"client/src/pages/NationalTrailPage.tsx:315",className:"w-6 h-6"})}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:318",children:[a.jsx("h1",{"data-loc":"client/src/pages/NationalTrailPage.tsx:319",className:"text-lg font-bold text-white",children:"국가 트레일"}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:320",className:"text-xs text-gray-400",children:i==="국가숲길"&&r?W?.find(e=>e.trailTag===r)?.name??"국가숲길":"국가 걷기 코스"})]})]}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:329",className:"flex overflow-x-auto scrollbar-hide bg-gray-900 border-b border-gray-800",children:Y.map(e=>a.jsxs("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:331",onClick:()=>oa(e.id),className:`flex-shrink-0 px-4 py-3 text-sm font-medium whitespace-nowrap transition-colors border-b-2 ${i===e.id?"border-amber-400 text-amber-400":"border-transparent text-gray-400 hover:text-gray-200"}`,children:[e.label,!e.available&&a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:342",className:"ml-1 text-xs text-gray-500",children:"(준비중)"})]},e.id))}),!ia()&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:350",className:"relative flex-1 overflow-hidden",children:[a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:352",className:"pointer-events-none select-none opacity-30 blur-[2px] p-4 space-y-3",children:[1,2,3,4,5].map(e=>a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:354",className:"h-16 bg-gray-800 rounded-xl"},e))}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:358",className:"absolute inset-0 flex flex-col items-center justify-center gap-3 bg-gray-950/80 backdrop-blur-[2px]",children:[a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:359",className:"w-14 h-14 rounded-full bg-gray-800 flex items-center justify-center",children:a.jsx(ca,{"data-loc":"client/src/pages/NationalTrailPage.tsx:360",className:"w-7 h-7 text-amber-400"})}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:362",className:"text-center px-6",children:[a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:363",className:"text-base font-bold text-white",children:"플러스 구독 필요"}),a.jsxs("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:364",className:"text-sm text-gray-400 mt-1",children:["국가트레일 GPX 따라가기는",a.jsx("br",{"data-loc":"client/src/pages/NationalTrailPage.tsx:364"}),"플러스 이상 구독에서 이용 가능합니다"]})]}),a.jsx("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:366",onClick:()=>N("/subscription"),className:"mt-1 px-6 py-2.5 bg-amber-500 hover:bg-amber-400 text-black font-bold rounded-xl text-sm transition-colors",children:"구독하기"})]})]}),ia()&&a.jsxs(a.Fragment,{children:[!u.available&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:379",className:"flex-1 flex flex-col items-center justify-center gap-4 text-center px-8",children:[a.jsx(Ca,{"data-loc":"client/src/pages/NationalTrailPage.tsx:380",className:"w-16 h-16 text-gray-600"}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:381",children:[a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:382",className:"text-lg font-semibold text-gray-300",children:u.label}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:383",className:"text-sm text-gray-500 mt-1",children:"데이터 준비 중입니다"}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:384",className:"text-xs text-gray-600 mt-2",children:"API 연동 후 업데이트 예정"})]})]}),i==="DMZ평화의길"&&u.available&&a.jsxs(a.Fragment,{children:[a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:393",className:"px-4 py-3 bg-green-950 border-b border-green-900",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:394",className:"flex items-center justify-between",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:395",children:[a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:396",className:"text-xs text-green-300 font-medium",children:"DMZ 평화의 길 · 총 46개 코스"}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:397",className:"text-xs text-green-500 mt-0.5",children:"⚠️ 예약노선은 두루누비에서 사전 예약 필요"})]}),a.jsxs("a",{"data-loc":"client/src/pages/NationalTrailPage.tsx:399",href:"https://www.durunubi.kr/dmz-course-list.do",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1 text-xs text-green-400 hover:text-green-300 bg-green-900 hover:bg-green-800 px-2.5 py-1.5 rounded-lg transition-colors",children:[a.jsx(aa,{"data-loc":"client/src/pages/NationalTrailPage.tsx:405",className:"w-3 h-3"}),"두루누비 코스 안내"]})]})}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:411",className:"px-4 py-3 bg-gray-900",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:412",className:"relative",children:[a.jsx(O,{"data-loc":"client/src/pages/NationalTrailPage.tsx:413",className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"}),a.jsx(I,{"data-loc":"client/src/pages/NationalTrailPage.tsx:414",value:c,onChange:e=>d(e.target.value),placeholder:"코스명 검색...",className:"pl-9 bg-gray-800 border-gray-700 text-white placeholder:text-gray-500 text-sm"})]})}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:422",className:"flex-1 overflow-y-auto",children:[E&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:424",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:425",className:"text-gray-400 text-sm",children:"코스 목록 불러오는 중..."})}),!E&&Q.map((e,l)=>{const t=e.segmentName.includes("⚠️예약"),T=e.segmentName.replace(/\s*⚠️예약노선.*$/,"").replace(/\s*⚠️예약.*$/,"").trim();return a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:432",className:"px-4 py-3 border-b border-gray-800 hover:bg-gray-900 transition-colors cursor-pointer",onClick:()=>w({...e,segmentName:T,isReservation:t}),children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:437",className:"flex items-start justify-between gap-2",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:438",className:"flex-1 min-w-0",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:439",className:"flex items-center gap-2 flex-wrap",children:[a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:440",className:"text-xs text-gray-500 font-mono w-5 text-right",children:l+1}),a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:441",className:"font-semibold text-white text-sm",children:T}),t&&a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:443",className:"flex items-center gap-0.5 text-xs bg-amber-900 text-amber-300 px-1.5 py-0.5 rounded font-medium",children:[a.jsx(la,{"data-loc":"client/src/pages/NationalTrailPage.tsx:444",className:"w-3 h-3"}),"예약 필수"]})]}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:449",className:"flex items-center gap-3 mt-1 text-xs text-gray-400 ml-7",children:[e.distanceKm>0&&a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:451",className:"flex items-center gap-1",children:[a.jsx(k,{"data-loc":"client/src/pages/NationalTrailPage.tsx:452",className:"w-3 h-3"}),e.distanceKm.toFixed(1),"km"]}),a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:456",className:"flex items-center gap-1",children:[a.jsx(S,{"data-loc":"client/src/pages/NationalTrailPage.tsx:457",className:"w-3 h-3"}
6),e.pointCount.toLocaleString(),"pts"]})]}),e.description&&a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:462",className:"ml-7 mt-1.5 text-xs leading-relaxed text-gray-500 line-clamp-2",children:e.description})]}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:465",className:"flex flex-col items-end gap-1",onClick:C=>C.stopPropagation(),children:[a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:466",size:"sm",variant:"outline",onClick:C=>{C.stopPropagation(),w({...e,segmentName:T,isReservation:t})},className:"h-7 border-gray-600 px-2 text-xs text-gray-200 hover:bg-gray-800",children:"코스 정보"}),t?a.jsxs("a",{"data-loc":"client/src/pages/NationalTrailPage.tsx:475",href:"https://www.durunubi.kr/dmz-course-list.do",target:"_blank",rel:"noopener noreferrer",className:"flex-shrink-0 flex items-center gap-1 bg-amber-700 hover:bg-amber-600 text-white text-xs px-2.5 py-1 h-8 rounded-md transition-colors",children:[a.jsx(aa,{"data-loc":"client/src/pages/NationalTrailPage.tsx:481",className:"w-3 h-3"}),"예약하기"]}):a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:485",size:"sm",onClick:C=>{C.stopPropagation(),H(e)},className:"flex-shrink-0 bg-green-700 hover:bg-green-600 text-white text-xs px-3 py-1 h-8",children:"따라가기"})]})]})},e.id)}),!E&&Q.length===0&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:499",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:500",className:"text-gray-400 text-sm",children:"코스가 없습니다"})}),!E&&y&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:504",className:"text-center py-3 text-xs text-gray-600",children:["총 ",Q.length,"개 코스"]})]})]}),i==="국가숲길"&&u.available&&!r&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:514",className:"flex-1 overflow-y-auto",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:515",className:"px-4 py-4",children:[a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:516",className:"text-xs text-gray-400 mb-4",children:"국가숲길 8개 트레일"}),ta&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:520",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:521",className:"text-gray-400 text-sm",children:"트레일 목록 불러오는 중..."})}),!ta&&W&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:525",className:"grid grid-cols-1 gap-3",children:W.map(e=>a.jsxs("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:527",onClick:()=>xa(e.trailTag),className:"w-full text-left rounded-xl overflow-hidden border border-gray-800 hover:border-emerald-600 transition-colors",children:[a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:532",className:`bg-gradient-to-r ${La[e.trailTag]??"from-gray-700 to-gray-600"} px-4 py-3`,children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:533",className:"flex items-center gap-2",children:[a.jsx(ca,{"data-loc":"client/src/pages/NationalTrailPage.tsx:534",className:"w-5 h-5 text-white/80"}),a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:535",className:"font-bold text-white text-base",children:e.name})]})}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:538",className:"bg-gray-900 px-4 py-3",children:[a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:539",className:"text-xs text-gray-400 mb-2",children:e.description}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:540",className:"flex items-center gap-4 text-xs text-gray-500",children:[a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:541",className:"flex items-center gap-1",children:[a.jsx(k,{"data-loc":"client/src/pages/NationalTrailPage.tsx:542",className:"w-3 h-3"}),e.courseCount,"개 코스"]}),a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:545",className:"flex items-center gap-1",children:[a.jsx(S,{"data-loc":"client/src/pages/NationalTrailPage.tsx:546",className:"w-3 h-3"}),"총 ",e.totalKm.toFixed(0),"km"]})]})]})]},e.trailTag))})]})}),i==="국가숲길"&&u.available&&r&&a.jsxs(a.Fragment,{children:[a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:563",className:"px-4 py-3 bg-gray-900",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:564",className:"relative",children:[a.jsx(O,{"data-loc":"client/src/pages/NationalTrailPage.tsx:565",className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"}),a.jsx(I,{"data-loc":"client/src/pages/NationalTrailPage.tsx:566",value:c,onChange:e=>d(e.target.value),placeholder:"코스명 검색...",className:"pl-9 bg-gray-800 border-gray-700 text-white placeholder:text-gray-500 text-sm"})]})}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:574",className:"flex-1 overflow-y-auto",children:[R&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:576",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:577",className:"text-gray-400 text-sm",children:"코스 목록 불러오는 중..."})}),!R&&J.map((e,l)=>a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:581",className:"px-4 py-3 border-b border-gray-800 hover:bg-gray-900 transition-colors cursor-pointer",onClick:()=>X(e.segmentName,()=>w(e)),children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:586",className:"flex items-start justify-between gap-2",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:587",className:"flex-1 min-w-0",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:588",className:"flex items-center gap-2 flex-wrap",children:[a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:589",className:"text-xs text-gray-500 font-mono w-5 text-right",children:l+1}),a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:590",className:"font-semibold text-white text-sm",children:e.segmentName})]}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:592",className:"flex items-center gap-3 mt-1 text-xs text-gray-400 ml-7",children:[e.distanceKm>0&&a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:594",className:"flex items-center gap-1",children:[a.jsx(k,{"data-loc":"client/src/pages/NationalTrailPage.tsx:595",className:"w-3 h-3"}),e.distanceKm.toFixed(1),"km"]}),a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:599",className:"flex items-center gap-1",children:[a.jsx(S,{"data-loc":"client/src/pages/NationalTrailPage.tsx:600",className:"w-3 h-3"}
6),e.pointCount.toLocaleString(),"pts"]})]}),e.description&&a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:605",className:"ml-7 mt-1.5 text-xs leading-relaxed text-gray-500 line-clamp-2",children:e.description})]}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:608",className:"flex flex-col items-end gap-1",onClick:t=>t.stopPropagation(),children:[a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:609",size:"sm",variant:"outline",onClick:t=>{t.stopPropagation(),X(e.segmentName,()=>w(e))},className:"h-7 border-gray-600 px-2 text-xs text-gray-200 hover:bg-gray-800",children:"코스 정보"}),a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:617",size:"sm",onClick:t=>{t.stopPropagation(),X(e.segmentName,()=>H(e))},className:"h-10 min-w-24 bg-emerald-600 px-3 text-sm font-semibold text-white shadow-sm hover:bg-emerald-700",children:"따라가기"})]})]})},e.id)),!R&&J.length===0&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:629",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:630",className:"text-gray-400 text-sm",children:"코스가 없습니다"})}),!R&&v&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:634",className:"text-center py-3 text-xs text-gray-600",children:["총 ",J.length,"개 코스"]})]})]}),i==="동서트레일"&&u.available&&a.jsxs(a.Fragment,{children:[a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:646",className:"px-4 py-3 bg-orange-950 border-b border-orange-900",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:647",className:"flex items-start justify-between",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:648",children:[a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:649",className:"text-sm text-orange-300 font-bold",children:"동서트레일 (East-West Trail)"}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:650",className:"text-xs text-orange-400 mt-0.5",children:"충남 태안 ~ 강원 동해안 동서횡단 트레일"}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:651",className:"text-xs text-orange-500 mt-1",children:"1~12구간(서쪽) · 47~55구간(동쪽) GPX 제공"})]})})}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:656",className:"px-4 py-3 bg-gray-900",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:657",className:"relative",children:[a.jsx(O,{"data-loc":"client/src/pages/NationalTrailPage.tsx:658",className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"}),a.jsx(I,{"data-loc":"client/src/pages/NationalTrailPage.tsx:659",value:c,onChange:e=>d(e.target.value),placeholder:"코스명 검색...",className:"pl-9 bg-gray-800 border-gray-700 text-white placeholder:text-gray-500 text-sm"})]})}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:667",className:"flex-1 overflow-y-auto",children:[A&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:669",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:670",className:"text-gray-400 text-sm",children:"코스 목록 불러오는 중..."})}),!A&&G.map((e,l)=>a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:674",className:"px-4 py-3 border-b border-gray-800 hover:bg-gray-900 transition-colors cursor-pointer",onClick:()=>w({...e,trailTag:"EWT"}),children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:679",className:"flex items-start justify-between gap-2",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:680",className:"flex-1 min-w-0",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:681",className:"flex items-center gap-2 flex-wrap",children:[a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:682",className:"text-xs text-gray-500 font-mono w-5 text-right",children:l+1}),a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:683",className:"font-semibold text-white text-sm",children:e.segmentName})]}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:685",className:"flex items-center gap-3 mt-1 text-xs text-gray-400 ml-7",children:[e.distanceKm>0&&a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:687",className:"flex items-center gap-1",children:[a.jsx(k,{"data-loc":"client/src/pages/NationalTrailPage.tsx:688",className:"w-3 h-3"}),e.distanceKm.toFixed(1),"km"]}),a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:692",className:"flex items-center gap-1",children:[a.jsx(S,{"data-loc":"client/src/pages/NationalTrailPage.tsx:693",className:"w-3 h-3"}
6),e.pointCount.toLocaleString(),"pts"]}),e.description&&a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:697",className:"text-gray-500 text-xs truncate max-w-[180px]",children:e.description})]})]}),a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:701",size:"sm",onClick:t=>{t.stopPropagation(),H(e)},className:"flex-shrink-0 bg-orange-600 hover:bg-orange-700 text-white text-xs px-3 py-1 h-8",children:"따라가기"})]})},e.id)),!A&&G.length===0&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:712",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:713",className:"text-gray-400 text-sm",children:"코스가 없습니다"})}),!A&&P&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:717",className:"text-center py-3 text-xs text-gray-600",children:["총 ",G.length,"개 GPX 파일"]})]})]}),u.available&&i!=="국가숲길"&&i!=="DMZ평화의길"&&i!=="동서트레일"&&a.jsxs(a.Fragment,{children:[a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:729",className:"px-4 py-3 bg-gray-900",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:730",className:"relative",children:[a.jsx(O,{"data-loc":"client/src/pages/NationalTrailPage.tsx:731",className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400"}),a.jsx(I,{"data-loc":"client/src/pages/NationalTrailPage.tsx:732",value:c,onChange:e=>{d(e.target.value),s(1)},placeholder:"코스명 또는 지역 검색...",className:"pl-9 bg-gray-800 border-gray-700 text-white placeholder:text-gray-500 text-sm"})]})}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:742",className:"flex-1 overflow-y-auto",children:[F&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:744",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:745",className:"text-gray-400 text-sm",children:"코스 목록 불러오는 중..."})}),ea&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:749",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:750",className:"text-red-400 text-sm",children:"데이터를 불러오지 못했습니다"})}),!F&&!ea&&sa.length===0&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:754",className:"flex items-center justify-center h-40",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:755",className:"text-gray-400 text-sm",children:"검색 결과가 없습니다"})}),!F&&sa.map((e,l)=>a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:759",className:"px-4 py-3 border-b border-gray-800 hover:bg-gray-900 transition-colors cursor-pointer",onClick:()=>ma(e),children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:764",className:"flex items-start justify-between gap-2",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:765",className:"flex-1 min-w-0",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:766",className:"flex items-center gap-2 flex-wrap",children:[a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:767",className:"text-xs text-gray-500 font-mono",children:(p-1)*M+l+1}),a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:770",className:"font-semibold text-white text-sm",children:e.name}),a.jsxs(ja,{"data-loc":"client/src/pages/NationalTrailPage.tsx:771",className:`text-xs px-1.5 py-0 ${ka[e.level]??"bg-gray-100 text-gray-800"}`,children:["난이도 ",Sa[e.level]??"-"]})]}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:775",className:"flex items-center gap-3 mt-1 text-xs text-gray-400",children:[a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:776",className:"flex items-center gap-1",children:[a.jsx(S,{"data-loc":"client/src/pages/NationalTrailPage.tsx:777",className:"w-3 h-3"}),e.sigun]}),e.distanceKm>0&&a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:781",className:"flex items-center gap-1",children:[a.jsx(k,{"data-loc":"client/src/pages/NationalTrailPage.tsx:782",className:"w-3 h-3"}),e.distanceKm.toFixed(1),"km"]}),e.durationMin>0&&a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:787",className:"flex items-center gap-1",children:[a.jsx(Pa,{"data-loc":"client/src/pages/NationalTrailPage.tsx:788",className:"w-3 h-3"}),e.durationMin>=60?`${Math.floor(e.durationMin/60)}시간 ${e.durationMin%60>0?`${e.durationMin%60}분`:""}`:`${e.durationMin}분`]})]}),e.summary&&a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:796",className:"text-xs text-gray-500 mt-1 line-clamp-2",children:e.summary})]}),e.hasOfficialGpx&&a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:800",size:"sm",onClick:t=>{t.stopPropagation(),ga(e)},className:"flex-shrink-0 bg-amber-500 hover:bg-amber-600 text-black text-xs px-3 py-1 h-8",children:"따라가기"})]})},e.crsIdx)),D>1&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:814",className:"flex items-center justify-center gap-2 py-4",children:[a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:815",variant:"outline",size:"sm",onClick:()=>s(e=>Math.max(1,e-1)),disabled:p===1,className:"border-gray-700 text-gray-300",children:a.jsx(ra,{"data-loc":"client/src/pages/NationalTrailPage.tsx:822",className:"w-4 h-4"})}),a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:824",className:"text-sm text-gray-400",children:[p," / ",D]}),a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:827",variant:"outline",size:"sm",onClick:()=>s(e=>
6Math.min(D,e+1)),disabled:p===D,className:"border-gray-700 text-gray-300",children:a.jsx(ya,{"data-loc":"client/src/pages/NationalTrailPage.tsx:834",className:"w-4 h-4"})})]}),!F&&j&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:840",className:"text-center py-3 text-xs text-gray-600",children:["총 ",q.length,"개 코스",c&&` (전체 ${j.totalCount}개 중)`]})]})]}),i==="내완보현황"&&a.jsx(Fa,{"data-loc":"client/src/pages/NationalTrailPage.tsx:850"}),n.show&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:855",className:"fixed inset-0 bg-black/70 z-50 flex items-center justify-center p-4",children:a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:856",className:"bg-gray-900 rounded-2xl p-5 max-w-sm w-full border border-red-800",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:857",className:"flex items-center gap-2 mb-3",children:[a.jsx(la,{"data-loc":"client/src/pages/NationalTrailPage.tsx:858",className:"w-5 h-5 text-red-400 flex-shrink-0"}),a.jsx("h3",{"data-loc":"client/src/pages/NationalTrailPage.tsx:859",className:"text-base font-bold text-red-300",children:"통제구간 안내"})]}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:861",className:"space-y-3 mb-4",children:n.closures.map(e=>a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:863",className:"bg-red-950/50 rounded-xl p-3 border border-red-900",children:[e.courseName&&a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:865",className:"text-xs font-semibold text-white mb-1",children:e.courseName}),a.jsxs("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:867",className:"text-xs text-red-300",children:["사유: ",e.reason]}),a.jsxs("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:868",className:"text-xs text-gray-400 mt-1",children:["기간: ",e.startDate,e.endDate?` ~ ${e.endDate}`:" ~ 미정"]})]},e.id))}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:874",className:"text-xs text-gray-400 mb-4",children:"통제구간입니다. 그래도 계속하시겠습니까?"}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:875",className:"flex gap-2",children:[a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:876",variant:"outline",className:"flex-1 border-gray-700 text-gray-300",onClick:()=>b({show:!1,closures:[],pendingAction:null}),children:"취소"}),a.jsx(g,{"data-loc":"client/src/pages/NationalTrailPage.tsx:883",className:"flex-1 bg-red-700 hover:bg-red-600 text-white",onClick:()=>{n.pendingAction?.(),b({show:!1,closures:[],pendingAction:null})},children:"계속 진행"})]})]})})]})]})}const Ma=[{trailName:"해파랑길",total:50,milestones:[{count:10,label:"해파랑 신인",emoji:"🌊",color:"from-cyan-400 to-cyan-600"},{count:25,label:"해파랑 탐험가",emoji:"🌊",color:"from-cyan-500 to-blue-600"},{count:50,label:"해파랑 완주",emoji:"🌊",color:"from-blue-500 to-blue-700",isFinal:!0}]},{trailName:"남파랑길",total:90,milestones:[{count:20,label:"남파랑 신인",emoji:"🌋",color:"from-blue-400 to-blue-600"},{count:45,label:"남파랑 탐험가",emoji:"🌋",color:"from-blue-500 to-indigo-600"},{count:90,label:"남파랑 완주",emoji:"🌋",color:"from-indigo-500 to-indigo-700",is
6Final:!0}]},{trailName:"서해랑길",total:109,milestones:[{count:25,label:"서해랑 신인",emoji:"🌅",color:"from-teal-400 to-teal-600"},{count:55,label:"서해랑 탐험가",emoji:"🌅",color:"from-teal-500 to-green-600"},{count:109,label:"서해랑 완주",emoji:"🌅",color:"from-green-500 to-green-700",isFinal:!0}]},{trailName:"DMZ평화의길",total:35,milestones:[{count:10,label:"DMZ 신인",emoji:"🏳️",color:"from-green-600 to-green-800"},{count:35,label:"DMZ 완주",emoji:"🏳️",color:"from-green-700 to-emerald-800",isFinal:!0}]}];function Fa(){const{data:U,isLoading:N}=m.nationalTrailCompletions.mySummary.useQuery(),{data:z,isLoading:K,refetch:Z}=m.nationalTrailCompletions.myList.useQuery(),_=m.nationalTrailCompletions.delete.useMutation({onSuccess:()=>Z()}),[h,f]=x.useState(null),[L,i]=x.useState(null),B=["해파랑길","남파랑길","서해랑길","DMZ평화의길","국가숲길"],c={해파랑길:50,남파랑길:90,서해랑길:109,DMZ평화의길:35,국가숲길:0};if(N||K)return a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:954",className:"flex items-center justify-center py-16",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:955",className:"text-gray-400 text-sm",children:"불러오는 중..."})});const d=U?.byTrail??{},p=z??[];return a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:964",className:"flex-1 overflow-y-auto p-4 space-y-4",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:965",className:"text-sm text-gray-400 mb-2",children:["총 ",a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:965",className:"text-white font-bold",children:[U?.total??0,"개"]})," 코스 완보 기록"]}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:968",className:"space-y-2",children:B.map(s=>{const r=d[s],o=c[s],n=r?.count??0,b=o>0?Math.round(n/o*100):0;return a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:975",className:"bg-gray-900 rounded-xl p-4",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:976",className:"flex items-center justify-between mb-2",children:[a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:977",className:"font-semibold text-white text-sm",children:s}),a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:978",className:"text-xs text-gray-400",children:[n,"개 완보",o>0?` / ${o}개`:"",o>0&&a.jsxs("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:980",className:"ml-2 text-amber-400 font-bold",children:[b,"%"]})]})]}),o>0&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:984",className:"w-full bg-gray-800 rounded-full h-1.5 mb-2",children:a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:985",className:"bg-amber-400 h-1.5 rounded-full transition-all",style:{width:`${b}%`}})}),n>0&&a.jsx("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:992",onClick:()=>f(h===s?null:s),className:"text-xs text-blue-400 hover:text-blue-300",children:h===s?"접기":"기록 보기"})]},s)})}),h&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1006",className:"space-y-2",children:[a.jsxs("h3",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1007",className:"text-sm font-semibold text-white",children:[h," 완보 기록"]}),p.filter(s=>s.trailName===h).map(s=>a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1011",className:"bg-gray-900 rounded-xl p-3 flex items-start justify-between gap-2",children:[a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1012",className:"flex-1 min-w-0",children:[a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1013",className:"text-sm text-white font-medium truncate",children:s.courseTitle}),a.jsxs("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1014",className:"text-xs text-gray-500 mt-0.5",children:[new Date(s.completedAt).toLocaleDateString("ko-KR"),s.distanceKm&&` · ${Number(s.distanceKm).toFixed(1)}km`]}),s.memo&&a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1018",className:"text-xs text-gray-400 mt-1 italic",children:s.memo})]}),a.jsx("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1020",onClick:()=>_.mutate({id:s.id}),className:"text-gray-600 hover:text-red-400 transition-colors flex-shrink-0",children:a.jsx(va,{"data-loc":"client/src/pages/NationalTrailPage.tsx:1024",className:"w-4 h-4"})})]},s.id))]}),a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1032",className:"mt-2",children:[a.jsx("h3",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1033",className:"text-sm font-semibold text-white mb-3",children:"🏅 완보 배지"}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1034",className:"grid grid-cols-2 gap-3",children:Ma.flatMap(s=>s.milestones.map(r=>{const o=d[s.trailName]?.count??0,n=o>=r.count;return a.jsxs("button",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1040",onClick:()=>i(n?`${s.trailName}-${r.count}`:null),className:`relative rounded-2xl p-4 text-center transition-all ${n?`bg-gradient-to-br ${r.color} shadow-lg`:"bg-gray-900 border border-gray-800"}`,children:[!n&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1050",className:"absolute inset-0 rounded-2xl bg-gray-950/60 flex items-center justify-center",children:a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1051",className:"text-2xl opacity-30",children:"🔒"})}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1054",className:`text-3xl mb-1 ${n?"":"opacity-30 grayscale"}`,children:r.isFinal?"🏆":r.emoji}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1057",className:`text-xs font-bold ${n?"text-white":"text-gray-600"}`,children:r.label}),a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1060",className:`text-[10px] mt-0.5 ${n?"text-white/80":"text-gray-700"}`,children:n?`${o}/${s.total}코스`:`${o}/${r.count}코스`}),n&&r.isFinal&&a.jsx("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1066",className:"absolute -top-1 -right-1 w-5 h-5 bg-yellow-400 rounded-full flex items-center justify-center",children:a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1067",className:"text-[8px] font-black text-yellow-900",children:"★"})})]},`${s.trailName}-${r.count}`)}))}),L&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1076",className:"mt-3 p-3 rounded-xl bg-gray-900 border border-gray-700",children:[a.jsxs("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1077",className:"text-xs text-gray-300",children:["🏅 ",a.jsx("span",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1078",className:"text-white font-semibold",children:L.split("-").slice(0,-1).join("-")})," 배지를 획득했습니다! 두루누비 완보인증 신청 페이지에서 공식 인증서를 발급받으세요."]}),a.jsxs("a",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1081",href:"https://www.durunubi.kr/walkcourse/certification.do",target:"_blank",rel:"noopener noreferrer",className:"mt-2 flex items-center gap-1 text-xs text-blue-400 hover:underline",children:[a.jsx(aa,{"data-loc":"client/src/pages/NationalTrailPage.tsx:1087",size:11})," 두루누비 인증 신청 페이지"]})]})]}),p.length===0&&a.jsxs("div",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1094",className:"text-center py-12 text-gray-500",children:[a.jsx(wa,{"data-loc":"client/src/pages/NationalTrailPage.tsx:1095",className:"w-12 h-12 mx-auto mb-3 opacity-30"}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1096",className:"text-sm",children:"아직 완보 기록이 없습니다"}),a.jsx("p",{"data-loc":"client/src/pages/NationalTrailPage.tsx:1097",className:"text-xs mt-1",children:"코스 상세 페이지에서 완보 기록하기 버튼을 눈러보세요"})]})]})}export{qa 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.