{"id":267,"date":"2026-03-25T19:40:10","date_gmt":"2026-03-25T19:40:10","guid":{"rendered":"https:\/\/parking.tecnova.ca\/?page_id=267"},"modified":"2026-07-15T17:40:32","modified_gmt":"2026-07-15T17:40:32","slug":"soumission","status":"publish","type":"page","link":"https:\/\/vipvaletinc.com\/fr\/soumission\/","title":{"rendered":"Soumission"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"267\" class=\"elementor elementor-267\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-23986af e-con-full e-flex elementor-invisible e-con e-parent\" data-id=\"23986af\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInDown&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-242d1a7 e-con-full e-flex e-con e-child\" data-id=\"242d1a7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e092934 elementor-widget elementor-widget-text-editor\" data-id=\"e092934\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Obtenir une soumission<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f4e9a63 elementor-widget elementor-widget-text-editor\" data-id=\"f4e9a63\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Obtenez une soumission personnalis\u00e9e en quelques clics pour votre \u00e9v\u00e9nement.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8f54f60 e-flex e-con-boxed e-con e-parent\" data-id=\"8f54f60\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-23de2e6 elementor-widget elementor-widget-html\" data-id=\"23de2e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"blur-container\">\n  <div class=\"blur-circle circle-1\"><\/div>\n  <div class=\"blur-circle circle-2\"><\/div>\n  <div class=\"blur-circle circle-3\"><\/div>\n<\/div>\n\n<style>\n.blur-container {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  pointer-events: none;\n  z-index: 0;\n  overflow: hidden;\n}\n\n.blur-circle {\n  position: absolute;\n  border-radius: 50%;\n  filter: blur(150px);\n}\n\n\/* Light grey \u2014 top right *\/\n.circle-1 {\n  width: 700px;\n  height: 700px;\n  background: radial-gradient(circle, #E0E0E0 0%, #A0A0A0 100%);\n  top: -15%;\n  right: -10%;\n  opacity: 0.12;\n}\n\n\/* Dark grey \u2014 bottom left *\/\n.circle-2 {\n  width: 600px;\n  height: 600px;\n  background: radial-gradient(circle, #4A4A4A 0%, #1A1A1A 100%);\n  bottom: -5%;\n  left: -10%;\n  opacity: 0.25;\n}\n\n\/* White-ish \u2014 center accent *\/\n.circle-3 {\n  width: 500px;\n  height: 500px;\n  background: radial-gradient(circle, #F5F5F5 0%, #C0C0C0 100%);\n  top: 35%;\n  left: 45%;\n  opacity: 0.08;\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-caaf51c e-con-full e-flex elementor-invisible e-con e-parent\" data-id=\"caaf51c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-9f77912 e-con-full e-flex e-con e-child\" data-id=\"9f77912\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f17d6e3 elementor-widget elementor-widget-html\" data-id=\"f17d6e3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n  @import url('https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@300;400;500;600;700&display=swap');\r\n\r\n  \/* ============================================================\r\n     VVC \u2014 Formulaire de demande\r\n     ============================================================ *\/\r\n\r\n  .vvc-form-wrapper {\r\n    background: #0D0D0D;\r\n    color: #FAFAFA;\r\n    padding: 72px 64px;\r\n    max-width: 920px;\r\n    margin: 0 auto;\r\n    font-family: 'Montserrat', sans-serif;\r\n    \/* Corrige les ic\u00f4nes noires invisibles des champs date\/heure natifs *\/\r\n    color-scheme: dark;\r\n    overflow-x: clip;\r\n    overflow-wrap: break-word;\r\n  }\r\n\r\n  .vvc-form-wrapper input[type=\"date\"]::-webkit-calendar-picker-indicator,\r\n  .vvc-form-wrapper input[type=\"time\"]::-webkit-calendar-picker-indicator {\r\n    opacity: .55;\r\n    cursor: pointer;\r\n  }\r\n  .vvc-form-wrapper input:focus::-webkit-calendar-picker-indicator { opacity: 1; }\r\n\r\n  .vvc-form-wrapper *,\r\n  .vvc-form-wrapper *::before,\r\n  .vvc-form-wrapper *::after { box-sizing: border-box; }\r\n\r\n  \/* Aucun champ ne peut d\u00e9passer son conteneur (iOS force une largeur\r\n     intrins\u00e8que sur date\/time qui ignore flex-shrink) *\/\r\n  .vvc-form-wrapper input,\r\n  .vvc-form-wrapper select,\r\n  .vvc-form-wrapper textarea {\r\n    max-width: 100%;\r\n    min-width: 0;\r\n  }\r\n\r\n  \/* ---------- Sections num\u00e9rot\u00e9es (s\u00e9quence r\u00e9elle : service \u2192 contact \u2192 d\u00e9tails) ---------- *\/\r\n  .vvc-step {\r\n    display: flex;\r\n    align-items: baseline;\r\n    gap: 16px;\r\n    margin: 0 0 32px;\r\n    padding-bottom: 16px;\r\n    border-bottom: 1px solid #262626;\r\n  }\r\n  .vvc-step:not(:first-child) { margin-top: 64px; }\r\n\r\n  .vvc-step-num {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    letter-spacing: 2px;\r\n    color: #5c5c5c;\r\n    font-variant-numeric: tabular-nums;\r\n  }\r\n  .vvc-step-title {\r\n    text-transform: uppercase;\r\n    letter-spacing: 2.5px;\r\n    font-weight: 300;\r\n    font-size: 15px;\r\n    color: #FAFAFA;\r\n    margin: 0;\r\n  }\r\n  .vvc-step-sub {\r\n    margin-left: auto;\r\n    font-size: 11px;\r\n    letter-spacing: 1px;\r\n    color: #5c5c5c;\r\n    text-transform: uppercase;\r\n    font-weight: 400;\r\n  }\r\n\r\n  \/* ---------- Grille de champs ---------- *\/\r\n  .vvc-form-group { margin-bottom: 32px; }\r\n  .vvc-form-row {\r\n    display: grid;\r\n    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n    gap: 28px;\r\n    margin-bottom: 32px;\r\n  }\r\n  .vvc-form-row .vvc-form-group { margin-bottom: 0; }\r\n\r\n  .vvc-form-wrapper label {\r\n    font-size: 10px;\r\n    text-transform: uppercase;\r\n    letter-spacing: 1.8px;\r\n    margin-bottom: 12px;\r\n    color: #999;\r\n    display: block;\r\n    font-weight: 500;\r\n  }\r\n\r\n  .vvc-form-wrapper input[type=\"text\"],\r\n  .vvc-form-wrapper input[type=\"email\"],\r\n  .vvc-form-wrapper input[type=\"tel\"],\r\n  .vvc-form-wrapper input[type=\"number\"],\r\n  .vvc-form-wrapper input[type=\"date\"],\r\n  .vvc-form-wrapper input[type=\"time\"],\r\n  .vvc-form-wrapper select,\r\n  .vvc-form-wrapper textarea {\r\n    background: #0D0D0D;\r\n    color: #FAFAFA;\r\n    border: 1px solid #3a3a3a;\r\n    border-radius: 0;\r\n    padding: 17px 18px;\r\n    font-size: 14px;\r\n    width: 100%;\r\n    outline: none;\r\n    transition: border-color .2s ease, background .2s ease;\r\n    font-family: 'Montserrat', sans-serif;\r\n    font-weight: 400;\r\n  }\r\n\r\n  .vvc-form-wrapper input:hover:not(:disabled),\r\n  .vvc-form-wrapper select:hover:not(:disabled),\r\n  .vvc-form-wrapper textarea:hover:not(:disabled) { border-color: #6b6b6b; }\r\n\r\n  .vvc-form-wrapper input:focus,\r\n  .vvc-form-wrapper select:focus,\r\n  .vvc-form-wrapper textarea:focus {\r\n    border-color: #FAFAFA;\r\n    background: #131313;\r\n  }\r\n  .vvc-form-wrapper input:focus-visible,\r\n  .vvc-form-wrapper select:focus-visible,\r\n  .vvc-form-wrapper textarea:focus-visible,\r\n  .vvc-form-wrapper button:focus-visible {\r\n    outline: 1px solid #FAFAFA;\r\n    outline-offset: 2px;\r\n  }\r\n\r\n  .vvc-form-wrapper input::placeholder,\r\n  .vvc-form-wrapper textarea::placeholder { color: #4d4d4d; font-weight: 300; }\r\n\r\n  .vvc-form-wrapper select {\r\n    appearance: none;\r\n    background-image: url(\"data:image\/svg+xml,%3Csvg width='14' height='9' viewBox='0 0 14 9' fill='none' xmlns='http:\/\/www.w3.org\/2000\/svg'%3E%3Cpath d='M1 1.5L7 7.5L13 1.5' stroke='%23FAFAFA' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'\/%3E%3C\/svg%3E\");\r\n    background-repeat: no-repeat;\r\n    background-position: right 18px center;\r\n    padding-right: 48px;\r\n    cursor: pointer;\r\n  }\r\n  .vvc-form-wrapper select option { background: #1a1a1a; color: #FAFAFA; }\r\n  .vvc-form-wrapper select optgroup {\r\n    background: #0D0D0D;\r\n    color: #7a7a7a;\r\n    font-style: normal;\r\n    font-weight: 600;\r\n    font-size: 11px;\r\n    letter-spacing: 1px;\r\n  }\r\n\r\n  .vvc-form-wrapper textarea { min-height: 130px; resize: vertical; line-height: 1.7; }\r\n\r\n  \/* Safari\/iOS ignore width et height sur date\/time tant que appearance\r\n     n'est pas neutralis\u00e9 : c'est ce qui faisait d\u00e9border et d\u00e9saligner. *\/\r\n  .vvc-form-wrapper input[type=\"date\"],\r\n  .vvc-form-wrapper input[type=\"time\"] {\r\n    -webkit-appearance: none;\r\n    appearance: none;\r\n    display: block;\r\n  }\r\n\r\n  \/* Hauteur identique pour tous les champs sur une ligne : ils s'alignent\r\n     quel que soit le rendu natif du navigateur. *\/\r\n  .vvc-form-wrapper input[type=\"text\"],\r\n  .vvc-form-wrapper input[type=\"email\"],\r\n  .vvc-form-wrapper input[type=\"tel\"],\r\n  .vvc-form-wrapper input[type=\"number\"],\r\n  .vvc-form-wrapper input[type=\"date\"],\r\n  .vvc-form-wrapper input[type=\"time\"],\r\n  .vvc-form-wrapper select {\r\n    min-height: 55px;\r\n    line-height: 1.2;\r\n  }\r\n\r\n  .vvc-form-wrapper input:disabled,\r\n  .vvc-form-wrapper textarea:disabled { color: #444; border-color: #262626; }\r\n\r\n  \/* ---------- Cases \u00e0 cocher personnalis\u00e9es ---------- *\/\r\n  .vvc-form-wrapper .vvc-check {\r\n    appearance: none;\r\n    -webkit-appearance: none;\r\n    width: 20px;\r\n    height: 20px;\r\n    flex: 0 0 20px;\r\n    margin: 0;\r\n    padding: 0;\r\n    border: 1px solid #5c5c5c;\r\n    background: transparent;\r\n    cursor: pointer;\r\n    position: relative;\r\n    transition: background .18s ease, border-color .18s ease;\r\n  }\r\n  .vvc-form-wrapper .vvc-check:hover { border-color: #FAFAFA; }\r\n  .vvc-form-wrapper .vvc-check:checked { background: #FAFAFA; border-color: #FAFAFA; }\r\n  .vvc-form-wrapper .vvc-check:checked::after {\r\n    content: '';\r\n    position: absolute;\r\n    left: 6px; top: 2px;\r\n    width: 5px; height: 10px;\r\n    border: solid #0D0D0D;\r\n    border-width: 0 1.5px 1.5px 0;\r\n    transform: rotate(45deg);\r\n  }\r\n\r\n  \/* ---------- Horaire r\u00e9current ---------- *\/\r\n  .vvc-schedule { border: 1px solid #262626; overflow: hidden; }\r\n\r\n  .vvc-schedule-bar {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    flex-wrap: wrap;\r\n    padding: 14px 18px;\r\n    background: #111;\r\n    border-bottom: 1px solid #262626;\r\n  }\r\n  .vvc-preset {\r\n    background: transparent;\r\n    border: 1px solid #3a3a3a;\r\n    color: #b3b3b3;\r\n    font-family: 'Montserrat', sans-serif;\r\n    font-size: 10px;\r\n    font-weight: 500;\r\n    letter-spacing: 1.2px;\r\n    text-transform: uppercase;\r\n    padding: 9px 14px;\r\n    cursor: pointer;\r\n    transition: all .2s ease;\r\n    white-space: nowrap;\r\n    max-width: 100%;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n  }\r\n  .vvc-preset:hover { border-color: #FAFAFA; color: #FAFAFA; }\r\n  .vvc-count {\r\n    margin-left: auto;\r\n    font-size: 10px;\r\n    letter-spacing: 1.5px;\r\n    text-transform: uppercase;\r\n    color: #5c5c5c;\r\n    font-weight: 500;\r\n    font-variant-numeric: tabular-nums;\r\n  }\r\n  .vvc-count.is-set { color: #FAFAFA; }\r\n\r\n  .vvc-day {\r\n    display: grid;\r\n    grid-template-columns: minmax(0, 170px) minmax(0, 1fr);\r\n    align-items: center;\r\n    gap: 20px;\r\n    padding: 14px 18px;\r\n    border-bottom: 1px solid #1a1a1a;\r\n    border-left: 2px solid transparent;\r\n    transition: background .2s ease, border-left-color .2s ease;\r\n  }\r\n  .vvc-day:last-of-type { border-bottom: none; }\r\n  .vvc-day.is-active {\r\n    background: #141414;\r\n    border-left-color: #FAFAFA;\r\n  }\r\n\r\n  .vvc-day-toggle {\r\n    display: flex !important;\r\n    align-items: center;\r\n    gap: 14px;\r\n    margin: 0 !important;\r\n    cursor: pointer;\r\n    text-transform: none !important;\r\n    letter-spacing: 0 !important;\r\n    font-size: 14px !important;\r\n    font-weight: 400 !important;\r\n    color: #8a8a8a !important;\r\n    transition: color .2s ease;\r\n    user-select: none;\r\n  }\r\n  .vvc-day.is-active .vvc-day-toggle { color: #FAFAFA !important; }\r\n\r\n  .vvc-day-hours {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n    opacity: .3;\r\n    transition: opacity .2s ease;\r\n  }\r\n  .vvc-day.is-active .vvc-day-hours { opacity: 1; }\r\n\r\n  .vvc-day-hours input[type=\"time\"] {\r\n    flex: 0 1 138px;\r\n    width: 138px;\r\n    min-width: 0;\r\n    min-height: 46px;\r\n    padding: 12px 14px;\r\n    font-variant-numeric: tabular-nums;\r\n  }\r\n  .vvc-day-sep { color: #5c5c5c; font-size: 13px; flex: 0 0 auto; }\r\n\r\n  .vvc-schedule-foot {\r\n    padding: 14px 18px;\r\n    background: #111;\r\n    border-top: 1px solid #262626;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 16px;\r\n    flex-wrap: wrap;\r\n  }\r\n  .vvc-apply-all {\r\n    background: transparent;\r\n    border: 1px solid #3a3a3a;\r\n    color: #b3b3b3;\r\n    font-family: 'Montserrat', sans-serif;\r\n    font-size: 10px;\r\n    letter-spacing: 1.2px;\r\n    text-transform: uppercase;\r\n    font-weight: 500;\r\n    padding: 12px 16px;\r\n    cursor: pointer;\r\n    transition: all .2s ease;\r\n    \/* Sans \u00e7a, un bouton refuse de r\u00e9tr\u00e9cir sous la largeur de son texte *\/\r\n    white-space: normal;\r\n    overflow-wrap: anywhere;\r\n    line-height: 1.5;\r\n    max-width: 100%;\r\n    text-align: center;\r\n  }\r\n  .vvc-apply-all:hover:not(:disabled) { border-color: #FAFAFA; color: #FAFAFA; }\r\n  .vvc-apply-all:disabled { opacity: .35; cursor: not-allowed; }\r\n\r\n  \/* ---------- Choix mariage (cartes) ---------- *\/\r\n  .vvc-options { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }\r\n  .vvc-option {\r\n    display: flex !important;\r\n    align-items: flex-start;\r\n    gap: 16px;\r\n    padding: 22px;\r\n    border: 1px solid #3a3a3a;\r\n    cursor: pointer;\r\n    margin: 0 !important;\r\n    text-transform: none !important;\r\n    letter-spacing: 0 !important;\r\n    transition: border-color .2s ease, background .2s ease;\r\n    user-select: none;\r\n  }\r\n  .vvc-option:hover { border-color: #6b6b6b; }\r\n  .vvc-option.is-active { border-color: #FAFAFA; background: #141414; }\r\n  .vvc-option-title {\r\n    display: block;\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n    color: #FAFAFA;\r\n    margin-bottom: 6px;\r\n  }\r\n  .vvc-option-desc {\r\n    display: block;\r\n    font-size: 12px;\r\n    font-weight: 300;\r\n    color: #7a7a7a;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  \/* ---------- \u00c9tats & aides ---------- *\/\r\n  .vvc-req { color: #C8A15A; margin-left: 5px; font-weight: 600; }\r\n\r\n  .vvc-hint {\r\n    color: #5c5c5c;\r\n    font-size: 11px;\r\n    letter-spacing: .4px;\r\n    font-weight: 300;\r\n    line-height: 1.6;\r\n    margin-top: 10px;\r\n    text-transform: none;\r\n  }\r\n\r\n  .vvc-form-wrapper input.vvc-error,\r\n  .vvc-form-wrapper select.vvc-error,\r\n  .vvc-form-wrapper textarea.vvc-error { border-color: #C86A6A; }\r\n\r\n  .vvc-day.has-error { border-left-color: #C86A6A; }\r\n\r\n  .vvc-field-error {\r\n    color: #C86A6A;\r\n    font-size: 11px;\r\n    letter-spacing: .4px;\r\n    margin-top: 10px;\r\n    line-height: 1.5;\r\n    width: 100%;\r\n    font-weight: 400;\r\n  }\r\n  .vvc-day .vvc-field-error { grid-column: 1 \/ -1; margin-top: 4px; }\r\n\r\n  .vvc-legend {\r\n    font-size: 11px;\r\n    color: #5c5c5c;\r\n    font-weight: 300;\r\n    letter-spacing: .4px;\r\n    margin-top: 40px;\r\n  }\r\n\r\n  \/* ---------- Actions ---------- *\/\r\n  .vvc-actions {\r\n    margin-top: 48px;\r\n    padding-top: 40px;\r\n    border-top: 1px solid #262626;\r\n  }\r\n  .vvc-submit-btn {\r\n    background: transparent;\r\n    color: #FAFAFA;\r\n    border: 1px solid #FAFAFA;\r\n    border-radius: 0;\r\n    padding: 20px 56px;\r\n    font-size: 12px;\r\n    text-transform: uppercase;\r\n    letter-spacing: 2px;\r\n    cursor: pointer;\r\n    transition: background .25s ease, color .25s ease;\r\n    font-family: 'Montserrat', sans-serif;\r\n    font-weight: 500;\r\n    white-space: normal;\r\n    max-width: 100%;\r\n    line-height: 1.4;\r\n  }\r\n  .vvc-submit-btn:hover:not(:disabled) { background: #FAFAFA; color: #0D0D0D; }\r\n  .vvc-submit-btn:disabled { opacity: .35; cursor: not-allowed; border-color: #444; color: #444; }\r\n\r\n  .vvc-message {\r\n    margin-top: 28px;\r\n    padding: 20px 24px;\r\n    font-size: 13px;\r\n    display: none;\r\n    line-height: 1.6;\r\n    font-weight: 400;\r\n    letter-spacing: .3px;\r\n    border-left: 2px solid;\r\n  }\r\n  .vvc-message.success {\r\n    background: #101a10; color: #7ecf7e; border-color: #4f9e4f;\r\n    border-top: 1px solid #1f3a1f; border-right: 1px solid #1f3a1f; border-bottom: 1px solid #1f3a1f;\r\n    display: block;\r\n  }\r\n  .vvc-message.error {\r\n    background: #1a1010; color: #d99a9a; border-color: #C86A6A;\r\n    border-top: 1px solid #3a1f1f; border-right: 1px solid #3a1f1f; border-bottom: 1px solid #3a1f1f;\r\n    display: block;\r\n  }\r\n\r\n  .vvc-hidden { display: none !important; }\r\n\r\n  \/* ---------- Apparition progressive ---------- *\/\r\n  .vvc-reveal { animation: vvcIn .35s ease both; }\r\n  @keyframes vvcIn {\r\n    from { opacity: 0; transform: translateY(8px); }\r\n    to   { opacity: 1; transform: none; }\r\n  }\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .vvc-form-wrapper *, .vvc-reveal { animation: none !important; transition: none !important; }\r\n  }\r\n\r\n  \/* ---------- Tablette ---------- *\/\r\n  @media (max-width: 900px) {\r\n    .vvc-form-wrapper { padding: 56px 36px; }\r\n    .vvc-day { grid-template-columns: minmax(0, 130px) minmax(0, 1fr); gap: 14px; }\r\n  }\r\n\r\n  \/* ---------- Mobile ---------- *\/\r\n  @media (max-width: 720px) {\r\n    .vvc-form-wrapper { padding: 44px 20px; }\r\n\r\n    .vvc-step { flex-wrap: wrap; gap: 10px; margin-bottom: 26px; }\r\n    .vvc-step:not(:first-child) { margin-top: 48px; }\r\n    .vvc-step-sub { margin-left: 0; width: 100%; }\r\n\r\n    .vvc-form-row { grid-template-columns: 1fr; gap: 24px; margin-bottom: 26px; }\r\n    .vvc-form-group { margin-bottom: 26px; }\r\n\r\n    \/* Safari iOS zoome automatiquement sur tout champ sous 16px *\/\r\n    .vvc-form-wrapper input,\r\n    .vvc-form-wrapper select,\r\n    .vvc-form-wrapper textarea { font-size: 16px; }\r\n    .vvc-options { grid-template-columns: 1fr; gap: 14px; }\r\n    .vvc-option { padding: 18px; }\r\n\r\n    \/* Barre de raccourcis : 2 colonnes, pas de d\u00e9bordement *\/\r\n    .vvc-schedule-bar { padding: 12px; gap: 8px; }\r\n    .vvc-preset {\r\n      flex: 1 1 calc(50% - 4px);\r\n      min-width: 0;\r\n      padding: 12px 6px;\r\n      font-size: 9px;\r\n      letter-spacing: 1px;\r\n      text-align: center;\r\n    }\r\n    .vvc-count {\r\n      margin-left: 0;\r\n      flex: 1 1 100%;\r\n      text-align: center;\r\n      padding-top: 8px;\r\n      border-top: 1px solid #1f1f1f;\r\n    }\r\n\r\n    \/* Jour : nom au-dessus, heures en dessous sur toute la largeur *\/\r\n    .vvc-day {\r\n      grid-template-columns: 1fr;\r\n      gap: 12px;\r\n      padding: 16px 12px;\r\n    }\r\n    .vvc-day-hours {\r\n      padding-left: 34px;\r\n      gap: 8px;\r\n    }\r\n    .vvc-day-hours input[type=\"time\"] {\r\n      flex: 1 1 0;\r\n      width: 100%;\r\n      padding: 13px 6px;\r\n      text-align: center;\r\n    }\r\n    .vvc-day .vvc-field-error { padding-left: 34px; }\r\n\r\n    .vvc-schedule-foot { padding: 12px; flex-direction: column; align-items: stretch; gap: 10px; }\r\n    .vvc-apply-all { width: 100%; padding: 14px 10px; }\r\n    .vvc-schedule-foot .vvc-hint { text-align: center; }\r\n\r\n    .vvc-actions { margin-top: 40px; padding-top: 32px; }\r\n    .vvc-submit-btn { width: 100%; padding: 20px; }\r\n  }\r\n\r\n  \/* ---------- Petits t\u00e9l\u00e9phones ---------- *\/\r\n  @media (max-width: 380px) {\r\n    .vvc-form-wrapper { padding: 36px 14px; }\r\n    .vvc-step-title { font-size: 13px; letter-spacing: 2px; }\r\n    .vvc-day { padding: 14px 10px; }\r\n    .vvc-day-hours,\r\n    .vvc-day .vvc-field-error { padding-left: 0; }\r\n    .vvc-day-hours input[type=\"time\"] { padding: 13px 2px; font-size: 13px; }\r\n    .vvc-preset { flex: 1 1 100%; }\r\n    .vvc-form-wrapper input,\r\n    .vvc-form-wrapper select,\r\n    .vvc-form-wrapper textarea { padding: 15px 14px; }\r\n  }\r\n<\/style>\r\n\r\n<div class=\"vvc-form-wrapper\">\r\n  <form id=\"vvcDemandForm\" novalidate>\r\n\r\n    <!-- \u00c9TAPE 01 -->\r\n    <div class=\"vvc-step\">\r\n      <span class=\"vvc-step-num\">01<\/span>\r\n      <h3 class=\"vvc-step-title\">Service<\/h3>\r\n    <\/div>\r\n\r\n    <div class=\"vvc-form-group\">\r\n      <label for=\"type\" data-base=\"Quel service vous int\u00e9resse ?\">Quel service vous int\u00e9resse ?<\/label>\r\n      <select id=\"type\" name=\"type\">\r\n        <option value=\"\" disabled selected>\u2014 S\u00e9lectionner un service \u2014<\/option>\r\n        <optgroup label=\"\u00c9v\u00e9nements ponctuels\">\r\n          <option value=\"corporate_event\">\u00c9v\u00e9nement corporatif<\/option>\r\n          <option value=\"private_event\">\u00c9v\u00e9nement priv\u00e9<\/option>\r\n          <option value=\"fundraising\">Lev\u00e9e de fonds<\/option>\r\n          <option value=\"wedding\">Mariage<\/option>\r\n        <\/optgroup>\r\n        <optgroup label=\"Services r\u00e9currents\">\r\n          <option value=\"restaurants_hospitality\">Restaurants &amp; h\u00f4tellerie<\/option>\r\n          <option value=\"permanent_valet_service\">Service de voiturier permanent<\/option>\r\n          <option value=\"construction_project_management\">Construction &amp; gestion de projets<\/option>\r\n        <\/optgroup>\r\n        <optgroup label=\"Autres\">\r\n          <option value=\"parking_management\">Gestion de stationnement<\/option>\r\n          <option value=\"consultation\">Consultation<\/option>\r\n        <\/optgroup>\r\n      <\/select>\r\n      <div class=\"vvc-hint\" id=\"typeHint\">Le formulaire s'adapte au service choisi.<\/div>\r\n    <\/div>\r\n\r\n    <!-- \u00c9TAPE 02 -->\r\n    <div class=\"vvc-step\">\r\n      <span class=\"vvc-step-num\">02<\/span>\r\n      <h3 class=\"vvc-step-title\">Vos coordonn\u00e9es<\/h3>\r\n    <\/div>\r\n\r\n    <div class=\"vvc-form-row\">\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"nomComplet\" data-base=\"Nom complet\">Nom complet<\/label>\r\n        <input type=\"text\" id=\"nomComplet\" name=\"nomComplet\" placeholder=\"Jean Tremblay\" autocomplete=\"name\">\r\n      <\/div>\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"email\" data-base=\"Courriel\">Courriel<\/label>\r\n        <input type=\"email\" id=\"email\" name=\"email\" placeholder=\"jean@email.com\" autocomplete=\"email\">\r\n      <\/div>\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"telephone\" data-base=\"T\u00e9l\u00e9phone\">T\u00e9l\u00e9phone<\/label>\r\n        <input type=\"tel\" id=\"telephone\" name=\"telephone\" placeholder=\"514 111-2222\" autocomplete=\"tel\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u00c9TAPE 03 -->\r\n    <div class=\"vvc-step vvc-hidden\" id=\"stepDetails\">\r\n      <span class=\"vvc-step-num\">03<\/span>\r\n      <h3 class=\"vvc-step-title\" id=\"detailsTitle\">D\u00e9tails<\/h3>\r\n      <span class=\"vvc-step-sub\" id=\"detailsSub\"><\/span>\r\n    <\/div>\r\n\r\n    <!-- \u00c9v\u00e9nement ponctuel : date + heures -->\r\n    <div class=\"vvc-form-row vvc-hidden\" id=\"rowEventDateTime\">\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"dateEvenement\" data-base=\"Date de l'\u00e9v\u00e9nement\">Date de l'\u00e9v\u00e9nement<\/label>\r\n        <input type=\"date\" id=\"dateEvenement\" name=\"dateEvenement\">\r\n      <\/div>\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"heureDebut\" data-base=\"D\u00e9but du service\">D\u00e9but du service<\/label>\r\n        <input type=\"time\" id=\"heureDebut\" name=\"heureDebut\">\r\n      <\/div>\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"heureFin\" data-base=\"Fin du service\">Fin du service<\/label>\r\n        <input type=\"time\" id=\"heureFin\" name=\"heureFin\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- R\u00e9current : p\u00e9riode -->\r\n    <div class=\"vvc-form-row vvc-hidden\" id=\"rowDateRange\">\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"dateDebut\" data-base=\"D\u00e9but du contrat\">D\u00e9but du contrat<\/label>\r\n        <input type=\"date\" id=\"dateDebut\" name=\"dateDebut\">\r\n      <\/div>\r\n      <div class=\"vvc-form-group\">\r\n        <label for=\"dateFin\" data-base=\"Fin du contrat\">Fin du contrat<\/label>\r\n        <input type=\"date\" id=\"dateFin\" name=\"dateFin\">\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- R\u00e9current : horaire hebdomadaire -->\r\n    <div class=\"vvc-form-group vvc-hidden\" id=\"grpRecurringDays\">\r\n      <label id=\"lblRecurringDays\" data-base=\"Horaire hebdomadaire\">Horaire hebdomadaire<\/label>\r\n      <div class=\"vvc-schedule\">\r\n        <div class=\"vvc-schedule-bar\">\r\n          <button type=\"button\" class=\"vvc-preset\" data-preset=\"weekdays\">Lun \u2013 Ven<\/button>\r\n          <button type=\"button\" class=\"vvc-preset\" data-preset=\"weekend\">Fin de semaine<\/button>\r\n          <button type=\"button\" class=\"vvc-preset\" data-preset=\"all\">Tous les jours<\/button>\r\n          <button type=\"button\" class=\"vvc-preset\" data-preset=\"clear\">Effacer<\/button>\r\n          <span class=\"vvc-count\" id=\"dayCount\">Aucun jour<\/span>\r\n        <\/div>\r\n        <div id=\"recurringDaysContainer\"><\/div>\r\n        <div class=\"vvc-schedule-foot\">\r\n          <button type=\"button\" class=\"vvc-apply-all\" id=\"applyAllBtn\" disabled>Appliquer \u00e0 tous les jours coch\u00e9s<\/button>\r\n          <span class=\"vvc-hint\" style=\"margin:0;\">Bas\u00e9 sur le premier jour rempli.<\/span>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"vvc-hint\">Cochez chaque jour o\u00f9 vous avez besoin de voituriers, puis indiquez les heures.<\/div>\r\n    <\/div>\r\n\r\n    <!-- Localisation -->\r\n    <div class=\"vvc-form-group vvc-hidden\" id=\"grpLocalisation\">\r\n      <label for=\"localisation\" data-base=\"Adresse du service\">Adresse du service<\/label>\r\n      <input type=\"text\" id=\"localisation\" name=\"localisation\" placeholder=\"1234 rue Sherbrooke Ouest, Montr\u00e9al\" autocomplete=\"street-address\">\r\n    <\/div>\r\n\r\n    <!-- Invit\u00e9s -->\r\n    <div class=\"vvc-form-group vvc-hidden\" id=\"grpNombreInvites\">\r\n      <label for=\"nombreInvites\" data-base=\"Nombre d'invit\u00e9s attendus\">Nombre d'invit\u00e9s attendus<\/label>\r\n      <input type=\"number\" id=\"nombreInvites\" name=\"nombreInvites\" min=\"1\" step=\"1\" placeholder=\"200\">\r\n      <div class=\"vvc-hint\">Une estimation suffit. Elle sert \u00e0 calculer le nombre de voituriers.<\/div>\r\n    <\/div>\r\n\r\n    <!-- V\u00e9hicules -->\r\n    <div class=\"vvc-form-group vvc-hidden\" id=\"grpEstimationVehicules\">\r\n      <label for=\"estimationVehicules\" data-base=\"V\u00e9hicules \u00e0 g\u00e9rer par jour\">V\u00e9hicules \u00e0 g\u00e9rer par jour<\/label>\r\n      <input type=\"number\" id=\"estimationVehicules\" name=\"estimationVehicules\" min=\"1\" step=\"1\" placeholder=\"150\">\r\n    <\/div>\r\n\r\n    <!-- Mariage -->\r\n    <div id=\"grpWedding\" class=\"vvc-hidden\">\r\n      <div class=\"vvc-form-group\" id=\"grpWeddingChoice\">\r\n        <label id=\"lblWeddingChoice\" data-base=\"O\u00f9 avez-vous besoin de voituriers ?\">O\u00f9 avez-vous besoin de voituriers ?<\/label>\r\n        <div class=\"vvc-options\">\r\n          <label class=\"vvc-option\" id=\"optCeremonie\">\r\n            <input type=\"checkbox\" class=\"vvc-check\" id=\"ceremonie\" name=\"ceremonie\">\r\n            <span>\r\n              <span class=\"vvc-option-title\">C\u00e9r\u00e9monie<\/span>\r\n              <span class=\"vvc-option-desc\">Accueil des invit\u00e9s au lieu de la c\u00e9r\u00e9monie<\/span>\r\n            <\/span>\r\n          <\/label>\r\n          <label class=\"vvc-option\" id=\"optReception\">\r\n            <input type=\"checkbox\" class=\"vvc-check\" id=\"reception\" name=\"reception\">\r\n            <span>\r\n              <span class=\"vvc-option-title\">R\u00e9ception<\/span>\r\n              <span class=\"vvc-option-desc\">Service \u00e0 la salle, incluant les d\u00e9parts de fin de soir\u00e9e<\/span>\r\n            <\/span>\r\n          <\/label>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- C\u00e9r\u00e9monie : adresse + heure d'arriv\u00e9e des voituriers -->\r\n      <div class=\"vvc-form-group vvc-hidden\" id=\"grpAdresseCeremonie\">\r\n        <div class=\"vvc-form-row\" style=\"margin-bottom:0;\">\r\n          <div class=\"vvc-form-group\">\r\n            <label for=\"adresseCeremonie\" data-base=\"Adresse de la c\u00e9r\u00e9monie\">Adresse de la c\u00e9r\u00e9monie<\/label>\r\n            <input type=\"text\" id=\"adresseCeremonie\" name=\"adresseCeremonie\" placeholder=\"\u00c9glise, chapelle ou domaine\">\r\n          <\/div>\r\n          <div class=\"vvc-form-group\">\r\n            <label for=\"heureArriveeCeremonie\" data-base=\"Arriv\u00e9e des voituriers\">Arriv\u00e9e des voituriers<\/label>\r\n            <input type=\"time\" id=\"heureArriveeCeremonie\" name=\"heureArriveeCeremonie\">\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- R\u00e9ception : adresse + heure d'arriv\u00e9e des voituriers -->\r\n      <div class=\"vvc-form-group vvc-hidden\" id=\"grpAdresseReception\">\r\n        <div class=\"vvc-form-row\" style=\"margin-bottom:0;\">\r\n          <div class=\"vvc-form-group\">\r\n            <label for=\"adresseReception\" data-base=\"Adresse de la r\u00e9ception\">Adresse de la r\u00e9ception<\/label>\r\n            <input type=\"text\" id=\"adresseReception\" name=\"adresseReception\" placeholder=\"Salle ou domaine de r\u00e9ception\">\r\n          <\/div>\r\n          <div class=\"vvc-form-group\">\r\n            <label for=\"heureArriveeReception\" data-base=\"Arriv\u00e9e des voituriers\">Arriv\u00e9e des voituriers<\/label>\r\n            <input type=\"time\" id=\"heureArriveeReception\" name=\"heureArriveeReception\">\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <!-- Exigences -->\r\n    <div class=\"vvc-form-group vvc-hidden\" id=\"grpExigences\">\r\n      <label for=\"exigencesParticulieres\" data-base=\"Exigences particuli\u00e8res\">Exigences particuli\u00e8res<\/label>\r\n      <textarea id=\"exigencesParticulieres\" name=\"exigencesParticulieres\" placeholder=\"Stationnement hors site, tapis rouge, tenue sp\u00e9cifique, acc\u00e8s restreint\u2026\"><\/textarea>\r\n      <div class=\"vvc-hint\">Facultatif.<\/div>\r\n    <\/div>\r\n\r\n    <!-- Explication -->\r\n    <div class=\"vvc-form-group vvc-hidden\" id=\"grpExplication\">\r\n      <label for=\"explication\" data-base=\"D\u00e9crivez votre besoin\">D\u00e9crivez votre besoin<\/label>\r\n      <textarea id=\"explication\" name=\"explication\" placeholder=\"Type de site, nombre de places, contraintes actuelles, \u00e9ch\u00e9ancier\u2026\"><\/textarea>\r\n    <\/div>\r\n\r\n    <!-- Pot de miel : invisible pour l'humain, rempli par les bots.\r\n         D\u00e9cal\u00e9 hors \u00e9cran, PAS en display:none (les bots r\u00e9cents ignorent\r\n         les champs en display:none). Aucun label, tabindex -1, hors du\r\n         flux d'autocompl\u00e9tion. -->\r\n    <div aria-hidden=\"true\" style=\"position:absolute;left:-9999px;top:auto;width:1px;height:1px;overflow:hidden;\">\r\n      <label for=\"vvcHp\">Ne pas remplir<\/label>\r\n      <input type=\"text\" id=\"vvcHp\" name=\"vvc_hp\" tabindex=\"-1\" autocomplete=\"off\">\r\n    <\/div>\r\n\r\n    <div class=\"vvc-actions\">\r\n      <button type=\"submit\" class=\"vvc-submit-btn\" id=\"vvcSubmitBtn\">Envoyer la demande<\/button>\r\n      <div id=\"vvcMessage\" class=\"vvc-message\" role=\"status\" aria-live=\"polite\"><\/div>\r\n      <div class=\"vvc-legend\"><span class=\"vvc-req\" style=\"margin:0;\">*<\/span> Champ obligatoire<\/div>\r\n    <\/div>\r\n\r\n  <\/form>\r\n<\/div>\r\n\r\n<script>\r\n(function() {\r\n  const form         = document.getElementById('vvcDemandForm');\r\n  const typeSelect   = document.getElementById('type');\r\n  const msgBox       = document.getElementById('vvcMessage');\r\n  const submitBtn    = document.getElementById('vvcSubmitBtn');\r\n  const stepDetails  = document.getElementById('stepDetails');\r\n  const detailsTitle = document.getElementById('detailsTitle');\r\n  const detailsSub   = document.getElementById('detailsSub');\r\n  const typeHint     = document.getElementById('typeHint');\r\n  const dayCount     = document.getElementById('dayCount');\r\n  const applyAllBtn  = document.getElementById('applyAllBtn');\r\n\r\n  const days = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday'];\r\n  const dayLabels = {monday:'Lundi',tuesday:'Mardi',wednesday:'Mercredi',thursday:'Jeudi',friday:'Vendredi',saturday:'Samedi',sunday:'Dimanche'};\r\n\r\n  const EVENT_TYPES     = ['corporate_event','private_event','fundraising','wedding'];\r\n  const RECURRING_TYPES = ['restaurants_hospitality','permanent_valet_service','construction_project_management'];\r\n\r\n  \/\/ ---------------------------------------------------------------\r\n  \/\/ Source de v\u00e9rit\u00e9 : champs obligatoires par type\r\n  \/\/ ---------------------------------------------------------------\r\n  const TYPE_RULES = {\r\n    corporate_event:  { required: ['dateEvenement','heureDebut','heureFin','localisation','nombreInvites'], title: \"D\u00e9tails de l'\u00e9v\u00e9nement\" },\r\n    private_event:    { required: ['dateEvenement','heureDebut','heureFin','localisation','nombreInvites'], title: \"D\u00e9tails de l'\u00e9v\u00e9nement\" },\r\n    fundraising:      { required: ['dateEvenement','heureDebut','heureFin','localisation','nombreInvites'], title: \"D\u00e9tails de l'\u00e9v\u00e9nement\" },\r\n    wedding:          { required: ['dateEvenement','heureDebut','heureFin','localisation','nombreInvites'], title: \"D\u00e9tails du mariage\", weddingChoice: true },\r\n    restaurants_hospitality:         { required: ['dateDebut','dateFin','localisation'], recurring: true, title: \"D\u00e9tails du contrat\" },\r\n    permanent_valet_service:         { required: ['dateDebut','dateFin','localisation'], recurring: true, title: \"D\u00e9tails du contrat\" },\r\n    construction_project_management: { required: ['dateDebut','dateFin','localisation','estimationVehicules'], recurring: true, title: \"D\u00e9tails du chantier\" },\r\n    consultation:       { required: ['explication'], title: \"Votre besoin\" },\r\n    parking_management: { required: ['explication'], title: \"Votre besoin\" }\r\n  };\r\n\r\n  const CONTACT_REQUIRED = ['nomComplet','email','telephone'];\r\n\r\n  \/\/ --- Construction de l'horaire ---\r\n  const recContainer = document.getElementById('recurringDaysContainer');\r\n  days.forEach(d => {\r\n    const row = document.createElement('div');\r\n    row.className = 'vvc-day';\r\n    row.id = 'row_' + d;\r\n    row.innerHTML =\r\n      '<label class=\"vvc-day-toggle\" for=\"day_' + d + '\">' +\r\n        '<input type=\"checkbox\" class=\"vvc-check\" id=\"day_' + d + '\" data-day=\"' + d + '\">' +\r\n        '<span>' + dayLabels[d] + '<\/span>' +\r\n      '<\/label>' +\r\n      '<div class=\"vvc-day-hours\">' +\r\n        '<input type=\"time\" id=\"start_' + d + '\" aria-label=\"Heure de d\u00e9but, ' + dayLabels[d] + '\" disabled>' +\r\n        '<span class=\"vvc-day-sep\">\u2014<\/span>' +\r\n        '<input type=\"time\" id=\"end_' + d + '\" aria-label=\"Heure de fin, ' + dayLabels[d] + '\" disabled>' +\r\n      '<\/div>';\r\n    recContainer.appendChild(row);\r\n  });\r\n\r\n  const sections = {\r\n    eventDateTime:       document.getElementById('rowEventDateTime'),\r\n    dateRange:           document.getElementById('rowDateRange'),\r\n    recurringDays:       document.getElementById('grpRecurringDays'),\r\n    localisation:        document.getElementById('grpLocalisation'),\r\n    nombreInvites:       document.getElementById('grpNombreInvites'),\r\n    estimationVehicules: document.getElementById('grpEstimationVehicules'),\r\n    exigences:           document.getElementById('grpExigences'),\r\n    explication:         document.getElementById('grpExplication'),\r\n    wedding:             document.getElementById('grpWedding'),\r\n    adresseCeremonie:    document.getElementById('grpAdresseCeremonie'),\r\n    adresseReception:    document.getElementById('grpAdresseReception')\r\n  };\r\n\r\n  function setInputsDisabled(el, disabled) {\r\n    if (!el) return;\r\n    el.querySelectorAll('input, select, textarea').forEach(inp => { inp.disabled = disabled; });\r\n  }\r\n\r\n  function hideAll() {\r\n    Object.values(sections).forEach(sec => {\r\n      if (!sec) return;\r\n      sec.classList.add('vvc-hidden');\r\n      sec.classList.remove('vvc-reveal');\r\n      setInputsDisabled(sec, true);\r\n    });\r\n    stepDetails.classList.add('vvc-hidden');\r\n  }\r\n\r\n  function showSection(el) {\r\n    if (!el) return;\r\n    el.classList.remove('vvc-hidden');\r\n    setInputsDisabled(el, false);\r\n    void el.offsetWidth;\r\n    el.classList.add('vvc-reveal');\r\n  }\r\n\r\n  \/\/ --- Ast\u00e9risques dynamiques ---\r\n  function refreshRequiredMarks(type) {\r\n    form.querySelectorAll('label[data-base]').forEach(lab => { lab.textContent = lab.getAttribute('data-base'); });\r\n\r\n    const mark = id => {\r\n      const lab = form.querySelector('label[for=\"' + id + '\"][data-base]');\r\n      if (lab) lab.innerHTML = lab.getAttribute('data-base') + '<span class=\"vvc-req\">*<\/span>';\r\n    };\r\n    const markById = labelId => {\r\n      const lab = document.getElementById(labelId);\r\n      if (lab) lab.innerHTML = lab.getAttribute('data-base') + '<span class=\"vvc-req\">*<\/span>';\r\n    };\r\n\r\n    mark('type');\r\n    CONTACT_REQUIRED.forEach(mark);\r\n\r\n    const rules = TYPE_RULES[type];\r\n    if (!rules) return;\r\n    rules.required.forEach(mark);\r\n    if (rules.recurring) markById('lblRecurringDays');\r\n    if (rules.weddingChoice) {\r\n      markById('lblWeddingChoice');\r\n      if (document.getElementById('ceremonie').checked) { mark('adresseCeremonie'); mark('heureArriveeCeremonie'); }\r\n      if (document.getElementById('reception').checked) { mark('adresseReception'); mark('heureArriveeReception'); }\r\n    }\r\n  }\r\n\r\n  \/\/ --- Horaire : \u00e9tat des jours ---\r\n  function syncDay(d) {\r\n    const cb  = document.getElementById('day_' + d);\r\n    const row = document.getElementById('row_' + d);\r\n    const s   = document.getElementById('start_' + d);\r\n    const e   = document.getElementById('end_' + d);\r\n    const on  = cb.checked;\r\n    row.classList.toggle('is-active', on);\r\n    s.disabled = !on;\r\n    e.disabled = !on;\r\n    if (!on) { s.value = ''; e.value = ''; s.classList.remove('vvc-error'); e.classList.remove('vvc-error'); }\r\n  }\r\n\r\n  function syncSchedule() {\r\n    let n = 0;\r\n    days.forEach(d => { if (document.getElementById('day_' + d).checked) n++; });\r\n    dayCount.textContent = n === 0 ? 'Aucun jour' : (n === 1 ? '1 jour s\u00e9lectionn\u00e9' : n + ' jours s\u00e9lectionn\u00e9s');\r\n    dayCount.classList.toggle('is-set', n > 0);\r\n    applyAllBtn.disabled = !(n > 1 && firstFilledDay());\r\n  }\r\n\r\n  function firstFilledDay() {\r\n    for (const d of days) {\r\n      const cb = document.getElementById('day_' + d);\r\n      if (cb.checked && document.getElementById('start_' + d).value && document.getElementById('end_' + d).value) return d;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  days.forEach(d => {\r\n    document.getElementById('day_' + d).addEventListener('change', () => {\r\n      syncDay(d);\r\n      syncSchedule();\r\n      const row = document.getElementById('row_' + d);\r\n      row.classList.remove('has-error');\r\n      const err = row.querySelector('.vvc-field-error');\r\n      if (err) err.remove();\r\n    });\r\n    document.getElementById('start_' + d).addEventListener('input', syncSchedule);\r\n    document.getElementById('end_' + d).addEventListener('input', syncSchedule);\r\n  });\r\n\r\n  document.querySelectorAll('.vvc-preset').forEach(btn => {\r\n    btn.addEventListener('click', () => {\r\n      const p = btn.getAttribute('data-preset');\r\n      const map = {\r\n        weekdays: ['monday','tuesday','wednesday','thursday','friday'],\r\n        weekend:  ['saturday','sunday'],\r\n        all:      days.slice(),\r\n        clear:    []\r\n      };\r\n      const target = map[p];\r\n      days.forEach(d => {\r\n        document.getElementById('day_' + d).checked = target.includes(d);\r\n        syncDay(d);\r\n      });\r\n      syncSchedule();\r\n    });\r\n  });\r\n\r\n  applyAllBtn.addEventListener('click', () => {\r\n    const src = firstFilledDay();\r\n    if (!src) return;\r\n    const s = document.getElementById('start_' + src).value;\r\n    const e = document.getElementById('end_' + src).value;\r\n    days.forEach(d => {\r\n      if (document.getElementById('day_' + d).checked) {\r\n        document.getElementById('start_' + d).value = s;\r\n        document.getElementById('end_' + d).value   = e;\r\n        document.getElementById('start_' + d).classList.remove('vvc-error');\r\n        document.getElementById('end_' + d).classList.remove('vvc-error');\r\n      }\r\n    });\r\n    document.querySelectorAll('.vvc-day .vvc-field-error').forEach(el => el.remove());\r\n    document.querySelectorAll('.vvc-day.has-error').forEach(el => el.classList.remove('has-error'));\r\n    syncSchedule();\r\n  });\r\n\r\n  \/\/ --- Erreurs ---\r\n  function clearErrors() {\r\n    form.querySelectorAll('.vvc-error').forEach(el => el.classList.remove('vvc-error'));\r\n    form.querySelectorAll('.has-error').forEach(el => el.classList.remove('has-error'));\r\n    form.querySelectorAll('.vvc-field-error').forEach(el => el.remove());\r\n    msgBox.className = 'vvc-message';\r\n    msgBox.textContent = '';\r\n  }\r\n\r\n  function addFieldError(id, message) {\r\n    const el = document.getElementById(id);\r\n    if (!el) return;\r\n    el.classList.add('vvc-error');\r\n    const dayRow = el.closest('.vvc-day');\r\n    const holder = dayRow || el.closest('.vvc-form-group');\r\n    if (dayRow) dayRow.classList.add('has-error');\r\n    if (holder && !holder.querySelector('.vvc-field-error')) {\r\n      const div = document.createElement('div');\r\n      div.className = 'vvc-field-error';\r\n      div.textContent = message;\r\n      holder.appendChild(div);\r\n    }\r\n  }\r\n\r\n  function addGroupError(groupId, message) {\r\n    const grp = document.getElementById(groupId);\r\n    if (!grp || grp.querySelector('.vvc-field-error')) return;\r\n    const div = document.createElement('div');\r\n    div.className = 'vvc-field-error';\r\n    div.textContent = message;\r\n    grp.appendChild(div);\r\n  }\r\n\r\n  const isEmail = v => \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$\/.test(v.trim());\r\n  const digits  = v => (v.match(\/\\d\/g) || []).length;\r\n  const todayISO = () => {\r\n    const d = new Date();\r\n    return new Date(d.getTime() - d.getTimezoneOffset() * 60000).toISOString().slice(0, 10);\r\n  };\r\n  const isEmpty = id => {\r\n    const el = document.getElementById(id);\r\n    return el && !el.disabled && el.value.trim() === '';\r\n  };\r\n\r\n  function validate() {\r\n    clearErrors();\r\n    const errors = [];\r\n    const type = typeSelect.value;\r\n\r\n    if (!type) {\r\n      addFieldError('type', 'Choisissez un service pour continuer.');\r\n      return ['type'];\r\n    }\r\n\r\n    CONTACT_REQUIRED.forEach(id => {\r\n      if (isEmpty(id)) { addFieldError(id, 'Ce champ est obligatoire.'); errors.push(id); }\r\n    });\r\n    const emailVal = document.getElementById('email').value;\r\n    if (emailVal.trim() && !isEmail(emailVal)) { addFieldError('email', 'Ce courriel n\\'est pas valide.'); errors.push('email'); }\r\n    const telVal = document.getElementById('telephone').value;\r\n    if (telVal.trim() && digits(telVal) < 10) { addFieldError('telephone', 'Il manque des chiffres : 10 minimum.'); errors.push('telephone'); }\r\n\r\n    const rules = TYPE_RULES[type];\r\n    rules.required.forEach(id => {\r\n      if (isEmpty(id)) { addFieldError(id, 'Ce champ est obligatoire.'); errors.push(id); }\r\n    });\r\n\r\n    if (EVENT_TYPES.includes(type)) {\r\n      const dEv = document.getElementById('dateEvenement');\r\n      if (dEv.value && dEv.value < todayISO()) { addFieldError('dateEvenement', 'Cette date est d\u00e9j\u00e0 pass\u00e9e.'); errors.push('dateEvenement'); }\r\n      const nb = document.getElementById('nombreInvites');\r\n      if (nb.value && parseInt(nb.value, 10) < 1) { addFieldError('nombreInvites', 'Indiquez au moins 1 invit\u00e9.'); errors.push('nombreInvites'); }\r\n    }\r\n\r\n    if (RECURRING_TYPES.includes(type)) {\r\n      const dD = document.getElementById('dateDebut');\r\n      const dF = document.getElementById('dateFin');\r\n      if (dD.value && dD.value < todayISO()) { addFieldError('dateDebut', 'Cette date est d\u00e9j\u00e0 pass\u00e9e.'); errors.push('dateDebut'); }\r\n      if (dD.value && dF.value && dF.value < dD.value) { addFieldError('dateFin', 'La fin doit venir apr\u00e8s le d\u00e9but.'); errors.push('dateFin'); }\r\n\r\n      let checked = 0;\r\n      days.forEach(d => {\r\n        const cb = document.getElementById('day_' + d);\r\n        if (!cb.checked || cb.disabled) return;\r\n        checked++;\r\n        if (!document.getElementById('start_' + d).value) { addFieldError('start_' + d, 'Indiquez les heures pour ce jour.'); errors.push('start_' + d); }\r\n        if (!document.getElementById('end_' + d).value)   { addFieldError('end_' + d,   'Indiquez les heures pour ce jour.'); errors.push('end_' + d); }\r\n      });\r\n      if (checked === 0) { addGroupError('grpRecurringDays', 'Cochez au moins un jour de service.'); errors.push('grpRecurringDays'); }\r\n\r\n      if (type === 'construction_project_management') {\r\n        const ev = document.getElementById('estimationVehicules');\r\n        if (ev.value && parseInt(ev.value, 10) < 1) { addFieldError('estimationVehicules', 'Indiquez au moins 1 v\u00e9hicule.'); errors.push('estimationVehicules'); }\r\n      }\r\n    }\r\n\r\n    if (rules.weddingChoice) {\r\n      const cer = document.getElementById('ceremonie');\r\n      const rec = document.getElementById('reception');\r\n      if (!cer.checked && !rec.checked) { addGroupError('grpWeddingChoice', 'Choisissez la c\u00e9r\u00e9monie, la r\u00e9ception, ou les deux.'); errors.push('grpWeddingChoice'); }\r\n      if (cer.checked && isEmpty('adresseCeremonie'))      { addFieldError('adresseCeremonie', 'Ce champ est obligatoire.'); errors.push('adresseCeremonie'); }\r\n      if (cer.checked && isEmpty('heureArriveeCeremonie')) { addFieldError('heureArriveeCeremonie', 'Ce champ est obligatoire.'); errors.push('heureArriveeCeremonie'); }\r\n      if (rec.checked && isEmpty('adresseReception'))      { addFieldError('adresseReception', 'Ce champ est obligatoire.'); errors.push('adresseReception'); }\r\n      if (rec.checked && isEmpty('heureArriveeReception')) { addFieldError('heureArriveeReception', 'Ce champ est obligatoire.'); errors.push('heureArriveeReception'); }\r\n    }\r\n\r\n    return errors;\r\n  }\r\n\r\n  \/\/ --- Changement de type ---\r\n  typeSelect.addEventListener('change', function() {\r\n    hideAll();\r\n    clearErrors();\r\n    const t = this.value;\r\n    if (!t) { refreshRequiredMarks(null); return; }\r\n\r\n    const rules = TYPE_RULES[t];\r\n    stepDetails.classList.remove('vvc-hidden');\r\n    detailsTitle.textContent = rules.title;\r\n    detailsSub.textContent = EVENT_TYPES.includes(t) ? 'Date unique'\r\n                          : RECURRING_TYPES.includes(t) ? 'Service r\u00e9current' : '';\r\n    typeHint.textContent = EVENT_TYPES.includes(t)\r\n      ? 'Un devis vous est envoy\u00e9 sous 24 h ouvrables.'\r\n      : RECURRING_TYPES.includes(t)\r\n        ? 'Un contrat r\u00e9current : indiquez la p\u00e9riode et l\\'horaire hebdomadaire.'\r\n        : 'D\u00e9crivez votre situation, un conseiller vous rappelle.';\r\n\r\n    if (EVENT_TYPES.includes(t)) {\r\n      showSection(sections.eventDateTime);\r\n      showSection(sections.localisation);\r\n      showSection(sections.nombreInvites);\r\n      showSection(sections.exigences);\r\n    }\r\n\r\n    if (RECURRING_TYPES.includes(t)) {\r\n      showSection(sections.dateRange);\r\n      showSection(sections.recurringDays);\r\n      showSection(sections.localisation);\r\n      showSection(sections.exigences);\r\n      days.forEach(syncDay);\r\n      syncSchedule();\r\n    }\r\n\r\n    if (t === 'construction_project_management') showSection(sections.estimationVehicules);\r\n\r\n    if (t === 'wedding') {\r\n      showSection(sections.wedding);\r\n      ['adresseCeremonie','adresseReception'].forEach(k => {\r\n        sections[k].classList.add('vvc-hidden');\r\n        setInputsDisabled(sections[k], true);\r\n      });\r\n      document.getElementById('ceremonie').disabled = false;\r\n      document.getElementById('reception').disabled = false;\r\n      syncWeddingCards();\r\n    }\r\n\r\n    if (t === 'consultation' || t === 'parking_management') showSection(sections.explication);\r\n\r\n    refreshRequiredMarks(t);\r\n  });\r\n\r\n  \/\/ --- Cartes mariage ---\r\n  function syncWeddingCards() {\r\n    [['ceremonie','optCeremonie','adresseCeremonie'], ['reception','optReception','adresseReception']].forEach(([cbId, cardId, secKey]) => {\r\n      const cb = document.getElementById(cbId);\r\n      document.getElementById(cardId).classList.toggle('is-active', cb.checked);\r\n      const sec = sections[secKey];\r\n      sec.classList.toggle('vvc-hidden', !cb.checked);\r\n      setInputsDisabled(sec, !cb.checked);\r\n      if (cb.checked) sec.classList.add('vvc-reveal');\r\n    });\r\n  }\r\n  ['ceremonie','reception'].forEach(id => {\r\n    document.getElementById(id).addEventListener('change', () => {\r\n      syncWeddingCards();\r\n      refreshRequiredMarks(typeSelect.value);\r\n      const err = document.getElementById('grpWeddingChoice').querySelector('.vvc-field-error');\r\n      if (err) err.remove();\r\n    });\r\n  });\r\n\r\n  \/\/ --- Erreurs renvoy\u00e9es par le serveur (r\u00e9ponse 422) ---\r\n  \/\/ Le PHP nomme les champs comme le formulaire, sauf deux cas\r\n  \/\/ qui pointent vers un groupe plut\u00f4t qu'un champ pr\u00e9cis.\r\n  const SERVER_FIELD_TO_GROUP = {\r\n    recurringDays: 'grpRecurringDays',\r\n    ceremonie:     'grpWeddingChoice',\r\n    reception:     'grpWeddingChoice'\r\n  };\r\n\r\n  function applyServerErrors(fields) {\r\n    clearErrors();\r\n    Object.keys(fields).forEach(name => {\r\n      const msg = fields[name];\r\n      const groupId = SERVER_FIELD_TO_GROUP[name];\r\n      if (groupId) {\r\n        addGroupError(groupId, msg);\r\n      } else if (document.getElementById(name)) {\r\n        addFieldError(name, msg);\r\n      }\r\n    });\r\n  }\r\n\r\n  \/\/ --- L'erreur dispara\u00eet d\u00e8s la correction ---\r\n  form.addEventListener('input', function(e) {\r\n    if (!e.target.classList.contains('vvc-error')) return;\r\n    e.target.classList.remove('vvc-error');\r\n    const dayRow = e.target.closest('.vvc-day');\r\n    const holder = dayRow || e.target.closest('.vvc-form-group');\r\n    if (dayRow) dayRow.classList.remove('has-error');\r\n    const err = holder && holder.querySelector('.vvc-field-error');\r\n    if (err) err.remove();\r\n  });\r\n\r\n  \/\/ --- Envoi ---\r\n  form.addEventListener('submit', async function(e) {\r\n    e.preventDefault();\r\n\r\n    const errors = validate();\r\n    if (errors.length) {\r\n      const first = form.querySelector('.vvc-error') || form.querySelector('.vvc-field-error');\r\n      if (first) {\r\n        first.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        if (typeof first.focus === 'function') first.focus({ preventScroll: true });\r\n      }\r\n      msgBox.textContent = errors.length === 1\r\n        ? 'Un champ demande votre attention. Il est signal\u00e9 ci-dessus.'\r\n        : errors.length + ' champs demandent votre attention. Ils sont signal\u00e9s ci-dessus.';\r\n      msgBox.className = 'vvc-message error';\r\n      return;\r\n    }\r\n\r\n    submitBtn.disabled = true;\r\n    submitBtn.textContent = 'Envoi en cours\u2026';\r\n\r\n    const type = typeSelect.value;\r\n\r\n    try {\r\n      const payload = {\r\n        status: 'new',\r\n        type: type,\r\n        vvc_hp: document.getElementById('vvcHp').value, \/\/ pot de miel\r\n        nomComplet: form.nomComplet.value.trim(),\r\n        email: form.email.value.trim(),\r\n        telephone: form.telephone.value.trim(),\r\n        assignedValetIds: [],\r\n        valetEntries: [],\r\n        extraItems: [],\r\n        recurringDays: []\r\n      };\r\n\r\n      if (EVENT_TYPES.includes(type)) {\r\n        payload.localisation  = form.localisation.value.trim();\r\n        payload.dateEvenement = form.dateEvenement.value;\r\n        payload.heureDebut    = form.heureDebut.value;\r\n        payload.heureFin      = form.heureFin.value;\r\n        payload.nombreInvites = parseInt(form.nombreInvites.value, 10);\r\n        if (form.exigencesParticulieres.value.trim()) payload.exigencesParticulieres = form.exigencesParticulieres.value.trim();\r\n      }\r\n\r\n      if (RECURRING_TYPES.includes(type)) {\r\n        payload.localisation = form.localisation.value.trim();\r\n        payload.dateDebut    = form.dateDebut.value;\r\n        payload.dateFin      = form.dateFin.value;\r\n        if (form.exigencesParticulieres.value.trim()) payload.exigencesParticulieres = form.exigencesParticulieres.value.trim();\r\n        days.forEach(d => {\r\n          const cb = document.getElementById('day_' + d);\r\n          if (cb.checked && !cb.disabled) {\r\n            payload.recurringDays.push({\r\n              jour: d,\r\n              heureDebut: document.getElementById('start_' + d).value,\r\n              heureFin:   document.getElementById('end_' + d).value\r\n            });\r\n          }\r\n        });\r\n      }\r\n\r\n      if (type === 'construction_project_management') {\r\n        payload.estimationVehicules = parseInt(form.estimationVehicules.value, 10);\r\n      }\r\n\r\n      if (type === 'wedding') {\r\n        payload.ceremonie = form.ceremonie.checked;\r\n        if (payload.ceremonie) {\r\n          payload.adresseCeremonie      = form.adresseCeremonie.value.trim();\r\n          payload.heureArriveeCeremonie = form.heureArriveeCeremonie.value;\r\n        }\r\n        payload.reception = form.reception.checked;\r\n        if (payload.reception) {\r\n          payload.adresseReception      = form.adresseReception.value.trim();\r\n          payload.heureArriveeReception = form.heureArriveeReception.value;\r\n        }\r\n      }\r\n\r\n      if (type === 'consultation' || type === 'parking_management') {\r\n        payload.explication = form.explication.value.trim();\r\n      }\r\n\r\n      const res = await fetch('https:\/\/vipvaletinc.com\/wp-content\/vvc-form-receiver.php', {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application\/json' },\r\n        body: JSON.stringify(payload)\r\n      });\r\n\r\n      const data = await res.json().catch(() => ({}));\r\n\r\n      if (res.ok && data.success) {\r\n        msgBox.textContent = 'Demande re\u00e7ue. Notre \u00e9quipe vous revient sous 24 h ouvrables.';\r\n        msgBox.className = 'vvc-message success';\r\n        form.reset();\r\n        hideAll();\r\n        typeSelect.value = '';\r\n        typeHint.textContent = 'Le formulaire s\\'adapte au service choisi.';\r\n        days.forEach(syncDay);\r\n        syncSchedule();\r\n        refreshRequiredMarks(null);\r\n        msgBox.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n      } else if (res.status === 422 && data.fields) {\r\n        \/\/ Le serveur a refus\u00e9 des champs : on les signale un par un.\r\n        applyServerErrors(data.fields);\r\n        const first = form.querySelector('.vvc-error') || form.querySelector('.vvc-field-error');\r\n        if (first) first.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n        msgBox.textContent = 'Certains champs sont invalides. Ils sont signal\u00e9s ci-dessus.';\r\n        msgBox.className = 'vvc-message error';\r\n      } else if (res.status === 429) {\r\n        msgBox.textContent = 'Vous avez d\u00e9j\u00e0 envoy\u00e9 plusieurs demandes. R\u00e9essayez plus tard ou appelez-nous directement.';\r\n        msgBox.className = 'vvc-message error';\r\n      } else {\r\n        msgBox.textContent = data.error || 'L\\'envoi a \u00e9chou\u00e9 (code ' + res.status + '). R\u00e9essayez, ou appelez-nous directement.';\r\n        msgBox.className = 'vvc-message error';\r\n      }\r\n\r\n    } catch (err) {\r\n      msgBox.textContent = 'Connexion impossible. V\u00e9rifiez votre r\u00e9seau et r\u00e9essayez.';\r\n      msgBox.className = 'vvc-message error';\r\n    } finally {\r\n      submitBtn.disabled = false;\r\n      submitBtn.textContent = 'Envoyer la demande';\r\n    }\r\n  });\r\n\r\n  hideAll();\r\n  days.forEach(syncDay);\r\n  syncSchedule();\r\n  refreshRequiredMarks(null);\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Obtenir une soumission Obtenez une soumission personnalis\u00e9e en quelques clics pour votre \u00e9v\u00e9nement. 01 Service Quel service vous int\u00e9resse ? \u2014 S\u00e9lectionner un service \u2014\u00c9v\u00e9nement corporatif\u00c9v\u00e9nement priv\u00e9Lev\u00e9e de fondsMariage Restaurants &amp; h\u00f4tellerieService de voiturier permanentConstruction &amp; gestion de projets Gestion de stationnementConsultation Le formulaire s&rsquo;adapte au service choisi. 02 Vos coordonn\u00e9es Nom complet Courriel T\u00e9l\u00e9phone [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-267","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/pages\/267","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/comments?post=267"}],"version-history":[{"count":184,"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/pages\/267\/revisions"}],"predecessor-version":[{"id":2590,"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/pages\/267\/revisions\/2590"}],"wp:attachment":[{"href":"https:\/\/vipvaletinc.com\/fr\/wp-json\/wp\/v2\/media?parent=267"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}