/* ============================================================================
   Lapisan tipis di atas Sneat.

   Isinya hanya dua hal: (1) perbaikan layout yang di paket Sneat aslinya ada
   di demo.css, dan (2) komponen kecil khusus panel fish feeder. Sisanya —
   warna, tipografi, kartu, tombol, sidebar — datang dari vendor/sneat/core.css
   dan sengaja tidak ditimpa supaya tampilannya tetap Sneat.
   ========================================================================= */

/* ---------------------------------------------------------------- layout
   Dua aturan ini dibawa dari demo.css Sneat; tanpa keduanya brand di sidebar
   tingginya tidak sejajar navbar dan navbar di dalam konten menutupi dropdown. */
.menu .app-brand {
    height: 64px;
    margin-top: 12px;
}

.content-wrapper .navbar {
    z-index: auto;
}

/* Sneat menaikkan z-index navbar (1075) & sidebar (1080) lewat selector
   `body:not(.modal-open) ...` — sengaja diturunkan HANYA saat body punya
   class .modal-open, supaya backdrop MODAL BOOTSTRAP ASLI (yang menambahkan
   class itu) bisa menutupinya. SweetAlert2 adalah library terpisah yang tidak
   pernah menambahkan .modal-open ke body, jadi tanpa aturan ini overlay-nya
   (z-index 1060 secara default) selalu tertindih navbar & sidebar dan
   terlihat seperti tidak meredupkan apa pun. Dinaikkan di atas keduanya. */
.swal2-container {
    z-index: 1200;
}

/* Sama seperti SweetAlert2 di atas: select2-bootstrap-5-theme.min.css memberi
   .select2-dropdown z-index 1056, di bawah sidebar (1080). Select2 juga tidak
   pernah menambahkan .modal-open ke body, jadi dropdown-nya selalu tertindih
   sidebar. Paling terasa pada pemilih usaha DI DALAM sidebar sendiri — select
   box-nya tampil, tapi daftar usahanya terbuka lalu langsung tertutup sidebar,
   seolah datanya tidak ada.

   Selector disamakan dengan punya tema (.select2-container--bootstrap-5
   .select2-dropdown, dua kelas) — bukan cuma .select2-dropdown — karena
   spesifisitas menang atas urutan pemuatan file. app.css dimuat terakhir,
   tapi itu tidak cukup kalau selectornya kalah spesifik. */
.select2-container--bootstrap-5 .select2-dropdown {
    z-index: 1200;
}

.app-brand-logo {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 0.5rem;
    background: var(--bs-primary);
    color: #fff;
    font-size: 1.25rem;
}

/* Dipakai dengan class app-brand-logo yang sama supaya ukuran/posisinya
   konsisten dengan bekas emoji, tapi gambar butuh object-fit (emoji tidak)
   dan lingkaran lebih cocok untuk badge logo Fintera daripada kotak rounded. */
img.app-brand-logo {
    object-fit: cover;
    border-radius: 50%;
    background: transparent;
}

/* Sidebar dipakai untuk daftar perangkat, yang namanya bisa panjang. */
.menu-inner .menu-link .menu-device-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* ---------------------------------------------------------- titik status
   Dipakai di mana-mana untuk online/offline. Yang online berdenyut pelan
   supaya "hidup"-nya terbaca sekilas tanpa harus membaca teksnya. */
.status-dot {
    display: inline-block;
    flex: 0 0 auto;
    width: 0.6rem;
    height: 0.6rem;
    border-radius: 50%;
    vertical-align: middle;
}

.status-dot.online {
    background: var(--bs-success);
    box-shadow: 0 0 0 0.2rem rgba(var(--bs-success-rgb), 0.16);
    animation: ff-pulse 2.4s ease-out infinite;
}

.status-dot.offline {
    background: var(--bs-danger);
    box-shadow: 0 0 0 0.2rem rgba(var(--bs-danger-rgb), 0.16);
}

