/* ============================================================
   Fragnal — lokalne overrides nad Standalone/Codli.Design
   ------------------------------------------------------------
   Codli.Design (codli-design.css) jest ładowany PRZED tym plikiem
   i dostarcza tokeny --brand-*, --ink-*, --status-* oraz komponenty
   .r-*. Tu trzymamy wyłącznie:

   1. Brand mapping --brand-50..950 (Material Blue Grey, anchor #263238).
   2. --fragnal-accent (pink #880E4F) — Fragnal-specific akcent.
   3. Drobne overrides dla form validation i blazor-error-ui.

   Stary system (--codli-color-*, Bootstrap overrides) jest usunięty.
   Mapping i archiwum: Wiki/Fragnal/Design-System.md.
   ============================================================ */

:root {
    /* Brand — Material Blue Grey, anchor --brand-700 = #263238 (primary Fragnala). */
    --brand-50:  #FAFBFC;
    --brand-100: #ECEFF1;
    --brand-200: #CFD8DC;
    --brand-300: #B0BEC5;
    --brand-400: #90A4AE;
    --brand-500: #78909C;
    --brand-600: #546E7A;
    --brand-700: #263238;
    --brand-800: #1F2A2E;
    --brand-900: #181F23;
    --brand-950: #0E1316;

    /* Fragnal-specific akcent (pink) — nazwy domen, badge admina, wyróżnienia. */
    --fragnal-accent: #880E4F;
    --fragnal-accent-hover: #ad1457;
}

/* ─── Auth shell (LoginLayout) ──────────────────────────
   Layout dla /account/login i /account/register. Centralny biały
   card na ciemnym brand-700 tle z logo Fragnala. Mobile: full-width.
   (Pełny split-view a la docs/components/Auth.md to follow-up — wymaga
    aktualizacji LoginLayout w Standalone/Codli.Addons.)
*/
.fragnal-auth-shell {
    width: 100%;
    min-height: 100vh;
    background: linear-gradient(180deg, var(--brand-700) 65%, var(--brand-950));
    display: flex;
    justify-content: center;
    align-items: stretch;
    overflow-x: hidden;
    color: var(--text-primary);
}

.fragnal-auth-particles {
    position: absolute;
    inset: 0;
    z-index: 0;
    pointer-events: none;
}

.fragnal-auth-card {
    z-index: 1;
    width: 100%;
    max-width: 500px;
    background: var(--bg-surface);
    box-shadow: var(--shadow-xl);
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: var(--s-8) var(--s-6) var(--s-12);
    min-height: 100vh;
    text-align: center;
    position: relative;
}

.fragnal-auth-logo {
    height: 150px;
    margin: var(--s-3) 0;
}

.fragnal-auth-title {
    font-weight: 300;
    font-size: var(--t-h2);
    color: var(--brand-700);
    margin: var(--s-3) 0;
    text-align: center;
}

.fragnal-auth-form {
    text-align: left;
    width: 100%;
    padding: var(--s-3) 0;
}

.fragnal-auth-field {
    margin-top: var(--s-3);
    margin-bottom: var(--s-4);
}

.fragnal-auth-field > label {
    display: block;
    margin-bottom: var(--s-1);
    font-weight: 500;
    font-size: var(--t-small);
    color: var(--text-primary);
}

.fragnal-auth-actions {
    width: 100%;
    display: flex;
    flex-direction: column;
    gap: var(--s-2);
    padding-bottom: var(--s-12);
}

.fragnal-auth-actions .r-btn {
    width: 100%;
}

.fragnal-auth-errors {
    padding: var(--s-3) var(--s-4);
    margin: 0 0 var(--s-3);
    list-style-type: none;
    font-size: var(--t-small);
    color: var(--ink-0);
    background: var(--status-rejected-solid);
    border-radius: var(--r-md);
    width: 100%;
}

.fragnal-auth-powered {
    position: absolute;
    bottom: 0;
    left: 50%;
    transform: translateX(-50%);
    padding: var(--s-2) var(--s-5);
    background: var(--bg-surface);
    border-radius: var(--r-xl) var(--r-xl) 0 0;
    box-shadow: var(--shadow-md);
    pointer-events: none;
    font-size: var(--t-body);
    line-height: var(--lh-snug);
}

.fragnal-auth-powered > .pow { font-weight: 400; font-size: var(--t-small); color: var(--text-secondary); }
.fragnal-auth-powered > .codli { font-weight: 300; color: var(--brand-700); font-size: var(--t-h3); }

/* Remembered accounts (lista zapamiętanych kont po stronie Login) */
.fragnal-remembered-account {
    display: flex;
    align-items: center;
    gap: var(--s-3);
    padding: var(--s-3);
    cursor: pointer;
    border-bottom: 1px solid var(--border-subtle);
    transition: background var(--d-fast) var(--ease-out);
}

