/* «Кімната Каті», фаза 6: «Календар» (calendar.js, day.js, look-viewer.js, cal-search.js, sheet-grow.js).
   Подключается после styles.css и кладёт правила в те же пласты: сырые значения только
   в tokens, внешний вид в components, раскладка экранов в screens. */

/* ========================================================================== tokens */
@layer tokens {
  :root {
    --cal-gap: 4px;               /* между клетками по горизонтали на телефоне (m-cal: 48 + 4) */
    --cal-row-gap: 8px;           /* между неделями */
    --cal-cell-r: 12px;
    --cal-cell-ratio: 7 / 9;      /* клетка 48 × 62 на телефоне */
    --cal-cell-desk-h: 100px;     /* 108 × 100 на компьютере (d-cal) */
    --cal-side-w: 444px;          /* панель дня справа (d-cal) */
    --cal-dash: 2px;              /* пунктир плана и рамка сегодня */
    --cal-num: .8125rem;          /* 13: число в клетке */
    --cal-num-h: 20px;            /* кружок числа поверх картинки */
    --cal-ev-r: 6px;              /* подложка названия события в клетке */
    --cal-desk-pad: clamp(24px, 5.5vw, 80px);
    --day-pic-w: 86px;            /* коллаж в карточке дня (m-day: 86 × 126) */
    --day-pic-h: 126px;
    --day-add-h: 56px;
    --cs-pic: 92px;               /* коллаж в строке поиска (m-calsearch) */
    --dp-check: 26px;             /* кружок выбора на плитке образа (d2-caladd) */
    --month-response: 0.35;       /* пружина возврата сетки после свайпа (MOTION-SPEC #12) */
  }
}