/* Dipakai penanda "Live" di navbar saat pembaruan otomatis dijeda operator.
   Sengaja abu-abu tanpa denyut, BUKAN merah seperti .offline: dijeda adalah
   pilihan yang disengaja, bukan gangguan yang perlu ditindaklanjuti. */
.status-dot.paused {
    background: var(--bs-secondary);
    box-shadow: 0 0 0 0.2rem rgba(var(--bs-secondary-rgb), 0.16);
}

@keyframes ff-pulse {
    0%   { box-shadow: 0 0 0 0 rgba(var(--bs-success-rgb), 0.4); }
    70%  { box-shadow: 0 0 0 0.45rem rgba(var(--bs-success-rgb), 0); }
    100% { box-shadow: 0 0 0 0 rgba(var(--bs-success-rgb), 0); }
}

@media (prefers-reduced-motion: reduce) {
    .status-dot.online { animation: none; }
}

/* ------------------------------------------------------------- statistik
   Angka besar pada kartu ringkasan. tabular-nums supaya angka yang berubah
   tiap refresh tidak menggeser layout. */
.stat-value {
    font-size: 1.5rem;
    font-weight: 600;
    line-height: 1.2;
    color: var(--bs-heading-color);
    font-variant-numeric: tabular-nums;
}

.stat-label {
    font-size: 0.8125rem;
    color: var(--bs-secondary-color);
}

.stat-unit {
    font-size: 0.875rem;
    font-weight: 400;
    color: var(--bs-secondary-color);
}

/* Baris "label — nilai" pada panel status perangkat. */
.info-row {
    display: flex;
    align-items: center;
    gap: 0.625rem;
    padding: 0.5rem 0;
    border-bottom: 1px solid var(--bs-border-color);
}

.info-row:last-child {
    border-bottom: 0;
}

.info-row .info-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 2rem;
    height: 2rem;
    border-radius: 0.375rem;
    font-size: 1rem;
}

.info-row .info-label {
    color: var(--bs-secondary-color);
    font-size: 0.8125rem;
}

/* Tanpa ini, label yang punya tooltip (mis. "Perkiraan habis") terlihat
   identik dengan label biasa — operator tidak tahu ada penjelasan untuk
   di-hover sampai kebetulan mengarahkan kursor ke sana. */
.info-row .info-label[data-bs-toggle="tooltip"] {
    cursor: help;
    text-decoration: underline dotted;
    text-underline-offset: 0.2em;
}

