/* ============================================================
   Finnwood — Client demo portal
   Brand   forest #131e0d · moss #73a705 · paper #f6f7f2
   Display Fraunces · UI Inter · Data mono
   ============================================================ */

:root {
    --forest:#131e0d;
    --forest-1:#18260f;
    --forest-2:#1f3014;
    --forest-3:#2b3d1d;
    --moss:#73a705;
    --moss-bright:#8cc40a;
    --moss-deep:#5d8704;
    --paper:#f6f7f2;
    --paper-2:#edefe5;
    --paper-3:#e3e6d8;
    --ink:#131e0d;
    --ink-soft:#48543d;
    --ink-faint:#7c876f;
    --line:#dde0d0;
    --on-dark:#eef2e6;
    --on-dark-soft:#aab59f;
    --on-dark-faint:#717c64;

    --radius:14px;
    --radius-sm:10px;
    --radius-lg:22px;
    --pill:999px;

    --shadow-sm:0 1px 2px rgba(19,30,13,.05);
    --shadow:0 1px 2px rgba(19,30,13,.04), 0 14px 34px rgba(19,30,13,.10);
    --shadow-lg:0 30px 70px rgba(8,14,4,.50);

    --font-ui:'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
    --font-display:'Fraunces', Georgia, 'Times New Roman', serif;
    --font-mono:ui-monospace, 'SF Mono', 'Cascadia Code', 'Roboto Mono', Menlo, Consolas, monospace;

    --maxw:1200px;
}

* { box-sizing:border-box; }
html, body { margin:0; padding:0; }
html { -webkit-text-size-adjust:100%; }

body {
    font-family:var(--font-ui);
    color:var(--ink);
    background:var(--paper);
    font-size:15px;
    line-height:1.55;
    -webkit-font-smoothing:antialiased;
    text-rendering:optimizeLegibility;
}

a { color:inherit; text-decoration:none; }
button { font-family:inherit; cursor:pointer; border:0; background:none; }
img { display:block; max-width:100%; }
:focus-visible { outline:2.5px solid var(--moss); outline-offset:2px; border-radius:4px; }
::selection { background:rgba(115,167,5,.22); }

.eyebrow {
    font-size:11.5px; font-weight:600; letter-spacing:.14em; text-transform:uppercase;
    color:var(--moss-deep); margin:0 0 6px;
}