/* ========================================================================== components */
@layer components {
  /* ---------- шапка: название месяца меняется сдвигом, старое и новое лежат стопкой ---------- */
  .cal .k-thead__title { display: grid; }
  .cal .k-thead__title > span { grid-area: 1 / 1; }

  /* ---------- дни недели ---------- */
  .cal-wd > span {
    font: 500 var(--fs-label)/1 var(--font-ui);
    color: var(--ink-2);
    text-align: center;
  }

  /* ---------- сетка: отдельный слой по ключу месяца ---------- */
  .cal-view {
    position: relative;
    touch-action: pan-y;
    -webkit-user-select: none;
    user-select: none;
  }
  .cal-view.is-dragging { cursor: grabbing; }
  .cal-grid.is-over { position: absolute; inset: 0 0 auto 0; pointer-events: none; }
  .cal-cell {
    position: relative;
    display: block;
    min-width: 0;
    aspect-ratio: var(--cal-cell-ratio);
    padding: 0;
    border: 1px solid var(--line);
    border-radius: var(--cal-cell-r);
    background: var(--surface);
    color: var(--ink);
    overflow: hidden;
    text-align: left;
    -webkit-touch-callout: none;
    --tr-x: background-color var(--dur-state) var(--ease-fade), border-color var(--dur-state) var(--ease-fade);
  }
  .cal-cell.is-worn { background: var(--surface-2); border-color: transparent; }
  .cal-cell.is-plan { background: var(--surface-2); border: var(--cal-dash) dashed var(--acc); }
  .cal-cell.is-today { border: var(--cal-dash) solid var(--acc); }
  .cal-cell.is-today.is-plan { border-style: dashed; }
  .cal-cell.is-sel { background-color: var(--acc-soft); }
  .cal-num {
    position: absolute;
    left: 4px;
    top: 4px;
    z-index: 1;
    min-width: var(--cal-num-h);
    height: var(--cal-num-h);
    padding: 0 4px;
    border-radius: calc(var(--cal-num-h) / 2);
    font: 600 var(--cal-num)/var(--cal-num-h) var(--font-ui);
    text-align: center;
  }
  .cal-cell.has-pic .cal-num { background: var(--surface); }
  .cal-cell.is-today .cal-num { color: var(--acc); }
  .cal-pic {
    position: absolute;
    inset: 6px 2px 3px;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    gap: 1px;
    pointer-events: none;
  }
  .cal-pic > img {
    flex: 1 1 0;
    min-width: 0;
    height: 100%;
    object-fit: contain;
    object-position: 50% 100%;
  }
  .cal-pic[data-n="1"] > img { flex: 0 1 72%; }
  .cal-pic--photo { inset: 0; }
  .cal-pic--photo > img { width: 100%; height: 100%; object-fit: cover; }
  .cal-ev {
    position: absolute;
    left: 2px;
    right: 2px;
    bottom: 6px;
    padding: 2px 3px;
    border-radius: var(--cal-ev-r);
    background: var(--olive-soft);
    color: var(--olive-ink);
    font: 500 var(--fs-label)/1.3 var(--font-ui);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  /* «Робота» без подложки и без многоточия: слово шириной почти в клетку телефона */
  .cal-ev--work { left: 3px; right: 0; padding: 0; background: none; color: var(--ink-2); text-overflow: clip; }
  .cal-cap { display: none; }

  /* ---------- подписи под сеткой ---------- */
  .cal-legend {
    margin: var(--sp-4) var(--sp-1) 0;
    font: 400 var(--fs-caption)/1.4 var(--font-ui);
    color: var(--ink-2);
    text-align: center;
  }
  .cal[data-mode="events"] .cal-legend { text-align: left; }
  .cal-note {
    margin: var(--sp-3) var(--sp-1) 0;
    font: 500 var(--fs-hint)/1.4 var(--font-ui);
    color: var(--ink-2);
    text-align: center;
  }
  .cal-mbtn > .k-icon { width: 18px; height: 18px; }

  /* ---------- «Цього тижня» ---------- */
  .cal-row {
    display: flex;
    align-items: center;
    gap: 14px;
    width: 100%;
    min-height: 64px;
    padding: 12px 16px;
    border: 0;
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: inset 0 0 0 1px var(--line);
    color: var(--ink);
    text-align: left;
  }
  .cal-row > .k-icon { color: var(--olive); }
  .cal-row__text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
  .cal-row__t { font: 600 var(--fs-body)/1.3 var(--font-ui); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .cal-row__s { font: 500 var(--fs-hint)/1.3 var(--font-ui); color: var(--ink-2); }
  .cal-row__s.is-ok { color: var(--olive-ink); }

  /* ---------- панель дня справа (компьютер, d-cal) ---------- */
  .cal-side {
    border-radius: var(--r-sheet);
    background: var(--surface);
    box-shadow: inset 0 0 0 1px var(--line), var(--shadow-deskbar);
  }
  .cal-side__head { display: flex; align-items: flex-start; gap: var(--sp-3); padding: var(--sp-5) var(--sp-5) var(--sp-1) var(--sp-6); }
  .cal-side__head > .k-ibtn { color: var(--ink-2); }
  .cal-side__title { flex: 1 1 auto; min-width: 0; margin: 10px 0 0; font: 600 var(--fs-title)/1.3 var(--font-ui); }
  .cal-side__body { min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 0 var(--sp-4) var(--sp-5); }
  .cal-side__hint { padding: var(--sp-6); }

  /* ---------- вид дня (лист на телефоне и панель на компьютере) ---------- */
  .day > .k-caps:first-child { margin-top: var(--sp-3); }
  .day-note { margin: var(--sp-2) var(--sp-1) 0; font: 500 var(--fs-hint)/1.4 var(--font-ui); color: var(--ink-2); }
  .day-ev {
    padding: 14px var(--sp-4);
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: inset 0 0 0 1px var(--line);
  }
  .day-ev + .day-ev { margin-top: var(--sp-2); }
  .day-ev__row { display: flex; align-items: baseline; gap: var(--sp-4); }
  .day-ev__time { flex: none; min-width: 44px; font: 600 var(--fs-body-s)/1.3 var(--font-ui); color: var(--olive-ink); }
  .day-ev--work .day-ev__time { color: var(--ink-2); }
  .day-ev__text { flex: 1 1 auto; min-width: 0; }
  .day-ev__t { margin: 0; font: 600 var(--fs-body)/1.3 var(--font-ui); overflow-wrap: anywhere; }
  .day-ev__s { margin: 3px 0 0; font: 400 var(--fs-caption)/1.35 var(--font-ui); color: var(--ink-2); overflow-wrap: anywhere; }
  .day-ev__foot { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2) var(--sp-4); margin-top: var(--sp-3); }
  .day-ev__hide { flex: none; padding-inline: var(--sp-4); }
  .day-wx {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin: 0;
    font: 400 var(--fs-caption)/1.3 var(--font-ui);
    color: var(--ink-2);
  }
  .day-wx > .k-icon { width: 20px; height: 20px; }
  .day-wx--top { display: flex; margin: var(--sp-3) var(--sp-1) 0; }

  .day-look {
    display: flex;
    gap: var(--sp-3);
    padding: 10px;
    border-radius: var(--r-card);
    background: var(--surface);
    box-shadow: inset 0 0 0 1px var(--line);
  }
  .day-look + .day-look { margin-top: var(--sp-2); }
  .day-pic {
    position: relative;
    flex: none;
    width: var(--day-pic-w);
    height: var(--day-pic-h);
    min-width: 0;
    padding: 0;
    border: 0;
    border-radius: var(--r-photo-s);
    background: var(--surface-2);
    overflow: hidden;
  }
  .day-look__main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 6px; padding: 6px 2px 0 2px; }
  .day-look__head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px var(--sp-2); }
  .day-look__t { margin: 0; min-width: 0; font: 600 var(--fs-body)/1.3 var(--font-ui); overflow-wrap: anywhere; }
  .day-rep { display: flex; align-items: flex-start; gap: 6px; margin: 0; font: 400 var(--fs-caption)/1.35 var(--font-ui); color: var(--ink-2); }
  .day-rep > .k-icon { width: 16px; height: 16px; margin-top: 1px; }
  .day-look__acts { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: auto; padding-top: var(--sp-1); }
  .day-look__acts > .k-btn { flex: 1 1 auto; min-width: 0; padding-inline: 10px; }
  .day-look__wear { display: flex; flex: 1 1 100%; }
  .day-look__wear > .k-btn { flex: 1 1 auto; min-width: 0; }

  /* коллаж записи: вещи целиком, до четырёх сеткой, пять-шесть в три колонки */
  .day-col {
    position: absolute;
    inset: 6px;
    display: grid;
    gap: 2px;
    grid-template-columns: 1fr 1fr;
    grid-auto-rows: minmax(0, 1fr);
    pointer-events: none;
  }
  .day-col[data-n="1"] { grid-template-columns: 1fr; }
  .day-col[data-n="3"] > :nth-child(2) { grid-column: 2; grid-row: 1 / span 2; }
  .day-col[data-n="3"] > :nth-child(3) { grid-column: 1; grid-row: 2; }
  .day-col[data-n="5"], .day-col[data-n="6"] { grid-template-columns: repeat(3, 1fr); }
  .day-col__cell { position: relative; min-width: 0; min-height: 0; }
  .day-col__cell > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
  .day-pic__img--photo { position: absolute; inset: 0; pointer-events: none; }
  .day-pic__img--photo > img { width: 100%; height: 100%; object-fit: cover; }

  /* «Вдягла» (MOTION-SPEC #10): круг заливается, галочка рисует себя, повторное касание только красит обратно */
  .day-wear { --tr-x: background-color var(--dur-state) var(--ease-fade), color var(--dur-state) var(--ease-fade); }
  .day-chk { flex: none; width: 20px; height: 20px; overflow: visible; }
  .day-chk__c { fill: transparent; transition: fill var(--dur-state) var(--ease-enter); }
  .day-chk__p { fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1; stroke-dashoffset: 0; }
  .day-wear.is-done .day-chk__c { fill: var(--acc); }
  .day-wear.is-done .day-chk__p { stroke: var(--acc-ink); }
  @media (prefers-reduced-motion: no-preference) {
    :root:not([data-motion="reduce"]) .day-wear.is-done .day-chk__p { animation: day-draw var(--dur-check) var(--ease-enter) 80ms backwards; }
  }

  .day-adds { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-2); }
  .day-add {
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
    min-height: var(--day-add-h);
    padding: 0 14px;
    border: 0;
    border-radius: var(--r-btn);
    background: var(--surface);
    box-shadow: inset 0 0 0 1px var(--line-2);
    color: var(--ink);
    font: 500 var(--fs-body-s)/1.25 var(--font-ui);
    text-align: left;
  }
  .day-add > .k-icon { color: var(--acc); }
  .day-add > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  .day-skel { display: flex; flex-direction: column; gap: var(--sp-3); padding-top: var(--sp-4); }
  .day-skel > span { display: block; height: 72px; border-radius: var(--r-card); background: var(--surface-2); }
  .day-skel > span:nth-child(2) { height: 132px; }
  .day-skel > span:nth-child(3) { height: 120px; }

  /* m-day: карточки дня с x 16, как на странице */
  .day-sheet .k-sheet__body { padding-top: 0; padding-inline: var(--gutter); }

  /* лист растёт из клетки (MOTION-SPEC #4): правила роста общие, в styles.css (sheet-grow.js) */

  /* ---------- «З моїх образів» (d2-caladd) ---------- */
  .dp-chips { margin-bottom: var(--sp-3); }
  .dp-tile { position: relative; }
  .dp-tile .k-lcol { transition: box-shadow var(--dur-state) var(--ease-fade), background-color var(--dur-state) var(--ease-fade); }
  .dp-tile[aria-pressed="true"] .k-lcol { background: var(--acc-soft); box-shadow: inset 0 0 0 2px var(--acc); }
  .dp-tile.is-there { cursor: default; }
  .dp-tile.is-there .k-lcol__slot > img { opacity: .5; }
  .dp-check {
    position: absolute;
    top: 8px;
    right: 8px;
    display: grid;
    place-items: center;
    width: var(--dp-check);
    height: var(--dp-check);
    border-radius: 50%;
    background: var(--surface);
    box-shadow: inset 0 0 0 1.5px var(--line-2);
    color: transparent;
    pointer-events: none;
    transition: background-color var(--dur-state) var(--ease-fade), color var(--dur-state) var(--ease-fade);
  }
  .dp-check > .k-icon { width: 16px; height: 16px; --icon-stroke: 2.6px; }
  .dp-tile[aria-pressed="true"] .dp-check { background: var(--acc); box-shadow: none; color: var(--acc-ink); }
  .dp-note { margin-top: var(--sp-3); }
  .dp-count { flex: 1 1 auto; min-width: 0; margin: 0; font: 500 var(--fs-body-s)/1.3 var(--font-ui); color: var(--ink-2); }
  .dp-foot > .k-btn { flex: 0 1 200px; }

  /* ---------- «Повторити образ» ---------- */
  .lv-days .k-row__value { max-width: 55%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .lv-days .k-row__value.lv-has { color: var(--olive-ink); font-weight: 600; }
  .lv-other { margin-top: var(--sp-3); }
  .lv-date { padding-inline: 0 var(--sp-3); }

  /* ---------- перегляд образу (m-viewer): вещи целиком на тёмной подложке ---------- */
  .lv-col {
    width: 100%;
    height: 100%;
    display: grid;
    gap: var(--sp-3);
    padding: var(--sp-6) var(--sp-5);
    grid-template-columns: 1fr 1fr;
    grid-auto-rows: minmax(0, 1fr);
  }
  .lv-col[data-n="1"] { grid-template-columns: 1fr; }
  .lv-col[data-n="3"] > :nth-child(2) { grid-column: 2; grid-row: 1 / span 2; }
  .lv-col[data-n="3"] > :nth-child(3) { grid-column: 1; grid-row: 2; }
  .lv-col[data-n="5"], .lv-col[data-n="6"] { grid-template-columns: repeat(3, 1fr); }
  .lv-col__cell { position: relative; min-width: 0; min-height: 0; }
  .lv-col__cell > img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; -webkit-user-drag: none; }
  .lv-photo { width: 100%; height: 100%; display: grid; place-items: center; }
  .lv-photo > img { max-width: 100%; max-height: 100%; object-fit: contain; }

  /* ---------- «Що я вдягала» (m-calsearch) ---------- */
  .cs-line { margin: 0 var(--sp-1); font: 400 var(--fs-caption)/1.4 var(--font-ui); color: var(--ink-2); }
  .cs-row {
    display: flex;
    align-items: center;
    gap: var(--sp-4);
    width: 100%;
    padding: 10px;
    border: 0;
    border-radius: var(--r-card-l);
    background: var(--surface);
    box-shadow: inset 0 0 0 1px var(--line);
    color: var(--ink);
    text-align: left;
  }
  .cs-pic { position: relative; flex: none; width: var(--cs-pic); height: var(--cs-pic); border-radius: var(--r-photo-s); background: var(--surface-2); overflow: hidden; }
  .cs-pic > .day-col { inset: 5px; }
  .cs-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
  .cs-t { font: 600 var(--fs-body)/1.3 var(--font-ui); overflow-wrap: anywhere; }
  .cs-d { font: 400 var(--fs-hint)/1.3 var(--font-ui); color: var(--ink-2); }
  .cs-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 5px; }
  .cs-rep { font: 500 var(--fs-label)/1.3 var(--font-ui); color: var(--ink-2); }
  .cs-foot { margin: var(--sp-2) var(--sp-1) 0; font-size: var(--fs-caption); }

  /* компьютер: клетки 108 × 100, «сьогодні» в пустой клетке, сетка «З моїх образів» в три колонки */
  @media (min-width: 1100px) {
    .cal--desk .cal-cell { aspect-ratio: auto; height: var(--cal-cell-desk-h); }
    .cal--desk .cal-num { left: 8px; top: 7px; }
    .cal--desk .cal-pic { inset: 10px 8px 6px; }
    .cal--desk .cal-cap {
      display: block;
      position: absolute;
      left: 10px;
      bottom: 9px;
      font: 500 var(--fs-label)/1 var(--font-ui);
      color: var(--acc);
    }
    .cal--desk .cal-ev { left: 6px; right: 6px; bottom: 8px; }
  }
}

