PageSourceSearch

https://krgv.net/_next/static/chunks/058q4edc5b5x0.js

js krgv.net collected 2026-10-08 10:55:30 UTC 28,300 bytes, 1 lines download raw bytes

1(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,44250,e=>{"use strict";var s=e.i(43476),t=e.i(8164);function l({size:e=16}){return(0,s.jsxs)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:"shrink-0",children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"8"}),(0,s.jsx)("path",{d:"M12 11.2v5M12 8.2h.01"})]})}let a={note:{wrap:"bg-n-25 [border-left-color:var(--color-n-400)]",head:"text-ink",body:"text-body"},info:{wrap:"bg-accent-soft [border-left-color:var(--color-accent)]",head:"text-accent-deep",body:"text-ink-soft"},warning:{wrap:"bg-warn-bg [border-left-color:var(--color-warn-accent)]",head:"text-warn-accent",body:"text-warn-ink"}};e.s(["Callout",0,function({tone:e="note",title:r,children:n}){let i=a[e];return(0,s.jsxs)("div",{className:`my-6 rounded-lg border border-l-2 border-line px-4 py-3.5 sm:px-5 sm:py-4 ${i.wrap}`,children:[r?(0,s.jsxs)("div",{className:`mb-1.5 flex items-center gap-2 ${i.head}`,children:["warning"===e?(0,s.jsx)(t.IconAlert,{size:16}):(0,s.jsx)(l,{}),(0,s.jsx)("strong",{className:"text-[13.5px] font-semibold tracking-[-0.02em]",children:r})]}):null,(0,s.jsx)("div",{className:`text-[15px] leading-[1.75] ${i.body}`,children:n})]})}])},59823,e=>{"use strict";e.s(["directoryEntries",0,[{id:"example-rgv-korean-market",name:"RGV Korean Market (Example)",category:"마트·식품",city:"맥알렌",phone:"(956) 000-0000",intro:"※ 이 항목은 등록 예시입니다, 실제로 존재하는 가게가 아닙니다. 아래처럼 상호·분류·주소·전화·사진과 함께 간단한 소개를 적어 주시면 됩니다. 예) 한국 식자재를 전문으로 취급하는 마트입니다. 김치·장류·냉동식품·라면·즉석식품을 갖추고 있고, 명절에는 제수용품과 떡도 준비합니다. 주차 공간이 넓고 한국어로 문의하실 수 있습니다.",address:"0000 Example St, McAllen, TX 78501 (예시 주소)",mapQuery:"McAllen, TX",hours:"월–토 10:00–20:00 · 일 12:00–18:00 (예시)",imageUrl:"/directory/rgv-kmart-logo.svg",updated:"2026.08",sample:!0},{id:"tokyo-asian-market",name:"Tokyo Asian Market",category:"마트·식품",city:"맥알렌",phone:"(956) 664-9007",intro:"맥알렌 10번가에 있는 아시안 식료품점입니다. 한국·일본·중국·베트남·필리핀 식품을 두루 취급해, 라면과 김치·장류·소스류, 냉동식품, 과자와 음료까지 한 번에 ë³¼ 수 있습니다. 일반 마트에서 구하기 어려운 수입 식자재를 찾을 때 들러볼 만합니다.",address:"2112 N 10th St #2112a, McAllen, TX 78501",mapQuery:"Tokyo Asian Market, 2112 N 10th St, McAllen, TX 78501",mapUrl:"https://maps.app.goo.gl/r7fPbtUEjpgPeVLT8",hours:"20:00 마감 · 요일별 영업시간은 방문 전 확인",imageUrl:"/directory/tokyo-asian-market.jpg",updated:"2026.08"}]])},85872,e=>{"use strict";e.i(36180);var s=e.i(515),t=e.i(63802),l=e.i(53798),a=e.i(33545);e.i(61086);var r=e.i(27215),n=e.i(59141);let i="directory";async function o(e,s){let t=[];for(let l=0;l<s.length;l++){let a=s[l],i=a.name.replace(/[^a-zA-Z0-9._-]/g,"_"),o=`directory/${e}/${Date.now()}_${l}_${i}`,c=await (0,r.uploadBytes)((0,r.ref)(n.storage,o),a,{contentType:a.type});t.push(await (0,r.getDownloadURL)(c.ref))}return t}async function c(e,l,r){if(!r.length)throw Error("사진을 최소 한 장 올려주세요.");let c=await o(e,r),d={};for(let[e,s]of Object.entries(l))void 0!==s&&""!==s&&(d[e]=s);await (0,t.addDoc)((0,s.collection)(n.db,i),{...d,photos:c,status:"pending",submittedBy:e,createdAt:(0,a.serverTimestamp)()})}async function d(){let e=(0,t.query)((0,s.collection)(n.db,i),(0,t.where)("status","==","published"));return(await (0,t.getDocs)(e)).docs.map(e=>({id:e.id,...e.data()}))}async function x(){let e=(0,t.query)((0,s.collection)(n.db,i),(0,t.where)("status","==","pending"),(0,t.orderBy)("createdAt","desc"));return(await (0,t.getDocs)(e)).docs.map(e=>({id:e.id,...e.data()}))}async function m(e){await (0,t.updateDoc)((0,l.doc)(n.db,i,e),{status:"published",publishedAt:(0,a.serverTimestamp)()})}async function h(e){await (0,t.deleteDoc)((0,l.doc)(n.db,i,e))}e.s(["DIRECTORY_CATEGORIES",0,["식당","카페·베이커리","마트·식품","병원·의원","치과","약국","미용·뷰티","교회·종교","법률","부동산","보험·금융","자동차","교육·학원","전문 서비스","기타"],"approveListing",0,m,"deleteListing",0,h,"fetchPending",0,x,"fetchPublished",0,d,"submitListing",0,c])},60229,e=>{"use strict";var s=e.i(43476),t=e.i(71645),l=e.i(85872),a=e.i(8164);function r(e){return`tel:${e.replace(/[^0-9+]/g,"")}`}let n="inline-flex h-[22px] items-center gap-1 rounded px-2 text-[12px] font-semibold tracking-[-0.01em]";function i({entries:e}){let[o,c]=(0,t.useState)(""),[d,x]=(0,t.useState)("전체"),m=(0,t.useMemo)(()=>{let s=new Set(e.map(e=>e.category));return["전체",...l.DIRECTORY_CATEGORIES.filter(e=>s.has(e))]},[e]),h=(0,t.useMemo)(()=>{let s=o.trim().toLowerCase();return e.filter(e=>("전체"===d||e.category===d)&&(!s||e.name.toLowerCase().includes(s)||(e.city??"").toLowerCase().includes(s)||e.category.includes(s)||(e.intro??"").toLowerCase().includes(s)))},[e,o,d]);return(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex flex-col gap-3 border-b border-line py-4 sm:flex-row sm:items-center",children:[(0,s.jsxs)("label",{className:"flex h-10 items-center gap-2 rounded-lg border border-edge bg-surface px-3 transition-colors focus-within:border-n-400 sm:w-[280px]",children:[(0,s.jsx)(a.IconSearch,{size:17,className:"shrink-0 text-faint"}),(0,s.jsx)("input",{type:"search",value:o,onChange:e=>c(e.target.value),placeholder:"상호·지역 검색 (예: 맥알렌, 치과)","aria-label":"주소록 검색",className:"w-full min-w-0 bg-transparent text-[15px] tracking-[-0.015em] text-ink outline-none"})]}),(0,s.jsx)("div",{role:"group","aria-label":"분류",className:"-mx-1 flex gap-1 overflow-x-auto px-1 pb-0.5",children:m.map(e=>{let t=d===e;return(0,s.jsx)("button",{type:"button",onClick:()=>x(e),"aria-pressed":t,className:`h-8 flex-none rounded-full border px-3 text-[13px] font-semibold tracking-[-0.015em] transition-colors ${t?"border-n-900 bg-n-900 text-n-0":"border-edge bg-surface text-body hover:bg-n-50 hover:text-ink"}`,children:e},e)})})]}),(0,s.jsxs)("p",{className:"py-4 text-[13px] text-subtle",children:[(0,s.jsx)("b",{className:"font-semibold text-ink tabular",children:h.length}),"ê³³"]}),0===h.length?(0,s.jsxs)("div",{className:"flex flex-col items-center gap-2.5 rounded-card border border-dashed border-edge px-6 py-16 text-center",children:[(0,s.jsx)("p",{className:"text-[15px] font-semibold text-ink",children:"조건에 맞는 곳이 없습니다"}),(0,s.jsx)("p",{className:"max-w-[36ch] text-[13.5px] leading-[1.7] text-subtle",children:"검색어나 분류를 바꿔 보세요. 빠진 곳은 아래에서 등록해 주시면 확인 후 추가됩니다."}),(0,s.jsx)("button",{type:"button",onClick:()=>{c(""),x("전체")},className:"mt-1 inline-flex h-8 items-center rounded-md border border-edge bg-surface px-3 text-[13px] font-semibold text-ink-soft shadow-xs transition-colors hover:border-n-300 hover:bg-n-50",children:"필터 초기화"})]}):(0,s.jsx)("div",{className:"grid gap-4 sm:grid-cols-2",children:h.map(e=>{var t;return(0,s.jsxs)("article",{className:"flex flex-col overflow-hidden rounded-card border border-line bg-surface transition-[border-color,box-shadow] hover:border-n-300 hover:shadow-md",children:[e.photos[0]?(0,s.jsx)("img",{src:e.photos[0],alt:e.name,className:"h-44 w-full border-b border-line object-cover"}):(0,s.jsx)("div",{className:"grid h-44 w-full place-items-center border-b border-line bg-n-100 text-faint",children:(0,s.jsx)(a.IconStore,{size:30})}),e.photos.length>1?(0,s.jsxs)("div",{className:"flex gap-1.5 border-b border-line bg-n-25 px-3 py-2",children:[e.photos.slice(1,5).map((t,l)=>(0,s.jsx)("img",{src:t,alt:`${e.name} 사진 ${l+2}`,className:"h-11 w-11 shrink-0 rounded border border-line object-cover"},t)),e.photos.length>5?(0,s.jsxs)("span",{className:"grid h-11 w-11 shrink-0 place-items-center rounded border border-line bg-surface text-[12px] font-semibold text-subtle tabular",children:["+",e.photos.length-5]}):null]}):null,(0,s.jsxs)("div",{className:"flex flex-1 flex-col gap-4 p-5",children:[(0,s.jsxs)("div",{className:"flex items-start gap-3",children:[(0,s.jsx)("div",{className:"grid h-10 w-10 shrink-0 place-items-center rounded-lg border border-edge bg-n-25 text-ink-soft",children:(0,s.jsx)(a.IconStore,{size:18})}),(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,s.jsx)("h3",{className:"text-[17px] font-semibold leading-[1.35] tracking-[-0.028em] text-ink",children:e.name}),(0,s.jsxs)("div",{className:"mt-1.5 flex flex-wrap items-center gap-1",children:[(0,s.jsx)("span",{className:`${n} border border-edge text-subtle`,children:e.category}),e.city?(0,s.jsx)("span",{className:`${n} bg-n-100 text-muted`,children:e.city}):null]})]})]}),e.intro?(0,s.jsx)("p",{className:"text-[14.5px] leading-[1.7] text-body",children:e.intro}):null,(0,s.jsxs)("div",{className:"grid gap-1.5 border-t border-line pt-4 text-[13.5px] leading-[1.6] text-muted",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(a.IconPhone,{size:15,className:"shrink-0 text-faint"}),(0,s.jsx)("a",{href:r(e.phone),className:"font-semibold text-ink-soft tabular transition-colors hover:text-accent-deep",children:e.phone})]}),e.hours?(0,s.jsxs)("div",{className:"flex items-start gap-2",children:[(0,s.jsx)(a.IconClock,{size:15,className:"mt-[3px] shrink-0 text-faint"}),(0,s.jsx)("span",{children:e.hours})]}):null,e.address?(0,s.jsxs)("div",{className:"flex items-start gap-2",children:[(0,s.jsx)(a.IconMapPin,{size:15,className:"mt-[3px] shrink-0 text-faint"}),(0,s.jsx)("span",{children:e.address})]}):null,e.website?(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(a.IconExternal,{size:15,className:"shrink-0 text-faint"}),(0,s.jsx)("a",{href:e.website,target:"_blank",rel:"noopener noreferrer",className:"truncate text-ink-soft transition-colors hover:text-accent-deep",children:e.website.replace(/^https?:\/\//,"")})]}):null]}),(0,s.jsxs)("div",{className:"mt-auto flex items-center gap-2 pt-1",children:[(0,s.jsxs)("a",{href:r(e.phone),className:"inline-flex h-8 items-center gap-1.5 rounded-md border border-edge bg-surface px-3 text-[13px] font-semibold text-ink-soft shadow-xs transition-colors hover:border-n-300 hover:bg-n-50",children:[(0,s.jsx)(a.IconPhone,{size:15}),"전화"]}),(0,s.jsxs)("a",{href:e.mapUrl||(t=e.mapQuery,`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(t)}`),target:"_blank",rel:"noopener noreferrer",className:"inline-flex h-8 items-center gap-1.5 rounded-md px-2.5 text-[13px] font-semibold text-muted transition-colors hover:bg-n-50 hover:text-ink",children:["지도 보기",(0,s.jsx)(a.IconExternal,{size:13})]}),e.sample?(0,s.jsx)("span",{className:"ml-auto text-[11.5px] text-subtle",children:"예시"}):null]})]})]},e.id)})})]})}var o=e.i(43412),c=e.i(44250);let d="w-full rounded-lg border border-edge bg-surface px-3.5 py-2.5 text-[15px] leading-[1.7] text-ink outline-none transition-colors focus:border-n-400",x="text-[13px] font-semibold tracking-[-0.02em] text-ink",m=(0,s.jsx)("span",{className:"ml-0.5 text-accent",children:"*"});function h(){let{user:e,loading:r,signInWithGoogle:n,nickname:i}=(0,o.useAuth)(),[h,p]=(0,t.useState)(""),[u,b]=(0,t.useState)(l.DIRECTORY_CATEGORIES[0]),[g,f]=(0,t.useState)(""),[j,N]=(0,t.useState)(""),[v,y]=(0,t.useState)(""),[w,k]=(0,t.useState)(""),[C,S]=(0,t.useState)(""),[R,I]=(0,t.useState)(""),[E,A]=(0,t.useState)(""),[T,U]=(0,t.useState)(""),[z,L]=(0,t.useState)(""),[$,O]=(0,t.useState)([]),[M,D]=(0,t.useState)(null),[F,P]=(0,t.useState)(!1),[_,q]=(0,t.useState)(null),[B,G]=(0,t.useState)(!1),[Q,X]=(0,t.useState)(!1),[Y,V]=(0,t.useState)(null),K=(0,t.useRef)(null);async function W(){V(null),X(!0);try{await n()}catch{V("로그인하지 못했습니다. 잠시 후 다시 시도해 주세요. 계속 안 되면 운영자에게 알려주ì
1„¸ìš”.")}finally{X(!1)}}async function Z(s){if(s.preventDefault(),q(null),!e)return void q("로그인 후 다시 시도해 주세요.");if(!h.trim()||!g.trim()||!v.trim())return void q("상호, 주소, 전화는 필수 항목입니다.");if(0===$.length)return void D("사진을 최소 한 장 올려주세요.");let t={name:h.trim(),category:u,address:g.trim(),phone:v.trim(),...j.trim()?{city:j.trim()}:{},...w.trim()?{email:w.trim()}:{},...C.trim()?{website:C.trim()}:{},...R.trim()?{mapUrl:R.trim()}:{},...E.trim()?{hours:E.trim()}:{},...T.trim()?{contactName:T.trim()}:{},...z.trim()?{intro:z.trim()}:{}};P(!0);try{await (0,l.submitListing)(e.uid,t,$.map(e=>e.file)),p(""),b(l.DIRECTORY_CATEGORIES[0]),f(""),N(""),y(""),k(""),S(""),I(""),A(""),U(""),L(""),O(e=>(e.forEach(e=>URL.revokeObjectURL(e.url)),[])),G(!0)}catch{q("등록을 완료하지 못했습니다. 잠시 후 다시 시도해 주세요. 문제가 계속되면 운영자에게 알려 주세요. (입력하신 내용은 그대로 남아 있습니다.)")}finally{P(!1)}}return(0,t.useEffect)(()=>()=>{$.forEach(e=>URL.revokeObjectURL(e.url))},[]),r?(0,s.jsxs)("div",{className:"rounded-card border border-line bg-surface p-6",children:[(0,s.jsx)("div",{className:"h-4 w-32 animate-pulse rounded bg-n-100"}),(0,s.jsx)("div",{className:"mt-3 h-4 w-56 animate-pulse rounded bg-n-100"})]}):e?B?(0,s.jsx)("div",{className:"rounded-card border border-line bg-surface p-6 sm:p-8",children:(0,s.jsxs)("div",{className:"flex items-start gap-3",children:[(0,s.jsx)("span",{className:"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-success-soft text-success",children:(0,s.jsx)(a.IconCheck,{size:18})}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("h3",{className:"text-[17px] font-semibold tracking-[-0.025em] text-ink",children:"등록 신청이 접수되었습니다"}),(0,s.jsxs)("p",{className:"mt-2 max-w-[48ch] text-[14.5px] leading-[1.75] text-body",children:["보내주신 내용은 ",(0,s.jsx)("b",{className:"font-semibold",children:"관리자 승인"})," 후 주소록에 표시됩니다. 승인 전까지는 목록에 나타나지 않아요. 확인해 주셔서 감사합니다."]}),(0,s.jsxs)("button",{type:"button",onClick:()=>G(!1),className:"mt-5 inline-flex h-9 items-center gap-1.5 rounded-md border border-edge bg-surface px-3.5 text-[13.5px] font-semibold text-ink-soft shadow-xs transition-colors hover:border-n-300 hover:bg-n-50",children:[(0,s.jsx)(a.IconPlus,{size:15}),"다른 ê³³ 더 등록하기"]})]})]})}):(0,s.jsxs)("div",{className:"rounded-card border border-line bg-surface p-5 sm:p-7",children:[(0,s.jsxs)("div",{className:"mb-5 flex items-center gap-2 text-[13px] text-subtle",children:[(0,s.jsx)(a.IconCheck,{size:14,className:"shrink-0 text-success"}),(0,s.jsxs)("span",{children:[(0,s.jsx)("b",{className:"font-semibold text-ink-soft",children:i??"내 별명"})," 별명으로 등록합니다."]})]}),_?(0,s.jsx)(c.Callout,{tone:"warning",title:"등록에 실패했습니다",children:_}):null,(0,s.jsxs)("form",{onSubmit:Z,className:"flex flex-col gap-5",noValidate:!0,children:[(0,s.jsxs)("div",{className:"grid gap-5 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-name",className:x,children:["상호 / 이름 ",m]}),(0,s.jsx)("input",{id:"dir-name",type:"text",required:!0,value:h,onChange:e=>p(e.target.value),maxLength:80,placeholder:"예: 조선갈비",className:d})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-category",className:x,children:["분류 ",m]}),(0,s.jsx)("select",{id:"dir-category",required:!0,value:u,onChange:e=>b(e.target.value),className:d,children:l.DIRECTORY_CATEGORIES.map(e=>(0,s.jsx)("option",{value:e,children:e},e))})]})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-address",className:x,children:["주소 ",m]}),(0,s.jsx)("input",{id:"dir-address",type:"text",required:!0,value:g,onChange:e=>f(e.target.value),placeholder:"예: 1200 N 10th St, McAllen, TX 78501",className:d}),(0,s.jsx)("p",{className:"text-[12px] leading-[1.6] text-subtle",children:"지도 링크에 그대로 쓰입니다. 도로명·번지까지 적어 주시면 좋아요."})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-mapurl",className:x,children:["구글 지도 링크 ",(0,s.jsx)("span",{className:"text-subtle",children:"(선택)"})]}),(0,s.jsx)("input",{id:"dir-mapurl",type:"url",value:R,onChange:e=>I(e.target.value),placeholder:"예: https://maps.app.goo.gl/...",className:d}),(0,s.jsxs)("p",{className:"text-[12px] leading-[1.6] text-subtle",children:["구글 지도에서 가게를 찾아 ",(0,s.jsx)("strong",{children:"공유 → 링크 복사"}),"한 주소를 붙여넣어 주세요. 상가 안쪽이나 suite 번호가 있는 곳도 정확히 연결됩니다. 비워 두면 위 주소로 검색됩니다."]})]}),(0,s.jsxs)("div",{className:"grid gap-5 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-city",className:x,children:["도시 ",(0,s.jsx)("span",{className:"text-subtle",children:"(선택)"})]}),(0,s.jsx)("input",{id:"dir-city",type:"text",value:j,onChange:e=>N(e.target.value),placeholder:"예: 맥알렌",className:d})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-phone",className:x,children:["전화 ",m]}),(0,s.jsx)("input",{id:"dir-phone",type:"tel",required:!0,value:v,onCh
1ange:e=>y(e.target.value),placeholder:"예: (956) 123-4567",className:d})]})]}),(0,s.jsxs)("div",{className:"grid gap-5 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-email",className:x,children:["이메일 ",(0,s.jsx)("span",{className:"text-subtle",children:"(선택)"})]}),(0,s.jsx)("input",{id:"dir-email",type:"email",value:w,onChange:e=>k(e.target.value),placeholder:"예: [email protected]",className:d})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-website",className:x,children:["웹사이트 ",(0,s.jsx)("span",{className:"text-subtle",children:"(선택)"})]}),(0,s.jsx)("input",{id:"dir-website",type:"url",value:C,onChange:e=>S(e.target.value),placeholder:"예: https://example.com",className:d})]})]}),(0,s.jsxs)("div",{className:"grid gap-5 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-hours",className:x,children:["영업시간 ",(0,s.jsx)("span",{className:"text-subtle",children:"(선택)"})]}),(0,s.jsx)("input",{id:"dir-hours",type:"text",value:E,onChange:e=>A(e.target.value),placeholder:"예: 화–일 11:00–21:00 · 월 휴무",className:d})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-contact",className:x,children:["담당자 ",(0,s.jsx)("span",{className:"text-subtle",children:"(선택)"})]}),(0,s.jsx)("input",{id:"dir-contact",type:"text",value:T,onChange:e=>U(e.target.value),placeholder:"예: 홍길동",className:d})]})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)("label",{htmlFor:"dir-intro",className:x,children:["소개 ",(0,s.jsx)("span",{className:"text-subtle",children:"(선택)"})]}),(0,s.jsx)("textarea",{id:"dir-intro",value:z,onChange:e=>L(e.target.value),rows:5,placeholder:"예: 숯불 양념갈비와 냉면이 인기입니다. 단체 예약도 받아요.",className:`${d} resize-y`}),(0,s.jsx)("p",{className:"text-[12px] leading-[1.6] text-subtle",children:"메뉴나 서비스, 특징을 알려주세요."})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,s.jsxs)("span",{className:x,children:["사진 ",m]}),(0,s.jsx)("p",{className:"text-[12.5px] leading-[1.6] text-subtle",children:"로고든 가게 사진이든 한 장 이상 올려주세요. 여러 장도 가능합니다 (장당 8MB 이하)."}),(0,s.jsx)("input",{ref:K,id:"dir-photos",type:"file",accept:"image/*",multiple:!0,onChange:e=>(function(e){if(!e||0===e.length)return;D(null);let s=[],t=[];for(let l of Array.from(e)){if(!l.type.startsWith("image/")){t.push(`${l.name}: 이미지 파일만 올릴 수 있어요.`);continue}if(l.size>8388608){t.push(`${l.name}: 8MB 이하만 올릴 수 있어요.`);continue}s.push({file:l,url:URL.createObjectURL(l)})}t.length&&D(t.join(" ")),s.length&&O(e=>[...e,...s]),K.current&&(K.current.value="")}
1)(e.target.files),className:"sr-only"}),(0,s.jsxs)("label",{htmlFor:"dir-photos",className:"inline-flex h-10 w-fit cursor-pointer items-center gap-2 rounded-md border border-edge bg-surface px-4 text-[14px] font-semibold text-ink-soft shadow-xs transition-colors hover:border-n-300 hover:bg-n-50",children:[(0,s.jsx)(a.IconPhoto,{size:16}),"사진 선택"]}),M?(0,s.jsx)("p",{className:"text-[12.5px] leading-[1.6] text-warn-accent",children:M}):null,$.length>0?(0,s.jsx)("ul",{className:"mt-1 flex flex-wrap gap-2.5",children:$.map((e,t)=>(0,s.jsxs)("li",{className:"group relative h-24 w-24 overflow-hidden rounded-lg border border-line bg-n-50",children:[(0,s.jsx)("img",{src:e.url,alt:`선택한 사진 ${t+1}`,className:"h-full w-full object-cover"}),(0,s.jsx)("button",{type:"button",onClick:()=>{O(e=>{let s=e[t];return s&&URL.revokeObjectURL(s.url),e.filter((e,s)=>s!==t)})},"aria-label":`사진 ${t+1} 제거`,className:"absolute right-1 top-1 grid h-6 w-6 place-items-center rounded-full bg-n-900/80 text-n-0 transition-colors hover:bg-n-900",children:(0,s.jsx)(a.IconClose,{size:13})})]},e.url))}):null]}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-3 border-t border-line pt-5",children:[(0,s.jsxs)("button",{type:"submit",disabled:F,className:"inline-flex h-10 items-center gap-2 rounded-md bg-n-900 px-5 text-[14.5px] font-semibold text-n-0 shadow-xs transition-colors hover:bg-n-800 disabled:cursor-not-allowed disabled:opacity-50",children:[F?"등록 중…":"주소록에 등록 신청",F?null:(0,s.jsx)(a.IconArrowRight,{size:15})]}),(0,s.jsxs)("p",{className:"text-[12.5px] leading-[1.6] text-subtle",children:["등록 신청은 ",(0,s.jsx)("b",{className:"font-semibold text-body",children:"관리자 승인"})," ","후 주소록에 표시됩니다."]})]})]})]}):(0,s.jsxs)("div",{className:"rounded-card border border-line bg-surface p-6 sm:p-8",children:[(0,s.jsx)("h3",{className:"text-[17px] font-semibold tracking-[-0.025em] text-ink",children:"로그인하고 등록하기"}),(0,s.jsx)("p",{className:"mt-2 max-w-[46ch] text-[14.5px] leading-[1.75] text-body",children:"구글 계정으로 로그인하면 주소록에 등록할 수 있어요. 별도 회원가입은 없습니다."}),(0,s.jsxs)("button",{type:"button",onClick:W,disabled:Q,className:"mt-5 inline-flex h-10 items-center gap-2 rounded-md bg-n-900 px-4 text-[14.5px] font-semibold text-n-0 shadow-xs transition-colors hover:bg-n-800 disabled:opacity-60",children:[Q?"로그인 중…":"구글로 계속하기",Q?null:(0,s.jsx)(a.IconArrowRight,{size:15})]}),Y?(0,s.jsx)(c.Callout,{tone:"warning",title:"로그인 실패",children:Y}):null]})}function p({eyebrow:e,title:t,lead:l,updated:r,action:n}){return(0,s.jsxs)("header",{className:"border-b border-line pb-7",children:[(0,s.jsxs)("div",{className:"flex items-start gap-4",children:[(0,s.jsxs)("div",{className:"min-w-0 flex-1",children:[e?(0,s.jsx)("div",{className:"text-[11.5px] font-semibold uppercase tracking-[0.12em] text-accent",children:e}):null,(0,s.jsx)("h1",{className:`text-[26px] font-semibold leading-[1.25] tracking-[-0.035em] text-ink sm:text-[32px] ${e?"mt-2.5":""}`,children:t})]}),n?(0,s.jsx)("div",{className:"shrink-0 pt-1",children:n}):null]}),l?(0,s.jsx)("p",{className:"mt-4 max-w-[58ch] text-[16.5px] leading-[1.72] text-muted",children:l}):null,r?(0,s.jsxs)("div",{className:"mt-6 inline-flex items-center gap-1.5 text-[12.5px] text-subtle",children:[(0,s.jsx)(a.IconClock,{size:13,className:"shrink-0 text-faint"}),(0,s.jsxs)("span",{className:"tabular",children:["업데이트 ",r]})]}):null]})}var u=e.i(59823);function b(e){return{id:e.id,name:e.name,category:e.category,city:e.city,phone:e.phone,intro:e.intro,address:e.address,mapQuery:e.mapQuery,mapUrl:e.mapUrl,hours:e.hours,photos:e.imageUrl?[e.imageUrl]:[],sample:e.sample}}function g(e){return{id:e.id,name:e.name,category:e.category,city:e.city,phone:e.phone,intro:e.intro,address:e.address,mapQuery:e.address,mapUrl:e.mapUrl,hours:e.hours,website:e.website,photos:e.photos??[]}}e.s(["default",0,function(){let[e,r]=(0,t.useState)([]),[n,o]=(0,t.useState)(!0),[c,d]=(0,t.useState)(!0),[x,m]=(0,t.useState)(!1),f=(0,t.useRef)(null);(0,t.useEffect)(()=>{let e=!0;return(async()=>{try{let s=await (0,l.fetchPublished)();e&&r(s)}catch{e&&d(!1)}finally{e&&o(!1)}})(),()=>{e=!1}},[]);let j=(0,t.useMemo)(()=>{let s=u.directoryEntries.map(b),t=s.filter(e=>e.sample),l=s.filter(e=>!e.sample);return[...t,...e.map(g),...l]},[e]);return(0,s.jsx)("div",{className:"px-5 py-8 sm:px-8 sm:py-10",children:(0,s.jsxs)("div",{className:"mx-auto max-w-[1000px]",children:[(0,s.jsx)(p,{title:"우리동네 주소록",lead:"한국어가 통하는 우리 동네 가게와 전문가를 한 곳에 모은 연락처 모음입니다. 식당·마트·병원·치과·교회·변호사·부동산 등, 믿고 찾을 수 있는 곳을 사진·주소·전화와 함께 정리했습니다."}),(0,s.jsxs)("section",{className:"mt-6 rounded-card border border-line bg-n-25 p-5 sm:p-6",children:[(0,s.jsxs)("p",{className:"text-[14.5px] leading-[1.75] text-body",children:["우리동네 주소록은 이웃과 운영자가 함께 채워 갑니다. 직접 운영하시는 곳이든, 자주 찾는 좋은 곳이든 누구나 등록을 신청할 수 있고, 운영자가 직접 추가하기도 합니다. 올라온 모든 항목은"," ",(0,s.jsx)("b",{className:"font-semibold text-ink",children:"확인·승인 절차"}),"를 거친 뒤에야 목록에 표시됩니다."]}),(0,s.jsxs)("button",{type:"button",onClick:function(){m(!0),requestAnimationFrame(()=>{f.current?.scrollIntoView({behavior:"smooth",block:"start"})})},className:"mt-4 inline-flex h-10 items-center gap-2 rounded-md bg-n-900 px-4 text-[14.5px] font-semibold text-n-0 shadow-xs transition-colors hover:bg-n-800",children:[(0,s.jsx)(a.IconPlus,{size:16}),"주소록에 등록하기"]})]}),c?null:(0,s.jsx)("p",{className:"mt-6 text-[13px] leading-[1.7] text-subtle",children:"실제 등록 항목은 준비 중입니다. 아래는 등록 화면 예시입니다."}),n?(0,s.jsx)("div",{className:"mt-8 grid gap-4 sm:grid-cols-2",children:[0,1].map(e=>(0,s.jsxs)("div",{className:"overflow-hidden rounded-card border border-line bg-surface",children:[(0,s.jsx)("div",{className:"h-44 w-full animate-pulse bg-n-100"}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 p-5",children:[(0,s.jsx)("div",{className:"h-4 w-2/3 animate-pulse rounded bg-n-100"}),(0,s.jsx)("div",{className:"h-3 w-1/3 animate-pulse rounded bg-n-100"}),(0,s.jsx)("div",{className:"h-3 w-full animate-pulse rounded bg-n-100"})]})]},e))}):(0,s.jsx)(i,{entries:j}),(0,s.jsxs)("section",{ref:f,className:"mt-12 scroll-mt-6",children:[(0,s.jsxs)("div",{className:"border-b border-line pb-5",children:[(0,s.jsx)("h2",{className:"text-[20px] font-semibold tracking-[-0.03em] text-ink sm:text-[22px]",children:"주소록에 등록하기"}),(0,s.jsx)("p",{className:"mt-2 max-w-[52ch] text-[14.5px] leading-[1.72] text-muted",children:"상호·주소·전화와 사진을 남겨 주세요. 관리자 확인 후 주소록에 올라갑니다."})]}),(0,s.jsx)("div",{className:"mt-6",children:x?(0,s.jsx)(h,{}):(0,s.jsxs)("button",{type:"button",onClick:()=>m(!0),className:"inline-flex h-10 items-center gap-2 rounded-md border border-edge bg-surface px-4 text-[14.5px] font-semibold text-ink-soft shadow-xs transition-colors hover:border-n-300 hover:bg-n-50",children:["등록 양식 열기",(0,s.jsx)(a.IconArrowRight,{size:15})]})})]})]})})}],60229)}]);

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.