
/* AppBraga v1.58.278 — SAFE CENTERED MODALS
   Objetivo:
   - centrar modais no viewport real
   - não mexer nos botões/handlers originais
   - modal fechado continua fechado
   - modal aberto fica fixed + centrado
*/

:root{
  --ab-modal-safe-pad: 24px;
}

/* Estado base: modais conhecidos ficam fechados se não tiverem sinal claro de aberto */
.modal-overlay:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
.ck-modal:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
.imp-modal:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
.tasks-modal:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
.appbraga-modal-backdrop:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
.personal-modal:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
.cfg-screen-modal:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]){
  display:none !important;
}

/* Modal aberto por classe */
.modal-overlay.is-open,
.modal-overlay.active,
.modal-overlay.show,
.modal-overlay.open,
.ck-modal.is-open,
.ck-modal.active,
.ck-modal.show,
.ck-modal.open,
.imp-modal.is-open,
.imp-modal.active,
.imp-modal.show,
.imp-modal.open,
.tasks-modal.is-open,
.tasks-modal.active,
.tasks-modal.show,
.tasks-modal.open,
.appbraga-modal-backdrop.is-open,
.appbraga-modal-backdrop.active,
.appbraga-modal-backdrop.show,
.appbraga-modal-backdrop.open,
.personal-modal.is-open,
.personal-modal.active,
.personal-modal.show,
.personal-modal.open,
.cfg-screen-modal.is-open,
.cfg-screen-modal.active,
.cfg-screen-modal.show,
.cfg-screen-modal.open,

/* Modal aberto por style inline dos scripts antigos */
.modal-overlay[style*="display: block"],
.modal-overlay[style*="display:block"],
.modal-overlay[style*="display: flex"],
.modal-overlay[style*="display:flex"],
.modal-overlay[style*="display: grid"],
.modal-overlay[style*="display:grid"],
.ck-modal[style*="display: block"],
.ck-modal[style*="display:block"],
.ck-modal[style*="display: flex"],
.ck-modal[style*="display:flex"],
.ck-modal[style*="display: grid"],
.ck-modal[style*="display:grid"],
.imp-modal[style*="display: block"],
.imp-modal[style*="display:block"],
.imp-modal[style*="display: flex"],
.imp-modal[style*="display:flex"],
.imp-modal[style*="display: grid"],
.imp-modal[style*="display:grid"],
.tasks-modal[style*="display: block"],
.tasks-modal[style*="display:block"],
.tasks-modal[style*="display: flex"],
.tasks-modal[style*="display:flex"],
.tasks-modal[style*="display: grid"],
.tasks-modal[style*="display:grid"],
.appbraga-modal-backdrop[style*="display: block"],
.appbraga-modal-backdrop[style*="display:block"],
.appbraga-modal-backdrop[style*="display: flex"],
.appbraga-modal-backdrop[style*="display:flex"],
.appbraga-modal-backdrop[style*="display: grid"],
.appbraga-modal-backdrop[style*="display:grid"],
.personal-modal[style*="display: block"],
.personal-modal[style*="display:block"],
.personal-modal[style*="display: flex"],
.personal-modal[style*="display:flex"],
.personal-modal[style*="display: grid"],
.personal-modal[style*="display:grid"],
.cfg-screen-modal[style*="display: block"],
.cfg-screen-modal[style*="display:block"],
.cfg-screen-modal[style*="display: flex"],
.cfg-screen-modal[style*="display:flex"],
.cfg-screen-modal[style*="display: grid"],
.cfg-screen-modal[style*="display:grid"]{
  position:fixed !important;
  inset:0 !important;
  width:100vw !important;
  height:100vh !important;
  height:100dvh !important;
  min-height:100vh !important;
  min-height:100dvh !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  padding:var(--ab-modal-safe-pad) !important;
  box-sizing:border-box !important;
  overflow:hidden !important;
  overscroll-behavior:contain !important;
  z-index:2147482000 !important;
}

