{
  "id": "ahv-page-deluxe-villa-desktop",
  "file": "AHV Page Deluxe Villa Desktop.dc.html",
  "sourceSha256": "d7b72bcbdd4c5944e2b33777b8396605bf6365c913247eeab49d464fcf89392a",
  "variant": "desktop",
  "template": "\n<helmet>\n<link href=\"/ahv/fonts/ahv-33eeac48ab44.css\" rel=\"stylesheet\">\n\n<style>\nbody{margin:0;background:#F7F4EA;color:#2A2118;font-family:'Mulish',sans-serif;font-size:18px;line-height:1.7}\na{color:#006038;text-decoration:none}a:hover{color:#004226;text-decoration:underline}\n:focus-visible{outline:3px solid #6B7726;outline-offset:2px;box-shadow:0 0 0 6px rgba(247,244,234,.85)}\na:active,button:active{filter:brightness(.88)}\nh1,h2,h3,h4{font-weight:400;margin:0}\ntable{border-collapse:collapse}\nbutton{font-family:'Mulish',sans-serif;cursor:pointer}\n@media (prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}\n@media (prefers-reduced-motion:reduce){*{transition:none !important;animation:none !important}}\n</style>\n<title>Deluxe Villa | Kairali – The Ayurvedic Healing Village</title>\n<meta name=\"description\" content=\"Kairali Ayurvedic Healing Village의 디럭스 빌라에 머무르십시오. 전통과 편안함이 조화를 이루며, 정통 아유르베다와 전인적 웰빙을 제공합니다.\">\n<link rel=\"canonical\" href=\"https://ayurvedichealingvillage.com/ko/deluxe-villa/\">\n<meta name=\"robots\" content=\"noindex, nofollow\">\n<meta property=\"og:locale\" content=\"ko_KR\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"디럭스 빌라\">\n<meta property=\"og:description\" content=\"Kairali Ayurvedic Healing Village의 디럭스 빌라에 머무르십시오. 전통과 편안함이 조화를 이루며, 정통 아유르베다와 전인적 웰빙을 제공합니다.\">\n<meta property=\"og:url\" content=\"https://ayurvedichealingvillage.com/ko/deluxe-villa/\">\n<meta property=\"og:site_name\" content=\"Ayurvedic Healing Village\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n<link rel=\"icon\" href=\"/ahv/assets/img/logo_color-da22eb.svg\" sizes=\"192x192\">\n<script type=\"application/ld+json\">\n{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https://ayurvedichealingvillage.com/ko/deluxe-villa/\",\"url\":\"https://ayurvedichealingvillage.com/ko/deluxe-villa/\",\"name\":\"디럭스 빌라 | Kairali – The Ayurvedic Healing Village\",\"description\":\"Kairali Ayurvedic Healing Village의 디럭스 빌라에 머무르십시오. 전통과 편안함이 조화를 이루며, 정통 아유르베다와 전인적 웰빙을 제공합니다.\",\"isPartOf\":{\"@id\":\"https://ayurvedichealingvillage.com/ko/#website\"},\"inLanguage\":\"ko\"},{\"@type\":\"WebSite\",\"@id\":\"https://ayurvedichealingvillage.com/ko/#website\",\"url\":\"https://ayurvedichealingvillage.com/ko/\",\"name\":\"Kairali — The Ayurvedic Healing Village\",\"inLanguage\":\"ko\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://ayurvedichealingvillage.com/ko/deluxe-villa/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"홈\",\"item\":\"https://ayurvedichealingvillage.com/ko/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"빌라 안내\",\"item\":\"https://ayurvedichealingvillage.com/ko/our-villas/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"디럭스 빌라\",\"item\":\"https://ayurvedichealingvillage.com/ko/deluxe-villa/\"}]}]}\n</script>\n</helmet>\n<div data-screen-label=\"Deluxe Villa — Desktop\">\n<a href=\"#main-content\" style=\"position:fixed;left:-9999px;top:12px;z-index:120;background:#5A4420;color:#F7F4EA;padding:14px 24px;border-radius:4px;font-weight:700;font-size:15px\" style-focus=\"left:16px\">본문으로 건너뛰기</a>\n<dc-import name=\"AHV Chrome Header\" hint-size=\"100%,72px\"></dc-import>\n<main id=\"main-content\">\n<section style=\"width:min(1220px,94%);margin:0 auto;padding:32px 0 0\">\n  <nav aria-label=\"이동 경로\" style=\"font-size:15px;color:#75695A;display:flex;flex-wrap:wrap;gap:0 8px;align-items:center;line-height:1.4\"><a href=\"https://ayurvedichealingvillage.com/ko/\" onClick=\"{{ guard }}\" style=\"display:inline-flex;align-items:center;min-height:44px;min-width:44px\">홈</a><span aria-hidden=\"true\">/</span><a href=\"https://ayurvedichealingvillage.com/ko/our-villas/\" onClick=\"{{ guard }}\" style=\"display:inline-flex;align-items:center;min-height:44px;min-width:44px\">빌라 안내</a><span aria-hidden=\"true\">/</span><span aria-current=\"page\" style=\"color:#2A2118;display:inline-flex;align-items:center;min-height:44px\">디럭스 빌라</span></nav>\n  <div style=\"display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.2fr);gap:24px 64px;align-items:end;padding-top:6px\">\n    <div>\n      <div style=\"font-weight:700;font-size:13px;letter-spacing:2.6px;color:#8F6212;text-transform:uppercase\">빌라 안내</div>\n      <h1 style=\"font-family:'Marcellus',serif;font-size:clamp(34px,3.6vw,54px);line-height:1.12;margin:12px 0 0;text-wrap:balance\">디럭스 빌라</h1>\n    </div>\n    <div><ul aria-label=\"빌라 정보\" style=\"list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:10px\">\n      <sc-for list=\"{{ D.facts }}\" as=\"f\" hint-placeholder-count=\"4\"><li style=\"display:inline-flex;align-items:center;min-height:44px;padding:0 18px;background:#fff;border:1px solid #E0D7C4;border-radius:4px;font-size:16px;font-weight:600\">{{ f }}</li></sc-for>\n    </ul><div data-ahv-villa-rate=\"1\" style=\"margin-top:18px;max-width:62ch\"><p style=\"margin:0;font-weight:700;font-size:15px\">빌라별 일일 입원 요금</p><p style=\"margin:4px 0 0;font-size:16px\">1인 이용, 빌라 1동 1박 기준: {{ villaRate }}.</p><p style=\"margin:6px 0 0;font-size:15px;line-height:1.6\">숙박, 채식 식사, 1인당 아유르베다 허브 오일 마사지 한 차례, 의사 상담 한 차례, 요가 및 명상 세션 한 차례가 포함됩니다. 이는 입원 요금이며 객실 단독 요금이 아닙니다. <a href=\"/documents/pdf/daily-admission-tariff/ko/KTAHV-Daily-Admission-Tariff-KO-USD_20260925-R1.pdf\">1일 입원 요금표, 유효 기간 및 조건</a></p></div></div>\n  </div>\n  <img src=\"/ahv/assets/img/AHV-Deluxe-G17.webp\" alt=\"정원 수로 옆의 원형 디럭스 빌라\" width=\"1400\" height=\"1000\" style=\"width:100%;max-width:1400px;height:auto;display:block;border-radius:4px;margin-top:36px\">\n</section>\n\n<section aria-labelledby=\"about-h\" style=\"width:min(1220px,94%);margin:0 auto;padding:48px 0 0;display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:40px 72px;align-items:start\">\n  <div style=\"max-width:70ch\">\n    <h2 id=\"about-h\" style=\"font-family:'Marcellus',serif;font-size:clamp(26px,2.6vw,36px);line-height:1.2;margin:0 0 18px\">디럭스 빌라 소개</h2>\n    <sc-for list=\"{{ D.aboutParagraphs }}\" as=\"p\" hint-placeholder-count=\"5\"><p style=\"margin:0 0 16px\">{{ p }}</p></sc-for>\n  </div>\n  <div style=\"display:flex;flex-direction:column;gap:28px\">\n    <blockquote style=\"margin:0;padding:22px 26px;background:#fff;border-left:6px solid #C1882C;border:1px solid #E0D7C4;border-left-width:6px;border-left-color:#C1882C;border-radius:4px;font-family:'Marcellus',serif;font-size:21px;line-height:1.5;color:#2A2118\">{{ D.quote }}</blockquote>\n    <div aria-label=\"문의\" style=\"background:#43331E;color:#F7F4EA;border-radius:4px;padding:24px 26px;display:flex;flex-direction:column;gap:12px\">\n      <a href=\"https://ayurvedichealingvillage.com/ko/contact-us/\" onClick=\"{{ guard }}\" style=\"display:flex;align-items:center;justify-content:center;min-height:52px;background:#EEB41E;color:#2A2118;border-radius:4px;font-weight:700;font-size:14px;letter-spacing:1.5px;text-transform:uppercase;padding:0 20px;text-align:center\" style-hover=\"background:#D9A317;color:#2A2118;text-decoration:none\">체류 문의하기</a> <a href=\"https://ayurvedichealingvillage.com/ko/all-programs/\" onClick=\"{{ guard }}\" style=\"display:flex;align-items:center;justify-content:center;min-height:52px;border:1.5px solid rgba(247,244,234,.7);color:#F7F4EA;border-radius:4px;font-weight:700;font-size:14px;letter-spacing:1.5px;text-transform:uppercase;padding:0 20px;text-align:center\" style-hover=\"background:rgba(247,244,234,.12);color:#F7F4EA;text-decoration:none\">프로그램 살펴보기</a>\n    </div>\n  </div>\n</section>\n\n<section id=\"amenities\" aria-labelledby=\"amenities-h\" style=\"width:min(1220px,94%);margin:0 auto;padding-top:48px;border-top:1px solid #E9E2D3;margin-top:48px\">\n  <h2 id=\"amenities-h\" style=\"font-family:'Marcellus',serif;font-size:clamp(26px,2.6vw,36px);line-height:1.2;margin:0 0 18px\">편의 시설</h2>\n  <h3 style=\"font-family:'Marcellus',serif;font-size:24px;line-height:1.25;margin:0 0 20px\">빌라 내부 시설</h3>\n  <div style=\"display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:0 44px\">\n    <sc-for list=\"{{ F.groups }}\" as=\"g\" hint-placeholder-count=\"3\">\n      <div style=\"min-width:0;border-top:2px solid #006038;padding-top:14px\">\n        <h4 style=\"font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:#004226;margin:0 0 6px;font-family:'Mulish',sans-serif\">{{ g.title }}</h4>\n        <ul style=\"margin:0;padding:0;list-style:none\">\n          <sc-for list=\"{{ g.items }}\" as=\"it\" hint-placeholder-count=\"4\"><li style=\"padding:10px 0;border-bottom:1px solid #E9E2D3;font-size:17.5px;line-height:1.55\">{{ it }}</li></sc-for>\n        </ul>\n      </div>\n    </sc-for>\n  </div>\n</section>\n\n<section id=\"gallery\" aria-labelledby=\"gallery-h\" style=\"width:min(1220px,94%);margin:0 auto;padding-top:48px;border-top:1px solid #E9E2D3;margin-top:48px\">\n  <h2 id=\"gallery-h\" style=\"font-family:'Marcellus',serif;font-size:clamp(26px,2.6vw,36px);line-height:1.2;margin:0 0 24px\">갤러리</h2>\n  <sc-for list=\"{{ galleryGroups }}\" as=\"grp\" hint-placeholder-count=\"2\">\n    <div style=\"margin-bottom:40px\">\n      <h3 id=\"{{ grp.hid }}\" style=\"font-family:'Marcellus',serif;font-size:23px;line-height:1.25;margin:0 0 16px;display:flex;align-items:center;gap:12px\"><span aria-hidden=\"true\" style=\"color:#C1882C;font-size:14px\">◆</span>{{ grp.name }}<span style=\"font-family:'Mulish',sans-serif;font-size:15px;color:#75695A;font-weight:600\">{{ grp.countLabel }}</span></h3>\n      <ul aria-labelledby=\"{{ grp.hid }}\" style=\"list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px\">\n        <sc-for list=\"{{ grp.items }}\" as=\"g\" hint-placeholder-count=\"15\">\n          <li style=\"background:#fff;border:1px solid #E9E2D3;border-radius:4px;overflow:hidden\">\n            <button type=\"button\" data-gallery-index=\"{{ g.i }}\" aria-label=\"{{ g.btnLabel }}\" onClick=\"{{ g.open }}\" style=\"display:flex;flex-direction:column;width:100%;padding:0;border:0;background:#fff;color:#2A2118;text-align:left\" style-hover=\"color:#006038\">\n              <img src=\"{{ g.image }}\" alt=\"{{ g.alt }}\" width=\"1400\" height=\"1000\" loading=\"lazy\" style=\"width:100%;height:auto;display:block\">\n              <span style=\"display:inline-flex;align-items:center;gap:10px;min-height:48px;padding:6px 16px;font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:#006038\">이미지 보기<span aria-hidden=\"true\" style=\"color:#C1882C\">→</span></span>\n            </button>\n          </li>\n        </sc-for>\n      </ul>\n    </div>\n  </sc-for>\n</section>\n\n<section id=\"rooms\" aria-labelledby=\"rooms-h\" style=\"width:min(1220px,94%);margin:0 auto;padding-top:48px;border-top:1px solid #E9E2D3;margin-top:8px\">\n  <h2 id=\"rooms-h\" style=\"font-family:'Marcellus',serif;font-size:clamp(26px,2.6vw,36px);line-height:1.2;margin:0 0 18px\">빌라 정보 및 수치</h2>\n  <table aria-labelledby=\"rooms-h\" style=\"width:100%;font-size:17px;line-height:1.5;border-top:1px solid #E0D7C4\">\n    <thead>\n      <tr style=\"border-bottom:1px solid #E0D7C4\">\n        <th scope=\"col\" style=\"text-align:left;font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:#75695A;padding:14px 16px 14px 0\">빌라</th>\n        <th scope=\"col\" style=\"text-align:left;font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:#75695A;padding:14px 16px\">침대</th>\n        <th scope=\"col\" style=\"text-align:left;font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:#75695A;padding:14px 16px\">객실</th>\n        <th scope=\"col\" style=\"text-align:left;font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:#75695A;padding:14px 16px\">별자리</th>\n        <th scope=\"col\" style=\"text-align:left;font-weight:700;font-size:13px;letter-spacing:2px;text-transform:uppercase;color:#75695A;padding:14px 0 14px 16px\">사진</th>\n      </tr>\n    </thead>\n    <tbody>\n      <sc-for list=\"{{ rooms }}\" as=\"r\" hint-placeholder-count=\"8\">\n        <tr style=\"border-bottom:1px solid #E0D7C4;vertical-align:middle\">\n          <th scope=\"row\" style=\"text-align:left;font-family:'Marcellus',serif;font-weight:400;font-size:20px;padding:12px 16px 12px 0\">{{ r.name }}</th>\n          <td style=\"padding:12px 16px\">{{ r.bed }}</td>\n          <td style=\"padding:12px 16px\">{{ r.room }}</td>\n          <td style=\"padding:12px 16px\"><img src=\"{{ r.zodiacImage.image }}\" alt=\"{{ r.zodiacImage.alt }}\" width=\"120\" height=\"120\" loading=\"lazy\" style=\"width:48px;height:48px;display:block\"></td>\n          <td style=\"padding:12px 0 12px 16px\"><button type=\"button\" data-room-index=\"{{ r.i }}\" onClick=\"{{ r.open }}\" style=\"display:inline-flex;align-items:center;gap:10px;min-height:44px;padding:0 16px;border:1.5px solid #006038;border-radius:4px;background:transparent;color:#006038;font-weight:700;font-size:13px;letter-spacing:1.5px;text-transform:uppercase\" style-hover=\"background:#006038;color:#F7F4EA\">{{ r.btnLabel }}<span aria-hidden=\"true\">→</span></button></td>\n        </tr>\n      </sc-for>\n    </tbody>\n  </table>\n</section>\n\n<section id=\"related\" aria-labelledby=\"related-h\" style=\"width:min(1220px,94%);margin:0 auto;padding:48px 0 64px;border-top:1px solid #E9E2D3;margin-top:48px\">\n  <h2 id=\"related-h\" style=\"font-family:'Marcellus',serif;font-size:clamp(26px,2.4vw,34px);margin:0 0 22px\">다른 빌라</h2>\n  <ul style=\"list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:22px\">\n    <sc-for list=\"{{ relatedVillas }}\" as=\"o\" hint-placeholder-count=\"3\">\n      <li><a href=\"{{ o.url }}\" onClick=\"{{ guard }}\" style=\"display:flex;flex-direction:column;background:#fff;border:1px solid #E9E2D3;border-radius:4px;overflow:hidden;color:#2A2118\" style-hover=\"border-color:#C1882C;text-decoration:none;color:#006038\">\n        <img src=\"{{ o.image }}\" alt=\"{{ o.alt }}\" width=\"378\" height=\"335\" loading=\"lazy\" style=\"width:100%;max-width:378px;height:auto;display:block;align-self:center\">\n        <span style=\"display:flex;align-items:center;gap:10px;min-height:56px;padding:8px 18px;font-family:'Marcellus',serif;font-size:21px\"><span aria-hidden=\"true\" style=\"color:#C1882C;font-size:13px\">◆</span>{{ o.label }}</span>\n      </a></li>\n    </sc-for>\n  </ul>\n</section>\n</main>\n<dc-import name=\"AHV Chrome Footer\" hint-size=\"100%,560px\"></dc-import>\n\n<div id=\"villa-dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"{{ dlgLabel }}\" onKeyDown=\"{{ dlgKey }}\" style=\"display:{{ dlgDisplay }};position:fixed;inset:0;z-index:200;background:rgba(26,20,12,.94);flex-direction:column;align-items:center;justify-content:center;padding:24px;box-sizing:border-box\">\n  <div style=\"width:100%;max-width:1280px;display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;color:#F7F4EA\">\n    <div aria-live=\"polite\" style=\"font-weight:700;font-size:14px;letter-spacing:2px;text-transform:uppercase;min-height:44px;display:inline-flex;align-items:center\">{{ counter }}</div>\n    <button type=\"button\" id=\"villa-close\" onClick=\"{{ close }}\" style=\"display:inline-flex;align-items:center;gap:10px;min-height:48px;padding:0 20px;border:1px solid rgba(247,244,234,.5);border-radius:4px;background:transparent;color:#F7F4EA;font-weight:700;font-size:13.5px;letter-spacing:2px;text-transform:uppercase\" style-hover=\"background:rgba(247,244,234,.12)\">이미지 닫기<span aria-hidden=\"true\">✕</span></button>\n  </div>\n  <sc-if value=\"{{ dlgOpen }}\" hint-placeholder-val=\"{{ false }}\"><img id=\"villa-expanded\" ref=\"{{ curRef }}\" alt=\"{{ cur.alt }}\" width=\"{{ cur.width }}\" height=\"{{ cur.height }}\" style=\"display:block;width:auto;height:auto;max-width:min(1280px,100%);max-height:calc(100vh - 220px);object-fit:contain;margin:20px 0;border-radius:4px;background:#000\"></sc-if>\n  <div style=\"width:100%;max-width:1280px;display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap\">\n    <button type=\"button\" id=\"villa-prev\" onClick=\"{{ prev }}\" style=\"display:inline-flex;align-items:center;gap:10px;min-height:48px;padding:0 22px;border:1px solid rgba(247,244,234,.5);border-radius:4px;background:transparent;color:#F7F4EA;font-weight:700;font-size:13.5px;letter-spacing:2px;text-transform:uppercase\" style-hover=\"background:rgba(247,244,234,.12)\"><span aria-hidden=\"true\">←</span>이전 이미지</button>\n    <button type=\"button\" id=\"villa-next\" onClick=\"{{ next }}\" style=\"display:inline-flex;align-items:center;gap:10px;min-height:48px;padding:0 22px;border:1px solid #EEB41E;border-radius:4px;background:#EEB41E;color:#2A2118;font-weight:700;font-size:13.5px;letter-spacing:2px;text-transform:uppercase\" style-hover=\"filter:brightness(.94)\">다음 이미지<span aria-hidden=\"true\">→</span></button>\n  </div>\n</div>\n</div>\n",
  "logic": "\n// TF-19 villa daily-admission rate (28 Sep 2026): approved edition 20260925-R1, APAI single occupancy (english-candidate/final-rates) —\n// the same figures the homepage prints under \"Daily admission by villa\". Selection by currency, never conversion.\nconst VILLA_DAY = {'INR':{\"deluxe\":26700,\"classic\":29145,\"royal\":33450,\"suite\":53400},'USD':{\"deluxe\":381,\"classic\":416,\"royal\":478,\"suite\":763},'EUR':{\"deluxe\":334,\"classic\":364,\"royal\":418,\"suite\":668}};\nconst villaMoney = (n, c) => { const s = String(n); if (c === 'INR') { const l3 = s.slice(-3), r = s.slice(0, -3); return '₹' + (r ? r.replace(/\\B(?=(\\d{2})+(?!\\d))/g, ',') + ',' : '') + l3; } return (c === 'USD' ? '$' : '€') + s.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','); };\n\nclass Component extends DCLogic {\n  state = { open: false, set: null, i: 0, ret: null, cur: 'USD' };\n  componentDidMount() { try { const c = localStorage.getItem('ahv-cur'); if (c && VILLA_DAY[c] && c !== this.state.cur) this.setState({ cur: c }); } catch (e) {} document.documentElement.lang = 'ko'; }\n  componentWillUnmount() { document.body.style.overflow = ''; }\n  openSet(set, idx, ret, label) {\n    this.setState({ open: true, set, i: idx, ret, label });\n    document.body.style.overflow = 'hidden';\n    setTimeout(() => { const c = document.getElementById('villa-close'); if (c) c.focus(); }, 30);\n  }\n  closeViewer() {\n    const ret = this.state.ret;\n    this.setState({ open: false });\n    document.body.style.overflow = '';\n    setTimeout(() => { const btn = ret ? document.querySelector(ret) : null; if (btn) btn.focus(); }, 30);\n  }\n  renderVals() {\n    const D = window.AHV_ROOMS_2026.apply('deluxe', window.AHV_DELUXE) || { facts: [], aboutParagraphs: [], amenities: [], gallery: [], galleryGroups: [], rooms: [], relatedVillas: [], quote: '' };\n    const A = 'https://ayurvedichealingvillage.com';\n    const gallery = D.gallery || [];\n    const groups = (D.galleryGroups || []).map(name => {\n      const items = gallery.map((g, idx) => ({ ...g, i: idx })).filter(g => g.group === name);\n      return { name, hid: 'gallery-' + name.toLowerCase() + '-h', countLabel: items.length + ' photographs', items: items.map(g => ({ ...g, btnLabel: '이미지 보기: ' + g.alt, open: () => this.openSet(gallery, g.i, 'button[data-gallery-index=\"' + g.i + '\"]', '디럭스 빌라 갤러리') })) };\n    });\n    const rooms = (D.rooms || []).map((r, idx) => ({ ...r, i: idx, btnLabel: r.images.length + ' 사진', open: () => this.openSet(r.images, 0, 'button[data-room-index=\"' + idx + '\"]', r.name + ' 객실 ' + r.room + ' 사진') }));\n    const set = this.state.set || [];\n    const n = set.length, i = this.state.i;\n    const cur = set[i] || { image: '', alt: '', width: 1400, height: 1000 };\n    const go = (d) => this.setState(s => ({ i: (s.i + d + n) % n }));\n    const villaCur = VILLA_DAY[this.state.cur] ? this.state.cur : 'USD';\n    return { F: window.AHV_ROOMS_2026.features('deluxe'), villaRate: villaMoney(VILLA_DAY[villaCur].deluxe, villaCur), guard: () => {} /* preview-only nav guard neutralised for the published site */,\n      D, galleryGroups: groups, rooms,\n      relatedVillas: (D.relatedVillas || []).map(o => ({ ...o, url: A + o.href })),\n      dlgDisplay: this.state.open ? 'flex' : 'none', dlgOpen: this.state.open, dlgLabel: this.state.label || '디럭스 빌라 갤러리',\n      cur,\n      // New closure per render, so React re-attaches and assigns the current source each time cur changes.\n      curRef: (el) => { if (el && cur.image) { el.setAttribute('src', cur.image); } },\n      counter: n ? (i + 1) + ' / ' + n : '',\n      close: () => this.closeViewer(), prev: () => go(-1), next: () => go(1),\n      dlgKey: (e) => {\n        if (e.key === 'Escape') { e.preventDefault(); this.closeViewer(); return; }\n        if (e.key === 'ArrowLeft') { e.preventDefault(); go(-1); return; }\n        if (e.key === 'ArrowRight') { e.preventDefault(); go(1); return; }\n        if (e.key === 'Tab') {\n          const f = [...e.currentTarget.querySelectorAll('button')];\n          const first = f[0], last = f[f.length - 1];\n          if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }\n          else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }\n        }\n      }\n    };\n  }\n}\n",
  "props": "",
  "scripts": [
    "/ahv/l10n/ko/assets/deluxe-villa-data.js",
    "/ahv/l10n/ko/assets/rooms-2026-candidate.js"
  ],
  "revision": {
    "task": "WOPS-AHV-FINAL-DRAFT-20260924-001",
    "source": "AHV Page Deluxe Villa Desktop 2026 Candidate.dc.html",
    "sha256": "83ab4394bcea3f315d90eeb076c512454848bca9ed36b08e8a7b531e0666166c"
  },
  "locale": "ko"
}