.fragnal-remembered-account:hover { background: var(--bg-muted); }

.fragnal-remembered-avatar {
    width: 48px;
    height: 48px;
    border-radius: var(--r-pill);
    overflow: hidden;
    flex-shrink: 0;
}

.fragnal-remembered-avatar img { width: 100%; height: 100%; object-fit: cover; }

.fragnal-remembered-info { display: flex; flex-direction: column; text-align: left; min-width: 0; }
.fragnal-remembered-name  { font-weight: 500; font-size: var(--t-body);  color: var(--text-primary); }
.fragnal-remembered-email { font-size: var(--t-small); color: var(--text-secondary); }

.fragnal-selected-account { text-align: center; padding: var(--s-3) 0; }
.fragnal-selected-account .fragnal-remembered-avatar {
    width: 80px; height: 80px; margin: 0 auto var(--s-3);
}

@media (max-width: 600px) {
    .fragnal-auth-card { max-width: none; }
    .fragnal-auth-powered { padding-top: var(--s-6); position: relative; transform: none; left: 0; }
}

/* ─── Strefy DNS Azure — formularz dodawania rekordu ───── */
.fragnal-dns-add-form {
    border: 1px solid var(--border-default);
    border-radius: var(--r-md);
    padding: var(--s-3);
    background: var(--bg-muted);
}

.fragnal-dns-add-grid {
    display: grid;
    grid-template-columns: 1.5fr 1fr 1.5fr 0.7fr auto;
    gap: var(--s-3);
    align-items: end;
}

@media (max-width: 720px) {
    .fragnal-dns-add-grid { grid-template-columns: 1fr; }
}

/* RankDisplay — Fragnal-specific rank pill (Admin/Developer/Client). */
.codli-rank {
    display: inline-block;
    padding: 2px var(--s-2);
    border-radius: var(--r-pill);
    font-size: var(--t-caption);
    font-weight: 500;
    color: var(--ink-0);
}
.codli-rank-admin   { background: var(--fragnal-accent); }
.codli-rank-dev     { background: var(--brand-700); }
.codli-rank-client  { background: var(--status-info-fg, var(--brand-600)); }
.codli-rank-unknown { background: var(--ink-500); }

/* SsoSettings — inline label + input + delete button rows. */
.codli-inline-field-actions {
    display: flex;
    gap: var(--s-2);
    align-items: center;
}
.codli-inline-field-actions .r-input { flex: 1; }

.border        { border: 1px solid var(--border-default); }
.rounded       { border-radius: var(--r-md); }

/* App banner (Apps, Crypto, License pages) — wymusza wymiar logo
   nawet gdy renderuje je <Base64Image> z Blazings (poza scope CodliAppBanner.razor.css). */
.fragnal-app-banner {
    display: flex;
    justify-content: flex-start;
    align-items: center;
    gap: var(--s-4);
    margin-bottom: var(--s-4);
}

.fragnal-app-banner > h4 {
    font-family: var(--font-sans);
    font-weight: 300;
    font-size: var(--t-h1);
    margin: 0;
    color: var(--text-primary);
}

.fragnal-app-banner img.fragnal-app-img,
.fragnal-app-banner .fragnal-app-img {
    width: 64px !important;
    height: 64px !important;
    max-width: 64px !important;
    max-height: 64px !important;
    object-fit: contain;
    flex-shrink: 0;
    border-radius: var(--r-md);
}

.fragnal-profile-avatar {
    width: 128px;
    height: 128px;
    border-radius: var(--r-pill);
    overflow: hidden;
    border: 2px solid var(--brand-600);
    flex-shrink: 0;
}
.fragnal-profile-avatar img { width: 100%; height: 100%; object-fit: cover; }

.fragnal-app-table-image {
    max-height: 32px;
    max-width: 64px;
}

/* ─── Drobne klasy Fragnal-specific używane w listach ──── */
.codli-record-count {
    color: var(--text-secondary);
    font-size: var(--t-small);
}

.codli-status-ok    { color: var(--status-done-fg); font-weight: 500; }
.codli-status-error { color: var(--status-rejected-fg); font-weight: 500; }

/* Status pill — używane w listach Fragdens/Fragboty. */
.codli-status {
    display: inline-flex;
    align-items: center;
    gap: var(--s-1);
    padding: 2px var(--s-2);
    border-radius: var(--r-pill);
    font-size: var(--t-caption);
    font-weight: 500;
}
.codli-status-online  { background: var(--status-done-bg);     color: var(--status-done-fg); }
.codli-status-muted   { background: var(--ink-100);            color: var(--ink-600); }
.codli-status-warning { background: var(--status-pending-bg);  color: var(--status-pending-fg); }
.codli-status-danger  { background: var(--status-rejected-bg); color: var(--status-rejected-fg); }

