/* ============================================================
   UI Patterns — preset reusable components.
   Prefix: ui-
   Docs: claude/docs/ui-patterns.md
   Loaded by inc/meta.php after forms.css.
   ============================================================ */

/* --- Design tokens (override in module if needed) ----------- */
:root{
  --ui-bg:#f8fafc;
  --ui-surface:#fff;
  --ui-border:#e5e7eb;
  --ui-border-soft:#f1f5f9;
  --ui-text:#0f172a;
  --ui-text-muted:#64748b;
  --ui-text-faint:#94a3b8;
  --ui-primary:#3b82f6;
  --ui-primary-dark:#1d4ed8;
  --ui-success:#10b981;
  --ui-success-dark:#059669;
  --ui-danger:#dc2626;
  --ui-danger-bg:#fee2e2;
  --ui-danger-text:#b91c1c;
  --ui-danger-border:#fecaca;
  --ui-ok-bg:#dcfce7;
  --ui-ok-text:#15803d;
  --ui-ok-border:#bbf7d0;
  --ui-grad-primary:linear-gradient(135deg,#3b82f6,#1d4ed8);
  --ui-grad-success:linear-gradient(135deg,#10b981,#059669);
  --ui-font:-apple-system,'Segoe UI',Roboto,sans-serif;
  --ui-radius-sm:8px;
  --ui-radius:10px;
  --ui-radius-lg:12px;
  --ui-radius-xl:14px;
  --ui-radius-sheet:24px;
}

/* --- Scope wrapper ------------------------------------------ */
.ui{font-family:var(--ui-font);color:var(--ui-text);}

/* --- Search bar (sticky top) -------------------------------- */
.ui-search{position:sticky;top:0;z-index:10;background:var(--ui-bg);padding:12px 20px;border-bottom:1px solid var(--ui-border);}
.ui-search-row{display:flex;gap:8px;align-items:center;}
.ui-search-row form{position:relative;flex:1;}
.ui-search input{width:100%;height:44px;padding:0 40px;border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);font-size:.95rem;background:var(--ui-surface);box-sizing:border-box;color:var(--ui-text);-webkit-appearance:none;}
.ui-search input::placeholder{color:var(--ui-text-faint);}
.ui-search input:focus{outline:0;border-color:var(--ui-primary);box-shadow:0 0 0 3px rgba(59,130,246,.12);}
.ui-search .icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--ui-text-faint);font-size:1rem;pointer-events:none;}
.ui-search .clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--ui-radius-sm);background:transparent;color:var(--ui-text-faint);text-decoration:none;font-size:1.1rem;}
.ui-search .clear:active{background:var(--ui-border-soft);}

