///|
pub let default_theme_css : String =
  #|:root{--paper:#fffdf7;--ink:#24231f;--muted:#746f64;--line:#ded8ca;--accent:#b5462d;--side:#f3eee2;--code:#282c34}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--paper);color:var(--ink);font:17px/1.75 Georgia,"Noto Serif SC",serif}.layout{display:grid;grid-template-columns:290px minmax(0,1fr);min-height:100vh}.sidebar{position:sticky;top:0;height:100vh;overflow:auto;padding:34px 24px;background:var(--side);border-right:1px solid var(--line)}.brand{font-size:24px;font-weight:700;color:var(--ink);text-decoration:none}.search{width:100%;margin:22px 0;padding:10px 12px;border:1px solid var(--line);border-radius:4px;background:#fff}.toc{list-style:none;padding:0}.toc li{margin:8px 0}.toc a{color:var(--muted);text-decoration:none}.toc a:hover,.toc .active{color:var(--accent)}.part{margin-top:24px;text-transform:uppercase;letter-spacing:.12em;font:700 12px sans-serif}.content{width:min(850px,calc(100% - 48px));margin:0 auto;padding:54px 0}.breadcrumbs{font:13px sans-serif;color:var(--muted)}.page-toc{float:right;width:230px;margin:18px 0 24px 28px;padding:14px 16px;border:1px solid var(--line);border-radius:6px;background:var(--side);font:14px/1.5 sans-serif}.page-toc ol{margin:8px 0 0;padding:0;list-style:none}.page-toc li{margin:5px 0}.page-toc a{text-decoration:none}.authors{margin-top:38px;color:var(--muted);font:14px sans-serif}h1,h2,h3{line-height:1.25;margin-top:1.7em}.anchor{opacity:0;margin-left:-1em;padding-right:.25em;color:var(--accent);text-decoration:none}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor{opacity:1}a{color:var(--accent)}pre{position:relative;overflow:auto;padding:18px;padding-top:44px;border-radius:6px;background:var(--code);color:#f3f3f3}.copy-code{position:absolute;top:9px;right:9px;padding:5px 10px;border:1px solid #5a606b;border-radius:4px;background:#353b45;color:#e8e8e8;font:12px sans-serif;cursor:pointer}.copy-code:hover{border-color:#8d95a3;background:#414956}.copy-code.copied{border-color:#6fa879;color:#a9e5b2}code{font:14px/1.6 "SFMono-Regular",Consolas,monospace}p code,li code{padding:2px 5px;background:#eee7d9;color:#7b2f20}mark{padding:1px 4px;background:#ffe69a;color:inherit}del{color:var(--muted)}article img{display:block;max-width:100%;height:auto;margin:24px auto;border-radius:6px}ol,ul{padding-left:1.6em}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse}th,td{padding:9px 12px;border:1px solid var(--line);text-align:left}blockquote{margin-left:0;padding-left:20px;border-left:4px solid var(--accent);color:var(--muted)}.callout{margin:24px 0;padding:14px 18px;border-left:5px solid #4d7ea8;border-radius:4px;background:#eaf4fb}.callout strong{font:700 13px sans-serif;letter-spacing:.08em}.callout p{margin:.35em 0 0}.callout-tip{border-color:#438a65;background:#e9f6ed}.callout-warning{border-color:#c18424;background:#fff4d8}.callout-danger{border-color:#b7473d;background:#fcebea}.chapter-nav{display:flex;justify-content:space-between;clear:both;margin-top:60px;padding-top:20px;border-top:1px solid var(--line)}@media(max-width:760px){.layout{display:block}.sidebar{position:relative;width:100%;height:auto}.content{padding-top:28px}.page-toc{float:none;width:100%;margin:18px 0}.anchor{opacity:1}}

///|
pub fn available_themes() -> Array[String] {
  ["light", "rust", "coal"]
}

///|
pub fn theme_css(name : String) -> String? {
  match name {
    "light" => Some(default_theme_css)
    "rust" =>
      Some(
        default_theme_css +
        ":root{--paper:#fff8ee;--ink:#30251f;--muted:#77655b;--line:#decbbb;--accent:#a74420;--side:#f1dfcc;--code:#2b2420}",
      )
    "coal" =>
      Some(
        default_theme_css +
        ":root{--paper:#25282d;--ink:#e8e4dc;--muted:#aaa69f;--line:#484c53;--accent:#e3a34e;--side:#1d2024;--code:#15171a}body{color-scheme:dark}.search{background:#292d32;color:var(--ink)}p code,li code{background:#393d43;color:#f2c17c}mark{background:#6b5625}",
      )
    _ => None
  }
}

///|
pub let default_theme_js : String =
  #|(()=>{const copy=async(text)=>{if(navigator.clipboard&&window.isSecureContext){await navigator.clipboard.writeText(text);return}const area=document.createElement('textarea');area.value=text;area.style.position='fixed';area.style.opacity='0';document.body.append(area);area.select();document.execCommand('copy');area.remove()};document.querySelectorAll('pre>code').forEach(code=>{const button=document.createElement('button');button.className='copy-code';button.type='button';button.textContent='复制';button.setAttribute('aria-label','复制代码');button.addEventListener('click',async()=>{try{await copy(code.textContent);button.textContent='已复制';button.classList.add('copied');setTimeout(()=>{button.textContent='复制';button.classList.remove('copied')},1600)}catch{button.textContent='复制失败'}});code.parentElement.append(button)});const box=document.querySelector('[data-search]');if(!box)return;const rows=[...document.querySelectorAll('[data-title]')];let index=[];const script=document.currentScript;const base=new URL('.',script.src).pathname;const url=new URL('search-index.json',script.src);fetch(url).then(r=>r.ok?r.json():[]).then(data=>{index=data}).catch(()=>{});box.addEventListener('input',()=>{const q=box.value.trim().toLowerCase();const hits=new Set(index.filter(x=>!q||x.title.toLowerCase().includes(q)||x.path.toLowerCase().includes(q)||x.body.toLowerCase().includes(q)).map(x=>x.path));rows.forEach(row=>{const href=row.querySelector('a')?.getAttribute('href')||'';const absolute=decodeURI(new URL(href,location.href).pathname);const path=absolute.startsWith(base)?absolute.slice(base.length):absolute.split('/').pop();row.hidden=!!q&&!row.dataset.title.toLowerCase().includes(q)&&!hits.has(path)})})})();