﻿/* Blazor Error UI Customization */
#blazor-error-ui {
    background: transparent;
    bottom: 0;
    box-shadow: none;
    display: none;
    left: 0;
    padding: 0;
    position: fixed;
    top: 0;
    width: 100%;
    z-index: 10000;
}

#blazor-error-ui[style*="display: block"], 
#blazor-error-ui[style*="display:block"] {
    display: flex !important;
    align-items: center;
    justify-content: center;
    background-color: rgba(0, 0, 0, 0.4);
    backdrop-filter: blur(2px);
}

.error-ui-overlay {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100%;
}

.error-ui-content {
    background: white;
    padding: 2.5rem;
    border-radius: 16px;
    box-shadow: 0 15px 50px rgba(0,0,0,0.3);
    text-align: center;
    max-width: 450px;
    width: 90%;
    animation: slideIn 0.3s ease-out;
    border: 1px solid rgba(0,0,0,0.05);
}

.error-ui-icon .spinner-border {
    width: 3.5rem;
    height: 3.5rem;
    margin-bottom: 1.5rem;
    border-width: 0.25rem;
}

.error-ui-message h4 {
    font-weight: 700;
    color: #111d43;
}

@keyframes slideIn {
    from { transform: translateY(20px); opacity: 0; }
    to { transform: translateY(0); opacity: 1; }
}

.error-ui-icon {
    font-size: 2.5rem;
    margin-bottom: 1rem;
}

.error-ui-message h3 {
    margin-bottom: 0.5rem;
    color: #d9534f;
}

.error-ui-message p {
    color: #666;
    margin-bottom: 1.5rem;
}

.error-ui-actions .reload {
    text-decoration: none;
}

.error-ui-actions .dismiss {
    font-size: 1.2rem;
}

/* Grid scroll host removed to allow natural column behavior */

h1:focus {
    outline: none;
}

a, .btn-link {
    color: #0071c1;
}

:root {
    --nak-autocomplete-font-size: 11px;
}

.rzi,
.material-symbols-outlined,
.nak-material-symbol {
    font-family: 'Material Symbols Outlined' !important;
    font-weight: 400;
    font-style: normal;
    font-size: inherit;
    line-height: 1;
    letter-spacing: normal;
    text-transform: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    white-space: nowrap;
    direction: ltr;
    font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
    -webkit-font-smoothing: antialiased;
    font-feature-settings: 'liga';
}

.rz-autocomplete-panel,
.rz-autocomplete-panel * {
    font-size: var(--nak-autocomplete-font-size) !important;
}

.rz-autocomplete-panel .rz-autocomplete-item,
.rz-autocomplete-panel .rz-autocomplete-items,
.rz-autocomplete-panel .rz-autocomplete-list,
.rz-autocomplete-panel [role="option"],
.rz-autocomplete-panel li {
    line-height: 1.35;
}

.btn-primary {
    color: #fff;
    background-color: #1b6ec2;
    border-color: #1861ac;
}

.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
  box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}

/* AG Grid editors: keep a simple "Excel-like" border (no Bootstrap blue ring) */
.ag-theme-quartz .form-control:focus,
.ag-theme-quartz .form-select:focus {
        box-shadow: none !important;
        outline: none !important;
}

.ag-theme-quartz .form-control,
.ag-theme-quartz .form-select {
        border-radius: 0 !important;
}

/* AG Grid Quartz adds its own focus ring + rounded corners via CSS variables/classes.
   Override them so Tip/Oluşturma editors match the simple Plaka look. */
.ag-theme-quartz {
    --ag-border-radius: 0px;
    --ag-wrapper-border-radius: 0px;
    --ag-input-focus-box-shadow: none;
    --ag-input-error-focus-box-shadow: none;
    --ag-popup-shadow: none;
    /* Keep focus border subtle (not blue). */
    --ag-input-focus-border-color: var(--ag-border-color);
    --ag-range-selection-border-color: var(--ag-border-color);
}

/* Remove popup shadow/rounding so dropdown/date editor looks like a normal cell editor */
.ag-theme-quartz .ag-popup-child:not(.ag-tooltip-custom),
.ag-popup-child:not(.ag-tooltip-custom) {
    box-shadow: none !important;
    border-radius: 0 !important;
}

.ag-theme-quartz .ag-popup-editor,
.ag-popup-editor {
    border-radius: 0 !important;
}