/* Fechado ganha sempre, para não rebentar Fechar/Cancelar */
.modal-overlay[hidden],
.ck-modal[hidden],
.imp-modal[hidden],
.tasks-modal[hidden],
.appbraga-modal-backdrop[hidden],
.personal-modal[hidden],
.cfg-screen-modal[hidden],
.modal-overlay[style*="display: none"],
.modal-overlay[style*="display:none"],
.ck-modal[style*="display: none"],
.ck-modal[style*="display:none"],
.imp-modal[style*="display: none"],
.imp-modal[style*="display:none"],
.tasks-modal[style*="display: none"],
.tasks-modal[style*="display:none"],
.appbraga-modal-backdrop[style*="display: none"],
.appbraga-modal-backdrop[style*="display:none"],
.personal-modal[style*="display: none"],
.personal-modal[style*="display:none"],
.cfg-screen-modal[style*="display: none"],
.cfg-screen-modal[style*="display:none"]{
  display:none !important;
  visibility:hidden !important;
}

/* Caixa do modal: sempre dentro do ecrã, scroll interno se precisar */
.modal-card,
.ck-modal-card,
.modal-content,
.imp-modal .modal-card,
.tasks-modal-card,
.cfg-screen-modal-box,
.appbraga-modal-card,
.personal-modal-card,
.info-modal-card,
.rd-weekly-modal-card{
  position:relative !important;
  margin:auto !important;
  max-height:calc(100dvh - (var(--ab-modal-safe-pad) * 2)) !important;
  overflow:auto !important;
  overscroll-behavior:contain !important;
  box-sizing:border-box !important;
}

/* Corpos/listas internas também rolam por dentro */
.ck-modal-body,
.modal-body,
.appbraga-modal-body,
.tasks-modal-body,
.rd-weekly-editor-wrap,
.ck-modal-list{
  max-height:min(68dvh, 720px);
  overflow:auto;
  overscroll-behavior:contain;
}

/* Modal semanal dos rádios é mais largo, mas continua centrado */
.rd-weekly-modal-card{
  width:min(1180px, calc(100vw - (var(--ab-modal-safe-pad) * 2))) !important;
}

/* Mobile/tablet */
@media(max-width:760px){
  :root{
    --ab-modal-safe-pad:12px;
  }

  .modal-card,
  .ck-modal-card,
  .modal-content,
  .imp-modal .modal-card,
  .tasks-modal-card,
  .cfg-screen-modal-box,
  .appbraga-modal-card,
  .personal-modal-card,
  .info-modal-card,
  .rd-weekly-modal-card{
    width:calc(100vw - 24px) !important;
    max-height:calc(100dvh - 24px) !important;
  }
}


/* v1.58.278 — posição segura para modais grandes
   Em modais maiores do que o ecrã, usar flex-start para garantir que o topo
   fica visível. O card continua centrado horizontalmente e faz scroll interno.
*/
.modal-overlay.is-open,
.modal-overlay.active,
.modal-overlay.show,
.modal-overlay.open,
.ck-modal.is-open,
.ck-modal.active,
.ck-modal.show,
.ck-modal.open,
.imp-modal.is-open,
.imp-modal.active,
.imp-modal.show,
.imp-modal.open,
.tasks-modal.is-open,
.tasks-modal.active,
.tasks-modal.show,
.tasks-modal.open,
.appbraga-modal-backdrop.is-open,
.appbraga-modal-backdrop.active,
.appbraga-modal-backdrop.show,
.appbraga-modal-backdrop.open,
.personal-modal.is-open,
.personal-modal.active,
.personal-modal.show,
.personal-modal.open,
.cfg-screen-modal.is-open,
.cfg-screen-modal.active,
.cfg-screen-modal.show,
.cfg-screen-modal.open,
.modal-overlay[style*="display: block"],
.modal-overlay[style*="display:block"],
.modal-overlay[style*="display: flex"],
.modal-overlay[style*="display:flex"],
.modal-overlay[style*="display: grid"],
.modal-overlay[style*="display:grid"],
.ck-modal[style*="display: block"],
.ck-modal[style*="display:block"],
.ck-modal[style*="display: flex"],
.ck-modal[style*="display:flex"],
.ck-modal[style*="display: grid"],
.ck-modal[style*="display:grid"],
.imp-modal[style*="display: block"],
.imp-modal[style*="display:block"],
.imp-modal[style*="display: flex"],
.imp-modal[style*="display:flex"],
.imp-modal[style*="display: grid"],
.imp-modal[style*="display:grid"],
.tasks-modal[style*="display: block"],
.tasks-modal[style*="display:block"],
.tasks-modal[style*="display: flex"],
.tasks-modal[style*="display:flex"],
.tasks-modal[style*="display: grid"],
.tasks-modal[style*="display:grid"]{
  align-items:flex-start !important;
  justify-content:center !important;
  overflow:hidden !important;
}

