{"id":753,"date":"2025-12-28T11:10:41","date_gmt":"2025-12-28T11:10:41","guid":{"rendered":"https:\/\/5.olasdevida.es\/?page_id=753"},"modified":"2025-12-29T17:00:26","modified_gmt":"2025-12-29T17:00:26","slug":"pewr28-12","status":"publish","type":"page","link":"https:\/\/5.olasdevida.es\/index.php\/pewr28-12\/","title":{"rendered":"pewr28\/12"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"753\" class=\"elementor elementor-753\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4c9b63f e-con-full e-flex e-con e-parent\" data-id=\"4c9b63f\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e01b5e1 elementor-widget elementor-widget-html\" data-id=\"e01b5e1\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n.ov-video-admin{font-family:system-ui,-apple-system,sans-serif;color:#e5e7eb}\r\n.ov-video-shell{\r\n  background:radial-gradient(circle at top,#0f172a,#020617 60%);\r\n  border-radius:1.8rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.8rem 2rem;\r\n  box-shadow:0 20px 60px rgba(0,0,0,.65);\r\n  max-width:1600px;\r\n  margin:0 auto;\r\n}\r\n\r\n\/* CABECERA: T\u00cdTULO + PUNTO AZUL (ACCESO PANEL) *\/\r\n.ov-video-header{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:.75rem;\r\n  margin-bottom:1.4rem;\r\n}\r\n.ov-video-header-left{text-align:left;}\r\n.ov-video-title{\r\n  font-size:2.3rem;\r\n  font-weight:800;\r\n  background:linear-gradient(90deg,#0ea5e9,#3b82f6);\r\n  -webkit-background-clip:text;\r\n  background-clip:text;\r\n  color:transparent;\r\n}\r\n.ov-video-sub{\r\n  font-size:.95rem;\r\n  color:#94a3b8;\r\n  margin-top:.35rem;\r\n}\r\n\r\n\/* PUNTO AZUL *\/\r\n#ov-admin-circle{\r\n  width:28px;\r\n  height:28px;\r\n  border-radius:999px;\r\n  background:#0ea5e9;\r\n  border:1px solid #38bdf8;\r\n  cursor:pointer;\r\n  flex-shrink:0;\r\n  transition:.16s;\r\n}\r\n#ov-admin-circle:hover{background:#38bdf8;}\r\n#ov-admin-circle:active{\r\n  background:#0284c7;\r\n  transform:scale(.94);\r\n}\r\n\r\n\/* GRID PRINCIPAL *\/\r\n.ov-main-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,3fr) minmax(0,1.2fr);\r\n  gap:1.6rem;\r\n  align-items:start;\r\n}\r\n@media (max-width:1300px){\r\n  .ov-main-grid{grid-template-columns:1fr;}\r\n}\r\n\r\n\/* PLAYER *\/\r\n.ov-player{\r\n  background:#020617;\r\n  border-radius:1.4rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.6rem;\r\n}\r\n.ov-player-iframe{\r\n  width:100%;\r\n  aspect-ratio:16\/9;\r\n  border-radius:1rem;\r\n  border:none;\r\n  background:#000;\r\n}\r\n.ov-player-meta{margin-top:1rem;}\r\n.ov-player-title{font-size:1.25rem;font-weight:600;margin-bottom:.35rem;}\r\n.ov-player-desc{font-size:.93rem;color:#9ca3af;line-height:1.5;}\r\n\r\n\/* LISTA + BUSCADOR *\/\r\n.ov-list{\r\n  background:#020617;\r\n  border-radius:1.6rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.1rem;\r\n  max-height:580px;\r\n  display:flex;\r\n  flex-direction:column;\r\n}\r\n.ov-search-section{\r\n  padding:0 0 .7rem 0;\r\n  border-bottom:1px solid #1f2937;\r\n  margin-bottom:.55rem;\r\n}\r\n.ov-search-input{\r\n  width:100%;\r\n  background:#020617;\r\n  border:1px solid #1f2937;\r\n  border-radius:.9rem;\r\n  padding:.5rem .8rem;\r\n  color:#e5e7eb;\r\n  font-size:.8rem;\r\n  outline:none;\r\n  font-weight:500;\r\n  margin-bottom:.35rem;\r\n}\r\n.ov-search-input:focus{\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 2px rgba(14,165,233,.25);\r\n}\r\n.ov-chips-container{\r\n  display:flex;\r\n  gap:.35rem;\r\n  overflow-x:auto;\r\n  padding:.1rem 0;\r\n  scrollbar-width:thin;\r\n}\r\n.ov-chips-container::-webkit-scrollbar{height:4px;}\r\n.ov-chips-container::-webkit-scrollbar-track{background:transparent;}\r\n.ov-chips-container::-webkit-scrollbar-thumb{\r\n  background:#1f2937;\r\n  border-radius:999px;\r\n}\r\n.ov-chip{\r\n  padding:.25rem .7rem;\r\n  border-radius:999px;\r\n  font-size:.7rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n  white-space:nowrap;\r\n  flex-shrink:0;\r\n  transition:.2s;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  border:1px solid #4b5563;\r\n}\r\n.ov-chip.active,\r\n.ov-chip:hover{\r\n  background:#0ea5e9!important;\r\n  color:#020617!important;\r\n  transform:translateY(-1px);\r\n}\r\n\r\n.ov-list-title{\r\n  font-size:.95rem;\r\n  font-weight:600;\r\n  color:#0ea5e9;\r\n  margin-bottom:.5rem;\r\n}\r\n.ov-video-list-container{\r\n  flex:1;\r\n  overflow:auto;\r\n  min-height:0;\r\n}\r\n.ov-list-item{\r\n  display:flex;\r\n  gap:.75rem;\r\n  padding:.8rem .55rem;\r\n  border-radius:.9rem;\r\n  cursor:pointer;\r\n  margin-bottom:.4rem;\r\n  transition:.18s;\r\n  background:rgba(15,23,42,.7);\r\n}\r\n.ov-list-item:hover{\r\n  background:rgba(14,165,233,.18);\r\n  transform:translateX(4px);\r\n}\r\n.ov-list-item.active{background:rgba(14,165,233,.35);}\r\n.ov-thumb{\r\n  width:100px;\r\n  height:56px;\r\n  border-radius:.6rem;\r\n  overflow:hidden;\r\n  flex-shrink:0;\r\n  background:#111827;\r\n}\r\n.ov-thumb img{\r\n  width:100%;\r\n  height:100%;\r\n  object-fit:cover;\r\n  display:block;\r\n}\r\n.ov-list-text{flex:1;min-width:0;}\r\n.ov-list-item-title{\r\n  font-size:1rem;\r\n  font-weight:600;\r\n  margin-bottom:.15rem;\r\n  white-space:nowrap;\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n}\r\n.ov-list-item-desc{\r\n  font-size:.83rem;\r\n  color:#9ca3af;\r\n  line-height:1.35;\r\n}\r\n\r\n\/* TOAST *\/\r\n#ov-toast{\r\n  position:fixed;\r\n  bottom:24px;\r\n  left:50%;\r\n  transform:translateX(-50%);\r\n  background:#10b981;\r\n  color:#01110a;\r\n  padding:0.6rem 1.5rem;\r\n  border-radius:999px;\r\n  font-size:.85rem;\r\n  font-weight:600;\r\n  z-index:9999;\r\n  opacity:0;\r\n  transition:all .25s;\r\n}\r\n#ov-toast.show{\r\n  opacity:1;\r\n  transform:translateX(-50%) translateY(-8px);\r\n}\r\n\r\n\/* OVERLAY LOGIN + PANEL *\/\r\n.ov-overlay{\r\n  position:fixed;\r\n  inset:0;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  background:rgba(2,6,23,.96);\r\n  z-index:9990;\r\n  padding:1rem;\r\n}\r\n\r\n\/* TARJETA LOGIN *\/\r\n.ov-login-card{\r\n  background:#020617;\r\n  border-radius:1.75rem;\r\n  border:1px solid #1f2937;\r\n  padding:2rem 1.7rem;\r\n  width:100%;\r\n  max-width:420px;\r\n  text-align:center;\r\n  box-shadow:0 30px 80px rgba(0,0,0,.85);\r\n}\r\n.ov-login-title{\r\n  font-size:1.4rem;\r\n  font-weight:800;\r\n}\r\n.ov-login-sub{\r\n  margin-top:0.3rem;\r\n  font-size:.9rem;\r\n  color:#94a3b8;\r\n}\r\n.ov-login-input{\r\n  width:100%;\r\n  margin:1.2rem 0 0.4rem;\r\n  padding:0.85rem 1rem;\r\n  border-radius:0.9rem;\r\n  border:2px solid #475569;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:1rem;\r\n}\r\n.ov-login-input:focus{\r\n  outline:none;\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 3px rgba(14,165,233,.4);\r\n}\r\n.ov-login-btns{\r\n  margin-top:1rem;\r\n  display:flex;\r\n  gap:0.6rem;\r\n  justify-content:center;\r\n}\r\n.ov-btn{\r\n  padding:0.7rem 1.4rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  cursor:pointer;\r\n  font-size:.85rem;\r\n  font-weight:600;\r\n}\r\n.ov-btn-primary{background:#0ea5e9;color:#031016;}\r\n.ov-btn-secondary{background:#020617;color:#e5e7eb;border:1px solid #4b5563;}\r\n.ov-login-error{\r\n  margin-top:0.7rem;\r\n  min-height:1.1rem;\r\n  font-size:.85rem;\r\n  color:#fca5a5;\r\n}\r\n\r\n\/* PANEL ADMIN *\/\r\n.ov-admin-panel{\r\n  display:none;\r\n  background:radial-gradient(circle at top,#0f172a,#020617 55%);\r\n  padding:2rem 2.2rem;\r\n  border-radius:1.8rem;\r\n  border:1px solid #1f2937;\r\n  max-width:1200px;\r\n  max-height:90vh;\r\n  margin:0 auto;\r\n  box-shadow:0 20px 60px rgba(0,0,0,.65);\r\n  overflow:auto;\r\n}\r\n.ov-admin-header{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  gap:1rem;\r\n  margin-bottom:1.5rem;\r\n}\r\n.ov-admin-title{\r\n  font-size:1.6rem;\r\n  font-weight:800;\r\n  background:linear-gradient(90deg,#0ea5e9,#7dd3fc);\r\n  -webkit-background-clip:text;\r\n  background-clip:text;\r\n  color:transparent;\r\n}\r\n.ov-admin-badge{\r\n  font-size:.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-close{\r\n  padding:0.6rem 1.3rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:#ef4444;\r\n  color:#f9fafb;\r\n  font-size:.9rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n\r\n\/* STATS *\/\r\n.ov-admin-stats{\r\n  display:grid;\r\n  grid-template-columns:repeat(auto-fit,minmax(180px,1fr));\r\n  gap:1rem;\r\n  margin-bottom:1.8rem;\r\n}\r\n.ov-admin-stat{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.1rem;\r\n  border:1px solid #1f2937;\r\n  padding:1rem 1.2rem;\r\n}\r\n.ov-admin-stat-label{\r\n  font-size:.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-stat-value{\r\n  margin-top:0.4rem;\r\n  font-size:1.4rem;\r\n  font-weight:700;\r\n  color:#0ea5e9;\r\n}\r\n\r\n\/* GRID PANEL *\/\r\n.ov-admin-grid{\r\n  display:grid;\r\n  grid-template-columns:1.6fr 1.1fr;\r\n  gap:1.5rem;\r\n}\r\n@media (max-width:900px){\r\n  .ov-admin-grid{grid-template-columns:1fr;}\r\n}\r\n\r\n\/* BLOQUES PANEL *\/\r\n.ov-admin-block{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.3rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.4rem 1.5rem;\r\n}\r\n.ov-admin-block-title{\r\n  font-size:1rem;\r\n  font-weight:600;\r\n  margin-bottom:0.8rem;\r\n  color:#0ea5e9;\r\n}\r\n\r\n\/* TABLA *\/\r\n.ov-admin-table-wrap{\r\n  max-height:460px;\r\n  overflow:auto;\r\n  border-radius:1rem;\r\n  border:1px solid #1f2937;\r\n}\r\n.ov-admin-table{\r\n  width:100%;\r\n  border-collapse:collapse;\r\n  font-size:.85rem;\r\n}\r\n.ov-admin-table thead{\r\n  position:sticky;\r\n  top:0;\r\n  background:#020617;\r\n  z-index:1;\r\n}\r\n.ov-admin-table th,\r\n.ov-admin-table td{\r\n  padding:0.55rem 0.6rem;\r\n  border-bottom:1px solid #1f2937;\r\n}\r\n.ov-admin-table th{\r\n  text-align:left;\r\n  font-size:.75rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-table tbody tr:hover{\r\n  background:rgba(15,118,110,.12);\r\n}\r\n.ov-admin-actions{\r\n  white-space:nowrap;\r\n}\r\n.ov-admin-actions button{\r\n  border:none;\r\n  padding:0.2rem 0.7rem;\r\n  border-radius:999px;\r\n  font-size:.75rem;\r\n  margin-right:0.25rem;\r\n  cursor:pointer;\r\n}\r\n.ov-btn-edit{background:#f59e0b;color:#111827;}\r\n.ov-btn-del{background:#ef4444;color:#f9fafb;}\r\n\r\n\/* FORM ADMIN *\/\r\n.ov-admin-input,\r\n.ov-admin-textarea{\r\n  width:100%;\r\n  padding:0.7rem 0.85rem;\r\n  border-radius:0.9rem;\r\n  border:1px solid #374151;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:.9rem;\r\n  margin-bottom:0.7rem;\r\n}\r\n.ov-admin-textarea{\r\n  min-height:80px;\r\n  resize:vertical;\r\n}\r\n.ov-admin-input:focus,\r\n.ov-admin-textarea:focus{\r\n  outline:none;\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 2px rgba(14,165,233,.35);\r\n}\r\n.ov-admin-btn-row{\r\n  display:flex;\r\n  justify-content:flex-end;\r\n  gap:0.7rem;\r\n  margin-top:0.4rem;\r\n}\r\n.ov-admin-btn-secondary{\r\n  padding:0.55rem 1.1rem;\r\n  border-radius:999px;\r\n  border:1px solid #4b5563;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:.8rem;\r\n  cursor:pointer;\r\n}\r\n.ov-admin-btn-primary{\r\n  padding:0.55rem 1.2rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:#0ea5e9;\r\n  color:#02121f;\r\n  font-size:.8rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n<\/style>\r\n\r\n<div class=\"ov-video-admin\">\r\n  <div id=\"ov-toast\"><\/div>\r\n\r\n  <div class=\"ov-video-shell\">\r\n    <div class=\"ov-video-header\">\r\n      <div class=\"ov-video-header-left\">\r\n        <h2 class=\"ov-video-title\">\ud83c\udfac Reproductor de v\u00eddeos \u00b7 Olas de Vida<\/h2>\r\n        <p class=\"ov-video-sub\">Selecciona un v\u00eddeo del listado para verlo en el reproductor principal.<\/p>\r\n      <\/div>\r\n      <button id=\"ov-admin-circle\" type=\"button\" title=\"Panel de control\"><\/button>\r\n    <\/div>\r\n\r\n    <div class=\"ov-main-grid\">\r\n      <!-- PLAYER -->\r\n      <div class=\"ov-player\">\r\n        <iframe\r\n          id=\"ov-player-frame\"\r\n          class=\"ov-player-iframe\"\r\n          src=\"https:\/\/www.youtube.com\/embed\/vLMNtaTYbF4?rel=0&autoplay=0\"\r\n          allowfullscreen\r\n          allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\">\r\n        <\/iframe>\r\n        <div class=\"ov-player-meta\">\r\n          <div class=\"ov-player-title\" id=\"ov-player-title\">Conozca todo sobre el c\u00e1ncer<\/div>\r\n          <div class=\"ov-player-desc\" id=\"ov-player-desc\">\r\n            Onc\u00f3logo Cl\u00ednica Universidad de Navarra \u00b7 V\u00cdDEO INICIAL CARGADO.\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- LISTA -->\r\n      <div class=\"ov-list\">\r\n        <div class=\"ov-search-section\">\r\n          <input\r\n            type=\"text\"\r\n            class=\"ov-search-input\"\r\n            id=\"ov-search-input\"\r\n            placeholder=\"\ud83d\udd0d Buscar tratamientos, apoyo, tipos de c\u00e1ncer...\">\r\n          <div class=\"ov-chips-container\" id=\"ov-chips-container\">\r\n            <span class=\"ov-chip active\" data-filter=\"all\">Todos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"tratamientos\">Tratamientos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"apoyo\">Apoyo emocional<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"familiares\">Familiares<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"tipos\">Tipos de c\u00e1ncer<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"ultimos\">\u00daltimos v\u00eddeos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"internacional\">Internacional<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"investigacion\">Investigaci\u00f3n<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"cortos\">Cortos<\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ov-list-title\">\u00daltimos v\u00eddeos<\/div>\r\n        <div class=\"ov-video-list-container\" id=\"ov-video-list\">\r\n          <!-- se rellena desde JS usando localStorage -->\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- OVERLAY LOGIN + PANEL -->\r\n  <div class=\"ov-overlay\" id=\"ov-overlay\">\r\n    <!-- LOGIN -->\r\n    <div class=\"ov-login-card\" id=\"ov-login-card\">\r\n      <div class=\"ov-login-title\">Olas de Vida<\/div>\r\n      <div class=\"ov-login-sub\">Panel de control de v\u00eddeos \u00b7 Contrase\u00f1a: olas2025<\/div>\r\n      <input\r\n        type=\"password\"\r\n        id=\"ov-admin-pass\"\r\n        class=\"ov-login-input\"\r\n        placeholder=\"Contrase\u00f1a\"\r\n        autocomplete=\"off\">\r\n      <div class=\"ov-login-btns\">\r\n        <button class=\"ov-btn ov-btn-secondary\" id=\"ov-login-cancel\">Cancelar<\/button>\r\n        <button class=\"ov-btn ov-btn-primary\" id=\"ov-login-submit\">Acceder<\/button>\r\n      <\/div>\r\n      <div class=\"ov-login-error\" id=\"ov-login-error\"><\/div>\r\n    <\/div>\r\n\r\n    <!-- PANEL ADMIN -->\r\n    <div class=\"ov-admin-panel\" id=\"ov-admin-panel\">\r\n      <div class=\"ov-admin-header\">\r\n        <div>\r\n          <div class=\"ov-admin-title\">Panel V\u00eddeos PRO<\/div>\r\n          <div class=\"ov-admin-badge\">Olas de Vida \u00b7 Videoteca interna<\/div>\r\n        <\/div>\r\n        <button class=\"ov-admin-close\" id=\"ov-admin-close\">Cerrar<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"ov-admin-stats\">\r\n        <div class=\"ov-admin-stat\">\r\n          <div class=\"ov-admin-stat-label\">Total v\u00eddeos<\/div>\r\n          <div class=\"ov-admin-stat-value\" id=\"ov-total\">0<\/div>\r\n        <\/div>\r\n        <div class=\"ov-admin-stat\">\r\n          <div class=\"ov-admin-stat-label\">\u00daltima actualizaci\u00f3n<\/div>\r\n          <div class=\"ov-admin-stat-value\" id=\"ov-last\">\u2014<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ov-admin-grid\">\r\n        <div class=\"ov-admin-block\">\r\n          <div class=\"ov-admin-block-title\">Listado de v\u00eddeos<\/div>\r\n          <div class=\"ov-admin-table-wrap\">\r\n            <table class=\"ov-admin-table\">\r\n              <thead>\r\n                <tr>\r\n                  <th>#<\/th>\r\n                  <th>T\u00edtulo<\/th>\r\n                  <th>ID YouTube<\/th>\r\n                  <th>Acciones<\/th>\r\n                <\/tr>\r\n              <\/thead>\r\n              <tbody id=\"ov-admin-tbody\"><\/tbody>\r\n            <\/table>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ov-admin-block\">\r\n          <div class=\"ov-admin-block-title\" id=\"ov-admin-form-title\">A\u00f1adir nuevo v\u00eddeo<\/div>\r\n          <input type=\"text\" id=\"ov-admin-title\" class=\"ov-admin-input\" placeholder=\"T\u00edtulo del v\u00eddeo\">\r\n          <input type=\"text\" id=\"ov-admin-url\" class=\"ov-admin-input\" placeholder=\"URL completa o ID de YouTube\">\r\n          <textarea id=\"ov-admin-desc\" class=\"ov-admin-textarea\" placeholder=\"Descripci\u00f3n (opcional)\"><\/textarea>\r\n          <div class=\"ov-admin-btn-row\">\r\n            <button class=\"ov-admin-btn-secondary\" id=\"ov-admin-clear\">Limpiar<\/button>\r\n            <button class=\"ov-admin-btn-primary\" id=\"ov-admin-save\">Guardar<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const PASSWORD = \"olas2025\";\r\n  const STORAGE_KEY = \"olasdevida_videos_v1\";\r\n\r\n  const DEFAULT_VIDEOS = [\r\n    { id:1, title:\"Conozca todo sobre el c\u00e1ncer\", desc:\"Onc\u00f3logo Cl\u00ednica Universidad de Navarra\", category:\"tratamientos\", youtubeId:\"vLMNtaTYbF4\" },\r\n    { id:2, title:\"C\u00e1ncer esquema tratamiento\", desc:\"Cirug\u00eda + quimio + radio\", category:\"tratamientos\", youtubeId:\"YNuYvqUqBiY\" },\r\n    { id:3, title:\"Quimioterapia funciona\", desc:\"Nucleus Health animaci\u00f3n\", category:\"tratamientos\", youtubeId:\"cmD5X86n98o\" },\r\n    { id:4, title:\"Radioterapia aplicaci\u00f3n\", desc:\"Equipos modernos cuidados\", category:\"tratamientos\", youtubeId:\"G0Xn4yJgFQw\" }\r\n  ];\r\n\r\n  let videos = [];\r\n  let currentIndex = 0;\r\n  let searchTerm = \"\";\r\n  let activeFilter = \"all\";\r\n  let editIndex = null;\r\n\r\n  function ovToast(msg){\r\n    const t = document.getElementById(\"ov-toast\");\r\n    if(!t) return;\r\n    t.textContent = msg;\r\n    t.classList.add(\"show\");\r\n    setTimeout(()=>t.classList.remove(\"show\"), 2200);\r\n  }\r\n\r\n  function extractId(u){\r\n    if(!u) return \"\";\r\n    u = u.trim();\r\n    if(\/^[a-zA-Z0-9_-]{10,12}$\/.test(u)) return u;\r\n    const m = u.match(\/(?:v=|youtu\\.be\\\/|embed\\\/)([a-zA-Z0-9_-]{10,12})\/);\r\n    return m ? m[1] : \"\";\r\n  }\r\n\r\n  function loadVideos(){\r\n    try{\r\n      const raw = localStorage.getItem(STORAGE_KEY);\r\n      const parsed = raw ? JSON.parse(raw) : null;\r\n      if(Array.isArray(parsed) && parsed.length){\r\n        videos = parsed;\r\n      }else{\r\n        videos = [...DEFAULT_VIDEOS];\r\n      }\r\n    }catch(e){\r\n      videos = [...DEFAULT_VIDEOS];\r\n    }\r\n  }\r\n\r\n  function saveVideos(){\r\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(videos));\r\n    localStorage.setItem(STORAGE_KEY+\"_last\", new Date().toISOString());\r\n    renderAdminTable();\r\n    renderPlayerAndList();\r\n    ovToast(\"Guardado\");\r\n  }\r\n\r\n  function filterVideos(){\r\n    return videos.filter(video=>{\r\n      const title = (video.title||\"\").toLowerCase();\r\n      const desc  = (video.desc||\"\").toLowerCase();\r\n      const cat   = (video.category||\"\").toLowerCase();\r\n      const term  = searchTerm.toLowerCase();\r\n\r\n      const matchesSearch = !term || title.includes(term) || desc.includes(term);\r\n      const matchesFilter = activeFilter===\"all\" ||\r\n        cat.includes(activeFilter) ||\r\n        title.includes(activeFilter) ||\r\n        (activeFilter===\"ultimos\" && video.id >= videos.length-2);\r\n\r\n      return matchesSearch && matchesFilter;\r\n    });\r\n  }\r\n\r\n  function renderPlayerAndList(){\r\n    if(!videos.length){\r\n      document.getElementById(\"ov-player-frame\").src = \"\";\r\n      document.getElementById(\"ov-player-title\").textContent = \"No hay v\u00eddeos disponibles\";\r\n      document.getElementById(\"ov-player-desc\").textContent  = \"A\u00f1ade v\u00eddeos desde el panel de control.\";\r\n      document.getElementById(\"ov-video-list\").innerHTML = \"\";\r\n      return;\r\n    }\r\n    if(currentIndex<0 || currentIndex>=videos.length) currentIndex = 0;\r\n    const v = videos[currentIndex];\r\n\r\n    const frame = document.getElementById(\"ov-player-frame\");\r\n    frame.src = \"https:\/\/www.youtube.com\/embed\/\"+v.youtubeId+\"?rel=0\";\r\n    document.getElementById(\"ov-player-title\").textContent = v.title || \"(Sin t\u00edtulo)\";\r\n    document.getElementById(\"ov-player-desc\").textContent  = v.desc || \"\";\r\n\r\n    const filtered = filterVideos();\r\n    const container = document.getElementById(\"ov-video-list\");\r\n    container.innerHTML = \"\";\r\n\r\n    filtered.forEach(item=>{\r\n      const el = document.createElement(\"div\");\r\n      const isActive = item.id === v.id;\r\n      el.className = \"ov-list-item\"+(isActive?\" active\":\"\");\r\n      el.onclick = ()=>{\r\n        const idx = videos.findIndex(x=>x.id===item.id);\r\n        if(idx!==-1) currentIndex = idx;\r\n        renderPlayerAndList();\r\n      };\r\n\r\n      const thumb = document.createElement(\"div\");\r\n      thumb.className = \"ov-thumb\";\r\n      const img = document.createElement(\"img\");\r\n      img.src = \"https:\/\/img.youtube.com\/vi\/\"+item.youtubeId+\"\/hqdefault.jpg\";\r\n      img.alt = item.title || \"V\u00eddeo\";\r\n      thumb.appendChild(img);\r\n\r\n      const text = document.createElement(\"div\");\r\n      text.className = \"ov-list-text\";\r\n\r\n      const tTitle = document.createElement(\"div\");\r\n      tTitle.className = \"ov-list-item-title\";\r\n      tTitle.textContent = item.title || \"(Sin t\u00edtulo)\";\r\n\r\n      const tDesc = document.createElement(\"div\");\r\n      tDesc.className = \"ov-list-item-desc\";\r\n      tDesc.textContent = item.desc || \"\";\r\n\r\n      text.appendChild(tTitle);\r\n      text.appendChild(tDesc);\r\n      el.appendChild(thumb);\r\n      el.appendChild(text);\r\n      container.appendChild(el);\r\n    });\r\n  }\r\n\r\n  function renderAdminTable(){\r\n    const tbody = document.getElementById(\"ov-admin-tbody\");\r\n    if(!tbody) return;\r\n    tbody.innerHTML = \"\";\r\n\r\n    videos.forEach((v,i)=>{\r\n      const tr = document.createElement(\"tr\");\r\n      tr.innerHTML = `\r\n        <td>${i+1}<\/td>\r\n        <td>${v.title || \"(Sin t\u00edtulo)\"}<\/td>\r\n        <td style=\"font-family:monospace;color:#7dd3fc\">${v.youtubeId}<\/td>\r\n        <td class=\"ov-admin-actions\">\r\n          <button class=\"ov-btn-edit\">Editar<\/button>\r\n          <button class=\"ov-btn-del\">Borrar<\/button>\r\n        <\/td>\r\n      `;\r\n      tr.querySelector(\".ov-btn-edit\").onclick = ()=>{\r\n        editIndex = i;\r\n        document.getElementById(\"ov-admin-form-title\").textContent = \"Editar v\u00eddeo\";\r\n        document.getElementById(\"ov-admin-title\").value = v.title || \"\";\r\n        document.getElementById(\"ov-admin-url\").value   = v.youtubeId || \"\";\r\n        document.getElementById(\"ov-admin-desc\").value  = v.desc || \"\";\r\n      };\r\n      tr.querySelector(\".ov-btn-del\").onclick = ()=>{\r\n        if(confirm(\"\u00bfBorrar este v\u00eddeo?\")){\r\n          videos.splice(i,1);\r\n          saveVideos();\r\n        }\r\n      };\r\n      tbody.appendChild(tr);\r\n    });\r\n\r\n    const totalEl = document.getElementById(\"ov-total\");\r\n    const lastEl  = document.getElementById(\"ov-last\");\r\n    if(totalEl) totalEl.textContent = videos.length;\r\n    if(lastEl){\r\n      const last = localStorage.getItem(STORAGE_KEY+\"_last\");\r\n      lastEl.textContent = last ? new Date(last).toLocaleString(\"es-ES\") : \"\u2014\";\r\n    }\r\n  }\r\n\r\n  function clearAdminForm(){\r\n    editIndex = null;\r\n    document.getElementById(\"ov-admin-form-title\").textContent = \"A\u00f1adir nuevo v\u00eddeo\";\r\n    document.getElementById(\"ov-admin-title\").value = \"\";\r\n    document.getElementById(\"ov-admin-url\").value   = \"\";\r\n    document.getElementById(\"ov-admin-desc\").value  = \"\";\r\n    const saveBtn = document.getElementById(\"ov-admin-save\");\r\n    if(saveBtn) saveBtn.textContent = \"Guardar\";\r\n  }\r\n\r\n  function openOverlay(){\r\n    const overlay = document.getElementById(\"ov-overlay\");\r\n    if(!overlay) return;\r\n    overlay.style.display = \"flex\";\r\n    const err = document.getElementById(\"ov-login-error\");\r\n    if(err) err.textContent = \"\";\r\n    const loginCard = document.getElementById(\"ov-login-card\");\r\n    const panelCard = document.getElementById(\"ov-admin-panel\");\r\n    loginCard.style.display = \"block\";\r\n    panelCard.style.display = \"none\";\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    if(passInput){\r\n      passInput.value = \"\";\r\n      setTimeout(()=>passInput.focus(), 200);\r\n    }\r\n  }\r\n\r\n  function closeOverlay(){\r\n    const overlay = document.getElementById(\"ov-overlay\");\r\n    if(overlay) overlay.style.display = \"none\";\r\n  }\r\n\r\n  function handleLogin(){\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    const error = document.getElementById(\"ov-login-error\");\r\n    if(!passInput || !error) return;\r\n    const val = passInput.value.trim();\r\n    if(val === PASSWORD){\r\n      document.getElementById(\"ov-login-card\").style.display = \"none\";\r\n      document.getElementById(\"ov-admin-panel\").style.display = \"block\";\r\n      loadVideos();\r\n      renderAdminTable();\r\n      ovToast(\"Acceso al Panel PRO\");\r\n    }else{\r\n      error.textContent = \"Contrase\u00f1a incorrecta\";\r\n    }\r\n  }\r\n\r\n  function saveFromAdmin(){\r\n    const t = document.getElementById(\"ov-admin-title\").value.trim();\r\n    const u = document.getElementById(\"ov-admin-url\").value.trim();\r\n    const d = document.getElementById(\"ov-admin-desc\").value.trim();\r\n    const youtubeId = extractId(u);\r\n    if(!t || !youtubeId){\r\n      alert(\"T\u00edtulo o ID de YouTube inv\u00e1lidos.\");\r\n      return;\r\n    }\r\n    if(editIndex!==null){\r\n      videos[editIndex] = {...videos[editIndex], title:t, desc:d, youtubeId};\r\n    }else{\r\n      const newId = videos.length ? Math.max(...videos.map(v=>v.id||0))+1 : 1;\r\n      videos.push({id:newId,title:t,desc:d,youtubeId});\r\n    }\r\n    saveVideos();\r\n    clearAdminForm();\r\n  }\r\n\r\n  function setupSearchAndFilters(){\r\n    const input = document.getElementById(\"ov-search-input\");\r\n    if(input){\r\n      input.addEventListener(\"input\", e=>{\r\n        searchTerm = e.target.value || \"\";\r\n        renderPlayerAndList();\r\n      });\r\n    }\r\n    const chips = document.querySelectorAll(\".ov-chip\");\r\n    chips.forEach(ch=>{\r\n      ch.addEventListener(\"click\", ()=>{\r\n        chips.forEach(c=>c.classList.remove(\"active\"));\r\n        ch.classList.add(\"active\");\r\n        activeFilter = ch.getAttribute(\"data-filter\") || \"all\";\r\n        renderPlayerAndList();\r\n      });\r\n    });\r\n  }\r\n\r\n  document.addEventListener(\"DOMContentLoaded\", function(){\r\n    loadVideos();\r\n    renderPlayerAndList();\r\n    setupSearchAndFilters();\r\n\r\n    const circle = document.getElementById(\"ov-admin-circle\");\r\n    if(circle) circle.onclick = openOverlay;\r\n\r\n    const cancelBtn = document.getElementById(\"ov-login-cancel\");\r\n    if(cancelBtn) cancelBtn.onclick = closeOverlay;\r\n\r\n    const loginBtn = document.getElementById(\"ov-login-submit\");\r\n    if(loginBtn) loginBtn.onclick = handleLogin;\r\n\r\n    const closePanel = document.getElementById(\"ov-admin-close\");\r\n    if(closePanel) closePanel.onclick = closeOverlay;\r\n\r\n    const saveBtn = document.getElementById(\"ov-admin-save\");\r\n    if(saveBtn) saveBtn.onclick = saveFromAdmin;\r\n\r\n    const clearBtn = document.getElementById(\"ov-admin-clear\");\r\n    if(clearBtn) clearBtn.onclick = clearAdminForm;\r\n\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    if(passInput){\r\n      passInput.addEventListener(\"keydown\", e=>{\r\n        if(e.key === \"Enter\") handleLogin();\r\n      });\r\n    }\r\n  });\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-49d69ef e-con-full e-flex e-con e-parent\" data-id=\"49d69ef\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e57944d elementor-widget elementor-widget-html\" data-id=\"e57944d\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n.ov-video-admin{font-family:system-ui,-apple-system,sans-serif;color:#e5e7eb}\r\n.ov-video-shell{\r\n  background:radial-gradient(circle at top,#0f172a,#020617 60%);\r\n  border-radius:1.8rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.8rem 2rem;\r\n  box-shadow:0 20px 60px rgba(0,0,0,.65);\r\n  max-width:1600px;\r\n  margin:0 auto;\r\n}\r\n.ov-video-header{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:.75rem;\r\n  margin-bottom:1.4rem;\r\n}\r\n.ov-video-header-left{text-align:left;}\r\n.ov-video-title{\r\n  font-size:2.3rem;\r\n  font-weight:800;\r\n  background:linear-gradient(90deg,#0ea5e9,#3b82f6);\r\n  -webkit-background-clip:text;\r\n  background-clip:text;\r\n  color:transparent;\r\n}\r\n.ov-video-sub{\r\n  font-size:.95rem;\r\n  color:#94a3b8;\r\n  margin-top:.35rem;\r\n}\r\n#ov-admin-circle{\r\n  width:28px;\r\n  height:28px;\r\n  border-radius:999px;\r\n  background:#0ea5e9;\r\n  border:1px solid #38bdf8;\r\n  cursor:pointer;\r\n  flex-shrink:0;\r\n  transition:.16s;\r\n}\r\n#ov-admin-circle:hover{background:#38bdf8;}\r\n#ov-admin-circle:active{\r\n  background:#0284c7;\r\n  transform:scale(.94);\r\n}\r\n.ov-main-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,3fr) minmax(0,1.2fr);\r\n  gap:1.6rem;\r\n  align-items:start;\r\n}\r\n@media (max-width:1300px){\r\n  .ov-main-grid{grid-template-columns:1fr;}\r\n}\r\n.ov-player{\r\n  background:#020617;\r\n  border-radius:1.4rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.6rem;\r\n}\r\n.ov-player-iframe{\r\n  width:100%;\r\n  aspect-ratio:16\/9;\r\n  border-radius:1rem;\r\n  border:none;\r\n  background:#000;\r\n}\r\n.ov-player-meta{margin-top:1rem;}\r\n.ov-player-title{font-size:1.25rem;font-weight:600;margin-bottom:.35rem;}\r\n.ov-player-desc{font-size:.93rem;color:#9ca3af;line-height:1.5;}\r\n.ov-list{\r\n  background:#020617;\r\n  border-radius:1.6rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.1rem;\r\n  max-height:580px;\r\n  display:flex;\r\n  flex-direction:column;\r\n}\r\n.ov-search-section{\r\n  padding:0 0 .7rem 0;\r\n  border-bottom:1px solid #1f2937;\r\n  margin-bottom:.55rem;\r\n}\r\n.ov-search-input{\r\n  width:100%;\r\n  background:#020617;\r\n  border:1px solid #1f2937;\r\n  border-radius:.9rem;\r\n  padding:.5rem .8rem;\r\n  color:#e5e7eb;\r\n  font-size:.8rem;\r\n  outline:none;\r\n  font-weight:500;\r\n  margin-bottom:.35rem;\r\n}\r\n.ov-search-input:focus{\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 2px rgba(14,165,233,.25);\r\n}\r\n.ov-chips-container{\r\n  display:flex;\r\n  gap:.35rem;\r\n  overflow-x:auto;\r\n  padding:.1rem 0;\r\n  scrollbar-width:thin;\r\n}\r\n.ov-chips-container::-webkit-scrollbar{height:4px;}\r\n.ov-chips-container::-webkit-scrollbar-track{background:transparent;}\r\n.ov-chips-container::-webkit-scrollbar-thumb{\r\n  background:#1f2937;\r\n  border-radius:999px;\r\n}\r\n.ov-chip{\r\n  padding:.25rem .7rem;\r\n  border-radius:999px;\r\n  font-size:.7rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n  white-space:nowrap;\r\n  flex-shrink:0;\r\n  transition:.2s;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  border:1px solid #4b5563;\r\n}\r\n.ov-chip.active,\r\n.ov-chip:hover{\r\n  background:#0ea5e9!important;\r\n  color:#020617!important;\r\n  transform:translateY(-1px);\r\n}\r\n.ov-list-title{\r\n  font-size:.95rem;\r\n  font-weight:600;\r\n  color:#0ea5e9;\r\n  margin-bottom:.5rem;\r\n}\r\n.ov-video-list-container{\r\n  flex:1;\r\n  overflow:auto;\r\n  min-height:0;\r\n}\r\n.ov-list-item{\r\n  display:flex;\r\n  gap:.75rem;\r\n  padding:.8rem .55rem;\r\n  border-radius:.9rem;\r\n  cursor:pointer;\r\n  margin-bottom:.4rem;\r\n  transition:.18s;\r\n  background:rgba(15,23,42,.7);\r\n}\r\n.ov-list-item:hover{\r\n  background:rgba(14,165,233,.18);\r\n  transform:translateX(4px);\r\n}\r\n.ov-list-item.active{background:rgba(14,165,233,.35);}\r\n.ov-thumb{\r\n  width:100px;\r\n  height:56px;\r\n  border-radius:.6rem;\r\n  overflow:hidden;\r\n  flex-shrink:0;\r\n  background:#111827;\r\n}\r\n.ov-thumb img{\r\n  width:100%;\r\n  height:100%;\r\n  object-fit:cover;\r\n  display:block;\r\n}\r\n.ov-list-text{flex:1;min-width:0;}\r\n.ov-list-item-title{\r\n  font-size:1rem;\r\n  font-weight:600;\r\n  margin-bottom:.15rem;\r\n  white-space:nowrap;\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n}\r\n.ov-list-item-desc{\r\n  font-size:.83rem;\r\n  color:#9ca3af;\r\n  line-height:1.35;\r\n}\r\n#ov-toast{\r\n  position:fixed;\r\n  bottom:24px;\r\n  left:50%;\r\n  transform:translateX(-50%);\r\n  background:#10b981;\r\n  color:#01110a;\r\n  padding:0.6rem 1.5rem;\r\n  border-radius:999px;\r\n  font-size:.85rem;\r\n  font-weight:600;\r\n  z-index:9999;\r\n  opacity:0;\r\n  transition:all .25s;\r\n}\r\n#ov-toast.show{\r\n  opacity:1;\r\n  transform:translateX(-50%) translateY(-8px);\r\n}\r\n.ov-overlay{\r\n  position:fixed;\r\n  inset:0;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  background:rgba(2,6,23,.96);\r\n  z-index:9990;\r\n  padding:1rem;\r\n}\r\n.ov-login-card{\r\n  background:#020617;\r\n  border-radius:1.75rem;\r\n  border:1px solid #1f2937;\r\n  padding:2rem 1.7rem;\r\n  width:100%;\r\n  max-width:420px;\r\n  text-align:center;\r\n  box-shadow:0 30px 80px rgba(0,0,0,.85);\r\n}\r\n.ov-login-title{\r\n  font-size:1.4rem;\r\n  font-weight:800;\r\n}\r\n.ov-login-sub{\r\n  margin-top:0.3rem;\r\n  font-size:.9rem;\r\n  color:#94a3b8;\r\n}\r\n.ov-login-input{\r\n  width:100%;\r\n  margin:1.2rem 0 0.4rem;\r\n  padding:0.85rem 1rem;\r\n  border-radius:0.9rem;\r\n  border:2px solid #475569;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:1rem;\r\n}\r\n.ov-login-input:focus{\r\n  outline:none;\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 3px rgba(14,165,233,.4);\r\n}\r\n.ov-login-btns{\r\n  margin-top:1rem;\r\n  display:flex;\r\n  gap:0.6rem;\r\n  justify-content:center;\r\n}\r\n.ov-btn{\r\n  padding:0.7rem 1.4rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  cursor:pointer;\r\n  font-size:.85rem;\r\n  font-weight:600;\r\n}\r\n.ov-btn-primary{background:#0ea5e9;color:#031016;}\r\n.ov-btn-secondary{background:#020617;color:#e5e7eb;border:1px solid #4b5563;}\r\n.ov-login-error{\r\n  margin-top:0.7rem;\r\n  min-height:1.1rem;\r\n  font-size:.85rem;\r\n  color:#fca5a5;\r\n}\r\n.ov-admin-panel{\r\n  display:none;\r\n  background:radial-gradient(circle at top,#0f172a,#020617 55%);\r\n  padding:2rem 2.2rem;\r\n  border-radius:1.8rem;\r\n  border:1px solid #1f2937;\r\n  max-width:1200px;\r\n  max-height:90vh;\r\n  margin:0 auto;\r\n  box-shadow:0 20px 60px rgba(0,0,0,.65);\r\n  overflow:auto;\r\n}\r\n.ov-admin-header{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  gap:1rem;\r\n  margin-bottom:1.5rem;\r\n}\r\n.ov-admin-title{\r\n  font-size:1.6rem;\r\n  font-weight:800;\r\n  background:linear-gradient(90deg,#0ea5e9,#7dd3fc);\r\n  -webkit-background-clip:text;\r\n  background-clip:text;\r\n  color:transparent;\r\n}\r\n.ov-admin-badge{\r\n  font-size:.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-close{\r\n  padding:0.6rem 1.3rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:#ef4444;\r\n  color:#f9fafb;\r\n  font-size:.9rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n.ov-admin-stats{\r\n  display:grid;\r\n  grid-template-columns:repeat(auto-fit,minmax(180px,1fr));\r\n  gap:1rem;\r\n  margin-bottom:1.8rem;\r\n}\r\n.ov-admin-stat{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.1rem;\r\n  border:1px solid #1f2937;\r\n  padding:1rem 1.2rem;\r\n}\r\n.ov-admin-stat-label{\r\n  font-size:.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-stat-value{\r\n  margin-top:0.4rem;\r\n  font-size:1.4rem;\r\n  font-weight:700;\r\n  color:#0ea5e9;\r\n}\r\n.ov-admin-grid{\r\n  display:grid;\r\n  grid-template-columns:1.6fr 1.1fr;\r\n  gap:1.5rem;\r\n}\r\n@media (max-width:900px){\r\n  .ov-admin-grid{grid-template-columns:1fr;}\r\n}\r\n.ov-admin-block{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.3rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.4rem 1.5rem;\r\n}\r\n.ov-admin-block-title{\r\n  font-size:1rem;\r\n  font-weight:600;\r\n  margin-bottom:0.8rem;\r\n  color:#0ea5e9;\r\n}\r\n.ov-admin-table-wrap{\r\n  max-height:460px;\r\n  overflow:auto;\r\n  border-radius:1rem;\r\n  border:1px solid #1f2937;\r\n}\r\n.ov-admin-table{\r\n  width:100%;\r\n  border-collapse:collapse;\r\n  font-size:.85rem;\r\n}\r\n.ov-admin-table thead{\r\n  position:sticky;\r\n  top:0;\r\n  background:#020617;\r\n  z-index:1;\r\n}\r\n.ov-admin-table th,\r\n.ov-admin-table td{\r\n  padding:0.55rem 0.6rem;\r\n  border-bottom:1px solid #1f2937;\r\n}\r\n.ov-admin-table th{\r\n  text-align:left;\r\n  font-size:.75rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-table tbody tr:hover{\r\n  background:rgba(15,118,110,.12);\r\n}\r\n.ov-admin-actions{\r\n  white-space:nowrap;\r\n}\r\n.ov-admin-actions button{\r\n  border:none;\r\n  padding:0.2rem 0.7rem;\r\n  border-radius:999px;\r\n  font-size:.75rem;\r\n  margin-right:0.25rem;\r\n  cursor:pointer;\r\n}\r\n.ov-btn-edit{background:#f59e0b;color:#111827;}\r\n.ov-btn-del{background:#ef4444;color:#f9fafb;}\r\n.ov-admin-input,\r\n.ov-admin-textarea{\r\n  width:100%;\r\n  padding:0.7rem 0.85rem;\r\n  border-radius:0.9rem;\r\n  border:1px solid #374151;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:.9rem;\r\n  margin-bottom:0.7rem;\r\n}\r\n.ov-admin-textarea{\r\n  min-height:80px;\r\n  resize:vertical;\r\n}\r\n.ov-admin-input:focus,\r\n.ov-admin-textarea:focus{\r\n  outline:none;\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 2px rgba(14,165,233,.35);\r\n}\r\n.ov-admin-btn-row{\r\n  display:flex;\r\n  justify-content:flex-end;\r\n  gap:0.7rem;\r\n  margin-top:0.4rem;\r\n}\r\n.ov-admin-btn-secondary{\r\n  padding:0.55rem 1.1rem;\r\n  border-radius:999px;\r\n  border:1px solid #4b5563;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:.8rem;\r\n  cursor:pointer;\r\n}\r\n.ov-admin-btn-primary{\r\n  padding:0.55rem 1.2rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:#0ea5e9;\r\n  color:#02121f;\r\n  font-size:.8rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n<\/style>\r\n\r\n<div class=\"ov-video-admin\">\r\n  <div id=\"ov-toast\"><\/div>\r\n\r\n  <div class=\"ov-video-shell\">\r\n    <div class=\"ov-video-header\">\r\n      <div class=\"ov-video-header-left\">\r\n        <h2 class=\"ov-video-title\">\ud83c\udfac Reproductor de v\u00eddeos \u00b7 Olas de Vida<\/h2>\r\n        <p class=\"ov-video-sub\">Selecciona un v\u00eddeo del listado para verlo en el reproductor principal.<\/p>\r\n      <\/div>\r\n      <button id=\"ov-admin-circle\" type=\"button\" title=\"Panel de control\"><\/button>\r\n    <\/div>\r\n\r\n    <div class=\"ov-main-grid\">\r\n      <div class=\"ov-player\">\r\n        <iframe\r\n          id=\"ov-player-frame\"\r\n          class=\"ov-player-iframe\"\r\n          src=\"https:\/\/www.youtube.com\/embed\/vLMNtaTYbF4?rel=0&autoplay=0\"\r\n          allowfullscreen\r\n          allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\">\r\n        <\/iframe>\r\n        <div class=\"ov-player-meta\">\r\n          <div class=\"ov-player-title\" id=\"ov-player-title\">Conozca todo sobre el c\u00e1ncer<\/div>\r\n          <div class=\"ov-player-desc\" id=\"ov-player-desc\">\r\n            Onc\u00f3logo Cl\u00ednica Universidad de Navarra \u00b7 V\u00cdDEO INICIAL CARGADO.\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ov-list\">\r\n        <div class=\"ov-search-section\">\r\n          <input\r\n            type=\"text\"\r\n            class=\"ov-search-input\"\r\n            id=\"ov-search-input\"\r\n            placeholder=\"\ud83d\udd0d Buscar tratamientos, apoyo, tipos de c\u00e1ncer...\">\r\n          <div class=\"ov-chips-container\" id=\"ov-chips-container\">\r\n            <span class=\"ov-chip active\" data-filter=\"all\">Todos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"tratamientos\">Tratamientos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"apoyo\">Apoyo emocional<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"familiares\">Familiares<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"tipos\">Tipos de c\u00e1ncer<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"ultimos\">\u00daltimos v\u00eddeos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"internacional\">Internacional<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"investigacion\">Investigaci\u00f3n<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"cortos\">Cortos<\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ov-list-title\">\u00daltimos v\u00eddeos<\/div>\r\n        <div class=\"ov-video-list-container\" id=\"ov-video-list\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"ov-overlay\" id=\"ov-overlay\">\r\n    <div class=\"ov-login-card\" id=\"ov-login-card\">\r\n      <div class=\"ov-login-title\">Olas de Vida<\/div>\r\n      <div class=\"ov-login-sub\">Panel de control de v\u00eddeos \u00b7 Contrase\u00f1a: olas2025<\/div>\r\n      <input\r\n        type=\"password\"\r\n        id=\"ov-admin-pass\"\r\n        class=\"ov-login-input\"\r\n        placeholder=\"Contrase\u00f1a\"\r\n        autocomplete=\"off\">\r\n      <div class=\"ov-login-btns\">\r\n        <button class=\"ov-btn ov-btn-secondary\" id=\"ov-login-cancel\">Cancelar<\/button>\r\n        <button class=\"ov-btn ov-btn-primary\" id=\"ov-login-submit\">Acceder<\/button>\r\n      <\/div>\r\n      <div class=\"ov-login-error\" id=\"ov-login-error\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"ov-admin-panel\" id=\"ov-admin-panel\">\r\n      <div class=\"ov-admin-header\">\r\n        <div>\r\n          <div class=\"ov-admin-title\">Panel V\u00eddeos PRO<\/div>\r\n          <div class=\"ov-admin-badge\">Olas de Vida \u00b7 Videoteca interna<\/div>\r\n        <\/div>\r\n        <div>\r\n          <button class=\"ov-admin-btn-secondary\" id=\"ov-admin-sync\">Sincronizar con Sheets<\/button>\r\n          <button class=\"ov-admin-close\" id=\"ov-admin-close\">Cerrar<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ov-admin-stats\">\r\n        <div class=\"ov-admin-stat\">\r\n          <div class=\"ov-admin-stat-label\">Total v\u00eddeos<\/div>\r\n          <div class=\"ov-admin-stat-value\" id=\"ov-total\">0<\/div>\r\n        <\/div>\r\n        <div class=\"ov-admin-stat\">\r\n          <div class=\"ov-admin-stat-label\">\u00daltima actualizaci\u00f3n<\/div>\r\n          <div class=\"ov-admin-stat-value\" id=\"ov-last\">\u2014<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ov-admin-grid\">\r\n        <div class=\"ov-admin-block\">\r\n          <div class=\"ov-admin-block-title\">Listado de v\u00eddeos<\/div>\r\n          <div class=\"ov-admin-table-wrap\">\r\n            <table class=\"ov-admin-table\">\r\n              <thead>\r\n                <tr>\r\n                  <th>#<\/th>\r\n                  <th>T\u00edtulo<\/th>\r\n                  <th>ID YouTube<\/th>\r\n                  <th>Acciones<\/th>\r\n                <\/tr>\r\n              <\/thead>\r\n              <tbody id=\"ov-admin-tbody\"><\/tbody>\r\n            <\/table>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ov-admin-block\">\r\n          <div class=\"ov-admin-block-title\" id=\"ov-admin-form-title\">A\u00f1adir nuevo v\u00eddeo<\/div>\r\n          <input type=\"text\" id=\"ov-admin-title\" class=\"ov-admin-input\" placeholder=\"T\u00edtulo del v\u00eddeo\">\r\n          <input type=\"text\" id=\"ov-admin-url\" class=\"ov-admin-input\" placeholder=\"URL completa o ID de YouTube\">\r\n          <textarea id=\"ov-admin-desc\" class=\"ov-admin-textarea\" placeholder=\"Descripci\u00f3n (opcional)\"><\/textarea>\r\n          <div class=\"ov-admin-btn-row\">\r\n            <button class=\"ov-admin-btn-secondary\" id=\"ov-admin-clear\">Limpiar<\/button>\r\n            <button class=\"ov-admin-btn-primary\" id=\"ov-admin-save\">Guardar<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const PASSWORD = \"olas2025\";\r\n  const STORAGE_KEY = \"olasdevida_videos_v1\";\r\n  const OV_SHEETS_API_URL = \"TU_URL_WEBAPP_AQUI\"; \/\/ \u2190 pon aqu\u00ed tu URL \/exec\r\n\r\n  const DEFAULT_VIDEOS = [\r\n    { id:1, title:\"Conozca todo sobre el c\u00e1ncer\", desc:\"Onc\u00f3logo Cl\u00ednica Universidad de Navarra\", category:\"tratamientos\", youtubeId:\"vLMNtaTYbF4\" },\r\n    { id:2, title:\"C\u00e1ncer esquema tratamiento\", desc:\"Cirug\u00eda + quimio + radio\", category:\"tratamientos\", youtubeId:\"YNuYvqUqBiY\" },\r\n    { id:3, title:\"Quimioterapia funciona\", desc:\"Nucleus Health animaci\u00f3n\", category:\"tratamientos\", youtubeId:\"cmD5X86n98o\" },\r\n    { id:4, title:\"Radioterapia aplicaci\u00f3n\", desc:\"Equipos modernos cuidados\", category:\"tratamientos\", youtubeId:\"G0Xn4yJgFQw\" }\r\n  ];\r\n\r\n  let videos = [];\r\n  let currentIndex = 0;\r\n  let searchTerm = \"\";\r\n  let activeFilter = \"all\";\r\n  let editIndex = null;\r\n\r\n  function ovToast(msg){\r\n    const t = document.getElementById(\"ov-toast\");\r\n    if(!t) return;\r\n    t.textContent = msg;\r\n    t.classList.add(\"show\");\r\n    setTimeout(()=>t.classList.remove(\"show\"), 2200);\r\n  }\r\n\r\n  function extractId(u){\r\n    if(!u) return \"\";\r\n    u = u.trim();\r\n    if(\/^[a-zA-Z0-9_-]{10,12}$\/.test(u)) return u;\r\n    const m = u.match(\/(?:v=|youtu\\.be\\\/|embed\\\/)([a-zA-Z0-9_-]{10,12})\/);\r\n    return m ? m[1] : \"\";\r\n  }\r\n\r\n  function loadVideos(){\r\n    try{\r\n      const raw = localStorage.getItem(STORAGE_KEY);\r\n      const parsed = raw ? JSON.parse(raw) : null;\r\n      if(Array.isArray(parsed) && parsed.length){\r\n        videos = parsed;\r\n      }else{\r\n        videos = [...DEFAULT_VIDEOS];\r\n      }\r\n    }catch(e){\r\n      videos = [...DEFAULT_VIDEOS];\r\n    }\r\n  }\r\n\r\n  function saveVideos(){\r\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(videos));\r\n    localStorage.setItem(STORAGE_KEY+\"_last\", new Date().toISOString());\r\n    renderAdminTable();\r\n    renderPlayerAndList();\r\n    ovToast(\"Guardado\");\r\n  }\r\n\r\n  function filterVideos(){\r\n    return videos.filter(video=>{\r\n      const title = (video.title||\"\").toLowerCase();\r\n      const desc  = (video.desc||\"\").toLowerCase();\r\n      const cat   = (video.category||\"\").toLowerCase();\r\n      const term  = searchTerm.toLowerCase();\r\n\r\n      const matchesSearch = !term || title.includes(term) || desc.includes(term);\r\n      const matchesFilter = activeFilter===\"all\" ||\r\n        cat.includes(activeFilter) ||\r\n        title.includes(activeFilter) ||\r\n        (activeFilter===\"ultimos\" && video.id >= videos.length-2);\r\n\r\n      return matchesSearch && matchesFilter;\r\n    });\r\n  }\r\n\r\n  function renderPlayerAndList(){\r\n    if(!videos.length){\r\n      document.getElementById(\"ov-player-frame\").src = \"\";\r\n      document.getElementById(\"ov-player-title\").textContent = \"No hay v\u00eddeos disponibles\";\r\n      document.getElementById(\"ov-player-desc\").textContent  = \"A\u00f1ade v\u00eddeos desde el panel de control.\";\r\n      document.getElementById(\"ov-video-list\").innerHTML = \"\";\r\n      return;\r\n    }\r\n    if(currentIndex<0 || currentIndex>=videos.length) currentIndex = 0;\r\n    const v = videos[currentIndex];\r\n\r\n    const frame = document.getElementById(\"ov-player-frame\");\r\n    frame.src = \"https:\/\/www.youtube.com\/embed\/\"+v.youtubeId+\"?rel=0\";\r\n    document.getElementById(\"ov-player-title\").textContent = v.title || \"(Sin t\u00edtulo)\";\r\n    document.getElementById(\"ov-player-desc\").textContent  = v.desc || \"\";\r\n\r\n    const filtered = filterVideos();\r\n    const container = document.getElementById(\"ov-video-list\");\r\n    container.innerHTML = \"\";\r\n\r\n    filtered.forEach(item=>{\r\n      const el = document.createElement(\"div\");\r\n      const isActive = item.id === v.id;\r\n      el.className = \"ov-list-item\"+(isActive?\" active\":\"\");\r\n      el.onclick = ()=>{\r\n        const idx = videos.findIndex(x=>x.id===item.id);\r\n        if(idx!==-1) currentIndex = idx;\r\n        renderPlayerAndList();\r\n      };\r\n\r\n      const thumb = document.createElement(\"div\");\r\n      thumb.className = \"ov-thumb\";\r\n      const img = document.createElement(\"img\");\r\n      img.src = \"https:\/\/img.youtube.com\/vi\/\"+item.youtubeId+\"\/hqdefault.jpg\";\r\n      img.alt = item.title || \"V\u00eddeo\";\r\n      thumb.appendChild(img);\r\n\r\n      const text = document.createElement(\"div\");\r\n      text.className = \"ov-list-text\";\r\n\r\n      const tTitle = document.createElement(\"div\");\r\n      tTitle.className = \"ov-list-item-title\";\r\n      tTitle.textContent = item.title || \"(Sin t\u00edtulo)\";\r\n\r\n      const tDesc = document.createElement(\"div\");\r\n      tDesc.className = \"ov-list-item-desc\";\r\n      tDesc.textContent = item.desc || \"\";\r\n\r\n      text.appendChild(tTitle);\r\n      text.appendChild(tDesc);\r\n      el.appendChild(thumb);\r\n      el.appendChild(text);\r\n      container.appendChild(el);\r\n    });\r\n  }\r\n\r\n  function renderAdminTable(){\r\n    const tbody = document.getElementById(\"ov-admin-tbody\");\r\n    if(!tbody) return;\r\n    tbody.innerHTML = \"\";\r\n\r\n    videos.forEach((v,i)=>{\r\n      const tr = document.createElement(\"tr\");\r\n      tr.innerHTML = `\r\n        <td>${i+1}<\/td>\r\n        <td>${v.title || \"(Sin t\u00edtulo)\"}<\/td>\r\n        <td style=\"font-family:monospace;color:#7dd3fc\">${v.youtubeId}<\/td>\r\n        <td class=\"ov-admin-actions\">\r\n          <button class=\"ov-btn-edit\">Editar<\/button>\r\n          <button class=\"ov-btn-del\">Borrar<\/button>\r\n        <\/td>\r\n      `;\r\n      tr.querySelector(\".ov-btn-edit\").onclick = ()=>{\r\n        editIndex = i;\r\n        document.getElementById(\"ov-admin-form-title\").textContent = \"Editar v\u00eddeo\";\r\n        document.getElementById(\"ov-admin-title\").value = v.title || \"\";\r\n        document.getElementById(\"ov-admin-url\").value   = v.youtubeId || \"\";\r\n        document.getElementById(\"ov-admin-desc\").value  = v.desc || \"\";\r\n      };\r\n      tr.querySelector(\".ov-btn-del\").onclick = ()=>{\r\n        if(confirm(\"\u00bfBorrar este v\u00eddeo?\")){\r\n          videos.splice(i,1);\r\n          saveVideos();\r\n        }\r\n      };\r\n      tbody.appendChild(tr);\r\n    });\r\n\r\n    const totalEl = document.getElementById(\"ov-total\");\r\n    const lastEl  = document.getElementById(\"ov-last\");\r\n    if(totalEl) totalEl.textContent = videos.length;\r\n    if(lastEl){\r\n      const last = localStorage.getItem(STORAGE_KEY+\"_last\");\r\n      lastEl.textContent = last ? new Date(last).toLocaleString(\"es-ES\") : \"\u2014\";\r\n    }\r\n  }\r\n\r\n  function clearAdminForm(){\r\n    editIndex = null;\r\n    document.getElementById(\"ov-admin-form-title\").textContent = \"A\u00f1adir nuevo v\u00eddeo\";\r\n    document.getElementById(\"ov-admin-title\").value = \"\";\r\n    document.getElementById(\"ov-admin-url\").value   = \"\";\r\n    document.getElementById(\"ov-admin-desc\").value  = \"\";\r\n    const saveBtn = document.getElementById(\"ov-admin-save\");\r\n    if(saveBtn) saveBtn.textContent = \"Guardar\";\r\n  }\r\n\r\n  function openOverlay(){\r\n    const overlay = document.getElementById(\"ov-overlay\");\r\n    if(!overlay) return;\r\n    overlay.style.display = \"flex\";\r\n    const err = document.getElementById(\"ov-login-error\");\r\n    if(err) err.textContent = \"\";\r\n    const loginCard = document.getElementById(\"ov-login-card\");\r\n    const panelCard = document.getElementById(\"ov-admin-panel\");\r\n    loginCard.style.display = \"block\";\r\n    panelCard.style.display = \"none\";\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    if(passInput){\r\n      passInput.value = \"\";\r\n      setTimeout(()=>passInput.focus(), 200);\r\n    }\r\n  }\r\n\r\n  function closeOverlay(){\r\n    const overlay = document.getElementById(\"ov-overlay\");\r\n    if(overlay) overlay.style.display = \"none\";\r\n  }\r\n\r\n  function handleLogin(){\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    const error = document.getElementById(\"ov-login-error\");\r\n    if(!passInput || !error) return;\r\n    const val = passInput.value.trim();\r\n    if(val === PASSWORD){\r\n      document.getElementById(\"ov-login-card\").style.display = \"none\";\r\n      document.getElementById(\"ov-admin-panel\").style.display = \"block\";\r\n      loadVideos();\r\n      renderAdminTable();\r\n      ovToast(\"Acceso al Panel PRO\");\r\n    }else{\r\n      error.textContent = \"Contrase\u00f1a incorrecta\";\r\n    }\r\n  }\r\n\r\n  function saveFromAdmin(){\r\n    const t = document.getElementById(\"ov-admin-title\").value.trim();\r\n    const u = document.getElementById(\"ov-admin-url\").value.trim();\r\n    const d = document.getElementById(\"ov-admin-desc\").value.trim();\r\n    const youtubeId = extractId(u);\r\n    if(!t || !youtubeId){\r\n      alert(\"T\u00edtulo o ID de YouTube inv\u00e1lidos.\");\r\n      return;\r\n    }\r\n    if(editIndex!==null){\r\n      videos[editIndex] = {...videos[editIndex], title:t, desc:d, youtubeId};\r\n    }else{\r\n      const newId = videos.length ? Math.max(...videos.map(v=>v.id||0))+1 : 1;\r\n      videos.push({id:newId,title:t,desc:d,youtubeId});\r\n    }\r\n    saveVideos();\r\n    clearAdminForm();\r\n  }\r\n\r\n  function mapCategoriaToSlug(cat){\r\n    const c = (cat || \"\").toLowerCase();\r\n    if (c.includes(\"tratamientos\")) return \"tratamientos\";\r\n    if (c.includes(\"apoyo\")) return \"apoyo\";\r\n    if (c.includes(\"familia\")) return \"familiares\";\r\n    if (c.includes(\"ni\u00f1\") || c.includes(\"nino\") || c.includes(\"ninos\")) return \"ninos\";\r\n    if (c.includes(\"tipos\")) return \"tipos\";\r\n    if (c.includes(\"investig\")) return \"investigacion\";\r\n    if (c.includes(\"internacional\")) return \"internacional\";\r\n    if (c.includes(\"cortos\")) return \"cortos\";\r\n    return \"otros\";\r\n  }\r\n\r\n  function ovSyncFromSheets(){\r\n    if (!OV_SHEETS_API_URL) {\r\n      ovToast(\"Falta URL de Sheets\");\r\n      return;\r\n    }\r\n    ovToast(\"Sincronizando con Sheets...\");\r\n\r\n    fetch(OV_SHEETS_API_URL)\r\n      .then(r => r.json())\r\n      .then(data => {\r\n        if (!Array.isArray(data)) {\r\n          ovToast(\"Respuesta inv\u00e1lida\");\r\n          return;\r\n        }\r\n\r\n        const fromSheets = data\r\n          .filter(row => row.url)\r\n          .map((row, idx) => {\r\n            const youtubeId = extractId(row.url);\r\n            return {\r\n              id: idx + 1,\r\n              title: row.nombre || \"\",\r\n              desc: row.descripcion || \"\",\r\n              category: mapCategoriaToSlug(row.categoria || \"\"),\r\n              youtubeId: youtubeId\r\n            };\r\n          })\r\n          .filter(v => v.youtubeId);\r\n\r\n        if (!fromSheets.length) {\r\n          ovToast(\"No hay v\u00eddeos v\u00e1lidos en Sheets\");\r\n          return;\r\n        }\r\n\r\n        videos = fromSheets;\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(videos));\r\n        localStorage.setItem(STORAGE_KEY + \"_last\", new Date().toISOString());\r\n        currentIndex = 0;\r\n        renderAdminTable();\r\n        renderPlayerAndList();\r\n        ovToast(\"Sincronizaci\u00f3n completada\");\r\n      })\r\n      .catch(err => {\r\n        console.error(err);\r\n        ovToast(\"Error al conectar con Sheets\");\r\n      });\r\n  }\r\n\r\n  function setupSearchAndFilters(){\r\n    const input = document.getElementById(\"ov-search-input\");\r\n    if(input){\r\n      input.addEventListener(\"input\", e=>{\r\n        searchTerm = e.target.value || \"\";\r\n        renderPlayerAndList();\r\n      });\r\n    }\r\n    const chips = document.querySelectorAll(\".ov-chip\");\r\n    chips.forEach(ch=>{\r\n      ch.addEventListener(\"click\", ()=>{\r\n        chips.forEach(c=>c.classList.remove(\"active\"));\r\n        ch.classList.add(\"active\");\r\n        activeFilter = ch.getAttribute(\"data-filter\") || \"all\";\r\n        renderPlayerAndList();\r\n      });\r\n    });\r\n  }\r\n\r\n  document.addEventListener(\"DOMContentLoaded\", function(){\r\n    loadVideos();\r\n    renderPlayerAndList();\r\n    setupSearchAndFilters();\r\n\r\n    const circle = document.getElementById(\"ov-admin-circle\");\r\n    if(circle) circle.onclick = openOverlay;\r\n\r\n    const cancelBtn = document.getElementById(\"ov-login-cancel\");\r\n    if(cancelBtn) cancelBtn.onclick = closeOverlay;\r\n\r\n    const loginBtn = document.getElementById(\"ov-login-submit\");\r\n    if(loginBtn) loginBtn.onclick = handleLogin;\r\n\r\n    const closePanel = document.getElementById(\"ov-admin-close\");\r\n    if(closePanel) closePanel.onclick = closeOverlay;\r\n\r\n    const saveBtn = document.getElementById(\"ov-admin-save\");\r\n    if(saveBtn) saveBtn.onclick = saveFromAdmin;\r\n\r\n    const clearBtn = document.getElementById(\"ov-admin-clear\");\r\n    if(clearBtn) clearBtn.onclick = clearAdminForm;\r\n\r\n    const syncBtn = document.getElementById(\"ov-admin-sync\");\r\n    if (syncBtn) syncBtn.onclick = ovSyncFromSheets;\r\n\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    if(passInput){\r\n      passInput.addEventListener(\"keydown\", e=>{\r\n        if(e.key === \"Enter\") handleLogin();\r\n      });\r\n    }\r\n  });\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-034791a e-con-full e-flex e-con e-parent\" data-id=\"034791a\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7b54591 elementor-widget elementor-widget-html\" data-id=\"7b54591\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n.ov-video-admin{font-family:system-ui,-apple-system,sans-serif;color:#e5e7eb}\r\n.ov-video-shell{\r\n  background:radial-gradient(circle at top,#0f172a,#020617 60%);\r\n  border-radius:1.8rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.8rem 2rem;\r\n  box-shadow:0 20px 60px rgba(0,0,0,.65);\r\n  max-width:1600px;\r\n  margin:0 auto;\r\n}\r\n.ov-video-header{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:.75rem;\r\n  margin-bottom:1.4rem;\r\n}\r\n.ov-video-header-left{text-align:left;}\r\n.ov-video-title{\r\n  font-size:2.3rem;\r\n  font-weight:800;\r\n  background:linear-gradient(90deg,#0ea5e9,#3b82f6);\r\n  -webkit-background-clip:text;\r\n  background-clip:text;\r\n  color:transparent;\r\n}\r\n.ov-video-sub{\r\n  font-size:.95rem;\r\n  color:#94a3b8;\r\n  margin-top:.35rem;\r\n}\r\n#ov-admin-circle{\r\n  width:28px;\r\n  height:28px;\r\n  border-radius:999px;\r\n  background:#0ea5e9;\r\n  border:1px solid #38bdf8;\r\n  cursor:pointer;\r\n  flex-shrink:0;\r\n  transition:.16s;\r\n}\r\n#ov-admin-circle:hover{background:#38bdf8;}\r\n#ov-admin-circle:active{\r\n  background:#0284c7;\r\n  transform:scale(.94);\r\n}\r\n.ov-main-grid{\r\n  display:grid;\r\n  grid-template-columns:minmax(0,3fr) minmax(0,1.2fr);\r\n  gap:1.6rem;\r\n  align-items:start;\r\n}\r\n@media (max-width:1300px){\r\n  .ov-main-grid{grid-template-columns:1fr;}\r\n}\r\n.ov-player{\r\n  background:#020617;\r\n  border-radius:1.4rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.6rem;\r\n}\r\n.ov-player-iframe{\r\n  width:100%;\r\n  aspect-ratio:16\/9;\r\n  border-radius:1rem;\r\n  border:none;\r\n  background:#000;\r\n}\r\n.ov-player-meta{margin-top:1rem;}\r\n.ov-player-title{font-size:1.25rem;font-weight:600;margin-bottom:.35rem;}\r\n.ov-player-desc{font-size:.93rem;color:#9ca3af;line-height:1.5;}\r\n.ov-list{\r\n  background:#020617;\r\n  border-radius:1.6rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.1rem;\r\n  max-height:580px;\r\n  display:flex;\r\n  flex-direction:column;\r\n}\r\n.ov-search-section{\r\n  padding:0 0 .7rem 0;\r\n  border-bottom:1px solid #1f2937;\r\n  margin-bottom:.55rem;\r\n}\r\n.ov-search-input{\r\n  width:100%;\r\n  background:#020617;\r\n  border:1px solid #1f2937;\r\n  border-radius:.9rem;\r\n  padding:.5rem .8rem;\r\n  color:#e5e7eb;\r\n  font-size:.8rem;\r\n  outline:none;\r\n  font-weight:500;\r\n  margin-bottom:.35rem;\r\n}\r\n.ov-search-input:focus{\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 2px rgba(14,165,233,.25);\r\n}\r\n.ov-chips-container{\r\n  display:flex;\r\n  gap:.35rem;\r\n  overflow-x:auto;\r\n  padding:.1rem 0;\r\n  scrollbar-width:thin;\r\n}\r\n.ov-chips-container::-webkit-scrollbar{height:4px;}\r\n.ov-chips-container::-webkit-scrollbar-track{background:transparent;}\r\n.ov-chips-container::-webkit-scrollbar-thumb{\r\n  background:#1f2937;\r\n  border-radius:999px;\r\n}\r\n.ov-chip{\r\n  padding:.25rem .7rem;\r\n  border-radius:999px;\r\n  font-size:.7rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n  white-space:nowrap;\r\n  flex-shrink:0;\r\n  transition:.2s;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  border:1px solid #4b5563;\r\n}\r\n.ov-chip.active,\r\n.ov-chip:hover{\r\n  background:#0ea5e9!important;\r\n  color:#020617!important;\r\n  transform:translateY(-1px);\r\n}\r\n.ov-list-title{\r\n  font-size:.95rem;\r\n  font-weight:600;\r\n  color:#0ea5e9;\r\n  margin-bottom:.5rem;\r\n}\r\n.ov-video-list-container{\r\n  flex:1;\r\n  overflow:auto;\r\n  min-height:0;\r\n}\r\n.ov-list-item{\r\n  display:flex;\r\n  gap:.75rem;\r\n  padding:.8rem .55rem;\r\n  border-radius:.9rem;\r\n  cursor:pointer;\r\n  margin-bottom:.4rem;\r\n  transition:.18s;\r\n  background:rgba(15,23,42,.7);\r\n}\r\n.ov-list-item:hover{\r\n  background:rgba(14,165,233,.18);\r\n  transform:translateX(4px);\r\n}\r\n.ov-list-item.active{background:rgba(14,165,233,.35);}\r\n.ov-thumb{\r\n  width:100px;\r\n  height:56px;\r\n  border-radius:.6rem;\r\n  overflow:hidden;\r\n  flex-shrink:0;\r\n  background:#111827;\r\n}\r\n.ov-thumb img{\r\n  width:100%;\r\n  height:100%;\r\n  object-fit:cover;\r\n  display:block;\r\n}\r\n.ov-list-text{flex:1;min-width:0;}\r\n.ov-list-item-title{\r\n  font-size:1rem;\r\n  font-weight:600;\r\n  margin-bottom:.15rem;\r\n  white-space:nowrap;\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n}\r\n.ov-list-item-desc{\r\n  font-size:.83rem;\r\n  color:#9ca3af;\r\n  line-height:1.35;\r\n}\r\n#ov-toast{\r\n  position:fixed;\r\n  bottom:24px;\r\n  left:50%;\r\n  transform:translateX(-50%);\r\n  background:#10b981;\r\n  color:#01110a;\r\n  padding:0.6rem 1.5rem;\r\n  border-radius:999px;\r\n  font-size:.85rem;\r\n  font-weight:600;\r\n  z-index:9999;\r\n  opacity:0;\r\n  transition:all .25s;\r\n}\r\n#ov-toast.show{\r\n  opacity:1;\r\n  transform:translateX(-50%) translateY(-8px);\r\n}\r\n.ov-overlay{\r\n  position:fixed;\r\n  inset:0;\r\n  display:none;\r\n  align-items:center;\r\n  justify-content:center;\r\n  background:rgba(2,6,23,.96);\r\n  z-index:9990;\r\n  padding:1rem;\r\n}\r\n.ov-login-card{\r\n  background:#020617;\r\n  border-radius:1.75rem;\r\n  border:1px solid #1f2937;\r\n  padding:2rem 1.7rem;\r\n  width:100%;\r\n  max-width:420px;\r\n  text-align:center;\r\n  box-shadow:0 30px 80px rgba(0,0,0,.85);\r\n}\r\n.ov-login-title{\r\n  font-size:1.4rem;\r\n  font-weight:800;\r\n}\r\n.ov-login-sub{\r\n  margin-top:0.3rem;\r\n  font-size:.9rem;\r\n  color:#94a3b8;\r\n}\r\n.ov-login-input{\r\n  width:100%;\r\n  margin:1.2rem 0 0.4rem;\r\n  padding:0.85rem 1rem;\r\n  border-radius:0.9rem;\r\n  border:2px solid #475569;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:1rem;\r\n}\r\n.ov-login-input:focus{\r\n  outline:none;\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 3px rgba(14,165,233,.4);\r\n}\r\n.ov-login-btns{\r\n  margin-top:1rem;\r\n  display:flex;\r\n  gap:0.6rem;\r\n  justify-content:center;\r\n}\r\n.ov-btn{\r\n  padding:0.7rem 1.4rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  cursor:pointer;\r\n  font-size:.85rem;\r\n  font-weight:600;\r\n}\r\n.ov-btn-primary{background:#0ea5e9;color:#031016;}\r\n.ov-btn-secondary{background:#020617;color:#e5e7eb;border:1px solid #4b5563;}\r\n.ov-login-error{\r\n  margin-top:0.7rem;\r\n  min-height:1.1rem;\r\n  font-size:.85rem;\r\n  color:#fca5a5;\r\n}\r\n.ov-admin-panel{\r\n  display:none;\r\n  background:radial-gradient(circle at top,#0f172a,#020617 55%);\r\n  padding:2rem 2.2rem;\r\n  border-radius:1.8rem;\r\n  border:1px solid #1f2937;\r\n  max-width:1200px;\r\n  max-height:90vh;\r\n  margin:0 auto;\r\n  box-shadow:0 20px 60px rgba(0,0,0,.65);\r\n  overflow:auto;\r\n}\r\n.ov-admin-header{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  gap:1rem;\r\n  margin-bottom:1.5rem;\r\n}\r\n.ov-admin-title{\r\n  font-size:1.6rem;\r\n  font-weight:800;\r\n  background:linear-gradient(90deg,#0ea5e9,#7dd3fc);\r\n  -webkit-background-clip:text;\r\n  background-clip:text;\r\n  color:transparent;\r\n}\r\n.ov-admin-badge{\r\n  font-size:.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-close{\r\n  padding:0.6rem 1.3rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:#ef4444;\r\n  color:#f9fafb;\r\n  font-size:.9rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n.ov-admin-stats{\r\n  display:grid;\r\n  grid-template-columns:repeat(auto-fit,minmax(180px,1fr));\r\n  gap:1rem;\r\n  margin-bottom:1.8rem;\r\n}\r\n.ov-admin-stat{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.1rem;\r\n  border:1px solid #1f2937;\r\n  padding:1rem 1.2rem;\r\n}\r\n.ov-admin-stat-label{\r\n  font-size:.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-stat-value{\r\n  margin-top:0.4rem;\r\n  font-size:1.4rem;\r\n  font-weight:700;\r\n  color:#0ea5e9;\r\n}\r\n.ov-admin-grid{\r\n  display:grid;\r\n  grid-template-columns:1.6fr 1.1fr;\r\n  gap:1.5rem;\r\n}\r\n@media (max-width:900px){\r\n  .ov-admin-grid{grid-template-columns:1fr;}\r\n}\r\n.ov-admin-block{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.3rem;\r\n  border:1px solid #1f2937;\r\n  padding:1.4rem 1.5rem;\r\n}\r\n.ov-admin-block-title{\r\n  font-size:1rem;\r\n  font-weight:600;\r\n  margin-bottom:0.8rem;\r\n  color:#0ea5e9;\r\n}\r\n.ov-admin-table-wrap{\r\n  max-height:460px;\r\n  overflow:auto;\r\n  border-radius:1rem;\r\n  border:1px solid #1f2937;\r\n}\r\n.ov-admin-table{\r\n  width:100%;\r\n  border-collapse:collapse;\r\n  font-size:.85rem;\r\n}\r\n.ov-admin-table thead{\r\n  position:sticky;\r\n  top:0;\r\n  background:#020617;\r\n  z-index:1;\r\n}\r\n.ov-admin-table th,\r\n.ov-admin-table td{\r\n  padding:0.55rem 0.6rem;\r\n  border-bottom:1px solid #1f2937;\r\n}\r\n.ov-admin-table th{\r\n  text-align:left;\r\n  font-size:.75rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.ov-admin-table tbody tr:hover{\r\n  background:rgba(15,118,110,.12);\r\n}\r\n.ov-admin-actions{\r\n  white-space:nowrap;\r\n}\r\n.ov-admin-actions button{\r\n  border:none;\r\n  padding:0.2rem 0.7rem;\r\n  border-radius:999px;\r\n  font-size:.75rem;\r\n  margin-right:0.25rem;\r\n  cursor:pointer;\r\n}\r\n.ov-btn-edit{background:#f59e0b;color:#111827;}\r\n.ov-btn-del{background:#ef4444;color:#f9fafb;}\r\n.ov-admin-input,\r\n.ov-admin-textarea{\r\n  width:100%;\r\n  padding:0.7rem 0.85rem;\r\n  border-radius:0.9rem;\r\n  border:1px solid #374151;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:.9rem;\r\n  margin-bottom:0.7rem;\r\n}\r\n.ov-admin-textarea{\r\n  min-height:80px;\r\n  resize:vertical;\r\n}\r\n.ov-admin-input:focus,\r\n.ov-admin-textarea:focus{\r\n  outline:none;\r\n  border-color:#0ea5e9;\r\n  box-shadow:0 0 0 2px rgba(14,165,233,.35);\r\n}\r\n.ov-admin-btn-row{\r\n  display:flex;\r\n  justify-content:flex-end;\r\n  gap:0.7rem;\r\n  margin-top:0.4rem;\r\n}\r\n.ov-admin-btn-secondary{\r\n  padding:0.55rem 1.1rem;\r\n  border-radius:999px;\r\n  border:1px solid #4b5563;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:.8rem;\r\n  cursor:pointer;\r\n}\r\n.ov-admin-btn-primary{\r\n  padding:0.55rem 1.2rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:#0ea5e9;\r\n  color:#02121f;\r\n  font-size:.8rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n<\/style>\r\n\r\n<div class=\"ov-video-admin\">\r\n  <div id=\"ov-toast\"><\/div>\r\n\r\n  <div class=\"ov-video-shell\">\r\n    <div class=\"ov-video-header\">\r\n      <div class=\"ov-video-header-left\">\r\n        <h2 class=\"ov-video-title\">\ud83c\udfac Reproductor de v\u00eddeos \u00b7 Olas de Vida<\/h2>\r\n        <p class=\"ov-video-sub\">Selecciona un v\u00eddeo del listado para verlo en el reproductor principal.<\/p>\r\n      <\/div>\r\n      <button id=\"ov-admin-circle\" type=\"button\" title=\"Panel de control\"><\/button>\r\n    <\/div>\r\n\r\n    <div class=\"ov-main-grid\">\r\n      <div class=\"ov-player\">\r\n        <iframe\r\n          id=\"ov-player-frame\"\r\n          class=\"ov-player-iframe\"\r\n          src=\"https:\/\/www.youtube.com\/embed\/vLMNtaTYbF4?rel=0&autoplay=0\"\r\n          allowfullscreen\r\n          allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\">\r\n        <\/iframe>\r\n        <div class=\"ov-player-meta\">\r\n          <div class=\"ov-player-title\" id=\"ov-player-title\">Conozca todo sobre el c\u00e1ncer<\/div>\r\n          <div class=\"ov-player-desc\" id=\"ov-player-desc\">\r\n            Onc\u00f3logo Cl\u00ednica Universidad de Navarra \u00b7 V\u00cdDEO INICIAL CARGADO.\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ov-list\">\r\n        <div class=\"ov-search-section\">\r\n          <input\r\n            type=\"text\"\r\n            class=\"ov-search-input\"\r\n            id=\"ov-search-input\"\r\n            placeholder=\"\ud83d\udd0d Buscar tratamientos, apoyo, tipos de c\u00e1ncer...\">\r\n          <div class=\"ov-chips-container\" id=\"ov-chips-container\">\r\n            <span class=\"ov-chip active\" data-filter=\"all\">Todos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"tratamientos\">Tratamientos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"apoyo\">Apoyo emocional<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"familiares\">Familiares<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"tipos\">Tipos de c\u00e1ncer<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"ultimos\">\u00daltimos v\u00eddeos<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"internacional\">Internacional<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"investigacion\">Investigaci\u00f3n<\/span>\r\n            <span class=\"ov-chip\" data-filter=\"cortos\">Cortos<\/span>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ov-list-title\">\u00daltimos v\u00eddeos<\/div>\r\n        <div class=\"ov-video-list-container\" id=\"ov-video-list\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"ov-overlay\" id=\"ov-overlay\">\r\n    <div class=\"ov-login-card\" id=\"ov-login-card\">\r\n      <div class=\"ov-login-title\">Olas de Vida<\/div>\r\n      <div class=\"ov-login-sub\">Panel de control de v\u00eddeos \u00b7 Contrase\u00f1a: olas2025<\/div>\r\n      <input\r\n        type=\"password\"\r\n        id=\"ov-admin-pass\"\r\n        class=\"ov-login-input\"\r\n        placeholder=\"Contrase\u00f1a\"\r\n        autocomplete=\"off\">\r\n      <div class=\"ov-login-btns\">\r\n        <button class=\"ov-btn ov-btn-secondary\" id=\"ov-login-cancel\">Cancelar<\/button>\r\n        <button class=\"ov-btn ov-btn-primary\" id=\"ov-login-submit\">Acceder<\/button>\r\n      <\/div>\r\n      <div class=\"ov-login-error\" id=\"ov-login-error\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"ov-admin-panel\" id=\"ov-admin-panel\">\r\n      <div class=\"ov-admin-header\">\r\n        <div>\r\n          <div class=\"ov-admin-title\">Panel V\u00eddeos PRO<\/div>\r\n          <div class=\"ov-admin-badge\">Olas de Vida \u00b7 Videoteca interna<\/div>\r\n        <\/div>\r\n        <div>\r\n          <button class=\"ov-admin-btn-secondary\" id=\"ov-admin-sync\">Sincronizar con Sheets<\/button>\r\n          <button class=\"ov-admin-close\" id=\"ov-admin-close\">Cerrar<\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ov-admin-stats\">\r\n        <div class=\"ov-admin-stat\">\r\n          <div class=\"ov-admin-stat-label\">Total v\u00eddeos<\/div>\r\n          <div class=\"ov-admin-stat-value\" id=\"ov-total\">0<\/div>\r\n        <\/div>\r\n        <div class=\"ov-admin-stat\">\r\n          <div class=\"ov-admin-stat-label\">\u00daltima actualizaci\u00f3n<\/div>\r\n          <div class=\"ov-admin-stat-value\" id=\"ov-last\">\u2014<\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"ov-admin-grid\">\r\n        <div class=\"ov-admin-block\">\r\n          <div class=\"ov-admin-block-title\">Listado de v\u00eddeos<\/div>\r\n          <div class=\"ov-admin-table-wrap\">\r\n            <table class=\"ov-admin-table\">\r\n              <thead>\r\n                <tr>\r\n                  <th>#<\/th>\r\n                  <th>T\u00edtulo<\/th>\r\n                  <th>ID YouTube<\/th>\r\n                  <th>Acciones<\/th>\r\n                <\/tr>\r\n              <\/thead>\r\n              <tbody id=\"ov-admin-tbody\"><\/tbody>\r\n            <\/table>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"ov-admin-block\">\r\n          <div class=\"ov-admin-block-title\" id=\"ov-admin-form-title\">A\u00f1adir nuevo v\u00eddeo<\/div>\r\n          <input type=\"text\" id=\"ov-admin-title\" class=\"ov-admin-input\" placeholder=\"T\u00edtulo del v\u00eddeo\">\r\n          <input type=\"text\" id=\"ov-admin-url\" class=\"ov-admin-input\" placeholder=\"URL completa o ID de YouTube\">\r\n          <textarea id=\"ov-admin-desc\" class=\"ov-admin-textarea\" placeholder=\"Descripci\u00f3n (opcional)\"><\/textarea>\r\n          <div class=\"ov-admin-btn-row\">\r\n            <button class=\"ov-admin-btn-secondary\" id=\"ov-admin-clear\">Limpiar<\/button>\r\n            <button class=\"ov-admin-btn-primary\" id=\"ov-admin-save\">Guardar<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const PASSWORD = \"olas2025\";\r\n  const STORAGE_KEY = \"olasdevida_videos_v1\";\r\n  const OV_SHEETS_API_URL = \"https:\/\/script.google.com\/macros\/s\/AKfycbwUZ3A35bXHucXjJR0SAm6wVZ8Vp1AVHPtk1T3WTUAC3sE1wJ-JNdSxJ5g7v-aGcqm9ZA\/exec\";\r\n\r\n  const DEFAULT_VIDEOS = [\r\n    { id:1, title:\"Conozca todo sobre el c\u00e1ncer\", desc:\"Onc\u00f3logo Cl\u00ednica Universidad de Navarra\", category:\"tratamientos\", youtubeId:\"vLMNtaTYbF4\" },\r\n    { id:2, title:\"C\u00e1ncer esquema tratamiento\", desc:\"Cirug\u00eda + quimio + radio\", category:\"tratamientos\", youtubeId:\"YNuYvqUqBiY\" },\r\n    { id:3, title:\"Quimioterapia funciona\", desc:\"Nucleus Health animaci\u00f3n\", category:\"tratamientos\", youtubeId:\"cmD5X86n98o\" },\r\n    { id:4, title:\"Radioterapia aplicaci\u00f3n\", desc:\"Equipos modernos cuidados\", category:\"tratamientos\", youtubeId:\"G0Xn4yJgFQw\" }\r\n  ];\r\n\r\n  let videos = [];\r\n  let currentIndex = 0;\r\n  let searchTerm = \"\";\r\n  let activeFilter = \"all\";\r\n  let editIndex = null;\r\n\r\n  function ovToast(msg){\r\n    const t = document.getElementById(\"ov-toast\");\r\n    if(!t) return;\r\n    t.textContent = msg;\r\n    t.classList.add(\"show\");\r\n    setTimeout(()=>t.classList.remove(\"show\"), 2200);\r\n  }\r\n\r\n  function extractId(u){\r\n    if(!u) return \"\";\r\n    u = u.trim();\r\n    if(\/^[a-zA-Z0-9_-]{10,12}$\/.test(u)) return u;\r\n    const m = u.match(\/(?:v=|youtu\\.be\\\/|embed\\\/)([a-zA-Z0-9_-]{10,12})\/);\r\n    return m ? m[1] : \"\";\r\n  }\r\n\r\n  function loadVideos(){\r\n    try{\r\n      const raw = localStorage.getItem(STORAGE_KEY);\r\n      const parsed = raw ? JSON.parse(raw) : null;\r\n      if(Array.isArray(parsed) && parsed.length){\r\n        videos = parsed;\r\n      }else{\r\n        videos = [...DEFAULT_VIDEOS];\r\n      }\r\n    }catch(e){\r\n      videos = [...DEFAULT_VIDEOS];\r\n    }\r\n  }\r\n\r\n  function saveVideos(){\r\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(videos));\r\n    localStorage.setItem(STORAGE_KEY+\"_last\", new Date().toISOString());\r\n    renderAdminTable();\r\n    renderPlayerAndList();\r\n    ovToast(\"Guardado\");\r\n  }\r\n\r\n  function filterVideos(){\r\n    return videos.filter(video=>{\r\n      const title = (video.title||\"\").toLowerCase();\r\n      const desc  = (video.desc||\"\").toLowerCase();\r\n      const cat   = (video.category||\"\").toLowerCase();\r\n      const term  = searchTerm.toLowerCase();\r\n\r\n      const matchesSearch = !term || title.includes(term) || desc.includes(term);\r\n      const matchesFilter = activeFilter===\"all\" ||\r\n        cat.includes(activeFilter) ||\r\n        title.includes(activeFilter) ||\r\n        (activeFilter===\"ultimos\" && video.id >= videos.length-2);\r\n\r\n      return matchesSearch && matchesFilter;\r\n    });\r\n  }\r\n\r\n  function renderPlayerAndList(){\r\n    if(!videos.length){\r\n      document.getElementById(\"ov-player-frame\").src = \"\";\r\n      document.getElementById(\"ov-player-title\").textContent = \"No hay v\u00eddeos disponibles\";\r\n      document.getElementById(\"ov-player-desc\").textContent  = \"A\u00f1ade v\u00eddeos desde el panel de control.\";\r\n      document.getElementById(\"ov-video-list\").innerHTML = \"\";\r\n      return;\r\n    }\r\n    if(currentIndex<0 || currentIndex>=videos.length) currentIndex = 0;\r\n    const v = videos[currentIndex];\r\n\r\n    const frame = document.getElementById(\"ov-player-frame\");\r\n    frame.src = \"https:\/\/www.youtube.com\/embed\/\"+v.youtubeId+\"?rel=0\";\r\n    document.getElementById(\"ov-player-title\").textContent = v.title || \"(Sin t\u00edtulo)\";\r\n    document.getElementById(\"ov-player-desc\").textContent  = v.desc || \"\";\r\n\r\n    const filtered = filterVideos();\r\n    const container = document.getElementById(\"ov-video-list\");\r\n    container.innerHTML = \"\";\r\n\r\n    filtered.forEach(item=>{\r\n      const el = document.createElement(\"div\");\r\n      const isActive = item.id === v.id;\r\n      el.className = \"ov-list-item\"+(isActive?\" active\":\"\");\r\n      el.onclick = ()=>{\r\n        const idx = videos.findIndex(x=>x.id===item.id);\r\n        if(idx!==-1) currentIndex = idx;\r\n        renderPlayerAndList();\r\n      };\r\n\r\n      const thumb = document.createElement(\"div\");\r\n      thumb.className = \"ov-thumb\";\r\n      const img = document.createElement(\"img\");\r\n      img.src = \"https:\/\/img.youtube.com\/vi\/\"+item.youtubeId+\"\/hqdefault.jpg\";\r\n      img.alt = item.title || \"V\u00eddeo\";\r\n      thumb.appendChild(img);\r\n\r\n      const text = document.createElement(\"div\");\r\n      text.className = \"ov-list-text\";\r\n\r\n      const tTitle = document.createElement(\"div\");\r\n      tTitle.className = \"ov-list-item-title\";\r\n      tTitle.textContent = item.title || \"(Sin t\u00edtulo)\";\r\n\r\n      const tDesc = document.createElement(\"div\");\r\n      tDesc.className = \"ov-list-item-desc\";\r\n      tDesc.textContent = item.desc || \"\";\r\n\r\n      text.appendChild(tTitle);\r\n      text.appendChild(tDesc);\r\n      el.appendChild(thumb);\r\n      el.appendChild(text);\r\n      container.appendChild(el);\r\n    });\r\n  }\r\n\r\n  function renderAdminTable(){\r\n    const tbody = document.getElementById(\"ov-admin-tbody\");\r\n    if(!tbody) return;\r\n    tbody.innerHTML = \"\";\r\n\r\n    videos.forEach((v,i)=>{\r\n      const tr = document.createElement(\"tr\");\r\n      tr.innerHTML = `\r\n        <td>${i+1}<\/td>\r\n        <td>${v.title || \"(Sin t\u00edtulo)\"}<\/td>\r\n        <td style=\"font-family:monospace;color:#7dd3fc\">${v.youtubeId}<\/td>\r\n        <td class=\"ov-admin-actions\">\r\n          <button class=\"ov-btn-edit\">Editar<\/button>\r\n          <button class=\"ov-btn-del\">Borrar<\/button>\r\n        <\/td>\r\n      `;\r\n      tr.querySelector(\".ov-btn-edit\").onclick = ()=>{\r\n        editIndex = i;\r\n        document.getElementById(\"ov-admin-form-title\").textContent = \"Editar v\u00eddeo\";\r\n        document.getElementById(\"ov-admin-title\").value = v.title || \"\";\r\n        document.getElementById(\"ov-admin-url\").value   = v.youtubeId || \"\";\r\n        document.getElementById(\"ov-admin-desc\").value  = v.desc || \"\";\r\n      };\r\n      tr.querySelector(\".ov-btn-del\").onclick = ()=>{\r\n        if(confirm(\"\u00bfBorrar este v\u00eddeo?\")){\r\n          videos.splice(i,1);\r\n          saveVideos();\r\n        }\r\n      };\r\n      tbody.appendChild(tr);\r\n    });\r\n\r\n    const totalEl = document.getElementById(\"ov-total\");\r\n    const lastEl  = document.getElementById(\"ov-last\");\r\n    if(totalEl) totalEl.textContent = videos.length;\r\n    if(lastEl){\r\n      const last = localStorage.getItem(STORAGE_KEY+\"_last\");\r\n      lastEl.textContent = last ? new Date(last).toLocaleString(\"es-ES\") : \"\u2014\";\r\n    }\r\n  }\r\n\r\n  function clearAdminForm(){\r\n    editIndex = null;\r\n    document.getElementById(\"ov-admin-form-title\").textContent = \"A\u00f1adir nuevo v\u00eddeo\";\r\n    document.getElementById(\"ov-admin-title\").value = \"\";\r\n    document.getElementById(\"ov-admin-url\").value   = \"\";\r\n    document.getElementById(\"ov-admin-desc\").value  = \"\";\r\n    const saveBtn = document.getElementById(\"ov-admin-save\");\r\n    if(saveBtn) saveBtn.textContent = \"Guardar\";\r\n  }\r\n\r\n  function openOverlay(){\r\n    const overlay = document.getElementById(\"ov-overlay\");\r\n    if(!overlay) return;\r\n    overlay.style.display = \"flex\";\r\n    const err = document.getElementById(\"ov-login-error\");\r\n    if(err) err.textContent = \"\";\r\n    const loginCard = document.getElementById(\"ov-login-card\");\r\n    const panelCard = document.getElementById(\"ov-admin-panel\");\r\n    loginCard.style.display = \"block\";\r\n    panelCard.style.display = \"none\";\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    if(passInput){\r\n      passInput.value = \"\";\r\n      setTimeout(()=>passInput.focus(), 200);\r\n    }\r\n  }\r\n\r\n  function closeOverlay(){\r\n    const overlay = document.getElementById(\"ov-overlay\");\r\n    if(overlay) overlay.style.display = \"none\";\r\n  }\r\n\r\n  function handleLogin(){\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    const error = document.getElementById(\"ov-login-error\");\r\n    if(!passInput || !error) return;\r\n    const val = passInput.value.trim();\r\n    if(val === PASSWORD){\r\n      document.getElementById(\"ov-login-card\").style.display = \"none\";\r\n      document.getElementById(\"ov-admin-panel\").style.display = \"block\";\r\n      loadVideos();\r\n      renderAdminTable();\r\n      ovToast(\"Acceso al Panel PRO\");\r\n    }else{\r\n      error.textContent = \"Contrase\u00f1a incorrecta\";\r\n    }\r\n  }\r\n\r\n  function saveFromAdmin(){\r\n    const t = document.getElementById(\"ov-admin-title\").value.trim();\r\n    const u = document.getElementById(\"ov-admin-url\").value.trim();\r\n    const d = document.getElementById(\"ov-admin-desc\").value.trim();\r\n    const youtubeId = extractId(u);\r\n    if(!t || !youtubeId){\r\n      alert(\"T\u00edtulo o ID de YouTube inv\u00e1lidos.\");\r\n      return;\r\n    }\r\n    if(editIndex!==null){\r\n      videos[editIndex] = {...videos[editIndex], title:t, desc:d, youtubeId};\r\n    }else{\r\n      const newId = videos.length ? Math.max(...videos.map(v=>v.id||0))+1 : 1;\r\n      videos.push({id:newId,title:t,desc:d,youtubeId});\r\n    }\r\n    saveVideos();\r\n    clearAdminForm();\r\n  }\r\n\r\n  function mapCategoriaToSlug(cat){\r\n    const c = (cat || \"\").toLowerCase();\r\n    if (c.includes(\"tratamientos\")) return \"tratamientos\";\r\n    if (c.includes(\"apoyo\")) return \"apoyo\";\r\n    if (c.includes(\"familia\")) return \"familiares\";\r\n    if (c.includes(\"ni\u00f1\") || c.includes(\"nino\") || c.includes(\"ninos\")) return \"ninos\";\r\n    if (c.includes(\"tipos\")) return \"tipos\";\r\n    if (c.includes(\"investig\")) return \"investigacion\";\r\n    if (c.includes(\"internacional\")) return \"internacional\";\r\n    if (c.includes(\"cortos\")) return \"cortos\";\r\n    return \"otros\";\r\n  }\r\n\r\n  function ovSyncFromSheets(){\r\n    if (!OV_SHEETS_API_URL) {\r\n      ovToast(\"Falta URL de Sheets\");\r\n      return;\r\n    }\r\n    ovToast(\"Sincronizando con Sheets...\");\r\n\r\n    fetch(OV_SHEETS_API_URL)\r\n      .then(r => r.json())\r\n      .then(data => {\r\n        if (!Array.isArray(data)) {\r\n          ovToast(\"Respuesta inv\u00e1lida\");\r\n          return;\r\n        }\r\n\r\n        const fromSheets = data\r\n          .filter(row => row.url)\r\n          .map((row, idx) => {\r\n            const youtubeId = extractId(row.url);\r\n            return {\r\n              id: idx + 1,\r\n              title: row.nombre || \"\",\r\n              desc: row.descripcion || \"\",\r\n              category: mapCategoriaToSlug(row.categoria || \"\"),\r\n              youtubeId: youtubeId\r\n            };\r\n          })\r\n          .filter(v => v.youtubeId);\r\n\r\n        if (!fromSheets.length) {\r\n          ovToast(\"No hay v\u00eddeos v\u00e1lidos en Sheets\");\r\n          return;\r\n        }\r\n\r\n        videos = fromSheets;\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(videos));\r\n        localStorage.setItem(STORAGE_KEY + \"_last\", new Date().toISOString());\r\n        currentIndex = 0;\r\n        renderAdminTable();\r\n        renderPlayerAndList();\r\n        ovToast(\"Sincronizaci\u00f3n completada\");\r\n      })\r\n      .catch(err => {\r\n        console.error(err);\r\n        ovToast(\"Error al conectar con Sheets\");\r\n      });\r\n  }\r\n\r\n  function setupSearchAndFilters(){\r\n    const input = document.getElementById(\"ov-search-input\");\r\n    if(input){\r\n      input.addEventListener(\"input\", e=>{\r\n        searchTerm = e.target.value || \"\";\r\n        renderPlayerAndList();\r\n      });\r\n    }\r\n    const chips = document.querySelectorAll(\".ov-chip\");\r\n    chips.forEach(ch=>{\r\n      ch.addEventListener(\"click\", ()=>{\r\n        chips.forEach(c=>c.classList.remove(\"active\"));\r\n        ch.classList.add(\"active\");\r\n        activeFilter = ch.getAttribute(\"data-filter\") || \"all\";\r\n        renderPlayerAndList();\r\n      });\r\n    });\r\n  }\r\n\r\n  document.addEventListener(\"DOMContentLoaded\", function(){\r\n    loadVideos();\r\n    renderPlayerAndList();\r\n    setupSearchAndFilters();\r\n\r\n    const circle = document.getElementById(\"ov-admin-circle\");\r\n    if(circle) circle.onclick = openOverlay;\r\n\r\n    const cancelBtn = document.getElementById(\"ov-login-cancel\");\r\n    if(cancelBtn) cancelBtn.onclick = closeOverlay;\r\n\r\n    const loginBtn = document.getElementById(\"ov-login-submit\");\r\n    if(loginBtn) loginBtn.onclick = handleLogin;\r\n\r\n    const closePanel = document.getElementById(\"ov-admin-close\");\r\n    if(closePanel) closePanel.onclick = closeOverlay;\r\n\r\n    const saveBtn = document.getElementById(\"ov-admin-save\");\r\n    if(saveBtn) saveBtn.onclick = saveFromAdmin;\r\n\r\n    const clearBtn = document.getElementById(\"ov-admin-clear\");\r\n    if(clearBtn) clearBtn.onclick = clearAdminForm;\r\n\r\n    const syncBtn = document.getElementById(\"ov-admin-sync\");\r\n    if (syncBtn) syncBtn.onclick = ovSyncFromSheets;\r\n\r\n    const passInput = document.getElementById(\"ov-admin-pass\");\r\n    if(passInput){\r\n      passInput.addEventListener(\"keydown\", e=>{\r\n        if(e.key === \"Enter\") handleLogin();\r\n      });\r\n    }\r\n  });\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-1aa444e e-con-full e-flex e-con e-parent\" data-id=\"1aa444e\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cc0223c elementor-widget elementor-widget-html\" data-id=\"cc0223c\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n:root{\r\n  --bg:#020617;--card:#0f172a;--border:#1e293b;--text:#e5e7eb;\r\n  --muted:#94a3b8;--accent:#0ea5e9;--danger:#ef4444;--success:#10b981;--warn:#f59e0b;\r\n}\r\n.odv-panel-wrapper{\r\n  font-family:system-ui,-apple-system,sans-serif;\r\n  background:var(--bg);\r\n  color:var(--text);\r\n  padding:20px;\r\n  border-radius:20px;\r\n}\r\n.odv-toast{\r\n  position:fixed;\r\n  bottom:24px;\r\n  left:50%;\r\n  transform:translateX(-50%);\r\n  background:#10b981;\r\n  color:#000;\r\n  padding:10px 24px;\r\n  border-radius:999px;\r\n  font-weight:600;\r\n  z-index:9999;\r\n  opacity:0;\r\n  transition:all .25s;\r\n}\r\n.odv-toast.show{\r\n  opacity:1;\r\n  transform:translateX(-50%) translateY(-8px);\r\n}\r\n\r\n\/* Bloque login dentro del widget, NO full screen *\/\r\n.odv-lock-card{\r\n  background:var(--card);\r\n  padding:1.8rem 2rem;\r\n  border-radius:1.5rem;\r\n  border:1px solid var(--border);\r\n  max-width:420px;\r\n  margin:0 auto 1.5rem auto;\r\n  text-align:center;\r\n  box-shadow:0 20px 40px rgba(0,0,0,.6);\r\n}\r\n.odv-pass-input{\r\n  width:100%;\r\n  padding:0.9rem 1.1rem;\r\n  border-radius:0.9rem;\r\n  border:2px solid #475569;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:1.1rem;\r\n  margin:1.4rem 0 0.5rem;\r\n}\r\n.odv-pass-input:focus{\r\n  outline:none;\r\n  border-color:var(--accent);\r\n  box-shadow:0 0 0 3px rgba(14,165,233,.4);\r\n}\r\n.odv-btn{\r\n  padding:0.9rem 2rem;\r\n  border:none;\r\n  border-radius:999px;\r\n  background:var(--accent);\r\n  color:#020617;\r\n  font-weight:700;\r\n  cursor:pointer;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:0.4rem;\r\n  transition:.18s;\r\n}\r\n.odv-btn:hover{\r\n  transform:translateY(-2px);\r\n}\r\n\r\n\/* Panel *\/\r\n.odv-panel{\r\n  display:none;\r\n  background:radial-gradient(circle at top,#0f172a,#020617 55%);\r\n  padding:2rem 2.2rem;\r\n  border-radius:1.8rem;\r\n  border:1px solid var(--border);\r\n  max-width:1200px;\r\n  margin:0 auto;\r\n  box-shadow:0 20px 60px rgba(0,0,0,.65);\r\n}\r\n.odv-panel-header{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  gap:1rem;\r\n  margin-bottom:1.5rem;\r\n}\r\n.odv-title{\r\n  font-size:2rem;\r\n  font-weight:800;\r\n  background:linear-gradient(90deg,#0ea5e9,#7dd3fc);\r\n  -webkit-background-clip:text;\r\n  background-clip:text;\r\n  color:transparent;\r\n}\r\n.odv-badge{\r\n  font-size:0.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:var(--muted);\r\n}\r\n.odv-btn-exit{\r\n  padding:0.6rem 1.3rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:var(--danger);\r\n  color:#fff;\r\n  font-size:0.9rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n\r\n\/* Stats *\/\r\n.odv-stats{\r\n  display:grid;\r\n  grid-template-columns:repeat(auto-fit,minmax(180px,1fr));\r\n  gap:1rem;\r\n  margin-bottom:1.8rem;\r\n}\r\n.odv-stat{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.1rem;\r\n  border:1px solid var(--border);\r\n  padding:1rem 1.2rem;\r\n}\r\n.odv-stat-label{\r\n  font-size:0.8rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:var(--muted);\r\n}\r\n.odv-stat-value{\r\n  margin-top:0.4rem;\r\n  font-size:1.6rem;\r\n  font-weight:700;\r\n  color:var(--accent);\r\n}\r\n\r\n\/* Main *\/\r\n.odv-main{\r\n  display:grid;\r\n  grid-template-columns:1.6fr 1.1fr;\r\n  gap:1.5rem;\r\n}\r\n@media (max-width:900px){\r\n  .odv-main{grid-template-columns:1fr}\r\n}\r\n\r\n\/* Blocks *\/\r\n.odv-block{\r\n  background:rgba(15,23,42,.9);\r\n  border-radius:1.3rem;\r\n  border:1px solid var(--border);\r\n  padding:1.4rem 1.5rem;\r\n}\r\n.odv-block-title{\r\n  font-size:1rem;\r\n  font-weight:600;\r\n  margin-bottom:0.8rem;\r\n  color:var(--accent);\r\n}\r\n\r\n\/* Tabla *\/\r\n.odv-table-wrap{\r\n  max-height:460px;\r\n  overflow:auto;\r\n  border-radius:1rem;\r\n  border:1px solid #1f2937;\r\n}\r\n.odv-table{\r\n  width:100%;\r\n  border-collapse:collapse;\r\n  font-size:0.9rem;\r\n}\r\n.odv-table thead{\r\n  position:sticky;\r\n  top:0;\r\n  background:#020617;\r\n  z-index:1;\r\n}\r\n.odv-table th,\r\n.odv-table td{\r\n  padding:0.55rem 0.6rem;\r\n  border-bottom:1px solid #1f2937;\r\n}\r\n.odv-table th{\r\n  text-align:left;\r\n  font-size:0.75rem;\r\n  text-transform:uppercase;\r\n  letter-spacing:.08em;\r\n  color:#94a3b8;\r\n}\r\n.odv-table tbody tr:hover{\r\n  background:rgba(15,118,110,.12);\r\n}\r\n.odv-actions{\r\n  white-space:nowrap;\r\n}\r\n.odv-actions button{\r\n  border:none;\r\n  padding:0.2rem 0.7rem;\r\n  border-radius:999px;\r\n  font-size:0.75rem;\r\n  margin-right:0.25rem;\r\n  cursor:pointer;\r\n}\r\n.odv-btn-edit{background:var(--warn);color:#111827;}\r\n.odv-btn-delete{background:var(--danger);color:#f9fafb;}\r\n\r\n\/* Inputs *\/\r\n.odv-input,\r\n.odv-textarea{\r\n  width:100%;\r\n  padding:0.7rem 0.85rem;\r\n  border-radius:0.9rem;\r\n  border:1px solid #374151;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:0.9rem;\r\n  margin-bottom:0.7rem;\r\n}\r\n.odv-input:focus,\r\n.odv-textarea:focus{\r\n  outline:none;\r\n  border-color:var(--accent);\r\n  box-shadow:0 0 0 2px rgba(14,165,233,.35);\r\n}\r\n.odv-textarea{min-height:80px;resize:vertical}\r\n.odv-btn-row{\r\n  display:flex;\r\n  justify-content:flex-end;\r\n  gap:0.7rem;\r\n  margin-top:0.4rem;\r\n}\r\n.odv-btn-secondary{\r\n  padding:0.55rem 1.1rem;\r\n  border-radius:999px;\r\n  border:1px solid #4b5563;\r\n  background:#020617;\r\n  color:#e5e7eb;\r\n  font-size:0.8rem;\r\n  cursor:pointer;\r\n}\r\n.odv-btn-primary-sm{\r\n  padding:0.55rem 1.2rem;\r\n  border-radius:999px;\r\n  border:none;\r\n  background:var(--accent);\r\n  color:#02121f;\r\n  font-size:0.8rem;\r\n  font-weight:600;\r\n  cursor:pointer;\r\n}\r\n<\/style>\r\n\r\n<div class=\"odv-panel-wrapper\">\r\n  <div id=\"odv-toast\" class=\"odv-toast\"><\/div>\r\n\r\n  <!-- LOGIN LOCAL -->\r\n  <div class=\"odv-lock-card\" id=\"odv-lock\">\r\n    <h2 style=\"font-size:2rem;font-weight:800;margin-bottom:0.2rem;\">Olas de Vida<\/h2>\r\n    <p style=\"color:var(--muted);font-size:0.9rem;\">Panel de Control de V\u00eddeos PRO<\/p>\r\n\r\n    <div style=\"position:relative;display:flex;align-items:center;gap:0.5rem;\">\r\n      <input\r\n        type=\"password\"\r\n        id=\"odv-pass\"\r\n        class=\"odv-pass-input\"\r\n        placeholder=\"Contrase\u00f1a (olas2025)\"\r\n        autocomplete=\"off\"\r\n        style=\"padding-right:2.2rem;\"\r\n      \/>\r\n      <button\r\n        type=\"button\"\r\n        id=\"odv-togglePass\"\r\n        style=\"\r\n          width:26px;\r\n          height:26px;\r\n          border-radius:999px;\r\n          border:none;\r\n          background:#0ea5e9;\r\n          cursor:pointer;\r\n          display:flex;\r\n          align-items:center;\r\n          justify-content:center;\r\n          flex-shrink:0;\r\n          color:#020617;\r\n          font-size:14px;\r\n          font-weight:700;\r\n        \"\r\n        title=\"Mostrar \/ ocultar contrase\u00f1a\"\r\n      >\r\n        \u2022\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <button class=\"odv-btn\" id=\"odv-enter\">\r\n      ACCEDER\r\n    <\/button>\r\n\r\n    <p id=\"odv-error\" style=\"color:#fca5a5;margin-top:0.8rem;height:1.2rem;font-weight:600;font-size:0.9rem;\"><\/p>\r\n  <\/div>\r\n\r\n  <!-- PANEL -->\r\n  <div class=\"odv-panel\" id=\"odv-panel\">\r\n    <div class=\"odv-panel-header\">\r\n      <div>\r\n        <div class=\"odv-title\">Panel V\u00eddeos PRO<\/div>\r\n        <div class=\"odv-badge\">Olas de Vida \u00b7 Videoteca interna<\/div>\r\n      <\/div>\r\n      <button class=\"odv-btn-exit\" onclick=\"window.location.href='https:\/\/olasdevida.es'\">\r\n        Salir\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <div class=\"odv-stats\">\r\n      <div class=\"odv-stat\">\r\n        <div class=\"odv-stat-label\">Total v\u00eddeos<\/div>\r\n        <div class=\"odv-stat-value\" id=\"odv-total\">0<\/div>\r\n      <\/div>\r\n      <div class=\"odv-stat\">\r\n        <div class=\"odv-stat-label\">\u00daltima actualizaci\u00f3n<\/div>\r\n        <div class=\"odv-stat-value\" id=\"odv-last\">\u2014<\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"odv-main\">\r\n      <!-- LISTADO -->\r\n      <div class=\"odv-block\">\r\n        <div class=\"odv-block-title\">Listado de v\u00eddeos<\/div>\r\n        <div class=\"odv-table-wrap\">\r\n          <table class=\"odv-table\">\r\n            <thead>\r\n              <tr>\r\n                <th>#<\/th>\r\n                <th>T\u00edtulo<\/th>\r\n                <th>ID YouTube<\/th>\r\n                <th>Acciones<\/th>\r\n              <\/tr>\r\n            <\/thead>\r\n            <tbody id=\"odv-tbody\"><\/tbody>\r\n          <\/table>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- FORMULARIO -->\r\n      <div class=\"odv-block\">\r\n        <div class=\"odv-block-title\" id=\"odv-formTitle\">A\u00f1adir nuevo v\u00eddeo<\/div>\r\n        <form id=\"odv-form\">\r\n          <input type=\"text\" id=\"odv-title\" class=\"odv-input\" placeholder=\"T\u00edtulo del v\u00eddeo\" required \/>\r\n          <input type=\"text\" id=\"odv-url\" class=\"odv-input\" placeholder=\"URL completa o ID de YouTube\" required \/>\r\n          <textarea id=\"odv-desc\" class=\"odv-textarea\" placeholder=\"Descripci\u00f3n (opcional)\"><\/textarea>\r\n\r\n          <div class=\"odv-btn-row\">\r\n            <button type=\"button\" class=\"odv-btn-secondary\" id=\"odv-clear\">Limpiar<\/button>\r\n            <button type=\"submit\" class=\"odv-btn-primary-sm\" id=\"odv-saveBtn\">Guardar<\/button>\r\n          <\/div>\r\n        <\/form>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function(){\r\n  const PASSWORD = \"olas2025\";\r\n  const STORAGE_KEY = \"olasdevida_videos_v1\";\r\n\r\n  const DEFAULT_VIDEOS = [\r\n    { id:1, title:\"Bienvenidos a Olas de Vida\", desc:\"Presentaci\u00f3n general\", youtubeId:\"dQw4w9WgXcQ\" },\r\n    { id:2, title:\"Nutrici\u00f3n oncol\u00f3gica\", desc:\"Pautas b\u00e1sicas\", youtubeId:\"9bZkp7q19f0\" },\r\n  ];\r\n\r\n  let videos = [];\r\n  let editMode = false;\r\n  let selectedIndex = null;\r\n\r\n  function showToast(message){\r\n    const t = document.getElementById(\"odv-toast\");\r\n    if(!t) return;\r\n    t.textContent = message;\r\n    t.classList.add(\"show\");\r\n    setTimeout(()=>t.classList.remove(\"show\"), 2200);\r\n  }\r\n\r\n  function extractId(u){\r\n    if(!u) return \"\";\r\n    u = u.trim();\r\n    if(\/^[a-zA-Z0-9_-]{10,12}$\/.test(u)) return u;\r\n    const m = u.match(\/(?:v=|youtu\\\\.be\\\\\/|embed\\\\\/)([a-zA-Z0-9_-]{10,12})\/);\r\n    return m ? m[1] : \"\";\r\n  }\r\n\r\n  function loadVideos(){\r\n    try{\r\n      const raw = localStorage.getItem(STORAGE_KEY);\r\n      videos = raw ? JSON.parse(raw) : [...DEFAULT_VIDEOS];\r\n      if(!Array.isArray(videos)) videos = [...DEFAULT_VIDEOS];\r\n    }catch(e){\r\n      videos = [...DEFAULT_VIDEOS];\r\n    }\r\n  }\r\n\r\n  function saveVideos(){\r\n    localStorage.setItem(STORAGE_KEY, JSON.stringify(videos));\r\n    localStorage.setItem(STORAGE_KEY+\"_last\", new Date().toISOString());\r\n    renderTable();\r\n    showToast(\"Guardado\");\r\n  }\r\n\r\n  function renderTable(){\r\n    const tbody = document.getElementById(\"odv-tbody\");\r\n    if(!tbody) return;\r\n    tbody.innerHTML = \"\";\r\n\r\n    videos.forEach((v, i)=>{\r\n      const tr = document.createElement(\"tr\");\r\n      tr.innerHTML = `\r\n        <td>${i+1}<\/td>\r\n        <td>${v.title}<\/td>\r\n        <td style=\"font-family:monospace;color:#7dd3fc\">${v.youtubeId}<\/td>\r\n        <td class=\"odv-actions\">\r\n          <button class=\"odv-btn-edit\">Editar<\/button>\r\n          <button class=\"odv-btn-delete\">Borrar<\/button>\r\n        <\/td>\r\n      `;\r\n      tr.querySelector(\".odv-btn-edit\").onclick = ()=>editVideo(i);\r\n      tr.querySelector(\".odv-btn-delete\").onclick = ()=>{\r\n        if(confirm(\"\u00bfBorrar este v\u00eddeo?\")){\r\n          videos.splice(i,1);\r\n          saveVideos();\r\n        }\r\n      };\r\n      tbody.appendChild(tr);\r\n    });\r\n\r\n    const totalEl = document.getElementById(\"odv-total\");\r\n    const lastEl = document.getElementById(\"odv-last\");\r\n    if(totalEl) totalEl.textContent = videos.length;\r\n    if(lastEl){\r\n      const last = localStorage.getItem(STORAGE_KEY+\"_last\");\r\n      lastEl.textContent = last ? new Date(last).toLocaleString(\"es-ES\") : \"\u2014\";\r\n    }\r\n  }\r\n\r\n  function editVideo(index){\r\n    const v = videos[index];\r\n    selectedIndex = index;\r\n    editMode = true;\r\n    document.getElementById(\"odv-formTitle\").textContent = \"Editar v\u00eddeo\";\r\n    document.getElementById(\"odv-saveBtn\").textContent = \"Actualizar\";\r\n    document.getElementById(\"odv-title\").value = v.title;\r\n    document.getElementById(\"odv-url\").value = v.youtubeId;\r\n    document.getElementById(\"odv-desc\").value = v.desc || \"\";\r\n  }\r\n\r\n  function resetForm(){\r\n    const form = document.getElementById(\"odv-form\");\r\n    if(form) form.reset();\r\n    editMode = false;\r\n    selectedIndex = null;\r\n    document.getElementById(\"odv-formTitle\").textContent = \"A\u00f1adir nuevo v\u00eddeo\";\r\n    document.getElementById(\"odv-saveBtn\").textContent = \"Guardar\";\r\n  }\r\n\r\n  function setupLogin(){\r\n    const lock = document.getElementById(\"odv-lock\");\r\n    const panel = document.getElementById(\"odv-panel\");\r\n    const passInput = document.getElementById(\"odv-pass\");\r\n    const error = document.getElementById(\"odv-error\");\r\n    const enterBtn = document.getElementById(\"odv-enter\");\r\n    const togglePassBtn = document.getElementById(\"odv-togglePass\");\r\n\r\n    if(!lock || !panel || !passInput || !enterBtn) return;\r\n\r\n    function doLogin(){\r\n      const value = passInput.value.trim();\r\n      if(value === PASSWORD){\r\n        lock.style.display = \"none\";\r\n        panel.style.display = \"block\";\r\n        loadVideos();\r\n        renderTable();\r\n        showToast(\"\u00a1Bienvenido al Panel PRO!\");\r\n        if(error) error.textContent = \"\";\r\n      }else{\r\n        if(error) error.textContent = \"Contrase\u00f1a incorrecta\";\r\n      }\r\n    }\r\n\r\n    enterBtn.addEventListener(\"click\", doLogin);\r\n    passInput.addEventListener(\"keydown\", (e)=>{\r\n      if(e.key === \"Enter\") doLogin();\r\n    });\r\n\r\n    if(togglePassBtn){\r\n      togglePassBtn.addEventListener(\"click\", ()=>{\r\n        if(passInput.type === \"password\"){\r\n          passInput.type = \"text\";\r\n          togglePassBtn.textContent = \"\u2022\";\r\n        }else{\r\n          passInput.type = \"password\";\r\n          togglePassBtn.textContent = \"\u2022\";\r\n        }\r\n        passInput.focus();\r\n      });\r\n    }\r\n\r\n    setTimeout(()=>passInput.focus(), 300);\r\n  }\r\n\r\n  function setupForm(){\r\n    const form = document.getElementById(\"odv-form\");\r\n    const clearBtn = document.getElementById(\"odv-clear\");\r\n    if(!form) return;\r\n\r\n    form.addEventListener(\"submit\", (e)=>{\r\n      e.preventDefault();\r\n      const title = document.getElementById(\"odv-title\").value.trim();\r\n      const url = document.getElementById(\"odv-url\").value.trim();\r\n      const desc = document.getElementById(\"odv-desc\").value.trim();\r\n      const youtubeId = extractId(url);\r\n\r\n      if(!title || !youtubeId){\r\n        alert(\"T\u00edtulo o ID de YouTube inv\u00e1lidos.\");\r\n        return;\r\n      }\r\n\r\n      if(editMode && selectedIndex !== null){\r\n        videos[selectedIndex] = { ...videos[selectedIndex], title, desc, youtubeId };\r\n      }else{\r\n        const newId = videos.length ? Math.max(...videos.map(v=>v.id))+1 : 1;\r\n        videos.push({ id:newId, title, desc, youtubeId });\r\n      }\r\n\r\n      saveVideos();\r\n      resetForm();\r\n    });\r\n\r\n    if(clearBtn){\r\n      clearBtn.addEventListener(\"click\", resetForm);\r\n    }\r\n  }\r\n\r\n  \/\/ Iniciar cuando el DOM de la p\u00e1gina ya est\u00e1 listo\r\n  document.addEventListener(\"DOMContentLoaded\", function(){\r\n    setupLogin();\r\n    setupForm();\r\n  });\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-16a08fe e-con-full e-flex e-con e-parent\" data-id=\"16a08fe\" data-element_type=\"container\">\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\ud83c\udfac Reproductor de v\u00eddeos \u00b7 Olas de Vida Selecciona un v\u00eddeo del listado para verlo en el reproductor principal. Conozca todo sobre el c\u00e1ncer Onc\u00f3logo Cl\u00ednica Universidad de Navarra \u00b7 V\u00cdDEO INICIAL CARGADO. Todos Tratamientos Apoyo emocional Familiares Tipos de c\u00e1ncer \u00daltimos v\u00eddeos Internacional Investigaci\u00f3n Cortos \u00daltimos v\u00eddeos Olas de Vida Panel de control de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-753","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/pages\/753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/comments?post=753"}],"version-history":[{"count":25,"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/pages\/753\/revisions"}],"predecessor-version":[{"id":903,"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/pages\/753\/revisions\/903"}],"wp:attachment":[{"href":"https:\/\/5.olasdevida.es\/index.php\/wp-json\/wp\/v2\/media?parent=753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}