/* Dropdown container for Data button */
.dropdown-container {
    position: relative;
    display: inline-block;
}

.dropdown-toggle {
    display: flex;
    align-items: center;
    gap: 6px;
}

.dropdown-menu {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    background: var(--card-bg);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    box-shadow: var(--shadow-lg);
    min-width: 160px;
    z-index: 1000;
    overflow: hidden;
    opacity: 0;
    transform: translateY(-8px);
    pointer-events: none;
    transition: opacity 0.2s ease, transform 0.2s ease;
}

.dropdown-menu.is-open {
    opacity: 1;
    transform: translateY(0);
    pointer-events: auto;
}

/* Smart positioning: flip dropdown to right if too close to right edge */
.dropdown-menu.position-right {
    left: auto;
    right: 0;
}

.dropdown-item {
    width: 100%;
    padding: 10px 16px;
    border: none;
    background: none;
    color: var(--text-color);
    text-align: left;
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: 14px;
    transition: background 0.15s ease;
}

.dropdown-item:hover {
    background: var(--table-hover);
}

.dropdown-item i {
    width: 16px;
    text-align: center;
}


.controls-right {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}

.controls-toggle-btn {
    display: none;
    align-items: center;
    justify-content: center;
    gap: 6px;
    border: none;
    border-radius: 999px;
    background: var(--primary-color);
    color: #fff;
    padding: 10px 12px;
    font-size: 16px;
    cursor: pointer;
    box-shadow: 0 8px 18px rgba(0, 0, 0, 0.18), 0 0 0 3px rgba(59, 130, 246, 0.25);
    border: 1px solid rgba(255, 255, 255, 0.35);
    /* [CONTEXT 1] Buat berpendar seperti floating bulk delete button */
    animation: controlsToggleGlow 3.6s ease-in-out infinite;
}

.controls-toggle-btn::after {
    content: "";
}

@media (max-width: 768px) {
    .controls-toggle-btn {
        position: relative;
        padding: 10px 14px;
    }

    .controls-toggle-btn::after {
        content: "Kontrol";
        font-size: 12px;
        font-weight: 600;
        letter-spacing: 0.2px;
        margin-left: 6px;
        color: #fff;
        white-space: nowrap;
    }
}

.controls-toggle-btn i {
    font-size: 16px;
    color: darkorange;
}

/* [CONTEXT 1] Glow animation untuk controlsToggleBtn */
@keyframes controlsToggleGlow {
    0% {
        box-shadow: 0 8px 18px rgba(59, 130, 246, 0.25), 0 0 0 0 rgba(59, 130, 246, 0.25);
    }

    70% {
        box-shadow: 0 10px 22px rgba(59, 130, 246, 0.35), 0 0 0 18px rgba(59, 130, 246, 0);
    }

    100% {
        box-shadow: 0 8px 18px rgba(59, 130, 246, 0.25), 0 0 0 0 rgba(59, 130, 246, 0);
    }
}

.table-header-actions {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    margin-bottom: 8px;
    position: sticky;
    top: 56px;
    z-index: 95;
}

/* small spacing and sizing for per-table refresh button — line-height:1 agar icon di tengah */
.table-refresh-btn {
    margin-left: 8px;
    height: 32px;
    min-width: 36px;
    padding: 6px 8px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
}

.table-refresh-btn i {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
    line-height: 1;
}


.search-input {
    min-width: 200px;
    padding: 8px 12px;
    border: 1px solid var(--border-color);
    border-radius: 6px;
    font-size: 13px;
    background: var(--card-bg);
    color: var(--text-color);
}

.input-with-icon {
    position: relative;
    display: inline-flex;
    align-items: center;
}

.input-with-icon i {
    position: absolute;
    left: 10px;
    color: var(--secondary-color);
    font-size: 12px;
    pointer-events: none;
}

.input-with-icon .search-input {
    padding-left: 30px;
}

.controls.floating {
    position: fixed;
    left: 50%;
    transform: translateX(-50%);
    width: calc(100% - 40px);
    max-width: 1400px;
    z-index: 90;
    margin: 0;
    padding: 12px 20px;
    background: var(--card-bg);
    box-shadow: 0 10px 24px rgba(0, 0, 0, 0.12);
    border-bottom: 1px solid var(--border-color);
}