/* Section header — heading + akcja (np. link "Więcej") w jednej linii. */
.codli-section-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--s-3);
    flex-wrap: wrap;
}

.text-decoration-none { text-decoration: none; }
.me-2 { margin-right: var(--s-2); }
.ms-2 { margin-left: var(--s-2); }
.mr-2 { margin-right: var(--s-2); }
.mx-1 { margin-left: var(--s-1); margin-right: var(--s-1); }
.p-3  { padding: var(--s-4); }
.p-4  { padding: var(--s-6); }

/* Stat tiles — używane w Fragdens Dashboard. */
.codli-stat-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: var(--s-4);
    margin-bottom: var(--s-6);
}

.codli-stat-tile {
    display: flex;
    flex-direction: column;
    gap: var(--s-1);
    padding: var(--s-4);
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: var(--r-md);
    box-shadow: var(--shadow-xs);
    border-top: 3px solid var(--brand-700);
}

.codli-stat-tile[data-accent="success"]   { border-top-color: var(--status-done-solid); }
.codli-stat-tile[data-accent="danger"]    { border-top-color: var(--status-rejected-solid); }
.codli-stat-tile[data-accent="secondary"] { border-top-color: var(--ink-500); }

.codli-stat-tile-label {
    color: var(--text-secondary);
    font-size: var(--t-caption);
    text-transform: uppercase;
    letter-spacing: var(--tracking-caps);
}

.codli-stat-tile-value {
    color: var(--text-primary);
    font-size: var(--t-h1);
    font-weight: 600;
    line-height: var(--lh-tight);
}

.codli-stat-tile-value-danger {
    color: var(--status-rejected-fg);
}

.codli-stat-tile-sub {
    color: var(--text-tertiary);
    font-size: var(--t-small);
}

/* Input group (Bootstrap) — Fragdens RegisterFragdens używa copy-to-clipboard. */
.input-group {
    display: flex;
    align-items: stretch;
    gap: 0;
}

.input-group > .r-input,
.input-group > input.r-input {
    flex: 1 1 auto;
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}

.input-group-append .r-btn,
.input-group-append button {
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
}

/* Spinner Bootstrap shim — najprostsza wersja, używana sporadycznie. */
.spinner-border {
    display: inline-block;
    width: 1.5rem;
    height: 1.5rem;
    border: 0.2em solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    animation: spinner-border 0.75s linear infinite;
}
.spinner-border-sm { width: 1rem; height: 1rem; border-width: 0.15em; }
@keyframes spinner-border { to { transform: rotate(360deg); } }
.sr-only {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* Bootstrap badge shim → r-badge variants */
.badge {
    display: inline-flex; align-items: center; gap: var(--s-1);
    padding: 2px var(--s-2);
    border-radius: var(--r-pill);
    font-size: var(--t-caption);
    font-weight: 500;
    line-height: 1;
}
.bg-success { background: var(--status-done-bg); color: var(--status-done-fg); }
.bg-danger  { background: var(--status-rejected-bg); color: var(--status-rejected-fg); }
.bg-warning { background: var(--status-pending-bg); color: var(--status-pending-fg); }
.bg-info    { background: var(--brand-50); color: var(--brand-700); }
.bg-secondary { background: var(--ink-100); color: var(--ink-700); }
.bg-primary { background: var(--brand-700); color: var(--text-on-brand); }

/* ─── Bootstrap utility shim — minimalna kompatybilność ─
   Po zdjęciu Bootstrapa w Fazie 1 zostały tylko utility classes typu
   .mb-3 / .d-flex / .text-muted używane gęsto w istniejących Razor pages.
   Te shim'y mapują je na tokeny Codli Design --s-* / --text-*, żeby
   uniknąć refactoringu ~kilkuset miejsc. Klasy komponentów (.btn, .card,
   .form-control) NIE są shim'owane — te wymieniamy na .r-* w Razor.
*/
.text-muted { color: var(--text-secondary); }
.text-center { text-align: center; }
.text-start  { text-align: left; }
.text-end    { text-align: right; }
.w-100       { width: 100%; }

.mb-0 { margin-bottom: 0; }
.mb-1 { margin-bottom: var(--s-1); }
.mb-2 { margin-bottom: var(--s-2); }
.mb-3 { margin-bottom: var(--s-4); }
.mb-4 { margin-bottom: var(--s-6); }
.mb-5 { margin-bottom: var(--s-8); }

.mt-0 { margin-top: 0; }
.mt-1 { margin-top: var(--s-1); }
.mt-2 { margin-top: var(--s-2); }
.mt-3 { margin-top: var(--s-4); }
.mt-4 { margin-top: var(--s-6); }
.mt-5 { margin-top: var(--s-8); }

.d-flex { display: flex; }
.d-block { display: block; }
.d-inline-block { display: inline-block; }
.d-none { display: none; }
.flex-column { flex-direction: column; }
.flex-grow-1 { flex: 1; }
.flex-wrap { flex-wrap: wrap; }
.align-items-center { align-items: center; }
.align-items-start { align-items: flex-start; }
.align-items-end { align-items: flex-end; }
.align-middle { vertical-align: middle; }
.justify-content-between { justify-content: space-between; }
.justify-content-center { justify-content: center; }
.justify-content-end { justify-content: flex-end; }

.gap-1 { gap: var(--s-1); }
.gap-2 { gap: var(--s-2); }
.gap-3 { gap: var(--s-4); }
.gap-4 { gap: var(--s-6); }
.gap-5 { gap: var(--s-8); }

@media (min-width: 768px) {
    .flex-md-row { flex-direction: row; }
    .justify-content-md-between { justify-content: space-between; }
    .align-items-md-center { align-items: center; }
    .w-md-auto { width: auto; }
}

/* ─── Tabele (.fragnal-table) ───────────────────────────
   Codli Design nie dostarcza tabeli — Fragnal definiuje własną
   nakładkę opartą na tokenach --brand-*/--ink-*. Markup:
   <div class="fragnal-table-wrap">
     <table class="fragnal-table"><thead>...</thead><tbody>...</tbody></table>
   </div>
*/
.fragnal-table-wrap {
    width: 100%;
    overflow-x: auto;
    background: var(--bg-surface);
    border: 1px solid var(--border-subtle);
    border-radius: var(--r-lg);
    box-shadow: var(--shadow-xs);
}

.fragnal-table {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--t-small);
}

