{"id":4301,"date":"2026-04-17T06:33:57","date_gmt":"2026-04-17T04:33:57","guid":{"rendered":"https:\/\/vosges-grandeur-nature.fr\/mon-sejour-de-reve-dans-les-vosges\/"},"modified":"2026-08-08T17:36:16","modified_gmt":"2026-08-08T15:36:16","slug":"mein-traumaufenthalt-in-den-vogesen","status":"publish","type":"page","link":"https:\/\/vosges-grandeur-nature.fr\/de\/mon-sejour-de-reve-dans-les-vosges\/","title":{"rendered":"Mein Traumaufenthalt in den Vogesen"},"content":{"rendered":"\r\n<style>\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 VARIABLES & RESET \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl *{box-sizing:border-box;margin:0;padding:0}\r\n.vgnl{--v-dark:#0d1f12;--v-green:#135221;--v-green-mid:#1a702d;--v-green-light:#23953c;--v-gold:#ffc632;--v-beige:#faf7f2;--v-text:#1a1a1a;--v-gray:#6a6a6a;--v-border:#e5e1d9;font-family:'DM Sans',system-ui,sans-serif;color:var(--v-text);background:var(--v-beige);overflow-x:hidden;-webkit-font-smoothing:antialiased}\r\n.vgnl img{max-width:100%;display:block}\r\n.vgnl button{font-family:inherit;cursor:pointer}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 NAV ACTES \u2014 DOTS VERTICAUX C\u00d4T\u00c9 DROIT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-nav{position:fixed;top:50%;right:24px;transform:translateY(-50%);z-index:1000;display:flex;flex-direction:column;gap:16px;padding:14px 10px;background:rgba(13,31,18,0.4);backdrop-filter:blur(10px);border-radius:100px;border:1px solid rgba(255,255,255,0.1);transition:opacity .4s,transform .4s}\r\n.vgnl-nav a{position:relative;width:10px;height:10px;border-radius:50%;background:rgba(255,255,255,0.3);transition:all .3s;display:block;text-decoration:none;cursor:pointer}\r\n.vgnl-nav a:hover{background:rgba(255,198,50,0.6);transform:scale(1.3)}\r\n.vgnl-nav a.active{background:var(--v-gold);box-shadow:0 0 12px rgba(255,198,50,0.6);transform:scale(1.2)}\r\n.vgnl-nav a::after{content:attr(data-label);position:absolute;right:24px;top:50%;transform:translateY(-50%) translateX(8px);background:rgba(13,31,18,0.92);color:#fff;font-size:11px;font-weight:600;letter-spacing:0.05em;padding:6px 12px;border-radius:6px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;font-family:'DM Sans',system-ui,sans-serif}\r\n.vgnl-nav a:hover::after{opacity:1;transform:translateY(-50%) translateX(0)}\r\n.vgnl-nav a.active::after{color:var(--v-gold)}\r\n.vgnl-nav.hidden{opacity:0;pointer-events:none;transform:translateY(-50%) translateX(20px)}\r\n@media(max-width:640px){.vgnl-nav{right:12px;gap:12px;padding:10px 8px}.vgnl-nav a{width:8px;height:8px}.vgnl-nav a::after{display:none}}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 INTRO SEO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-intro{background:var(--v-beige);padding:130px 40px 60px;max-width:880px;margin:0 auto;text-align:center}\r\n.vgnl-intro .kicker{font-size:11px;font-weight:700;letter-spacing:0.3em;text-transform:uppercase;color:var(--v-gold);margin-bottom:18px}\r\n.vgnl-intro h1{font-family:'Playfair Display',Georgia,serif;font-size:clamp(32px,5vw,52px);font-weight:600;line-height:1.1;color:var(--v-dark);margin-bottom:20px}\r\n.vgnl-intro h1 em{font-style:italic;color:var(--v-green);font-weight:400}\r\n.vgnl-intro .lead{font-size:17px;line-height:1.7;color:var(--v-gray);max-width:680px;margin:0 auto 34px}\r\n.vgnl-intro .proof{display:flex;justify-content:center;gap:36px;flex-wrap:wrap;margin-bottom:40px}\r\n.vgnl-intro .proof-item{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--v-gray)}\r\n.vgnl-intro .proof-item strong{color:var(--v-green);font-weight:700}\r\n.vgnl-intro .scroll-hint{font-size:11px;letter-spacing:0.2em;text-transform:uppercase;color:var(--v-gray);opacity:.6}\r\n.vgnl-intro .scroll-hint::after{content:'';display:block;width:1px;height:30px;background:var(--v-gold);margin:12px auto 0;animation:vgnlBar 2.2s ease-in-out infinite}\r\n@keyframes vgnlBar{0%,100%{transform:scaleY(1);opacity:.5}50%{transform:scaleY(1.3);opacity:1}}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 WIZARD SCREENS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-wizard-screen{min-height:100vh;position:relative;display:flex;flex-direction:column;justify-content:center;padding:90px 32px 90px;overflow:hidden}\r\n.vgnl-scroll-hint{display:none!important}\r\n.vgnl-wizard-bg{position:absolute;inset:0;z-index:0;background-size:cover;background-position:center;transform:scale(1.08);animation:vgnlSlowZoom 22s ease-in-out infinite alternate}\r\n@keyframes vgnlSlowZoom{to{transform:scale(1)}}\r\n.vgnl-wizard-screen::before{content:'';position:absolute;inset:0;z-index:1;background:linear-gradient(rgba(13,31,18,0.45),rgba(13,31,18,0.78))}\r\n.vgnl-wizard-content{position:relative;z-index:2;max-width:760px;margin:0 auto;color:#fff;text-align:center;width:100%}\r\n.vgnl-chapter{font-size:11px;font-weight:700;letter-spacing:0.3em;color:var(--v-gold);text-transform:uppercase;margin-bottom:20px;opacity:.9}\r\n.vgnl-wizard-q{font-family:'Playfair Display',Georgia,serif;font-size:clamp(32px,5vw,58px);font-weight:600;line-height:1.15;margin-bottom:18px}\r\n.vgnl-wizard-q em{font-style:italic;color:var(--v-gold);font-weight:400}\r\n.vgnl-wizard-hint{font-size:14px;color:rgba(255,255,255,0.7);margin-bottom:40px;font-style:italic}\r\n\r\n\/* Calendrier wizard *\/\r\n.vgnl-cal-selected{display:flex;justify-content:center;gap:14px;flex-wrap:wrap;margin-bottom:28px}\r\n.vgnl-date-pill{background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.25);backdrop-filter:blur(8px);color:#fff;padding:18px 24px;border-radius:18px;min-width:180px;text-align:left;transition:all .3s}\r\n.vgnl-date-pill.selected{background:var(--v-gold);color:var(--v-dark);border-color:var(--v-gold);box-shadow:0 12px 30px rgba(255,198,50,0.35)}\r\n.vgnl-date-pill-label{font-size:10px;font-weight:700;letter-spacing:0.15em;text-transform:uppercase;opacity:.7;margin-bottom:6px}\r\n.vgnl-date-pill-val{font-family:'Playfair Display',Georgia,serif;font-size:20px;font-weight:600;line-height:1.15}\r\n.vgnl-date-pill-val.placeholder{opacity:.6;font-style:italic;font-weight:400}\r\n.vgnl-date-pill-sub{font-size:11px;opacity:.75;margin-top:4px}\r\n\r\n.vgnl-cal{background:rgba(255,255,255,0.08);backdrop-filter:blur(14px);border:1px solid rgba(255,255,255,0.15);border-radius:18px;overflow:hidden;max-width:420px;margin:0 auto}\r\n.vgnl-cal-nav{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid rgba(255,255,255,0.1)}\r\n.vgnl-cal-nav-btn{width:30px;height:30px;border-radius:50%;border:1px solid rgba(255,255,255,0.2);background:transparent;color:rgba(255,255,255,0.7);font-size:15px;display:flex;align-items:center;justify-content:center;transition:all .15s}\r\n.vgnl-cal-nav-btn:hover{border-color:var(--v-gold);color:var(--v-gold)}\r\n.vgnl-cal-title{font-family:'Playfair Display',Georgia,serif;font-size:15px;color:#fff;font-style:italic}\r\n.vgnl-cal-grid{padding:10px 12px 14px}\r\n.vgnl-cal-days-hdr{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:6px}\r\n.vgnl-cal-day-lbl{text-align:center;font-size:10px;font-weight:700;color:rgba(255,255,255,0.4);padding:4px 0;letter-spacing:0.05em}\r\n.vgnl-cal-days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}\r\n.vgnl-cal-day{height:38px;display:flex;align-items:center;justify-content:center;font-size:13px;color:rgba(255,255,255,0.75);border-radius:7px;cursor:pointer;transition:all .12s}\r\n.vgnl-cal-day:hover:not(.disabled):not(.empty){background:rgba(255,255,255,0.15);color:#fff}\r\n.vgnl-cal-day.disabled{color:rgba(255,255,255,0.15);cursor:not-allowed}\r\n.vgnl-cal-day.empty{cursor:default}\r\n.vgnl-cal-day.start,.vgnl-cal-day.end{background:var(--v-gold);color:var(--v-dark);font-weight:700}\r\n.vgnl-cal-day.range{background:rgba(255,198,50,0.25);color:#fff}\r\n.vgnl-cal-day.start{border-radius:7px 0 0 7px}\r\n.vgnl-cal-day.end{border-radius:0 7px 7px 0}\r\n.vgnl-cal-day.start.end{border-radius:7px}\r\n.vgnl-cal-hint{font-size:11px;color:rgba(255,255,255,0.4);text-align:center;padding:6px 0 8px}\r\n\r\n\/* Groupe cards *\/\r\n.vgnl-group-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;max-width:620px;margin:0 auto 30px}\r\n.vgnl-group-card{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.2);border-radius:18px;padding:22px 16px;backdrop-filter:blur(8px);transition:all .3s;display:flex;flex-direction:column;align-items:center;gap:10px;position:relative}\r\n.vgnl-group-card.has-value{background:rgba(255,198,50,0.12);border-color:rgba(255,198,50,0.4)}\r\n.vgnl-group-icon{font-size:28px;line-height:1}\r\n.vgnl-group-label{font-size:12px;font-weight:600;color:rgba(255,255,255,0.85);letter-spacing:0.02em}\r\n.vgnl-group-sub{font-size:10px;color:rgba(255,255,255,0.5);margin-top:-4px}\r\n.vgnl-group-stepper{display:flex;align-items:center;gap:12px;margin-top:4px}\r\n.vgnl-gsbtn{width:30px;height:30px;border-radius:50%;border:1px solid rgba(255,255,255,0.3);background:rgba(255,255,255,0.08);color:#fff;font-size:18px;display:flex;align-items:center;justify-content:center;line-height:1;transition:all .15s}\r\n.vgnl-gsbtn:hover:not(:disabled){border-color:var(--v-gold);color:var(--v-gold);background:rgba(255,198,50,0.15)}\r\n.vgnl-gsbtn:disabled{opacity:.25;cursor:not-allowed}\r\n.vgnl-gsval{font-family:'Playfair Display',Georgia,serif;font-size:24px;font-weight:600;color:var(--v-gold);min-width:24px;text-align:center;line-height:1}\r\n\r\n.vgnl-wizard-note{font-size:14px;color:rgba(255,255,255,0.7);margin:22px 0 30px}\r\n.vgnl-wizard-note strong{color:var(--v-gold);font-weight:600}\r\n\r\n\/* Next button *\/\r\n.vgnl-next-btn{background:var(--v-gold);color:var(--v-dark);padding:18px 44px;border-radius:100px;font-weight:700;font-size:15px;border:none;display:inline-flex;align-items:center;gap:10px;box-shadow:0 8px 24px rgba(255,198,50,0.35);transition:all .3s}\r\n.vgnl-next-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 14px 34px rgba(255,198,50,0.5)}\r\n.vgnl-next-btn:disabled{opacity:.4;cursor:not-allowed;transform:none}\r\n.vgnl-back-btn{background:transparent;border:1px solid rgba(255,255,255,0.2);color:rgba(255,255,255,0.7);padding:12px 24px;border-radius:100px;font-size:13px;margin-top:14px;display:inline-flex;align-items:center;gap:8px;transition:all .3s}\r\n.vgnl-back-btn:hover{border-color:rgba(255,255,255,0.4);color:#fff}\r\n.vgnl-scroll-hint{position:absolute;bottom:28px;left:50%;transform:translateX(-50%);z-index:2;color:rgba(255,255,255,0.5);font-size:11px;letter-spacing:0.2em;text-transform:uppercase}\r\n.vgnl-scroll-hint::after{content:'';display:block;width:1px;height:24px;background:var(--v-gold);margin:10px auto 0;animation:vgnlBar 2.4s ease-in-out infinite}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 LOGEMENTS SCREEN \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-logs-screen{padding:80px 32px;background:var(--v-beige);min-height:80vh}\r\n.vgnl-logs-inner{max-width:1180px;margin:0 auto}\r\n.vgnl-logs-head{text-align:center;margin-bottom:44px}\r\n.vgnl-logs-head .vgnl-chapter{color:var(--v-green);opacity:1}\r\n.vgnl-logs-head h2{font-family:'Playfair Display',Georgia,serif;font-size:clamp(28px,4vw,42px);font-weight:600;color:var(--v-dark);line-height:1.2;margin-bottom:14px}\r\n.vgnl-logs-head h2 em{font-style:italic;color:var(--v-green);font-weight:400}\r\n.vgnl-logs-head p{font-size:15px;color:var(--v-gray);max-width:560px;margin:0 auto;line-height:1.6}\r\n.vgnl-logs-slider{overflow:hidden}\r\n.vgnl-logs-track{display:flex;transition:transform .45s cubic-bezier(0.4,0,0.2,1)}\r\n.vgnl-logs-slide{flex-shrink:0;width:100%;display:grid;grid-template-columns:repeat(3,1fr);gap:22px;padding:6px}\r\n@media(max-width:900px){.vgnl-logs-slide{grid-template-columns:1fr}}\r\n.vgnl-log{background:#fff;border-radius:20px;overflow:hidden;box-shadow:0 6px 26px rgba(13,31,18,0.08);transition:all .3s;position:relative;cursor:pointer;border:2px solid transparent}\r\n.vgnl-log:hover{transform:translateY(-4px);box-shadow:0 14px 40px rgba(13,31,18,0.12)}\r\n.vgnl-log.sel{border-color:var(--v-gold);box-shadow:0 0 0 4px rgba(255,198,50,0.15),0 14px 40px rgba(13,31,18,0.12)}\r\n.vgnl-log.indispo{opacity:.55;cursor:not-allowed}\r\n.vgnl-log-img{aspect-ratio:4\/3;background-size:cover;background-position:center;position:relative;background-color:#2d5a3d}\r\n.vgnl-log-gamme{position:absolute;top:14px;left:14px;padding:5px 12px;border-radius:100px;font-size:10px;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;z-index:3}\r\n.vgnl-log-gamme.classique{background:var(--v-green);color:#fff}\r\n.vgnl-log-gamme.premium{background:var(--v-gold);color:var(--v-dark)}\r\n.vgnl-log-gamme.economique{background:rgba(255,255,255,0.92);color:var(--v-dark)}\r\n.vgnl-log-cap{position:absolute;top:14px;right:14px;background:rgba(0,0,0,0.55);color:#fff;font-size:11px;font-weight:600;padding:4px 10px;border-radius:100px;z-index:3}\r\n.vgnl-log-pass{position:absolute;bottom:14px;left:14px;background:var(--v-dark);color:#fff;padding:6px 10px;border-radius:10px;z-index:3;display:flex;align-items:center;gap:6px}\r\n.vgnl-log-pass-pct{color:var(--v-gold);font-weight:700;font-size:15px}\r\n.vgnl-log-pass-txt{font-size:9px;font-weight:600;line-height:1.2}\r\n.vgnl-pass-badge{display:inline-block;background:#135221;color:#ffc632;font-size:11px;font-weight:bold;padding:4px 10px;border-radius:20px;letter-spacing:0.5px}\r\n.vgnl-log-img .vgnl-pass-badge{position:absolute;bottom:14px;left:14px;z-index:3}\r\n.vgnl-log-check{position:absolute;top:14px;right:14px;width:28px;height:28px;border-radius:50%;background:var(--v-gold);color:var(--v-dark);font-weight:700;display:none;align-items:center;justify-content:center;z-index:4}\r\n.vgnl-log.sel .vgnl-log-check{display:flex}\r\n.vgnl-log.sel .vgnl-log-cap{display:none}\r\n.vgnl-log-body{padding:20px 22px 22px}\r\n.vgnl-log-ville{font-size:11px;font-weight:600;color:var(--v-gold);letter-spacing:0.08em;text-transform:uppercase;margin-bottom:6px}\r\n.vgnl-log-titre{font-family:'Playfair Display',Georgia,serif;font-size:20px;font-weight:600;color:var(--v-dark);line-height:1.2;margin-bottom:10px}\r\n.vgnl-log-desc{font-size:13px;line-height:1.6;color:var(--v-gray);margin-bottom:14px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\r\n.vgnl-log-prix-row{display:flex;align-items:baseline;gap:6px;padding-top:12px;border-top:1px solid var(--v-border)}\r\n.vgnl-log-prix{font-family:'Playfair Display',Georgia,serif;font-size:22px;font-weight:600;color:var(--v-green)}\r\n.vgnl-log-prix-sub{font-size:11px;color:var(--v-gray)}\r\n.vgnl-log-indispo-msg{font-size:12px;color:#c62828;padding-top:10px;border-top:1px solid var(--v-border);font-weight:600}\r\n\/* Carousel photos carte logement *\/\r\n.vgnl-log-carousel{position:absolute;inset:0;overflow:hidden}\r\n.vgnl-log-slide{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:0;transition:opacity .4s ease}\r\n.vgnl-log-slide.active{opacity:1}\r\n.vgnl-log-arrow{position:absolute;top:50%;transform:translateY(-50%);width:34px;height:34px;display:flex;align-items:center;justify-content:center;background:transparent;border:none;color:#fff;font-size:32px;line-height:1;font-weight:700;cursor:pointer;z-index:5;padding:0;text-shadow:0 2px 6px rgba(0,0,0,0.55);opacity:.82;transition:opacity .2s}\r\n.vgnl-log:hover .vgnl-log-arrow{opacity:1}\r\n.vgnl-log-arrow.prev{left:6px}\r\n.vgnl-log-arrow.next{right:6px}\r\n.vgnl-log-photodots{position:absolute;bottom:10px;left:50%;transform:translateX(-50%);display:flex;gap:5px;z-index:5}\r\n.vgnl-log-photodot{width:6px;height:6px;border-radius:50%;background:rgba(255,255,255,0.55);transition:all .2s}\r\n.vgnl-log-photodot.active{background:#fff;width:16px;border-radius:3px}\r\n\/* Points forts (\u00e9quipements) *\/\r\n.vgnl-log-equips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}\r\n.vgnl-log-equip{background:#f0f7f1;color:var(--v-green);border:1px solid #d0e8d4;padding:4px 10px;border-radius:100px;font-size:11px;font-weight:600}\r\n.vgnl-log-equipmore{background:var(--v-green);color:#fff;padding:4px 10px;border-radius:100px;font-size:11px;font-weight:600;cursor:default}\r\n.vgnl-logs-nav{display:flex;justify-content:center;align-items:center;gap:16px;margin:28px 0 20px}\r\n.vgnl-logs-nav-btn{width:40px;height:40px;border-radius:50%;border:1px solid var(--v-border);background:#fff;color:var(--v-green);font-size:18px;display:flex;align-items:center;justify-content:center;transition:all .2s}\r\n.vgnl-logs-nav-btn:hover:not(:disabled){border-color:var(--v-gold);color:var(--v-dark);background:var(--v-gold)}\r\n.vgnl-logs-nav-btn:disabled{opacity:.3;cursor:not-allowed}\r\n.vgnl-logs-dots{display:flex;gap:6px}\r\n.vgnl-logs-dot{width:6px;height:6px;border-radius:50%;background:var(--v-border);cursor:pointer;transition:all .2s}\r\n.vgnl-logs-dot.on{background:var(--v-gold);width:20px;border-radius:3px}\r\n.vgnl-logs-actions{display:flex;justify-content:center;gap:12px;margin-top:30px;flex-wrap:wrap}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 OPTION \"J'AI D\u00c9J\u00c0 UN LOGEMENT\" \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-external-lodging-wrap{max-width:640px;margin:36px auto 0;padding:0 20px}\r\n.vgnl-external-separator{display:flex;align-items:center;gap:14px;margin-bottom:20px;opacity:0.6}\r\n.vgnl-external-separator::before,.vgnl-external-separator::after{content:'';flex:1;height:1px;background:var(--v-border)}\r\n.vgnl-external-separator span{font-size:10px;font-weight:700;letter-spacing:0.25em;text-transform:uppercase;color:var(--v-gray)}\r\n.vgnl-external-trigger{width:100%;background:#fff;border:1.5px dashed var(--v-border);padding:18px 22px;border-radius:14px;cursor:pointer;display:flex;align-items:center;gap:14px;font-family:'DM Sans',system-ui,sans-serif;text-align:left;transition:all 0.25s}\r\n.vgnl-external-trigger:hover{border-color:var(--v-green);background:rgba(19,82,33,0.03);transform:translateY(-2px);box-shadow:0 8px 24px rgba(13,31,18,0.08)}\r\n.vgnl-external-trigger svg{flex-shrink:0;color:var(--v-green);opacity:0.85}\r\n.vgnl-external-trigger span{font-size:15px;font-weight:600;color:var(--v-dark);display:block}\r\n.vgnl-external-trigger small{font-size:12px;color:var(--v-gray);display:block;margin-top:3px;font-weight:400}\r\n.vgnl-external-trigger > div:not(.ignored),.vgnl-external-trigger{align-items:flex-start}\r\n.vgnl-external-trigger{flex-direction:row;align-items:flex-start}\r\n.vgnl-external-trigger svg{margin-top:2px}\r\n.vgnl-external-trigger > svg ~ *{flex:1}\r\n.vgnl-external-box{display:none;background:#fff;border:2px solid var(--v-gold);border-radius:14px;padding:24px 22px;margin-top:14px;animation:vgnlExternalSlide 0.35s cubic-bezier(0.4,0,0.2,1)}\r\n.vgnl-external-box.open{display:block}\r\n@keyframes vgnlExternalSlide{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}\r\n.vgnl-external-head{margin-bottom:18px}\r\n.vgnl-external-head h3{font-family:'Playfair Display',Georgia,serif;font-size:20px;font-weight:600;color:var(--v-dark);margin-bottom:4px;line-height:1.25}\r\n.vgnl-external-head p{font-size:13px;color:var(--v-gray);line-height:1.5}\r\n.vgnl-external-input-wrap{position:relative;margin-bottom:10px}\r\n.vgnl-external-input{width:100%;padding:14px 16px;border:1.5px solid var(--v-border);border-radius:10px;font-size:15px;font-family:'DM Sans',system-ui,sans-serif;background:var(--v-beige);color:var(--v-dark);transition:border-color 0.2s}\r\n.vgnl-external-input:focus{outline:none;border-color:var(--v-gold);background:#fff}\r\n.vgnl-external-suggestions{position:absolute;top:100%;left:0;right:0;background:#fff;border:1px solid var(--v-border);border-radius:10px;margin-top:4px;max-height:240px;overflow-y:auto;z-index:10;display:none;box-shadow:0 12px 28px rgba(0,0,0,0.12)}\r\n.vgnl-external-suggestions.show{display:block}\r\n.vgnl-external-sugg{padding:12px 16px;cursor:pointer;border-bottom:1px solid var(--v-border);font-size:14px;color:var(--v-dark);transition:background 0.15s}\r\n.vgnl-external-sugg:last-child{border-bottom:none}\r\n.vgnl-external-sugg:hover,.vgnl-external-sugg.active{background:rgba(255,198,50,0.12)}\r\n.vgnl-external-sugg-ville{font-weight:600;color:var(--v-dark)}\r\n.vgnl-external-sugg-meta{font-size:12px;color:var(--v-gray);margin-top:2px}\r\n.vgnl-external-sugg-empty{padding:14px 16px;font-size:13px;color:var(--v-gray);font-style:italic;text-align:center}\r\n.vgnl-external-selected{background:rgba(35,149,60,0.08);border:1px solid rgba(35,149,60,0.3);border-radius:10px;padding:12px 16px;display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}\r\n.vgnl-external-selected-name{font-family:'Playfair Display',Georgia,serif;font-size:15px;color:var(--v-dark);font-weight:600;line-height:1.2}\r\n.vgnl-external-selected-sub{font-size:11px;color:var(--v-green-light);font-weight:600;margin-top:3px}\r\n.vgnl-external-clear{background:transparent;border:1px solid var(--v-border);color:var(--v-gray);width:26px;height:26px;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:16px;line-height:1;padding:0;transition:all 0.15s}\r\n.vgnl-external-clear:hover{background:var(--v-dark);color:#fff;border-color:var(--v-dark)}\r\n.vgnl-external-cancel{background:transparent;border:none;color:var(--v-gray);font-size:12px;cursor:pointer;padding:6px 0;font-family:'DM Sans',system-ui,sans-serif;text-decoration:underline;margin-top:4px}\r\n.vgnl-external-cancel:hover{color:var(--v-green)}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 G\u00c9N\u00c9RATION \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-gen{min-height:100vh;background:var(--v-dark);color:#fff;display:none;align-items:center;justify-content:center;text-align:center;position:relative;overflow:hidden;padding:40px 32px}\r\n.vgnl-gen.show{display:flex}\r\n.vgnl-gen-bg{position:absolute;inset:0;opacity:.08;background-image:radial-gradient(circle at 20% 30%,var(--v-gold) 0%,transparent 40%),radial-gradient(circle at 80% 70%,var(--v-green-light) 0%,transparent 40%)}\r\n.vgnl-gen-inner{position:relative;z-index:2;max-width:580px}\r\n.vgnl-gen-text{font-family:'Playfair Display',Georgia,serif;font-size:clamp(26px,4vw,44px);font-weight:600;line-height:1.2;margin-bottom:36px}\r\n.vgnl-gen-text em{color:var(--v-gold);font-style:italic}\r\n.vgnl-gen-line{margin:0 auto 28px;width:80%;max-width:300px}\r\n.vgnl-gen-line svg{width:100%;height:auto}\r\n.vgnl-path{stroke-dasharray:400;stroke-dashoffset:400;animation:vgnlDraw 3s ease-out forwards}\r\n@keyframes vgnlDraw{to{stroke-dashoffset:0}}\r\n.vgnl-gen-steps{max-width:340px;margin:30px auto 0;display:flex;flex-direction:column;gap:10px;text-align:left}\r\n.vgnl-gs{display:flex;align-items:center;gap:10px;font-size:13px;color:rgba(255,255,255,0.2);transition:color .4s;font-weight:300}\r\n.vgnl-gs.active{color:rgba(255,255,255,0.9)}\r\n.vgnl-gs.done{color:rgba(255,198,50,0.4)}\r\n.vgnl-gs-dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex-shrink:0}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 RESULTAT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-result{display:none}\r\n.vgnl-result.show{display:block}\r\n\r\n\/* Hero r\u00e9sultat *\/\r\n\/* Hero r\u00e9sultat \u2014 style fiche logement VGN (match snippet 3524) *\/\r\n.vgnl-res-hero{position:relative;height:calc(100vh - 20px);min-height:600px;overflow:hidden;color:#fff;font-family:'DM Sans',sans-serif}\r\n.vgnl-res-hero-track{position:absolute;inset:0;display:flex;transition:transform 0.7s cubic-bezier(0.25,0.46,0.45,0.94)}\r\n.vgnl-res-hero-photo{min-width:100%;height:100%;background-size:cover;background-position:center;flex-shrink:0}\r\n.vgnl-res-hero-photo:first-child{animation:vgnlKenBurns 16s ease-in-out infinite alternate}\r\n@keyframes vgnlKenBurns{from{transform:scale(1)}to{transform:scale(1.08)}}\r\n.vgnl-res-hero-ov1{position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,0.72) 0%,rgba(0,0,0,0.22) 45%,rgba(0,0,0,0.02) 100%);z-index:1}\r\n.vgnl-res-hero-ov2{position:absolute;inset:0;background:linear-gradient(to right,rgba(0,0,0,0.55) 0%,transparent 58%);z-index:1}\r\n.vgnl-res-hero-c{position:absolute;bottom:0;left:0;right:0;padding:0 60px 52px;z-index:3}\r\n.vgnl-res-hero-row{display:flex;align-items:flex-end;justify-content:space-between;gap:32px}\r\n.vgnl-res-hero-left{max-width:62%;min-width:0}\r\n.vgnl-res-hero-eyebrow{font-size:13px;font-weight:700;letter-spacing:3px;text-transform:uppercase;color:rgba(255,198,50,0.9);margin-bottom:18px;display:flex;align-items:center;gap:12px;opacity:0;transform:translateY(20px);animation:vgnlHeroSlideUp 0.7s 0.4s forwards}\r\n.vgnl-res-hero-eyebrow::before{content:'';width:36px;height:1px;background:#ffc632;opacity:0.7;flex-shrink:0}\r\n.vgnl-res-hero-titre{font-family:'Playfair Display',Georgia,serif;font-size:clamp(42px,6vw,84px);font-weight:700;color:#fff;line-height:1.02;margin-bottom:26px;opacity:0;transform:translateY(24px);animation:vgnlHeroSlideUp 0.7s 0.7s forwards;text-shadow:0 4px 28px rgba(0,0,0,0.5)}\r\n.vgnl-res-hero-titre em{font-style:italic;color:#ffc632;font-weight:400;font-size:0.6em;display:inline-block;margin-top:12px;line-height:1.2;font-weight:500}\r\n.vgnl-res-hero-feats{display:flex;gap:14px;margin-bottom:28px;flex-wrap:wrap;opacity:0;transform:translateY(20px);animation:vgnlHeroSlideUp 0.7s 1s forwards}\r\n.vgnl-res-hero-feat{background:rgba(255,255,255,0.08);border:1px solid rgba(255,255,255,0.15);border-radius:10px;padding:12px 20px;text-align:center;backdrop-filter:blur(4px);min-width:90px}\r\n.vgnl-res-hero-feat-val{font-size:16px;font-weight:700;color:#ffc632;margin-bottom:4px;line-height:1.1}\r\n.vgnl-res-hero-feat-lbl{font-size:10px;color:rgba(255,255,255,0.55);text-transform:uppercase;letter-spacing:0.5px}\r\n.vgnl-res-hero-cta-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap;opacity:0;transform:translateY(16px);animation:vgnlHeroSlideUp 0.7s 1.3s forwards}\r\n.vgnl-res-hero-cta{background:#ffc632;color:#135221;border:none;padding:18px 36px;border-radius:8px;font-size:14px;font-weight:700;cursor:pointer;font-family:'DM Sans',sans-serif;text-transform:uppercase;letter-spacing:0.06em;transition:background 0.2s}\r\n.vgnl-res-hero-cta:hover{background:#ffd666}\r\n@keyframes vgnlHeroSlideUp{to{opacity:1;transform:translateY(0)}}\r\n.vgnl-res-hero-right{display:flex;flex-direction:column;align-items:flex-end;gap:16px;flex-shrink:0;padding-bottom:4px;opacity:0;animation:vgnlHeroFadeIn 0.8s 1.6s forwards}\r\n@keyframes vgnlHeroFadeIn{to{opacity:1}}\r\n.vgnl-res-hero-dots{display:flex;gap:8px}\r\n.vgnl-res-hero-dot{width:32px;height:5px;border-radius:3px;background:rgba(255,255,255,0.22);cursor:pointer;transition:all 0.3s;border:none;padding:0}\r\n.vgnl-res-hero-dot.act{background:#ffc632;width:48px}\r\n.vgnl-res-hero-nav{display:flex;gap:10px}\r\n.vgnl-res-hero-btn{width:48px;height:48px;border-radius:50%;background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.25);color:#fff;font-size:22px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all 0.2s;padding:0}\r\n.vgnl-res-hero-btn:hover{background:#ffc632;color:#135221;border-color:#ffc632}\r\n.vgnl-share-btn{position:absolute;top:30px;right:30px;background:rgba(255,255,255,0.1);backdrop-filter:blur(10px);color:#fff;border:1px solid rgba(255,255,255,0.2);padding:10px 18px;border-radius:100px;cursor:pointer;z-index:4;font-size:13px;font-weight:600;transition:all .3s;display:inline-flex;align-items:center;gap:8px}\r\n.vgnl-share-btn:hover{background:var(--v-gold);color:var(--v-dark);border-color:var(--v-gold)}\r\n@media(max-width:900px){.vgnl-res-hero-titre{font-size:44px}.vgnl-res-hero-c{padding:0 28px 36px}.vgnl-res-hero-left{max-width:100%}.vgnl-res-hero-right{display:none}}\r\n@media(max-width:600px){.vgnl-res-hero-titre{font-size:34px}.vgnl-res-hero-c{padding:0 20px 26px}.vgnl-res-hero-eyebrow{font-size:10px;letter-spacing:2px}.vgnl-res-hero-feat-val{font-size:14px}.vgnl-res-hero-cta{padding:14px 24px;font-size:13px}}\r\n\r\n\/* Sections chapitres *\/\r\n.vgnl-sect{padding:90px 40px;max-width:1180px;margin:0 auto}\r\n.vgnl-sect-head{margin-bottom:44px;text-align:center}\r\n.vgnl-sect-head.left{text-align:left}\r\n.vgnl-sect-kicker{font-size:11px;font-weight:700;letter-spacing:0.3em;text-transform:uppercase;color:var(--v-green);margin-bottom:14px}\r\n.vgnl-sect-title{font-family:'Playfair Display',Georgia,serif;font-size:clamp(28px,4vw,44px);font-weight:600;line-height:1.15;color:var(--v-dark);margin-bottom:18px}\r\n.vgnl-sect-title em{color:var(--v-green);font-style:italic;font-weight:400}\r\n.vgnl-sect-intro{font-size:16px;line-height:1.7;color:var(--v-gray);max-width:620px;margin:0 auto}\r\n.vgnl-sect-head.left .vgnl-sect-intro{margin:0}\r\n\r\n\/* Jours chapitres *\/\r\n.vgnl-days{display:flex;flex-direction:column;gap:70px}\r\n.vgnl-day-row{display:grid;grid-template-columns:1fr 1fr;gap:50px;align-items:center}\r\n.vgnl-day-row.reverse{direction:rtl}\r\n.vgnl-day-row.reverse > *{direction:ltr}\r\n@media(max-width:900px){.vgnl-day-row,.vgnl-day-row.reverse{grid-template-columns:1fr;gap:24px;direction:ltr}}\r\n.vgnl-day-carousel{position:relative;aspect-ratio:4\/3;border-radius:20px;overflow:hidden;box-shadow:0 20px 60px rgba(13,31,18,0.15);background:linear-gradient(135deg,#1a3d25,#0d1f12)}\r\n.vgnl-day-slide{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:0;transition:opacity 1s ease-in-out;z-index:1}\r\n.vgnl-day-slide.active{opacity:1;z-index:2}\r\n.vgnl-day-slide.no-photo{background:linear-gradient(135deg,#1a5c2a 0%,#0d2a18 100%)}\r\n.vgnl-day-slide.no-photo::before{content:'';position:absolute;inset:0;background-image:radial-gradient(circle at 30% 40%,rgba(255,198,50,0.15),transparent 50%),radial-gradient(circle at 70% 60%,rgba(35,149,60,0.18),transparent 55%);z-index:1}\r\n.vgnl-day-slide::after{content:'';position:absolute;inset:0;background:linear-gradient(to top,rgba(13,31,18,0.92) 0%,rgba(13,31,18,0.3) 40%,transparent 70%);pointer-events:none;z-index:2}\r\n.vgnl-day-caption{position:absolute;bottom:74px;left:20px;right:20px;z-index:4;opacity:0;transition:opacity .6s ease,transform .6s ease;transform:translateY(8px);pointer-events:none}\r\n.vgnl-day-caption.active{opacity:1;transform:translateY(0)}\r\n.vgnl-day-caption-kicker{font-family:'DM Sans',system-ui,sans-serif;font-size:9px;font-weight:700;letter-spacing:0.25em;color:var(--v-gold);text-transform:uppercase;margin-bottom:5px;text-shadow:0 2px 8px rgba(0,0,0,0.6)}\r\n.vgnl-day-caption-title{font-family:'Playfair Display',Georgia,serif;font-size:18px;font-weight:600;color:#fff;line-height:1.2;margin-bottom:4px;text-shadow:0 2px 12px rgba(0,0,0,0.6)}\r\n.vgnl-day-caption-meta{font-family:'DM Sans',system-ui,sans-serif;font-size:11px;color:rgba(255,255,255,0.75);letter-spacing:0.02em;text-shadow:0 2px 8px rgba(0,0,0,0.5)}\r\n.vgnl-day-caption-meta .sep{margin:0 7px;color:rgba(255,198,50,0.6)}\r\n\/* Pills moments cliquables en bas de l'image *\/\r\n.vgnl-day-moments-nav{position:absolute;bottom:14px;left:14px;right:14px;display:flex;gap:5px;z-index:5;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}\r\n.vgnl-day-moments-nav::-webkit-scrollbar{display:none}\r\n.vgnl-day-moment-pill{flex-shrink:0;padding:5px 10px;border-radius:100px;font-family:'DM Sans',system-ui,sans-serif;font-size:9px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase;background:rgba(255,255,255,0.12);backdrop-filter:blur(8px);color:rgba(255,255,255,0.65);border:1px solid rgba(255,255,255,0.15);cursor:pointer;transition:all .25s;white-space:nowrap}\r\n.vgnl-day-moment-pill:hover{background:rgba(255,255,255,0.2);color:#fff}\r\n.vgnl-day-moment-pill.active{background:var(--v-gold);color:var(--v-dark);border-color:var(--v-gold);box-shadow:0 4px 14px rgba(255,198,50,0.3)}\r\n.vgnl-day-moment-pill.empty{opacity:0.4}\r\n.vgnl-day-num{font-family:'Playfair Display',Georgia,serif;font-size:clamp(60px,8vw,90px);font-weight:400;font-style:italic;color:var(--v-green);opacity:.25;line-height:1;margin-bottom:-10px}\r\n.vgnl-day-kicker{font-size:12px;font-weight:700;letter-spacing:0.25em;text-transform:uppercase;color:var(--v-gold);margin-bottom:10px}\r\n.vgnl-day-title{font-family:'Playfair Display',Georgia,serif;font-size:clamp(22px,3vw,32px);font-weight:600;line-height:1.2;color:var(--v-dark);margin-bottom:14px}\r\n.vgnl-day-moments{display:flex;flex-direction:column;gap:12px;margin-top:18px;padding-top:20px;border-top:1px solid var(--v-border)}\r\n.vgnl-moment{display:flex;gap:14px;font-size:14px;color:var(--v-gray);align-items:flex-start;position:relative;padding:4px 4px;border-radius:8px;transition:background .2s}\r\n.vgnl-moment:hover{background:rgba(255,198,50,0.04)}\r\n.vgnl-moment.swapping{opacity:0.5;pointer-events:none}\r\n.vgnl-moment.swap-flash{background:rgba(255,198,50,0.12);animation:vgnlSwapFlash 1.2s ease-out}\r\n@keyframes vgnlSwapFlash{0%{background:rgba(255,198,50,0.25)}100%{background:transparent}}\r\n.vgnl-moment-time{font-family:'Playfair Display',Georgia,serif;font-style:italic;color:var(--v-green);font-weight:600;min-width:66px;flex-shrink:0}\r\n.vgnl-moment-body{flex:1;min-width:0}\r\n.vgnl-moment-name strong{font-weight:600;color:var(--v-dark)}\r\n.vgnl-moment-meta{font-size:12px;color:var(--v-gray);margin-top:3px}\r\n.vgnl-moment-pass{font-size:12px;color:var(--v-gold);font-weight:600;margin-top:4px;display:inline-flex;align-items:center;gap:5px}\r\n\/* Segments de route entre moments (r\u00e9cap d\u00e9taill\u00e9) *\/\r\n.vgnl-route{display:flex;align-items:center;gap:10px;padding:4px 0 4px 80px;font-size:11px;color:var(--v-gray);font-family:'DM Sans',system-ui,sans-serif;font-style:italic;position:relative;opacity:0.75}\r\n.vgnl-route::before{content:'';position:absolute;left:95px;top:0;bottom:0;width:1px;background:linear-gradient(to bottom,rgba(19,82,33,0.2),rgba(19,82,33,0.05))}\r\n.vgnl-route-icon{width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:var(--v-green);flex-shrink:0;z-index:1;background:#fff;border-radius:50%;border:1px solid rgba(19,82,33,0.12)}\r\n.vgnl-route-icon svg{width:11px;height:11px}\r\n.vgnl-route-txt{font-size:11px;color:var(--v-gray);font-weight:500;letter-spacing:0.02em}\r\n.vgnl-route-txt strong{color:var(--v-green);font-weight:700;font-style:normal}\r\n.vgnl-route.loading{opacity:0.45}\r\n.vgnl-route.loading .vgnl-route-txt{font-style:italic;color:#a0a0a0}\r\n.vgnl-route-start,.vgnl-route-end{padding:8px 0 8px 4px;display:flex;align-items:center;gap:12px;font-size:13px;color:var(--v-dark);font-weight:600;font-family:'Playfair Display',Georgia,serif;font-style:italic}\r\n.vgnl-route-start{padding-top:0}\r\n.vgnl-route-end{padding-bottom:0}\r\n.vgnl-route-pin{font-size:16px}\r\n\/* Bouton swap en overlay haut-droite du carrousel photo *\/\r\n.vgnl-day-swap-card{position:absolute;top:14px;right:14px;width:38px;height:38px;border-radius:50%;background:rgba(13,31,18,0.75);backdrop-filter:blur(10px);border:1px solid rgba(255,198,50,0.4);color:#ffc632;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:6;opacity:0.7;transition:all .3s;padding:0}\r\n.vgnl-day-swap-card:hover{opacity:1;background:var(--v-gold);color:var(--v-dark);border-color:var(--v-gold);transform:scale(1.1);box-shadow:0 6px 20px rgba(255,198,50,0.35)}\r\n.vgnl-day-swap-card:disabled{cursor:wait;opacity:0.5}\r\n.vgnl-day-swap-card svg{transition:transform .4s}\r\n.vgnl-day-swap-card:hover svg{transform:rotate(180deg)}\r\n.vgnl-day-swap-card.swapping svg{animation:vgnlSpin .8s linear infinite}\r\n.vgnl-day-swap-card .tip{position:absolute;right:46px;top:50%;transform:translateY(-50%) translateX(6px);background:rgba(13,31,18,0.92);color:#fff;font-size:11px;font-weight:600;padding:5px 10px;border-radius:6px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;font-family:'DM Sans',system-ui,sans-serif}\r\n.vgnl-day-swap-card:hover .tip{opacity:1;transform:translateY(-50%) translateX(0);color:var(--v-dark);background:#fff}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CARTES PAR MOMENT DE JOURN\u00c9E (Acte 2 \u2014 s\u00e9lection) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-jour-block{margin-bottom:56px}\r\n.vgnl-jour-block:last-child{margin-bottom:0}\r\n.vgnl-jour-block-head{display:flex;align-items:baseline;gap:14px;margin-bottom:20px;flex-wrap:wrap;padding-bottom:14px;border-bottom:1px solid var(--v-border)}\r\n.vgnl-jour-block-num{font-family:'Playfair Display',Georgia,serif;font-style:italic;font-size:36px;color:var(--v-gold);line-height:1;font-weight:400;opacity:0.8}\r\n.vgnl-jour-block-date{font-size:11px;font-weight:700;letter-spacing:0.22em;text-transform:uppercase;color:var(--v-green)}\r\n.vgnl-jour-block-title{font-family:'Playfair Display',Georgia,serif;font-size:20px;font-weight:600;color:var(--v-dark);flex:1;line-height:1.3}\r\n.vgnl-jour-total-time{display:inline-flex;align-items:center;gap:6px;font-family:'DM Sans',system-ui,sans-serif;font-size:11px;font-weight:600;letter-spacing:0.05em;color:var(--v-green);background:rgba(19,82,33,0.06);border:1px solid rgba(19,82,33,0.12);padding:5px 11px;border-radius:100px;white-space:nowrap;opacity:0;transition:opacity .4s}\r\n.vgnl-jour-total-time.ready{opacity:1}\r\n.vgnl-jour-total-time-empty{color:var(--v-gray);opacity:0.5;font-style:italic}\r\n.vgnl-moments-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}\r\n@media(max-width:1100px){.vgnl-moments-grid{grid-template-columns:repeat(3,1fr)}}\r\n@media(max-width:700px){.vgnl-moments-grid{grid-template-columns:repeat(2,1fr)}}\r\n@media(max-width:420px){.vgnl-moments-grid{grid-template-columns:1fr}}\r\n.vgnl-mc{background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 6px 24px rgba(13,31,18,0.08);transition:all .3s;position:relative;display:flex;flex-direction:column}\r\n.vgnl-mc:hover{transform:translateY(-4px);box-shadow:0 14px 40px rgba(13,31,18,0.15)}\r\n.vgnl-mc.swap-flash{animation:vgnlSwapCard 1.4s ease-out}\r\n@keyframes vgnlSwapCard{0%{background:rgba(255,198,50,0.25);box-shadow:0 0 0 3px rgba(255,198,50,0.5),0 14px 40px rgba(255,198,50,0.2)}100%{background:#fff;box-shadow:0 6px 24px rgba(13,31,18,0.08)}}\r\n.vgnl-mc-img{aspect-ratio:4\/3;background-size:cover;background-position:center;background-repeat:no-repeat;position:relative;background-color:#2d5a3d}\r\n.vgnl-mc-img.no-photo{background:linear-gradient(135deg,#1a5c2a 0%,#0d2a18 100%)}\r\n.vgnl-mc-img.no-photo::before{content:'';position:absolute;inset:0;background-image:radial-gradient(circle at 30% 40%,rgba(255,198,50,0.15),transparent 50%),radial-gradient(circle at 70% 60%,rgba(35,149,60,0.18),transparent 55%)}\r\n.vgnl-mc-img.no-photo::after{content:attr(data-icon);position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:42px;opacity:0.35}\r\n.vgnl-mc-grad{position:absolute;inset:0;background:linear-gradient(to top,rgba(0,0,0,0.55) 0%,transparent 50%);pointer-events:none}\r\n.vgnl-mc-badge{position:absolute;bottom:10px;left:10px;z-index:3;background:rgba(13,31,18,0.85);backdrop-filter:blur(6px);color:#fff;padding:5px 10px;border-radius:100px;font-size:10px;font-weight:700;letter-spacing:0.08em;text-transform:uppercase}\r\n.vgnl-mc-badge .time{color:var(--v-gold);margin-right:4px;font-weight:700}\r\n.vgnl-mc-cc{position:absolute;top:10px;left:10px;background:var(--v-gold);color:var(--v-dark);padding:3px 9px;border-radius:100px;font-size:10px;font-weight:700;z-index:3;letter-spacing:0.02em}\r\n.vgnl-mc-swap{position:absolute;top:10px;right:10px;width:34px;height:34px;border-radius:50%;background:rgba(13,31,18,0.75);backdrop-filter:blur(8px);border:1px solid rgba(255,198,50,0.4);color:#ffc632;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:4;opacity:0.85;transition:all .25s;padding:0}\r\n.vgnl-mc-swap:hover{opacity:1;background:var(--v-gold);color:var(--v-dark);border-color:var(--v-gold);transform:scale(1.12)}\r\n.vgnl-mc-swap:disabled{cursor:wait;opacity:0.5}\r\n.vgnl-mc-swap.swapping svg{animation:vgnlSpin .8s linear infinite}\r\n.vgnl-mc-swap svg{transition:transform .4s}\r\n.vgnl-mc-swap:hover svg{transform:rotate(180deg)}\r\n.vgnl-mc-body{padding:14px 16px 16px;flex:1;display:flex;flex-direction:column}\r\n.vgnl-mc-cat{font-size:9px;font-weight:700;letter-spacing:0.15em;text-transform:uppercase;color:var(--v-green);margin-bottom:6px}\r\n.vgnl-mc-titre{font-family:'Playfair Display',Georgia,serif;font-size:15px;font-weight:600;color:var(--v-dark);line-height:1.25;margin-bottom:6px}\r\n.vgnl-mc-meta{font-size:11px;color:var(--v-gray);line-height:1.4;margin-bottom:10px;flex:1}\r\n.vgnl-mc-pass{padding-top:10px;border-top:1px solid var(--v-border);font-size:11px;color:var(--v-gold);font-weight:600;display:flex;align-items:center;gap:6px;flex-wrap:wrap;line-height:1.35}\r\n.vgnl-mc-pass-eco{background:rgba(35,149,60,0.12);color:var(--v-green-light);padding:1px 7px;border-radius:6px;font-size:10px;font-weight:700;letter-spacing:0.02em}\r\n.vgnl-mc.libre{background:#faf7f2;border:1px dashed var(--v-border);box-shadow:none}\r\n.vgnl-mc.libre .vgnl-mc-img{background:linear-gradient(135deg,#e9e4d9,#f4f0e8)}\r\n.vgnl-mc.libre .vgnl-mc-img::after{content:'\u2728';font-size:32px;opacity:0.3;display:flex;position:absolute;inset:0;align-items:center;justify-content:center}\r\n.vgnl-mc.libre .vgnl-mc-titre{color:var(--v-gray);font-style:italic;font-weight:500}\r\n.vgnl-mc.libre .vgnl-mc-meta{color:#a0a0a0;font-style:italic}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 BILAN COMPACT \u2014 LA VALEUR DE VOTRE S\u00c9JOUR \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-bilan{background:linear-gradient(180deg,#0d1f12 0%,#050d06 100%);color:#fff;padding:80px 40px;position:relative;overflow:hidden}\r\n.vgnl-bilan::before{content:'';position:absolute;top:-80px;left:50%;transform:translateX(-50%);width:600px;height:600px;background:radial-gradient(circle,rgba(255,198,50,0.1),transparent 60%);pointer-events:none}\r\n.vgnl-bilan-inner{max-width:1180px;margin:0 auto;position:relative;z-index:2}\r\n.vgnl-bilan-head{text-align:center;margin-bottom:44px}\r\n.vgnl-bilan-kicker{font-size:11px;font-weight:700;letter-spacing:0.3em;text-transform:uppercase;color:var(--v-gold);margin-bottom:14px}\r\n.vgnl-bilan-title{font-family:'Playfair Display',Georgia,serif;font-size:clamp(30px,4.5vw,48px);font-weight:600;line-height:1.15;margin-bottom:12px}\r\n.vgnl-bilan-title em{color:var(--v-gold);font-style:italic;font-weight:400}\r\n.vgnl-bilan-sub{font-size:15px;color:rgba(255,255,255,0.6);max-width:580px;margin:0 auto;line-height:1.6}\r\n\r\n\/* \u00c9quation hero : Budget \u00d7 Pass = Avantages *\/\r\n.vgnl-bilan-equation{display:grid;grid-template-columns:1fr auto 1fr auto 1fr;gap:18px;align-items:center;max-width:980px;margin:0 auto 36px;padding:36px 28px;background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.08);border-radius:24px;backdrop-filter:blur(8px)}\r\n@media(max-width:760px){.vgnl-bilan-equation{grid-template-columns:1fr;gap:10px;padding:26px 18px}}\r\n.vgnl-eq-cell{text-align:center}\r\n.vgnl-eq-lbl{font-size:10px;font-weight:700;letter-spacing:0.2em;text-transform:uppercase;color:rgba(255,255,255,0.5);margin-bottom:8px}\r\n.vgnl-eq-val{font-family:'Playfair Display',Georgia,serif;font-size:clamp(36px,5vw,56px);font-weight:400;font-style:italic;line-height:1;color:#fff}\r\n.vgnl-eq-sub{font-size:12px;color:rgba(255,255,255,0.45);margin-top:6px;letter-spacing:0.02em}\r\n.vgnl-eq-val.gold{color:var(--v-gold)}\r\n.vgnl-eq-val.green{color:var(--v-green-light)}\r\n.vgnl-eq-op{font-family:'Playfair Display',Georgia,serif;font-size:30px;color:rgba(255,198,50,0.5);font-weight:300;line-height:1}\r\n@media(max-width:760px){.vgnl-eq-op{display:none}}\r\n.vgnl-bilan-ratio{text-align:center;font-size:14px;color:rgba(255,255,255,0.75);margin-bottom:44px;line-height:1.65;max-width:640px;margin-left:auto;margin-right:auto}\r\n.vgnl-bilan-ratio strong{color:var(--v-gold);font-family:'Playfair Display',Georgia,serif;font-size:17px;font-weight:600;font-style:italic}\r\n\r\n\/* Grille cadeaux compacts *\/\r\n.vgnl-gifts-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;max-width:1120px;margin:0 auto 44px}\r\n.vgnl-gift{background:rgba(255,255,255,0.05);padding:16px 14px;border-radius:14px;border:1px solid rgba(255,255,255,0.08);display:flex;gap:12px;align-items:flex-start;transition:all .3s;position:relative}\r\n.vgnl-gift:hover{background:rgba(255,255,255,0.08);border-color:rgba(255,198,50,0.3);transform:translateY(-2px)}\r\n.vgnl-gift-icon{width:38px;height:38px;background:rgba(255,198,50,0.15);border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:19px}\r\n.vgnl-gift-body{flex:1;min-width:0}\r\n.vgnl-gift-title{font-family:'Playfair Display',Georgia,serif;font-size:14px;font-weight:600;color:#fff;margin-bottom:3px;line-height:1.3;display:flex;align-items:center;gap:6px;flex-wrap:wrap}\r\n.vgnl-gift-desc{font-size:11px;color:rgba(255,255,255,0.55);line-height:1.45}\r\n.vgnl-gift-eco{display:inline-block;background:rgba(35,149,60,0.15);color:#6ed484;font-size:10px;font-weight:700;padding:1px 7px;border-radius:6px;margin-left:5px}\r\n.vgnl-info-btn{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;background:rgba(255,198,50,0.2);border:1px solid rgba(255,198,50,0.4);color:var(--v-gold);font-size:10px;font-weight:700;font-family:Georgia,serif;font-style:italic;line-height:1;cursor:pointer;transition:all .15s;flex-shrink:0;padding:0}\r\n.vgnl-info-btn:hover{background:var(--v-gold);color:var(--v-dark);transform:scale(1.2)}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 COMPARATIF SANS PASS \/ AVEC PASS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-compar-wrap{max-width:980px;margin:0 auto 36px;padding:0 8px}\r\n.vgnl-compar-head{text-align:center;margin-bottom:24px}\r\n.vgnl-compar-head h3{font-family:'Playfair Display',Georgia,serif;font-size:clamp(22px,3vw,30px);font-weight:600;color:#fff;line-height:1.2;margin-bottom:6px}\r\n.vgnl-compar-head h3 em{color:var(--v-gold);font-style:italic;font-weight:400}\r\n.vgnl-compar-head p{font-size:13px;color:rgba(255,255,255,0.6);line-height:1.5;max-width:520px;margin:0 auto}\r\n.vgnl-compar-grid{display:grid;grid-template-columns:1fr auto 1fr;gap:16px;align-items:stretch}\r\n@media(max-width:720px){.vgnl-compar-grid{grid-template-columns:1fr;gap:14px}}\r\n.vgnl-compar-col{background:#fff;border-radius:18px;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 8px 28px rgba(0,0,0,0.15)}\r\n.vgnl-compar-col.with-pass{background:linear-gradient(180deg,#1a3d25 0%,#0d2a18 100%);color:#fff;border:2px solid var(--v-gold);box-shadow:0 14px 40px rgba(255,198,50,0.2)}\r\n.vgnl-compar-col-head{padding:20px 22px 16px;border-bottom:1px solid var(--v-border);text-align:center}\r\n.vgnl-compar-col.with-pass .vgnl-compar-col-head{border-bottom-color:rgba(255,198,50,0.2)}\r\n.vgnl-compar-col-kicker{font-size:10px;font-weight:700;letter-spacing:0.25em;text-transform:uppercase;color:var(--v-gray);margin-bottom:6px}\r\n.vgnl-compar-col.with-pass .vgnl-compar-col-kicker{color:var(--v-gold)}\r\n.vgnl-compar-col-title{font-family:'Playfair Display',Georgia,serif;font-size:20px;font-weight:600;color:var(--v-dark);line-height:1.2}\r\n.vgnl-compar-col.with-pass .vgnl-compar-col-title{color:#fff}\r\n.vgnl-compar-col-title em{font-style:italic;color:var(--v-gold);font-weight:400}\r\n.vgnl-compar-lines{padding:16px 22px;flex:1;display:flex;flex-direction:column;gap:10px}\r\n.vgnl-compar-line{display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:6px 0;font-size:13px}\r\n.vgnl-compar-line-name{color:var(--v-gray);line-height:1.3;flex:1}\r\n.vgnl-compar-col.with-pass .vgnl-compar-line-name{color:rgba(255,255,255,0.75)}\r\n.vgnl-compar-line-name .sub{font-size:10px;display:block;opacity:0.65;margin-top:1px}\r\n.vgnl-compar-line-price{font-family:'Playfair Display',Georgia,serif;font-size:15px;font-weight:600;color:var(--v-dark);white-space:nowrap;flex-shrink:0}\r\n.vgnl-compar-col.with-pass .vgnl-compar-line-price{color:#fff}\r\n.vgnl-compar-line-old{text-decoration:line-through;opacity:0.4;font-size:12px;margin-right:6px;color:rgba(255,255,255,0.55)}\r\n.vgnl-compar-line.pass-cost .vgnl-compar-line-name{color:var(--v-gold);font-weight:600}\r\n.vgnl-compar-line.pass-cost .vgnl-compar-line-price{color:var(--v-gold)}\r\n.vgnl-compar-total{padding:18px 22px;background:var(--v-beige);border-top:2px solid var(--v-dark);display:flex;justify-content:space-between;align-items:baseline;gap:10px}\r\n.vgnl-compar-col.with-pass .vgnl-compar-total{background:rgba(255,198,50,0.12);border-top:2px solid var(--v-gold)}\r\n.vgnl-compar-total-lbl{font-size:11px;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:var(--v-dark)}\r\n.vgnl-compar-col.with-pass .vgnl-compar-total-lbl{color:var(--v-gold)}\r\n.vgnl-compar-total-val{font-family:'Playfair Display',Georgia,serif;font-size:26px;font-weight:700;color:var(--v-dark);line-height:1}\r\n.vgnl-compar-col.with-pass .vgnl-compar-total-val{color:var(--v-gold)}\r\n.vgnl-compar-savings{padding:12px 22px 18px;text-align:center;background:rgba(35,149,60,0.08);color:var(--v-green-light);font-size:13px;font-weight:600;font-family:'DM Sans',system-ui,sans-serif}\r\n.vgnl-compar-col.with-pass .vgnl-compar-savings{background:rgba(35,149,60,0.18);color:#6ed484}\r\n.vgnl-compar-savings strong{font-family:'Playfair Display',Georgia,serif;font-style:italic;font-size:17px;font-weight:700;margin-right:5px}\r\n.vgnl-compar-vs{display:flex;align-items:center;justify-content:center;font-family:'Playfair Display',Georgia,serif;font-style:italic;font-size:32px;color:var(--v-gold);font-weight:400;padding:0 4px}\r\n@media(max-width:720px){.vgnl-compar-vs{padding:4px 0;font-size:24px}}\r\n\r\n\/* Accord\u00e9on d\u00e9tail budget *\/\r\n.vgnl-budget-expand{max-width:780px;margin:0 auto 36px;background:rgba(255,255,255,0.03);border:1px solid rgba(255,255,255,0.08);border-radius:16px;overflow:hidden}\r\n.vgnl-budget-toggle{width:100%;display:flex;justify-content:space-between;align-items:center;padding:18px 24px;background:transparent;border:none;color:#fff;cursor:pointer;font-family:'DM Sans',system-ui,sans-serif;font-size:14px;font-weight:600;letter-spacing:0.02em;transition:background .2s}\r\n.vgnl-budget-toggle:hover{background:rgba(255,255,255,0.04)}\r\n.vgnl-budget-toggle::after{content:'+';font-size:22px;color:var(--v-gold);font-weight:400;transition:transform .3s}\r\n.vgnl-budget-expand.open .vgnl-budget-toggle::after{transform:rotate(45deg)}\r\n.vgnl-budget-content{max-height:0;overflow:hidden;transition:max-height .4s ease,padding .4s ease;padding:0 24px}\r\n.vgnl-budget-expand.open .vgnl-budget-content{max-height:900px;padding:0 24px 22px}\r\n.vgnl-budget-row{display:flex;justify-content:space-between;align-items:flex-start;padding:12px 0;border-bottom:1px solid rgba(255,255,255,0.06);gap:14px}\r\n.vgnl-budget-row:last-of-type{border-bottom:none;padding-top:16px;margin-top:4px;border-top:2px solid rgba(255,198,50,0.5)}\r\n.vgnl-budget-item-name{font-family:'Playfair Display',Georgia,serif;font-size:15px;font-weight:500;color:#fff;line-height:1.3}\r\n.vgnl-budget-item-sub{font-size:11px;color:rgba(255,255,255,0.45);margin-top:3px}\r\n.vgnl-budget-item-price{font-family:'Playfair Display',Georgia,serif;font-size:16px;font-weight:600;color:#fff;white-space:nowrap;flex-shrink:0}\r\n.vgnl-budget-total .vgnl-budget-item-name{font-size:16px;font-weight:700}\r\n.vgnl-budget-total .vgnl-budget-item-price{font-size:22px;color:var(--v-gold)}\r\n.vgnl-disclaimer{margin-top:14px;padding:12px 16px;background:rgba(255,255,255,0.03);border:1px solid rgba(255,255,255,0.06);border-radius:10px;font-size:11px;line-height:1.6;color:rgba(255,255,255,0.55)}\r\n.vgnl-disclaimer-title{font-size:10px;font-weight:700;letter-spacing:0.12em;text-transform:uppercase;color:var(--v-gold);margin-bottom:6px}\r\n.vgnl-disclaimer ul{list-style:none;padding:0}\r\n.vgnl-disclaimer li{padding:3px 0 3px 14px;position:relative}\r\n.vgnl-disclaimer li:before{content:\"\u2022\";position:absolute;left:4px;color:var(--v-gold);font-weight:700}\r\n.vgnl-disclaimer strong{color:#fff;font-weight:600}\r\n\r\n\/* CTAs int\u00e9gr\u00e9s dans le bilan *\/\r\n.vgnl-bilan-cta{display:flex;gap:14px;justify-content:center;flex-wrap:wrap;margin-top:12px}\r\n.vgnl-bilan-cta .vgnl-cta-primary{box-shadow:0 14px 40px rgba(255,198,50,0.35)}\r\n\r\n\/* Badges prix logement (utilis\u00e9s dans budget d\u00e9taill\u00e9) *\/\r\n.vgnl-prix-badge{display:inline-flex;align-items:center;gap:5px;font-size:10px;font-weight:700;letter-spacing:0.05em;padding:2px 8px;border-radius:10px;margin-left:6px;text-transform:uppercase}\r\n.vgnl-prix-garanti{background:rgba(35,149,60,0.15);border:1px solid rgba(35,149,60,0.35);color:#6ed484}\r\n.vgnl-prix-refresh{background:rgba(58,143,212,0.15);border:1px solid rgba(58,143,212,0.4);color:#7cc4f4}\r\n\r\n\/* Preuve sociale *\/\r\n.vgnl-social{padding:80px 40px;max-width:1180px;margin:0 auto;text-align:center}\r\n.vgnl-social-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:30px;margin:44px 0 60px}\r\n.vgnl-stat-num{font-family:'Playfair Display',Georgia,serif;font-size:48px;font-weight:400;font-style:italic;color:var(--v-green);line-height:1;margin-bottom:8px}\r\n.vgnl-stat-lbl{font-size:13px;color:var(--v-gray)}\r\n.vgnl-testimonials{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:22px;margin-top:40px}\r\n.vgnl-testi{background:#fff;padding:26px;border-radius:18px;box-shadow:0 6px 30px rgba(13,31,18,0.06);text-align:left}\r\n.vgnl-testi-quote{font-family:'Playfair Display',Georgia,serif;font-style:italic;font-size:16px;line-height:1.6;color:var(--v-dark);margin-bottom:16px}\r\n.vgnl-testi-author{display:flex;align-items:center;gap:12px}\r\n.vgnl-testi-avatar{width:40px;height:40px;border-radius:50%;background:var(--v-green);color:var(--v-gold);display:flex;align-items:center;justify-content:center;font-weight:700;font-family:'Playfair Display',Georgia,serif}\r\n.vgnl-testi-name{font-size:13px;font-weight:600;color:var(--v-dark);line-height:1.2}\r\n.vgnl-testi-meta{font-size:11px;color:var(--v-gray);margin-top:2px}\r\n\r\n\/* CTA Final *\/\r\n.vgnl-cta-final{min-height:80vh;background:var(--v-dark);position:relative;display:flex;align-items:center;justify-content:center;padding:80px 40px;color:#fff;text-align:center;overflow:hidden}\r\n.vgnl-cta-final-bg{position:absolute;inset:0;background-size:cover;background-position:center;z-index:0;opacity:.35}\r\n.vgnl-cta-final::before{content:'';position:absolute;inset:0;background:linear-gradient(rgba(13,31,18,0.7),rgba(13,31,18,0.9));z-index:1}\r\n.vgnl-cta-final-inner{position:relative;z-index:2;max-width:720px}\r\n.vgnl-cta-final h2{font-family:'Playfair Display',Georgia,serif;font-size:clamp(32px,5vw,58px);font-weight:600;line-height:1.15;margin-bottom:22px}\r\n.vgnl-cta-final h2 em{color:var(--v-gold);font-style:italic;font-weight:400}\r\n.vgnl-cta-final p{font-size:17px;color:rgba(255,255,255,0.85);line-height:1.6;margin-bottom:38px;max-width:560px;margin-left:auto;margin-right:auto}\r\n.vgnl-cta-buttons{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}\r\n.vgnl-cta-primary{background:var(--v-gold);color:var(--v-dark);padding:20px 44px;border-radius:100px;font-weight:700;font-size:15px;text-decoration:none;display:inline-flex;align-items:center;gap:10px;box-shadow:0 14px 40px rgba(255,198,50,0.4);transition:all .3s;border:none}\r\n.vgnl-cta-primary:hover{transform:translateY(-3px);box-shadow:0 20px 50px rgba(255,198,50,0.55)}\r\n.vgnl-cta-secondary{background:rgba(255,255,255,0.1);border:1px solid rgba(255,255,255,0.3);color:#fff;padding:20px 36px;border-radius:100px;font-weight:600;font-size:14px;text-decoration:none;display:inline-flex;align-items:center;gap:10px;transition:all .3s}\r\n.vgnl-cta-secondary:hover{background:rgba(255,255,255,0.18);border-color:#fff}\r\n.vgnl-cta-small{margin-top:24px;font-size:13px;color:rgba(255,255,255,0.6)}\r\n\r\n\/* Email capture *\/\r\n.vgnl-email-capture{background:#fff;border-radius:20px;padding:28px 32px;margin:40px auto;max-width:560px;box-shadow:0 8px 30px rgba(13,31,18,0.06)}\r\n.vgnl-email-capture h3{font-family:'Playfair Display',Georgia,serif;font-size:20px;color:var(--v-dark);margin-bottom:8px;font-weight:600}\r\n.vgnl-email-capture p{font-size:13px;color:var(--v-gray);margin-bottom:18px;line-height:1.5}\r\n.vgnl-email-row{display:flex;gap:10px}\r\n.vgnl-email-inp{flex:1;padding:13px 16px;border:1px solid var(--v-border);border-radius:10px;font-size:14px;font-family:inherit;background:var(--v-beige)}\r\n.vgnl-email-inp:focus{outline:none;border-color:var(--v-gold)}\r\n.vgnl-email-btn{background:var(--v-green);color:#fff;border:none;padding:13px 22px;border-radius:10px;font-weight:600;font-size:14px;white-space:nowrap}\r\n.vgnl-email-btn:hover{background:var(--v-dark)}\r\n\r\n\/* FAQ *\/\r\n.vgnl-faq{background:var(--v-beige);padding:80px 40px}\r\n.vgnl-faq-inner{max-width:780px;margin:0 auto}\r\n.vgnl-faq-head{text-align:center;margin-bottom:44px}\r\n.vgnl-faq-item{background:#fff;border-radius:14px;margin-bottom:10px;overflow:hidden;box-shadow:0 2px 10px rgba(13,31,18,0.04)}\r\n.vgnl-faq-q{padding:20px 24px;font-family:'Playfair Display',Georgia,serif;font-size:17px;font-weight:600;color:var(--v-dark);cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:14px;transition:background .2s}\r\n.vgnl-faq-q:hover{background:rgba(255,198,50,0.04)}\r\n.vgnl-faq-q::after{content:'+';font-size:22px;color:var(--v-gold);font-weight:400;transition:transform .3s;flex-shrink:0}\r\n.vgnl-faq-item.open .vgnl-faq-q::after{transform:rotate(45deg)}\r\n.vgnl-faq-a{padding:0 24px;font-size:14px;line-height:1.7;color:var(--v-gray);max-height:0;overflow:hidden;transition:max-height .3s,padding .3s}\r\n.vgnl-faq-item.open .vgnl-faq-a{padding:0 24px 22px;max-height:500px}\r\n\r\n\/* Modal conditions *\/\r\n.vgnl-modal-ov{display:none;position:fixed;inset:0;background:rgba(13,31,18,0.8);backdrop-filter:blur(6px);z-index:9999;align-items:center;justify-content:center;padding:20px}\r\n.vgnl-modal-ov.show{display:flex}\r\n.vgnl-modal{background:#fff;border-radius:20px;max-width:560px;width:100%;max-height:85vh;overflow-y:auto;padding:32px 30px;position:relative;box-shadow:0 30px 80px rgba(0,0,0,0.3)}\r\n.vgnl-modal-close{position:absolute;top:16px;right:16px;width:34px;height:34px;border-radius:50%;background:var(--v-beige);border:1px solid var(--v-border);color:var(--v-gray);font-size:20px;display:flex;align-items:center;justify-content:center;cursor:pointer}\r\n.vgnl-modal-close:hover{background:var(--v-dark);color:#fff;border-color:var(--v-dark)}\r\n.vgnl-modal-tag{font-size:10px;font-weight:700;letter-spacing:0.2em;text-transform:uppercase;color:var(--v-gold);margin-bottom:8px}\r\n.vgnl-modal-title{font-family:'Playfair Display',Georgia,serif;font-size:22px;color:var(--v-dark);margin-bottom:6px;font-weight:600;line-height:1.2}\r\n.vgnl-modal-avantage{font-size:14px;color:var(--v-green);font-weight:600;margin-bottom:20px;padding-bottom:16px;border-bottom:1px solid var(--v-border)}\r\n.vgnl-modal-label{font-size:10px;font-weight:700;letter-spacing:0.15em;text-transform:uppercase;color:var(--v-gray);margin-bottom:10px}\r\n.vgnl-modal-body{font-size:14px;color:var(--v-text);line-height:1.7}\r\n.vgnl-modal-body p{margin-bottom:10px}\r\n.vgnl-modal-body ul,.vgnl-modal-body ol{margin:10px 0;padding-left:22px}\r\n.vgnl-modal-body li{margin-bottom:5px}\r\n.vgnl-modal-body strong{color:var(--v-dark);font-weight:600}\r\n.vgnl-modal-body a{color:var(--v-green);text-decoration:underline}\r\n.vgnl-modal-empty{color:var(--v-gray);font-style:italic}\r\n\r\n\/* Reveal on scroll *\/\r\n.vgnl-reveal{opacity:0;transform:translateY(24px);transition:opacity .9s ease,transform .9s ease}\r\n.vgnl-reveal.in{opacity:1;transform:translateY(0)}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MODAL \u00c9DITION RAPIDE (dates + groupe depuis le r\u00e9sultat) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n.vgnl-edit-modal{display:none;position:fixed;inset:0;background:rgba(13,31,18,0.82);backdrop-filter:blur(8px);z-index:10001;align-items:center;justify-content:center;padding:20px;animation:vgnlEditFadeIn 0.25s ease}\r\n.vgnl-edit-modal.show{display:flex}\r\n@keyframes vgnlEditFadeIn{from{opacity:0}to{opacity:1}}\r\n.vgnl-edit-box{background:#fff;border-radius:22px;max-width:520px;width:100%;max-height:90vh;overflow-y:auto;padding:36px 32px 32px;position:relative;box-shadow:0 30px 80px rgba(0,0,0,0.35);animation:vgnlEditSlide 0.35s cubic-bezier(0.4,0,0.2,1)}\r\n@keyframes vgnlEditSlide{from{transform:translateY(30px);opacity:0}to{transform:translateY(0);opacity:1}}\r\n.vgnl-edit-close{position:absolute;top:16px;right:16px;width:36px;height:36px;border-radius:50%;background:var(--v-beige);border:1px solid var(--v-border);color:var(--v-gray);font-size:22px;font-weight:300;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;line-height:1;transition:all 0.2s}\r\n.vgnl-edit-close:hover{background:var(--v-dark);color:#fff;border-color:var(--v-dark);transform:rotate(90deg)}\r\n.vgnl-edit-tag{font-size:10px;font-weight:700;letter-spacing:0.2em;text-transform:uppercase;color:var(--v-gold);margin-bottom:8px}\r\n.vgnl-edit-title{font-family:'Playfair Display',Georgia,serif;font-size:24px;font-weight:600;color:var(--v-dark);margin-bottom:26px;line-height:1.2}\r\n.vgnl-edit-section{margin-bottom:22px;padding-bottom:22px;border-bottom:1px solid var(--v-border)}\r\n.vgnl-edit-section:last-of-type{border-bottom:none}\r\n.vgnl-edit-label{font-size:10px;font-weight:700;letter-spacing:0.15em;text-transform:uppercase;color:var(--v-gray);margin-bottom:12px}\r\n.vgnl-edit-dates-display{background:var(--v-beige);border:1px solid var(--v-border);border-radius:12px;padding:14px 16px;display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:10px}\r\n.vgnl-edit-dates-val{font-family:'Playfair Display',Georgia,serif;font-size:15px;color:var(--v-dark);font-weight:500;flex:1;line-height:1.3}\r\n.vgnl-edit-dates-val .sep{color:var(--v-gold);margin:0 8px}\r\n.vgnl-edit-dates-nights{font-size:11px;color:var(--v-gray);margin-top:2px;font-family:'DM Sans',system-ui,sans-serif}\r\n.vgnl-edit-change-btn{background:transparent;border:1px solid var(--v-green);color:var(--v-green);padding:8px 14px;border-radius:100px;font-size:12px;font-weight:600;cursor:pointer;font-family:'DM Sans',system-ui,sans-serif;transition:all 0.2s;white-space:nowrap}\r\n.vgnl-edit-change-btn:hover{background:var(--v-green);color:#fff}\r\n.vgnl-edit-group-row{display:flex;justify-content:space-between;align-items:center;padding:10px 0;gap:16px}\r\n.vgnl-edit-group-row+.vgnl-edit-group-row{border-top:1px solid rgba(19,82,33,0.06)}\r\n.vgnl-edit-group-label{font-size:14px;color:var(--v-dark);font-weight:500}\r\n.vgnl-edit-group-sub{font-size:11px;color:var(--v-gray);margin-top:2px}\r\n.vgnl-edit-stepper{display:flex;align-items:center;gap:12px}\r\n.vgnl-edit-step-btn{width:30px;height:30px;border-radius:50%;border:1px solid var(--v-border);background:var(--v-beige);color:var(--v-green);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center;line-height:1;padding:0;transition:all 0.15s}\r\n.vgnl-edit-step-btn:hover:not(:disabled){background:var(--v-green);color:#fff;border-color:var(--v-green)}\r\n.vgnl-edit-step-btn:disabled{opacity:0.3;cursor:not-allowed}\r\n.vgnl-edit-step-val{font-family:'Playfair Display',Georgia,serif;font-size:20px;font-weight:600;color:var(--v-green);min-width:22px;text-align:center;line-height:1}\r\n.vgnl-edit-cta{width:100%;background:linear-gradient(135deg,var(--v-gold),#ffaa00);color:var(--v-dark);border:none;padding:16px;border-radius:12px;font-size:14px;font-weight:700;cursor:pointer;font-family:'DM Sans',system-ui,sans-serif;display:flex;align-items:center;justify-content:center;gap:8px;margin-top:10px;box-shadow:0 10px 28px rgba(255,198,50,0.35);transition:all 0.3s}\r\n.vgnl-edit-cta:hover{transform:translateY(-2px);box-shadow:0 16px 40px rgba(255,198,50,0.5)}\r\n.vgnl-edit-cta:disabled{opacity:0.5;cursor:not-allowed;transform:none}\r\n\r\n\/* Toast notification *\/\r\n@keyframes vgnlSpin{to{transform:rotate(360deg)}}\r\n.vgnl-toast{position:fixed;top:30px;left:50%;transform:translate(-50%,-20px);background:var(--v-dark);color:#fff;padding:14px 22px;border-radius:100px;font-family:'DM Sans',system-ui,sans-serif;font-size:13px;font-weight:600;box-shadow:0 12px 40px rgba(0,0,0,0.35);z-index:10000;opacity:0;transition:opacity .3s ease,transform .3s ease;border:1px solid rgba(255,198,50,0.3);max-width:90vw;text-align:center}\r\n.vgnl-toast.show{opacity:1;transform:translate(-50%,0)}\r\n.vgnl-toast.warning{border-color:rgba(255,180,40,0.5);background:#2a1f05;color:#ffc632}\r\n.vgnl-toast.error{border-color:rgba(255,80,80,0.5);background:#2a0d0d;color:#ff8080}\r\n\r\n@media(max-width:640px){\r\n  .vgnl-intro{padding:110px 20px 50px}\r\n  .vgnl-wizard-screen{padding:70px 20px 50px}\r\n  .vgnl-logs-screen,.vgnl-sect,.vgnl-budget,.vgnl-social,.vgnl-pass-gifts,.vgnl-cta-final,.vgnl-faq{padding:60px 20px}\r\n  .vgnl-res-hero-inner{padding:0 22px 50px}\r\n  .vgnl-share-btn{top:16px;right:16px;padding:8px 14px;font-size:11px}\r\n  .vgnl-res-meta{gap:14px;font-size:13px}\r\n  .vgnl-days{gap:50px}\r\n  .vgnl-cards{grid-template-columns:1fr;gap:18px}\r\n}\r\n\r\n\/* \u2550\u2550\u2550 Envies & budget (chantier 2026-08) \u2550\u2550\u2550 *\/\r\n.vgnl-themes{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:28px}\r\n@media(max-width:760px){.vgnl-themes{grid-template-columns:repeat(2,1fr);gap:10px}}\r\n.vgnl-theme{display:block;width:100%;text-align:left;cursor:pointer;font-family:inherit;\r\n  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.16);\r\n  border-radius:14px;padding:16px 14px;color:#fff;transition:border-color .18s,background .18s}\r\n.vgnl-theme:hover{background:rgba(255,255,255,.1)}\r\n.vgnl-theme.is-on{background:rgba(35,149,60,.2);border-color:#23953c}\r\n.vgnl-theme-em{display:block;font-size:24px;line-height:1}\r\n.vgnl-theme-lb{display:block;margin-top:10px;font-size:14px;font-weight:500;line-height:1.25}\r\n.vgnl-budget{margin-top:34px;padding:26px 22px;text-align:center;\r\n  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.16);border-radius:16px}\r\n.vgnl-budget-amt{font-family:'Playfair Display',Georgia,serif;font-size:44px;line-height:1;color:#ffc632}\r\n.vgnl-budget-sub{margin-top:10px;font-size:13px;opacity:.7}\r\n.vgnl-budget-range{width:100%;margin:22px 0 8px;accent-color:#23953c;height:24px;cursor:pointer;background:transparent}\r\n.vgnl-budget-ends{display:flex;justify-content:space-between;font-size:11px;opacity:.5}\r\n\r\n\/* Carrousel resultat : plus de photos qu'avant (logement + etapes) \u2014 reperes affines *\/\r\n.vgnl-res-hero-dots{flex-wrap:wrap;max-width:260px;justify-content:flex-end;gap:5px}\r\n.vgnl-res-hero-dot{width:14px;height:3px;border-radius:2px}\r\n.vgnl-res-hero-dot.act{width:22px}\r\n<\/style>\r\n\r\n<div class=\"vgnl\" id=\"mon-sejour-de-reve-landing\">\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 NAV ACTES \u2014 DOTS VERTICAUX \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<nav class=\"vgnl-nav\" id=\"vgnl-nav\">\r\n  <a href=\"#vgnl-acte1\" class=\"active\" data-label=\"Parlez-nous de votre s\u00e9jour\" onclick=\"return vgnlNavClick(1,event)\"><\/a>\r\n  <a href=\"#vgnl-acte2\" data-label=\"Composez votre s\u00e9jour\" onclick=\"return vgnlNavClick(2,event)\"><\/a>\r\n  <a href=\"#vgnl-acte3\" data-label=\"Le budget\" onclick=\"return vgnlNavClick(3,event)\"><\/a>\r\n  <a href=\"#vgnl-acte4\" data-label=\"Je r\u00e9serve\" onclick=\"return vgnlNavClick(4,event)\"><\/a>\r\n<\/nav>\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 INTRO SEO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<section class=\"vgnl-intro\" id=\"vgnl-acte1\">\r\n  <span class=\"kicker\">Vosges Grandeur Nature<\/span>\r\n  <h1>Composez votre s\u00e9jour de r\u00eave <em>dans les Hautes-Vosges<\/em><\/h1>\r\n  <p class=\"lead\">For\u00eats de sapins mill\u00e9naires, cascades rugissantes, lacs sauvages, tables du terroir&nbsp;: les Hautes-Vosges n'attendent que vous. En quelques secondes, nous composons votre programme sur-mesure \u2014 logement d'exception, exp\u00e9riences locales, tables choisies \u2014 et nous vous livrons un Pass qui rend votre s\u00e9jour <em>deux fois plus riche<\/em>, pour le m\u00eame budget.<\/p>\r\n  <div class=\"proof\">\r\n    <div class=\"proof-item\"><strong>340+<\/strong> familles conquises<\/div>\r\n    <div class=\"proof-item\"><strong>4,9\/5<\/strong> de satisfaction<\/div>\r\n    <div class=\"proof-item\"><strong>23<\/strong> partenaires locaux<\/div>\r\n  <\/div>\r\n  <div class=\"scroll-hint\">Commencer<\/div>\r\n<\/section>\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 ACTE 1 \u2014 LE R\u00caVE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n\r\n<!-- Wizard \u00e9tape 1 : dates -->\r\n<section class=\"vgnl-wizard-screen\" id=\"vgnl-step-dates\">\r\n  <div class=\"vgnl-wizard-bg\" style=\"background-image:url('https:\/\/vosges-grandeur-nature.fr\/wp-content\/uploads\/2026\/04\/mer-de-nuages-vosges-scaled.jpg')\"><\/div>\r\n  <div class=\"vgnl-wizard-content vgnl-reveal\">\r\n    <span class=\"vgnl-chapter\">Parlez-nous de votre s\u00e9jour<\/span>\r\n    <h2 class=\"vgnl-wizard-q\">Quand voulez-vous <em>respirer<\/em>&nbsp;?<\/h2>\r\n    <p class=\"vgnl-wizard-hint\">Choisissez le moment o\u00f9 vous d\u00e9connecterez du reste du monde.<\/p>\r\n\r\n    <div class=\"vgnl-cal-selected\">\r\n      <div class=\"vgnl-date-pill\" id=\"vgnl-pill-in\">\r\n        <div class=\"vgnl-date-pill-label\">Arriv\u00e9e<\/div>\r\n        <div class=\"vgnl-date-pill-val placeholder\" id=\"vgnl-pill-in-val\">S\u00e9lectionnez<\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-date-pill\" id=\"vgnl-pill-out\">\r\n        <div class=\"vgnl-date-pill-label\">D\u00e9part<\/div>\r\n        <div class=\"vgnl-date-pill-val placeholder\" id=\"vgnl-pill-out-val\">S\u00e9lectionnez<\/div>\r\n        <div class=\"vgnl-date-pill-sub\" id=\"vgnl-pill-nights\" style=\"display:none\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"vgnl-cal\">\r\n      <div class=\"vgnl-cal-nav\">\r\n        <button class=\"vgnl-cal-nav-btn\" onclick=\"vgnlCalNav(-1)\">\u2039<\/button>\r\n        <div class=\"vgnl-cal-title\" id=\"vgnl-cal-title\"><\/div>\r\n        <button class=\"vgnl-cal-nav-btn\" onclick=\"vgnlCalNav(1)\">\u203a<\/button>\r\n      <\/div>\r\n      <div class=\"vgnl-cal-grid\">\r\n        <div class=\"vgnl-cal-days-hdr\">\r\n          <div class=\"vgnl-cal-day-lbl\">L<\/div><div class=\"vgnl-cal-day-lbl\">M<\/div><div class=\"vgnl-cal-day-lbl\">M<\/div>\r\n          <div class=\"vgnl-cal-day-lbl\">J<\/div><div class=\"vgnl-cal-day-lbl\">V<\/div><div class=\"vgnl-cal-day-lbl\">S<\/div><div class=\"vgnl-cal-day-lbl\">D<\/div>\r\n        <\/div>\r\n        <div class=\"vgnl-cal-days\" id=\"vgnl-cal-days\"><\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-cal-hint\" id=\"vgnl-cal-hint\">Cliquez sur votre date d'arriv\u00e9e<\/div>\r\n    <\/div>\r\n\r\n    <div style=\"margin-top:36px\">\r\n      <button class=\"vgnl-next-btn\" id=\"vgnl-btn-dates\" onclick=\"vgnlGoStep('group')\" disabled>\r\n        Et maintenant, qui sera l\u00e0&nbsp;?\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- Wizard \u00e9tape 2 : groupe -->\r\n<section class=\"vgnl-wizard-screen\" id=\"vgnl-step-group\" style=\"display:none\">\r\n  <div class=\"vgnl-wizard-bg\" style=\"background-image:url('https:\/\/vosges-grandeur-nature.fr\/wp-content\/uploads\/2026\/03\/Montagnes-Vosges-scaled.jpg')\"><\/div>\r\n  <div class=\"vgnl-wizard-content vgnl-reveal\">\r\n    <span class=\"vgnl-chapter\">Parlez-nous de votre s\u00e9jour<\/span>\r\n    <h2 class=\"vgnl-wizard-q\">Qui sera <em>l\u00e0<\/em>&nbsp;?<\/h2>\r\n    <p class=\"vgnl-wizard-hint\">Chaque personne comptera. Le s\u00e9jour s'adapte \u00e0 votre groupe.<\/p>\r\n\r\n    <div class=\"vgnl-group-grid\">\r\n      <div class=\"vgnl-group-card has-value\">\r\n        <div class=\"vgnl-group-icon\">\ud83d\udc6b<\/div>\r\n        <div class=\"vgnl-group-label\">Adultes<\/div>\r\n        <div class=\"vgnl-group-sub\">12 ans et plus<\/div>\r\n        <div class=\"vgnl-group-stepper\">\r\n          <button class=\"vgnl-gsbtn\" onclick=\"vgnlChgNb('a',-1)\" id=\"vgnl-btn-a-minus\" disabled>\u2212<\/button>\r\n          <div class=\"vgnl-gsval\" id=\"vgnl-val-a\">2<\/div>\r\n          <button class=\"vgnl-gsbtn\" onclick=\"vgnlChgNb('a',1)\">+<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-group-card\" id=\"vgnl-card-e\">\r\n        <div class=\"vgnl-group-icon\">\ud83e\uddd2<\/div>\r\n        <div class=\"vgnl-group-label\">Enfants<\/div>\r\n        <div class=\"vgnl-group-sub\">4 \u00e0 11 ans<\/div>\r\n        <div class=\"vgnl-group-stepper\">\r\n          <button class=\"vgnl-gsbtn\" onclick=\"vgnlChgNb('e',-1)\" id=\"vgnl-btn-e-minus\" disabled>\u2212<\/button>\r\n          <div class=\"vgnl-gsval\" id=\"vgnl-val-e\">0<\/div>\r\n          <button class=\"vgnl-gsbtn\" onclick=\"vgnlChgNb('e',1)\">+<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-group-card\" id=\"vgnl-card-b\">\r\n        <div class=\"vgnl-group-icon\">\ud83d\udc76<\/div>\r\n        <div class=\"vgnl-group-label\">Tout-petits<\/div>\r\n        <div class=\"vgnl-group-sub\">Moins de 4 ans<\/div>\r\n        <div class=\"vgnl-group-stepper\">\r\n          <button class=\"vgnl-gsbtn\" onclick=\"vgnlChgNb('b',-1)\" id=\"vgnl-btn-b-minus\" disabled>\u2212<\/button>\r\n          <div class=\"vgnl-gsval\" id=\"vgnl-val-b\">0<\/div>\r\n          <button class=\"vgnl-gsbtn\" onclick=\"vgnlChgNb('b',1)\">+<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n    <p class=\"vgnl-wizard-note\">Vous serez <strong id=\"vgnl-group-total\">2<\/strong> au total.<\/p>\r\n\r\n    <div style=\"margin-top:18px\">\r\n      <button class=\"vgnl-next-btn\" onclick=\"vgnlGoStep('envies')\">\r\n        Vos envies et votre budget\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>\r\n      <\/button>\r\n      <br>\r\n      <button class=\"vgnl-back-btn\" onclick=\"vgnlGoStep('dates')\">\u2190 Modifier les dates<\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- Wizard etape 3 : envies & budget (chantier 2026-08) -->\r\n<section class=\"vgnl-wizard-screen\" id=\"vgnl-step-envies\" style=\"display:none\">\r\n  <div class=\"vgnl-wizard-bg\" style=\"background-image:url('https:\/\/vosges-grandeur-nature.fr\/wp-content\/uploads\/2026\/03\/Montagnes-Vosges-scaled.jpg')\"><\/div>\r\n  <div class=\"vgnl-wizard-content vgnl-reveal\">\r\n    <span class=\"vgnl-chapter\">Parlez-nous de votre s&eacute;jour<\/span>\r\n    <h2 class=\"vgnl-wizard-q\">Qu'est-ce qui vous fait <em>vibrer<\/em>&nbsp;?<\/h2>\r\n    <p class=\"vgnl-wizard-hint\">Choisissez ce qui vous attire. Ou rien, et on vous fait d&eacute;couvrir de tout.<\/p>\r\n\r\n    <div class=\"vgnl-themes\" id=\"vgnl-themes\"><\/div>\r\n\r\n    <div class=\"vgnl-budget\">\r\n      <div class=\"vgnl-budget-amt\" id=\"vgnl-budget-amt\">&mdash;<\/div>\r\n      <div class=\"vgnl-budget-sub\" id=\"vgnl-budget-sub\"><\/div>\r\n      <input type=\"range\" class=\"vgnl-budget-range\" id=\"vgnl-budget-range\" min=\"100\" step=\"50\" max=\"3000\" value=\"1000\" aria-label=\"Budget total du s&eacute;jour\" oninput=\"vgnlBudgetInput(this.value)\">\r\n      <div class=\"vgnl-budget-ends\"><span>100&nbsp;&euro;<\/span><span id=\"vgnl-budget-max\">&mdash;<\/span><\/div>\r\n    <\/div>\r\n    <p class=\"vgnl-wizard-hint\" style=\"margin-top:14px;font-size:13px;opacity:.75\">\r\n      H&eacute;bergement, tables, activit&eacute;s et Pass VGN inclus. Vous ajusterez &agrave; l'&eacute;tape suivante.\r\n    <\/p>\r\n\r\n    <div style=\"margin-top:32px\">\r\n      <button class=\"vgnl-next-btn\" onclick=\"vgnlGoStep('logements')\">\r\n        Choisir o&ugrave; dormir\r\n        <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>\r\n      <\/button>\r\n      <br>\r\n      <button class=\"vgnl-back-btn\" onclick=\"vgnlGoStep('group')\">&larr; Modifier le groupe<\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- Wizard \u00e9tape 4 : logements -->\r\n<section class=\"vgnl-logs-screen\" id=\"vgnl-step-logements\" style=\"display:none\">\r\n  <div class=\"vgnl-logs-inner\">\r\n    <div class=\"vgnl-logs-head vgnl-reveal\">\r\n      <span class=\"vgnl-chapter\">Parlez-nous de votre s\u00e9jour<\/span>\r\n      <h2>O\u00f9 commencez-vous votre <em>histoire<\/em>&nbsp;?<\/h2>\r\n      <p>Chaque logement d\u00e9termine votre territoire. Tables, activit\u00e9s, panoramas&nbsp;: tout s'organise autour de votre pied-\u00e0-terre.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"vgnl-logs-slider\">\r\n      <div class=\"vgnl-logs-track\" id=\"vgnl-logs-track\">\r\n        <div style=\"width:100%;flex-shrink:0;text-align:center;padding:60px;color:var(--v-gray)\">Recherche des logements disponibles\u2026<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"vgnl-logs-nav\" id=\"vgnl-logs-nav\" style=\"display:none\">\r\n      <button class=\"vgnl-logs-nav-btn\" onclick=\"vgnlSlideNav(-1)\">\u2039<\/button>\r\n      <div class=\"vgnl-logs-dots\" id=\"vgnl-logs-dots\"><\/div>\r\n      <button class=\"vgnl-logs-nav-btn\" onclick=\"vgnlSlideNav(1)\">\u203a<\/button>\r\n    <\/div>\r\n\r\n    <!-- Option \"J'ai d\u00e9j\u00e0 un logement\" (autocomplete ville + centroid pour calculs) -->\r\n    <div class=\"vgnl-external-lodging-wrap\">\r\n      <div class=\"vgnl-external-separator\"><span>OU<\/span><\/div>\r\n      <button class=\"vgnl-external-trigger\" onclick=\"vgnlToggleExternalLodging()\" id=\"vgnl-external-trigger\">\r\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"\/><polyline points=\"9 22 9 12 15 12 15 22\"\/><\/svg>\r\n        <span>J'ai d\u00e9j\u00e0 un logement<\/span>\r\n        <small>Je veux juste composer mon programme et prendre un Pass VGN<\/small>\r\n      <\/button>\r\n      <div class=\"vgnl-external-box\" id=\"vgnl-external-box\">\r\n        <div class=\"vgnl-external-head\">\r\n          <h3>O\u00f9 s\u00e9journez-vous ?<\/h3>\r\n          <p>Indiquez votre commune (Vosges, Alsace, Lorraine\u2026) pour qu'on calcule les trajets depuis votre logement.<\/p>\r\n        <\/div>\r\n        <div class=\"vgnl-external-input-wrap\">\r\n          <input type=\"text\" class=\"vgnl-external-input\" id=\"vgnl-external-input\" placeholder=\"Tapez le nom de votre commune\u2026\" autocomplete=\"off\">\r\n          <div class=\"vgnl-external-suggestions\" id=\"vgnl-external-suggestions\"><\/div>\r\n        <\/div>\r\n        <div class=\"vgnl-external-selected\" id=\"vgnl-external-selected\" style=\"display:none\">\r\n          <div>\r\n            <div class=\"vgnl-external-selected-name\" id=\"vgnl-external-selected-name\"><\/div>\r\n            <div class=\"vgnl-external-selected-sub\">\u2713 Commune s\u00e9lectionn\u00e9e<\/div>\r\n          <\/div>\r\n          <button class=\"vgnl-external-clear\" onclick=\"vgnlClearExternal()\" aria-label=\"Effacer\">\u00d7<\/button>\r\n        <\/div>\r\n        <button class=\"vgnl-external-cancel\" onclick=\"vgnlToggleExternalLodging()\">\u2190 Revenir au choix d'un logement VGN<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"vgnl-logs-actions\">\r\n      <button class=\"vgnl-back-btn\" onclick=\"vgnlGoStep('envies')\">\u2190 Modifier mes envies<\/button>\r\n      <button class=\"vgnl-next-btn\" id=\"vgnl-btn-gen\" onclick=\"vgnlGenerer()\" disabled>\r\n        Imaginer notre s\u00e9jour\r\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 G\u00c9N\u00c9RATION \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<section class=\"vgnl-gen\" id=\"vgnl-gen\">\r\n  <div class=\"vgnl-gen-bg\"><\/div>\r\n  <div class=\"vgnl-gen-inner\">\r\n    <p class=\"vgnl-gen-text\">Nous dessinons <em>votre escapade<\/em><br>entre sapins, lacs et bonnes tables\u2026<\/p>\r\n    <div class=\"vgnl-gen-line\">\r\n      <svg viewBox=\"0 0 300 120\" fill=\"none\" stroke=\"#ffc632\" stroke-width=\"2.5\" stroke-linecap=\"round\">\r\n        <path class=\"vgnl-path\" d=\"M 10 80 Q 60 20, 110 60 T 200 40 T 290 70\"\/>\r\n        <circle cx=\"10\" cy=\"80\" r=\"4\" fill=\"#ffc632\"\/>\r\n        <circle cx=\"110\" cy=\"60\" r=\"3\" fill=\"#ffc632\"\/>\r\n        <circle cx=\"200\" cy=\"40\" r=\"3\" fill=\"#ffc632\"\/>\r\n        <circle cx=\"290\" cy=\"70\" r=\"4\" fill=\"#ffc632\"\/>\r\n      <\/svg>\r\n    <\/div>\r\n    <div class=\"vgnl-gen-steps\">\r\n      <div class=\"vgnl-gs\" id=\"vgnl-gs0\"><div class=\"vgnl-gs-dot\"><\/div>Vos envies analys\u00e9es<\/div>\r\n      <div class=\"vgnl-gs\" id=\"vgnl-gs1\"><div class=\"vgnl-gs-dot\"><\/div>Logement v\u00e9rifi\u00e9, dates confirm\u00e9es<\/div>\r\n      <div class=\"vgnl-gs\" id=\"vgnl-gs2\"><div class=\"vgnl-gs-dot\"><\/div>Tables proches s\u00e9lectionn\u00e9es<\/div>\r\n      <div class=\"vgnl-gs\" id=\"vgnl-gs3\"><div class=\"vgnl-gs-dot\"><\/div>Exp\u00e9riences choisies pour votre groupe<\/div>\r\n      <div class=\"vgnl-gs\" id=\"vgnl-gs4\"><div class=\"vgnl-gs-dot\"><\/div>Calcul des \u00e9conomies Pass<\/div>\r\n      <div class=\"vgnl-gs\" id=\"vgnl-gs5\"><div class=\"vgnl-gs-dot\"><\/div>Votre programme est pr\u00eat \u2726<\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 R\u00c9SULTAT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<div class=\"vgnl-result\" id=\"vgnl-result\">\r\n\r\n  <!-- Hero r\u00e9sultat \u2014 style fiche logement VGN -->\r\n  <section class=\"vgnl-res-hero\" id=\"vgnl-acte2\">\r\n    <div class=\"vgnl-res-hero-track\" id=\"vgnl-res-hero-track\"><\/div>\r\n    <div class=\"vgnl-res-hero-ov1\"><\/div>\r\n    <div class=\"vgnl-res-hero-ov2\"><\/div>\r\n    <button class=\"vgnl-share-btn\" id=\"vgnl-share-btn\">\r\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"\/><circle cx=\"6\" cy=\"12\" r=\"3\"\/><circle cx=\"18\" cy=\"19\" r=\"3\"\/><line x1=\"8.59\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"\/><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"\/><\/svg>\r\n      Partager\r\n    <\/button>\r\n    <div class=\"vgnl-res-hero-c\">\r\n      <div class=\"vgnl-res-hero-row\">\r\n        <div class=\"vgnl-res-hero-left\">\r\n          <div class=\"vgnl-res-hero-eyebrow\" id=\"vgnl-res-eyebrow\"><\/div>\r\n          <h2 class=\"vgnl-res-hero-titre\" id=\"vgnl-res-title\"><\/h2>\r\n          <div class=\"vgnl-res-hero-feats\" id=\"vgnl-res-feats\"><\/div>\r\n          <div class=\"vgnl-res-hero-cta-row\">\r\n            <button class=\"vgnl-res-hero-cta\" onclick=\"document.getElementById('vgnl-cartes-section').scrollIntoView({behavior:'smooth'})\">Voir le programme \u2192<\/button>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"vgnl-res-hero-right\">\r\n          <div class=\"vgnl-res-hero-dots\" id=\"vgnl-res-hero-dots\"><\/div>\r\n          <div class=\"vgnl-res-hero-nav\">\r\n            <button class=\"vgnl-res-hero-btn\" onclick=\"vgnlHeroNav(-1)\">\u2039<\/button>\r\n            <button class=\"vgnl-res-hero-btn\" onclick=\"vgnlHeroNav(1)\">\u203a<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <!-- Cartes par moment \u2014 avec boutons swap (personnalisable par l'utilisateur) -->\r\n  <section class=\"vgnl-sect\" id=\"vgnl-cartes-section\">\r\n    <div class=\"vgnl-sect-head vgnl-reveal\">\r\n      <span class=\"vgnl-sect-kicker\">Composez votre s\u00e9jour<\/span>\r\n      <h2 class=\"vgnl-sect-title\">Ce que vous allez <em>vivre &amp; go\u00fbter<\/em><\/h2>\r\n      <p class=\"vgnl-sect-intro\">Chaque moment a \u00e9t\u00e9 choisi pour vous. Pas convaincu par une proposition&nbsp;? Cliquez sur <strong>\u21bb Voir un autre<\/strong> sur n'importe quelle carte \u2014 le planning et le budget s'adaptent en direct.<\/p>\r\n    <\/div>\r\n    <div id=\"vgnl-moments-par-jour\"><\/div>\r\n  <\/section>\r\n\r\n  <!-- R\u00e9cap jour par jour d\u00e9taill\u00e9 (planning complet avec horaires, temps route, avantages) -->\r\n  <section class=\"vgnl-sect\">\r\n    <div class=\"vgnl-sect-head vgnl-reveal\">\r\n      <span class=\"vgnl-sect-kicker\">Le planning d\u00e9taill\u00e9<\/span>\r\n      <h2 class=\"vgnl-sect-title\">Le r\u00e9cit de <em>votre escapade<\/em><\/h2>\r\n      <p class=\"vgnl-sect-intro\">Chaque jour a son rythme. Horaires, temps de route, avantages Pass : tout est l\u00e0.<\/p>\r\n    <\/div>\r\n    <div class=\"vgnl-days\" id=\"vgnl-days\"><\/div>\r\n  <\/section>\r\n\r\n  <!-- ACTE 3 \u2014 Bilan compact : LA VALEUR EN UNE VUE -->\r\n  <section class=\"vgnl-bilan\" id=\"vgnl-acte3\">\r\n    <div class=\"vgnl-bilan-inner\">\r\n      <div class=\"vgnl-bilan-head vgnl-reveal\">\r\n        <span class=\"vgnl-bilan-kicker\">Le budget<\/span>\r\n        <h2 class=\"vgnl-bilan-title\">Voyez <em>ce que vous recevez<\/em>.<\/h2>\r\n        <p class=\"vgnl-bilan-sub\">Un s\u00e9jour qui s'enrichit sans que la facture ne grimpe. Voil\u00e0 ce que le Pass VGN ajoute \u00e0 votre escapade.<\/p>\r\n      <\/div>\r\n\r\n      <!-- \u00c9quation hero : Budget \u00d7 Pass VGN = Avantages offerts -->\r\n      <div class=\"vgnl-bilan-equation vgnl-reveal\" id=\"vgnl-bilan-equation\"><\/div>\r\n\r\n      <!-- Phrase de ratio (impact psychologique) -->\r\n      <p class=\"vgnl-bilan-ratio vgnl-reveal\" id=\"vgnl-bilan-ratio\"><\/p>\r\n\r\n      <!-- Comparatif SANS \/ AVEC Pass VGN -->\r\n      <div class=\"vgnl-compar-wrap vgnl-reveal\">\r\n        <div class=\"vgnl-compar-head\">\r\n          <h3>Avec ou sans <em>Pass VGN<\/em> ?<\/h3>\r\n          <p>Comparez ce que vous payez r\u00e9ellement. Tout est l\u00e0, poste par poste.<\/p>\r\n        <\/div>\r\n        <div class=\"vgnl-compar-grid\" id=\"vgnl-compar-grid\"><\/div>\r\n      <\/div>\r\n\r\n      <!-- Grille cadeaux compacts -->\r\n      <div class=\"vgnl-gifts-grid\" id=\"vgnl-gifts\"><\/div>\r\n\r\n      <!-- Accord\u00e9on d\u00e9tail budget -->\r\n      <div class=\"vgnl-budget-expand\" id=\"vgnl-budget-expand\">\r\n        <button class=\"vgnl-budget-toggle\" onclick=\"this.parentElement.classList.toggle('open')\">\r\n          <span>Voir le d\u00e9tail du budget par poste<\/span>\r\n        <\/button>\r\n        <div class=\"vgnl-budget-content\">\r\n          <div id=\"vgnl-budget-box\"><\/div>\r\n          <div class=\"vgnl-disclaimer\">\r\n            <div class=\"vgnl-disclaimer-title\">\u24d8 \u00c0 propos de ce budget<\/div>\r\n            <ul>\r\n              <li><strong>Pass VGN<\/strong>&nbsp;: tarif garanti tant que la composition du groupe et la dur\u00e9e du s\u00e9jour restent identiques.<\/li>\r\n              <li><strong>Logement<\/strong>&nbsp;: tarif garanti jusqu'\u00e0 minuit du jour de g\u00e9n\u00e9ration. Au-del\u00e0, il peut \u00e9voluer selon la tarification dynamique.<\/li>\r\n              <li><strong>Partenaires<\/strong>&nbsp;: les montants affich\u00e9s sont des <strong>projections<\/strong> bas\u00e9es sur le panier moyen par personne, ajust\u00e9es \u00e0 votre groupe. Le tarif r\u00e9el d\u00e9pend de vos choix sur place \u2014 contactez directement chaque partenaire pour confirmer prix et disponibilit\u00e9s.<\/li>\r\n            <\/ul>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- CTAs int\u00e9gr\u00e9s (duplicate accessible du CTA final) -->\r\n      <div class=\"vgnl-bilan-cta\">\r\n        <a class=\"vgnl-cta-primary\" id=\"vgnl-bilan-cta-pass\" href=\"\/boutique-pass-vgn\/\">\r\n          \u2726 Commander mon Pass VGN\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>\r\n        <\/a>\r\n        <a class=\"vgnl-cta-secondary\" id=\"vgnl-bilan-cta-resa\" href=\"#\" target=\"_blank\">\r\n          R\u00e9server le logement\r\n        <\/a>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <!-- Preuve sociale -->\r\n  <section class=\"vgnl-social\">\r\n    <div class=\"vgnl-reveal\">\r\n      <span class=\"vgnl-sect-kicker\">Ils l'ont v\u00e9cu<\/span>\r\n      <h2 class=\"vgnl-sect-title\">Vous \u00eates entre <em>de bonnes mains.<\/em><\/h2>\r\n    <\/div>\r\n    <div class=\"vgnl-social-stats vgnl-reveal\">\r\n      <div><div class=\"vgnl-stat-num\">340+<\/div><div class=\"vgnl-stat-lbl\">familles ont v\u00e9cu ce type de s\u00e9jour<\/div><\/div>\r\n      <div><div class=\"vgnl-stat-num\">4,9\/5<\/div><div class=\"vgnl-stat-lbl\">note moyenne \u00b7 180+ avis<\/div><\/div>\r\n      <div><div class=\"vgnl-stat-num\">23<\/div><div class=\"vgnl-stat-lbl\">partenaires locaux s\u00e9lectionn\u00e9s<\/div><\/div>\r\n    <\/div>\r\n    <div class=\"vgnl-testimonials\">\r\n      <div class=\"vgnl-testi vgnl-reveal\">\r\n        <p class=\"vgnl-testi-quote\">\"Le s\u00e9jour a \u00e9t\u00e9 construit pour nous. On a d\u00e9couvert des endroits qu'on n'aurait jamais trouv\u00e9s seuls. Le Pass, c'est la cerise sur le g\u00e2teau.\"<\/p>\r\n        <div class=\"vgnl-testi-author\"><div class=\"vgnl-testi-avatar\">S<\/div><div><div class=\"vgnl-testi-name\">Sophie & Marc<\/div><div class=\"vgnl-testi-meta\">Juillet 2025 \u00b7 Ferme des Cherri\u00e8res<\/div><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-testi vgnl-reveal\">\r\n        <p class=\"vgnl-testi-quote\">\"Les enfants ont ador\u00e9. Nous aussi. On reviendra l'hiver prochain pour le sauna face aux sapins enneig\u00e9s.\"<\/p>\r\n        <div class=\"vgnl-testi-author\"><div class=\"vgnl-testi-avatar\">J<\/div><div><div class=\"vgnl-testi-name\">Julie \u00b7 Mulhouse<\/div><div class=\"vgnl-testi-meta\">Ao\u00fbt 2025 \u00b7 avec 3 enfants<\/div><\/div><\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-testi vgnl-reveal\">\r\n        <p class=\"vgnl-testi-quote\">\"Je cherchais un vrai week-end d\u00e9connexion. Je l'ai trouv\u00e9. Sans avoir \u00e0 chercher pendant 3h sur Booking.\"<\/p>\r\n        <div class=\"vgnl-testi-author\"><div class=\"vgnl-testi-avatar\">T<\/div><div><div class=\"vgnl-testi-name\">Thomas \u00b7 Strasbourg<\/div><div class=\"vgnl-testi-meta\">Septembre 2025 \u00b7 en couple<\/div><\/div><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <!-- Claim s\u00e9jour (sauvegarde c\u00f4t\u00e9 app Laravel \u2014 remplace l'ancienne capture email) -->\r\n  <div class=\"vgnl-email-capture\" id=\"vgnl-claim-form\">\r\n    <h3>Gardez ce s\u00e9jour avec vous<\/h3>\r\n    <p>Pour <strong>sauvegarder votre s\u00e9jour<\/strong> et le retrouver \u00e0 tout moment, cr\u00e9ez votre acc\u00e8s gratuit dans l\u2019application Vosges Grandeur Nature.<\/p>\r\n    <div class=\"vgnl-email-row\">\r\n      <input type=\"email\" class=\"vgnl-email-inp\" id=\"vgnl-claim-email\" placeholder=\"votre@email.fr\" autocomplete=\"email\">\r\n      <button class=\"vgnl-email-btn\" id=\"vgnl-claim-btn\">Sauvegarder mon s\u00e9jour<\/button>\r\n    <\/div>\r\n  <\/div>\r\n  <div class=\"vgnl-email-capture\" id=\"vgnl-claim-done\" style=\"display:none\">\r\n    <h3>C\u2019est sauvegard\u00e9 \u2726<\/h3>\r\n    <p>V\u00e9rifiez votre bo\u00eete mail : votre lien d\u2019acc\u00e8s vous y attend.<\/p>\r\n    <p><a href=\"\/app\/\" data-vgnl-app>\ud83d\udcf2 T\u00e9l\u00e9charger l\u2019application<\/a><\/p>\r\n  <\/div>\r\n\r\n  <!-- ACTE 4 \u2014 CTA final -->\r\n  <section class=\"vgnl-cta-final\" id=\"vgnl-acte4\">\r\n    <div class=\"vgnl-cta-final-bg\" id=\"vgnl-cta-final-bg\"><\/div>\r\n    <div class=\"vgnl-cta-final-inner vgnl-reveal\">\r\n      <h2>Votre s\u00e9jour vous attend.<br><em>Il ne manque plus que vous.<\/em><\/h2>\r\n      <p id=\"vgnl-cta-desc\">Commandez votre Pass VGN instantan\u00e9ment et r\u00e9servez votre logement en quelques clics. Arriv\u00e9e libre d\u00e8s 15h, annulation flexible jusqu'\u00e0 48h avant.<\/p>\r\n      <div class=\"vgnl-cta-buttons\">\r\n        <a class=\"vgnl-cta-primary\" id=\"vgnl-cta-pass\" href=\"\/boutique-pass-vgn\/\">\r\n          \u2726 Commander notre Pass VGN\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>\r\n        <\/a>\r\n        <a class=\"vgnl-cta-secondary\" id=\"vgnl-cta-resa\" href=\"#\" target=\"_blank\">\r\n          R\u00e9server le logement\r\n          <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><polyline points=\"15 3 21 3 21 9\"\/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"\/><\/svg>\r\n        <\/a>\r\n      <\/div>\r\n      <p class=\"vgnl-cta-small\">Paiement s\u00e9curis\u00e9 Stripe \u00b7 Annulation gratuite jusqu'\u00e0 48h avant<\/p>\r\n      <p class=\"vgnl-cta-small\" style=\"margin-top:20px\"><a href=\"#\" onclick=\"vgnlRestart();return false;\" style=\"color:rgba(255,255,255,0.6);text-decoration:underline\">\u2190 Modifier mon programme<\/a><\/p>\r\n    <\/div>\r\n  <\/section>\r\n\r\n<\/div>\r\n\r\n<!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 FAQ SEO \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\r\n<section class=\"vgnl-faq\">\r\n  <div class=\"vgnl-faq-inner\">\r\n    <div class=\"vgnl-faq-head vgnl-reveal\">\r\n      <span class=\"vgnl-sect-kicker\">Questions fr\u00e9quentes<\/span>\r\n      <h2 class=\"vgnl-sect-title\">Tout ce qu'il faut <em>savoir.<\/em><\/h2>\r\n    <\/div>\r\n    <div class=\"vgnl-faq-item\">\r\n      <div class=\"vgnl-faq-q\" onclick=\"this.parentElement.classList.toggle('open')\">Combien co\u00fbte un s\u00e9jour dans les Vosges avec Vosges Grandeur Nature&nbsp;?<\/div>\r\n      <div class=\"vgnl-faq-a\"><p>Le budget varie selon votre logement, la saison et la composition de votre groupe. Pour un couple, comptez en moyenne 400\u2013600&nbsp;\u20ac pour un s\u00e9jour de 3 nuits en logement VGN Premium, hors restaurants et activit\u00e9s. Pour une famille avec enfants, le budget moyen tourne autour de 800\u20131&nbsp;200&nbsp;\u20ac tout inclus (logement + 3 d\u00eeners + activit\u00e9s). Notre outil de composition vous donne une estimation transparente en temps r\u00e9el.<\/p><\/div>\r\n    <\/div>\r\n    <div class=\"vgnl-faq-item\">\r\n      <div class=\"vgnl-faq-q\" onclick=\"this.parentElement.classList.toggle('open')\">Qu'est-ce que le Pass VGN et comment fonctionne-t-il&nbsp;?<\/div>\r\n      <div class=\"vgnl-faq-a\"><p>Le Pass VGN est une carte touristique digitale qui vous donne acc\u00e8s \u00e0 des avantages exclusifs chez tous nos partenaires locaux&nbsp;: restaurants, activit\u00e9s, producteurs, artisans, centres de bien-\u00eatre. Il se pr\u00e9sente sous forme de QR code envoy\u00e9 par email d\u00e8s l'achat. Vous le pr\u00e9sentez simplement chez chaque partenaire pour b\u00e9n\u00e9ficier de votre avantage.<\/p><p>\u00c0 partir de 8&nbsp;\u20ac par adulte pour 2 jours, avec une tarification d\u00e9gressive pour les s\u00e9jours plus longs. Enfants 4-11 ans&nbsp;: 50% de r\u00e9duction. Tout-petits (moins de 4 ans)&nbsp;: gratuit.<\/p><\/div>\r\n    <\/div>\r\n    <div class=\"vgnl-faq-item\">\r\n      <div class=\"vgnl-faq-q\" onclick=\"this.parentElement.classList.toggle('open')\">Combien de jours faut-il pr\u00e9voir pour visiter les Hautes-Vosges&nbsp;?<\/div>\r\n      <div class=\"vgnl-faq-a\"><p>Pour d\u00e9couvrir les Hautes-Vosges sans courir, comptez au minimum 3 nuits&nbsp;\/ 4 jours. C'est le format id\u00e9al pour profiter du logement, faire 2-3 randonn\u00e9es, go\u00fbter aux sp\u00e9cialit\u00e9s locales (munster, tarte flamb\u00e9e, truite des lacs) et vivre une exp\u00e9rience bien-\u00eatre. Pour un s\u00e9jour plus immersif, 5 \u00e0 7 nuits permettent de varier les ambiances&nbsp;: for\u00eats, lacs, sommets, villages. Notre outil s'adapte \u00e0 toutes les dur\u00e9es.<\/p><\/div>\r\n    <\/div>\r\n    <div class=\"vgnl-faq-item\">\r\n      <div class=\"vgnl-faq-q\" onclick=\"this.parentElement.classList.toggle('open')\">Le s\u00e9jour est-il adapt\u00e9 aux familles avec enfants&nbsp;?<\/div>\r\n      <div class=\"vgnl-faq-a\"><p>Oui, compl\u00e8tement. La majorit\u00e9 de nos logements acceptent les enfants (\u00e9quipement b\u00e9b\u00e9 disponible dans certains). Les randonn\u00e9es propos\u00e9es peuvent \u00eatre ajust\u00e9es en difficult\u00e9 et dur\u00e9e selon l'\u00e2ge. Plusieurs de nos partenaires proposent des activit\u00e9s famille (trottinette de montagne, baignade, parcs nature). Pr\u00e9cisez simplement la composition de votre groupe dans le formulaire \u2014 le programme s'adapte automatiquement.<\/p><\/div>\r\n    <\/div>\r\n    <div class=\"vgnl-faq-item\">\r\n      <div class=\"vgnl-faq-q\" onclick=\"this.parentElement.classList.toggle('open')\">Les prix affich\u00e9s sont-ils garantis&nbsp;?<\/div>\r\n      <div class=\"vgnl-faq-a\"><p>Le <strong>prix du Pass VGN<\/strong> est garanti tant que la composition du groupe et la dur\u00e9e du s\u00e9jour restent identiques. Le <strong>prix du logement<\/strong> est garanti jusqu'\u00e0 minuit du jour de g\u00e9n\u00e9ration de votre programme&nbsp;; au-del\u00e0, il peut \u00e9voluer selon la tarification dynamique et les disponibilit\u00e9s. Les <strong>budgets partenaires<\/strong> sont des estimations bas\u00e9es sur le panier moyen par personne \u2014 le tarif final d\u00e9pend de ce que vous commandez sur place.<\/p><\/div>\r\n    <\/div>\r\n    <div class=\"vgnl-faq-item\">\r\n      <div class=\"vgnl-faq-q\" onclick=\"this.parentElement.classList.toggle('open')\">Puis-je modifier ou annuler ma r\u00e9servation&nbsp;?<\/div>\r\n      <div class=\"vgnl-faq-a\"><p>Oui. L'annulation du logement est gratuite jusqu'\u00e0 48h avant l'arriv\u00e9e (sauf mention contraire). Le Pass VGN est remboursable s'il n'a pas \u00e9t\u00e9 activ\u00e9 chez un partenaire. Pour toute modification de dates ou de groupe, vous pouvez r\u00e9g\u00e9n\u00e9rer un nouveau programme gratuitement sur cette page. En cas de question, notre \u00e9quipe est joignable au 06 06 95 14 08.<\/p><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<!-- Modal \u00e9dition rapide dates + groupe -->\r\n<div class=\"vgnl-edit-modal\" id=\"vgnl-edit-modal\" onclick=\"vgnlCloseEditModal(event)\">\r\n  <div class=\"vgnl-edit-box\" onclick=\"event.stopPropagation()\">\r\n    <button class=\"vgnl-edit-close\" onclick=\"vgnlCloseEditModal()\" aria-label=\"Fermer\">\u00d7<\/button>\r\n    <div class=\"vgnl-edit-tag\">Modifier votre s\u00e9jour<\/div>\r\n    <h3 class=\"vgnl-edit-title\">Quand &amp; avec qui ?<\/h3>\r\n\r\n    <div class=\"vgnl-edit-section\">\r\n      <div class=\"vgnl-edit-label\">Vos dates<\/div>\r\n      <div class=\"vgnl-edit-dates-display\">\r\n        <div>\r\n          <div class=\"vgnl-edit-dates-val\" id=\"vgnl-edit-dates-text\">S\u00e9lectionnez<\/div>\r\n          <div class=\"vgnl-edit-dates-nights\" id=\"vgnl-edit-dates-nights\"><\/div>\r\n        <\/div>\r\n        <button class=\"vgnl-edit-change-btn\" onclick=\"vgnlEditChangeDates()\">Changer<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"vgnl-edit-section\">\r\n      <div class=\"vgnl-edit-label\">Votre groupe<\/div>\r\n      <div class=\"vgnl-edit-group-row\">\r\n        <div>\r\n          <div class=\"vgnl-edit-group-label\">Adultes<\/div>\r\n          <div class=\"vgnl-edit-group-sub\">12 ans et plus<\/div>\r\n        <\/div>\r\n        <div class=\"vgnl-edit-stepper\">\r\n          <button class=\"vgnl-edit-step-btn\" id=\"vgnl-edit-a-minus\" onclick=\"vgnlEditChgNb('a',-1)\">\u2212<\/button>\r\n          <div class=\"vgnl-edit-step-val\" id=\"vgnl-edit-val-a\">2<\/div>\r\n          <button class=\"vgnl-edit-step-btn\" onclick=\"vgnlEditChgNb('a',1)\">+<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-edit-group-row\">\r\n        <div>\r\n          <div class=\"vgnl-edit-group-label\">Enfants<\/div>\r\n          <div class=\"vgnl-edit-group-sub\">4 \u00e0 11 ans<\/div>\r\n        <\/div>\r\n        <div class=\"vgnl-edit-stepper\">\r\n          <button class=\"vgnl-edit-step-btn\" id=\"vgnl-edit-e-minus\" onclick=\"vgnlEditChgNb('e',-1)\">\u2212<\/button>\r\n          <div class=\"vgnl-edit-step-val\" id=\"vgnl-edit-val-e\">0<\/div>\r\n          <button class=\"vgnl-edit-step-btn\" onclick=\"vgnlEditChgNb('e',1)\">+<\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"vgnl-edit-group-row\">\r\n        <div>\r\n          <div class=\"vgnl-edit-group-label\">Tout-petits<\/div>\r\n          <div class=\"vgnl-edit-group-sub\">Moins de 4 ans<\/div>\r\n        <\/div>\r\n        <div class=\"vgnl-edit-stepper\">\r\n          <button class=\"vgnl-edit-step-btn\" id=\"vgnl-edit-b-minus\" onclick=\"vgnlEditChgNb('b',-1)\">\u2212<\/button>\r\n          <div class=\"vgnl-edit-step-val\" id=\"vgnl-edit-val-b\">0<\/div>\r\n          <button class=\"vgnl-edit-step-btn\" onclick=\"vgnlEditChgNb('b',1)\">+<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <button class=\"vgnl-edit-cta\" onclick=\"vgnlApplyEdit()\">\r\n      \u2726 Mettre \u00e0 jour mon s\u00e9jour\r\n      <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>\r\n    <\/button>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Modal conditions avantage Pass -->\r\n<div class=\"vgnl-modal-ov\" id=\"vgnl-modal-ov\" onclick=\"vgnlHideConditions(event)\">\r\n  <div class=\"vgnl-modal\" onclick=\"event.stopPropagation()\">\r\n    <button class=\"vgnl-modal-close\" onclick=\"vgnlHideConditions()\">\u00d7<\/button>\r\n    <div class=\"vgnl-modal-tag\">Conditions de l'avantage Pass<\/div>\r\n    <div class=\"vgnl-modal-title\" id=\"vgnl-modal-title\"><\/div>\r\n    <div class=\"vgnl-modal-avantage\" id=\"vgnl-modal-avantage\"><\/div>\r\n    <div class=\"vgnl-modal-label\">D\u00e9tail &amp; conditions<\/div>\r\n    <div class=\"vgnl-modal-body\" id=\"vgnl-modal-body\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- Schema.org TouristTrip + FAQPage -->\r\n<script type=\"application\/ld+json\">\r\n{\r\n  \"@context\": \"https:\/\/schema.org\",\r\n  \"@graph\": [\r\n    {\r\n      \"@type\": \"WebPage\",\r\n      \"@id\": \"https:\/\/vosges-grandeur-nature.fr\/mon-sejour-de-reve-dans-les-vosges\/\",\r\n      \"url\": \"https:\/\/vosges-grandeur-nature.fr\/mon-sejour-de-reve-dans-les-vosges\/\",\r\n      \"name\": \"Mon s\u00e9jour de r\u00eave dans les Vosges \u2014 Composez votre escapade sur-mesure\",\r\n      \"description\": \"Composez votre s\u00e9jour sur-mesure dans les Hautes-Vosges : logement d'exception, tables du terroir, exp\u00e9riences locales. Pass VGN avec avantages exclusifs chez nos partenaires.\",\r\n      \"inLanguage\": \"fr-FR\"\r\n    },\r\n    {\r\n      \"@type\": \"Service\",\r\n      \"name\": \"Mon s\u00e9jour de r\u00eave dans les Vosges\",\r\n      \"provider\": {\r\n        \"@type\": \"Organization\",\r\n        \"name\": \"Vosges Grandeur Nature\",\r\n        \"url\": \"https:\/\/vosges-grandeur-nature.fr\/\"\r\n      },\r\n      \"areaServed\": {\r\n        \"@type\": \"Place\",\r\n        \"name\": \"Hautes-Vosges, France\"\r\n      },\r\n      \"serviceType\": \"Organisation de s\u00e9jour touristique personnalis\u00e9\",\r\n      \"description\": \"Composition automatis\u00e9e d'un s\u00e9jour sur-mesure dans les Hautes-Vosges avec logement, tables, exp\u00e9riences et Pass partenaires.\"\r\n    },\r\n    {\r\n      \"@type\": \"FAQPage\",\r\n      \"mainEntity\": [\r\n        {\"@type\":\"Question\",\"name\":\"Combien co\u00fbte un s\u00e9jour dans les Vosges avec Vosges Grandeur Nature ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Pour un couple, comptez 400\u2013600\u20ac pour 3 nuits en logement VGN Premium. Pour une famille avec enfants, 800\u20131200\u20ac tout inclus (logement + d\u00eeners + activit\u00e9s).\"}},\r\n        {\"@type\":\"Question\",\"name\":\"Qu'est-ce que le Pass VGN et comment fonctionne-t-il ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Le Pass VGN est une carte digitale donnant acc\u00e8s \u00e0 des avantages exclusifs chez tous nos partenaires locaux. \u00c0 partir de 8\u20ac par adulte pour 2 jours, enfants 4-11 ans \u00e0 -50%, tout-petits gratuits.\"}},\r\n        {\"@type\":\"Question\",\"name\":\"Combien de jours pour visiter les Hautes-Vosges ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Minimum 3 nuits \/ 4 jours pour profiter pleinement. 5 \u00e0 7 nuits pour une exp\u00e9rience plus immersive.\"}},\r\n        {\"@type\":\"Question\",\"name\":\"Le s\u00e9jour est-il adapt\u00e9 aux familles avec enfants ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Oui, compl\u00e8tement. Logements enfant-friendly, randonn\u00e9es adaptables, activit\u00e9s famille chez les partenaires.\"}},\r\n        {\"@type\":\"Question\",\"name\":\"Les prix affich\u00e9s sont-ils garantis ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Le Pass est garanti groupe+dur\u00e9e inchang\u00e9s. Le logement est garanti jusqu'\u00e0 minuit du jour de g\u00e9n\u00e9ration. Les partenaires sont des projections bas\u00e9es sur le panier moyen.\"}},\r\n        {\"@type\":\"Question\",\"name\":\"Puis-je modifier ou annuler ma r\u00e9servation ?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Annulation gratuite jusqu'\u00e0 48h avant. Pass remboursable s'il n'a pas \u00e9t\u00e9 activ\u00e9. R\u00e9g\u00e9n\u00e9ration de programme gratuite.\"}}\r\n      ]\r\n    }\r\n  ]\r\n}\r\n<\/script>\r\n\r\n<\/div>\r\n\r\n<script>\r\n\/* \u2500\u2500 Config API Laravel (pont site\u2192app, spec 2026-06-12 \u00a77) \u2500\u2500 *\/\r\nvar VGNL_API='https:\/\/app.vosges-grandeur-nature.fr\/api\/v1\/app';\r\nvar VGNL_APP_URL='https:\/\/app.vosges-grandeur-nature.fr';\r\nfunction vgnlPoiCat(m){var c=(m.categories&&m.categories.length)?String(m.categories[0]):'';var L={'lac':'Lac','balade':'Balade','randonnee':'Randonn\u00e9e','cascade':'Cascade','panorama':'Panorama','patrimoine':'Patrimoine','nature':'Nature','ski':'Ski','baignade':'Baignade','village':'Village','curiosite':'Curiosit\u00e9'};return L[c]||\"Point d'int\u00e9r\u00eat\";}\r\nvar VGNL_APP_DOWNLOAD_URL=VGNL_APP_URL; \/* remplacer par l\u2019URL stores quand dispo (miroir VGN_APP_DOWNLOAD_URL) *\/\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 STATE GLOBAL \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\/* NB : VGNL.uuid remplace l\u2019ancien VGNL.slug (identifiant s\u00e9jour c\u00f4t\u00e9 API Laravel) *\/\r\nvar VGNL={dateIn:null,dateOut:null,nbJours:0,adultes:2,enfants:0,bebes:0,thematiques:[],budget:null,logement:null,logements:[],slideIdx:0,slideGroups:[],uuid:null,detailsIndex:{},panierItems:[]};\r\nvar VGNL_MOIS=['janvier','f\u00e9vrier','mars','avril','mai','juin','juillet','ao\u00fbt','septembre','octobre','novembre','d\u00e9cembre'];\r\nvar VGNL_CAL={year:0,month:0};\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CALENDRIER \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlCalInit(){\r\n  var now=new Date();\r\n  VGNL_CAL.year=now.getFullYear();\r\n  VGNL_CAL.month=now.getMonth();\r\n  vgnlCalRender();\r\n}\r\nfunction vgnlCalNav(dir){\r\n  VGNL_CAL.month+=dir;\r\n  if(VGNL_CAL.month>11){VGNL_CAL.month=0;VGNL_CAL.year++;}\r\n  if(VGNL_CAL.month<0){VGNL_CAL.month=11;VGNL_CAL.year--;}\r\n  vgnlCalRender();\r\n}\r\nfunction vgnlCalRender(){\r\n  var y=VGNL_CAL.year,m=VGNL_CAL.month;\r\n  var noms=['Janvier','F\u00e9vrier','Mars','Avril','Mai','Juin','Juillet','Ao\u00fbt','Septembre','Octobre','Novembre','D\u00e9cembre'];\r\n  document.getElementById('vgnl-cal-title').textContent=noms[m]+' '+y;\r\n  var firstDay=new Date(y,m,1).getDay();\r\n  firstDay=(firstDay+6)%7;\r\n  var daysInMonth=new Date(y,m+1,0).getDate();\r\n  var today=new Date();today.setHours(0,0,0,0);\r\n  var grid=document.getElementById('vgnl-cal-days');\r\n  var html='';\r\n  for(var i=0;i<firstDay;i++)html+='<div class=\"vgnl-cal-day empty\"><\/div>';\r\n  for(var d=1;d<=daysInMonth;d++){\r\n    var date=new Date(y,m,d);date.setHours(0,0,0,0);\r\n    var ds=vgnlCalFmt(date);\r\n    var cls='vgnl-cal-day';\r\n    var past=date<today;\r\n    if(past)cls+=' disabled';\r\n    else{\r\n      if(VGNL.dateIn&&ds===VGNL.dateIn)cls+=' start';\r\n      if(VGNL.dateOut&&ds===VGNL.dateOut)cls+=' end';\r\n      if(VGNL.dateIn&&VGNL.dateOut){\r\n        var di=new Date(VGNL.dateIn),dou=new Date(VGNL.dateOut);\r\n        if(date>di&&date<dou)cls+=' range';\r\n      }\r\n    }\r\n    html+='<div class=\"'+cls+'\"'+(past?'':' onclick=\"vgnlCalClick(\\''+ds+'\\')\"')+'>'+d+'<\/div>';\r\n  }\r\n  grid.innerHTML=html;\r\n  var hint=document.getElementById('vgnl-cal-hint');\r\n  if(!VGNL.dateIn)hint.textContent='Cliquez sur votre date d\\'arriv\u00e9e';\r\n  else if(!VGNL.dateOut)hint.textContent='Cliquez sur votre date de d\u00e9part';\r\n  else hint.textContent='';\r\n}\r\nfunction vgnlCalFmt(date){\r\n  return date.getFullYear()+'-'+String(date.getMonth()+1).padStart(2,'0')+'-'+String(date.getDate()).padStart(2,'0');\r\n}\r\nfunction vgnlCalClick(ds){\r\n  var date=new Date(ds);date.setHours(0,0,0,0);\r\n  var today=new Date();today.setHours(0,0,0,0);\r\n  if(date<today)return;\r\n  if(!VGNL.dateIn||VGNL.dateOut||(VGNL.dateIn&&date<=new Date(VGNL.dateIn))){\r\n    VGNL.dateIn=ds;VGNL.dateOut=null;\r\n  }else{\r\n    VGNL.dateOut=ds;\r\n    var d1=new Date(VGNL.dateIn),d2=new Date(VGNL.dateOut);\r\n    VGNL.nbJours=Math.round((d2-d1)\/86400000);\r\n    vgnlUpdDateLabels();\r\n    document.getElementById('vgnl-btn-dates').disabled=false;\r\n  }\r\n  vgnlCalRender();\r\n  vgnlUpdDateLabels();\r\n}\r\nfunction vgnlUpdDateLabels(){\r\n  var pillIn=document.getElementById('vgnl-pill-in');\r\n  var pillOut=document.getElementById('vgnl-pill-out');\r\n  var valIn=document.getElementById('vgnl-pill-in-val');\r\n  var valOut=document.getElementById('vgnl-pill-out-val');\r\n  var nights=document.getElementById('vgnl-pill-nights');\r\n  var jours=['dim.','lun.','mar.','mer.','jeu.','ven.','sam.'];\r\n  if(VGNL.dateIn){\r\n    var d=new Date(VGNL.dateIn);\r\n    valIn.textContent=jours[d.getDay()]+' '+d.getDate()+' '+VGNL_MOIS[d.getMonth()];\r\n    valIn.classList.remove('placeholder');\r\n    pillIn.classList.add('selected');\r\n  }else{\r\n    valIn.textContent='S\u00e9lectionnez';\r\n    valIn.classList.add('placeholder');\r\n    pillIn.classList.remove('selected');\r\n  }\r\n  if(VGNL.dateOut){\r\n    var d2=new Date(VGNL.dateOut);\r\n    valOut.textContent=jours[d2.getDay()]+' '+d2.getDate()+' '+VGNL_MOIS[d2.getMonth()];\r\n    valOut.classList.remove('placeholder');\r\n    pillOut.classList.add('selected');\r\n    nights.textContent=VGNL.nbJours+' nuit'+(VGNL.nbJours>1?'s':'');\r\n    nights.style.display='block';\r\n  }else{\r\n    valOut.textContent='S\u00e9lectionnez';\r\n    valOut.classList.add('placeholder');\r\n    pillOut.classList.remove('selected');\r\n    nights.style.display='none';\r\n  }\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 GROUPE \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlChgNb(t,d){\r\n  if(t==='a')VGNL.adultes=Math.max(1,Math.min(20,VGNL.adultes+d));\r\n  else if(t==='e')VGNL.enfants=Math.max(0,Math.min(20,VGNL.enfants+d));\r\n  else if(t==='b')VGNL.bebes=Math.max(0,Math.min(20,VGNL.bebes+d));\r\n  var v={a:VGNL.adultes,e:VGNL.enfants,b:VGNL.bebes};\r\n  document.getElementById('vgnl-val-'+t).textContent=v[t];\r\n  document.getElementById('vgnl-btn-'+t+'-minus').disabled=(v[t]<=(t==='a'?1:0));\r\n  if(t!=='a'){\r\n    var card=document.getElementById('vgnl-card-'+t);\r\n    if(card)card.classList.toggle('has-value',v[t]>0);\r\n  }\r\n  document.getElementById('vgnl-group-total').textContent=VGNL.adultes+VGNL.enfants+VGNL.bebes;\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 PHOTOS DU CARROUSEL RESULTAT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\/* Logement en premiere position, puis les etapes du planning dans l'ordre.\r\n   Deduplication par URL : un meme lieu propose deux fois n'apparait qu'une\r\n   fois dans le carrousel. *\/\r\nfunction vgnlHeroPhotos(log,isExterne,data){\r\n  var photos=[];\r\n  var pousser=function(url){\r\n    if(url&&photos.indexOf(url)<0)photos.push(url);\r\n  };\r\n  var premiere=function(o){\r\n    if(!o)return null;\r\n    if(o.galerie&&o.galerie.length)return o.galerie[0];\r\n    return o.photo||null;\r\n  };\r\n\r\n  if(log&&!isExterne)pousser(premiere(log));\r\n\r\n  ((data&&data.itineraire)||[]).forEach(function(jour){\r\n    (jour.moments||[]).forEach(function(m){\r\n      if(m.type==='libre')return;\r\n      pousser(premiere(m));\r\n    });\r\n  });\r\n\r\n  if(!photos.length){\r\n    photos=['https:\/\/app.vosges-grandeur-nature.fr\/storage\/pois\/galeries\/le-hohneck-1.jpg',\r\n            'https:\/\/app.vosges-grandeur-nature.fr\/storage\/pois\/galeries\/lac-de-blanchemer-6.jpg',\r\n            'https:\/\/app.vosges-grandeur-nature.fr\/storage\/pois\/galeries\/petite-cascade-de-tendon-1.jpg'];\r\n  }\r\n  return photos;\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 ENVIES & BUDGET (chantier 2026-08) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nvar VGNL_THEMES=[\r\n  {key:'rando',emoji:'\\u26f0',label:'Rando & panoramas'},\r\n  {key:'eau',emoji:'\\ud83d\\udca7',label:'Lacs & cascades'},\r\n  {key:'terroir',emoji:'\\ud83c\\udf7d',label:'Table & terroir'},\r\n  {key:'bienetre',emoji:'\\u2668',label:'Bien-\\u00eatre & d\\u00e9tente'},\r\n  {key:'patrimoine',emoji:'\\ud83c\\udfdb',label:'Patrimoine & savoir-faire'},\r\n  {key:'neige',emoji:'\\u2744',label:'Neige & glisse'}\r\n];\r\n\r\n\/* Meme formule que budgetParDefaut() cote app : mediane des logements\r\n   reellement disponibles + 50 EUR\/personne\/jour. Sans logement charge, on\r\n   estime l'hebergement a 150 EUR\/nuit. *\/\r\nfunction vgnlBudgetDefaut(){\r\n  var jours=Math.max(1,VGNL.nbJours||1);\r\n  var payants=Math.max(1,(VGNL.adultes||0)+(VGNL.enfants||0));\r\n  var prix=(VGNL.logements||[]).map(function(lg){return lg.prix_total;})\r\n    .filter(function(v){return typeof v==='number'&&v>0;})\r\n    .sort(function(a,b){return a-b;});\r\n  var base;\r\n  if(prix.length){\r\n    base=prix.length%2?prix[(prix.length-1)\/2]:(prix[prix.length\/2-1]+prix[prix.length\/2])\/2;\r\n  }else{\r\n    base=150*jours;\r\n  }\r\n  return Math.round((base+50*payants*jours)\/50)*50;\r\n}\r\n\r\nfunction vgnlBudgetMax(defaut){return Math.max(1000,Math.round(defaut*3\/100)*100);}\r\n\r\nfunction vgnlToggleTheme(key){\r\n  var i=VGNL.thematiques.indexOf(key);\r\n  if(i<0)VGNL.thematiques.push(key);else VGNL.thematiques.splice(i,1);\r\n  vgnlRenderThemes();\r\n}\r\n\r\nfunction vgnlRenderThemes(){\r\n  var box=document.getElementById('vgnl-themes');\r\n  if(!box)return;\r\n  box.innerHTML=VGNL_THEMES.map(function(t){\r\n    var on=VGNL.thematiques.indexOf(t.key)>=0;\r\n    return '<button type=\"button\" class=\"vgnl-theme'+(on?' is-on':'')+'\"'\r\n      +' aria-pressed=\"'+(on?'true':'false')+'\"'\r\n      +' onclick=\"vgnlToggleTheme(\\''+t.key+'\\')\">'\r\n      +'<span class=\"vgnl-theme-em\">'+t.emoji+'<\/span>'\r\n      +'<span class=\"vgnl-theme-lb\">'+t.label+'<\/span>'\r\n      +'<\/button>';\r\n  }).join('');\r\n}\r\n\r\nfunction vgnlBudgetInput(v){\r\n  VGNL.budget=parseInt(v,10);\r\n  var amt=document.getElementById('vgnl-budget-amt');\r\n  if(amt)amt.textContent=VGNL.budget.toLocaleString('fr-FR')+' \\u20ac';\r\n}\r\n\r\nfunction vgnlRenderEnvies(){\r\n  vgnlRenderThemes();\r\n  var defaut=vgnlBudgetDefaut();\r\n  if(VGNL.budget===null)VGNL.budget=defaut;\r\n  var max=vgnlBudgetMax(defaut);\r\n  var range=document.getElementById('vgnl-budget-range');\r\n  if(range){range.max=max;range.value=VGNL.budget;}\r\n  var amt=document.getElementById('vgnl-budget-amt');\r\n  if(amt)amt.textContent=VGNL.budget.toLocaleString('fr-FR')+' \\u20ac';\r\n  var sub=document.getElementById('vgnl-budget-sub');\r\n  if(sub)sub.textContent='tout compris \\u00b7 '+((VGNL.adultes||0)+(VGNL.enfants||0))+' pers \\u00b7 '+(VGNL.nbJours||0)+' nuit'+((VGNL.nbJours||0)>1?'s':'');\r\n  var mx=document.getElementById('vgnl-budget-max');\r\n  if(mx)mx.textContent=max.toLocaleString('fr-FR')+' \\u20ac';\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 NAVIGATION ENTRE \u00c9TAPES \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlGoStep(step){\r\n  var steps=['dates','group','envies','logements'];\r\n  steps.forEach(function(s){\r\n    var el=document.getElementById('vgnl-step-'+s);\r\n    if(el)el.style.display=(s===step)?'':'none';\r\n  });\r\n  if(step==='logements')vgnlLoadLogements();\r\n  \/* Chantier 2026-08 : on charge les logements des l'ecran envies pour que le\r\n     curseur budget parte d'une mediane de vrais prix Hostaway \u2014 et l'ecran\r\n     suivant s'affiche instantanement. *\/\r\n  if(step==='envies'){vgnlLoadLogements();vgnlRenderEnvies();}\r\n  vgnlScrollTo('vgnl-step-'+step);\r\n}\r\nfunction vgnlScrollTo(id){\r\n  var el=document.getElementById(id);\r\n  if(el)el.scrollIntoView({behavior:'smooth',block:'start'});\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 LOGEMENTS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\/* Absolutise les URLs relatives \/storage\/... renvoy\u00e9es par l'API Laravel (app.vosges-grandeur-nature.fr) *\/\r\nfunction vgnlAbs(u){\r\n  if(!u||typeof u!=='string')return u;\r\n  if(u.charAt(0)==='\/'&&u.charAt(1)!=='\/')return 'https:\/\/app.vosges-grandeur-nature.fr'+u;\r\n  return u;\r\n}\r\nfunction vgnlAbsLog(l){\r\n  if(!l)return l;\r\n  if(l.photo)l.photo=vgnlAbs(l.photo);\r\n  if(Array.isArray(l.galerie))l.galerie=l.galerie.map(vgnlAbs);\r\n  return l;\r\n}\r\nfunction vgnlLoadLogements(){\r\n  VGNL.logement=null;\r\n  VGNL.logements=[];\r\n  VGNL.slideGroups=[];\r\n  VGNL.slideIdx=0;\r\n  document.getElementById('vgnl-btn-gen').disabled=true;\r\n  var track=document.getElementById('vgnl-logs-track');\r\n  track.innerHTML='<div style=\"width:100%;flex-shrink:0;text-align:center;padding:60px;color:var(--v-gray)\">Recherche des logements disponibles\u2026<\/div>';\r\n  document.getElementById('vgnl-logs-nav').style.display='none';\r\n\r\n  fetch(VGNL_API+'\/sejour\/logements?date_in='+VGNL.dateIn+'&date_out='+VGNL.dateOut+'&groupe='+(VGNL.adultes+VGNL.enfants))\r\n    .then(function(r){return r.json();})\r\n    .then(function(data){\r\n      \/* API Laravel : {logements:[\u2026]} \u2014 tous les logements renvoy\u00e9s sont disponibles *\/\r\n      VGNL.logements=(data&&Array.isArray(data.logements))?data.logements:(Array.isArray(data)?data:[]);\r\n      VGNL.logements=VGNL.logements.map(vgnlAbsLog);\r\n      vgnlBuildGroups();\r\n      vgnlRenderLogs();\r\n    })\r\n    .catch(function(){\r\n      track.innerHTML='<div style=\"width:100%;padding:60px;text-align:center;color:#c62828\">Erreur de chargement. R\u00e9essayez.<\/div>';\r\n    });\r\n}\r\n\/* Chantier 2026-08-07 : on ne trie plus par gamme (classique\/premium\/eco) mais\r\n   par BUDGET. Le prix vient de l'API Hostaway via \/sejour\/logements\r\n   (prix_total = somme des nuits + frais de menage). Un logement dont le prix\r\n   est inconnu reste propose : mieux vaut l'afficher que l'ecarter sur une\r\n   donnee manquante. *\/\r\nfunction vgnlRentreDansBudget(l,budget){\r\n  if(!budget)return true;\r\n  if(typeof l.prix_total!=='number'||l.prix_total<=0)return true;\r\n  return l.prix_total<=budget;\r\n}\r\n\r\nfunction vgnlBuildGroups(){\r\n  var logs=VGNL.logements||[];\r\n  var budget=VGNL.budget||null;\r\n\r\n  var dedans=logs.filter(function(l){return vgnlRentreDansBudget(l,budget);});\r\n  var dehors=logs.filter(function(l){return !vgnlRentreDansBudget(l,budget);});\r\n\r\n  \/* Du plus cher au moins cher : le vacancier voit d'abord ce qu'il peut\r\n     s'offrir de mieux dans son enveloppe. *\/\r\n  dedans.sort(function(a,b){return (b.prix_total||0)-(a.prix_total||0);});\r\n  dehors.sort(function(a,b){return (a.prix_total||0)-(b.prix_total||0);});\r\n\r\n  VGNL.logementsHorsBudget=dehors;\r\n  VGNL.budgetForce=VGNL.budgetForce||false;\r\n\r\n  \/* Aucun logement dans l'enveloppe : on ne laisse pas un ecran vide, on\r\n     propose les moins chers avec l'ecart chiffre (cf. vgnlRenderLogs). *\/\r\n  var aAfficher=(dedans.length===0&&VGNL.budgetForce)?dehors:dedans;\r\n\r\n  var groups=[];\r\n  for(var i=0;i<aAfficher.length;i+=3)groups.push(aAfficher.slice(i,i+3));\r\n\r\n  VGNL.slideGroups=groups;\r\n  VGNL.slideIdx=0;\r\n}\r\n\r\n\/* Bouton \u00ab Voir quand meme \u00bb de l'ecran zero-resultat. *\/\r\nfunction vgnlVoirHorsBudget(){\r\n  VGNL.budgetForce=true;\r\n  vgnlBuildGroups();\r\n  vgnlRenderLogs();\r\n}\r\nfunction vgnlRenderLogs(){\r\n  var groups=VGNL.slideGroups;\r\n  var track=document.getElementById('vgnl-logs-track');\r\n  if(!groups||!groups.length){\r\n    var hb=VGNL.logementsHorsBudget||[];\r\n    if(hb.length&&VGNL.budget){\r\n      \/* Des logements existent, mais tous au-dessus de l'enveloppe : on annonce\r\n         le prix reel du moins cher plutot que de laisser croire a une absence\r\n         de disponibilite. *\/\r\n      var moinsCher=hb[0];\r\n      var ecart=Math.max(0,(moinsCher.prix_total||0)-VGNL.budget);\r\n      track.innerHTML='<div style=\"width:100%;padding:48px 24px;text-align:center;color:var(--v-gray)\">'\r\n        +'<p style=\"font-family:\\'Playfair Display\\',Georgia,serif;font-size:22px;color:var(--v-dark);margin-bottom:10px\">Aucun logement sous '+VGNL.budget.toLocaleString('fr-FR')+'&nbsp;&euro; sur ces dates<\/p>'\r\n        +'<p style=\"font-size:14px;margin-bottom:22px\">Le plus abordable est &agrave; <strong>'+(moinsCher.prix_total||0).toLocaleString('fr-FR')+'&nbsp;&euro;<\/strong>, soit '+ecart.toLocaleString('fr-FR')+'&nbsp;&euro; de plus que pr&eacute;vu.<\/p>'\r\n        +'<div style=\"display:flex;gap:12px;justify-content:center;flex-wrap:wrap\">'\r\n          +'<button type=\"button\" class=\"vgnl-next-btn\" onclick=\"vgnlGoStep(\\'envies\\')\">Ajuster mon budget<\/button>'\r\n          +'<button type=\"button\" onclick=\"vgnlVoirHorsBudget()\" style=\"border:1px solid var(--v-border);background:#fff;color:var(--v-dark);padding:14px 26px;border-radius:100px;font-family:inherit;font-size:14px;font-weight:600;cursor:pointer\">Voir quand m&ecirc;me<\/button>'\r\n        +'<\/div><\/div>';\r\n      return;\r\n    }\r\n    track.innerHTML='<div style=\"width:100%;padding:60px;text-align:center;color:var(--v-gray)\">Aucun logement disponible pour ces dates.<br><small style=\"display:block;margin-top:10px;opacity:.6\">Essayez d\\'autres dates ou contactez-nous au 06 06 95 14 08.<\/small><\/div>';\r\n    return;\r\n  }\r\n  var gammeLbls={classique:'Classique',premium:'Premium',economique:'\u00c9conomique'};\r\n  var equipsLbls={wifi:'WiFi',sauna:'Sauna',jacuzzi:'Jacuzzi',piscine:'Piscine',parking:'Parking',animaux:'Animaux accept\u00e9s',cheminee:'Chemin\u00e9e',lave_linge:'Lave-linge',bebe:'\u00c9quip. b\u00e9b\u00e9',jardin:'Jardin',terrasse:'Terrasse',pieds_piste:'Pieds de piste',isole:'Au calme',vue_montagne:'Vue montagne',vue_foret:'Vue for\u00eat',barbecue:'Barbecue',acces_pmr:'Acc\u00e8s PMR',poele_bois:'Po\u00eale \u00e0 bois',ascenseur:'Ascenseur'};\r\n  track.innerHTML=groups.map(function(grp){\r\n    var cards=grp.map(function(l){\r\n      var idx=VGNL.logements.indexOf(l);\r\n      var dispo=l.disponible!==false;\r\n      var photos=l.galerie&&l.galerie.length?l.galerie:(l.photo?[l.photo]:[]);\r\n      var slidesHtml=photos.length\r\n        ?photos.map(function(p,si){return '<div class=\"vgnl-log-slide'+(si===0?' active':'')+'\" style=\"background-image:url('+p+')\"><\/div>';}).join('')\r\n        :'<div class=\"vgnl-log-slide active\"><\/div>';\r\n      var arrows=photos.length>1\r\n        ?'<button type=\"button\" class=\"vgnl-log-arrow prev\" aria-label=\"Photo pr\u00e9c\u00e9dente\" onclick=\"event.stopPropagation();vgnlPhotoNav('+idx+',-1)\">&#8249;<\/button><button type=\"button\" class=\"vgnl-log-arrow next\" aria-label=\"Photo suivante\" onclick=\"event.stopPropagation();vgnlPhotoNav('+idx+',1)\">&#8250;<\/button>'\r\n        :'';\r\n      var photodots=photos.length>1\r\n        ?'<div class=\"vgnl-log-photodots\" id=\"vgnl-lpd-'+idx+'\">'+photos.map(function(_,di){return '<span class=\"vgnl-log-photodot'+(di===0?' active':'')+'\"><\/span>';}).join('')+'<\/div>'\r\n        :'';\r\n      var equips=l.equipements&&l.equipements.length?(Array.isArray(l.equipements)?l.equipements:(''+l.equipements).split(',')):[];\r\n      var equipsHtml='';\r\n      if(equips.length){\r\n        var vis=equips.slice(0,3),hid=equips.slice(3);\r\n        equipsHtml='<div class=\"vgnl-log-equips\">';\r\n        vis.forEach(function(e){var lb=equipsLbls[(''+e).trim()]||(''+e).trim();equipsHtml+='<span class=\"vgnl-log-equip\">'+lb+'<\/span>';});\r\n        if(hid.length){\r\n          var hlabels=hid.map(function(e){return equipsLbls[(''+e).trim()]||(''+e).trim();});\r\n          equipsHtml+='<span class=\"vgnl-log-equipmore\" title=\"'+hlabels.join(', ')+'\">+'+hid.length+'<\/span>';\r\n        }\r\n        equipsHtml+='<\/div>';\r\n      }\r\n      \/* Chantier 2026-08-07 : la gamme ne dit rien au vacancier, le reste-a-vivre\r\n         si. On garde la classe CSS `.classique` pour l'habillage existant. *\/\r\n      var gammeBadge='';\r\n      if(VGNL.budget&&typeof l.prix_total==='number'&&l.prix_total>0){\r\n        var reste=VGNL.budget-l.prix_total;\r\n        gammeBadge=reste>=0\r\n          ?'<span class=\"vgnl-log-gamme classique\">Il vous restera '+reste.toLocaleString('fr-FR')+'&nbsp;&euro;<\/span>'\r\n          :'<span class=\"vgnl-log-gamme premium\">+'+Math.abs(reste).toLocaleString('fr-FR')+'&nbsp;&euro; sur votre budget<\/span>';\r\n      }else if(l.gamme&&gammeLbls[l.gamme]){\r\n        gammeBadge='<span class=\"vgnl-log-gamme '+l.gamme+'\">'+gammeLbls[l.gamme]+'<\/span>';\r\n      }\r\n      var passBadge=l.niveau==='labelise'?'<span class=\"vgnl-pass-badge\">\u2726 Pass VGN offert<\/span>':'';\r\n      \/* API Laravel : prix_par_nuit absent \u2192 sous-texte \u00ab s\u00e9jour \u00b7 m\u00e9nage inclus \u00bb si frais_menage>0 *\/\r\n      var prixSub=l.prix_par_nuit?'s\u00e9jour \u00b7 '+l.prix_par_nuit+'\u20ac\/nuit':(l.frais_menage>0?'s\u00e9jour \u00b7 m\u00e9nage inclus':'s\u00e9jour');\r\n      var prixHtml=l.prix_total\r\n        ?'<div class=\"vgnl-log-prix-row\"><span class=\"vgnl-log-prix\">'+l.prix_total+'\u20ac<\/span><span class=\"vgnl-log-prix-sub\">'+prixSub+'<\/span><\/div>'\r\n        :(dispo?'<div class=\"vgnl-log-prix-row\"><span class=\"vgnl-log-prix-sub\">Tarif sur demande<\/span><\/div>':'<div class=\"vgnl-log-indispo-msg\">Non disponible pour ces dates<\/div>');\r\n      return '<div class=\"vgnl-log'+(dispo?'':' indispo')+'\" '+(dispo?'onclick=\"vgnlSelLog('+idx+')\"':'')+' id=\"vgnl-log-'+idx+'\">'\r\n        +'<div class=\"vgnl-log-img\">'\r\n          +'<div class=\"vgnl-log-carousel\" id=\"vgnl-lc-'+idx+'\">'+slidesHtml+'<\/div>'\r\n          +arrows\r\n          +photodots\r\n          +gammeBadge\r\n          +(l.capacite?'<span class=\"vgnl-log-cap\">'+l.capacite+' pers.<\/span>':'')\r\n          +passBadge\r\n          +'<div class=\"vgnl-log-check\">\u2713<\/div>'\r\n        +'<\/div>'\r\n        +'<div class=\"vgnl-log-body\">'\r\n          +equipsHtml\r\n          +(l.ville?'<div class=\"vgnl-log-ville\">'+l.ville+'<\/div>':'')\r\n          +'<div class=\"vgnl-log-titre\">'+l.titre+'<\/div>'\r\n          +(l.description?'<p class=\"vgnl-log-desc\">'+l.description+'<\/p>':'')\r\n          +prixHtml\r\n        +'<\/div>'\r\n      +'<\/div>';\r\n    }).join('');\r\n    return '<div class=\"vgnl-logs-slide\">'+cards+'<\/div>';\r\n  }).join('');\r\n\r\n  \/* Auto-s\u00e9lection : classique du premier groupe dispo *\/\r\n  var firstGroup=groups[0]||[];\r\n  var autoSel=firstGroup.find(function(l){return l.gamme==='classique'&&l.disponible!==false;})\r\n    ||firstGroup.find(function(l){return l.disponible!==false;});\r\n  if(autoSel){\r\n    var autoIdx=VGNL.logements.indexOf(autoSel);\r\n    if(autoIdx>=0)vgnlSelLog(autoIdx);\r\n  }\r\n\r\n  if(groups.length>1){\r\n    document.getElementById('vgnl-logs-nav').style.display='flex';\r\n    var dots=document.getElementById('vgnl-logs-dots');\r\n    dots.innerHTML=groups.map(function(_,i){return '<div class=\"vgnl-logs-dot'+(i===0?' on':'')+'\" onclick=\"vgnlSlideTo('+i+')\"><\/div>';}).join('');\r\n  }\r\n  vgnlSlideTo(0);\r\n}\r\nfunction vgnlSelLog(idx){\r\n  VGNL.logement=VGNL.logements[idx]||null;\r\n  VGNL.logements.forEach(function(_,i){\r\n    var c=document.getElementById('vgnl-log-'+i);\r\n    if(c)c.classList.toggle('sel',i===idx);\r\n  });\r\n  document.getElementById('vgnl-btn-gen').disabled=false;\r\n  \/\/ Si l'encart \"J'ai d\u00e9j\u00e0 un logement\" est ouvert, le fermer\r\n  var extBox=document.getElementById('vgnl-external-box');\r\n  if(extBox&&extBox.classList.contains('open')){\r\n    extBox.classList.remove('open');\r\n    var trigger=document.getElementById('vgnl-external-trigger');\r\n    if(trigger)trigger.style.display='flex';\r\n    vgnlClearExternal();\r\n  }\r\n}\r\nfunction vgnlSlideNav(dir){\r\n  var n=VGNL.slideGroups.length;\r\n  vgnlSlideTo((VGNL.slideIdx+dir+n)%n);\r\n}\r\nfunction vgnlSlideTo(idx){\r\n  VGNL.slideIdx=idx;\r\n  var track=document.getElementById('vgnl-logs-track');\r\n  if(track)track.style.transform='translateX(-'+(idx*100)+'%)';\r\n  document.querySelectorAll('.vgnl-logs-dot').forEach(function(d,i){d.classList.toggle('on',i===idx);});\r\n}\r\n\/* Carousel photos par carte logement *\/\r\nvar _vgnlPhotoIdx={};\r\nfunction vgnlPhotoNav(logIdx,dir){\r\n  var log=VGNL.logements[logIdx];\r\n  if(!log)return;\r\n  var photos=log.galerie&&log.galerie.length?log.galerie:(log.photo?[log.photo]:[]);\r\n  if(photos.length<2)return;\r\n  _vgnlPhotoIdx[logIdx]=((_vgnlPhotoIdx[logIdx]||0)+dir+photos.length)%photos.length;\r\n  var pidx=_vgnlPhotoIdx[logIdx];\r\n  var car=document.getElementById('vgnl-lc-'+logIdx);\r\n  if(car){car.querySelectorAll('.vgnl-log-slide').forEach(function(s,i){s.classList.toggle('active',i===pidx);});}\r\n  var pd=document.getElementById('vgnl-lpd-'+logIdx);\r\n  if(pd){pd.querySelectorAll('.vgnl-log-photodot').forEach(function(d,i){d.classList.toggle('active',i===pidx);});}\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 G\u00c9N\u00c9RATION \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlGenerer(){\r\n  if(!VGNL.logement){alert('S\u00e9lectionnez un logement.');return;}\r\n  document.getElementById('vgnl-step-dates').style.display='none';\r\n  document.getElementById('vgnl-step-group').style.display='none';\r\n  document.getElementById('vgnl-step-logements').style.display='none';\r\n  document.getElementById('vgnl-gen').classList.add('show');\r\n  document.getElementById('vgnl-gen').scrollIntoView({behavior:'smooth'});\r\n\r\n  var steps=document.querySelectorAll('.vgnl-gs');\r\n  var i=0;\r\n  var iv=setInterval(function(){\r\n    if(i>0&&steps[i-1])steps[i-1].classList.remove('active');\r\n    if(i<steps.length){steps[i].classList.add('active');i++;}else clearInterval(iv);\r\n  },750);\r\n\r\n  fetch(VGNL_API+'\/sejour\/generate',{\r\n    method:'POST',\r\n    headers:{'Content-Type':'application\/json'},\r\n    body:JSON.stringify({\r\n      mode:'wizard',\r\n      date_in:VGNL.dateIn,\r\n      date_out:VGNL.dateOut,\r\n      nb_jours:VGNL.nbJours,\r\n      adultes:VGNL.adultes,\r\n      enfants:VGNL.enfants,\r\n      bebes:VGNL.bebes,\r\n      thematiques:VGNL.thematiques||[],\r\n      budget_total:VGNL.budget,\r\n      rythme:'equilibre',\r\n      logement:VGNL.logement,\r\n      panier_items:VGNL.panierItems||[],\r\n      ids_source:'wordpress'\r\n    })\r\n  })\r\n  .then(function(r){return r.json();})\r\n  .then(function(res){\r\n    \/* API Laravel : r\u00e9ponse envelopp\u00e9e {data:{\u2026}} *\/\r\n    var data=res.data||res;\r\n    clearInterval(iv);\r\n    steps.forEach(function(s){s.classList.add('done');s.classList.remove('active');});\r\n    VGNL.uuid=data.uuid||null;\r\n    setTimeout(function(){\r\n      document.getElementById('vgnl-gen').classList.remove('show');\r\n      vgnlAfficherResultat(data);\r\n    },700);\r\n  })\r\n  .catch(function(){\r\n    clearInterval(iv);\r\n    document.getElementById('vgnl-gen').classList.remove('show');\r\n    alert('Erreur lors de la g\u00e9n\u00e9ration. R\u00e9essayez dans quelques instants.');\r\n    document.getElementById('vgnl-step-logements').style.display='';\r\n  });\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 R\u00c9SULTAT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlAfficherResultat(data){\r\n  \/\/ Stocker le state global pour permettre le swap + re-render\r\n  VGNL.data=data;\r\n\r\n  VGNL.detailsIndex={};\r\n  if(data.economies&&data.economies.details){\r\n    data.economies.details.forEach(function(d,i){\r\n      VGNL.detailsIndex['d_'+i]={titre:d.partenaire,avantage:d.avantage,detail:d.avantage_detail||''};\r\n    });\r\n  }\r\n  if(data.economies&&data.economies.bonus_partenaires){\r\n    data.economies.bonus_partenaires.forEach(function(d,i){\r\n      VGNL.detailsIndex['b_'+i]={titre:d.partenaire,avantage:d.avantage,detail:d.avantage_detail||''};\r\n    });\r\n  }\r\n\r\n  var log=data.logement||null;\r\n  var eco=data.economies||{};\r\n  var pass=data.pass_data||{};\r\n  var groupe=data.groupe||{total:VGNL.adultes+VGNL.enfants};\r\n  var nj=data.nb_jours||VGNL.nbJours;\r\n  var nuits=nj+' nuit'+(nj>1?'s':'');\r\n  var prixFrais=data.prix_logement_frais!==false;\r\n  var prixPassNormal=pass.prix_public||eco.prix_pass||0;\r\n  \/* API Laravel : prix_pass_avec_remise absent \u2192 pass_offert (bool) + economie_pass_logement (valeur \u20ac) *\/\r\n  var passOffert=!!((log&&log.pass_offert)||(eco&&eco.pass_offert));\r\n  var remisePassLogement=passOffert?Math.round((log&&log.economie_pass_logement)||eco.economie_pass_logement||prixPassNormal):0;\r\n  var pa=Math.max(0,prixPassNormal-remisePassLogement);\r\n  var ecoNettes=eco.economies_total+remisePassLogement-pa;\r\n  \/\/ Budget total : on exclut le logement si externe (pas pay\u00e9 via VGN)\r\n  var logementCout=(log&&log.prix_total&&!log.isExternal)?log.prix_total:0;\r\n  var budgetTotal=logementCout+(eco.budget_total||0);\r\n\r\n  document.getElementById('vgnl-result').classList.add('show');\r\n\r\n  \/* Hero r\u00e9sultat \u2014 style fiche logement : slider photos + eyebrow + titre + features *\/\r\n  var isExtHero=log&&log.isExternal===true;\r\n  \/* Chantier 2026-08-06 : le carrousel raconte le sejour, il ne montre plus\r\n     seulement le lit. Ordre : le logement d'abord (c'est le point d'ancrage du\r\n     sejour), puis chaque etape du planning dans l'ordre chronologique. *\/\r\n  var heroPhotos=vgnlHeroPhotos(log,isExtHero,data);\r\n  VGNL.heroPhotos=heroPhotos;\r\n  VGNL.heroIdx=0;\r\n  var track=document.getElementById('vgnl-res-hero-track');\r\n  track.innerHTML=heroPhotos.map(function(p){return '<div class=\"vgnl-res-hero-photo\" style=\"background-image:url('+p+')\"><\/div>';}).join('');\r\n  track.style.transform='translateX(0)';\r\n  \/\/ Dots\r\n  var dotsEl=document.getElementById('vgnl-res-hero-dots');\r\n  if(dotsEl){\r\n    dotsEl.innerHTML=heroPhotos.length>1?heroPhotos.map(function(_,i){return '<button class=\"vgnl-res-hero-dot'+(i===0?' act':'')+'\" onclick=\"vgnlHeroGoTo('+i+')\" aria-label=\"Photo '+(i+1)+'\"><\/button>';}).join(''):'';\r\n    dotsEl.style.display=heroPhotos.length>1?'flex':'none';\r\n  }\r\n  var navEl=document.querySelector('.vgnl-res-hero-nav');\r\n  if(navEl)navEl.style.display=heroPhotos.length>1?'flex':'none';\r\n  \/\/ Eyebrow : niveau + ville\r\n  var niveauLbl=isExtHero?'Votre programme VGN':((log&&log.niveau==='labelise')?'VGN Premium':(log&&log.niveau==='partenaire'?'Partenaire VGN':'Votre escapade'));\r\n  var villeTxt=(log&&log.ville)?log.ville:'Hautes-Vosges';\r\n  document.getElementById('vgnl-res-eyebrow').textContent=niveauLbl+' \u00b7 '+villeTxt;\r\n  \/\/ Titre : nom du logement (ou \"Votre s\u00e9jour \u00e0 [ville]\") + titre du s\u00e9jour en italique or\r\n  var titreHeader=isExtHero?('S\u00e9jour \u00e0 '+(log.ville||'vos Hautes-Vosges')):((log&&log.titre)?log.titre:'Votre s\u00e9jour');\r\n  var sejourTitle=data.titre||'Dans les Hautes-Vosges';\r\n  document.getElementById('vgnl-res-title').innerHTML=titreHeader+'<br><em>'+sejourTitle+'<\/em>';\r\n  \/\/ Features : nb jours, groupe, logement (logement skipp\u00e9 si externe)\r\n  var feats=[];\r\n  if(nj)feats.push({val:nj+' '+(nj>1?'jours':'jour'),lbl:data.dates||''});\r\n  if(groupe.total)feats.push({val:groupe.total+' pers.',lbl:(groupe.adultes||0)+' adulte'+(groupe.adultes>1?'s':'')+(groupe.enfants?' + '+groupe.enfants+' enf.':'')});\r\n  if(log&&log.titre&&!isExtHero)feats.push({val:log.titre.length>24?log.titre.substring(0,22)+'\u2026':log.titre,lbl:'Votre logement'});\r\n  else if(isExtHero)feats.push({val:log.ville,lbl:'Votre pied-\u00e0-terre'});\r\n  document.getElementById('vgnl-res-feats').innerHTML=feats.map(function(f){\r\n    return '<div class=\"vgnl-res-hero-feat\"><div class=\"vgnl-res-hero-feat-val\">'+f.val+'<\/div>'+(f.lbl?'<div class=\"vgnl-res-hero-feat-lbl\">'+f.lbl+'<\/div>':'')+'<\/div>';\r\n  }).join('');\r\n  \/\/ Autoplay slider\r\n  if(VGNL._heroAutoplay)clearInterval(VGNL._heroAutoplay);\r\n  if(heroPhotos.length>1){\r\n    VGNL._heroAutoplay=setInterval(function(){vgnlHeroNav(1);},5500);\r\n  }\r\n\r\n  var shareBtn=document.getElementById('vgnl-share-btn');\r\n  shareBtn.onclick=function(){\r\n    \/* Lien de partage = page s\u00e9jour c\u00f4t\u00e9 app Laravel *\/\r\n    var lienPartage=VGNL.uuid?VGNL_APP_URL+'\/sejour\/'+VGNL.uuid:null;\r\n    if(lienPartage){\r\n      navigator.clipboard.writeText(lienPartage).then(function(){\r\n        shareBtn.innerHTML='\u2713 Lien copi\u00e9';\r\n        setTimeout(function(){shareBtn.innerHTML='<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"18\" cy=\"5\" r=\"3\"\/><circle cx=\"6\" cy=\"12\" r=\"3\"\/><circle cx=\"18\" cy=\"19\" r=\"3\"\/><line x1=\"8.59\" y1=\"13.51\" x2=\"15.42\" y2=\"17.49\"\/><line x1=\"15.41\" y1=\"6.51\" x2=\"8.59\" y2=\"10.49\"\/><\/svg> Partager';},2500);\r\n      });\r\n    }\r\n  };\r\n\r\n  \/* Cartes par moment (Acte 2 \u2014 s\u00e9lection) *\/\r\n  vgnlRenderMomentsParJour(data.itineraire||[]);\r\n\r\n  \/* R\u00e9cap jour par jour d\u00e9taill\u00e9 (planning complet) *\/\r\n  vgnlRenderJours(data.itineraire||[]);\r\n\r\n  \/* Bilan compact (budget + pass gifts + \u00e9quation en une vue) *\/\r\n  vgnlRenderBilan(log,eco,nuits,groupe,prixFrais,prixPassNormal,remisePassLogement,budgetTotal);\r\n\r\n  \/* CTAs \u2014 adapt\u00e9s selon le contexte\r\n     - Logement VGN (VGN Premium) : UN SEUL bouton \"R\u00e9server le logement\" (la remise Pass s'obtient sur la fiche logement)\r\n     - Logement externe (user a son propre logement) : UN SEUL bouton \"Commander mon Pass VGN\"\r\n     - Pas de logement du tout : bouton Pass *\/\r\n  var isExternal=log&&log.isExternal===true;\r\n  var ctaArrow='<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 5l7 7-7 7\"\/><\/svg>';\r\n  var resaIcon='<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><polyline points=\"15 3 21 3 21 9\"\/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"\/><\/svg>';\r\n\r\n  \/\/ Masquer \/ afficher les 4 boutons CTA selon le contexte\r\n  var ctaPassPrimary=['vgnl-cta-pass','vgnl-bilan-cta-pass'];\r\n  var ctaResaSecondary=['vgnl-cta-resa','vgnl-bilan-cta-resa'];\r\n\r\n  if(!log||isExternal){\r\n    \/\/ Cas \"pas de logement VGN\" \u2192 UN SEUL bouton : Commander Pass (devient le primary)\r\n    ctaPassPrimary.forEach(function(id){\r\n      var el=document.getElementById(id);\r\n      if(!el)return;\r\n      el.innerHTML='\u2726 Commander mon Pass VGN \u2014 '+prixPassNormal+'\u20ac'+ctaArrow;\r\n      el.href='\/boutique-pass-vgn\/';\r\n      el.style.display='inline-flex';\r\n    });\r\n    ctaResaSecondary.forEach(function(id){var el=document.getElementById(id);if(el)el.style.display='none';});\r\n  }else{\r\n    \/\/ Cas \"logement VGN s\u00e9lectionn\u00e9\" \u2192 UN SEUL bouton : R\u00e9server logement (le Pass VGN offert s'obtiendra apr\u00e8s)\r\n    var resaLabel='R\u00e9server '+log.titre+(remisePassLogement>0?' \u2014 Pass VGN offert':'');\r\n    ctaResaSecondary.forEach(function(id){\r\n      var el=document.getElementById(id);\r\n      if(!el)return;\r\n      el.innerHTML=resaLabel+' '+resaIcon;\r\n      \/* API Laravel : url absente \u2192 fiche WP construite depuis le slug *\/\r\n      el.href=log.url_resa||log.url||(log.slug?'\/gites-vosges\/'+log.slug+'\/':'#');\r\n      el.style.display='inline-flex';\r\n      \/\/ On transforme le style \"secondary\" en \"primary\" pour qu'il soit le CTA principal\r\n      el.classList.remove('vgnl-cta-secondary');\r\n      el.classList.add('vgnl-cta-primary');\r\n    });\r\n    ctaPassPrimary.forEach(function(id){var el=document.getElementById(id);if(el)el.style.display='none';});\r\n  }\r\n\r\n  \/* CTA final bg (fix : la variable est le tableau heroPhotos, pas heroPhoto) *\/\r\n  if(heroPhotos[0])document.getElementById('vgnl-cta-final-bg').style.backgroundImage='url('+heroPhotos[0]+')';\r\n\r\n  \/* Scroll to top of result *\/\r\n  document.getElementById('vgnl-acte2').scrollIntoView({behavior:'smooth',block:'start'});\r\n  vgnlInitReveal();\r\n\r\n  \/* temps de route : r\u00e9introduits quand l\u2019API Laravel exposera un endpoint routes (dette spec \u00a79) *\/\r\n}\r\n\r\nfunction vgnlRenderJours(itineraire){\r\n  var momHoraires={'matin':'9h','repas-midi':'12h30','apres-midi':'14h30','repas-soir':'19h30','soiree':'21h30'};\r\n  var momLblFull={'matin':'Matin','repas-midi':'Midi','apres-midi':'Apr\u00e8s-midi','repas-soir':'Soir','soiree':'Soir\u00e9e'};\r\n  var romans=['I','II','III','IV','V','VI','VII','VIII','IX','X'];\r\n  var wrap=document.getElementById('vgnl-days');\r\n  wrap.innerHTML=itineraire.map(function(jour,ji){\r\n    \/\/ Collecter UN SLIDE par moment non-libre (m\u00eame si pas de photo \u2192 placeholder)\r\n    \/\/ On garde l'index original dans jour.moments pour pouvoir swap le bon moment\r\n    var slides=[];\r\n    (jour.moments||[]).forEach(function(m,originalIdx){\r\n      if(m.type==='libre')return;\r\n      var photo=(m.galerie&&m.galerie.length)?m.galerie[0]:(m.photo||null);\r\n      var catLabel=m.type==='partenaire'\r\n        ?(m.categorie==='restaurant'?'Restaurant':m.categorie==='producteur'?'Producteur':m.categorie==='artisan'?'Artisan':m.categorie==='activite'?'Activit\u00e9':m.categorie==='bien-etre'?'Bien-\u00eatre':m.categorie==='commerce'?'Commerce':'Partenaire')\r\n        :(m.type==='poi'?vgnlPoiCat(m):(m.type==='evenement'?'\u00c9v\u00e9nement':''));\r\n      slides.push({\r\n        photo:photo,\r\n        hasPhoto:!!photo,\r\n        titre:m.titre,\r\n        ville:m.ville||'',\r\n        moment:m.moment,\r\n        momentLbl:momLblFull[m.moment]||m.moment,\r\n        heure:m.horaire_debut||momHoraires[m.moment]||'',\r\n        categorie:catLabel,\r\n        originalIdx:originalIdx,\r\n        momentData:m\r\n      });\r\n    });\r\n    if(!slides.length){\r\n      slides.push({photo:null,hasPhoto:false,titre:'Journ\u00e9e libre',ville:'',moment:'',momentLbl:'Journ\u00e9e',heure:'',categorie:'',originalIdx:-1,momentData:null});\r\n    }\r\n    \/\/ G\u00e9n\u00e9rer slides HTML (une photo par moment)\r\n    var slidesHtml=slides.map(function(s,si){\r\n      var bg=s.hasPhoto?'background-image:url('+s.photo+')':'';\r\n      var noPhotoCls=s.hasPhoto?'':' no-photo';\r\n      var meta=[];\r\n      if(s.heure)meta.push(s.heure);\r\n      if(s.categorie)meta.push(s.categorie);\r\n      if(s.ville)meta.push(s.ville);\r\n      return '<div class=\"vgnl-day-slide'+(si===0?' active':'')+noPhotoCls+'\" style=\"'+bg+'\"><\/div>'\r\n        +'<div class=\"vgnl-day-caption'+(si===0?' active':'')+'\" data-slide-idx=\"'+si+'\">'\r\n          +'<div class=\"vgnl-day-caption-kicker\">'+s.momentLbl+'<\/div>'\r\n          +'<div class=\"vgnl-day-caption-title\">'+s.titre+'<\/div>'\r\n          +(meta.length?'<div class=\"vgnl-day-caption-meta\">'+meta.join('<span class=\"sep\">\u00b7<\/span>')+'<\/div>':'')\r\n        +'<\/div>';\r\n    }).join('');\r\n    \/\/ Pills cliquables des moments (data-original-idx pour savoir quel moment swap)\r\n    var pillsHtml='<div class=\"vgnl-day-moments-nav\">'+slides.map(function(s,si){\r\n      return '<button class=\"vgnl-day-moment-pill'+(si===0?' active':'')+(s.hasPhoto?'':' empty')+'\" onclick=\"vgnlGoDaySlide('+ji+','+si+')\" data-slide-idx=\"'+si+'\" data-original-idx=\"'+s.originalIdx+'\">'+s.momentLbl+'<\/button>';\r\n    }).join('')+'<\/div>';\r\n    \/\/ Bouton swap retir\u00e9 du carrousel \u2014 il est maintenant sur les cartes Acte 2\r\n    var swapCardBtn='';\r\n    \/\/ Liste textuelle des moments avec segments de route intercal\u00e9s\r\n    \/\/ Badge logement en d\u00e9but + segment route vers 1er moment + moments entrelac\u00e9s avec segments + retour logement\r\n    var logementTitre=(VGNL.data&&VGNL.data.logement&&VGNL.data.logement.titre)?VGNL.data.logement.titre:'Votre logement';\r\n    var lines=[];\r\n    \/\/ Ligne d\u00e9but : logement\r\n    lines.push('<div class=\"vgnl-route-start\"><span class=\"vgnl-route-pin\">\ud83c\udfe1<\/span><span>'+logementTitre+'<\/span><\/div>');\r\n    slides.forEach(function(s,si){\r\n      \/* temps de route : segments retir\u00e9s \u2014 r\u00e9introduits quand l\u2019API Laravel exposera un endpoint routes (dette spec \u00a79) *\/\r\n      \/\/ Moment\r\n      var momentPassText='';\r\n      var om=s.momentData;\r\n      if(om&&om.pass_avantage){\r\n        momentPassText='<div class=\"vgnl-moment-pass\">\u2726 '+om.pass_avantage+(om.economie_pass>0?' (\u2212'+om.economie_pass+'\u20ac)':'')+'<\/div>';\r\n      }\r\n      lines.push('<div class=\"vgnl-moment\" data-day-idx=\"'+ji+'\" data-moment-idx=\"'+s.originalIdx+'\">'\r\n        +'<span class=\"vgnl-moment-time\">'+s.heure+'<\/span>'\r\n        +'<div class=\"vgnl-moment-body\">'\r\n          +'<div class=\"vgnl-moment-name\"><strong>'+s.titre+'<\/strong>'+(s.ville?' \u00b7 '+s.ville:'')+'<\/div>'\r\n          +momentPassText\r\n        +'<\/div>'\r\n      +'<\/div>');\r\n    });\r\n    \/\/ Ligne fin : retour logement\r\n    lines.push('<div class=\"vgnl-route-end\"><span class=\"vgnl-route-pin\">\ud83c\udfe1<\/span><span>Retour au logement<\/span><\/div>');\r\n    var moments=lines.join('');\r\n    var reverse=ji%2===1?' reverse':'';\r\n    return '<div class=\"vgnl-day-row vgnl-reveal'+reverse+'\">'\r\n      +'<div class=\"vgnl-day-carousel\" data-day-idx=\"'+ji+'\" data-slide-count=\"'+slides.length+'\">'\r\n        +slidesHtml\r\n        +swapCardBtn\r\n        +pillsHtml\r\n      +'<\/div>'\r\n      +'<div>'\r\n        +'<div class=\"vgnl-day-num\">'+(romans[ji]||(ji+1))+'<\/div>'\r\n        +'<p class=\"vgnl-day-kicker\">'+(jour.date_label||'Jour '+(ji+1))+' <span class=\"vgnl-jour-total-time\" data-day-idx=\"'+ji+'\" data-day-detail=\"1\"><\/span><\/p>'\r\n        +'<h3 class=\"vgnl-day-title\">'+(jour.titre||'Jour '+(ji+1))+'<\/h3>'\r\n        +'<div class=\"vgnl-day-moments\">'+moments+'<\/div>'\r\n      +'<\/div>'\r\n    +'<\/div>';\r\n  }).join('');\r\n  \/\/ D\u00e9marrer l'autoplay des carrousels\r\n  vgnlStartDayCarousels();\r\n}\r\n\r\n\/* Navigation manuelle vers un slide pr\u00e9cis (clic sur pill) \u2192 pause autoplay 12s *\/\r\nvar _vgnlDayCarouselsTimer=null;\r\nvar _vgnlDayIdx={};\r\nvar _vgnlDayPauseUntil=0;\r\nfunction vgnlGoDaySlide(dayIdx,slideIdx){\r\n  var c=document.querySelector('.vgnl-day-carousel[data-day-idx=\"'+dayIdx+'\"]');\r\n  if(!c)return;\r\n  var count=parseInt(c.dataset.slideCount||1);\r\n  if(slideIdx<0||slideIdx>=count)return;\r\n  _vgnlDayIdx[dayIdx]=slideIdx;\r\n  vgnlApplyDaySlide(c,slideIdx);\r\n  _vgnlDayPauseUntil=Date.now()+12000; \/\/ pause autoplay 12s apr\u00e8s interaction\r\n}\r\nfunction vgnlApplyDaySlide(carousel,idx){\r\n  var slides=carousel.querySelectorAll('.vgnl-day-slide');\r\n  var captions=carousel.querySelectorAll('.vgnl-day-caption');\r\n  var pills=carousel.querySelectorAll('.vgnl-day-moment-pill');\r\n  slides.forEach(function(s,i){s.classList.toggle('active',i===idx);});\r\n  captions.forEach(function(c,i){c.classList.toggle('active',i===idx);});\r\n  pills.forEach(function(p,i){p.classList.toggle('active',i===idx);});\r\n}\r\n\/* Autoplay : cycle sur les moments de la journ\u00e9e toutes les 4.5s *\/\r\nfunction vgnlStartDayCarousels(){\r\n  if(_vgnlDayCarouselsTimer)clearInterval(_vgnlDayCarouselsTimer);\r\n  _vgnlDayIdx={};\r\n  _vgnlDayPauseUntil=0;\r\n  var carousels=document.querySelectorAll('.vgnl-day-carousel');\r\n  if(!carousels.length)return;\r\n  carousels.forEach(function(c){_vgnlDayIdx[c.dataset.dayIdx]=0;});\r\n  _vgnlDayCarouselsTimer=setInterval(function(){\r\n    if(Date.now()<_vgnlDayPauseUntil)return;\r\n    carousels.forEach(function(c){\r\n      var count=parseInt(c.dataset.slideCount||1);\r\n      if(count<=1)return;\r\n      var dayIdx=c.dataset.dayIdx;\r\n      _vgnlDayIdx[dayIdx]=((_vgnlDayIdx[dayIdx]||0)+1)%count;\r\n      vgnlApplyDaySlide(c,_vgnlDayIdx[dayIdx]);\r\n    });\r\n  },4500);\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 \"J'AI D\u00c9J\u00c0 UN LOGEMENT\" \u2014 autocomplete ville via API BAN gouv \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nvar _vgnlExternalTimer=null;\r\nfunction vgnlToggleExternalLodging(){\r\n  var box=document.getElementById('vgnl-external-box');\r\n  var trigger=document.getElementById('vgnl-external-trigger');\r\n  var isOpen=box.classList.contains('open');\r\n  if(isOpen){\r\n    box.classList.remove('open');\r\n    trigger.style.display='flex';\r\n    vgnlClearExternal();\r\n    \/\/ Si un logement VGN est toujours s\u00e9lectionn\u00e9, r\u00e9activer le bouton\r\n    if(VGNL.logement&&!VGNL.logement.isExternal){document.getElementById('vgnl-btn-gen').disabled=false;}\r\n    else{document.getElementById('vgnl-btn-gen').disabled=true;}\r\n  }else{\r\n    box.classList.add('open');\r\n    trigger.style.display='none';\r\n    \/\/ D\u00e9s\u00e9lectionner tous les logements VGN\r\n    document.querySelectorAll('.vgnl-log').forEach(function(c){c.classList.remove('sel');});\r\n    VGNL.logement=null;\r\n    document.getElementById('vgnl-btn-gen').disabled=true;\r\n    setTimeout(function(){document.getElementById('vgnl-external-input').focus();},150);\r\n  }\r\n}\r\nfunction vgnlClearExternal(){\r\n  var inp=document.getElementById('vgnl-external-input');\r\n  if(inp)inp.value='';\r\n  var sel=document.getElementById('vgnl-external-selected');\r\n  if(sel)sel.style.display='none';\r\n  var sugg=document.getElementById('vgnl-external-suggestions');\r\n  if(sugg){sugg.classList.remove('show');sugg.innerHTML='';}\r\n  if(VGNL.logement&&VGNL.logement.isExternal){\r\n    VGNL.logement=null;\r\n    document.getElementById('vgnl-btn-gen').disabled=true;\r\n  }\r\n}\r\nfunction vgnlExternalSearch(q){\r\n  var sugg=document.getElementById('vgnl-external-suggestions');\r\n  if(!q||q.length<2){sugg.classList.remove('show');return;}\r\n  \/\/ API BAN (data.gouv) : recherche municipality, priorit\u00e9 Grand Est (code d\u00e9partement 88, 68, 67, 54, 55, 57)\r\n  var url='https:\/\/api-adresse.data.gouv.fr\/search\/?q='+encodeURIComponent(q)+'&type=municipality&limit=6';\r\n  fetch(url).then(function(r){return r.json();}).then(function(data){\r\n    var feats=(data.features||[]).filter(function(f){\r\n      var cc=f.properties.citycode||'';\r\n      \/\/ Prioriser Grand Est + proches (88 Vosges, 68 Haut-Rhin, 67 Bas-Rhin, 54 Meurthe, 55 Meuse, 57 Moselle, 70 Haute-Sa\u00f4ne, 52 Haute-Marne, 25 Doubs)\r\n      return \/^(88|68|67|54|55|57|70|52|25)\/.test(cc);\r\n    });\r\n    if(!feats.length){\r\n      sugg.innerHTML='<div class=\"vgnl-external-sugg-empty\">Aucune commune trouv\u00e9e (zone Grand Est & alentours)<\/div>';\r\n      sugg.classList.add('show');\r\n      return;\r\n    }\r\n    sugg.innerHTML=feats.map(function(f,i){\r\n      var props=f.properties;\r\n      var coords=f.geometry.coordinates; \/\/ [lng, lat]\r\n      var label=props.city||props.name;\r\n      var dep=props.context||'';\r\n      return '<div class=\"vgnl-external-sugg\" onclick=\"vgnlSelectExternal(\\''+label.replace(\/'\/g,\"\\\\'\")+'\\','+coords[1]+','+coords[0]+',\\''+dep.replace(\/'\/g,\"\\\\'\")+'\\')\">'\r\n        +'<div class=\"vgnl-external-sugg-ville\">'+label+'<\/div>'\r\n        +'<div class=\"vgnl-external-sugg-meta\">'+dep+'<\/div>'\r\n      +'<\/div>';\r\n    }).join('');\r\n    sugg.classList.add('show');\r\n  }).catch(function(){\r\n    sugg.innerHTML='<div class=\"vgnl-external-sugg-empty\">Erreur de connexion<\/div>';\r\n    sugg.classList.add('show');\r\n  });\r\n}\r\nfunction vgnlSelectExternal(nomCommune,lat,lng,dep){\r\n  VGNL.logement={\r\n    titre:'Votre h\u00e9bergement \u00e0 '+nomCommune,\r\n    ville:nomCommune,\r\n    latitude:lat,\r\n    longitude:lng,\r\n    niveau:null,\r\n    prix_total:0,\r\n    prix_par_nuit:0,\r\n    frais_menage:0,\r\n    hostaway_id:null,\r\n    galerie:[],\r\n    photo:null,\r\n    url:null,\r\n    url_resa:null,\r\n    isExternal:true\r\n  };\r\n  document.getElementById('vgnl-external-input').value=nomCommune;\r\n  document.getElementById('vgnl-external-selected-name').textContent=nomCommune+(dep?' \u00b7 '+dep:'');\r\n  document.getElementById('vgnl-external-selected').style.display='flex';\r\n  document.getElementById('vgnl-external-suggestions').classList.remove('show');\r\n  document.getElementById('vgnl-btn-gen').disabled=false;\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 SWAP D'UN MOMENT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\/* Trouve le moment actuellement affich\u00e9 dans le carrousel d'une journ\u00e9e, puis appelle swap *\/\r\nfunction vgnlSwapActiveSlide(jourIdx,btn){\r\n  var c=document.querySelector('.vgnl-day-carousel[data-day-idx=\"'+jourIdx+'\"]');\r\n  if(!c)return;\r\n  var pills=c.querySelectorAll('.vgnl-day-moment-pill');\r\n  var activeIdx=_vgnlDayIdx[jourIdx]||0;\r\n  \/\/ Pause l'autoplay pendant le swap\r\n  _vgnlDayPauseUntil=Date.now()+15000;\r\n  var pill=pills[activeIdx];\r\n  if(!pill){vgnlToast('Moment introuvable','error');return;}\r\n  var originalIdx=parseInt(pill.dataset.originalIdx||-1);\r\n  if(originalIdx<0){vgnlToast('Moment non rempla\u00e7able','warning');return;}\r\n  vgnlSwapMoment(jourIdx,originalIdx,btn);\r\n}\r\n\r\n\/* Appelle l'API Laravel \/sejour\/{uuid}\/swap qui persiste le changement.\r\n   \u26a0\ufe0f S\u00e9mantique : jour est 1-based c\u00f4t\u00e9 API (jourIdx local = index 0-based de data.itineraire),\r\n   slot_index est 0-based (momentIdx local = index 0-based de jour.moments).\r\n   R\u00e9ponse : {data:{slot:{\u2026}}} \u2192 on remplace uniquement le slot local.\r\n   DETTE : l'API ne renvoie plus economies apr\u00e8s swap \u2192 le bilan n'est PAS recalcul\u00e9\r\n   (les \u00e9conomies affich\u00e9es peuvent d\u00e9river l\u00e9g\u00e8rement apr\u00e8s plusieurs swaps \u2014 accept\u00e9, spec 2026-06-12). *\/\r\nfunction vgnlSwapMoment(jourIdx,momentIdx,btn){\r\n  if(!VGNL.uuid||!VGNL.data)return;\r\n  btn.disabled=true;\r\n  btn.classList.add('swapping');\r\n\r\n  fetch(VGNL_API+'\/sejour\/'+VGNL.uuid+'\/swap',{\r\n    method:'POST',\r\n    headers:{'Content-Type':'application\/json'},\r\n    body:JSON.stringify({jour:jourIdx+1,slot_index:momentIdx})\r\n  })\r\n  .then(function(r){return r.json();})\r\n  .then(function(res){\r\n    var d=(res&&res.data)?res.data:res;\r\n    if(!d||!d.slot){\r\n      btn.disabled=false;\r\n      btn.classList.remove('swapping');\r\n      var msg=(res&&res.message)||'Aucune autre option disponible pour ce moment';\r\n      vgnlToast(msg,'warning');\r\n      return;\r\n    }\r\n    \/\/ Mettre \u00e0 jour uniquement le slot swapp\u00e9 dans le state local\r\n    if(VGNL.data.itineraire[jourIdx]&&VGNL.data.itineraire[jourIdx].moments){\r\n      VGNL.data.itineraire[jourIdx].moments[momentIdx]=d.slot;\r\n    }\r\n\r\n    \/\/ Re-render cartes (Acte 2) + jours d\u00e9taill\u00e9s (bilan inchang\u00e9 \u2014 voir DETTE ci-dessus)\r\n    vgnlRenderMomentsParJour(VGNL.data.itineraire);\r\n    vgnlRenderJours(VGNL.data.itineraire);\r\n\r\n    \/\/ FIX : Forcer les \u00e9l\u00e9ments .vgnl-reveal re-rendus \u00e0 \u00eatre visibles\r\n    document.querySelectorAll('#vgnl-moments-par-jour .vgnl-reveal, #vgnl-days .vgnl-reveal, #vgnl-acte3 .vgnl-reveal, #vgnl-gifts .vgnl-reveal').forEach(function(el){\r\n      el.classList.add('in');\r\n    });\r\n\r\n    \/\/ Flash dor\u00e9 sur la nouvelle carte swapp\u00e9e (Acte 2)\r\n    setTimeout(function(){\r\n      var newCard=document.querySelector('.vgnl-mc[data-day-idx=\"'+jourIdx+'\"][data-moment-idx=\"'+momentIdx+'\"]');\r\n      if(newCard)newCard.classList.add('swap-flash');\r\n      var newMomentEl=document.querySelector('.vgnl-moment[data-day-idx=\"'+jourIdx+'\"][data-moment-idx=\"'+momentIdx+'\"]');\r\n      if(newMomentEl)newMomentEl.classList.add('swap-flash');\r\n    },80);\r\n\r\n    \/\/ Positionner le carrousel du r\u00e9cap d\u00e9taill\u00e9 sur le slide swapp\u00e9\r\n    setTimeout(function(){\r\n      var c=document.querySelector('.vgnl-day-carousel[data-day-idx=\"'+jourIdx+'\"]');\r\n      if(!c)return;\r\n      var pills=c.querySelectorAll('.vgnl-day-moment-pill');\r\n      for(var i=0;i<pills.length;i++){\r\n        if(parseInt(pills[i].dataset.originalIdx)===momentIdx){\r\n          _vgnlDayIdx[jourIdx]=i;\r\n          vgnlApplyDaySlide(c,i);\r\n          _vgnlDayPauseUntil=Date.now()+8000;\r\n          break;\r\n        }\r\n      }\r\n    },100);\r\n  })\r\n  .catch(function(){\r\n    btn.disabled=false;\r\n    btn.classList.remove('swapping');\r\n    vgnlToast('Erreur r\u00e9seau \u2014 r\u00e9essayez','error');\r\n  });\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 HERO CARROUSEL (style fiche logement) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlHeroNav(dir){\r\n  if(!VGNL.heroPhotos||VGNL.heroPhotos.length<2)return;\r\n  var n=VGNL.heroPhotos.length;\r\n  VGNL.heroIdx=((VGNL.heroIdx||0)+dir+n)%n;\r\n  vgnlHeroApply();\r\n}\r\nfunction vgnlHeroGoTo(idx){\r\n  if(!VGNL.heroPhotos||idx<0||idx>=VGNL.heroPhotos.length)return;\r\n  VGNL.heroIdx=idx;\r\n  vgnlHeroApply();\r\n}\r\nfunction vgnlHeroApply(){\r\n  var track=document.getElementById('vgnl-res-hero-track');\r\n  if(track)track.style.transform='translateX(-'+(VGNL.heroIdx*100)+'%)';\r\n  document.querySelectorAll('.vgnl-res-hero-dot').forEach(function(d,i){d.classList.toggle('act',i===VGNL.heroIdx);});\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 NAV DOTS : actions custom selon l'acte \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\/* 1: Parlez-nous de votre s\u00e9jour \u2192 retour wizard \u00e9dition (dates\/groupe conserv\u00e9s)\r\n   2: Composez votre s\u00e9jour \u2192 scroll direct vers section cartes (pas vers hero)\r\n   3: Le budget \u2192 scroll vers bilan compact\r\n   4: Je r\u00e9serve \u2192 scroll vers CTA final *\/\r\nfunction vgnlNavClick(acteNum,event){\r\n  if(event&&event.preventDefault)event.preventDefault();\r\n  if(acteNum===1){\r\n    \/\/ Retour en mode \u00e9dition wizard (dates + groupe conserv\u00e9s)\r\n    vgnlRetourEdition();\r\n    return false;\r\n  }\r\n  var target={2:'vgnl-cartes-section',3:'vgnl-acte3',4:'vgnl-acte4'}[acteNum];\r\n  var el=target?document.getElementById(target):null;\r\n  if(el)el.scrollIntoView({behavior:'smooth',block:'start'});\r\n  return false;\r\n}\r\n\r\n\/* Ouvre le modal d'\u00e9dition rapide \u2014 dates + groupe sans perdre le r\u00e9sultat *\/\r\nfunction vgnlRetourEdition(){\r\n  vgnlOpenEditModal();\r\n}\r\n\r\nfunction vgnlOpenEditModal(){\r\n  \/\/ Remplir les valeurs actuelles\r\n  vgnlEditRefreshDates();\r\n  document.getElementById('vgnl-edit-val-a').textContent=VGNL.adultes;\r\n  document.getElementById('vgnl-edit-val-e').textContent=VGNL.enfants;\r\n  document.getElementById('vgnl-edit-val-b').textContent=VGNL.bebes;\r\n  vgnlEditUpdDisabled();\r\n  document.getElementById('vgnl-edit-modal').classList.add('show');\r\n  document.body.style.overflow='hidden';\r\n}\r\nfunction vgnlCloseEditModal(e){\r\n  if(e&&e.target&&!e.target.classList.contains('vgnl-edit-modal')&&e.target.id!=='vgnl-edit-modal')return;\r\n  document.getElementById('vgnl-edit-modal').classList.remove('show');\r\n  document.body.style.overflow='';\r\n}\r\nfunction vgnlEditRefreshDates(){\r\n  var txt=document.getElementById('vgnl-edit-dates-text');\r\n  var nights=document.getElementById('vgnl-edit-dates-nights');\r\n  if(!txt)return;\r\n  if(VGNL.dateIn&&VGNL.dateOut){\r\n    var jours=['dim.','lun.','mar.','mer.','jeu.','ven.','sam.'];\r\n    var d1=new Date(VGNL.dateIn),d2=new Date(VGNL.dateOut);\r\n    var lbl1=jours[d1.getDay()]+' '+d1.getDate()+' '+VGNL_MOIS[d1.getMonth()];\r\n    var lbl2=jours[d2.getDay()]+' '+d2.getDate()+' '+VGNL_MOIS[d2.getMonth()];\r\n    txt.innerHTML=lbl1+'<span class=\"sep\">\u2192<\/span>'+lbl2;\r\n    nights.textContent=VGNL.nbJours+' nuit'+(VGNL.nbJours>1?'s':'');\r\n  }else{\r\n    txt.textContent='Aucune date s\u00e9lectionn\u00e9e';\r\n    nights.textContent='';\r\n  }\r\n}\r\nfunction vgnlEditChgNb(t,d){\r\n  if(t==='a')VGNL.adultes=Math.max(1,Math.min(20,VGNL.adultes+d));\r\n  else if(t==='e')VGNL.enfants=Math.max(0,Math.min(20,VGNL.enfants+d));\r\n  else if(t==='b')VGNL.bebes=Math.max(0,Math.min(20,VGNL.bebes+d));\r\n  document.getElementById('vgnl-edit-val-'+t).textContent=({a:VGNL.adultes,e:VGNL.enfants,b:VGNL.bebes})[t];\r\n  vgnlEditUpdDisabled();\r\n  \/\/ Synchro avec les steppers du wizard\r\n  var sv=document.getElementById('vgnl-val-'+t);if(sv)sv.textContent=({a:VGNL.adultes,e:VGNL.enfants,b:VGNL.bebes})[t];\r\n}\r\nfunction vgnlEditUpdDisabled(){\r\n  document.getElementById('vgnl-edit-a-minus').disabled=VGNL.adultes<=1;\r\n  document.getElementById('vgnl-edit-e-minus').disabled=VGNL.enfants<=0;\r\n  document.getElementById('vgnl-edit-b-minus').disabled=VGNL.bebes<=0;\r\n}\r\n\/* Ouvre le wizard dates pour modifier, sans perdre la session *\/\r\nfunction vgnlEditChangeDates(){\r\n  vgnlCloseEditModal();\r\n  \/\/ Stocker qu'on est en \"mode modif depuis modal\" pour revenir au modal ensuite\r\n  VGNL._fromEditModal=true;\r\n  document.getElementById('vgnl-result').classList.remove('show');\r\n  var gen=document.getElementById('vgnl-gen');if(gen)gen.classList.remove('show');\r\n  if(VGNL._heroAutoplay){clearInterval(VGNL._heroAutoplay);VGNL._heroAutoplay=null;}\r\n  vgnlGoStep('dates');\r\n  if(VGNL.dateIn&&VGNL.dateOut){\r\n    VGNL_CAL.dateIn=VGNL.dateIn;\r\n    VGNL_CAL.dateOut=VGNL.dateOut;\r\n    var d1=new Date(VGNL.dateIn);\r\n    VGNL_CAL.year=d1.getFullYear();VGNL_CAL.month=d1.getMonth();\r\n    vgnlCalRender();\r\n    vgnlUpdDateLabels();\r\n    var btn=document.getElementById('vgnl-btn-dates');if(btn)btn.disabled=false;\r\n  }\r\n  setTimeout(function(){\r\n    var el=document.getElementById('vgnl-step-dates');\r\n    if(el)el.scrollIntoView({behavior:'smooth',block:'start'});\r\n  },100);\r\n}\r\n\/* Applique les modifs et r\u00e9g\u00e9n\u00e8re directement le s\u00e9jour *\/\r\nfunction vgnlApplyEdit(){\r\n  if(!VGNL.dateIn||!VGNL.dateOut){\r\n    vgnlToast('S\u00e9lectionnez d\\'abord des dates','warning');\r\n    return;\r\n  }\r\n  vgnlCloseEditModal();\r\n  vgnlGenerer();\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 ROUTES ENTRE MOMENTS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\n\/* temps de route : r\u00e9introduits quand l\u2019API Laravel exposera un endpoint routes (dette spec \u00a79)\r\n   (vgnlFetchRoutes \/ vgnlRenderRoutes \/ vgnlFormatMin supprim\u00e9s \u2014 l'ancien endpoint WP \/sejour-v2\/routes n'a pas d'\u00e9quivalent Laravel) *\/\r\n\r\n\/* Mini toast de notification (position top-center, dispara\u00eet apr\u00e8s 3s) *\/\r\nfunction vgnlToast(msg,type){\r\n  var ex=document.getElementById('vgnl-toast');\r\n  if(ex)ex.remove();\r\n  var t=document.createElement('div');\r\n  t.id='vgnl-toast';\r\n  t.className='vgnl-toast'+(type?' '+type:'');\r\n  t.textContent=msg;\r\n  document.body.appendChild(t);\r\n  setTimeout(function(){t.classList.add('show');},20);\r\n  setTimeout(function(){t.classList.remove('show');setTimeout(function(){t.remove();},300);},3200);\r\n}\r\n\r\n\/* Render Acte 2 : grilles de cartes par jour (5 moments par jour, avec bouton swap) *\/\r\nfunction vgnlRenderMomentsParJour(itineraire){\r\n  var momLblFull={'matin':'Matin','repas-midi':'Midi','apres-midi':'Apr\u00e8s-midi','repas-soir':'Soir','soiree':'Soir\u00e9e'};\r\n  var momHoraires={'matin':'9h','repas-midi':'12h30','apres-midi':'14h30','repas-soir':'19h30','soiree':'21h30'};\r\n  var romans=['I','II','III','IV','V','VI','VII','VIII','IX','X'];\r\n  var momIcon={'matin':'\ud83c\udf05','repas-midi':'\ud83c\udf7d\ufe0f','apres-midi':'\ud83e\udd7e','repas-soir':'\ud83c\udf77','soiree':'\ud83c\udf19'};\r\n  var wrap=document.getElementById('vgnl-moments-par-jour');\r\n  if(!wrap)return;\r\n  wrap.innerHTML=itineraire.map(function(jour,ji){\r\n    var cardsHtml=(jour.moments||[]).map(function(m,mi){\r\n      var momentLbl=momLblFull[m.moment]||m.moment;\r\n      var heure=m.horaire_debut||momHoraires[m.moment]||'';\r\n      var icon=momIcon[m.moment]||'\u2726';\r\n      if(m.type==='libre'){\r\n        return '<div class=\"vgnl-mc libre\">'\r\n          +'<div class=\"vgnl-mc-img no-photo\" data-icon=\"'+icon+'\">'\r\n            +'<div class=\"vgnl-mc-grad\"><\/div>'\r\n            +'<div class=\"vgnl-mc-badge\"><span class=\"time\">'+(heure||'')+'<\/span>'+momentLbl+'<\/div>'\r\n          +'<\/div>'\r\n          +'<div class=\"vgnl-mc-body\">'\r\n            +'<p class=\"vgnl-mc-cat\">Temps libre<\/p>'\r\n            +'<h4 class=\"vgnl-mc-titre\">\u00c0 votre rythme<\/h4>'\r\n            +'<p class=\"vgnl-mc-meta\">Aucune obligation \u2014 profitez du logement, du paysage, ou partez en exploration spontan\u00e9e.<\/p>'\r\n          +'<\/div>'\r\n        +'<\/div>';\r\n      }\r\n      var photo=(m.galerie&&m.galerie.length)?m.galerie[0]:(m.photo||null);\r\n      var hasPhoto=!!photo;\r\n      var bg=hasPhoto?'background-image:url('+photo+')':'';\r\n      var noPhotoCls=hasPhoto?'':' no-photo';\r\n      var catLabel=m.type==='partenaire'\r\n        ?(m.categorie==='restaurant'?'Restaurant':m.categorie==='producteur'?'Producteur':m.categorie==='artisan'?'Artisan':m.categorie==='activite'?'Activit\u00e9':m.categorie==='bien-etre'?'Bien-\u00eatre':m.categorie==='commerce'?'Commerce':'Partenaire')\r\n        :(m.type==='poi'?vgnlPoiCat(m):(m.type==='evenement'?'\u00c9v\u00e9nement':''));\r\n      var villeMeta=m.ville?m.ville:'';\r\n      var passHtml='';\r\n      if(m.pass_avantage){\r\n        passHtml='<div class=\"vgnl-mc-pass\">\u2726 '+m.pass_avantage+(m.economie_pass>0?' <span class=\"vgnl-mc-pass-eco\">\u2212'+m.economie_pass+'\u20ac<\/span>':'')+'<\/div>';\r\n      }\r\n      var swapBtn='<button class=\"vgnl-mc-swap\" onclick=\"vgnlSwapMoment('+ji+','+mi+', this)\" title=\"Voir une autre option pour ce moment\" aria-label=\"Remplacer ce moment\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"1 4 1 10 7 10\"\/><polyline points=\"23 20 23 14 17 14\"\/><path d=\"M20.49 9A9 9 0 0 0 5.64 5.64L1 10m22 4l-4.64 4.36A9 9 0 0 1 3.51 15\"\/><\/svg><\/button>';\r\n      return '<div class=\"vgnl-mc\" data-day-idx=\"'+ji+'\" data-moment-idx=\"'+mi+'\">'\r\n        +'<div class=\"vgnl-mc-img'+noPhotoCls+'\" style=\"'+bg+'\" data-icon=\"'+icon+'\">'\r\n          +'<div class=\"vgnl-mc-grad\"><\/div>'\r\n          +(m.coup_de_coeur?'<span class=\"vgnl-mc-cc\">Coup de c\u0153ur<\/span>':'')\r\n          +swapBtn\r\n          +'<div class=\"vgnl-mc-badge\"><span class=\"time\">'+(heure||'')+'<\/span>'+momentLbl+'<\/div>'\r\n        +'<\/div>'\r\n        +'<div class=\"vgnl-mc-body\">'\r\n          +(catLabel?'<p class=\"vgnl-mc-cat\">'+catLabel+'<\/p>':'')\r\n          +'<h4 class=\"vgnl-mc-titre\">'+m.titre+'<\/h4>'\r\n          +(villeMeta?'<p class=\"vgnl-mc-meta\">\ud83d\udccd '+villeMeta+'<\/p>':'<p class=\"vgnl-mc-meta\"><\/p>')\r\n          +passHtml\r\n        +'<\/div>'\r\n      +'<\/div>';\r\n    }).join('');\r\n    return '<div class=\"vgnl-jour-block vgnl-reveal\">'\r\n      +'<div class=\"vgnl-jour-block-head\">'\r\n        +'<span class=\"vgnl-jour-block-num\">'+(romans[ji]||(ji+1))+'<\/span>'\r\n        +(jour.date_label?'<span class=\"vgnl-jour-block-date\">'+jour.date_label+'<\/span>':'')\r\n        +'<span class=\"vgnl-jour-block-title\">'+(jour.titre||'Jour '+(ji+1))+'<\/span>'\r\n        +'<span class=\"vgnl-jour-total-time\" data-day-idx=\"'+ji+'\"><\/span>'\r\n      +'<\/div>'\r\n      +'<div class=\"vgnl-moments-grid\">'+cardsHtml+'<\/div>'\r\n    +'<\/div>';\r\n  }).join('');\r\n}\r\n\r\n\/* Render bilan compact : \u00e9quation hero + grille cadeaux + accord\u00e9on budget d\u00e9taill\u00e9\r\n   Toute la valeur per\u00e7ue en une seule vue *\/\r\nfunction vgnlRenderBilan(log,eco,nuits,groupe,prixFrais,prixPassNormal,remisePassLogement,budgetTotal){\r\n  var totalEco=(eco.economies_total||0)+remisePassLogement;\r\n  var ratio=prixPassNormal>0?(totalEco\/prixPassNormal).toFixed(1):0;\r\n  \/* API Laravel : si economies.pass_offert \u2192 on masque le prix pay\u00e9 du Pass + la phrase ratio *\/\r\n  var passOffertEco=!!(eco&&eco.pass_offert);\r\n\r\n  \/* \u00c9QUATION HERO : Budget \u00d7 Pass = Vous recevez *\/\r\n  \/* Chantier 2026-08 : quand le vacancier a saisi une enveloppe, on affiche\r\n     l'ecart plutot que le seul montant estime. *\/\r\n  var bSaisi=(VGNL.data&&VGNL.data.budget&&VGNL.data.budget.saisi)||null;\r\n  var sousBudget='logement + tables + exp\u00e9riences';\r\n  if(bSaisi){\r\n    var ecart=budgetTotal-bSaisi;\r\n    sousBudget=ecart>0\r\n      ? 'sur '+bSaisi.toLocaleString('fr-FR')+'\u20ac pr\u00e9vus \u00b7 +'+Math.round(ecart).toLocaleString('fr-FR')+'\u20ac'\r\n      : 'sur '+bSaisi.toLocaleString('fr-FR')+'\u20ac pr\u00e9vus \u00b7 '+Math.round(-ecart).toLocaleString('fr-FR')+'\u20ac de marge';\r\n  }\r\n  var eqHtml=\r\n     '<div class=\"vgnl-eq-cell\">'\r\n      +'<div class=\"vgnl-eq-lbl\">Budget du s\u00e9jour<\/div>'\r\n      +'<div class=\"vgnl-eq-val\">'+budgetTotal+'\u20ac<\/div>'\r\n      +'<div class=\"vgnl-eq-sub\">'+sousBudget+'<\/div>'\r\n    +'<\/div>'\r\n    +'<div class=\"vgnl-eq-op\">+<\/div>'\r\n    +'<div class=\"vgnl-eq-cell\">'\r\n      +'<div class=\"vgnl-eq-lbl\">Pass VGN<\/div>'\r\n      +'<div class=\"vgnl-eq-val gold\">'+(passOffertEco?'Offert':prixPassNormal+'\u20ac')+'<\/div>'\r\n      +'<div class=\"vgnl-eq-sub\">'+groupe.total+' pers. \u00b7 '+nuits+'<\/div>'\r\n    +'<\/div>'\r\n    +'<div class=\"vgnl-eq-op\">=<\/div>'\r\n    +'<div class=\"vgnl-eq-cell\">'\r\n      +'<div class=\"vgnl-eq-lbl\">Vous recevez<\/div>'\r\n      +'<div class=\"vgnl-eq-val green\">'+totalEco+'\u20ac<\/div>'\r\n      +'<div class=\"vgnl-eq-sub\">d\\'avantages offerts<\/div>'\r\n    +'<\/div>';\r\n  document.getElementById('vgnl-bilan-equation').innerHTML=eqHtml;\r\n\r\n  \/* PHRASE BUDGET R\u00c9EL AVEC PASS (= budget brut + prix Pass \u2212 avantages utilis\u00e9s) *\/\r\n  if(passOffertEco){\r\n    document.getElementById('vgnl-bilan-ratio').innerHTML='';\r\n  }else{\r\n    var budgetReelAvecPass=Math.max(0, budgetTotal + prixPassNormal - totalEco);\r\n    var ecoNettes=Math.max(0, totalEco - prixPassNormal);\r\n    var ratioTxt=ecoNettes>0\r\n      ? 'Avec votre Pass VGN, votre s\u00e9jour vous co\u00fbte en r\u00e9alit\u00e9 <strong>'+budgetReelAvecPass+'\u20ac<\/strong> au lieu de '+budgetTotal+'\u20ac. Soit <strong>'+ecoNettes+'\u20ac d\\'\u00e9conomies nettes<\/strong> gr\u00e2ce aux avantages de nos partenaires.'\r\n      : 'Avec votre Pass VGN \u00e0 '+prixPassNormal+'\u20ac, votre s\u00e9jour vous co\u00fbte <strong>'+budgetReelAvecPass+'\u20ac<\/strong> au total (avantages partenaires d\u00e9duits).';\r\n    document.getElementById('vgnl-bilan-ratio').innerHTML=ratioTxt;\r\n  }\r\n\r\n  \/* GRILLE CADEAUX (compacte) *\/\r\n  var all=[];\r\n  (eco.details||[]).forEach(function(d,i){\r\n    all.push({key:'d_'+i,titre:d.partenaire,avantage:d.avantage,economie:d.economie_pass,icon:vgnlGiftIcon(d.categorie)});\r\n  });\r\n  (eco.bonus_partenaires||[]).slice(0,4).forEach(function(b,i){\r\n    all.push({key:'b_'+i,titre:b.partenaire,avantage:b.avantage,economie:b.economie,icon:vgnlGiftIcon(b.categorie),bonus:true});\r\n  });\r\n  if(remisePassLogement>0||(log&&log.pass_offert)){\r\n    var valeurPassOffert=Math.round((log&&log.economie_pass_logement)||remisePassLogement||0);\r\n    all.push({key:null,titre:'Pass VGN offert',avantage:'Le Pass VGN vous est offert avec ce logement'+(valeurPassOffert>0?' \u2014 valeur '+valeurPassOffert+' \u20ac':'')+'.',economie:valeurPassOffert,icon:'\ud83c\udfe1'});\r\n  }\r\n  if(all.length){\r\n    document.getElementById('vgnl-gifts').innerHTML=all.map(function(g){\r\n      var infoBtn=g.key?' <button class=\"vgnl-info-btn\" onclick=\"vgnlShowConditions(\\''+g.key+'\\')\" title=\"Voir les conditions\"><em>i<\/em><\/button>':'';\r\n      return '<div class=\"vgnl-gift vgnl-reveal\">'\r\n        +'<div class=\"vgnl-gift-icon\">'+g.icon+'<\/div>'\r\n        +'<div class=\"vgnl-gift-body\">'\r\n          +'<div class=\"vgnl-gift-title\">'+g.titre+(g.economie>0?'<span class=\"vgnl-gift-eco\">\u2212'+g.economie+'\u20ac<\/span>':'')+infoBtn+'<\/div>'\r\n          +'<div class=\"vgnl-gift-desc\">'+g.avantage+'<\/div>'\r\n        +'<\/div>'\r\n      +'<\/div>';\r\n    }).join('');\r\n  }else{\r\n    document.getElementById('vgnl-gifts').innerHTML='';\r\n  }\r\n\r\n  \/* COMPARATIF SANS PASS \/ AVEC PASS *\/\r\n  vgnlRenderComparatif(log,eco,nuits,groupe,prixPassNormal,remisePassLogement,budgetTotal);\r\n\r\n  \/* ACCORD\u00c9ON BUDGET D\u00c9TAILL\u00c9 *\/\r\n  var rows='';\r\n  \/\/ Ligne logement seulement si logement VGN (pas externe)\r\n  if(log&&log.prix_total&&!log.isExternal){\r\n    var prixBadge=prixFrais\r\n      ?'<span class=\"vgnl-prix-badge vgnl-prix-garanti\">\u2713 Garanti jusqu\\'\u00e0 minuit<\/span>'\r\n      :'<span class=\"vgnl-prix-badge vgnl-prix-refresh\">\u21bb Prix actualis\u00e9<\/span>';\r\n    rows+='<div class=\"vgnl-budget-row\"><div><div class=\"vgnl-budget-item-name\">'+log.titre+'<\/div><div class=\"vgnl-budget-item-sub\">'+nuits+' \u00b7 '+groupe.total+' pers.'+(log.frais_menage>0?' \u00b7 m\u00e9nage inclus':'')+' '+prixBadge+'<\/div><\/div><div class=\"vgnl-budget-item-price\">'+log.prix_total+' \u20ac<\/div><\/div>';\r\n  }\r\n  if(eco.details&&eco.details.length){\r\n    eco.details.forEach(function(d){\r\n      rows+='<div class=\"vgnl-budget-row\"><div><div class=\"vgnl-budget-item-name\">'+d.partenaire+'<\/div><div class=\"vgnl-budget-item-sub\">Projection \u00b7 '+groupe.total+' pers.<\/div><\/div><div class=\"vgnl-budget-item-price\">'+d.budget_estime+' \u20ac<\/div><\/div>';\r\n    });\r\n  }\r\n  rows+='<div class=\"vgnl-budget-row vgnl-budget-total\"><div class=\"vgnl-budget-item-name\">Total du s\u00e9jour<\/div><div class=\"vgnl-budget-item-price\">'+budgetTotal+' \u20ac<\/div><\/div>';\r\n  document.getElementById('vgnl-budget-box').innerHTML=rows;\r\n}\r\n\r\n\/* G\u00e9n\u00e8re le comparatif SANS Pass \/ AVEC Pass en 2 colonnes c\u00f4te \u00e0 c\u00f4te *\/\r\nfunction vgnlRenderComparatif(log,eco,nuits,groupe,prixPassNormal,remisePassLogement,budgetTotal){\r\n  var grid=document.getElementById('vgnl-compar-grid');\r\n  if(!grid)return;\r\n  \/* Lignes : logement (si VGN, pas si externe) + chaque partenaire du planning *\/\r\n  var lignesSans=[];\r\n  var lignesAvec=[];\r\n  if(log&&log.prix_total&&!log.isExternal){\r\n    lignesSans.push({nom:log.titre,sub:nuits+' \u00b7 '+(groupe.total||1)+' pers.',prix:log.prix_total});\r\n    lignesAvec.push({nom:log.titre,sub:nuits+' \u00b7 '+(groupe.total||1)+' pers.',prix:log.prix_total});\r\n  }\r\n  if(eco.details&&eco.details.length){\r\n    eco.details.forEach(function(d){\r\n      var budget=parseFloat(d.budget_estime)||0;\r\n      var economie=parseFloat(d.economie_pass)||0;\r\n      var cat=(d.categorie||'').toLowerCase();\r\n      var catLbl=cat==='restaurant'?'Table':cat==='producteur'?'Producteur':cat==='artisan'?'Artisan':cat==='activite'?'Activit\u00e9':cat==='bien-etre'?'Bien-\u00eatre':'Partenaire';\r\n      lignesSans.push({nom:d.partenaire,sub:catLbl,prix:budget});\r\n      lignesAvec.push({nom:d.partenaire,sub:catLbl,prix:Math.max(0,budget-economie),oldPrix:budget});\r\n    });\r\n  }\r\n  \/* Totaux *\/\r\n  var totalSans=lignesSans.reduce(function(s,l){return s+(l.prix||0);},0);\r\n  var sommeAvantages=(eco.economies_total||0);\r\n  var totalAvecPartenaires=lignesAvec.reduce(function(s,l){return s+(l.prix||0);},0);\r\n  var prixPassRealPaye=prixPassNormal-(remisePassLogement||0); \/\/ Si logement VGN Premium, Pass VGN offert\r\n  var totalAvec=totalAvecPartenaires+prixPassRealPaye;\r\n  var economiesNettes=totalSans-totalAvec;\r\n\r\n  \/* Rendu colonne SANS Pass *\/\r\n  var sansLinesHtml=lignesSans.map(function(l){\r\n    return '<div class=\"vgnl-compar-line\">'\r\n      +'<div class=\"vgnl-compar-line-name\">'+l.nom+(l.sub?'<span class=\"sub\">'+l.sub+'<\/span>':'')+'<\/div>'\r\n      +'<div class=\"vgnl-compar-line-price\">'+Math.round(l.prix)+' \u20ac<\/div>'\r\n    +'<\/div>';\r\n  }).join('');\r\n  \/* Rendu colonne AVEC Pass *\/\r\n  var avecLinesHtml=lignesAvec.map(function(l){\r\n    var oldHtml=l.oldPrix&&l.oldPrix>l.prix?'<span class=\"vgnl-compar-line-old\">'+Math.round(l.oldPrix)+' \u20ac<\/span>':'';\r\n    return '<div class=\"vgnl-compar-line\">'\r\n      +'<div class=\"vgnl-compar-line-name\">'+l.nom+(l.sub?'<span class=\"sub\">'+l.sub+'<\/span>':'')+'<\/div>'\r\n      +'<div class=\"vgnl-compar-line-price\">'+oldHtml+Math.round(l.prix)+' \u20ac<\/div>'\r\n    +'<\/div>';\r\n  }).join('');\r\n  \/* Ligne \"Pass VGN\" dans la colonne AVEC *\/\r\n  avecLinesHtml+='<div class=\"vgnl-compar-line pass-cost\">'\r\n    +'<div class=\"vgnl-compar-line-name\">\u2726 Pass VGN'+(remisePassLogement>0?'<span class=\"sub\">Pass VGN offert \u00b7 r\u00e9sa en direct<\/span>':'<span class=\"sub\">'+(groupe.total||1)+' pers. \u00b7 '+nuits+'<\/span>')+'<\/div>'\r\n    +'<div class=\"vgnl-compar-line-price\">'+(remisePassLogement>0?'<span class=\"vgnl-compar-line-old\">'+prixPassNormal+' \u20ac<\/span>':'')+prixPassRealPaye+' \u20ac<\/div>'\r\n  +'<\/div>';\r\n\r\n  var savingsHtml=economiesNettes>0\r\n    ?'<div class=\"vgnl-compar-savings\"><strong>\u2212'+Math.round(economiesNettes)+' \u20ac<\/strong> d\\'\u00e9conomies nettes<\/div>'\r\n    :'';\r\n\r\n  grid.innerHTML=\r\n     '<div class=\"vgnl-compar-col\">'\r\n      +'<div class=\"vgnl-compar-col-head\">'\r\n        +'<div class=\"vgnl-compar-col-kicker\">Sans le Pass<\/div>'\r\n        +'<div class=\"vgnl-compar-col-title\">Tarif <em>plein<\/em><\/div>'\r\n      +'<\/div>'\r\n      +'<div class=\"vgnl-compar-lines\">'+sansLinesHtml+'<\/div>'\r\n      +'<div class=\"vgnl-compar-total\">'\r\n        +'<span class=\"vgnl-compar-total-lbl\">Budget vacances estim\u00e9<\/span>'\r\n        +'<span class=\"vgnl-compar-total-val\">'+Math.round(totalSans)+' \u20ac<\/span>'\r\n      +'<\/div>'\r\n    +'<\/div>'\r\n    +'<div class=\"vgnl-compar-vs\">vs<\/div>'\r\n    +'<div class=\"vgnl-compar-col with-pass\">'\r\n      +'<div class=\"vgnl-compar-col-head\">'\r\n        +'<div class=\"vgnl-compar-col-kicker\">Avec le Pass<\/div>'\r\n        +'<div class=\"vgnl-compar-col-title\">Votre <em>tarif VGN<\/em><\/div>'\r\n      +'<\/div>'\r\n      +'<div class=\"vgnl-compar-lines\">'+avecLinesHtml+'<\/div>'\r\n      +'<div class=\"vgnl-compar-total\">'\r\n        +'<span class=\"vgnl-compar-total-lbl\">Budget vacances estim\u00e9<\/span>'\r\n        +'<span class=\"vgnl-compar-total-val\">'+Math.round(totalAvec)+' \u20ac<\/span>'\r\n      +'<\/div>'\r\n      +savingsHtml\r\n    +'<\/div>';\r\n}\r\n\r\nfunction vgnlGiftIcon(cat){\r\n  cat=(cat||'').toLowerCase();\r\n  if(cat==='restaurant')return '\ud83c\udf77';\r\n  if(cat==='producteur'||cat==='artisan')return '\ud83e\uddc0';\r\n  if(cat==='activite')return '\ud83e\udd7e';\r\n  if(cat==='bien-etre')return '\u2668\ufe0f';\r\n  if(cat==='commerce')return '\ud83c\udf81';\r\n  return '\u2726';\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MODAL CONDITIONS \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlShowConditions(key){\r\n  var d=VGNL.detailsIndex[key];\r\n  if(!d)return;\r\n  document.getElementById('vgnl-modal-title').textContent=d.titre||'';\r\n  document.getElementById('vgnl-modal-avantage').textContent=d.avantage||'';\r\n  var body=document.getElementById('vgnl-modal-body');\r\n  if(d.detail&&d.detail.trim()){\r\n    body.innerHTML=d.detail;\r\n    body.classList.remove('vgnl-modal-empty');\r\n  }else{\r\n    body.innerHTML='<div class=\"vgnl-modal-empty\">Conditions d\u00e9taill\u00e9es \u00e0 confirmer directement aupr\u00e8s du partenaire.<\/div>';\r\n  }\r\n  document.getElementById('vgnl-modal-ov').classList.add('show');\r\n  document.body.style.overflow='hidden';\r\n}\r\nfunction vgnlHideConditions(e){\r\n  if(e&&e.target&&e.target.id!=='vgnl-modal-ov'&&e.type==='click')return;\r\n  document.getElementById('vgnl-modal-ov').classList.remove('show');\r\n  document.body.style.overflow='';\r\n}\r\ndocument.addEventListener('keydown',function(e){if(e.key==='Escape')vgnlHideConditions();});\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CLAIM S\u00c9JOUR (sauvegarde c\u00f4t\u00e9 app Laravel \u2014 remplace l'ancien envoi email) \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlClaimSejour(){\r\n  var inp=document.getElementById('vgnl-claim-email');\r\n  if(!inp||!inp.value||inp.value.indexOf('@')===-1){if(inp)inp.focus();return;}\r\n  if(!VGNL.uuid){alert('G\u00e9n\u00e9rez d\u2019abord votre s\u00e9jour avant de le sauvegarder.');return;}\r\n  var btn=document.getElementById('vgnl-claim-btn');\r\n  if(btn){btn.disabled=true;btn.textContent='Sauvegarde\u2026';}\r\n  fetch(VGNL_API+'\/sejour\/'+VGNL.uuid+'\/claim',{\r\n    method:'POST',\r\n    headers:{'Content-Type':'application\/json'},\r\n    body:JSON.stringify({email:inp.value})\r\n  })\r\n  .then(function(r){\r\n    if(!r.ok)throw new Error('claim_failed');\r\n    return r.json();\r\n  })\r\n  .then(function(){\r\n    var form=document.getElementById('vgnl-claim-form');\r\n    var done=document.getElementById('vgnl-claim-done');\r\n    if(form)form.style.display='none';\r\n    if(done)done.style.display='';\r\n  })\r\n  .catch(function(){\r\n    if(btn){btn.disabled=false;btn.textContent='Sauvegarder mon s\u00e9jour';}\r\n    alert('Impossible de sauvegarder pour le moment. R\u00e9essayez dans un instant.');\r\n  });\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 RESTART \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlRestart(){\r\n  document.getElementById('vgnl-result').classList.remove('show');\r\n  VGNL={dateIn:null,dateOut:null,nbJours:0,adultes:2,enfants:0,bebes:0,thematiques:[],budget:null,logement:null,logements:[],slideIdx:0,slideGroups:[],uuid:null,detailsIndex:{},panierItems:VGNL.panierItems||[]};\r\n  vgnlChgNb('a',0);vgnlChgNb('e',0);vgnlChgNb('b',0);\r\n  VGNL.adultes=2;VGNL.enfants=0;VGNL.bebes=0;\r\n  document.getElementById('vgnl-val-a').textContent='2';\r\n  document.getElementById('vgnl-val-e').textContent='0';\r\n  document.getElementById('vgnl-val-b').textContent='0';\r\n  vgnlUpdDateLabels();\r\n  document.getElementById('vgnl-btn-dates').disabled=true;\r\n  vgnlCalInit();\r\n  vgnlGoStep('dates');\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 NAV SCROLL \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlUpdNav(){\r\n  var actes=[\r\n    {id:'vgnl-acte1',i:0},\r\n    {id:'vgnl-acte2',i:1},\r\n    {id:'vgnl-acte3',i:2},\r\n    {id:'vgnl-acte4',i:3}\r\n  ];\r\n  var links=document.querySelectorAll('.vgnl-nav a');\r\n  var mid=window.scrollY+window.innerHeight\/3;\r\n  var active=0;\r\n  actes.forEach(function(a){\r\n    var el=document.getElementById(a.id);\r\n    if(el&&el.offsetTop<=mid)active=a.i;\r\n  });\r\n  links.forEach(function(l,i){l.classList.toggle('active',i===active);});\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 REVEAL \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlInitReveal(){\r\n  var obs=new IntersectionObserver(function(entries){\r\n    entries.forEach(function(e){if(e.isIntersecting){e.target.classList.add('in');obs.unobserve(e.target);}});\r\n  },{threshold:0.1,rootMargin:'0px 0px -60px 0px'});\r\n  document.querySelectorAll('.vgnl-reveal:not(.in)').forEach(function(el){obs.observe(el);});\r\n}\r\n\r\n\/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 INIT \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\r\nfunction vgnlBootInit(){\r\n  try{\r\n    vgnlCalInit();\r\n    vgnlInitReveal();\r\n    \/\/ Listener autocomplete ville pour \"J'ai d\u00e9j\u00e0 un logement\"\r\n    var extInp=document.getElementById('vgnl-external-input');\r\n    if(extInp&&!extInp._vgnlBound){\r\n      extInp._vgnlBound=true;\r\n      extInp.addEventListener('input',function(e){\r\n        if(_vgnlExternalTimer)clearTimeout(_vgnlExternalTimer);\r\n        _vgnlExternalTimer=setTimeout(function(){vgnlExternalSearch(e.target.value);},250);\r\n      });\r\n      extInp.addEventListener('focus',function(e){if(e.target.value.length>=2)vgnlExternalSearch(e.target.value);});\r\n      document.addEventListener('click',function(e){\r\n        if(!e.target.closest('.vgnl-external-input-wrap')){\r\n          var sugg=document.getElementById('vgnl-external-suggestions');\r\n          if(sugg)sugg.classList.remove('show');\r\n        }\r\n      });\r\n    }\r\n    \/\/ Claim s\u00e9jour : brancher le bouton + pointer les liens app vers l'URL de t\u00e9l\u00e9chargement\r\n    var claimBtn=document.getElementById('vgnl-claim-btn');\r\n    if(claimBtn&&!claimBtn._vgnlBound){\r\n      claimBtn._vgnlBound=true;\r\n      claimBtn.addEventListener('click',vgnlClaimSejour);\r\n    }\r\n    document.querySelectorAll('[data-vgnl-app]').forEach(function(a){a.href=VGNL_APP_DOWNLOAD_URL;});\r\n    window._vgnlInitOk=true;\r\n  }catch(e){\r\n    window._vgnlInitError=e.message;\r\n    if(window.console)console.error('VGNL init error:',e);\r\n  }\r\n\r\n  \/* Fallback : force la visibilit\u00e9 des .vgnl-reveal d\u00e9j\u00e0 dans le viewport (si IO rate) *\/\r\n  setTimeout(function(){\r\n    document.querySelectorAll('#vgnl-step-dates .vgnl-reveal, .vgnl-intro .vgnl-reveal').forEach(function(el){el.classList.add('in');});\r\n  },150);\r\n}\r\n\/\/ Appel direct + backup via DOMContentLoaded + timeout de secours (robuste contre tout ordre d'ex\u00e9cution)\r\ntry{vgnlBootInit();}catch(e){window._vgnlInitError='direct: '+e.message;}\r\nif(document.readyState==='loading')document.addEventListener('DOMContentLoaded',vgnlBootInit);\r\nsetTimeout(vgnlBootInit,300);\r\n(function(){\r\n  window.addEventListener('scroll',vgnlUpdNav,{passive:true});\r\n\r\n  \/* Lire panier depuis localStorage *\/\r\n  try{\r\n    var raw=localStorage.getItem('vgn_panier_sejour');\r\n    if(raw){\r\n      var p=JSON.parse(raw);\r\n      var items=[];\r\n      Object.keys(p).forEach(function(type){(p[type]||[]).forEach(function(item){items.push(item);});});\r\n      VGNL.panierItems=items;\r\n    }\r\n  }catch(e){}\r\n\r\n  \/* Deep link ?slug= supprim\u00e9 : les anciens liens WP meurent avec le snippet (validit\u00e9 30 j annonc\u00e9e).\r\n     Le partage passe d\u00e9sormais par VGNL_APP_URL\/sejour\/{uuid} c\u00f4t\u00e9 app Laravel. *\/\r\n})();\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Vosges Grandeur Nature Composez votre s\u00e9jour de r\u00eave dans les Hautes-Vosges For\u00eats de sapins mill\u00e9naires, cascades rugissantes, lacs sauvages, tables [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"page-builder","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"disabled","ast-hfb-above-header-display":"disabled","ast-hfb-below-header-display":"disabled","ast-hfb-mobile-header-display":"disabled","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"disabled","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-4301","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vosges-grandeur-nature.fr\/de\/wp-json\/wp\/v2\/pages\/4301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vosges-grandeur-nature.fr\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vosges-grandeur-nature.fr\/de\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/vosges-grandeur-nature.fr\/de\/wp-json\/wp\/v2\/comments?post=4301"}],"version-history":[{"count":0,"href":"https:\/\/vosges-grandeur-nature.fr\/de\/wp-json\/wp\/v2\/pages\/4301\/revisions"}],"wp:attachment":[{"href":"https:\/\/vosges-grandeur-nature.fr\/de\/wp-json\/wp\/v2\/media?parent=4301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}