.filter-select {
    padding: 8px 12px;
    border: 1px solid var(--border-color);
    border-radius: 6px;
    font-size: 13px;
    background: var(--card-bg);
    color: var(--text-color);
    cursor: pointer;
}

/* Table */
.table-container {
    background: var(--card-bg);
    border-radius: 12px;
    box-shadow: var(--shadow);
    overflow-x: auto;
    overflow-y: visible;
    position: relative;
    cursor: text;
}

.table-container:active {
    cursor: grabbing;
    /* Show grabbing cursor when dragging */
}

#mainServiceTableContainer {
    overflow-x: auto;
}

#mainServiceTableContainer > .data-table {
    width: max-content;
    min-width: 100%;
}

#passwordChangesTableContainer,
#resetPasswordQueueTableContainer {
    overflow-x: auto;
}

#passwordChangesTableContainer > .data-table,
#resetPasswordQueueTableContainer > .data-table {
    width: max-content;
    min-width: 100%;
}

/* Make scrollbar always visible and more prominent */
.table-container::-webkit-scrollbar {
    height: 16px;
    /* Increased height for better visibility */
    position: sticky;
    bottom: 0;
}

.table-container::-webkit-scrollbar-track {
    background: var(--light-color);
    border-radius: 8px;
    border: 1px solid var(--border-color);
    box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.1);
}

.table-container::-webkit-scrollbar-thumb {
    background: linear-gradient(180deg, var(--primary-color) 0%, var(--primary-dark) 100%);
    border-radius: 8px;
    border: 2px solid var(--light-color);
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}

.table-container::-webkit-scrollbar-thumb:hover {
    background: linear-gradient(180deg, var(--primary-dark) 0%, var(--dark-color) 100%);
    cursor: pointer;
}

.table-container::-webkit-scrollbar-thumb:active {
    background: var(--dark-color);
}

/* Floating horizontal scrollbar (always accessible without scrolling to table bottom) */
.floating-hscroll {
    position: fixed;
    left: 8px;
    right: auto;
    bottom: 8px;
    width: calc(100vw - 16px);
    height: 18px;
    overflow-x: auto;
    overflow-y: hidden;
    background: var(--card-bg);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    box-shadow: var(--shadow);
    z-index: 9999;
    display: none;
}

.floating-hscroll-inner {
    height: 1px;
    width: 0;
}

.floating-hscroll::-webkit-scrollbar {
    height: 16px;
}

.floating-hscroll::-webkit-scrollbar-track {
    background: var(--light-color);
}

.floating-hscroll::-webkit-scrollbar-thumb {
    background: var(--secondary-color);
    border-radius: 8px;
}

.floating-hscroll::-webkit-scrollbar-thumb:hover {
    background: var(--dark-color);
}

.data-table {
    width: 100%;
    border-collapse: collapse;
    min-width: 800px;
}

.data-table thead {
    background: var(--table-header-bg);
    color: var(--table-header-text);
}

.data-table th,
.data-table td {
    padding: 8px 10px;
    text-align: left;
    font-size: 13px;
    line-height: 1.4;
    vertical-align: middle;
}

.data-table th {
    font-weight: 600;
    white-space: nowrap;
    font-size: 13px;
}

.data-table tbody tr {
    border-bottom: 1px solid var(--border-color);
    transition: background-color 0.2s, opacity 0.3s, transform 0.3s;
}

.data-table tbody tr:hover {
    background-color: var(--table-hover);
}

.data-table tbody tr.deleting {
    opacity: 0;
    transform: translateX(-20px);
}

/* Improve status column width to prevent wrapping */
.data-table th[data-column="status"],
.data-table td[data-column="status"] {
    min-width: 180px;
}

/* Inline Editor Styles */
.inline-editor {
    position: relative;
}

.inline-editor .editor-value,
.inline-editor .editor-value-wrapper {
    cursor: pointer;
    padding: 4px 6px;
    border-radius: 4px;
    transition: background-color 0.2s, box-shadow 0.2s;
    display: inline-block;
}

.inline-editor .editor-value:hover,
.inline-editor .editor-value-wrapper:hover {
    background-color: var(--table-hover);
    box-shadow: 0 0 0 2px var(--primary-color);
}

.inline-editor .editor-input {
    width: 100%;
    min-width: 80px;
    padding: 6px 8px;
    border: 1px solid var(--primary-color);
    border-radius: 4px;
    background: var(--card-bg);
    color: var(--text-color);
    font-size: 13px;
    outline: none;
    box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
}

