/**
 * ============================================================================
 * Art Festival Asia — форма элементтерінің БІРЫҢҒАЙ визуалды жүйесі
 * ============================================================================
 *
 * НЕГЕ БҰЛ ФАЙЛ КЕРЕК БОЛДЫ
 * -------------------------
 * Жобаның шаблондары Tailwind-тың `@tailwindcss/forms` плагині бар деген
 * болжаммен жазылған: өрістерде `rounded-lg border-slate-200 text-sm`
 * сияқты класстар тұр, бірақ `border` (жуандық) және `px/py` класстары
 * ЖОҚ — оларды әдетте сол плагин базалық қабатта береді.
 *
 * Ал сайтта Tailwind CDN плагинсіз жүктеледі. Tailwind-тың preflight
 * қабаты барлық элементке `border-width: 0` деп, ал `input, select,
 * textarea` элементтеріне `padding: 0` деп жазады. Нәтижесінде:
 *   • өрістердің шекарасы МҮЛДЕМ көрінбейді (`border-slate-200` тек
 *     ТҮСТІ береді, жуандығы 0 болғандықтан ол ешқашан салынбайды);
 *   • мәтін өрістің шетіне жабысып тұрады (ішкі padding нөл).
 * Дәл осы екеуі — тапсырмада айтылған басты екі мәселе.
 *
 * Плагин қосудың орнына (сыртқы тәуелділік) базалық қабатты өзіміз
 * жазамыз — жобаның «артық кітапхана қоспау» ұстанымына сай.
 *
 * СПЕЦИФИКАЛЫҚ (specificity) ТУРАЛЫ — МАҢЫЗДЫ
 * -------------------------------------------
 * Tailwind CDN өз стилін бетті ашқанда <style> түрінде <head> соңына
 * қосады, яғни ол ӘРҚАШАН осы файлдан КЕЙІН тұрады. Сондықтан «кейін
 * жазылған жеңеді» ережесіне сүйенуге болмайды — тек специфика жеңеді.
 *
 * Утилита-класс (`.border-slate-200`) специфика = (0,1,0).
 * Сондықтан базалық ережелер (0,1,1) деңгейінде: элемент таңдағышы +
 * БІР `:not(...)`. Ішіндегі шектеулер үтірмен БІР тізімге жинақталған —
 * бұл МАҢЫЗДЫ: `:not()` өз аргументтерінің ЕҢ жоғарысының салмағын
 * алады, сондықтан тізім қанша ұзын болса да салмағы (0,1,0) күйінде
 * қалады. Егер оларды `:not(a):not(b):not(c)` деп БӨЛЕК жазсақ, салмақ
 * (0,10,1)-ге дейін өсіп кетер еді де, ықшам өріс (`text-xs`) немесе
 * қате күйі (`.is-invalid`) сияқты кейінгі ережелер жеңе алмай қалар еді.
 *
 * Деңгейлер:
 *   базалық қабат        (0,1,1)
 *   өлшем / күй қабаты   (0,2,1) — text-xs, disabled, readonly, is-invalid
 *   hover / focus        (0,2,1) — `focus:border-brand-pink` (0,2,0) жеңіледі
 *
 * ҚОЛДАНЫЛУЫ
 * ----------
 * Файл екі layout-та да жалғанады (views/layouts/front.php және
 * views/layouts/admin.php), сондықтан САЙТТЫҢ БАРЛЫҚ бетіне —
 * публикалық беттер, кіру/тіркелу, өтінім формасы, байланыс, іздеу,
 * жеке кабинет, әкімші панелі, модаль терезелер — бірдей әсер етеді.
 * Ешбір бетте жеке-дара форма стилін жазудың қажеті жоқ.
 */

/* ---------------------------------------------------------------------------
   1. Дизайн-токендер
   Барлық өлшем мен түс осы жерден басқарылады. Түстер — жобаның бұрыннан
   бар брендтік палитрасы (#EC1E79 pink, #1F0B3D purpledark) және Tailwind
   slate шкаласы, яғни жаңа түс енгізілмейді.
--------------------------------------------------------------------------- */
:root {
    /* Шекара: slate-300 — ақ фонда да, әкімшінің slate-50 фонында да
       анық көрінеді (бұрынғы slate-200 тым ашық еді). */
    --afa-field-border: #cbd5e1;
    --afa-field-border-hover: #94a3b8;   /* slate-400 — hover кезінде күшейеді */
    --afa-field-border-focus: #ec1e79;   /* brand.pink */

    --afa-field-bg: #ffffff;
    --afa-field-bg-disabled: #f1f5f9;    /* slate-100 */
    --afa-field-bg-readonly: #f8fafc;    /* slate-50 */

    --afa-field-text: #0f172a;           /* slate-900 — енгізілген мәтін */
    --afa-field-text-muted: #475569;     /* slate-600 — өшірілген өріс мәтіні */
    --afa-placeholder: #64748b;          /* slate-500: контраст 4.7:1 — оқылады,
                                            бірақ нақты мәтіннен айқын жеңіл */

    --afa-danger: #dc2626;
    --afa-danger-ring: rgba(220, 38, 38, 0.16);
    --afa-success: #059669;
    --afa-success-ring: rgba(5, 150, 105, 0.16);
    --afa-focus-ring: rgba(236, 30, 121, 0.18);

    --afa-field-radius: 0.5rem;          /* rounded-lg-пен бірдей */
    --afa-field-radius-sm: 0.375rem;
    --afa-field-padding-y: 0.625rem;     /* 10px */
    --afa-field-padding-x: 0.875rem;     /* 14px */
    --afa-field-padding-y-sm: 0.375rem;
    --afa-field-padding-x-sm: 0.5rem;
}