/* ---------- type badges ---------- */
.badge {
    display:inline-flex; align-items:center; height:20px; padding:0 8px;
    font-size:10.5px; font-weight:700; letter-spacing:.06em;
    border-radius:6px; font-family:var(--font-mono);
    background:var(--paper-3); color:var(--ink-soft);
}
.badge--web   { background:rgba(115,167,5,.16); color:var(--moss-deep); }
.badge--pdf   { background:rgba(193,58,43,.12);  color:#b23a2c; }
.badge--image { background:rgba(43,97,150,.12);  color:#2b6196; }
.badge--text  { background:var(--paper-3);       color:var(--ink-soft); }
.badge--other { background:var(--paper-3);       color:var(--ink-faint); }

/* ============================================================
   LOGIN
   ============================================================ */
.login {
    position:relative; min-height:100dvh;
    display:flex; flex-direction:column; align-items:center; justify-content:center;
    padding:32px 20px; overflow:hidden;
    background:radial-gradient(120% 90% at 50% -10%, var(--forest-2), var(--forest) 62%);
}
.login__bg {
    position:absolute; inset:0; pointer-events:none;
    background:url('/finnwood-mark.svg') no-repeat;
    background-position:right -120px bottom -150px;
    background-size:560px;
    opacity:.05; transform:rotate(-4deg);
}
.login__card {
    position:relative; z-index:1; width:100%; max-width:404px;
    background:linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,0)), var(--forest-1);
    border:1px solid var(--forest-3); border-radius:var(--radius-lg);
    padding:40px 38px 34px; box-shadow:var(--shadow-lg);
}
.login__card::before {
    content:""; display:block; width:46px; height:4px; border-radius:4px;
    background:var(--moss); margin-bottom:26px;
}
.login__logo { height:30px; width:auto; margin-bottom:28px; }
.login__eyebrow {
    font-size:11.5px; font-weight:600; letter-spacing:.16em; text-transform:uppercase;
    color:var(--moss); margin:0 0 10px;
}
.login__title {
    font-family:var(--font-display); font-optical-sizing:auto; font-weight:500;
    font-size:32px; line-height:1.05; letter-spacing:-.01em;
    color:var(--on-dark); margin:0 0 10px;
}
.login__sub { color:var(--on-dark-soft); font-size:14px; margin:0 0 26px; }
.login__form { display:flex; flex-direction:column; }
.login__label {
    font-size:12px; font-weight:600; color:var(--on-dark-soft);
    letter-spacing:.02em; margin-bottom:8px;
}
.login__input {
    height:48px; border-radius:12px; border:1.5px solid var(--forest-3);
    background:#0e1808; color:var(--on-dark);
    padding:0 15px; font-size:15px; font-family:var(--font-ui);
    transition:border-color .15s, box-shadow .15s;
}
.login__input::placeholder { color:#4a5740; letter-spacing:.1em; }
.login__input:focus { outline:none; border-color:var(--moss); box-shadow:0 0 0 4px rgba(115,167,5,.18); }
.login__input.is-error { border-color:#c2503f; box-shadow:0 0 0 4px rgba(194,80,63,.16); }
.login__error {
    color:#f0a89a; font-size:13px; margin:10px 0 0;
    display:flex; gap:7px; align-items:center;
}
.login__btn {
    margin-top:22px; height:50px; border-radius:12px;
    background:var(--moss); color:#0e1808;
    font-size:15px; font-weight:700; letter-spacing:.01em;
    display:inline-flex; align-items:center; justify-content:center; gap:9px;
    transition:background .15s, transform .05s;
}
.login__btn:hover { background:var(--moss-bright); }
.login__btn:active { transform:translateY(1px); }
.login__foot {
    position:relative; z-index:1; margin-top:26px;
    color:var(--on-dark-faint); font-size:12px; letter-spacing:.03em;
}

/* ============================================================
   SHELL (signed-in pages)
   ============================================================ */
.shell { min-height:100dvh; display:flex; flex-direction:column; background:var(--paper); }

.topbar {
    height:64px; flex:0 0 auto; background:var(--forest);
    display:flex; align-items:center; justify-content:space-between;
    padding:0 clamp(16px, 4vw, 34px); position:sticky; top:0; z-index:20;
}
.topbar__brand { display:flex; align-items:center; }
.topbar__brand img { height:24px; width:auto; }
.topbar__nav { display:flex; align-items:center; gap:18px; }
.topbar__tag {
    color:var(--on-dark-soft); font-size:12.5px; font-weight:500; letter-spacing:.04em;
    padding-right:18px; border-right:1px solid var(--forest-3);
}
.topbar__logoutform { margin:0; }
.topbar__logout {
    color:var(--on-dark); font-size:13px; font-weight:600;
    border:1.4px solid var(--forest-3); border-radius:var(--pill);
    padding:8px 16px; transition:border-color .15s, color .15s;
}
.topbar__logout:hover { border-color:var(--moss); color:var(--moss); }

.content { flex:1 1 auto; width:100%; }
.content__inner {
    max-width:var(--maxw); margin:0 auto;
    padding:clamp(26px, 5vw, 46px) clamp(16px, 4vw, 34px) 60px;
}

.sitefoot {
    flex:0 0 auto; border-top:1px solid var(--line); background:var(--paper);
    max-width:var(--maxw); margin:0 auto; width:100%;
    padding:18px clamp(16px, 4vw, 34px);
    display:flex; justify-content:space-between; gap:16px; flex-wrap:wrap;
    color:var(--ink-faint); font-size:12px; letter-spacing:.02em;
}

/* ---------- gallery head ---------- */
.gallery__head {
    display:flex; align-items:flex-end; justify-content:space-between; gap:20px; flex-wrap:wrap;
    margin-bottom:30px; padding-bottom:22px; border-bottom:1px solid var(--line);
}
.gallery__title {
    font-family:var(--font-display); font-optical-sizing:auto; font-weight:500;
    font-size:clamp(28px, 4vw, 40px); line-height:1; letter-spacing:-.015em;
    color:var(--ink); margin:0;
}
.gallery__tools { display:flex; align-items:center; gap:16px; }
.search { position:relative; display:flex; align-items:center; }
.search svg {
    position:absolute; left:13px; width:16px; height:16px;
    color:var(--ink-faint); pointer-events:none;
}
.search input {
    height:42px; width:230px; max-width:46vw;
    border:1.5px solid var(--line); border-radius:var(--pill);
    background:#fff; padding:0 16px 0 38px;
    font-size:14px; font-family:var(--font-ui); color:var(--ink);
    transition:border-color .15s, box-shadow .15s;
}
.search input:focus { outline:none; border-color:var(--moss); box-shadow:0 0 0 4px rgba(115,167,5,.14); }
.count {
    font-size:12.5px; color:var(--ink-faint); font-family:var(--font-mono);
    white-space:nowrap; letter-spacing:.02em;
}

/* ---------- grid + cards ---------- */
.grid {
    display:grid; gap:24px;
    grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));
}
.card {
    display:flex; flex-direction:column;
    background:#fff; border:1px solid var(--line); border-radius:var(--radius);
    overflow:hidden; box-shadow:var(--shadow-sm);
    transition:transform .18s cubic-bezier(.2,.7,.3,1), box-shadow .18s, border-color .18s;
}
.card:hover { transform:translateY(-4px); box-shadow:var(--shadow); border-color:#cfd4c0; }
.card:focus-visible { transform:translateY(-4px); box-shadow:var(--shadow); }

.card__thumb {
    position:relative; width:100%; aspect-ratio:16 / 10; overflow:hidden;
    background:linear-gradient(135deg, var(--paper-2), var(--paper-3));
    border-bottom:1px solid var(--line);
}
/* the live miniature: width/height/scale are set by portal.js, revealed once scaled */
.thumb__frame {
    position:absolute; top:0; left:0; border:0;
    transform-origin:0 0; pointer-events:none; background:#fff;
    opacity:0; transition:opacity .25s ease;
}
.thumb__shade { position:absolute; inset:0; pointer-events:none; box-shadow:inset 0 0 0 1px rgba(19,30,13,.04); }
.thumb__img { position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
.thumb__icon { position:absolute; inset:0; display:grid; place-items:center; color:var(--ink-faint); }
.thumb__icon svg { width:44px; height:44px; opacity:.5; }

.card__open {
    position:absolute; left:12px; bottom:12px;
    display:inline-flex; align-items:center; gap:6px;
    background:var(--forest); color:var(--on-dark);
    font-size:12px; font-weight:600; letter-spacing:.01em;
    padding:7px 12px; border-radius:var(--pill);
    opacity:0; transform:translateY(6px);
    transition:opacity .18s, transform .18s;
}
.card__open svg { width:14px; height:14px; }
.card:hover .card__open, .card:focus-visible .card__open { opacity:1; transform:translateY(0); }

.card__meta { position:relative; display:flex; flex-direction:column; gap:5px; padding:14px 16px 16px; }
.card__meta .badge { position:absolute; right:16px; top:14px; }
.card__name {
    font-size:15.5px; font-weight:600; color:var(--ink); letter-spacing:-.01em;
    padding-right:54px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.card__sub { font-size:12px; color:var(--ink-faint); font-family:var(--font-mono); letter-spacing:.01em; }

/* ---------- empty / not found ---------- */
.empty {
    text-align:center; max-width:540px; margin:40px auto;
    padding:48px 28px; border:1.5px dashed var(--line); border-radius:var(--radius-lg);
    background:#fff;
}
.empty__mark { width:62px; height:62px; margin:0 auto 22px; }
.empty h2 { font-family:var(--font-display); font-weight:500; font-size:24px; margin:0 0 10px; color:var(--ink); }
.empty p { color:var(--ink-soft); font-size:14.5px; margin:0 auto 8px; max-width:44ch; }
.empty code { font-family:var(--font-mono); font-size:13px; background:var(--paper-2); padding:2px 7px; border-radius:6px; color:var(--ink); }
.empty__path { font-family:var(--font-mono); font-size:12px; color:var(--ink-faint); margin-top:14px; word-break:break-all; }
.empty a { color:var(--moss-deep); font-weight:600; }

/* ============================================================
   VIEWER (preview)
   ============================================================ */
.viewer { height:100dvh; display:flex; flex-direction:column; background:var(--paper-2); }
.viewer__bar {
    height:56px; flex:0 0 auto; background:var(--forest);
    display:flex; align-items:center; gap:16px; padding:0 clamp(12px, 3vw, 22px);
}
.viewer__back {
    display:inline-flex; align-items:center; gap:7px;
    color:var(--on-dark); font-size:13.5px; font-weight:600;
    padding:8px 14px 8px 11px; border-radius:var(--pill);
    border:1.4px solid var(--forest-3); white-space:nowrap;
    transition:border-color .15s, color .15s;
}
.viewer__back svg { width:16px; height:16px; }
.viewer__back:hover { border-color:var(--moss); color:var(--moss); }
.viewer__id { display:flex; align-items:center; gap:10px; min-width:0; flex:1 1 auto; }
.viewer__name {
    color:var(--on-dark); font-size:13.5px; font-weight:500; font-family:var(--font-mono);
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.viewer__actions { display:flex; align-items:center; gap:8px; flex:0 0 auto; }
.vbtn {
    color:#0e1808; background:var(--moss);
    font-size:12.5px; font-weight:700; padding:8px 14px; border-radius:var(--pill);
    white-space:nowrap; transition:background .15s, border-color .15s, color .15s;
}
.vbtn:hover { background:var(--moss-bright); }
.vbtn--ghost { background:transparent; color:var(--on-dark); border:1.4px solid var(--forest-3); }
.vbtn--ghost:hover { border-color:var(--moss); color:var(--moss); }

.viewer__stage { flex:1 1 auto; position:relative; overflow:hidden; }
.viewer__frame { position:absolute; inset:0; width:100%; height:100%; border:0; background:#fff; }
.viewer__imgwrap { position:absolute; inset:0; display:grid; place-items:center; padding:24px; overflow:auto; }
.viewer__img { max-width:100%; max-height:100%; border-radius:8px; background:#fff; box-shadow:var(--shadow); }
.viewer__missing {
    position:absolute; inset:0; display:flex; flex-direction:column;
    align-items:center; justify-content:center; text-align:center; padding:24px;
}
.viewer__missing h1 { font-family:var(--font-display); font-weight:500; font-size:26px; margin:0 0 8px; color:var(--ink); }
.viewer__missing p { color:var(--ink-soft); font-size:14.5px; margin:0; }
.viewer__missing a { color:var(--moss-deep); font-weight:600; }

/* ============================================================
   Responsive + motion
   ============================================================ */
@media (max-width:640px) {
    .gallery__head { flex-direction:column; align-items:flex-start; }
    .gallery__tools { width:100%; justify-content:space-between; }
    .search input { width:100%; max-width:none; }
    .topbar__tag { display:none; }
    .viewer__name { display:none; }
    .vbtn { padding:8px 11px; }
}

@media (prefers-reduced-motion:reduce) {
    * { transition:none !important; animation:none !important; }
}