@keyframes day-draw { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }

/* ========================================================================== screens: только раскладка */
@layer screens {
  /* сетка, уезжающая при смене месяца и под пальцем, не расширяет страницу вбок */
  .k-pane[data-tab="calendar"] { overflow-x: clip; }
  .cal-main {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas: "bar" "wd" "view" "note" "legend" "months" "week";
  }
  .cal-bar { grid-area: bar; display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); margin-bottom: var(--sp-5); }
  .cal-seg { flex: 0 1 220px; min-width: 0; }
  .cal-months { grid-area: months; display: flex; gap: var(--sp-3); margin-top: var(--sp-5); }
  .cal-months > .cal-mbtn { flex: 1 1 0; min-width: 0; }
  .cal-wd { grid-area: wd; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: var(--cal-gap); margin-bottom: var(--sp-3); }
  .cal-view { grid-area: view; }
  .cal-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: var(--cal-row-gap) var(--cal-gap); }
  .cal-note { grid-area: note; }
  .cal-legend { grid-area: legend; }
  .cal-week { grid-area: week; display: flex; flex-direction: column; gap: var(--sp-2); margin-top: var(--sp-2); }
  .cal-side { display: none; }

  .day-look__acts, .day-adds { align-items: stretch; }
  .dp-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--sp-4) var(--sp-3); }
  .dp-foot { align-items: center; justify-content: space-between; }
  .cs { display: flex; flex-direction: column; gap: var(--sp-3); padding-top: var(--sp-2); }
  .cs-list { display: flex; flex-direction: column; gap: var(--sp-3); }

  @media (min-width: 760px) and (max-width: 1099px) {
    .cal { max-width: 720px; margin-inline: auto; }
  }

  @media (min-width: 1100px) {
    /* вкладка календаря шире старой колонки: сетка и панель дня рядом (d-cal) */
    .k-pane[data-tab="calendar"] { width: 100%; padding-inline: 0; }
    .cal { max-width: calc(var(--desk-max) + 2 * var(--cal-desk-pad)); margin-inline: auto; padding-inline: var(--cal-desk-pad); }
    .cal-body { display: grid; grid-template-columns: minmax(0, 1fr) var(--cal-side-w); gap: 36px; align-items: start; }
    .cal-main {
      grid-template-columns: auto minmax(0, 1fr);
      grid-template-areas: "bar months" "wd wd" "view view" "note note" "legend legend";
    }
    .cal-bar { justify-content: flex-start; }
    .cal-seg { flex: 0 0 240px; }
    .cal-months { justify-content: flex-end; margin: 0 0 var(--sp-5); }
    .cal-months > .cal-mbtn { flex: 0 0 auto; }
    .cal-grid, .cal-wd { gap: var(--sp-2); }
    .cal-week { display: none; }
    .cal-side { display: flex; flex-direction: column; position: sticky; top: var(--sp-6); max-height: calc(100dvh - var(--nav-clear) - 48px); }
    .dp-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-3) var(--sp-2); }
  }
}