.inline-editor .editor-input:focus {
    box-shadow: 0 0 0 3px var(--focus-ring);
}

/* Desktop: hide action column, show row click cursor */
@media (min-width: 769px) {

    .data-table th.sticky-action,
    .data-table td.sticky-action {
        display: none;
    }

    .data-table tbody tr {
        cursor: pointer;
    }

    .data-table tbody tr:hover {
        background-color: var(--table-hover);
        box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
    }
}

/* Floating action popup for desktop */
.row-action-popup {
    position: fixed;
    background: var(--card-bg);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
    padding: 8px;
    z-index: 10000;
    display: none;
    min-width: 200px;
}

.row-action-popup.show {
    display: block;
}

.row-action-popup .popup-header {
    padding: 8px 12px;
    border-bottom: 1px solid var(--border-color);
    font-size: 12px;
    color: var(--secondary-color);
    font-weight: 600;
}

.row-action-popup .popup-actions {
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 4px;
}

.row-action-popup .popup-actions button {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    border: none;
    background: var(--card-bg);
    color: var(--text-color);
    border-radius: 4px;
    cursor: pointer;
    font-size: 13px;
    text-align: left;
    transition: background 0.2s;
}

.row-action-popup .popup-actions button:hover {
    background: var(--table-hover);
}

.row-action-popup .popup-actions button.copy-btn:hover {
    background: #e3f2fd;
}

.row-action-popup .popup-actions button.use-btn:hover {
    background: #e8f5e9;
}

.row-action-popup .popup-actions button.reset-btn:hover {
    background: #fff3e0;
}

.row-action-popup .popup-actions button.edit-btn:hover {
    background: #fff3e0;
}

.row-action-popup .popup-actions button.add-btn:hover {
    background: #e8f5e9;
}

.row-action-popup .popup-actions button.deduct-btn:hover {
    background: #ffe5e5;
}

.row-action-popup .popup-actions button.delete-btn:hover {
    background: #ffebee;
    color: var(--danger-color);
}

/* Sticky action column for small screens */
@media (max-width: 768px) {
    .controls.mobile-collapsed {
        display: none;
    }

    .controls {
        display: none;
    }

    .controls.mobile-open {
        display: flex !important;
        position: fixed;
        left: 12px;
        right: 12px;
        bottom: 74px;
        z-index: 12000;
        flex-direction: column;
        align-items: stretch;
        padding: 12px;
        gap: 12px;
        background: var(--card-bg);
        border: 1px solid var(--border-color);
        border-radius: 12px;
        box-shadow: 0 12px 26px rgba(0, 0, 0, 0.2);
        max-height: calc(100vh - 140px);
        overflow-y: auto;
    }

    .controls.mobile-open .controls-left,
    .controls.mobile-open .controls-right {
        width: 100%;
    }

    .controls-toggle-btn {
        display: inline-flex;
        position: fixed;
        right: 16px;
        bottom: 16px;
        z-index: 12001;
    }

    .table-container {
        overflow-x: auto;
    }

    .data-table th.sticky-action,
    .data-table td.sticky-action {
        position: sticky;
        right: 0;
        background: var(--table-header-bg);
        z-index: 10;
        box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);
        min-width: 60px !important;
        max-width: 70px !important;
        width: 65px !important;
        padding: 6px 4px !important;
    }

    .data-table tbody tr td.sticky-action {
        background: var(--card-bg);
    }

    .data-table tbody tr:hover td.sticky-action {
        background-color: var(--table-hover);
    }

    /* Make action buttons more compact on mobile */
    .action-buttons .action-buttons-desktop {
        display: none !important;
    }

    .action-buttons .action-buttons-mobile {
        display: block !important;
    }

    .btn-icon {
        padding: 6px 10px;
        font-size: 16px;
        width: auto;
        text-align: center;
    }

    .btn-menu {
        padding: 6px 12px;
        min-width: 45px;
        font-size: 16px;
    }
}

/* Column Selector Dropdown */
.column-selector-backdrop {
    display: none;
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, 0.45);
    z-index: 1089;
}

.column-selector-backdrop.is-open {
    display: block;
}

.column-selector {
    position: fixed;
    background: var(--card-bg);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    box-shadow: var(--shadow-lg);
    padding: 15px;
    min-width: 200px;
    z-index: 1000;
    opacity: 0;
    transform: translateY(-6px);
    pointer-events: none;
    will-change: transform, opacity;
    transition: opacity 0.2s ease, transform 0.2s ease;
}

