/* Shared motion, hover, validation, and feedback treatments. */
:root {
    --motion-fast: 160ms;
    --motion-base: 240ms;
    --motion-slow: 420ms;
    --motion-ease: cubic-bezier(.2, .8, .2, 1);
    --feedback-success: #0f766e;
    --feedback-error: #dc2626;
    --feedback-warning: #d97706;
    --feedback-info: #2563eb;
}

.app-page-enter {
    animation: app-page-enter var(--motion-slow) var(--motion-ease);
}

@keyframes app-page-enter {
    from {
        opacity: 0;
        transform: translateY(10px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.btn,
button,
[role="button"],
.action-btn,
.settings-link,
.page-link,
.dropdown-item {
    transition: transform var(--motion-fast) var(--motion-ease),
        color var(--motion-fast) ease,
        background-color var(--motion-fast) ease,
        border-color var(--motion-fast) ease,
        box-shadow var(--motion-fast) ease,
        opacity var(--motion-fast) ease;
}

.btn:active:not(:disabled),
button:active:not(:disabled),
[role="button"]:active {
    transform: translateY(1px) scale(.985);
}

.btn:focus-visible,
button:focus-visible,
a:focus-visible,
[role="button"]:focus-visible,
.form-control:focus-visible,
.form-select:focus-visible {
    outline: 3px solid rgba(45, 212, 191, .34);
    outline-offset: 2px;
}

.form-control,
.form-select,
input,
textarea,
select {
    transition: border-color var(--motion-fast) ease,
        box-shadow var(--motion-fast) ease,
        background-color var(--motion-fast) ease;
}

.form-control:focus,
.form-select:focus,
input:focus,
textarea:focus,
select:focus {
    border-color: #14b8a6;
    box-shadow: 0 0 0 4px rgba(20, 184, 166, .13);
}

.card,
.glass,
.stat-card,
.metric-card,
.plan-card,
.mobile-card,
.table-box {
    transition: transform var(--motion-base) var(--motion-ease),
        border-color var(--motion-base) ease,
        box-shadow var(--motion-base) ease;
}

.table tbody tr {
    transition: background-color var(--motion-fast) ease, transform var(--motion-fast) var(--motion-ease);
}

.app-data-clickable {
    cursor: pointer;
}

.app-data-clickable:focus-visible {
    position: relative;
    z-index: 1;
    outline: 3px solid rgba(45, 212, 191, .55);
    outline-offset: -3px;
    box-shadow: inset 4px 0 0 #2dd4bf;
}

.stat-card.app-data-clickable,
.stat-box.app-data-clickable,
.stat.app-data-clickable,
.metric-card.app-data-clickable,
.mini-stat.app-data-clickable,
.subscription-kpi.app-data-clickable,
.feature-card.app-data-clickable,
.plan-card.app-data-clickable,
.detail-card.app-data-clickable,
.user-card.app-data-clickable,
.role-card.app-data-clickable {
    cursor: pointer;
}

.mobile-card.app-data-clickable,
.issue-card.app-data-clickable,
.users-mobile-card.app-data-clickable,
.list-group-item.app-data-clickable {
    position: relative;
    padding-right: 42px;
}

.mobile-card.app-data-clickable::after,
.issue-card.app-data-clickable::after,
.users-mobile-card.app-data-clickable::after,
.list-group-item.app-data-clickable::after {
    position: absolute;
    top: 50%;
    right: 16px;
    color: #5eead4;
    font-family: "bootstrap-icons";
    font-size: 1rem;
    content: "\f285";
    transform: translateY(-50%);
    transition: transform var(--motion-fast) var(--motion-ease);
    pointer-events: none;
}

.dropdown-menu.show {
    transform-origin: top right;
    animation: app-menu-enter var(--motion-fast) var(--motion-ease) both;
}

@media (min-width: 992px) {
    .app-mega-menu.dropdown-menu.show {
        transform-origin: top center;
        animation: app-mega-menu-enter var(--motion-fast) var(--motion-ease) both;
    }
}

@keyframes app-menu-enter {
    from {
        opacity: 0;
        transform: translateY(-6px) scale(.985);
    }

    to {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

@keyframes app-mega-menu-enter {
    from {
        opacity: 0;
        transform: translateX(-50%) translateY(-6px) scale(.985);
    }

    to {
        opacity: 1;
        transform: translateX(-50%) translateY(0) scale(1);
    }
}

.modal.show .modal-content {
    animation: app-modal-enter var(--motion-base) var(--motion-ease) both;
}

@keyframes app-modal-enter {
    from {
        opacity: 0;
        transform: translateY(12px) scale(.985);
    }

    to {
        opacity: 1;
        transform: translateY(0) scale(1);
    }
}

.app-feedback-region {
    position: fixed;
    top: calc(84px + env(safe-area-inset-top, 0px));
    right: 18px;
    display: grid;
    width: min(420px, calc(100vw - 32px));
    gap: 10px;
    z-index: 1100;
    pointer-events: none;
}

.app-hover-tooltip {
    position: fixed;
    z-index: 2147483001;
    padding: 10px 12px;
    color: #f8fafc;
    font-size: .82rem;
    font-weight: 650;
    line-height: 1.4;
    white-space: normal;
    overflow-wrap: anywhere;
    pointer-events: none;
    border: 1px solid rgba(139, 217, 199, .28);
    border-radius: 8px;
    background: rgba(6, 31, 42, .98);
    box-shadow: 0 16px 40px rgba(1, 17, 25, .38);
    opacity: 0;
    transform: translateY(4px);
    transition: opacity var(--motion-fast) var(--motion-ease), transform var(--motion-fast) var(--motion-ease);
}

.app-hover-tooltip.is-visible {
    opacity: 1;
    transform: translateY(0);
}

.app-toast {
    --toast-accent: var(--feedback-info);
    position: relative;
    display: grid;
    grid-template-columns: 38px minmax(0, 1fr) 32px;
    align-items: start;
    gap: 11px;
    overflow: hidden;
    padding: 14px 12px 14px 14px;
    color: #0f172a;
    border: 1px solid rgba(15, 23, 42, .10);
    border-left: 4px solid var(--toast-accent);
    border-radius: 16px;
    background: rgba(255, 255, 255, .98);
    box-shadow: 0 20px 50px rgba(2, 16, 28, .22);
    opacity: 0;
    transform: translateX(24px) scale(.98);
    transition: opacity var(--motion-base) ease, transform var(--motion-base) var(--motion-ease);
    pointer-events: auto;
    backdrop-filter: blur(16px);
}

.app-toast.is-visible {
    opacity: 1;
    transform: translateX(0) scale(1);
}

.app-toast.is-leaving {
    opacity: 0;
    transform: translateX(18px) scale(.98);
}

.app-toast--success { --toast-accent: var(--feedback-success); }
.app-toast--error { --toast-accent: var(--feedback-error); }
.app-toast--warning { --toast-accent: var(--feedback-warning); }
.app-toast--info { --toast-accent: var(--feedback-info); }

.app-toast__icon {
    display: grid;
    place-items: center;
    width: 38px;
    height: 38px;
    color: var(--toast-accent);
    font-size: 1.05rem;
    border-radius: 12px;
    background: color-mix(in srgb, var(--toast-accent) 12%, white);
}

.app-toast__content {
    min-width: 0;
    padding-top: 1px;
}

.app-toast__title {
    margin: 0 0 2px;
    color: #0f172a;
    font-size: .94rem;
    font-weight: 800;
    line-height: 1.3;
}

.app-toast__message {
    margin: 0;
    color: #475569;
    font-size: .86rem;
    line-height: 1.45;
    overflow-wrap: anywhere;
}

.app-toast__close {
    display: grid;
    place-items: center;
    width: 32px;
    height: 32px;
    padding: 0;
    color: #64748b;
    border: 0;
    border-radius: 9px;
    background: transparent;
}

.app-toast__close:hover {
    color: #0f172a;
    background: #f1f5f9;
}

.app-toast__progress {
    position: absolute;
    right: 0;
    bottom: 0;
    left: 0;
    height: 3px;
    background: var(--toast-accent);
    transform-origin: left;
    animation: app-toast-progress var(--toast-duration, 5000ms) linear forwards;
}

@keyframes app-toast-progress {
    to { transform: scaleX(0); }
}

.app-inline-alert {
    position: relative;
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 13px 15px;
    color: #334155;
    border: 1px solid #dbe5e4;
    border-left-width: 4px;
    border-radius: 14px;
    background: #fff;
    box-shadow: 0 10px 28px rgba(15, 23, 42, .08);
}

.app-inline-alert.alert-success { border-left-color: var(--feedback-success); }
.app-inline-alert.alert-danger { border-left-color: var(--feedback-error); }
.app-inline-alert.alert-warning { border-left-color: var(--feedback-warning); }
.app-inline-alert.alert-info { border-left-color: var(--feedback-info); }

.app-alert-icon {
    flex: 0 0 auto;
    margin-top: 1px;
    color: currentColor;
    font-size: 1rem;
}

.app-alert-enter {
    animation: app-alert-enter var(--motion-base) var(--motion-ease) both;
}

@keyframes app-alert-enter {
    from {
        opacity: 0;
        transform: translateY(-6px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.form-control.is-invalid,
.form-select.is-invalid,
input.is-invalid,
textarea.is-invalid,
select.is-invalid {
    border-color: var(--feedback-error) !important;
    background-color: #fffafa;
    box-shadow: 0 0 0 4px rgba(220, 38, 38, .10) !important;
}

.invalid-feedback,
.app-field-error {
    margin-top: 6px;
    color: #fecaca;
    font-size: .82rem;
    font-weight: 650;
    line-height: 1.4;
}

.bg-white .invalid-feedback,
.modal-content .invalid-feedback,
.auth-card .invalid-feedback,
.app-field-error {
    color: #b91c1c;
}

.app-button-loading {
    position: relative;
    cursor: wait !important;
    pointer-events: none;
    opacity: .82;
}

.app-button-loading::before {
    width: 16px;
    height: 16px;
    margin-right: 8px;
    border: 2px solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    animation: app-spin .7s linear infinite;
    content: "";
}

@keyframes app-spin {
    to { transform: rotate(360deg); }
}

@media (hover: hover) and (pointer: fine) {
    .btn:hover:not(:disabled),
    button:hover:not(:disabled),
    [role="button"]:hover {
        transform: translateY(-1px);
    }

    .btn-primary:hover,
    .btn-main:hover {
        box-shadow: 0 10px 24px rgba(11, 127, 130, .28);
    }

    .card:hover,
    .stat-card:hover,
    .metric-card:hover,
    .plan-card:hover,
    .mobile-card:hover {
        transform: translateY(-3px);
        border-color: rgba(45, 212, 191, .30);
        box-shadow: 0 18px 42px rgba(1, 17, 25, .18);
    }

    .table tbody tr:hover {
        background-color: rgba(45, 212, 191, .08);
    }

    .table tbody tr.app-data-clickable:hover {
        box-shadow: inset 4px 0 0 #2dd4bf;
    }

    .mobile-card.app-data-clickable:hover::after,
    .issue-card.app-data-clickable:hover::after,
    .users-mobile-card.app-data-clickable:hover::after,
    .list-group-item.app-data-clickable:hover::after {
        transform: translate(3px, -50%);
    }
}

@media (max-width: 576px) {
    .app-feedback-region {
        top: auto;
        right: 12px;
        bottom: calc(14px + env(safe-area-inset-bottom, 0px));
        left: 12px;
        width: auto;
    }

    .app-toast {
        grid-template-columns: 36px minmax(0, 1fr) 32px;
        border-radius: 14px;
    }
}

@media (prefers-reduced-motion: reduce) {
    .app-page-enter,
    .dropdown-menu.show,
    .modal.show .modal-content,
    .app-alert-enter,
    .app-toast__progress,
    .app-button-loading::before {
        animation: none !important;
    }

    .app-toast {
        transition: none;
    }
}
