/* CFDisplays — complementos ao Bootstrap (tema escuro via data-bs-theme). */
.thumb80 { width: 80px; height: auto; border-radius: 4px; }
code { overflow-wrap: anywhere; }
/* Matriz de permissões clicável — visível em ambos os temas */
.perm-cell { cursor: pointer; user-select: none; text-align: center; vertical-align: middle; }
.perm-cell input { pointer-events: none; transform: scale(1.3); }
.perm-cell.on { background: rgba(25, 135, 84, .28); box-shadow: inset 0 0 0 2px var(--bs-success); }
[data-bs-theme="light"] .perm-cell.on { background: rgba(25, 135, 84, .18); }
/* Switcher de tema: segmento ativo sempre legível */
.theme-switcher .btn { min-width: 2.4rem; }
.perm-table thead th { position: sticky; top: 0; background: var(--bs-tertiary-bg); z-index: 2; }
/* Mini-TV 16:9 para pré-visualizações (proporção 1080p reduzida). */
.tv { aspect-ratio: 16/9; max-width: 480px; background: #000 center/cover no-repeat;
  color: #fff; border: 12px solid #1c1f24; border-radius: 12px; display: flex; align-items: center;
  justify-content: center; overflow: hidden; text-align: center; line-height: 1.25;
  padding: .75rem; overflow-wrap: anywhere; }
.tv > span { max-width: 100%; max-height: 100%; overflow: hidden; white-space: pre-line; }
.err { color: #ff7b7b; }
.ok { color: #9dffa8; }
/* Reordenar playlist: origem esbatida, guia no destino, ghost só da linha. */
#cf-playlist tr.ord-drag { opacity: .35; }
#cf-playlist tr.ord-gap td { height: .7rem; padding: 0; border: 0;
  background: var(--bs-primary, #0d6efd); border-radius: .3rem; }
#cf-playlist .ord-handle { cursor: grab; }
#cf-playlist .ord-handle:active { cursor: grabbing; }
.ord-ghost { position: fixed; top: -9999px; left: -9999px; pointer-events: none;
  opacity: .92; z-index: 9999; }
.ord-ghost table { border-collapse: collapse; background: var(--bs-body-bg, #fff);
  box-shadow: 0 .5rem 1rem rgba(0,0,0,.35); }
