/*
 * dliu.com shared UI, v1: https://files.dliu.com/dliu.com/ui/v1/dl.css
 * Source: https://github.com/dliu-com/shared-resources (public/ui/v1/dl.css)
 *
 * One look for every dliu.com site: colours, header (menu bar) with the app's own logo, buttons,
 * sign-in buttons, page layout and footer with the DL logo. Load it before the site's own stylesheet.
 * Classes start with dl- so they never clash with a site's own names. Element defaults use
 * :where() (no specificity), so any site rule overrides them.
 * v1 only gains things; a change that would break a page goes to v2.
 */

:root {
  color-scheme: light;
  --dl-bg: #ffffff;
  --dl-panel: #f6f7f9;
  --dl-surface: #ffffff;
  --dl-line: #dfe3e8;
  --dl-line-strong: #b8c0ca;
  --dl-text: #1c2024;
  --dl-muted: #646b75;
  /* The DL logo's blue, exactly. */
  --dl-accent: #209cee;
  --dl-accent-hover: #1786d1;
  --dl-accent-soft: #e8f5fd;
  --dl-focus: rgba(32, 156, 238, 0.35);
  --dl-danger: #d1242f;
  --dl-ok: #1a7f37;
  --dl-radius: 12px;
  --dl-radius-small: 8px;
  --dl-font: system-ui, -apple-system, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif;
  --dl-mono: ui-monospace, SFMono-Regular, Menlo, monospace;
  --dl-main-width: 1280px;
  --dl-gutter: 24px;
}
@media (max-width: 640px) {
  :root { --dl-gutter: 16px; }
}

/* ---------- Base (no specificity: site rules win) ---------- */
:where(*, *::before, *::after) { box-sizing: border-box; }
:where(html) { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; font-family: var(--dl-font); }
:where(body) { margin: 0; background: var(--dl-bg); color: var(--dl-text); font-family: var(--dl-font); }
:where(img, video) { max-width: 100%; }
:where(a) { color: var(--dl-accent); text-decoration: none; }
:where(a:hover) { text-decoration: underline; }
:where(h1) { font-size: 24px; margin: 0 0 16px; }
:where(h2) { font-size: 18px; margin: 24px 0 12px; }
:where(input:not([type]), input[type=text], input[type=search], input[type=email], input[type=url], input[type=number], input[type=password], input[type=tel], input[type=date], input[type=time], input[type=datetime-local], input[type=month], input[type=week], textarea, select) {
  font: inherit; padding: 9px 11px; border-radius: var(--dl-radius-small); border: 1px solid var(--dl-line);
  background: var(--dl-surface); color: var(--dl-text);
}
:where(input:not([type]), input[type=text], input[type=search], input[type=email], input[type=url], input[type=number], input[type=password], input[type=tel], input[type=date], input[type=time], input[type=datetime-local], input[type=month], input[type=week], textarea) { width: 100%; }
/* Same box for selects in every browser (Safari ignores padding and borders on native selects). The arrow is
   chevron.svg next to this file, so a CSP that allows https://files.dliu.com/dliu.com/ for images covers it. */
:where(select:not([multiple]):not([size])) {
  -webkit-appearance: none; appearance: none; padding-right: 32px; line-height: normal;
  background-image: url("chevron.svg"); background-repeat: no-repeat; background-position: right 11px center; background-size: 12px 8px;
}
:where(input, textarea, select):focus { outline: 2px solid var(--dl-focus); border-color: var(--dl-accent); }
:where(a, button, summary):focus-visible { outline: 2px solid var(--dl-accent); outline-offset: 2px; }
[hidden] { display: none !important; }

/* ---------- Page layout ---------- */
/* <body class="dl-page">: header on top, main fills the screen, footer at the bottom. */
.dl-page { min-height: 100vh; min-height: 100dvh; display: flex; flex-direction: column; }
.dl-main {
  width: 100%; max-width: var(--dl-main-width); margin: 0 auto; flex: 1 0 auto;
  padding: var(--dl-gutter) max(var(--dl-gutter), env(safe-area-inset-right)) var(--dl-gutter) max(var(--dl-gutter), env(safe-area-inset-left));
}
.dl-main.dl-narrow { max-width: 760px; }