.fragnal-table thead th {
    text-align: left;
    padding: var(--s-3) var(--s-4);
    font-size: var(--t-micro);
    font-weight: 600;
    letter-spacing: var(--tracking-caps);
    text-transform: uppercase;
    color: var(--text-tertiary);
    background: var(--bg-muted);
    border-bottom: 1px solid var(--border-subtle);
    white-space: nowrap;
}

.fragnal-table tbody td {
    padding: var(--s-3) var(--s-4);
    border-bottom: 1px solid var(--border-subtle);
    vertical-align: middle;
    color: var(--text-primary);
}

.fragnal-table tbody tr:last-child td {
    border-bottom: 0;
}

.fragnal-table tbody tr:hover {
    background: var(--bg-muted);
}

.fragnal-table-actions {
    display: flex;
    gap: var(--s-2);
    flex-wrap: wrap;
}

/* ─── Topbar user area (LoginDisplay) ───────────────── */
.fragnal-topbar-user {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: var(--s-3);
}

.fragnal-topbar-name {
    color: var(--text-primary);
    font-weight: 500;
    text-decoration: none;
}

.fragnal-topbar-name:hover {
    color: var(--brand-700);
}

.fragnal-topbar-avatar {
    display: inline-flex;
    width: 36px;
    height: 36px;
    border-radius: var(--r-pill);
    overflow: hidden;
    border: 1px solid var(--border-default);
}

.fragnal-topbar-avatar img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}

/* ─── CodliAlert — warianty spoza Codli Design (Primary/Info/Warning) ─── */
.fragnal-alert-primary {
    background: var(--brand-700);
    color: var(--ink-0);
    border-color: var(--brand-800);
}

.fragnal-alert-info {
    background: var(--brand-50);
    color: var(--brand-700);
    border-color: var(--brand-200);
}

.fragnal-alert-warning {
    background: var(--status-pending-bg);
    color: var(--status-pending-fg);
    border-color: var(--status-pending-solid);
}

/* ─── Pomocnicza klasa akcentu ──────────────────────── */
.fragnal-accent {
    color: var(--fragnal-accent);
}

.fragnal-accent:hover {
    color: var(--fragnal-accent-hover);
}

/* ─── Walidacja formularzy (zostawione z poprzedniego app.css) ─── */
.valid.modified:not([type=checkbox]) {
    outline: 1px solid var(--status-done-solid, #10b981);
}

.invalid {
    outline: 1px solid var(--status-rejected-solid, #dc2626);
}

.validation-message {
    color: var(--status-rejected-solid, #dc2626);
}

/* ─── Blazor error UI (statyczny element z index.html) ──── */
#blazor-error-ui {
    background: var(--status-pending-bg, #fef3c7);
    color: var(--status-pending-fg, #854d0e);
    bottom: 0;
    box-shadow: var(--shadow-lg);
    display: none;
    left: 0;
    padding: var(--s-3) var(--s-5);
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: var(--s-3);
        top: var(--s-2);
    }