/* Card mais previsível dentro do viewport */
.modal-card,
.ck-modal-card,
.modal-content,
.imp-modal .modal-card,
.tasks-modal-card,
.cfg-screen-modal-box,
.appbraga-modal-card,
.personal-modal-card,
.info-modal-card,
.rd-weekly-modal-card{
  margin:auto !important;
  max-height:calc(100dvh - 48px) !important;
  overflow:auto !important;
}

/* Modal semanal dos rádios: mais alto mas sempre visível */
.rd-weekly-modal-card{
  width:min(1180px, calc(100vw - 48px)) !important;
  max-height:calc(100dvh - 48px) !important;
  display:flex !important;
  flex-direction:column !important;
}

.rd-weekly-modal-card .ck-modal-body{
  min-height:0 !important;
  overflow:hidden !important;
  display:flex !important;
  flex-direction:column !important;
}

.rd-weekly-modal-card .rd-weekly-editor-wrap{
  flex:1 1 auto !important;
  min-height:220px !important;
  max-height:calc(100dvh - 360px) !important;
  overflow:auto !important;
}

.rd-weekly-editor th:nth-child(4),
.rd-weekly-editor td:nth-child(4){
  min-width:170px;
}

.rd-weekly-editor input[data-weekly-field="utilizador"]{
  font-weight:900;
}

@media(max-height:780px){
  .rd-weekly-modal-card .rd-weekly-editor-wrap{
    max-height:calc(100dvh - 330px) !important;
  }
}


/* v1.58.278 — bloquear scroll da página por trás do modal */
html.ab-modal-scroll-locked{
  overflow:hidden !important;
}

body.ab-modal-scroll-locked{
  overflow:hidden !important;
  width:100% !important;
  overscroll-behavior:none !important;
}

/* Fallback CSS para browsers modernos/Electron: quando há modal aberto, trava a página */
html:has(.modal-overlay.is-open),
html:has(.modal-overlay.active),
html:has(.modal-overlay.show),
html:has(.modal-overlay.open),
html:has(.ck-modal.is-open),
html:has(.ck-modal.active),
html:has(.ck-modal.show),
html:has(.ck-modal.open),
html:has(.imp-modal.is-open),
html:has(.imp-modal.active),
html:has(.tasks-modal.is-open),
html:has(.tasks-modal.active),
html:has(.modal-overlay[style*="display: block"]),
html:has(.modal-overlay[style*="display:block"]),
html:has(.modal-overlay[style*="display: flex"]),
html:has(.modal-overlay[style*="display:flex"]),
html:has(.ck-modal[style*="display: block"]),
html:has(.ck-modal[style*="display:block"]),
html:has(.ck-modal[style*="display: flex"]),
html:has(.ck-modal[style*="display:flex"]){
  overflow:hidden !important;
}

/* O overlay apanha o scroll e não o deixa passar para a página */
.modal-overlay,
.ck-modal,
.imp-modal,
.tasks-modal,
.appbraga-modal-backdrop,
.personal-modal,
.cfg-screen-modal{
  overscroll-behavior:contain !important;
}

/* O scroll permitido fica só no card/corpo/tabela do modal */
.modal-card,
.ck-modal-card,
.modal-content,
.imp-modal .modal-card,
.tasks-modal-card,
.cfg-screen-modal-box,
.appbraga-modal-card,
.personal-modal-card,
.info-modal-card,
.rd-weekly-modal-card,
.ck-modal-body,
.modal-body,
.appbraga-modal-body,
.tasks-modal-body,
.rd-weekly-editor-wrap,
.ck-modal-list{
  overscroll-behavior:contain !important;
}


/* v1.58.278 — viewport centered modal final */
.ab-viewport-modal-open{
  position:fixed !important;
  inset:0 !important;
  width:100vw !important;
  height:100dvh !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  padding:24px !important;
  overflow:hidden !important;
  overscroll-behavior:contain !important;
  z-index:2147482400 !important;
}

.ab-viewport-modal-card{
  position:relative !important;
  margin:auto !important;
  max-height:calc(100dvh - 48px) !important;
  overflow:auto !important;
  overscroll-behavior:contain !important;
  box-sizing:border-box !important;
}