/* AG Grid native picker wrapper has hardcoded radius (5px) + focus shadow; flatten it */
.ag-theme-quartz .ag-picker-field-wrapper,
.ag-picker-field-wrapper {
    border-radius: 0 !important;
    box-shadow: none !important;
}

.ag-theme-quartz .ag-picker-field-wrapper.ag-picker-has-focus,
.ag-theme-quartz .ag-picker-field-wrapper:focus-within,
.ag-picker-field-wrapper.ag-picker-has-focus,
.ag-picker-field-wrapper:focus-within {
    border-color: var(--ag-border-color) !important;
    box-shadow: none !important;
    outline: none !important;
}

/* Our custom popup editors (SelectPopupEditor + DatePickerEditor) - Simple, Excel-like */
.nak-ag-editor-container {
    height: 100%;
    max-height: 100%;
}

.nak-ag-editor-input {
    width: 100%;
    height: 100%;
    padding: 2px 6px;
    margin: 0;
    border: 1px solid #000 !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    outline: none !important;
    background: #fff;
    font-family: inherit;
    font-size: inherit;
}

.nak-ag-editor-input:focus,
.nak-ag-editor-input:focus-visible {
    box-shadow: none !important;
    outline: none !important;
    border: 1px solid #000 !important;
}

.nak-ag-select-menu {
    border-radius: 0 !important;
    box-shadow: none !important;
    margin: 0;
    padding: 0;
}

.nak-ag-select-item {
    border-radius: 0 !important;
    margin: 0;
}

.nak-ag-select-item:focus,
.nak-ag-select-item:focus-visible {
    box-shadow: none !important;
    outline: none !important;
}

/* Remove any AG Grid focus/selection outlines/box-shadows around the editing cell */
.ag-theme-quartz .ag-cell-focus,
.ag-theme-quartz .ag-cell-inline-editing,
.ag-theme-quartz .ag-cell-inline-editing:focus-within,
.ag-theme-quartz .ag-cell-focus:not(.ag-cell-range-selected):focus-within,
.ag-theme-quartz .ag-cell.ag-cell-focus,
.ag-theme-quartz .ag-cell.ag-cell-inline-editing {
    box-shadow: none !important;
    outline: none !important;
    border: none !important;
    border-radius: 0 !important;
}

/* Global override for any cell focus state */
.ag-cell-focus,
.ag-cell-inline-editing,
.ag-cell.ag-cell-focus,
.ag-cell.ag-cell-inline-editing {
    box-shadow: none !important;
    outline: none !important;
    border: none !important;
}

/* Also remove focus ring from AG Grid native inputs (if any editor uses them) */
.ag-theme-quartz input[class^="ag-"]:focus,
.ag-theme-quartz textarea[class^="ag-"]:focus,
.ag-theme-quartz .ag-input-field-input:focus {
    box-shadow: none !important;
    outline: none !important;
    border-radius: 0 !important;
}

.content {
    padding-top: 1.1rem;
}

.valid.modified:not([type=checkbox]) {
    outline: 1px solid #26b050;
}

.invalid {
    outline: 1px solid red;
}

/* Keep Radzen pager arrows close to page numbers on screens using the default paginator. */
.rz-paginator {
    justify-content: center !important;
    align-items: center;
    gap: 0.25rem;
    flex-wrap: wrap;
}

.rz-paginator .rz-paginator-pages {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    margin: 0 0.25rem;
}

.rz-paginator .rz-paginator-element,
.rz-paginator .rz-dropdown,
.rz-paginator .rz-paginator-summary {
    margin: 0 !important;
}

.rz-paginator .rz-dropdown,
.rz-paginator .rz-paginator-summary {
    margin-left: 0.5rem !important;
}

.validation-message {
    color: red;
}

#blazor-error-ui {
    color-scheme: light only;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui .dismiss {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }

.blazor-error-boundary {
    background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
    padding: 1rem 1rem 1rem 3.7rem;
    color: white;
}

    .blazor-error-boundary::after {
        content: "An error has occurred."
    }

.loading-progress {
    position: absolute;
    display: block;
    width: 8rem;
    height: 8rem;
    inset: 20vh 0 auto 0;
    margin: 0 auto 0 auto;
}

    .loading-progress circle {
        fill: none;
        stroke: #e0e0e0;
        stroke-width: 0.6rem;
        transform-origin: 50% 50%;
        transform: rotate(-90deg);
    }

        .loading-progress circle:last-child {
            stroke: #1b6ec2;
            stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
            transition: stroke-dasharray 0.05s ease-in-out;
        }