.column-selector.is-open {
    opacity: 1;
    transform: translateY(0);
    pointer-events: auto;
    animation: dropdownIn 0.2s ease;
}

.column-selector-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 12px;
    padding-bottom: 10px;
    border-bottom: 1px solid var(--border-color);
}

.column-selector-header button {
    background: none;
    border: none;
    font-size: 24px;
    cursor: pointer;
    color: var(--secondary-color);
    padding: 0;
    width: 24px;
    height: 24px;
    line-height: 1;
}

.column-selector-header button:hover {
    color: var(--danger-color);
}

.column-selector-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 6px 0;
    font-size: 14px;
}

.column-selector-item:hover {
    background-color: #f8f9fa;
}

.column-selector input[type="checkbox"] {
    cursor: pointer;
}

@media (max-width: 768px) {
    .column-selector {
        width: min(92vw, 430px);
        min-width: unset;
        max-height: min(82vh, 560px);
        overflow-y: auto;
        left: 50% !important;
        top: 50% !important;
        bottom: auto !important;
        transform: translate(-50%, -52%) scale(0.98);
        z-index: 1090;
        padding: 12px;
        border-radius: 12px;
    }

    .column-selector.is-open {
        transform: translate(-50%, -50%) scale(1);
    }

    .column-selector-header {
        position: sticky;
        top: 0;
        z-index: 1;
        background: var(--card-bg);
        padding-top: 2px;
    }

    .column-selector-item {
        padding: 9px 0;
    }
}

.controls-left {
    position: relative;
}

.status-badge {
    display: inline-block;
    padding: 5px 12px;
    border-radius: 20px;
    font-size: 12px;
    font-weight: 600;
}

.status-dipakai {
    background: #d4edda;
    color: #155724;
}

.status-tidak {
    background: #f8d7da;
    color: #721c24;
}

.status-expired {
    background-color: #fff3cd;
    color: #856404;
    border: 1px solid #ffc107;
    font-size: 11px;
    font-weight: 600;
}

.action-buttons {
    display: flex;
    gap: 3px;
    position: relative;
}

.action-buttons-desktop {
    display: flex;
    gap: 3px;
}

.action-buttons-mobile {
    display: none;
    position: relative;
}

.service-cell-with-copy {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    max-width: 100%;
}

.credential-copy-inline {
    width: 100%;
    justify-content: space-between;
}

.service-cell-value {
    overflow-wrap: anywhere;
}

.credential-input-with-copy {
    display: flex;
    align-items: center;
    gap: 6px;
}

.credential-input-with-copy input {
    flex: 1 1 auto;
    min-width: 0;
}

.credential-copy-inline-btn {
    align-self: center;
}

.service-cell-copy-btn {
    background: #4f6b8a;
    font-size: 10px;
    padding: 3px 7px;
    min-width: 24px;
    flex-shrink: 0;
}

.service-cell-copy-btn:hover {
    background: #3e5a78;
}

.btn-icon {
    padding: 4px 8px;
    font-size: 12px;
    border: none;
    border-radius: 3px;
    cursor: pointer;
    transition: all 0.2s;
    min-width: 32px;
    text-align: center;
}

.btn-icon i {
    color: #ffffff;
}

.btn-edit {
    background: var(--warning-color);
    color: white;
}

.btn-edit:hover {
    background: #e67e22;
}

.btn-info {
    background: #17a2b8;
    color: white;
}

.btn-info:hover {
    background: #138496;
}

.btn-delete {
    background: var(--danger-color);
    color: white;
}

.btn-delete:hover {
    background: #c0392b;
}

