movil: barra de abajo marca la seccion abierta; llamada de voz sin video vacio

- la pestaña actual de la barra de abajo lleva la pastilla de color
- en una llamada solo de voz no se ensena el video propio (era un recuadro
  gris con el icono de play) y Llamar se atenua mientras dura
- la barra de confirmar borrado con su marco rojo
This commit is contained in:
SITO 2026-10-19 12:43:28 +02:00
parent c1f4ba75de
commit f29540e17e
3 changed files with 16 additions and 2 deletions

View file

@ -411,3 +411,11 @@ body .main-content > .main-column { padding-left: 0 !important; padding-right: 0
font-size: 16px !important; font-size: 16px !important;
} }
.main-column form.welcome-skip-end { display: flex !important; justify-content: center !important; } .main-column form.welcome-skip-end { display: flex !important; justify-content: center !important; }
/* llamada solo con voz: sin el video propio vacio */
.karvan-call:not(.has-cam) .kc-local { display: none !important; }
.karvan-call:not(.has-cam) .karvan-videos:not(:has(.kc-remote video)) { display: none !important; }
.karvan-call.active .kc-btn-start { opacity: .45; pointer-events: none; }
/* la barra de confirmar borrado con su marco rojo (Acampada quita el borde a los div) */
.main-column div.confirm-bar { border: 2px solid var(--ux-danger) !important; }
.main-column .content-action-confirm[open] > summary { opacity: 1 !important; }

View file

@ -171,7 +171,7 @@
} }
// --- media / videollamada (Fase 1) --- // --- media / videollamada (Fase 1) ---
function setCallActive(on) { if (callRoot) callRoot.className = "karvan-call" + (on ? " active" : ""); } function setCallActive(on) { if (callRoot) callRoot.className = "karvan-call" + (on ? " active" : "") + (camActive ? " has-cam" : ""); }
function setStatus(msg) { if (statusEl) statusEl.textContent = msg || ""; } function setStatus(msg) { if (statusEl) statusEl.textContent = msg || ""; }
// textos traducidos: los pone la vista en data-txt-* de #karvan-call // textos traducidos: los pone la vista en data-txt-* de #karvan-call
function txt(k, def) { return (callRoot && callRoot.getAttribute("data-txt-" + k)) || def; } function txt(k, def) { return (callRoot && callRoot.getAttribute("data-txt-" + k)) || def; }
@ -179,6 +179,8 @@
function updateBtns() { function updateBtns() {
if (btnMic) btnMic.className = "kc-btn" + (micActive ? " on" : ""); if (btnMic) btnMic.className = "kc-btn" + (micActive ? " on" : "");
if (btnCam) btnCam.className = "kc-btn" + (camActive ? " on" : ""); if (btnCam) btnCam.className = "kc-btn" + (camActive ? " on" : "");
// sin camara no se ensena el video propio: era un recuadro gris con el icono de play
if (callRoot) callRoot.classList.toggle("has-cam", !!camActive);
} }
function attachRemote(peer, remoteId, e) { function attachRemote(peer, remoteId, e) {

View file

@ -95,8 +95,12 @@ module.exports = ({ i18n }) => {
const inboxN = sharedState.getInboxCount(); const inboxN = sharedState.getInboxCount();
const cfg = getConfig(); const cfg = getConfig();
const modOn = (m) => !m || cfg.modules[m] === 'on' || cfg.modules[m] === undefined; const modOn = (m) => !m || cfg.modules[m] === 'on' || cfg.modules[m] === undefined;
// la pestaña de la seccion abierta se marca (pastilla de color tras el icono)
let here = '';
try { here = (require('../models/typed_log').requestScope.getStore() || {}).path || ''; } catch (_) {}
const isHere = (href) => here === href || (href !== '/' && here.startsWith(href + '/')) || (href === '/activity' && here === '/');
const bbLink = (href, ico, label, badge) => a( const bbLink = (href, ico, label, badge) => a(
{ class: "bb-item", href }, { class: isHere(href) ? "bb-item current" : "bb-item", href, ...(isHere(href) ? { 'aria-current': 'page' } : {}) },
iconNode("bb-ico", iconKeyOf(href), ico), iconNode("bb-ico", iconKeyOf(href), ico),
(badge && badge > 0) ? span({ class: "bb-badge" }, String(badge)) : "", (badge && badge > 0) ? span({ class: "bb-badge" }, String(badge)) : "",
span({ class: "bb-lbl" }, label) span({ class: "bb-lbl" }, label)