.loading-progress-text {
    position: absolute;
    text-align: center;
    font-weight: bold;
    inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
}

    .loading-progress-text:after {
        content: var(--blazor-load-percentage-text, "Loading");
    }

code {
    color: #c02d76;
}

.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
    color: var(--bs-secondary-color);
    text-align: end;
}

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
    text-align: start;
}

/* Print Styles */
@media print {
    /* Isolated Print Method: 
       Real printing now happens via a hidden iframe (CommonUtils.print).
       When printing from the main document, we hide everything to prevent "leaks". */
    body > *:not(.print-only-container) {
        display: none !important;
    }

    .print-only-container {
        display: block !important;
        position: absolute !important;
        left: 0 !important;
        top: 0 !important;
        width: 100% !important;
        visibility: visible !important;
        background: #fff !important;
    }

    /* Reset potential layout constraints that could clip pages */
    html, body {
        height: auto !important;
        width: 100% !important;
        margin: 0 !important;
        padding: 0 !important;
        overflow: visible !important;
    }
}

.print-only-container {
    display: none;
}

/* ==========================================================================
   GENEL KURAL — Sayısal alanlarda artır/azalt (spinner) okları GÖSTERİLMEZ
   ==========================================================================
   Gerekçe: bu uygulamadaki sayısal alanlar miktar, birim fiyat, oran, tutar
   gibi serbest değerler taşır; tek tek artırmak gerçek bir kullanım değildir.
   Oklar dar grid hücrelerinde yazının üstüne biner, dokunmatik ekranda yanlış
   tıklamaya yol açar ve hücre genişliğini boşa harcar.

   Kural uygulama genelindedir ve BURADA merkezî olarak uygulanır; ekran ya da
   bileşen bazında ayrıca CSS yazılmaz. Yeni bir sayısal alan eklendiğinde
   kendiliğinden uyar. Bkz. docs/ARAYUZ_KURALLARI.md
   ========================================================================== */

/* Radzen sayısal bileşeni (RadzenNumeric) */
.rz-numeric .rz-numeric-up,
.rz-numeric .rz-numeric-down,
.rz-numeric .rz-numeric-button {
    display: none !important;
}

/* Radzen dışı native <input type="number"> alanları */
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
    -webkit-appearance: none;
    appearance: none;
    margin: 0;
}

input[type="number"] {
    -moz-appearance: textfield;
    appearance: textfield;
}
/* ══════════════════════════════════════════════════════════════════════════════
   DAĞITIM KABUĞUNDA GÖVDE DOLGUSU NÖTRLENİR

   Radzen'in .rz-layout'u 100vh yüksekliğinde ama gövdenin 16px dolgusu yüzünden
   y=16'dan başlıyor; son 16px görünen alanın dışında kalıyor ve `overflow:hidden`
   ile kırpılıyor. Sonuç: kenar menünün en altındaki "Çıkış Yap" düğmesinin alt
   boşluğu yarıya iniyor, düğme ekranın kenarına yapışmış gibi duruyor.

   Kapsam :has() ile YALNIZCA Dağıtım kabuğudur (.nav-menu-container yalnız orada
   render edilir); /sys ve Satın Alma kabukları etkilenmez — Satın Alma'nın kendi
   karşılığı procurement.css içindedir.
   ══════════════════════════════════════════════════════════════════════════════ */
body:has(.nav-menu-container) {
    padding: 0;
}

/* ══════════════════════════════════════════════════════════════════════════════
   TAŞINABİLİR DİYALOGDA KAPATMA BUTONU

   js/dialog-drag-guard.js kapatma butonunun çevresindeki tampon alanda taşımayı
   engeller. Aşağıdaki sınıfların ikisini de o dosya ekler; burada yalnızca imleç
   gerçek davranışa eşlenir:

     • .psh-draggable-dialog  → çubuk gerçekten taşınabilir     → move
     • .psh-no-drag-hover     → fare tampon alanın üzerinde     → default
     • kapatma butonu                                          → pointer

   Sıra önemlidir: no-drag-hover kuralları draggable kurallarıyla aynı özgüllükte
   olduğu için sonra gelmeleri gerekir.
   ══════════════════════════════════════════════════════════════════════════════ */
.rz-dialog-titlebar.psh-draggable-dialog,
.rz-dialog-titlebar.psh-draggable-dialog .rz-dialog-title {
    cursor: move;
}

.rz-dialog-titlebar.psh-no-drag-hover,
.rz-dialog-titlebar.psh-no-drag-hover .rz-dialog-title {
    cursor: default;
}

