/* Appointsly Web — estilos globales */
/* Bootstrap eliminado. El sistema de diseño usa Tailwind CSS (CDN) con el tema Luminous Azure. */

html, body {
    margin: 0;
    padding: 0;
}

/* ── Sidebar de la app (_LayoutApp) ──────────────────────────────────────────
   En móvil (<1024px) el sidebar es un drawer off-canvas (Tailwind:
   -translate-x-full + lg:translate-x-0) que se abre con la hamburguesa.
   En escritorio se puede minimizar: el JS del layout pone la clase
   "sidebar-collapsed" en <html> (persistida en localStorage) y estas reglas
   ocultan el aside y devuelven el margen al contenido.
   ─────────────────────────────────────────────────────────────────────────── */

#sidebar-expand { display: none; }

@media (min-width: 1024px) {
    html.sidebar-collapsed #app-sidebar { transform: translateX(-100%); }
    html.sidebar-collapsed #app-main    { margin-left: 0; }
    html.sidebar-collapsed #sidebar-expand { display: flex; }
}

/* ── Custom Select (cs-group) ────────────────────────────────────────────────
   Dropdowns accesibles que reemplazan los <select> nativos del navegador.
   Usados en las páginas de Reservar, Panel y filtros de negocio/trabajador.

   Dos formas de usarlos:
   1. Markup escrito a mano (cs-group + cs-trigger + cs-dropdown), como en
      Panel/Reservas, cuando la opción lleva avatar, icono o subtítulo.
   2. Clase "cs-select" sobre un <select> normal: wwwroot/js/select-enhance.js
      construye el markup anterior al cargar la página. Es la opción por
      defecto para selects de solo texto.

   Los colores salen de la gama de marca de tailwind.config.js (azul del logo):
   primary #011B2A, primary-container #0E4A6B, outline-variant #CBD5DD.
   ─────────────────────────────────────────────────────────────────────────── */