/* ---------------------------------------------------------------------------
   2. Базалық қабат — input / textarea / select
   Тізімге кірмейтіндер: hidden, submit, button, reset, image, checkbox,
   radio, range, color, file (олардың өз ережелері бар).
--------------------------------------------------------------------------- */
input:not([type="hidden"], [type="submit"], [type="button"], [type="reset"], [type="image"], [type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]),
select:not([hidden]),
textarea:not([hidden]) {
    -webkit-appearance: none;
    appearance: none;
    background-color: var(--afa-field-bg);
    background-image: none;
    color: var(--afa-field-text);
    border-width: 1px;
    border-style: solid;
    border-color: var(--afa-field-border);
    border-radius: var(--afa-field-radius);
    padding: var(--afa-field-padding-y) var(--afa-field-padding-x);
    line-height: 1.5;
    box-shadow: 0 1px 2px 0 rgba(15, 23, 42, 0.04);
    transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}

/* `appearance: none` select-тің жүйелік көрсеткішін алып тастайды —
   орнына бірдей SVG көрсеткіш саламыз (барлық браузерде бірдей көрінуі
   үшін) және оң жақтан орын қалдырамыз. */
select:not([hidden]) {
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
    background-position: right 0.625rem center;
    background-repeat: no-repeat;
    background-size: 1.125em 1.125em;
    padding-right: 2.25rem;
    cursor: pointer;
}

/* Бірнеше жол көрінетін select-те көрсеткіш те, оған орын да қажет емес. */
select[multiple],
select[size]:not([size="1"]) {
    background-image: none;
    padding-right: var(--afa-field-padding-x);
    cursor: auto;
}

textarea:not([hidden]) {
    min-height: 5.5rem;
    resize: vertical;
}

/* Ықшам өрістер: жобада кестелердегі шағын өрістер `text-xs` класымен
   белгіленген — оларға толық padding тым үлкен. */
input.text-xs:not([type="hidden"]),
select.text-xs:not([hidden]),
textarea.text-xs:not([hidden]) {
    padding: var(--afa-field-padding-y-sm) var(--afa-field-padding-x-sm);
    border-radius: var(--afa-field-radius-sm);
}

textarea.text-xs:not([hidden]) {
    min-height: 4rem;
}

select.text-xs:not([hidden]) {
    padding-right: 1.75rem;
    background-position: right 0.375rem center;
}

/* ---------------------------------------------------------------------------
   3. Hover — шекара сәл күшейеді, өлшем ӨЗГЕРМЕЙДІ (layout shift жоқ)

   Күй шектеулері `:not(:where(...))` арқылы жазылған: `:where()` салмағы
   НӨЛ, сондықтан ереже (0,2,1) деңгейінде қалады. Бұл әдейі — егер hover
   (0,3,1) болып кетсе, төменде тұрған focus (0,2,1) оны жеңе алмай, тінтуір
   өрістің үстінде тұрғанда фокус түсі мүлдем көрінбей қалар еді.
--------------------------------------------------------------------------- */
@media (hover: hover) {
    input:not([type="hidden"], [type="submit"], [type="button"], [type="reset"], [type="image"], [type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]):hover:not(:where(:disabled, [readonly])),
    select:not([hidden]):hover:not(:where(:disabled)),
    textarea:not([hidden]):hover:not(:where(:disabled, [readonly])) {
        border-color: var(--afa-field-border-hover);
    }
}

