{"id":24630,"date":"2026-05-29T11:15:16","date_gmt":"2026-05-29T15:15:16","guid":{"rendered":"https:\/\/tudomicilioenundia.cl\/laserena\/?page_id=24630"},"modified":"2026-06-08T21:54:27","modified_gmt":"2026-06-09T01:54:27","slug":"reservas","status":"publish","type":"page","link":"https:\/\/tudomicilioenundia.cl\/laserena\/reservas\/","title":{"rendered":"Reservas Tudo"},"content":{"rendered":"<p><section class=\"kc-elm kc-css-491643 kc_row\"><div class=\"kc-row-container  kc-container\"><div class=\"kc-wrap-columns\"><div class=\"kc-elm kc-css-229222 kc_col-sm-12 kc_column kc_col-sm-12\"><div class=\"kc-col-container\"><div class=\"kc-elm kc-css-801734\" style=\"height: 60px; clear: both; width:100%;\"><\/div><\/div><\/div><\/div><\/div><\/section><section class=\"kc-elm kc-css-874230 kc_row\"><div class=\"kc-row-container  kc-container\"><div class=\"kc-wrap-columns\"><div class=\"kc-elm kc-css-106441 kc_col-sm-12 kc_column kc_col-sm-12\"><div class=\"kc-col-container\">        <div id=\"trs-app\" class=\"trs-public\" data-nonce=\"a33e6ffd95\" data-ajax=\"https:\/\/tudomicilioenundia.cl\/laserena\/wp-admin\/admin-ajax.php\">\n            <style>\n                .trs-public{font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;max-width:1200px;margin:24px auto;color:#0f172a}.trs-p-hero{background:linear-gradient(135deg,#007AFD,#0f172a);color:#fff;border-radius:28px;padding:28px;margin-bottom:18px}.trs-p-hero h2{margin:0;font-size:32px;color:#fff}.trs-p-hero p{margin:8px 0 0;color:rgba(255,255,255,.9)}.trs-p-card{background:#fff;border:1px solid #e2e8f0;border-radius:22px;padding:20px;box-shadow:0 12px 35px rgba(15,23,42,.08);margin:14px 0}.trs-p-steps{display:grid;grid-template-columns:245px 1fr;gap:18px}.trs-side{background:#f8fafc;border:1px solid #e2e8f0;border-radius:20px;padding:16px}.trs-side .step{padding:12px;border-radius:14px;margin-bottom:8px;font-weight:900;color:#64748b}.trs-side .step.active{background:#0f172a;color:#fff}.trs-choice{display:grid;grid-template-columns:repeat(2,minmax(200px,1fr));gap:14px}.trs-choice button,.trs-room,.trs-client-card{border:1px solid #dbe3ea;background:#fff;border-radius:18px;padding:18px;text-align:left;cursor:pointer}.trs-choice button.active,.trs-room.active,.trs-client-card.active{border-color:#007AFD;box-shadow:0 0 0 3px rgba(0,122,253,.12)}.trs-room img{width:100%;height:165px;object-fit:cover;border-radius:14px;margin-bottom:10px}.trs-room-info{background:#f8fafc;border:1px dashed #cbd5e1;border-radius:14px;padding:10px;margin:10px 0;color:#475569}.trs-room-info ul{margin:6px 0 0 18px;padding:0}.trs-room-info li{margin:3px 0}.trs-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center}.trs-row input,.trs-row select{padding:12px;border:1px solid #cbd5e1;border-radius:12px;min-height:44px}.trs-month-nav{display:flex;align-items:center;gap:10px;margin-top:6px}.trs-month-label{flex:1;border:1px solid #cbd5e1;border-radius:14px;padding:12px 14px;font-weight:900;background:#fff;text-transform:capitalize}.trs-month-btn{width:46px;height:46px;border-radius:14px;border:1px solid #cbd5e1;background:#f8fafc;font-weight:900;cursor:pointer}.trs-month-btn:disabled{opacity:.35;cursor:not-allowed}.trs-btn{background:#007AFD;color:#fff;border:0;border-radius:12px;padding:12px 16px;font-weight:900;cursor:pointer}.trs-btn[disabled]{opacity:.55;cursor:not-allowed}.trs-btn.secondary{background:#f1f5f9;color:#0f172a;border:1px solid #cbd5e1}.trs-client-bar{background:#eff6ff;border:1px solid #bfdbfe;border-radius:18px;padding:14px;margin-bottom:14px}.trs-client-bad{background:#fff1f2!important;border-color:#fca5a5!important;color:#991b1b!important}.trs-pay-link{display:inline-block;margin-top:8px;color:#b91c1c;font-weight:900}.trs-zero{color:#dc2626;font-weight:900}.trs-remain{display:flex;gap:14px;flex-wrap:wrap}.trs-remain span{background:#fff;border:1px solid #dbe3ea;border-radius:12px;padding:8px 10px}.trs-room-grid{display:grid;grid-template-columns:repeat(2,minmax(240px,1fr));gap:14px}.trs-date-layout{display:grid;grid-template-columns:minmax(320px,1.1fr) minmax(260px,.9fr);gap:18px}.trs-grid-days{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;margin-top:14px}.trs-day{border:1px solid #e2e8f0;background:#fff;border-radius:14px;padding:11px;text-align:center;cursor:pointer;min-height:48px}.trs-day.disabled{opacity:.35;cursor:not-allowed;background:#f8fafc}.trs-day small{display:block;font-size:11px;color:#64748b}.trs-day b{display:block;font-size:18px}.trs-day.active{background:#0f172a;color:#fff}.trs-day.active small{color:#cbd5e1}.trs-day.active b{font-size:24px}.trs-slots{display:grid;grid-template-columns:repeat(2,minmax(120px,1fr));gap:10px;margin-top:14px}.trs-slot{border:1px solid #cbd5e1;background:#fff;border-radius:14px;padding:12px;text-align:center;font-weight:800;cursor:pointer}.trs-slot.active{background:#007AFD;color:#fff;border-color:#007AFD}.trs-summary{background:#eff6ff;border:1px solid #bfdbfe;border-radius:18px;padding:16px}.trs-summary-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.trs-summary-compact{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:stretch}.trs-summary-box{background:#fff;border:1px solid #dbeafe;border-radius:16px;padding:14px}.trs-summary-box h4{margin:0 0 10px;font-size:17px}.trs-total-box{background:#f8fafc;border:1px solid #cbd5e1;border-radius:16px;padding:12px;margin-top:12px}.trs-badge{display:inline-flex;align-items:center;padding:4px 10px;border-radius:999px;font-weight:900;font-size:12px}.trs-badge.ok{background:#dcfce7;color:#166534}.trs-badge.bad{background:#fee2e2;color:#991b1b}.trs-client-card{position:relative}.trs-client-card .trs-card-title{display:flex;gap:8px;align-items:center;justify-content:space-between}.trs-verify-box{background:#f8fafc;border:1px solid #dbe3ea;border-radius:18px;padding:14px;margin-top:12px}.trs-alert{padding:12px 14px;border-radius:14px;background:#fff7ed;border:1px solid #fed7aa;color:#9a3412;margin:10px 0}.trs-reserved-list{margin-top:14px;background:#f8fafc;border:1px dashed #cbd5e1;border-radius:16px;padding:12px}.trs-reserved-list h4{margin:0 0 8px;font-size:15px}.trs-reserved-items{display:flex;gap:8px;flex-wrap:wrap}.trs-reserved-item{background:#fee2e2;color:#991b1b;border:1px solid #fecaca;border-radius:999px;padding:6px 10px;font-weight:800;font-size:13px}.trs-ok{background:#dcfce7;border-color:#86efac;color:#166534}.trs-bad{background:#fee2e2;border-color:#fca5a5;color:#991b1b}.trs-direct-safe-logo{display:block;max-width:330px;width:88%;height:auto;margin:14px auto 0;object-fit:contain}.trs-ingreso-code{display:inline-block;background:#0f172a;color:#fff;border-radius:999px;padding:5px 10px;font-weight:900;letter-spacing:.04em}.trs-hidden{display:none!important}.trs-small{font-size:13px;color:#64748b}@media(max-width:900px){.trs-p-steps,.trs-date-layout,.trs-summary-grid,.trs-summary-compact{grid-template-columns:1fr}.trs-choice,.trs-room-grid{grid-template-columns:1fr}.trs-grid-days{grid-template-columns:repeat(4,1fr)}.trs-slots{grid-template-columns:1fr}}\n\n                \/* Ajustes v0.4.16: detalles visuales finales *\/\n                .trs-clients-heading{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:8px 0 12px}.trs-clients-heading h4{margin:0;font-size:21px;font-weight:760;letter-spacing:-.02em}.trs-clients-heading small{color:#64748b;font-size:13px}.trs-client-company-blue{color:#007AFD!important}.trs-client-card p{font-size:14px!important;color:#475569!important}.trs-room-top{display:flex;align-items:center;justify-content:space-between;gap:10px}.trs-room-more{font-size:13px;font-weight:760;color:#007AFD;text-decoration:none}.trs-room-features{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0}.trs-room-chip{display:inline-flex;align-items:center;gap:5px;background:#f8fafc;border:1px solid #e2e8f0;border-radius:999px;padding:5px 9px;color:#475569;font-size:13px}.trs-room-chip:before{content:\"\u2022\";font-weight:900;color:#007AFD}.trs-room-info{border-style:solid!important;background:#fbfdff!important}.trs-client-card .trs-card-title b{font-size:17px;letter-spacing:.04em}.trs-choice-priority{grid-template-columns:1.15fr .85fr}.trs-choice-main{background:#fbfdff!important}.trs-choice-secondary{min-height:104px!important}.trs-packs-cta{margin:12px 0 0!important;color:#64748b}.trs-pack-btn{display:inline-flex;align-items:center;border:1px solid #bfdbfe;border-radius:999px;padding:6px 11px;margin-left:6px;color:#007AFD;text-decoration:none;font-weight:760;background:#eff6ff}.trs-public h2,.trs-public h3{letter-spacing:-.035em}.trs-public h4{letter-spacing:-.02em}\n\n                \/* Ajustes v0.4.10: experiencia m\u00e1s limpia y m\u00f3vil *\/\n                .trs-p-card{border-radius:24px}.trs-choice button{transition:.18s ease;min-height:118px}.trs-choice button:hover,.trs-room:hover{transform:translateY(-1px);box-shadow:0 12px 28px rgba(15,23,42,.08)}\n                @media(max-width:900px){.trs-p-steps{display:flex;flex-direction:column-reverse}.trs-side{display:flex;gap:8px;overflow-x:auto;padding:10px}.trs-side .step{white-space:nowrap;margin:0;min-width:max-content}.trs-p-hero{border-radius:22px;padding:22px}.trs-p-hero h2{font-size:26px}.trs-choice{grid-template-columns:1fr}.trs-choice button{min-height:auto}.trs-date-layout{gap:12px}.trs-grid-days{grid-template-columns:repeat(7,1fr);gap:5px}.trs-day{min-height:42px;padding:8px 4px;border-radius:12px}.trs-summary-compact{grid-template-columns:1fr}.trs-direct-safe-logo{max-width:250px}.trs-row input{width:100%;min-width:0!important}.trs-row .trs-btn{width:100%}}\n            \n            \n                \/* Ajustes v0.4.10: portal m\u00e1s tipo dashboard y modificaci\u00f3n limpia *\/\n                .trs-client-portal{max-width:1680px}.trs-client-portal .card{border-radius:30px}.trs-portal-shell{grid-template-columns:240px minmax(0,1fr)}.trs-portal-side{background:linear-gradient(180deg,#f8fafc,#fff);box-shadow:0 10px 30px rgba(15,23,42,.04)}.trs-portal-side button{border-radius:14px}.trs-panel-section{border-radius:26px}.trs-panel-title h3{letter-spacing:-.02em}.trs-primary-link[data-tab]{border:0}.trs-session-line{display:flex;gap:10px;align-items:center;justify-content:space-between;background:#f8fafc;border:1px solid #e2e8f0;border-radius:18px;padding:10px 12px;margin-bottom:14px;color:#64748b;font-size:13px}.trs-session-line button{padding:8px 10px;font-size:12px;background:#fff!important;color:#0f172a!important;border:1px solid #cbd5e1}.trs-reserve-iframe{width:100%;min-height:1100px;border:0;border-radius:22px;background:#fff}.trs-res-card{grid-template-columns:minmax(240px,1.25fr) minmax(190px,.95fr) minmax(130px,.55fr) minmax(210px,.85fr);background:#fff}.trs-res-company{color:#475569;margin-top:4px}.trs-modify-box{background:linear-gradient(180deg,#f8fbff,#fff);border:1px solid #cbd5e1;border-radius:24px;padding:18px;margin:14px 0 2px;grid-column:1\/-1;box-shadow:0 12px 30px rgba(15,23,42,.05)}.trs-modify-head{align-items:flex-start}.trs-modify-head b{font-size:22px}.trs-modify-controls{grid-template-columns:220px 170px minmax(240px,1fr);background:#fff;border:1px solid #e2e8f0;border-radius:18px;padding:12px}.trs-modify-calendar{background:#fff;border:1px solid #e2e8f0;border-radius:18px;padding:12px;margin:12px 0}.trs-modify-weekdays,.trs-modify-days{display:grid;grid-template-columns:repeat(7,1fr);gap:7px}.trs-modify-weekdays span{text-align:center;color:#64748b;font-size:12px;font-weight:900;text-transform:uppercase}.trs-modify-day{min-width:0!important;width:100%;aspect-ratio:1.35\/1;background:#fff!important;color:#0f172a!important;border:1px solid #dbe3ea!important;padding:7px!important;border-radius:13px!important;text-align:center}.trs-modify-day.empty{visibility:hidden}.trs-modify-day.active{background:#0f172a!important;color:#fff!important}.trs-modify-slots{grid-template-columns:repeat(auto-fit,minmax(155px,1fr));gap:10px}.trs-modify-payment-note{background:#fff7ed;border:1px solid #fed7aa;color:#92400e;border-radius:16px;padding:12px;margin-top:12px}.trs-plan-card p{margin:.55em 0}.trs-plan-meta{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:10px 0}.trs-plan-meta span{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:8px}.trs-login-help{color:#64748b;font-size:13px;margin-top:8px}.trs-login-grid{display:grid;grid-template-columns:minmax(260px,1fr) minmax(210px,.7fr) auto;gap:10px;align-items:center}.trs-login-grid input{width:100%!important;min-width:0!important}\n                @media(max-width:900px){.trs-client-portal{margin:8px auto}.trs-client-portal .card{border-radius:22px;padding:16px}.trs-login-grid{grid-template-columns:1fr}.trs-portal-shell{grid-template-columns:1fr}.trs-portal-side{display:flex;overflow-x:auto;position:relative}.trs-res-card{grid-template-columns:1fr}.trs-action-stack button{flex:1}.trs-modify-controls{grid-template-columns:1fr}.trs-modify-weekdays,.trs-modify-days{gap:5px}.trs-modify-day{border-radius:10px;padding:5px!important}.trs-modify-slots{grid-template-columns:1fr}.trs-reserve-iframe{min-height:1250px}.trs-session-line{display:block}.trs-session-line button{margin-top:8px;width:100%}.trs-plan-meta{grid-template-columns:1fr}.trs-portal-kpis{grid-template-columns:1fr!important}}\n\n                \/* Ajustes v0.4.11 *\/\n                @media(max-width:900px){.trs-shell{display:flex!important;flex-direction:column}.trs-steps{order:2}.trs-stage{order:1}.trs-type-grid{grid-template-columns:1fr!important}.trs-type-card{padding:18px!important}.trs-public .card{border-radius:22px!important}}\n            \n\n                \/* Ajustes v0.4.21: flujo p\u00fablico m\u00e1s limpio *\/\n                .trs-choice-priority{grid-template-columns:1fr 0.78fr!important}.trs-choice button{min-height:104px!important}.trs-choice-secondary{opacity:.96}.trs-packs-cta{font-size:14px!important}.trs-verify-box .trs-row input{max-width:150px!important;text-align:center!important;letter-spacing:.16em!important}.trs-verify-box .trs-row button{min-width:120px!important}.trs-verify-box button:disabled{background:#e5e7eb!important;color:#64748b!important;cursor:not-allowed!important}.trs-summary .trs-small{line-height:1.55!important}.trs-direct-safe-logo{max-width:280px!important}\n                @media(max-width:900px){.trs-choice-priority{grid-template-columns:1fr!important}.trs-verify-box .trs-row input{max-width:none!important}}\n\n                \/* Ajustes v0.4.22: \u00faltimos retoques producci\u00f3n *\/\n                .trs-client-portal .login-card{max-width:760px!important;padding:22px!important}\n                #trsp-code-box{max-width:330px!important;padding:9px!important;margin-top:12px!important}\n                #trsp-code-box .row{grid-template-columns:150px 82px!important;gap:7px!important;align-items:center!important;justify-content:center!important}\n                #trsp-code{height:38px!important;min-height:38px!important;font-size:16px!important;letter-spacing:.18em!important;border-radius:11px!important;padding:6px 8px!important}\n                #trsp-verify{height:38px!important;min-height:38px!important;font-size:12px!important;border-radius:11px!important;padding:6px 10px!important;background:#0f172a!important}\n                .trs-kpi-top{display:flex!important;align-items:center!important;justify-content:space-between!important;gap:8px!important;margin-bottom:4px!important}\n                .trs-status-badge{font-style:normal!important;border-radius:999px!important;padding:3px 9px!important;font-weight:800!important;font-size:11px!important;line-height:1.3!important;white-space:nowrap!important}.trs-status-badge.ok{background:#dcfce7!important;color:#166534!important}.trs-status-badge.bad{background:#fee2e2!important;color:#991b1b!important}\n                .trs-available-hours{color:#007AFD!important;font-weight:900!important}.trs-portal-kpi strong{color:#007AFD!important;font-size:20px!important}.trs-portal-kpi small{font-size:14px!important;line-height:1.45!important}\n                .trs-pack-summary{margin:8px 0 14px!important;background:#f8fbff!important;border:1px solid #bfdbfe!important;border-radius:18px!important;padding:13px 16px!important;display:grid!important;grid-template-columns:auto 170px 1fr!important;align-items:center!important;gap:12px!important}.trs-pack-summary span{font-size:12px!important;letter-spacing:.13em!important;text-transform:uppercase!important;color:#64748b!important;font-weight:900!important}.trs-pack-summary strong{font-size:22px!important;color:#0f172a!important;white-space:nowrap!important}.trs-pack-summary small{font-size:13px!important;color:#64748b!important;text-align:right!important}\n                .trs-modify-day:not(.active){color:#475569!important;background:#fff!important}.trs-modify-day small,.trs-modify-day b{display:block!important;color:inherit!important;visibility:visible!important;opacity:1!important;line-height:1.05!important}.trs-modify-day{flex-direction:column!important;gap:4px!important}.trs-modify-day small{text-transform:capitalize!important;font-weight:650!important}.trs-modify-day b{font-weight:850!important}\n                @media(max-width:700px){#trsp-code-box{max-width:270px!important}#trsp-code-box .row{grid-template-columns:1fr!important}.trs-pack-summary{grid-template-columns:1fr!important;text-align:center!important}.trs-pack-summary small{text-align:center!important}.trs-portal-kpis{grid-template-columns:1fr!important}}\n\n\n\/* Ajuste p\u00fablico reservas: pasos arriba, subpaso fecha + duraci\u00f3n y m\u00f3vil estable *\/\n.trs-public .trs-side{\n    position:sticky!important;\n    top:16px!important;\n    align-self:start!important;\n    z-index:20!important;\n}\n\n.trs-public .trs-date-layout{\n    grid-template-columns:1fr!important;\n    gap:14px!important;\n}\n\n.trs-public .trs-step-card{\n    background:#f8fbff!important;\n    border:1px solid #dbeafe!important;\n    border-radius:20px!important;\n    padding:16px!important;\n    margin-top:14px!important;\n}\n\n.trs-public .trs-step-kicker{\n    display:flex!important;\n    align-items:center!important;\n    gap:10px!important;\n    margin-bottom:12px!important;\n    color:#0f172a!important;\n}\n\n.trs-public .trs-step-kicker span{\n    display:inline-flex!important;\n    align-items:center!important;\n    justify-content:center!important;\n    width:34px!important;\n    height:34px!important;\n    border-radius:12px!important;\n    background:#0f172a!important;\n    color:#fff!important;\n    font-weight:900!important;\n    font-size:13px!important;\n}\n\n.trs-public .trs-step-kicker b{\n    font-size:19px!important;\n    letter-spacing:-.02em!important;\n}\n\n.trs-public .trs-duration-control{\n    display:flex!important;\n    align-items:center!important;\n    justify-content:space-between!important;\n    gap:12px!important;\n    background:#fff!important;\n    border:1px solid #cbd5e1!important;\n    border-radius:18px!important;\n    padding:12px!important;\n    max-width:520px!important;\n}\n\n.trs-public #trs-hours-minus,\n.trs-public #trs-hours-plus{\n    width:54px!important;\n    min-width:54px!important;\n    height:48px!important;\n    min-height:48px!important;\n    padding:0!important;\n    border-radius:14px!important;\n    font-size:24px!important;\n    line-height:1!important;\n    display:inline-flex!important;\n    align-items:center!important;\n    justify-content:center!important;\n    flex:0 0 54px!important;\n}\n\n.trs-public .trs-duration-value{\n    text-align:center!important;\n    flex:1!important;\n    line-height:1.15!important;\n}\n\n.trs-public .trs-duration-value strong{\n    display:block!important;\n    font-size:24px!important;\n    color:#0f172a!important;\n}\n\n.trs-public .trs-duration-value small{\n    display:block!important;\n    font-size:12px!important;\n    color:#64748b!important;\n    margin-top:4px!important;\n}\n\n.trs-public .trs-slots-wrap{\n    margin-top:14px!important;\n    background:#fff!important;\n    border:1px solid #e2e8f0!important;\n    border-radius:18px!important;\n    padding:14px!important;\n}\n\n.trs-public .trs-slots-wrap h4{\n    margin:0 0 10px!important;\n    font-size:16px!important;\n}\n\n.trs-public .trs-day.disabled{\n    pointer-events:none!important;\n    background:#f8fafc!important;\n    color:#94a3b8!important;\n    opacity:.45!important;\n}\n\n.trs-public .trs-slot{\n    min-height:48px!important;\n}\n\n@media(max-width:900px){\n    .trs-public{\n        padding:0 8px!important;\n        margin:8px auto!important;\n    }\n\n    .trs-public .trs-p-steps{\n        display:flex!important;\n        flex-direction:column!important;\n        gap:10px!important;\n    }\n\n    .trs-public .trs-side{\n        order:0!important;\n        position:sticky!important;\n        top:0!important;\n        z-index:60!important;\n        display:flex!important;\n        gap:8px!important;\n        overflow-x:auto!important;\n        padding:10px!important;\n        background:rgba(248,250,252,.98)!important;\n        backdrop-filter:blur(8px)!important;\n        border-radius:18px!important;\n    }\n\n    .trs-public .trs-main{\n        order:1!important;\n    }\n\n    .trs-public .trs-side .step{\n        white-space:nowrap!important;\n        margin:0!important;\n        min-width:max-content!important;\n        font-size:13px!important;\n        padding:10px 12px!important;\n        border-radius:13px!important;\n    }\n\n    .trs-public .trs-p-card{\n        padding:16px!important;\n        border-radius:22px!important;\n    }\n\n    .trs-public .trs-screen-head{\n        align-items:flex-start!important;\n        gap:10px!important;\n    }\n\n    .trs-public .trs-screen-head .trs-btn{\n        width:auto!important;\n        min-width:120px!important;\n    }\n\n    .trs-public .trs-step-card{\n        padding:14px!important;\n        border-radius:18px!important;\n    }\n\n    .trs-public .trs-grid-days{\n        grid-template-columns:repeat(7,minmax(0,1fr))!important;\n        gap:6px!important;\n    }\n\n    .trs-public .trs-day{\n        min-height:54px!important;\n        padding:7px 3px!important;\n        border-radius:12px!important;\n    }\n\n    .trs-public .trs-day small{\n        font-size:10px!important;\n    }\n\n    .trs-public .trs-day b{\n        font-size:18px!important;\n    }\n\n    .trs-public .trs-duration-control{\n        max-width:none!important;\n        width:100%!important;\n        padding:10px!important;\n    }\n\n    .trs-public #trs-hours-minus,\n    .trs-public #trs-hours-plus{\n        width:48px!important;\n        min-width:48px!important;\n        height:44px!important;\n        min-height:44px!important;\n        flex:0 0 48px!important;\n    }\n\n    .trs-public .trs-duration-value strong{\n        font-size:22px!important;\n    }\n\n    .trs-public .trs-slots{\n        grid-template-columns:1fr!important;\n    }\n}\n\n\/* Flujo paso 3: primero fecha, luego duraci\u00f3n\/horarios *\/\n.trs-public .trs-step-kicker-between{\n    justify-content:space-between!important;\n    gap:12px!important;\n}\n\n.trs-public .trs-step-kicker-between > div{\n    display:flex!important;\n    align-items:center!important;\n    gap:10px!important;\n}\n\n.trs-public .trs-change-date{\n    padding:10px 14px!important;\n    font-size:13px!important;\n    border-radius:12px!important;\n    white-space:nowrap!important;\n}\n\n.trs-public .trs-selected-date-pill{\n    display:inline-flex!important;\n    align-items:center!important;\n    gap:8px!important;\n    background:#eef6ff!important;\n    border:1px solid #cfe5ff!important;\n    color:#0f172a!important;\n    border-radius:999px!important;\n    padding:8px 12px!important;\n    font-size:14px!important;\n    font-weight:800!important;\n    margin:0 0 14px!important;\n}\n\n.trs-public .trs-step-date.trs-hidden,\n.trs-public .trs-step-hours.trs-hidden{\n    display:none!important;\n}\n\n\/* Espacios vac\u00edos para ordenar el calendario de lunes a domingo *\/\n.trs-public .trs-day-empty{\n    min-height:72px!important;\n    visibility:hidden!important;\n    pointer-events:none!important;\n}\n\n@media(max-width:900px){\n    .trs-public .trs-step-kicker-between{\n        align-items:flex-start!important;\n    }\n\n    .trs-public .trs-change-date{\n        padding:9px 11px!important;\n        font-size:12px!important;\n    }\n\n    .trs-public .trs-day-empty{\n        min-height:54px!important;\n    }\n}\n\n\/* Pasos superiores: scroll horizontal real en m\u00f3vil *\/\n@media(max-width:900px){\n    .trs-public .trs-p-steps{\n        display:flex!important;\n        flex-direction:column!important;\n        gap:12px!important;\n        overflow:hidden!important;\n        width:100%!important;\n        max-width:100%!important;\n    }\n\n    .trs-public .trs-side{\n        order:0!important;\n        display:flex!important;\n        flex-wrap:nowrap!important;\n        gap:8px!important;\n        overflow-x:auto!important;\n        overflow-y:hidden!important;\n        width:100%!important;\n        max-width:100%!important;\n        box-sizing:border-box!important;\n        padding:10px!important;\n        border-radius:18px!important;\n        -webkit-overflow-scrolling:touch!important;\n        scroll-snap-type:x proximity!important;\n    }\n\n    .trs-public .trs-side .step{\n        flex:0 0 auto!important;\n        min-width:max-content!important;\n        white-space:nowrap!important;\n        margin:0!important;\n        scroll-snap-align:start!important;\n    }\n\n    .trs-public .trs-main{\n        order:1!important;\n        min-width:0!important;\n        width:100%!important;\n        max-width:100%!important;\n    }\n\n    .trs-public .trs-side::-webkit-scrollbar{\n        height:4px!important;\n    }\n\n    .trs-public .trs-side::-webkit-scrollbar-thumb{\n        background:#cbd5e1!important;\n        border-radius:999px!important;\n    }\n}\n\n\/* Bot\u00f3n volver abajo en ingreso Cliente Tudo \/ Externo *\/\n.trs-public .trs-choice-back-bottom{\n    margin-top:18px!important;\n    padding-top:14px!important;\n    border-top:1px solid #e2e8f0!important;\n}\n\n.trs-public .trs-choice-back-bottom .trs-btn{\n    min-width:150px!important;\n}\n\n@media(max-width:900px){\n    .trs-public .trs-choice-back-bottom{\n        margin-top:16px!important;\n        padding-top:12px!important;\n    }\n\n    .trs-public .trs-choice-back-bottom .trs-btn{\n        width:100%!important;\n    }\n\n    .trs-public #trs-direct .trs-row,\n    .trs-public #trs-ident .trs-row{\n        gap:10px!important;\n    }\n\n    .trs-public #trs-direct-next,\n    .trs-public #trs-identify-btn{\n        width:100%!important;\n    }\n}\n\n.trs-public .trs-bottom-actions{\n    display:flex!important;\n    justify-content:flex-start!important;\n    margin-top:18px!important;\n}\n\n.trs-public .trs-bottom-actions .trs-btn{\n    min-width:150px!important;\n}\n\n@media(max-width:900px){\n    .trs-public .trs-bottom-actions .trs-btn{\n        width:100%!important;\n    }\n}\n<\/style>\n            <div class=\"trs-p-hero\"><h2>Reserva de salas Tudo<\/h2><p>Agenda tu sala de forma simple, segura y en l\u00ednea.<\/p><\/div>\n            <div class=\"trs-p-steps\">\n                <div class=\"trs-side\"><div class=\"step active\" data-step-label=\"1\">1. Reserva<\/div><div class=\"step\" data-step-label=\"2\">2. Salas<\/div><div class=\"step\" data-step-label=\"3\">3. Fecha y horas<\/div><div class=\"step\" data-step-label=\"4\">4. Confirmaci\u00f3n<\/div><\/div>\n                <div class=\"trs-main\">\n                    <div id=\"trs-client-bar\" class=\"trs-client-bar trs-hidden\"><\/div>\n                    <div class=\"trs-p-card trs-screen\" data-screen=\"1\">\n                        <h3>\u00bfC\u00f3mo desea reservar?<\/h3><div class=\"trs-choice trs-choice-priority\"><button type=\"button\" data-type=\"directo\" class=\"trs-choice-main\"><b>Pago online<\/b><br><span>Reservar como cliente externo y pagar en l\u00ednea.<\/span><img decoding=\"async\" class=\"trs-direct-safe-logo\" src=\"https:\/\/tudomicilioenundia.cl\/laserena\/wp-content\/uploads\/2024\/11\/pago-seguro-checkout2.png\" alt=\"Pago seguro\"><\/button><button type=\"button\" data-type=\"cliente\" class=\"trs-choice-secondary\"><b>Soy cliente Tudo<\/b><br><span>Usar horas incluidas, paquetes o pagar excedente.<\/span><\/button><\/div><p class=\"trs-packs-cta\">\u00bfNecesitas horas adicionales? <a href=\"https:\/\/tudomicilioenundia.cl\/laserena\/paquetes-horas\/\" class=\"trs-pack-btn\">Ver paquetes<\/a><\/p>\n                        <div id=\"trs-ident\" class=\"trs-hidden\" style=\"margin-top:16px\">\n    <p>Usa tus horas incluidas o paga horas adicionales si superas tu plan.<\/p>\n\n    <div class=\"trs-row\">\n        <input id=\"trs-identifier\" placeholder=\"Correo, tel\u00e9fono o ROL\/RUT\" style=\"min-width:280px\">\n        <button type=\"button\" class=\"trs-btn\" id=\"trs-identify-btn\">Validar cliente<\/button>\n    <\/div>\n\n    <div id=\"trs-ident-msg\"><\/div>\n    <div id=\"trs-client-list\"><\/div>\n\n    <div id=\"trs-verify\" class=\"trs-verify-box trs-hidden\">\n        <b>Confirmar identidad<\/b>\n        <p class=\"trs-small\">Enviaremos un c\u00f3digo al correo y\/o WhatsApp asociado antes de habilitar la reserva.<\/p>\n        <div class=\"trs-row\">\n            <button type=\"button\" class=\"trs-btn\" id=\"trs-send-code\">Enviar c\u00f3digo<\/button>\n            <input id=\"trs-code\" placeholder=\"C\u00f3digo\" class=\"trs-hidden\" style=\"width:130px\">\n            <button type=\"button\" class=\"trs-btn secondary trs-hidden\" id=\"trs-check-code\">Confirmar c\u00f3digo<\/button>\n        <\/div>\n        <div id=\"trs-verify-msg\"><\/div>\n    <\/div>\n\n    <div class=\"trs-bottom-actions trs-choice-back-bottom\">\n        <button type=\"button\" class=\"trs-btn secondary\" id=\"trs-back-choice-client\">Volver<\/button>\n    <\/div>\n<\/div>\n                        <div id=\"trs-direct\" class=\"trs-hidden\" style=\"margin-top:16px\">\n    <p>Reserva como externo y paga en l\u00ednea para confirmar.<\/p>\n\n    <div class=\"trs-row\">\n        <input id=\"trs-direct-name\" placeholder=\"Nombre o empresa\" required>\n        <input id=\"trs-direct-email\" placeholder=\"Correo\" required>\n        <input id=\"trs-direct-phone\" placeholder=\"Tel\u00e9fono\" required>\n        <button type=\"button\" class=\"trs-btn\" id=\"trs-direct-next\">Continuar<\/button>\n    <\/div>\n\n    <p class=\"trs-small\">Antes de pagar, seleccione boleta o factura e ingrese su RUT. Su documento se emitir\u00e1 autom\u00e1ticamente.<\/p>\n    <div id=\"trs-direct-msg\"><\/div>\n\n    <div class=\"trs-bottom-actions trs-choice-back-bottom\">\n        <button type=\"button\" class=\"trs-btn secondary\" id=\"trs-back-choice-direct\">Volver<\/button>\n    <\/div>\n<\/div>\n                    <\/div>\n                    <div class=\"trs-p-card trs-screen trs-hidden\" data-screen=\"2\">\n    <h3>Elige sala<\/h3>\n    <div id=\"trs-rooms\" class=\"trs-room-grid\"><\/div>\n\n    <div class=\"trs-bottom-actions\">\n        <button type=\"button\" class=\"trs-btn secondary\" id=\"trs-back-type\">Volver<\/button>\n    <\/div>\n<\/div>\n                    <div class=\"trs-p-card trs-screen trs-hidden\" data-screen=\"3\">\n    <div class=\"trs-row trs-screen-head\" style=\"justify-content:space-between\">\n        <h3>Elige fecha y horas<\/h3>\n        <button type=\"button\" class=\"trs-btn secondary\" id=\"trs-back-room\">Volver a salas<\/button>\n    <\/div>\n\n    <div class=\"trs-date-layout trs-date-layout-clean\">\n        <section class=\"trs-step-card trs-step-date\">\n            <div class=\"trs-step-kicker\"><span>3A<\/span><b>Elige fecha<\/b><\/div>\n\n            <div class=\"trs-field\">\n                <label>Mes de reserva<\/label>\n                <div class=\"trs-month-nav\">\n                    <button type=\"button\" class=\"trs-month-btn\" id=\"trs-month-prev\">\u2039<\/button>\n                    <div class=\"trs-month-label\" id=\"trs-month-label\">Mes<\/div>\n                    <button type=\"button\" class=\"trs-month-btn\" id=\"trs-month-next\">\u203a<\/button>\n                <\/div>\n            <\/div>\n\n            <div id=\"trs-days\" class=\"trs-grid-days\"><\/div>\n        <\/section>\n\n        <section class=\"trs-step-card trs-step-hours trs-hidden\" id=\"trs-step-hours-box\">\n    <div class=\"trs-step-kicker\">\n    <span>3B<\/span><b>\u00bfCu\u00e1ntas horas deseas reservar?<\/b>\n<\/div>\n\n    <div class=\"trs-selected-date-pill\" id=\"trs-selected-date-pill\"><\/div>\n\n            <div class=\"trs-duration-control\">\n                <button type=\"button\" class=\"trs-btn secondary trs-duration-btn\" id=\"trs-hours-minus\" aria-label=\"Disminuir horas\">\u2212<\/button>\n\n                <div class=\"trs-duration-value\">\n                    <strong><span id=\"trs-hours-view\">1<\/span> hora(s)<\/strong>\n                    <small>Duraci\u00f3n total de la reserva<\/small>\n                <\/div>\n\n                <button type=\"button\" class=\"trs-btn secondary trs-duration-btn\" id=\"trs-hours-plus\" aria-label=\"Aumentar horas\">+<\/button>\n            <\/div>\n\n            <p class=\"trs-small\">El sistema mostrar\u00e1 horarios disponibles seg\u00fan la duraci\u00f3n elegida.<\/p>\n\n            <div class=\"trs-slots-wrap\">\n                <h4>Horarios disponibles<\/h4>\n                <div id=\"trs-slots\" class=\"trs-slots\">\n                    <div class=\"trs-alert\">Selecciona una fecha para ver horarios disponibles.<\/div>\n                <\/div>\n                <div id=\"trs-reserved\" class=\"trs-reserved-list trs-hidden\"><\/div>\n            <\/div>\n        <\/section>\n    <\/div>\n<\/div>\n                    <div class=\"trs-p-card trs-screen trs-hidden\" data-screen=\"4\"><h3>Resumen<\/h3><div id=\"trs-summary\" class=\"trs-summary\"><\/div><p><button type=\"button\" class=\"trs-btn\" id=\"trs-reserve-btn\">Confirmar reserva<\/button> <button type=\"button\" class=\"trs-btn secondary\" id=\"trs-back-btn\">Volver<\/button><\/p><div id=\"trs-final-msg\"><\/div><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n        <script>\n        (function(){\n            const app=document.getElementById('trs-app'); if(!app) return; const ajax=app.dataset.ajax, nonce=app.dataset.nonce; const prefillEmail=\"\"; const roomMorePhotosUrl=\"https:\\\/\\\/tudomicilioenundia.cl\\\/laserena\\\/oficinas-reuniones\\\/\"; const fromPortal=(new URLSearchParams(window.location.search)).get('trs_from_portal')==='1';\n            let state={type:'',client:null,clients:[],room:null,date:'',slot:null,hours:1,direct:{},reserved:false,months:[],monthIndex:0,verifyToken:'',portalToken:'',portalEmail:''}; try{const exp=parseInt(localStorage.getItem('trs_portal_exp')||'0',10); if(exp>Date.now()){state.portalToken=localStorage.getItem('trs_portal_token')||''; state.portalEmail=localStorage.getItem('trs_portal_email')||'';}}catch(e){}\n            const verifyEnabled = true; const clientFutureMonthsAllowed=false;\n            const qs=s=>app.querySelector(s), qsa=s=>Array.from(app.querySelectorAll(s));\n            function esc(s){return String(s||'').replace(\/[&<>\"]\/g,m=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[m]));}\n            function post(action,data){ data=data||{}; data.action='trs_'+action; data.nonce=nonce; return fetch(ajax,{method:'POST',credentials:'same-origin',headers:{'Content-Type':'application\/x-www-form-urlencoded'},body:new URLSearchParams(data)}).then(r=>r.json()); }\n            function screen(n){ qsa('.trs-screen').forEach(x=>x.classList.toggle('trs-hidden',x.dataset.screen!=n)); qsa('.step').forEach(x=>x.classList.toggle('active',x.dataset.stepLabel==n)); }\n            function msg(el,html,ok,bad){ el.innerHTML='<div class=\"trs-alert '+(ok?'trs-ok':'')+' '+(bad?'trs-bad':'')+'\">'+html+'<\/div>'; }\n            function updateClientBar(){\n    const b=qs('#trs-client-bar');\n\n    if(!state.client){\n        b.classList.add('trs-hidden');\n        return;\n    }\n\n    b.classList.remove('trs-hidden');\n\n    if(state.type==='pack'){\n        b.innerHTML='<b>Paquete de horas<\/b> <span class=\"trs-badge ok\">Activo<\/span><br>Correo: <b>'+esc(state.client.email)+'<\/b> \u00b7 Horas disponibles en paquete: <b>'+esc(state.client.packs_available)+'<\/b>';\n        return;\n    }\n\n    b.innerHTML='<b>'+esc(state.client.empresa)+'<\/b> <span class=\"trs-badge ok\">Al d\u00eda<\/span><br>Horas mensuales: <b>'+esc(state.client.hours_monthly)+'<\/b> \u00b7 Usadas: <b>'+esc(state.client.hours_used)+'<\/b> \u00b7 Disponibles: <b>'+esc(state.client.hours_available)+'<\/b> \u00b7 Paquetes: <b>'+esc(state.client.packs_available)+'<\/b>';\n}\n            function showChoiceForm(type){ state.type=type; state.client=null; state.verifyToken=''; qsa('[data-type]').forEach(x=>x.classList.remove('active')); const btn=qs('[data-type=\"'+type+'\"]'); if(btn) btn.classList.add('active'); qs('.trs-choice-priority').classList.add('trs-hidden'); const cta=qs('.trs-packs-cta'); if(cta) cta.classList.add('trs-hidden'); qs('#trs-ident').classList.toggle('trs-hidden',type!=='cliente'); qs('#trs-direct').classList.toggle('trs-hidden',type!=='directo'); qs('#trs-verify').classList.add('trs-hidden'); updateClientBar(); }\n            function resetChoice(){ qsa('[data-type]').forEach(x=>x.classList.remove('active')); qs('.trs-choice-priority').classList.remove('trs-hidden'); const cta=qs('.trs-packs-cta'); if(cta) cta.classList.remove('trs-hidden'); qs('#trs-ident').classList.add('trs-hidden'); qs('#trs-direct').classList.add('trs-hidden'); qs('#trs-verify').classList.add('trs-hidden'); }\n            qsa('[data-type]').forEach(b=>b.onclick=function(){ showChoiceForm(this.dataset.type); });\n            const backChoiceClient=qs('#trs-back-choice-client'); if(backChoiceClient) backChoiceClient.onclick=resetChoice; const backChoiceDirect=qs('#trs-back-choice-direct'); if(backChoiceDirect) backChoiceDirect.onclick=resetChoice;\n            function statusBadge(c){ return '<span class=\"trs-badge '+((c.status==='moroso'||c.status==='deshabilitado')?'bad':'ok')+'\">'+esc(c.status_label)+'<\/span>'; }\n            function resetVerifyUi(){ state.verifyToken=''; qs('#trs-code').classList.add('trs-hidden'); qs('#trs-check-code').classList.add('trs-hidden'); qs('#trs-code').value=''; qs('#trs-verify-msg').innerHTML=''; }\n            function normAccessValue(v){\n    return String(v || '').trim().toLowerCase().replace(\/\\s+\/g,'');\n}\n\nfunction portalSessionMatchesClient(c){\n    \/*\n     * Solo se reutiliza sesi\u00f3n cuando viene desde el portal del cliente.\n     * En la p\u00e1gina p\u00fablica de reservas, escribir un correo de cliente Tudo\n     * SIEMPRE debe pedir c\u00f3digo.\n     *\/\n    if(!fromPortal || !state.portalToken) return false;\n\n    const portalRaw = normAccessValue(state.portalEmail || prefillEmail || '');\n    if(!portalRaw) return false;\n\n    const values = [\n        c.email || '',\n        c.phone || '',\n        c.rut || ''\n    ].map(normAccessValue).filter(Boolean);\n\n    const portalDigits = portalRaw.replace(\/\\D+\/g,'');\n\n    for(const v of values){\n        if(portalRaw === v) return true;\n\n        const vDigits = v.replace(\/\\D+\/g,'');\n        if(portalDigits && vDigits && portalDigits === vDigits) return true;\n    }\n\n    return false;\n}\n\nfunction selectClient(c){\n    state.client = c;\n    state.type = (c && c.type === 'pack') ? 'pack' : 'cliente';\n    updateClientBar();\n    resetVerifyUi();\n\n    if(portalSessionMatchesClient(c)){\n        state.verifyToken = state.portalToken;\n        msg(qs('#trs-ident-msg'),'Sesi\u00f3n activa detectada. Puede continuar sin solicitar otro c\u00f3digo.',true,false);\n        loadRooms();\n        screen(2);\n        return;\n    }\n\n    state.verifyToken = '';\n\n    if(verifyEnabled){\n        qs('#trs-verify').classList.remove('trs-hidden');\n        msg(qs('#trs-verify-msg'),'Confirma el c\u00f3digo de seguridad para continuar.',false,false);\n    } else {\n        loadRooms();\n        screen(2);\n    }\n}\n            function renderClients(list, blocked, message){ const wrap=qs('#trs-client-list'); wrap.innerHTML=''; qs('#trs-verify').classList.add('trs-hidden'); if(message) msg(qs('#trs-ident-msg'),message,!blocked,blocked); if(!list.length){return;} let html='<div class=\"trs-clients-heading\"><h5>Empresas asociadas detectadas<\/h5><\/div><div class=\"trs-choice\">'; list.forEach(c=>{ const isBad=(c.status==='moroso'||c.status==='deshabilitado'); const pay=c.pay_url||''; html+='<div class=\"trs-client-card '+(isBad?'trs-client-bad':'')+'\" data-client-id=\"'+c.id+'\"><div class=\"trs-card-title\"><b class=\"trs-client-company-blue\">'+esc(c.empresa)+'<\/b>'+statusBadge(c)+'<\/div><p>Mensuales: <b>'+esc(c.hours_monthly)+'<\/b> \u00b7 Usadas: <b>'+esc(c.hours_used)+'<\/b> \u00b7 Disponibles: <b>'+esc(c.hours_available)+'<\/b> \u00b7 Paquetes: <b>'+esc(c.packs_available)+'<\/b><\/p>'+(isBad?(pay?'<a class=\"trs-pay-link\" target=\"_blank\" href=\"'+esc(pay)+'\">Ir al pago<\/a>':'<span class=\"trs-pay-link\">Pago pendiente sin enlace detectado<\/span>'):'')+'<\/div>'; }); html+='<\/div>'; if(blocked){ html+='<div class=\"trs-alert trs-bad\">Por seguridad, no se habilita la reserva mientras exista una empresa asociada morosa o deshabilitada.<\/div>'; } wrap.innerHTML=html; if(blocked) return; wrap.querySelectorAll('[data-client-id]').forEach(card=>card.onclick=function(){ const id=parseInt(this.dataset.clientId,10); wrap.querySelectorAll('.trs-client-card').forEach(x=>x.classList.remove('active')); this.classList.add('active'); selectClient(list.find(x=>parseInt(x.id,10)===id)); }); if(!blocked && list.length===1){ const c=list[0]; const card=wrap.querySelector('[data-client-id]'); if(card) card.classList.add('active'); selectClient(c); } }\n            function trsCodeCooldown(btn, seconds, finalText){\n                if(!btn) return;\n                const original = btn.dataset.originalText || btn.textContent;\n                btn.dataset.originalText = original;\n                let left = seconds || 45;\n                btn.disabled = true;\n                btn.textContent = 'Reenviar en '+left+'s';\n                const timer = setInterval(function(){\n                    left--;\n                    if(left <= 0){ clearInterval(timer); btn.disabled = false; btn.textContent = finalText || 'Reenviar c\u00f3digo'; return; }\n                    btn.textContent = 'Reenviar en '+left+'s';\n                },1000);\n            }\n            qs('#trs-send-code').onclick=function(){\n    if(!state.client){\n        msg(qs('#trs-verify-msg'),'Seleccione una empresa.');\n        return;\n    }\n\n    const btn=this;\n    btn.disabled=true;\n    btn.textContent='Enviando...';\n\n    post('verify_send_code',{\n        identifier:qs('#trs-identifier').value,\n        client_id:state.client.id,\n        type:state.type\n    })\n    .then(function(res){\n        btn.disabled=false;\n\n        if(!res.success){\n            btn.textContent='Enviar c\u00f3digo';\n            msg(qs('#trs-verify-msg'),(res.data&&res.data.message)||'No se pudo enviar el c\u00f3digo.');\n            return;\n        }\n\n        qs('#trs-code').classList.remove('trs-hidden');\n        qs('#trs-check-code').classList.remove('trs-hidden');\n\n        msg(qs('#trs-verify-msg'),(res.data&&res.data.message)||'C\u00f3digo enviado.',true);\n        trsCodeCooldown(btn,45,'Reenviar c\u00f3digo');\n    })\n    .catch(function(err){\n        btn.disabled=false;\n        btn.textContent='Enviar c\u00f3digo';\n        msg(qs('#trs-verify-msg'),err.message||'No se pudo conectar con el servidor.');\n    });\n};\n            qs('#trs-check-code').onclick=function(){\n    if(!state.client){\n        return;\n    }\n\n    const btn=this;\n    const code=qs('#trs-code').value.trim();\n\n    if(!code){\n        msg(qs('#trs-verify-msg'),'Ingrese el c\u00f3digo recibido.');\n        return;\n    }\n\n    btn.disabled=true;\n\n    post('verify_check_code',{\n        identifier:qs('#trs-identifier').value,\n        client_id:state.client.id,\n        type:state.type,\n        code:code\n    })\n    .then(function(res){\n        btn.disabled=false;\n\n        if(!res.success){\n            msg(qs('#trs-verify-msg'),(res.data&&res.data.message)||'C\u00f3digo inv\u00e1lido.');\n            return;\n        }\n\n        state.verifyToken=res.data.token||'';\n\n        msg(qs('#trs-verify-msg'),'Identidad confirmada. Ya puede elegir sala.',true);\n        loadRooms();\n        screen(2);\n    })\n    .catch(function(err){\n        btn.disabled=false;\n        msg(qs('#trs-verify-msg'),err.message||'No se pudo conectar con el servidor.');\n    });\n};\n            qs('#trs-identify-btn').onclick=function(){ const v=qs('#trs-identifier').value.trim(); if(!v){msg(qs('#trs-ident-msg'),'Ingresa correo, tel\u00e9fono o ROL\/RUT.');return;} post('identify',{identifier:v}).then(res=>{ if(!res.success){msg(qs('#trs-ident-msg'),res.data.message||'No se pudo validar.');return;} state.clients=res.data.clients||[]; renderClients(state.clients, !!res.data.blocked, res.data.message||''); }); };\n            const backType=qs('#trs-back-type'); \nif(backType) backType.onclick=function(){screen(1);}; \n\nconst backRoom=qs('#trs-back-room');\n\nfunction trsShowDateStep(){\n    const dateBox = qs('.trs-step-date');\n    const hoursBox = qs('#trs-step-hours-box');\n    const slotsBox = qs('#trs-slots');\n\n    if(hoursBox){ hoursBox.classList.add('trs-hidden'); }\n    if(dateBox){ dateBox.classList.remove('trs-hidden'); }\n    if(backRoom){ backRoom.textContent='Volver a salas'; }\n\n    state.slot=null;\n\n    if(slotsBox){\n        slotsBox.innerHTML='<div class=\"trs-alert\">Selecciona una fecha para ver horarios disponibles.<\/div>';\n    }\n}\n\nfunction trsShowHoursStep(label){\n    const dateBox = qs('.trs-step-date');\n    const hoursBox = qs('#trs-step-hours-box');\n    const selectedPill = qs('#trs-selected-date-pill');\n\n    if(dateBox){ dateBox.classList.add('trs-hidden'); }\n    if(hoursBox){ hoursBox.classList.remove('trs-hidden'); }\n    if(selectedPill){ selectedPill.textContent='Fecha seleccionada: '+label; }\n    if(backRoom){ backRoom.textContent='Volver a fechas'; }\n}\n\nif(backRoom){\n    backRoom.onclick=function(){\n        const hoursBox = qs('#trs-step-hours-box');\n\n        if(hoursBox && !hoursBox.classList.contains('trs-hidden')){\n            trsShowDateStep();\n        }else{\n            screen(2);\n        }\n    };\n} qs('#trs-direct-next').onclick=function(){ state.direct={name:qs('#trs-direct-name').value.trim(),email:qs('#trs-direct-email').value.trim(),phone:qs('#trs-direct-phone').value.trim()}; if(!state.direct.name||!state.direct.email||!state.direct.phone){msg(qs('#trs-direct-msg')||qs('#trs-ident-msg'),'Ingresa nombre o empresa, correo y tel\u00e9fono para reservar como externo.');return;} loadRooms(); screen(2); };\n            function loadRooms(){ post('rooms',{}).then(res=>{ const wrap=qs('#trs-rooms'); wrap.innerHTML=''; if(!res.success){wrap.innerHTML='No se pudieron cargar salas.';return;} res.data.rooms.forEach(r=>{ let d=document.createElement('div'); d.className='trs-room'; let desc=String(r.descripcion||'').split(\/\\n|\u2022|- \/).map(x=>x.trim()).filter(Boolean).slice(0,5); d.innerHTML=(r.foto_url?'<img decoding=\"async\" src=\"'+esc(r.foto_url)+'\">':'')+'<div class=\"trs-room-top\"><h3>'+esc(r.nombre)+'<\/h3><a class=\"trs-room-more\" href=\"'+esc(roomMorePhotosUrl||'#')+'\" target=\"_blank\" rel=\"noopener\" onclick=\"event.stopPropagation();\">Ver m\u00e1s fotos<\/a><\/div>'+(desc.length?'<div class=\"trs-room-features\">'+desc.map(x=>'<span class=\"trs-room-chip\">'+esc(x)+'<\/span>').join('')+'<\/div>':'')+'<p><b>'+esc(r.precio_neto)+'<\/b> neto por hora<\/p>'; d.onclick=function(){state.room=r; qsa('.trs-room').forEach(x=>x.classList.remove('active')); d.classList.add('active'); buildMonths(); screen(3);}; wrap.appendChild(d); }); }); }\n            function buildMonths(){\n                state.months=[]; state.monthIndex=0;\n                const now=new Date();\n                let maxMonths=(state.type==='cliente' && !clientFutureMonthsAllowed) ? 1 : 4; for(let i=0;i<maxMonths;i++){\n                    let d=new Date(now.getFullYear(),now.getMonth()+i,1);\n                    let ym=d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0');\n                    state.months.push({ym:ym,label:d.toLocaleDateString('es-CL',{month:'long',year:'numeric'})});\n                }\n                renderMonth();\n            }\n            function renderMonth(){\n                if(!state.months.length) return;\n                const item=state.months[state.monthIndex] || state.months[0];\n                qs('#trs-month-label').textContent=item.label;\n                qs('#trs-month-prev').disabled=state.monthIndex<=0;\n                qs('#trs-month-next').disabled=state.monthIndex>=state.months.length-1;\n                buildDays(item.ym);\n            }\n            qs('#trs-month-prev').onclick=function(){ if(state.monthIndex>0){ state.monthIndex--; renderMonth(); } };\n            qs('#trs-month-next').onclick=function(){ if(state.monthIndex<state.months.length-1){ state.monthIndex++; renderMonth(); } };\n            qs('#trs-hours-minus').onclick=function(){state.hours=Math.max(1,state.hours-1); updateHours();};\n            qs('#trs-hours-plus').onclick=function(){state.hours=Math.min(12,state.hours+1); updateHours();};\n            function updateHours(){\n    qs('#trs-hours-view').textContent=state.hours;\n    state.slot=null;\n\n    const slotsBox = qs('#trs-slots');\n\n    if(slotsBox){\n        slotsBox.innerHTML = state.date\n            ? ''\n            : '<div class=\"trs-alert\">Selecciona una fecha para ver horarios disponibles.<\/div>';\n    }\n\n    if(state.date){\n        loadSlots();\n    }\n}\n            function localToday(){ const d=new Date(); const y=d.getFullYear(); const m=String(d.getMonth()+1).padStart(2,'0'); const dd=String(d.getDate()).padStart(2,'0'); return y+'-'+m+'-'+dd; }\n            function buildDays(ym){\n    if(!ym){return;}\n\n    const [y,m]=ym.split('-').map(Number);\n    const days=new Date(y,m,0).getDate();\n    const wrap=qs('#trs-days');\n\n    wrap.innerHTML='';\n    qs('#trs-slots').innerHTML='<div class=\"trs-alert\">Selecciona una fecha para ver horarios disponibles.<\/div>';\n\n    state.date='';\n    state.slot=null;\n    \n    trsShowDateStep();\n\n    const dateBox = qs('.trs-step-date');\n    const hoursBox = qs('#trs-step-hours-box');\n    const selectedPill = qs('#trs-selected-date-pill');\n\n    if(dateBox){ dateBox.classList.remove('trs-hidden'); }\n    if(hoursBox){ hoursBox.classList.add('trs-hidden'); }\n    if(selectedPill){ selectedPill.textContent=''; }\n\n    const names=['Dom','Lun','Mar','Mi\u00e9','Jue','Vie','S\u00e1b'];\n\n    \/*\n     * Calendario lunes a domingo:\n     * JS getDay(): domingo=0, lunes=1, martes=2...\n     * leading convierte lunes en 0, martes en 1... domingo en 6.\n     *\/\n    const firstDow = new Date(y,m-1,1).getDay();\n    const leading = (firstDow + 6) % 7;\n\n    for(let i=0; i<leading; i++){\n        let empty=document.createElement('div');\n        empty.className='trs-day-empty';\n        wrap.appendChild(empty);\n    }\n\n    for(let d=1; d<=days; d++){\n        let date=ym+'-'+String(d).padStart(2,'0');\n        let jsd=new Date(y,m-1,d);\n        let dow=jsd.getDay();\n        let isWeekend=(dow===0 || dow===6);\n\n        let el=document.createElement('button');\n        el.type='button';\n        el.className='trs-day';\n        el.innerHTML='<small>'+names[dow]+'<\/small><b>'+d+'<\/b>';\n\n        if(date<localToday() || isWeekend){\n            el.classList.add('disabled');\n        }\n\n        if(isWeekend){\n            el.title='No atendemos reservas s\u00e1bados ni domingos';\n        }\n\n        el.onclick=function(){\n            if(el.classList.contains('disabled')) return;\n\n            state.date=date;\n            qsa('.trs-day').forEach(x=>x.classList.remove('active'));\n            el.classList.add('active');\n\n            const label = names[dow]+' '+String(d).padStart(2,'0')+'\/'+String(m).padStart(2,'0')+'\/'+y;\n\n            trsShowHoursStep(label);\nloadSlots();\n        };\n\n        wrap.appendChild(el);\n    }\n}\n            function loadSlots(){ post('availability',{room_id:state.room.id,date:state.date,hours:state.hours}).then(res=>{ const wrap=qs('#trs-slots'); const reservedBox=qs('#trs-reserved'); wrap.innerHTML=''; if(reservedBox){reservedBox.innerHTML='';reservedBox.classList.add('trs-hidden');} if(!res.success){wrap.innerHTML='<div class=\"trs-alert\">'+(res.data.message||'Sin disponibilidad.')+'<\/div>';return;} if(reservedBox && res.data.reserved && res.data.reserved.length){reservedBox.classList.remove('trs-hidden'); reservedBox.innerHTML='<h4>Horarios ya reservados<\/h4><div class=\"trs-reserved-items\">'+res.data.reserved.map(r=>'<span class=\"trs-reserved-item\">'+esc(r.label)+'<\/span>').join('')+'<\/div>'; } if(!res.data.slots.length){wrap.innerHTML='<div class=\"trs-alert\">No hay tramos disponibles para esa duraci\u00f3n.<\/div>';return;} res.data.slots.forEach(sl=>{ let b=document.createElement('button'); b.type='button'; b.className='trs-slot'; b.textContent=sl.label; b.onclick=function(){state.slot=sl; qsa('.trs-slot').forEach(x=>x.classList.remove('active')); b.classList.add('active'); preview();}; wrap.appendChild(b); }); }); }\n            function preview(){ post('preview',{type:state.type,client_id:state.client?state.client.id:0,room_id:state.room.id,date:state.date,start:state.slot.start,hours:state.hours,identifier:qs('#trs-identifier').value,direct_name:state.direct.name||'',direct_email:state.direct.email||'',direct_phone:state.direct.phone||'',verify_token:state.verifyToken||''}).then(res=>{ if(!res.success){alert(res.data.message||'No se pudo generar resumen.');return;} qs('#trs-summary').innerHTML=res.data.html; qs('#trs-reserve-btn').disabled=false; state.reserved=false; screen(4); }); }\n            qs('#trs-back-btn').onclick=function(){ if(state.reserved){ window.location.href=window.location.href.split('#')[0]; return; } screen(3);}; qs('#trs-reserve-btn').onclick=function(){ if(state.reserved) return; state.reserved=true; this.disabled=true; qs('#trs-final-msg').innerHTML='Procesando...'; post('reserve',{type:state.type,client_id:state.client?state.client.id:0,room_id:state.room.id,date:state.date,start:state.slot.start,hours:state.hours,identifier:qs('#trs-identifier').value,direct_name:state.direct.name||'',direct_email:state.direct.email||'',direct_phone:state.direct.phone||'',verify_token:state.verifyToken||''}).then(res=>{ if(!res.success){state.reserved=false; qs('#trs-reserve-btn').disabled=false; msg(qs('#trs-final-msg'),res.data.message||'No se pudo reservar.');return;} if(res.data.redirect){ window.location.href=res.data.redirect; return; } msg(qs('#trs-final-msg'),res.data.message,true); qs('#trs-reserve-btn').style.display='none'; qs('#trs-back-btn').textContent='Volver al inicio'; }).catch(()=>{state.reserved=false; qs('#trs-reserve-btn').disabled=false; msg(qs('#trs-final-msg'),'Error de conexi\u00f3n.');}); };\n\n            if(fromPortal && (state.portalToken||state.portalEmail||prefillEmail)){\n                const ident=(state.portalEmail||prefillEmail||'').trim();\n                const clienteBtn=qs('[data-type=\"cliente\"]');\n                if(clienteBtn && ident){\n                    showChoiceForm('cliente');\n                    qs('#trs-identifier').value=ident;\n                    post('identify',{identifier:ident}).then(res=>{\n                        if(res.success && (res.data.clients||[]).length){\n                            state.clients=res.data.clients||[];\n                            renderClients(state.clients, !!res.data.blocked, res.data.message||'');\n                        } else {\n                            const directoBtn=qs('[data-type=\"directo\"]');\n                            if(directoBtn){ showChoiceForm('directo'); qs('#trs-direct-email').value=ident; }\n                        }\n                    });\n                }\n            }\n\n        })();\n        <\/script>\n        <div class=\"kc-elm kc-css-767224\" style=\"height: 100px; clear: both; width:100%;\"><\/div><\/div><\/div><\/div><\/div><\/section><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"tpl-footer_v2.php","meta":{"footnotes":""},"class_list":["post-24630","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/pages\/24630","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/comments?post=24630"}],"version-history":[{"count":12,"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/pages\/24630\/revisions"}],"predecessor-version":[{"id":24948,"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/pages\/24630\/revisions\/24948"}],"wp:attachment":[{"href":"https:\/\/tudomicilioenundia.cl\/laserena\/wp-json\/wp\/v2\/media?parent=24630"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}