.rz-dialog-titlebar .rz-dialog-titlebar-close,
.rz-dialog-titlebar .rz-dialog-titlebar-close * {
    cursor: pointer;
}

/* ══════════════════════════════════════════════════════════════════════════════
   EKRAN YAKINLAŞTIRMASI — AÇILIR KATMANLAR

   Kabuk sayfa gövdesine `zoom` uygular; Radzen ise diyalogları ve açılır
   katmanları document.body altına taşıdığı için onlar o gövdenin dışında kalır
   ve yakınlaştırmadan etkilenmezdi. Ölçek burada, konum düzeltmesi
   js/screen-zoom.js içinde yapılır (Radzen konumu ekran pikseliyle yazar,
   zoom'lu elemanda o değer bir kez daha çarpılacağı için orana bölünür).

   Kurallar <html data-psh-zoomed> işaretine bağlıdır; işareti yalnızca oran
   %100'den farklıyken screen-zoom.js koyar. Yani varsayılan durumda TEK kural
   bile devreye girmez — `zoom: 1` yazmanın bile bir bedeli olmasın diye.

     • .rz-dialog          → diyalog penceresi (genişliği DialogOptions'tan gelir,
                             yakınlaştırmayla birlikte büyümesi beklenir)
     • .psh-zoom-overlay   → Radzen.openPopup'tan geçen her katman: açılır liste,
                             takvim, ipucu, sağ tık menüsü. Sınıfı screen-zoom.js
                             ekler.

   ÖLÇÜ SINIRI orana bölünür. Diyalog genişliği çoğu ekranda min(760px, 96vw)
   gibi verilir ve `max-height:100%` Radzen kuralından gelir; bu değerler
   pencerenin KENDİ ölçeğinde çözüldüğü için %150 yakınlaştırmada 96vw ekranın
   1,44 katına çıkar, pencere ekranın dışına taşardı. Sınırı orana bölünce üst
   değer yine tam ekran genişliği/yüksekliği olur.
   ══════════════════════════════════════════════════════════════════════════════ */
html[data-psh-zoomed] .rz-dialog,
html[data-psh-zoomed] .psh-zoom-overlay {
    zoom: var(--psh-screen-zoom, 1);
}

html[data-psh-zoomed] .rz-dialog {
    max-width: calc(100% / var(--psh-screen-zoom, 1));
    max-height: calc(100% / var(--psh-screen-zoom, 1));
}

/* ── Kaynak belge yetkileri ızgarası (Müşteri › Projeler, MainDB 0082) ──────
   Sekiz onay kutusu iki satır x dört sütun. Tablo kullanıldı çünkü sorulan şey
   gerçekten iki boyutlu: BELGE TÜRÜ x (taraf, işlem). Sekiz ayrı etiketli kutu
   alt alta dizilseydi aynı bilgi dört katı yer kaplar ve "hangi kutu hangi
   tarafın" sorusu her seferinde yeniden okunurdu. */
.psh-rights-grid { font-size: 12px; margin-bottom: 0; }
.psh-rights-grid th,
.psh-rights-grid td { padding: 3px 6px; border-color: #e7ecf2; }
.psh-rights-grid thead th { font-weight: 600; color: #5b6673; white-space: nowrap; }

/* Alt başlık satırı ("duzenlenebilsin"/"silinebilsin") üst başlıktan hafif olur:
   üstteki taraf adı okunacak, alttaki yalnız hatırlatma. */
.psh-rights-sub th { font-weight: 500; font-size: 11px; color: #8a949f; }

/* İki sütun grubunu ayıran çizgi: "Satın Alma" ile "bu operasyon" arasındaki sınır
   renkle değil boşlukla verilseydi dar ekranda kaybolurdu. */
.psh-rights-grid th:nth-child(5),
.psh-rights-grid td:nth-child(5) { border-left: 1px solid #d9e0e8; }

/* SABİT YER: uyarı metni belirip kaybolurken altındaki blok zıplamasın.
   İki satırlık yükseklik en uzun uyarıyı alır. */
.psh-rights-note { min-height: 32px; line-height: 16px; }

/* Yetki ızgarasında hücreye özgü not ("iptal"): talepte operasyon tarafı silmez,
   iptale alır. Sütun başlığı ortak kaldığı için fark hücrede yazılı. */
.psh-rights-hint { font-size: 9.5px; line-height: 11px; color: #8a949f; margin-top: 1px; }