/* ---------------------------------------------------------------------------
   4. Focus — брендтік түс + жұмсақ сақина.
   `outline: 2px solid transparent` — Windows-тың жоғары контраст режимінде
   фокус жоғалып қалмауы үшін (сол режимде мөлдір түс көрінетін болады).
--------------------------------------------------------------------------- */
input:not([type="hidden"], [type="submit"], [type="button"], [type="reset"], [type="image"], [type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]):focus,
select:not([hidden]):focus,
textarea:not([hidden]):focus {
    outline: 2px solid transparent;
    outline-offset: 2px;
    border-color: var(--afa-field-border-focus);
    box-shadow: 0 0 0 3px var(--afa-focus-ring);
}

/* Пернетақтамен жүріп отырғанда фокус қосымша айқын болады. */
input:not([type="hidden"], [type="submit"], [type="button"], [type="reset"], [type="image"], [type="checkbox"], [type="radio"], [type="range"], [type="color"], [type="file"]):focus-visible,
select:not([hidden]):focus-visible,
textarea:not([hidden]):focus-visible {
    box-shadow: 0 0 0 3px var(--afa-focus-ring);
}

/* ---------------------------------------------------------------------------
   5. Placeholder — нақты мәтіннен жеңілірек, бірақ оқылатын
--------------------------------------------------------------------------- */
input:not([type="hidden"])::placeholder,
textarea:not([hidden])::placeholder {
    color: var(--afa-placeholder);
    opacity: 1; /* Firefox әдепкіде 0.54 жасайды — тым бозарып кетеді */
}

/* ---------------------------------------------------------------------------
   6. Disabled / readonly — өңдеуге болмайтыны көрініп тұрады,
   бірақ мәтіні оқылатын күйінде қалады
--------------------------------------------------------------------------- */
input:disabled,
select:disabled,
textarea:disabled {
    background-color: var(--afa-field-bg-disabled);
    color: var(--afa-field-text-muted);
    border-color: var(--afa-field-border);
    border-style: solid;
    box-shadow: none;
    cursor: not-allowed;
    opacity: 1; /* контрастты одан әрі төмендетпейміз */
}

input[readonly],
textarea[readonly] {
    background-color: var(--afa-field-bg-readonly);
    border-style: dashed;
    color: var(--afa-field-text);
    cursor: default;
}

input[readonly]:focus,
textarea[readonly]:focus {
    border-color: var(--afa-field-border-hover);
    box-shadow: none;
}

/* ---------------------------------------------------------------------------
   7. Валидация күйлері — ТЕК КӨРІНІСІ.
   Валидация логикасы серверде, ол өзгермеген. Мұнда:
     • `.is-invalid` / `aria-invalid="true"` — сервер қайтарған қате;
     • `:user-invalid` — қолданушы өрісті ТОЛТЫРЫП, одан шыққаннан кейін
       ғана браузер қосатын күй (бетті ашқан бойда қызартып жібермейді).
--------------------------------------------------------------------------- */
input[aria-invalid="true"],
select[aria-invalid="true"],
textarea[aria-invalid="true"] {
    border-color: var(--afa-danger);
}

input[aria-invalid="true"]:focus,
select[aria-invalid="true"]:focus,
textarea[aria-invalid="true"]:focus {
    border-color: var(--afa-danger);
    box-shadow: 0 0 0 3px var(--afa-danger-ring);
}

/* `:user-invalid` — БӨЛЕК ереже болуы керек: оны қолдамайтын ескі браузер
   таңдағыштар тізімін түгел жарамсыз деп тастайды, сонда жоғарыдағы
   `.is-invalid` да жұмыс істемей қалар еді. */
input:not([type="hidden"]):user-invalid,
select:user-invalid,
textarea:user-invalid {
    border-color: var(--afa-danger);
}

input:not([type="hidden"]):user-invalid:focus,
select:user-invalid:focus,
textarea:user-invalid:focus {
    border-color: var(--afa-danger);
    box-shadow: 0 0 0 3px var(--afa-danger-ring);
}

/* Қате хабары — өрістің ТӨМЕНІНДЕ, беттің қаңқасын жылжытпайды
   (error_for() көмекшісі осы класты шығарады). */
.form-error {
    display: flex;
    align-items: flex-start;
    gap: 0.375rem;
    margin-top: 0.375rem;
    font-size: 0.75rem;
    line-height: 1.125rem;
    color: var(--afa-danger);
}

.form-error svg {
    margin-top: 0.0625rem;
}

/* Өріс астындағы қысқа түсіндірме (шеберде қолданылады) */
.form-hint {
    margin-top: 0.375rem;
    font-size: 0.75rem;
    line-height: 1.125rem;
    color: #64748b;
}