.ab-viewport-modal-open .rd-weekly-modal-card,
.ab-viewport-modal-open.rd-weekly-modal-card{
  width:min(1180px, calc(100vw - 48px)) !important;
  max-height:calc(100dvh - 48px) !important;
  display:flex !important;
  flex-direction:column !important;
}

.ab-viewport-modal-open .rd-weekly-modal-card .ck-modal-body{
  min-height:0 !important;
  overflow:hidden !important;
  display:flex !important;
  flex-direction:column !important;
}

.ab-viewport-modal-open .rd-weekly-modal-card .rd-weekly-editor-wrap{
  flex:1 1 auto !important;
  min-height:220px !important;
  max-height:calc(100dvh - 360px) !important;
  overflow:auto !important;
}

html.ab-modal-scroll-locked,
body.ab-modal-scroll-locked{
  overflow:hidden !important;
}

body.ab-modal-scroll-locked{
  overscroll-behavior:none !important;
}

@media(max-width:760px){
  .ab-viewport-modal-open{
    padding:12px !important;
  }

  .ab-viewport-modal-card{
    width:calc(100vw - 24px) !important;
    max-height:calc(100dvh - 24px) !important;
  }
}


/* v1.58.278 — fechar viewport modal */





/* v1.58.278 — impedir abre-fecha instantâneo */
.ab-viewport-modal-open:not(.ab-modal-force-closed){
  visibility:visible !important;
}


/* v1.58.278 — suporte de modais em todas as páginas */

/* Modais genéricos fechados não aparecem sozinhos */
.modal:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
.dialog:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]),
[role="dialog"]:not(.is-open):not(.active):not(.show):not(.open):not([style*="display: block"]):not([style*="display:block"]):not([style*="display: flex"]):not([style*="display:flex"]):not([style*="display: grid"]):not([style*="display:grid"]){
  display:none !important;
}

/* Quando qualquer modal genérico abre, centra no viewport */
.modal.is-open,
.modal.active,
.modal.show,
.modal.open,
.dialog.is-open,
.dialog.active,
.dialog.show,
.dialog.open,
[role="dialog"].is-open,
[role="dialog"].active,
[role="dialog"].show,
[role="dialog"].open,
.modal[style*="display: block"],
.modal[style*="display:block"],
.modal[style*="display: flex"],
.modal[style*="display:flex"],
.modal[style*="display: grid"],
.modal[style*="display:grid"],
.dialog[style*="display: block"],
.dialog[style*="display:block"],
.dialog[style*="display: flex"],
.dialog[style*="display:flex"],
.dialog[style*="display: grid"],
.dialog[style*="display:grid"],
[role="dialog"][style*="display: block"],
[role="dialog"][style*="display:block"],
[role="dialog"][style*="display: flex"],
[role="dialog"][style*="display:flex"],
[role="dialog"][style*="display: grid"],
[role="dialog"][style*="display:grid"]{
  position:fixed !important;
  inset:0 !important;
  width:100vw !important;
  height:100dvh !important;
  min-height:100dvh !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  padding:24px !important;
  box-sizing:border-box !important;
  overflow:hidden !important;
  overscroll-behavior:contain !important;
  z-index:2147482400 !important;
}

/* Cards/conteúdos genéricos também ficam dentro do ecrã */
.modal-box,
.modal-content,
.dialog-card,
.dialog-box,
.popup-card,
.popup-content,
[class*="modal-card"],
[class*="modal-content"],
[class*="dialog-card"],
[class*="popup-card"]{
  max-height:calc(100dvh - 48px) !important;
  overflow:auto !important;
  overscroll-behavior:contain !important;
  box-sizing:border-box !important;
}

/* O viewport modal aplicado por JS ganha prioridade em qualquer página */
.ab-viewport-modal-open{
  position:fixed !important;
  inset:0 !important;
  width:100vw !important;
  height:100dvh !important;
  min-height:100dvh !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  padding:24px !important;
  overflow:hidden !important;
  overscroll-behavior:contain !important;
  z-index:2147482400 !important;
}

.ab-viewport-modal-card{
  max-height:calc(100dvh - 48px) !important;
  overflow:auto !important;
  overscroll-behavior:contain !important;
}

