:root{--bg:#f6f7fb;--panel:#fff;--text:#111827;--muted:#6b7280;--border:#e5e7eb;--primary:#2563eb;--danger:#dc2626;--success:#059669;--warning:#d97706;--shadow:0 12px 30px rgba(15,23,42,.08)}
*{box-sizing:border-box}body{margin:0;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:var(--bg);color:var(--text)}a{color:inherit;text-decoration:none}.app-shell{min-height:100vh;display:flex}.sidebar{width:270px;background:#111827;color:#fff;padding:24px;position:fixed;top:0;bottom:0;left:0;overflow:auto}.brand{display:flex;align-items:center;gap:12px;margin-bottom:28px}.brand-mark{width:42px;height:42px;border-radius:14px;background:linear-gradient(135deg,#2563eb,#10b981);display:flex;align-items:center;justify-content:center;font-weight:800}.brand small{display:block;color:#9ca3af;margin-top:2px}.sidebar nav{display:grid;gap:8px}.sidebar nav a{padding:12px 14px;border-radius:12px;color:#d1d5db}.sidebar nav a:hover,.sidebar nav a.active{background:#1f2937;color:#fff}.main{flex:1;margin-left:270px;padding:28px}.topbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:24px}.topbar h1{margin:0;font-size:28px}.topbar p{margin:4px 0 0;color:var(--muted)}.card{background:var(--panel);border:1px solid var(--border);border-radius:18px;box-shadow:var(--shadow);padding:22px;margin-bottom:20px}.grid{display:grid;gap:18px}.grid.cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.stat{background:#fff;border:1px solid var(--border);border-radius:18px;padding:20px;box-shadow:var(--shadow)}.stat strong{font-size:30px;display:block}.stat span{color:var(--muted)}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}.field{display:grid;gap:7px}.field.full{grid-column:1/-1}label{font-weight:650;font-size:14px}input,select,textarea{width:100%;border:1px solid var(--border);border-radius:12px;padding:12px 13px;font:inherit;background:#fff}textarea{min-height:100px}.btn{display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:12px;padding:11px 16px;background:var(--primary);color:#fff;font-weight:700;cursor:pointer;gap:8px}.btn.secondary{background:#e5e7eb;color:#111827}.btn.danger{background:var(--danger)}.btn.success{background:var(--success)}.btn.small{padding:7px 10px;border-radius:9px;font-size:13px}.actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.table-wrap{overflow:auto}.table{width:100%;border-collapse:collapse;background:#fff}.table th,.table td{padding:13px;border-bottom:1px solid var(--border);text-align:left;vertical-align:top}.table th{font-size:13px;color:#4b5563;background:#f9fafb}.badge{display:inline-block;border-radius:999px;padding:5px 9px;font-size:12px;font-weight:700;background:#eef2ff;color:#3730a3}.badge.success{background:#ecfdf5;color:#047857}.badge.warn{background:#fffbeb;color:#92400e}.badge.danger{background:#fef2f2;color:#b91c1c}.alert{padding:14px 16px;border-radius:14px;margin-bottom:18px}.alert.success{background:#ecfdf5;color:#065f46}.alert.error{background:#fef2f2;color:#991b1b}.alert.info{background:#eff6ff;color:#1d4ed8}.login-page{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;background:linear-gradient(135deg,#f8fafc,#e0f2fe)}.login-card{width:100%;max-width:430px;background:#fff;border-radius:24px;box-shadow:var(--shadow);padding:30px}.login-card h1{margin:0 0 8px}.login-card p{margin:0 0 20px;color:var(--muted)}.invoice-box{background:#fff;border:1px solid var(--border);border-radius:18px;padding:26px}.invoice-header{display:flex;justify-content:space-between;gap:16px;border-bottom:1px solid var(--border);padding-bottom:18px;margin-bottom:18px}.line-items{display:grid;gap:12px}.line-item{display:grid;grid-template-columns:2fr .7fr .7fr auto;gap:10px;align-items:end}.print-only{display:none}@media(max-width:900px){.sidebar{position:static;width:100%;height:auto}.app-shell{display:block}.main{margin-left:0;padding:18px}.grid.cols-2,.grid.cols-3,.grid.cols-4,.form-grid{grid-template-columns:1fr}.topbar{align-items:flex-start;gap:12px}.line-item{grid-template-columns:1fr}}@media print{.sidebar,.topbar,.no-print,.btn{display:none!important}.main{margin:0;padding:0}.invoice-box{border:0;box-shadow:none}.print-only{display:block}}
.muted{color:var(--muted)}.payment-box{margin-top:18px;padding:16px;border:1px solid var(--border);border-radius:16px;background:#f9fafb}.payment-box h3{margin-top:0}.totals-box{display:grid;gap:8px;margin-top:14px}.totals-box div{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid var(--border);padding:8px 0}.totals-box .grand{font-size:18px;border-top:2px solid var(--border);border-bottom:0;margin-top:4px;padding-top:12px}.filter-card{display:flex;gap:12px;align-items:end;flex-wrap:wrap}.filter-card .field{min-width:170px}.bar-cell{min-width:160px}.bar-track{height:9px;background:#e5e7eb;border-radius:999px;overflow:hidden;margin-top:6px}.bar-fill{height:9px;background:#2563eb;border-radius:999px}.kpi-row{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:18px}@media(max-width:1100px){.kpi-row{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:700px){.kpi-row{grid-template-columns:1fr}}

/* =========================================================
   Parche v20 - Unificar altura de campos, selects y botones
   Seguro: solo CSS, no modifica PHP ni base de datos.
   ========================================================= */
:root{
  --control-height:52px;
  --control-radius:14px;
  --control-padding-x:16px;
}

/* Controles generales: inputs/selects/botones con la misma altura visual */
input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
select,
textarea,
.btn{
  min-height:var(--control-height);
  border-radius:var(--control-radius);
  font-size:15px;
  line-height:1.2;
}

input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),
select{
  height:var(--control-height);
  padding:0 var(--control-padding-x);
}

textarea{
  padding:14px var(--control-padding-x);
}

.btn{
  padding:0 20px;
  white-space:nowrap;
  box-shadow:0 2px 6px rgba(15,23,42,.08);
}

/* Evita que checkbox/radio se agranden por estilos globales */
input[type="checkbox"],
input[type="radio"]{
  width:auto;
  height:auto;
  min-height:0;
  padding:0;
  border-radius:initial;
}

/* Filtros: alinear campos y botones en una sola línea limpia */
.filter-card{
  gap:14px;
  align-items:flex-end;
}

.filter-card form.filter-card{
  width:100%;
}

.filter-card .field{
  min-width:180px;
  flex:0 1 220px;
  gap:8px;
}

.filter-card .field label{
  min-height:18px;
  display:flex;
  align-items:flex-end;
  margin:0;
}

.filter-card input,
.filter-card select,
.filter-card .btn{
  height:var(--control-height);
  min-height:var(--control-height);
}

.filter-card .btn{
  align-self:flex-end;
  margin-top:26px;
}

/* Campos de búsqueda más anchos dentro de filtros */
.filter-card .field:has(input[name="q"]),
.filter-card .field:has(input[type="search"]){
  flex:1 1 320px;
  min-width:280px;
}

/* Fechas y selectores no quedan pequeños frente a los botones */
.filter-card input[type="date"]{
  min-width:170px;
}

.filter-card select{
  min-width:170px;
}

/* Botones pequeños de tablas siguen siendo compactos */
.btn.small,
.table .btn.small{
  min-height:34px;
  height:auto;
  padding:7px 11px;
  border-radius:10px;
  font-size:13px;
  box-shadow:none;
}

/* Módulo facturar: mantiene alineado buscador, cantidad y botón */
.factura-producto-row,
.product-search-row,
.producto-search-row{
  display:grid;
  grid-template-columns:minmax(0,1fr) 160px 190px;
  gap:16px;
  align-items:end;
}

.factura-producto-row input,
.factura-producto-row select,
.factura-producto-row .btn,
.product-search-row input,
.product-search-row select,
.product-search-row .btn,
.producto-search-row input,
.producto-search-row select,
.producto-search-row .btn{
  height:var(--control-height);
  min-height:var(--control-height);
}

@media(max-width:900px){
  .filter-card,
  .filter-card form.filter-card{
    align-items:stretch;
  }
  .filter-card .field,
  .filter-card .field:has(input[name="q"]),
  .filter-card .field:has(input[type="search"]){
    flex:1 1 100%;
    min-width:100%;
  }
  .filter-card .btn{
    width:100%;
    margin-top:0;
  }
  .factura-producto-row,
  .product-search-row,
  .producto-search-row{
    grid-template-columns:1fr;
  }
}