/* ---------- Header (menu bar) ----------
   The app's own logo and name, linking to the app's home page:
   <header class="dl-header">
     <a class="dl-brand" href="/"><img class="dl-logo" src="/logo.svg" alt="" width="32" height="32">Site name</a>
     <nav class="dl-nav" aria-label="Site"> dl-nav-link links and dl-button buttons </nav>
   </header>
   (The earlier form, <a class="dl-logo" href="…"><img …></a> beside the dl-brand link, still works.) */
.dl-header {
  position: sticky; top: 0; z-index: 20;
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; min-height: 60px;
  padding: max(10px, env(safe-area-inset-top)) max(var(--dl-gutter), env(safe-area-inset-right)) 10px max(var(--dl-gutter), env(safe-area-inset-left));
  background: rgba(255, 255, 255, 0.92); border-bottom: 1px solid var(--dl-line);
  -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px);
  font-family: var(--dl-font);
}
a.dl-logo { display: flex; flex: none; border-radius: 7px; }
a.dl-logo img, img.dl-logo { display: block; flex: none; width: 32px; height: 32px; object-fit: contain; }
.dl-brand {
  display: inline-flex; align-items: center; gap: 10px; flex: none;
  font: 650 18px/1.2 var(--dl-font); color: var(--dl-text); white-space: nowrap; text-decoration: none;
}
.dl-brand:hover { color: var(--dl-text); text-decoration: none; }
.dl-nav { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 8px; margin-left: auto; }
/* Plain text links in the menu bar. */
.dl-nav-link { padding: 8px 6px; color: var(--dl-muted); font-size: 14px; font-weight: 500; white-space: nowrap; text-decoration: none; }
.dl-nav-link:hover { color: var(--dl-text); text-decoration: none; }
.dl-nav-link[aria-current] { color: var(--dl-text); font-weight: 600; box-shadow: inset 0 -2px 0 var(--dl-accent); }
.dl-account { color: var(--dl-muted); font-size: 13px; overflow-wrap: anywhere; }

/* Collapsible menu, for apps with more links than fit on a phone. On screens up to 600 px the nav hides behind a
   ☰ button; the app's script toggles .is-open on the nav and aria-expanded on the button.
   <button type="button" class="dl-button dl-menu-toggle" aria-controls="dl-menu" aria-expanded="false" aria-label="Menu">☰</button>
   <nav id="dl-menu" class="dl-nav dl-nav-collapsible" aria-label="Site">…</nav> */
.dl-button.dl-menu-toggle { display: none; margin-left: auto; padding: 8px 12px; font-size: 16px; }
@media (max-width: 600px) {
  .dl-button.dl-menu-toggle { display: inline-flex; }
  .dl-nav.dl-nav-collapsible { display: none; }
  .dl-nav.dl-nav-collapsible.is-open {
    display: flex; flex-direction: column; align-items: stretch; gap: 4px;
    position: absolute; top: 100%; left: 0; right: 0; z-index: 25; margin: 0;
    padding: 8px max(var(--dl-gutter), env(safe-area-inset-right)) 12px max(var(--dl-gutter), env(safe-area-inset-left));
    background: var(--dl-surface); border-bottom: 1px solid var(--dl-line); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.08);
  }
  .dl-nav-collapsible.is-open .dl-nav-link { padding: 10px 4px; }
  .dl-nav-collapsible.is-open .dl-nav-link[aria-current] { box-shadow: inset 3px 0 0 var(--dl-accent); padding-left: 12px; }
  .dl-nav-collapsible.is-open .dl-language { align-self: flex-start; }
  .dl-nav-collapsible.is-open .dl-button.dl-language-toggle { display: none; }
  .dl-nav-collapsible.is-open .dl-languages { display: inline-flex; flex-direction: row; position: static; box-shadow: none; }
}

/* ---------- Buttons ----------
   <a class="dl-button" href="…">, <button class="dl-button dl-button-primary">,
   plus dl-button-danger, dl-button-small, dl-button-quiet (no border until hovered, for toolbars and icon
   buttons) and dl-button-link (looks like a link). */