.btn-copy {
    background: linear-gradient(135deg, #6366f1, #8b5cf6);
    color: white;
    box-shadow: 0 2px 6px rgba(99, 102, 241, 0.3);
    transition: all 0.25s var(--ui-ease);
}

.btn-copy:hover {
    background: linear-gradient(135deg, #4f46e5, #7c3aed);
    box-shadow: 0 4px 12px rgba(99, 102, 241, 0.45);
    transform: translateY(-1px);
}

.btn-copy:active {
    transform: translateY(0);
    box-shadow: 0 1px 4px rgba(99, 102, 241, 0.3);
}

/* Balance usage cost coloring */
.balance-cost-negative {
    color: #27ae60;
    /* green for refunds/top-ups shown as negative */
    font-weight: 600;
}

.balance-cost-positive {
    color: #e74c3c;
    /* red for expense */
    font-weight: 600;
}

.btn-menu {
    background: #34495e;
    color: white;
    font-size: 18px;
    font-weight: bold;
    padding: 8px 16px;
    min-width: 50px;
}

.btn-menu:hover {
    background: #2c3e50;
}

.action-dropdown {
    display: none;
    position: fixed;
    background: var(--card-bg);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
    min-width: 150px;
    z-index: 20000;
    opacity: 0;
    transform: translateY(-6px);
    pointer-events: none;
    will-change: transform, opacity;
    transition: opacity 0.2s ease, transform 0.2s ease;
}

.action-dropdown.show {
    display: block;
    opacity: 1;
    transform: translateY(0);
    pointer-events: auto;
    animation: dropdownIn 0.2s ease;
}

.action-dropdown button {
    display: block;
    width: 100%;
    padding: 10px 16px;
    border: none;
    background: none;
    text-align: left;
    cursor: pointer;
    font-size: 14px;
    color: #2c3e50;
    transition: background 0.2s;
}

.action-dropdown button:hover {
    background: #f8f9fa;
}

.action-dropdown button:first-child {
    border-radius: 8px 8px 0 0;
}

.action-dropdown button:last-child {
    border-radius: 0 0 8px 8px;
}

/* Buttons */
.btn {
    padding: 8px 16px;
    border: none;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.2s;
    text-decoration: none;
    display: inline-block;
}

.btn i {
    margin-right: 6px;
}

.fa-solid,
.fa-regular {
    transition: color 0.2s ease;
}

.fa-chart-column,
.fa-chart-line,
.fa-circle-info,
.fa-eye,
.fa-file-export,
.fa-file-import,
.fa-file-lines,
.fa-clipboard,
.fa-scroll {
    color: var(--icon-blue);
}

.fa-circle-check,
.fa-check,
.fa-plus,
.fa-wallet,
.fa-right-to-bracket {
    color: var(--icon-green);
}

.fa-circle-xmark,
.fa-trash,
.fa-ban,
.fa-xmark {
    color: var(--icon-red);
}

.fa-triangle-exclamation,
.fa-rotate,
.fa-rotate-left,
.fa-clock-rotate-left,
.fa-hourglass-half,
.fa-stopwatch,
.fa-clock,
.fa-minus,
.fa-circle-question {
    color: var(--icon-orange);
}

.fa-key,
.fa-pen-to-square,
.fa-comment-dots,
.fa-floppy-disk {
    color: var(--icon-purple);
}

.fa-user,
.fa-users,
.fa-user-plus,
.fa-user-gear,
.fa-user-pen,
.fa-user-check,
.fa-user-slash {
    color: var(--icon-teal);
}

.fa-bell,
.fa-sun,
.fa-lightbulb {
    color: var(--icon-gold);
}

.fa-moon,
.fa-magnifying-glass,
.fa-ellipsis,
.fa-ellipsis-vertical,
.fa-chevron-down,
.fa-chevron-up,
.fa-sliders {
    color: var(--icon-gray);
}

.fa-globe,
.fa-database,
.fa-list,
.fa-table-columns,
.fa-folder-open,
.fa-print,
.fa-gear,
.fa-clipboard-list {
    color: var(--icon-teal);
}

/* Theme switcher icon color */
#themeSwitcherBtn .fa-palette {
    color: var(--icon-purple);
}

/* === Ikon dalam tombol berwarna — warna kontras spesifik ===
   Mencegah ikon menyatu dengan background tombol.
   Default/Dark theme: ikon putih (#fff) karena background tombol gelap.
   Light theme: ikon pakai warna medium cerah agar kontras dengan background terang,
   tapi TIDAK sama dengan warna teks. Khusus danger/hapus TIDAK pakai merah. */

/* --- Default & Dark theme: ikon putih di atas background gelap --- */
.btn-danger i,
.btn-delete i { color: #ffffff; }
.btn-success i { color: #ffffff; }
.btn-warning i,
.btn-edit i { color: #ffffff; }
.btn-primary i { color: #ffffff; }
.btn-info i { color: #ffffff; }
.btn-copy i,
.btn-menu i,
.btn-block i { color: #ffffff; }
.badge-danger i,
.badge-warning i,
.badge-success i,
.badge-info i { color: #ffffff; }

/* --- Light theme: background terang → ikon pakai warna medium cerah --- */
html:not([data-theme]) .btn-danger i,
[data-theme="light"] .btn-danger i,
html:not([data-theme]) .btn-delete i,
[data-theme="light"] .btn-delete i { color: #94a3b8; }  /* slate-400, bukan merah */

html:not([data-theme]) .btn-success i,
[data-theme="light"] .btn-success i { color: #34d399; }  /* emerald-400 */

html:not([data-theme]) .btn-warning i,
[data-theme="light"] .btn-warning i,
html:not([data-theme]) .btn-edit i,
[data-theme="light"] .btn-edit i { color: #fbbf24; }  /* amber-400 */

html:not([data-theme]) .btn-primary i,
[data-theme="light"] .btn-primary i { color: #60a5fa; }  /* blue-400 */

html:not([data-theme]) .btn-info i,
[data-theme="light"] .btn-info i { color: #22d3ee; }  /* cyan-400 */

html:not([data-theme]) .btn-copy i,
[data-theme="light"] .btn-copy i { color: #ffffff; }  /* ikon putih di atas gradien ungu */
html:not([data-theme]) .btn-menu i,
[data-theme="light"] .btn-menu i,
html:not([data-theme]) .btn-block i,
[data-theme="light"] .btn-block i { color: #94a3b8; }  /* slate-400 */

html:not([data-theme]) .badge-danger i,
[data-theme="light"] .badge-danger i,
html:not([data-theme]) .badge-warning i,
[data-theme="light"] .badge-warning i,
html:not([data-theme]) .badge-success i,
[data-theme="light"] .badge-success i,
html:not([data-theme]) .badge-info i,
[data-theme="light"] .badge-info i { color: #ffffff; }

.btn-primary {
    background: var(--primary-color);
    color: #ffffff;
    box-shadow: 0 4px 10px rgba(52, 152, 219, 0.25);
}

.btn-primary:hover {
    background: var(--primary-dark);
    transform: translateY(-1px);
}

.btn-secondary {
    background: var(--secondary-color);
    color: #ffffff;
    box-shadow: 0 4px 10px rgba(127, 140, 141, 0.22);
}

.btn-secondary:hover {
    background: var(--secondary-dark);
    transform: translateY(-1px);
}

.btn-success {
    background: var(--success-color);
    color: #ffffff;
    box-shadow: 0 4px 10px rgba(46, 204, 113, 0.22);
}

.btn-success:hover {
    background: color-mix(in srgb, var(--success-color) 85%, #0f172a 15%);
    transform: translateY(-1px);
}

.btn-warning {
    background: var(--warning-color);
    color: #ffffff;
    box-shadow: 0 4px 10px rgba(243, 156, 18, 0.22);
}

.btn-warning:hover {
    background: color-mix(in srgb, var(--warning-color) 85%, #0f172a 15%);
    transform: translateY(-1px);
}

.btn-danger {
    background: var(--danger-color);
    color: #ffffff;
    box-shadow: 0 4px 10px rgba(231, 76, 60, 0.22);
}

.btn-danger:hover {
    background: color-mix(in srgb, var(--danger-color) 85%, #0f172a 15%);
    transform: translateY(-1px);
}

/* ──────────────────────────────────────────────────────────────
   Tombol "Terapkan" filter tabel
   ──────────────────────────────────────────────────────────────
   Pencarian & filter di seluruh dashboard baru berlaku setelah tombolnya ditekan. Penanda di
   bawah menyala saat isi kotak filter berbeda dari yang sedang berlaku — tanpa itu, tabel yang
   belum berubah setelah user mengetik terbaca sebagai pencarian yang rusak, bukan sebagai
   pencarian yang menunggu dikonfirmasi.

   Animasinya sengaja hanya satu denyut (bukan infinite): animasi tak berujung membakar CPU
   selama halaman terbuka meski tidak ada yang melihatnya. */
.has-pending-filter {
    outline: 2px solid var(--warning-color, #f39c12);
    outline-offset: 1px;
    animation: filter-pending-pulse 320ms ease-out 1;
}

@keyframes filter-pending-pulse {
    from { transform: scale(0.96); }
    to   { transform: scale(1); }
}