/* Fechado ganha sempre */
.modal[hidden],
.dialog[hidden],
[role="dialog"][hidden],
.modal[style*="display: none"],
.modal[style*="display:none"],
.dialog[style*="display: none"],
.dialog[style*="display:none"],
[role="dialog"][style*="display: none"],
[role="dialog"][style*="display:none"]{
  display:none !important;
  visibility:hidden !important;
}


/* v1.58.278 — raízes reais de modal em todas as páginas */
#cpModalComputador,#cpModalDetalhe,#cpModalRegisto,
#cfgMonitorModal,#cfgModal,
#diagModal,
#dirModalContacto,#dirModalApagarTodos,#dirModalDetalhe,
#eqModal,#eqDetailModal,
#modalEditarHistorico,
#impListModal,#modalAdicionarImpressora,
#infoModalForm,#infoModalDetalhe,#infoModalCategorias,
#notModal,
#ckModalPistola,#ckModalDetalhe,#ckModalIntervencao,
#prModalPorta,#prModalDetalhe,#prModalHistorico,#prModalConfig,
#rdModalRadio,#rdModalDetalhe,#rdModalRegisto,#rdModalSemanal,
#stockQrScannerPanel,#stockMovementsModal,#modalEditarStock,
#taskModal,
#usModal,#usDetailModal,#usLogsModal{
  overscroll-behavior:contain !important;
}

.ab-viewport-modal-open{
  position:fixed !important;
  inset:0 !important;
  top:0 !important;
  left:0 !important;
  right:0 !important;
  bottom:0 !important;
  width:100vw !important;
  height:100dvh !important;
  min-height:100dvh !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  padding:24px !important;
  box-sizing:border-box !important;
  overflow:hidden !important;
  overscroll-behavior:contain !important;
  z-index:2147482400 !important;
  transform:none !important;
  visibility:visible !important;
}

.ab-viewport-modal-card{
  position:relative !important;
  margin:auto !important;
  max-height:calc(100dvh - 48px) !important;
  overflow:auto !important;
  overscroll-behavior:contain !important;
  box-sizing:border-box !important;
  transform:none !important;
}

.stock-modal-card,
.imp-dashboard-modal-card,
.users-modal-card,
.eq-modal-card,
.dir-modal-card,
.pr-modal-card,
.cp-computer-modal-card{
  max-height:calc(100dvh - 48px) !important;
  overflow:auto !important;
  overscroll-behavior:contain !important;
}

html.ab-modal-scroll-locked,
body.ab-modal-scroll-locked{
  overflow:hidden !important;
}

body.ab-modal-scroll-locked{
  overscroll-behavior:none !important;
}



@media(max-width:760px){
  .ab-viewport-modal-open{
    padding:12px !important;
  }

  .ab-viewport-modal-card{
    width:calc(100vw - 24px) !important;
    max-height:calc(100dvh - 24px) !important;
  }
}


/* v1.58.278 — Modal Buttons Safe Mode
   Só centra e bloqueia scroll. Não interfere com Guardar/Cancelar. */
.ab-viewport-modal-open{
  position:fixed !important;
  inset:0 !important;
  top:0 !important;
  left:0 !important;
  right:0 !important;
  bottom:0 !important;
  width:100vw !important;
  height:100dvh !important;
  min-height:100dvh !important;
  display:flex !important;
  align-items:center !important;
  justify-content:center !important;
  padding:24px !important;
  box-sizing:border-box !important;
  overflow:hidden !important;
  overscroll-behavior:contain !important;
  z-index:2147482400 !important;
  transform:none !important;
}

.ab-viewport-modal-card{
  position:relative !important;
  margin:auto !important;
  max-height:calc(100dvh - 48px) !important;
  overflow:auto !important;
  overscroll-behavior:contain !important;
  box-sizing:border-box !important;
  transform:none !important;
}

html.ab-modal-scroll-locked,
body.ab-modal-scroll-locked{
  overflow:hidden !important;
}

body.ab-modal-scroll-locked{
  overscroll-behavior:none !important;
}

@media(max-width:760px){
  .ab-viewport-modal-open{
    padding:12px !important;
  }

  .ab-viewport-modal-card{
    width:calc(100vw - 24px) !important;
    max-height:calc(100dvh - 24px) !important;
  }
}