.dl-button {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  padding: 8px 14px; border: 1px solid var(--dl-line); border-radius: var(--dl-radius-small);
  background: var(--dl-surface); color: var(--dl-text); font: inherit; font-size: 14px; line-height: 1.2;
  white-space: nowrap; text-decoration: none; cursor: pointer;
}
.dl-button:hover { border-color: var(--dl-line-strong); background: var(--dl-panel); color: var(--dl-text); text-decoration: none; }
.dl-button[aria-current] { border-color: var(--dl-accent); color: var(--dl-accent); }
.dl-button.dl-button-primary { border-color: var(--dl-accent); background: var(--dl-accent); color: #fff; font-weight: 600; }
.dl-button.dl-button-primary:hover { border-color: var(--dl-accent-hover); background: var(--dl-accent-hover); color: #fff; }
.dl-button.dl-button-small { padding: 5px 10px; font-size: 13px; }
.dl-button.dl-button-quiet { border-color: transparent; background: none; }
.dl-button.dl-button-quiet:hover { border-color: var(--dl-line); background: var(--dl-panel); }
.dl-button.dl-button-link { padding: 0; border: 0; background: none; color: var(--dl-accent); }
.dl-button.dl-button-link:hover { background: none; color: var(--dl-accent); text-decoration: underline; }
/* After dl-button-link, so a link-style Delete stays red. */
.dl-button.dl-button-danger, .dl-button.dl-button-danger:hover { color: var(--dl-danger); }
.dl-button:disabled, .dl-button[aria-disabled="true"] { opacity: 0.55; cursor: default; pointer-events: none; }
/* A toggle button that is on: <button class="dl-button" aria-pressed="true"> */
.dl-button[aria-pressed="true"] { border-color: var(--dl-accent); background: var(--dl-accent-soft); color: var(--dl-accent); font-weight: 600; }
.dl-button .dl-icon { width: 16px; height: 16px; flex: none; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }

/* ---------- Sign-in ----------
   Header sign-in: <a class="dl-button dl-signin" href="/auth/login">Sign in</a>
   Full button, following Microsoft identity platform branding:
   <a class="dl-ms-signin" href="/auth/login"><svg viewBox="0 0 21 21" aria-hidden="true">four squares</svg><span>Sign in with Microsoft</span></a> */
.dl-button.dl-signin {
  padding: 9px 18px; border-color: var(--dl-accent); background: var(--dl-accent); color: #fff; font-weight: 600;
  box-shadow: 0 1px 3px rgba(32, 156, 238, 0.35);
}
.dl-button.dl-signin:hover { border-color: var(--dl-accent-hover); background: var(--dl-accent-hover); color: #fff; }
.dl-ms-signin {
  display: inline-flex; align-items: center; gap: 12px; height: 41px; padding: 0 12px;
  border: 1px solid #8c8c8c; background: #fff; color: #5e5e5e;
  font: 600 15px "Segoe UI", system-ui, sans-serif; text-decoration: none; cursor: pointer;
}
.dl-ms-signin svg { flex: none; width: 21px; height: 21px; }
.dl-ms-signin:hover { background: #f3f3f3; color: #5e5e5e; text-decoration: none; }

/* ---------- Segmented choice ----------
   One choice out of a few: <div class="dl-segmented" role="group" aria-label="Side">
     <button type="button" aria-pressed="true">红方</button><button type="button" aria-pressed="false">黑方</button></div>
   aria-pressed, aria-checked or aria-selected="true" marks the chosen one. */
.dl-segmented { display: inline-flex; border: 1px solid var(--dl-line); border-radius: var(--dl-radius-small); overflow: hidden; background: var(--dl-surface); }
.dl-segmented > button, .dl-segmented > a {
  padding: 8px 14px; border: 0; border-left: 1px solid var(--dl-line); background: none;
  color: var(--dl-text); font: 500 14px/1.2 var(--dl-font); text-decoration: none; cursor: pointer;
}
.dl-segmented > :first-child { border-left: 0; }
.dl-segmented > button:hover, .dl-segmented > a:hover { background: var(--dl-panel); text-decoration: none; }
.dl-segmented > [aria-pressed="true"], .dl-segmented > [aria-checked="true"], .dl-segmented > [aria-selected="true"] {
  background: var(--dl-accent-soft); color: var(--dl-accent); font-weight: 600;
}
.dl-segmented > :disabled { opacity: 0.55; cursor: default; }
.dl-segmented.dl-segmented-small > button, .dl-segmented.dl-segmented-small > a { padding: 4px 12px; font-size: 13px; }

/* ---------- Dialogs (native <dialog>, opened with showModal()) ----------
   <dialog class="dl-dialog" aria-labelledby="rules-title">
     <div class="dl-dialog-head"><h2 id="rules-title">Title</h2>
       <button type="button" class="dl-dialog-close" aria-label="Close">✕</button></div>
     <div class="dl-dialog-body">…</div>
     <div class="dl-dialog-actions"><button class="dl-button">Cancel</button><button class="dl-button dl-button-primary">OK</button></div>
   </dialog> */
.dl-dialog {
  width: min(560px, calc(100vw - 24px)); max-height: calc(100dvh - 48px); padding: 0;
  border: 1px solid var(--dl-line); border-radius: var(--dl-radius); background: var(--dl-surface); color: var(--dl-text);
  box-shadow: 0 20px 50px rgba(0, 0, 0, 0.2); font-family: var(--dl-font);
}
.dl-dialog[open] { display: flex; flex-direction: column; }
/* A <form method="dialog"> may wrap the head, body and actions. */
.dl-dialog[open] > form { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; margin: 0; }
.dl-dialog::backdrop { background: rgba(15, 23, 42, 0.45); }
.dl-dialog-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 18px; border-bottom: 1px solid var(--dl-line); }
.dl-dialog-head h2 { margin: 0; font-size: 18px; }
.dl-dialog-close {
  flex: none; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 0;
  border: 0; border-radius: var(--dl-radius-small); background: none; color: var(--dl-muted); font-size: 18px; cursor: pointer;
}
.dl-dialog-close:hover { background: var(--dl-panel); color: var(--dl-text); }
.dl-dialog-body { padding: 16px 18px; overflow: auto; line-height: 1.55; }
.dl-dialog-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; padding: 12px 18px; border-top: 1px solid var(--dl-line); background: var(--dl-panel); }

/* ---------- Footer ---------- */
.dl-footer {
  padding: 24px var(--dl-gutter) max(24px, env(safe-area-inset-bottom));
  color: var(--dl-muted); font-size: 13px; text-align: center;
}
.dl-footer a { color: var(--dl-muted); }
/* The shared DL logo, first in every footer:
   <footer class="dl-footer">
     <a class="dl-footer-logo" href="https://dliu.com" aria-label="dliu.com"><img src="https://files.dliu.com/dliu.com/favicon.png" alt="" width="24" height="24"></a>
     <a href="https://dliu.com">dliu.com</a> · <a href="/docs">Docs</a>
   </footer> */
.dl-footer-logo { display: inline-flex; vertical-align: middle; margin-right: 8px; border-radius: 5px; }
.dl-footer-logo img { display: block; width: 24px; height: 24px; }

/* ---------- Content helpers ---------- */
.dl-panel { padding: 18px; border: 1px solid var(--dl-line); border-radius: var(--dl-radius); background: var(--dl-panel); }
.dl-card { padding: 16px; border: 1px solid var(--dl-line); border-radius: var(--dl-radius); background: var(--dl-surface); min-width: 0; }
.dl-notice { margin: 0 0 16px; padding: 10px 14px; border: 1px solid #b7e1c1; border-radius: var(--dl-radius-small); background: #eef9f1; }
.dl-notice.dl-error { border-color: #f1b8bc; background: #fdf0f1; }
.dl-muted { color: var(--dl-muted); }
.dl-error { color: var(--dl-danger); }
.dl-success { color: var(--dl-ok); }
.dl-visually-hidden { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ---------- Tables ----------
   <div class="dl-table-wrap"><table class="dl-table">…</table></div>; td.dl-num / th.dl-num for numbers. */
.dl-table-wrap { overflow-x: auto; }
.dl-table { width: 100%; border-collapse: collapse; font-size: 14px; }
.dl-table th, .dl-table td { padding: 8px 10px; border-bottom: 1px solid var(--dl-line); text-align: left; vertical-align: top; }
.dl-table th { color: var(--dl-muted); font-weight: 600; white-space: nowrap; }
.dl-table tr:last-child td { border-bottom: 0; }
.dl-table .dl-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* ---------- Tabs ----------
   <nav class="dl-tabs" aria-label="Sections"><a href="#a" aria-current="page">A</a><a href="#b">B</a></nav>
   Links or buttons; aria-current="page" or aria-selected="true" marks the open tab. */
.dl-tabs { display: flex; gap: 2px; overflow-x: auto; scrollbar-width: none; margin: 4px 0 18px; border-bottom: 1px solid var(--dl-line); }
.dl-tabs::-webkit-scrollbar { display: none; }
.dl-tabs > a, .dl-tabs > button {
  flex: none; margin-bottom: -1px; padding: 9px 14px; border: 0; border-bottom: 3px solid transparent; background: none;
  color: var(--dl-muted); font: 600 15px var(--dl-font); text-decoration: none; cursor: pointer;
}
.dl-tabs > a:hover, .dl-tabs > button:hover { color: var(--dl-accent); text-decoration: none; }
.dl-tabs > [aria-current], .dl-tabs > [aria-selected="true"] { color: var(--dl-text); border-bottom-color: var(--dl-accent); }

/* ---------- Language switcher (sites in Chinese and English) ----------
   Last item in the header's dl-nav. The site's script sets aria-pressed on the language buttons, and on
   narrow screens toggles .is-open on .dl-languages (and aria-expanded on the toggle) when 文/A is pressed.
   <div class="dl-language">
     <button type="button" class="dl-button dl-language-toggle" aria-controls="dl-languages" aria-expanded="false" aria-label="Language / 语言">文/A</button>
     <div id="dl-languages" class="dl-languages" role="group" aria-label="Language / 语言">
       <button type="button" data-language="zh" lang="zh-CN" aria-pressed="true">中文</button>
       <button type="button" data-language="en" lang="en" aria-pressed="false">English</button>
     </div>
   </div> */
.dl-language { position: relative; display: flex; }
.dl-languages { display: inline-flex; border: 1px solid var(--dl-line); border-radius: var(--dl-radius-small); overflow: hidden; background: var(--dl-surface); }
.dl-languages > button {
  padding: 7px 10px; border: 0; border-left: 1px solid var(--dl-line); background: none;
  color: var(--dl-text); font: 500 13px var(--dl-font); cursor: pointer;
}
.dl-languages > button:first-child { border-left: 0; }
.dl-languages > button:hover { background: var(--dl-panel); }
.dl-languages > button[aria-pressed="true"] { background: var(--dl-accent-soft); color: var(--dl-accent); font-weight: 600; }
.dl-button.dl-language-toggle { display: none; padding: 8px 10px; font-size: 13px; }
@media (max-width: 600px) {
  .dl-button.dl-language-toggle { display: inline-flex; }
  .dl-languages { display: none; }
  .dl-languages.is-open {
    display: flex; flex-direction: column; position: absolute; top: calc(100% + 6px); right: 0; z-index: 30; min-width: 120px;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.12);
  }
  .dl-languages.is-open > button { border-left: 0; border-top: 1px solid var(--dl-line); padding: 10px 14px; text-align: left; }
  .dl-languages.is-open > button:first-child { border-top: 0; }
}

/* ---------- Phones and touch screens ---------- */
@media (max-width: 400px) {
  .dl-header { gap: 8px; }
  .dl-nav { gap: 6px; }
  .dl-nav .dl-button { padding: 8px 10px; }
}
@media (max-width: 640px) {
  .dl-tabs > a, .dl-tabs > button { padding: 8px 10px; font-size: 14px; }
}
/* Bigger targets, and 16px text so iOS doesn't zoom into fields. */
@media (pointer: coarse) {
  .dl-button:not(.dl-button-link) { min-height: 44px; }
  .dl-languages > button { min-height: 44px; }
  .dl-segmented > button, .dl-segmented > a { min-height: 44px; }
  .dl-dialog-close { width: 44px; height: 44px; }
  .dl-nav-link { display: inline-flex; align-items: center; min-height: 44px; }
  :where(input:not([type]), input[type=text], input[type=search], input[type=email], input[type=url], input[type=number], input[type=password], input[type=tel], input[type=date], input[type=time], input[type=datetime-local], input[type=month], input[type=week], textarea, select) { font-size: 16px; }
}