.cs-native { position: absolute; opacity: 0; pointer-events: none; width: 1px; height: 1px; }
.cs-group  { position: relative; display: flex; flex-direction: column; gap: 6px; }
.cs-label  { font-size: 11px; font-weight: 700; color: #4B5563; text-transform: uppercase; letter-spacing: .06em; }

.cs-trigger {
    width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 10px;
    background: #F4F7F9; border: 1.5px solid #CBD5DD; border-radius: 14px;
    padding: 10px 12px; font-family: inherit; cursor: pointer; text-align: left;
    transition: border-color .2s, box-shadow .2s, background .15s;
}
.cs-trigger:hover  { border-color: #0E4A6B; background: white; }
.cs-trigger:focus  { outline: none; border-color: #011B2A; background: white; box-shadow: 0 0 0 3px rgba(14,74,107,.14); }
.cs-trigger.open   { border-color: #011B2A; background: white; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; }
.cs-chevron { flex-shrink: 0; color: #4B5563; font-size: 20px !important; transition: transform .2s; }
.cs-trigger.open .cs-chevron { transform: rotate(180deg); }

/* Estado deshabilitado: el enhancer copia el disabled del <select> nativo. */
.cs-trigger:disabled { cursor: not-allowed; opacity: .55; background: #EDF1F4; }
.cs-trigger:disabled:hover { border-color: #CBD5DD; background: #EDF1F4; }

.cs-dropdown {
    position: absolute; top: calc(100% - 2px); left: 0; right: 0;
    background: white; border: 1.5px solid #011B2A; border-top: none;
    border-bottom-left-radius: 14px; border-bottom-right-radius: 14px;
    padding: 4px 6px 8px; box-shadow: 0 12px 32px rgba(1,27,42,.16);
    z-index: 100; max-height: 260px; overflow-y: auto;
}

/* Cuando no hay sitio debajo, el JS abre hacia arriba (clase en trigger y lista). */
.cs-trigger.open-up { border-bottom-left-radius: 14px; border-bottom-right-radius: 14px; border-top-left-radius: 4px; border-top-right-radius: 4px; }
.cs-dropdown--up {
    top: auto; bottom: calc(100% - 2px);
    border-top: 1.5px solid #011B2A; border-bottom: none;
    border-radius: 14px 14px 0 0;
    box-shadow: 0 -12px 32px rgba(1,27,42,.16);
}

.cs-option { display: flex; align-items: center; gap: 10px; padding: 9px 10px; border-radius: 10px; cursor: pointer; transition: background .1s; }
.cs-option:hover, .cs-option--focus { background: #EDF1F4; }
.cs-option--active { background: rgba(14,74,107,.10); }
.cs-option--active .cs-name { font-weight: 700; color: #0E4A6B; }
.cs-option--disabled { opacity: .45; cursor: not-allowed; }
.cs-option--disabled:hover { background: transparent; }

.cs-avatar { width: 34px; height: 34px; border-radius: 50%; object-fit: cover; flex-shrink: 0; border: 2px solid rgba(14,74,107,.25); }
.cs-avatar-fallback { width: 34px; height: 34px; border-radius: 50%; background: linear-gradient(135deg, #A3CCE2, #8ABBD6); display: flex; align-items: center; justify-content: center; flex-shrink: 0; font-weight: 700; font-size: 14px; color: #011B2A; }
.cs-avatar--muted { background: #E6EBEF; color: #4B5563; }

.cs-icon { width: 30px; height: 30px; border-radius: 9px; background: rgba(14,74,107,.10); display: flex; align-items: center; justify-content: center; flex-shrink: 0; color: #0E4A6B; }
.cs-icon .material-symbols-outlined { font-size: 17px !important; }
.cs-icon--muted { background: #E6EBEF; color: #4B5563; }

.cs-row  { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
.cs-info { display: flex; flex-direction: column; gap: 1px; line-height: 1.25; min-width: 0; }
.cs-name { font-size: 13px; font-weight: 600; color: #111827; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cs-name--muted { color: #4B5563; font-weight: 400; }
.cs-sub  { font-size: 11px; color: #4B5563; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* El <select class="cs-select"> original sigue en el DOM tras la mejora visual:
   es el que viaja en el formulario. Se vuelve invisible con opacity, NO con
   display:none ni reduciéndolo a 1px, porque un <select required> sin caja de
   layout hace que el navegador aborte el envío con "An invalid form control is
   not focusable" y sin mostrar mensaje. Ocupando el mismo hueco que el trigger,
   la validación nativa funciona y su globo aparece donde toca.
   Si el JS no llegara a ejecutarse, el atributo data-cs-ready no se pone y el
   select se ve y funciona como uno normal. */
.cs-select[data-cs-ready] {
    position: absolute; inset: 0; width: 100%; height: 100%;
    opacity: 0; pointer-events: none; appearance: none; border: none; background: none;
}

/* ── Campos de hora y fecha ──────────────────────────────────────────────────
   Se dejan como campos de texto con formato: se escriben con el teclado, que es
   lo mas rapido en el editor de horarios (56 campos), y conservan la validacion
   y el formato HH:mm del navegador.

   A las horas se les quita el boton de reloj, que es lo unico que abre el
   desplegable nativo del sistema. Ese desplegable se dibuja fuera del documento
   y ninguna regla CSS llega a el, asi que o desentonaba con el resto de la web o
   habia que sustituirlo por uno propio; se probo y estorbaba mas que ayudaba en
   una rejilla tan densa. Sin boton no hay desplegable y el campo se comporta como
   lo que es: un campo de texto con formato de hora.

   Las fechas SI conservan su calendario: ahi el nativo es util y no hay nada
   equivalente que teclear.

   Lo unico que no se fija aqui es el relleno: cada sitio tiene el suyo (las filas
   del horario son compactas a proposito) y forzarlo desmontaria esas rejillas.
   ─────────────────────────────────────────────────────────────────────────── */
/* Fuera el boton de reloj del navegador: es lo unico que abre su desplegable. */
input[type="time"]::-webkit-calendar-picker-indicator { display: none; }

/* ───────────────────────────────────────────────────────────────────────────
   Campos numericos sin las flechas del navegador.

   Se aplica con la clase .no-spinner, no a todo [type="number"]: hay campos
   donde subir de uno en uno es comodo. Donde el campo va dentro de un recuadro
   con un icono de unidad al lado (minutos, precio) las flechas quedan pegadas
   al icono y ensucian el conjunto.
   ─────────────────────────────────────────────────────────────────────────── */
input[type="number"].no-spinner::-webkit-outer-spin-button,
input[type="number"].no-spinner::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

input[type="number"].no-spinner {
    -moz-appearance: textfield;
    appearance: textfield;
}

/* En su lugar, un reloj dibujado como fondo. Es decorativo (no se pulsa): solo
   sirve para que se lea de un vistazo que ahi va una hora. Va como data URI y no
   como icono de fuente porque la CSP de produccion no admite peticiones externas
   y un ::after no se puede pintar sobre un input, que es un elemento vacio. */
input[type="time"] {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234B5563' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='9'/%3E%3Cpolyline points='12 7 12 12 15.5 14'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 10px center;
    background-size: 15px;
    /* Sitio para el icono; gana al px-3 de Tailwind por especificidad. */
    padding-right: 2rem;
}

input[type="time"],
input[type="date"],
input[type="month"] {
    font-family: inherit;
    font-size: 14px;
    /* Cifras de ancho fijo: sin esto "11:00" y "09:30" mueven el campo al escribir. */
    font-variant-numeric: tabular-nums;
    color: #111827;
    line-height: 1.2;
    min-height: 38px;

    /* Mismo lenguaje visual que .cs-trigger: fondo, borde y radio identicos.
       background-color y no el atajo background: el atajo reinicia la imagen de
       fondo y se llevaria por delante el reloj de las horas. */
    background-color: #F4F7F9;
    border: 1.5px solid #CBD5DD;
    border-radius: 14px;
    transition: border-color .2s, box-shadow .2s, background .15s;

    accent-color: #0E4A6B;
    color-scheme: light;
}

input[type="time"]:hover,
input[type="date"]:hover,
input[type="month"]:hover {
    border-color: #0E4A6B;
    background-color: white;
}

input[type="time"]:focus,
input[type="date"]:focus,
input[type="month"]:focus {
    outline: none;
    border-color: #011B2A;
    background-color: white;
    box-shadow: 0 0 0 3px rgba(14, 74, 107, .14);
}

input[type="date"]::-webkit-calendar-picker-indicator,
input[type="month"]::-webkit-calendar-picker-indicator {
    cursor: pointer;
    padding: 2px;
    border-radius: 6px;
    opacity: .5;
    transition: opacity .15s, background .15s;
}

input[type="date"]:hover::-webkit-calendar-picker-indicator,
input[type="month"]:hover::-webkit-calendar-picker-indicator {
    opacity: 1;
    background: rgba(14, 74, 107, .10);
}

/* Los tramos internos (hh, mm) llevan su propio resaltado del navegador, gris
   por defecto; se pasa al azul de la marca para que case con el foco del resto. */
input[type="time"]::-webkit-datetime-edit-hour-field:focus,
input[type="time"]::-webkit-datetime-edit-minute-field:focus,
input[type="date"]::-webkit-datetime-edit-day-field:focus,
input[type="date"]::-webkit-datetime-edit-month-field:focus,
input[type="date"]::-webkit-datetime-edit-year-field:focus {
    background: rgba(14, 74, 107, .14);
    color: #011B2A;
    border-radius: 4px;
    outline: none;
}

input[type="time"]:disabled,
input[type="date"]:disabled,
input[type="month"]:disabled {
    opacity: .55;
    cursor: not-allowed;
}

/* ── Desplegables del selector de mes/año (_MonthPicker) ─────────────────────
   Los rellena month-picker.js en caliente, asi que no pasan por select-enhance
   y se quedaban con el control nativo. Se les quita la apariencia del sistema y
   se dibuja la flecha con el mismo gris que usa .cs-chevron.
   ─────────────────────────────────────────────────────────────────────────── */
.mp-month,
.mp-year {
    appearance: none;
    -webkit-appearance: none;
    font-family: inherit;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234B5563' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 8px center;
    background-size: 14px;
    cursor: pointer;
}

.mp-month:hover,
.mp-year:hover { border-color: #0E4A6B; }

/* ══ Campos con error de validación ═══════════════════════════════════════════
   ASP.NET marca solo los campos inválidos con la clase .input-validation-error,
   tanto al redibujar la página desde el servidor como con la validación de
   jQuery en cliente. No había ninguna regla para esa clase, así que un campo mal
   rellenado se veía idéntico a uno correcto y el usuario no encontraba el fallo.

   El resalte no depende solo del color: el borde engorda a 2px, para que se
   distinga también con daltonismo. */
.input-validation-error,
input.input-validation-error,
select.input-validation-error,
textarea.input-validation-error {
    border-color: #EF4444 !important;
    border-width: 2px !important;
    background-color: #FEF2F2;
}

.input-validation-error:focus,
input.input-validation-error:focus,
select.input-validation-error:focus,
textarea.input-validation-error:focus {
    outline: none;
    box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.18);
}


.field-validation-error {
    display: block;
    margin-top: 0.25rem;
    font-size: 0.75rem;
    font-weight: 600;
    color: #EF4444;
}