/* ---------------------------------------------------------------------------
   8. Checkbox / radio — брендтік түс, ыңғайлы басу аймағы
   `accent-color` — стандартты, қосымша JS-сіз және қолжетімділікті
   бұзбайтын тәсіл: элемент жүйелік күйінде қалады, тек түсі ауысады.
--------------------------------------------------------------------------- */
input[type="checkbox"],
input[type="radio"] {
    width: 1.05rem;
    height: 1.05rem;
    accent-color: var(--afa-field-border-focus);
    cursor: pointer;
    vertical-align: middle;
    flex-shrink: 0;
}

input[type="checkbox"]:focus-visible,
input[type="radio"]:focus-visible {
    outline: 2px solid var(--afa-field-border-focus);
    outline-offset: 2px;
}

input[type="checkbox"]:disabled,
input[type="radio"]:disabled {
    cursor: not-allowed;
}

/* ---------------------------------------------------------------------------
   9. Файл өрісі — «бос орын» емес, нақты интерактивті аймақ болып көрінеді
--------------------------------------------------------------------------- */
input[type="file"] {
    display: block;
    width: 100%;
    background-color: var(--afa-field-bg);
    border: 1px dashed var(--afa-field-border);
    border-radius: var(--afa-field-radius);
    padding: 0.5rem 0.625rem;
    color: var(--afa-field-text-muted);
    cursor: pointer;
    transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}

@media (hover: hover) {
    input[type="file"]:hover:not(:disabled) {
        border-color: var(--afa-field-border-hover);
        background-color: #fdf2f8; /* аздап брендтік реңк */
    }
}

input[type="file"]:focus,
input[type="file"]:focus-visible {
    outline: 2px solid transparent;
    outline-offset: 2px;
    border-color: var(--afa-field-border-focus);
    border-style: solid;
    box-shadow: 0 0 0 3px var(--afa-focus-ring);
}

input[type="file"]:disabled {
    background-color: var(--afa-field-bg-disabled);
    cursor: not-allowed;
}

input[type="file"]::file-selector-button {
    cursor: pointer;
}

/* ---------------------------------------------------------------------------
   10. Жүктеу аймағы (dropzone) — ортақ file-uploader partial-ы қолданады
--------------------------------------------------------------------------- */
.form-dropzone {
    border: 2px dashed var(--afa-field-border);
    border-radius: 0.75rem;
    background-color: var(--afa-field-bg-readonly);
    padding: 0.75rem;
    transition: border-color .15s ease, background-color .15s ease, box-shadow .15s ease;
}

@media (hover: hover) {
    .form-dropzone:hover {
        border-color: var(--afa-field-border-hover);
        background-color: var(--afa-field-bg);
    }
}

.form-dropzone:focus-within {
    border-color: var(--afa-field-border-focus);
    background-color: var(--afa-field-bg);
    box-shadow: 0 0 0 3px var(--afa-focus-ring);
}

/* Файлды үстіне сүйреп әкелген кез */
.form-dropzone.is-dragover {
    border-color: var(--afa-field-border-focus);
    background-color: #fdf2f8;
    box-shadow: 0 0 0 3px var(--afa-focus-ring);
}

.form-dropzone.is-error {
    border-color: #fca5a5;
    background-color: #fef2f2;
}

.form-dropzone.is-success {
    border-color: #6ee7b7;
    background-color: #ecfdf5;
}

/* Аймақ ішіндегі файл өрісі қосарланған шекара жасамауы керек */
.form-dropzone input[type="file"] {
    border-style: solid;
    border-color: var(--afa-field-border);
    background-color: var(--afa-field-bg);
}

/* ---------------------------------------------------------------------------
   11. Қосымша қайта қолданылатын класстар
   Жаңа формаларда бірізділікті сақтау үшін (бұрынғы беттерді өзгертудің
   қажеті жоқ — базалық қабат оларға да әсер етеді).
--------------------------------------------------------------------------- */
/* Браузердің іздеу өрісіне қосатын «крестигі» стильге сай тұрсын */
input[type="search"]::-webkit-search-cancel-button {
    cursor: pointer;
}

/* Күн/уақыт өрістерінің жүйелік иконкасы да брендтік реңкте болсын */
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
    accent-color: var(--afa-field-border-focus);
}

input[type="date"]::-webkit-calendar-picker-indicator,
input[type="time"]::-webkit-calendar-picker-indicator,
input[type="datetime-local"]::-webkit-calendar-picker-indicator {
    cursor: pointer;
    opacity: 0.6;
    transition: opacity .15s ease;
}

input[type="date"]:hover::-webkit-calendar-picker-indicator,
input[type="time"]:hover::-webkit-calendar-picker-indicator,
input[type="datetime-local"]:hover::-webkit-calendar-picker-indicator {
    opacity: 1;
}

/* ---------------------------------------------------------------------------
   13. Қозғалысты азайту қалауы
--------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
    input,
    select,
    textarea,
    .form-dropzone {
        transition: none;
    }
}