/* --- Icon button (filter / compose etc.) -------------------- */
.ui-icon-btn{flex-shrink:0;width:44px;height:44px;display:inline-flex;align-items:center;justify-content:center;background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);color:#475569;text-decoration:none;cursor:pointer;position:relative;}
.ui-icon-btn:active{background:var(--ui-border-soft);}
.ui-icon-btn svg{width:20px;height:20px;}
.ui-icon-btn.active{background:var(--ui-grad-primary);color:#fff;border-color:transparent;}
.ui-icon-btn.success{background:var(--ui-grad-success);color:#fff;border-color:transparent;}
.ui-icon-btn .dot{position:absolute;top:6px;right:6px;width:8px;height:8px;background:var(--ui-primary);border-radius:50%;border:2px solid #fff;}

/* --- Bottom-sheet modal ------------------------------------- */
.ui-sheet{position:fixed;inset:0;z-index:9999;display:flex;align-items:flex-end;justify-content:center;visibility:hidden;pointer-events:none;}
.ui-sheet.open{visibility:visible;pointer-events:auto;}
.ui-sheet-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.4);opacity:0;transition:opacity .25s ease;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);}
.ui-sheet.open .ui-sheet-backdrop{opacity:1;}
.ui-sheet-panel{position:relative;width:100%;max-width:520px;background:var(--ui-surface);border-radius:var(--ui-radius-sheet) var(--ui-radius-sheet) 0 0;padding:10px 16px calc(20px + env(safe-area-inset-bottom,0px));box-shadow:0 -8px 32px rgba(15,23,42,.18);transform:translateY(100%);transition:transform .3s cubic-bezier(.2,.9,.25,1);display:flex;flex-direction:column;gap:6px;max-height:80vh;overflow-y:auto;}
.ui-sheet.open .ui-sheet-panel{transform:translateY(0);}
.ui-sheet-handle{width:42px;height:5px;background:#cbd5e0;border-radius:99px;margin:0 auto 12px;flex-shrink:0;}
.ui-sheet-title{font-size:.78rem;font-weight:700;color:var(--ui-text-faint);text-transform:uppercase;letter-spacing:.06em;text-align:center;padding:0 0 12px;}
/* Sticky header keeps handle + title (+ X button) pinned at top when content scrolls.
   Wrap handle + X + title in <div class="ui-sheet-header"> inside the panel. */
.ui-sheet-header{position:sticky;top:0;z-index:2;background:var(--ui-surface);}
.ui-sheet-btn{display:flex;align-items:center;gap:14px;width:100%;padding:14px 18px;background:var(--ui-bg);border:0;border-radius:var(--ui-radius-xl);font-size:1rem;font-weight:600;color:var(--ui-text);cursor:pointer;text-align:left;font-family:inherit;text-decoration:none;transition:background .15s;-webkit-tap-highlight-color:transparent;min-height:56px;box-sizing:border-box;}
.ui-sheet-btn:active{background:#eef2f6;}
.ui-sheet-btn.on{background:var(--ui-grad-primary);color:#fff;}
.ui-sheet-btn .lbl{flex:1;}
.ui-sheet-btn .cnt{font-size:.78rem;color:var(--ui-text-muted);font-weight:600;font-variant-numeric:tabular-nums;}
.ui-sheet-btn.on .cnt{color:rgba(255,255,255,.85);}
.ui-sheet-btn .check-mark{font-size:1.1rem;}
.ui-sheet-btn.cancel{background:transparent;color:#475569;font-weight:700;margin-top:4px;justify-content:center;}
.ui-sheet-btn.cancel:active{background:var(--ui-bg);}

/* --- Listing row (link with from + subject + date) --------- */
.ui-list{padding:0 20px;}
.ui-row{display:block;padding:14px 0;border-bottom:1px solid var(--ui-border-soft);text-decoration:none;color:var(--ui-text);min-height:44px;}
.ui-row:active{background:var(--ui-bg);}
.ui-row.unread .subj{font-weight:700;color:var(--ui-text);}
.ui-row.read .subj{font-weight:500;color:#475569;}
.ui-row .top{display:flex;justify-content:space-between;align-items:baseline;gap:10px;margin-bottom:4px;}
.ui-row .from{font-size:.84rem;color:#475569;font-weight:600;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ui-row .date{font-size:.74rem;color:var(--ui-text-faint);flex-shrink:0;font-variant-numeric:tabular-nums;}
.ui-row .subj{font-size:.92rem;line-height:1.35;display:flex;align-items:center;gap:6px;}
.ui-row .subj .text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;}
.ui-row .unread-dot{display:inline-block;width:7px;height:7px;background:var(--ui-primary);border-radius:50%;flex-shrink:0;}
.ui-row .badge{color:var(--ui-text-muted);font-size:.78rem;flex-shrink:0;}

/* --- Info bar (count / search summary) --------------------- */
.ui-info{padding:8px 20px;font-size:.78rem;color:var(--ui-text-muted);}

/* --- Empty state ------------------------------------------- */
.ui-empty{padding:40px 20px;text-align:center;color:var(--ui-text-faint);}

/* --- Flash messages ---------------------------------------- */
.ui-flash{margin:10px 20px;padding:10px 14px;border-radius:var(--ui-radius);font-size:.86rem;font-weight:600;}
.ui-flash.ok{background:var(--ui-ok-bg);color:var(--ui-ok-text);border:1px solid var(--ui-ok-border);}
.ui-flash.err{background:var(--ui-danger-bg);color:var(--ui-danger-text);border:1px solid var(--ui-danger-border);}

/* --- Pagination -------------------------------------------- */
.ui-pag{display:flex;justify-content:center;gap:6px;padding:18px 20px;flex-wrap:wrap;}
.ui-pag a,.ui-pag span{display:inline-flex;align-items:center;justify-content:center;min-width:44px;height:44px;padding:0 12px;border-radius:var(--ui-radius);text-decoration:none;font-weight:600;font-size:.86rem;background:var(--ui-surface);border:1px solid var(--ui-border);color:#475569;}
.ui-pag a:active{background:var(--ui-border-soft);}
.ui-pag .on{background:var(--ui-grad-primary);color:#fff;border-color:transparent;}

/* --- Back link (detail views) ------------------------------ */
.ui-back{display:inline-flex;align-items:center;gap:6px;color:var(--ui-primary);text-decoration:none;font-weight:600;font-size:.9rem;margin-bottom:14px;min-height:44px;padding:10px 0;}

/* --- Action bar (form footer) ------------------------------ */
.ui-actbar{display:flex;gap:10px;margin-top:18px;}
.ui-actbar .primary{flex:1;padding:14px 18px;border:0;border-radius:var(--ui-radius);background:var(--ui-grad-success);color:#fff;font-weight:700;font-size:.95rem;cursor:pointer;min-height:48px;}
.ui-actbar .primary:active{opacity:.85;}
.ui-actbar .cancel{padding:14px 18px;border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-bg);color:#475569;text-decoration:none;font-weight:600;font-size:.95rem;display:inline-flex;align-items:center;justify-content:center;}

/* --- Swipe-to-delete row wrapper --------------------------- */
.ui-row-wrap{position:relative;overflow:hidden;}
.ui-row-wrap .ui-row{transition:transform .25s cubic-bezier(.2,.9,.25,1);background:var(--ui-surface);position:relative;z-index:2;padding:14px 0;}
.ui-row-wrap.swiped .ui-row{transform:translateX(-90px);}
.ui-row-wrap.deleting .ui-row{transform:translateX(-100%);opacity:0;transition:transform .35s ease,opacity .35s ease;}
.ui-row-wrap .ui-row-action{position:absolute;right:0;top:0;bottom:0;width:90px;display:flex;align-items:center;justify-content:center;background:var(--ui-danger);color:#fff;z-index:1;border:0;cursor:pointer;-webkit-tap-highlight-color:transparent;}
.ui-row-wrap .ui-row-action .ui-progress{position:relative;width:48px;height:48px;}
.ui-row-wrap .ui-row-action svg.bg-ring,
.ui-row-wrap .ui-row-action svg.fg-ring{position:absolute;inset:0;width:48px;height:48px;}
.ui-row-wrap .ui-row-action svg.bg-ring circle{fill:none;stroke:rgba(255,255,255,.25);stroke-width:3;}
.ui-row-wrap .ui-row-action svg.fg-ring{transform:rotate(-90deg);}
.ui-row-wrap .ui-row-action svg.fg-ring circle{fill:none;stroke:#fff;stroke-width:3;stroke-dasharray:138;stroke-dashoffset:138;stroke-linecap:round;}
.ui-row-wrap.swiped .ui-row-action svg.fg-ring circle{animation:uiCount 5s linear forwards;}
@keyframes uiCount{from{stroke-dashoffset:138;}to{stroke-dashoffset:0;}}