.info-row .info-value {
    margin-left: auto;
    font-weight: 500;
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------- pemilih hari
   Checkbox asli disembunyikan (bukan display:none) supaya tetap bisa
   difokus lewat keyboard dan dibaca screen reader. */
.day-picker {
    display: flex;
    gap: 0.25rem;
    flex-wrap: wrap;
}

/* min-width sengaja kecil: tujuh hari harus muat dalam satu baris bahkan di
   layar 360px, karena satu chip yang membungkus ke baris berikutnya membuat
   pemilih ini terbaca seperti dua kelompok yang berbeda. */
.day-picker > span {
    position: relative;
    flex: 1 1 0;
    min-width: 32px;
}

.day-picker input {
    position: absolute;
    opacity: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    cursor: pointer;
}

.day-picker label {
    display: block;
    text-align: center;
    padding: 0.375rem 0;
    font-size: 0.8125rem;
    border: 1px solid var(--bs-border-color);
    border-radius: 0.375rem;
    cursor: pointer;
    user-select: none;
    color: var(--bs-secondary-color);
    transition: all 0.15s ease-in-out;
}

.day-picker input:checked + label {
    background: var(--bs-primary);
    border-color: var(--bs-primary);
    color: #fff;
    font-weight: 500;
}

.day-picker input:focus-visible + label {
    outline: 2px solid var(--bs-primary);
    outline-offset: 2px;
}

/* ------------------------------------------------------------- riwayat */
.table-tabular td,
.table-tabular th {
    font-variant-numeric: tabular-nums;
}

.chart-box {
    position: relative;
    height: 300px;
}

/* Linimasa feeding terakhir. Sneat gratis tidak menyertakan komponen
   timeline, jadi versi ringkasnya dibuat di sini. */
.ff-timeline {
    list-style: none;
    margin: 0;
    padding: 0 0 0 1.125rem;
    border-left: 1px solid var(--bs-border-color);
}

.ff-timeline > li {
    position: relative;
    padding: 0 0 1rem 0.25rem;
}

.ff-timeline > li:last-child {
    padding-bottom: 0;
}

.ff-timeline > li::before {
    content: '';
    position: absolute;
    left: -1.5rem;
    top: 0.3rem;
    width: 0.625rem;
    height: 0.625rem;
    border-radius: 50%;
    background: var(--bs-secondary);
    box-shadow: 0 0 0 3px var(--bs-paper-bg);
}

.ff-timeline > li.ok::before      { background: var(--bs-success); }
.ff-timeline > li.rejected::before { background: var(--bs-danger); }

/* Kartu "Feeding terakhir" & "Perintah terakhir" di tab Ringkasan: dibatasi
   tingginya supaya 10 baris terbaru tidak membuat kartu tumbuh sampai
   berlayar-layar — kelebihannya digulir DI DALAM kartu, bukan mendorong
   seluruh halaman. overscroll-behavior mencegah gulir kartu "lolos" jadi
   gulir halaman begitu mentok ujung atas/bawahnya. */
.ff-scroll-list {
    max-height: 22rem;
    overflow-y: auto;
    overscroll-behavior: contain;
}

/* -------------------------------------------------------------- halaman login */
.auth-wrapper {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    padding: 1.5rem;
}

.auth-card {
    width: 100%;
    max-width: 26rem;
}

/* ------------------------------------------------------------- select2
   Paket "tema bootstrap-5" Select2 sebenarnya mengikuti Bootstrap POLOS
   (putih #fff, abu #ced4da, fokus biru #86b7fe) — bukan token Sneat, yang
   sudah menimpa warna-warna itu (lihat .form-control/.form-select di
   core.css: background transparan, border color-mix, glow ungu saat fokus).
   Tanpa override ini, setiap dropdown Select2 terlihat seperti komponen
   asing yang ditempel, bukan bagian dari tema. */
.select2-container--bootstrap-5 .select2-selection {
    min-height: calc(1.375em + 2 * 0.543rem + 2px);
    padding: 0.543rem 0.9375rem;
    font-size: 0.9375rem;
    line-height: 1.375;
    color: var(--bs-heading-color);
    background-color: transparent;
    border-color: var(--bs-border-color);
    border-radius: var(--bs-border-radius);
}

.select2-container--bootstrap-5.select2-container--focus .select2-selection,
.select2-container--bootstrap-5.select2-container--open .select2-selection {
    border-color: var(--bs-primary);
    box-shadow: 0 0.125rem 0.25rem 0 rgba(var(--bs-primary-rgb), 0.4);
}

.select2-container--bootstrap-5 .select2-selection--single {
    padding: 0.543rem 2.25rem 0.543rem 0.9375rem;
}

.select2-container--bootstrap-5 .select2-selection__placeholder {
    color: var(--bs-secondary-color);
}

.select2-container--bootstrap-5 .select2-dropdown {
    color: var(--bs-heading-color);
    background-color: var(--bs-paper-bg);
    border-color: var(--bs-border-color);
    border-radius: var(--bs-border-radius);
    box-shadow: var(--bs-box-shadow-lg);
}

.select2-container--bootstrap-5 .select2-search__field {
    color: var(--bs-heading-color);
    background-color: transparent;
    border-color: var(--bs-border-color);
}

.select2-container--bootstrap-5 .select2-search__field:focus {
    border-color: var(--bs-primary);
    box-shadow: 0 0.125rem 0.25rem 0 rgba(var(--bs-primary-rgb), 0.4);
}

.select2-container--bootstrap-5 .select2-results__option.select2-results__option--highlighted {
    color: var(--bs-heading-color);
    background-color: rgba(var(--bs-base-color-rgb), 0.06);
}

.select2-container--bootstrap-5 .select2-results__option.select2-results__option--selected,
.select2-container--bootstrap-5 .select2-dropdown .select2-results__option[aria-selected="true"]:not(.select2-results__option--highlighted) {
    color: var(--bs-primary);
    background-color: rgba(var(--bs-primary-rgb), 0.16);
}

.select2-container--bootstrap-5 .select2-results__option.select2-results__message,
.select2-container--bootstrap-5 .select2-results__group {
    color: var(--bs-secondary-color);
}

/* Varian "sm" disamakan manual dengan .form-select-sm — Select2 tidak
   punya ukuran kecil bawaan, jadi diberi class sendiri lewat app.js. */
.select2-sm .select2-selection {
    min-height: calc(1.375em + 2 * 0.3165rem + 2px);
    padding-top: 0.3165rem;
    padding-bottom: 0.3165rem;
    padding-left: 0.8125rem;
    font-size: 0.8125rem;
    border-radius: var(--bs-border-radius-sm);
}

/* --------------------------------------------------------------- flatpickr
   Sama seperti Select2: tema bawaan flatpickr adalah widget generik warna
   abu-abu polos, tidak tahu apa-apa soal palet ungu & sudut membulat Sneat.
   Kalender di sini disamakan supaya terlihat seperti bagian dari panel,
   bukan komponen pihak ketiga yang ditempel. */
.flatpickr-calendar {
    background: var(--bs-paper-bg);
    border: 1px solid var(--bs-border-color);
    border-radius: var(--bs-border-radius);
    box-shadow: var(--bs-box-shadow-lg);
}

.flatpickr-calendar.arrowTop:before,
.flatpickr-calendar.arrowTop:after {
    border-bottom-color: var(--bs-border-color);
}

.flatpickr-calendar.arrowTop:after {
    border-bottom-color: var(--bs-paper-bg);
}

.flatpickr-months .flatpickr-month,
.flatpickr-current-month {
    color: var(--bs-heading-color);
}

.flatpickr-current-month input.cur-year,
.flatpickr-current-month .flatpickr-monthDropdown-months {
    color: var(--bs-heading-color);
    background: transparent;
}

.flatpickr-weekdays {
    background: transparent;
}

span.flatpickr-weekday {
    color: var(--bs-secondary-color);
    font-weight: 500;
    background: transparent;
}

.flatpickr-day {
    color: var(--bs-heading-color);
    border-radius: var(--bs-border-radius-sm);
}

.flatpickr-day.today {
    border-color: var(--bs-primary);
}

.flatpickr-day:hover,
.flatpickr-day:focus {
    background: rgba(var(--bs-base-color-rgb), 0.06);
    border-color: transparent;
}

.flatpickr-day.selected,
.flatpickr-day.selected:hover,
.flatpickr-day.selected:focus {
    background: var(--bs-primary);
    border-color: var(--bs-primary);
    color: #fff;
}

.flatpickr-day.flatpickr-disabled,
.flatpickr-day.flatpickr-disabled:hover,
.flatpickr-day.prevMonthDay,
.flatpickr-day.nextMonthDay {
    color: var(--bs-secondary-color);
    opacity: 0.6;
}

.flatpickr-prev-month svg,
.flatpickr-next-month svg {
    fill: var(--bs-secondary-color);
}

.flatpickr-prev-month:hover svg,
.flatpickr-next-month:hover svg {
    fill: var(--bs-primary);
}

/* ------------------------------------------------------------------ misc */
.cursor-pointer {
    cursor: pointer;
}

/* Tombol aksi di dalam tabel: rapat tapi tetap cukup besar untuk jari. */
.table .btn-icon + .btn-icon {
    margin-left: 0.125rem;
}
