@zzusp/ccsm 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +236 -236
  3. package/bin/cli.mjs +52 -52
  4. package/dist/assets/{DiskUsage-CKhggLs5.js → DiskUsage-BY6XwffG.js} +2 -2
  5. package/dist/assets/DiskUsage-BY6XwffG.js.map +1 -0
  6. package/dist/assets/{ImportPage-wge4VhZ-.js → ImportPage-Cwq5bx7G.js} +2 -2
  7. package/dist/assets/ImportPage-Cwq5bx7G.js.map +1 -0
  8. package/dist/assets/MarkdownContent-BFu7Nkk_.js +2 -0
  9. package/dist/assets/MarkdownContent-BFu7Nkk_.js.map +1 -0
  10. package/dist/assets/{ProjectMemory-Q4XX40j_.js → ProjectMemory-CcE3KbUK.js} +2 -2
  11. package/dist/assets/ProjectMemory-CcE3KbUK.js.map +1 -0
  12. package/dist/assets/index-CrWxV6sb.css +1 -0
  13. package/dist/assets/index-DTbWl1jb.js +11 -0
  14. package/dist/assets/index-DTbWl1jb.js.map +1 -0
  15. package/dist/assets/markdown-Bag5rX3T.js +30 -0
  16. package/dist/assets/markdown-Bag5rX3T.js.map +1 -0
  17. package/dist/index.html +26 -26
  18. package/package.json +85 -83
  19. package/server/index.ts +130 -130
  20. package/server/lib/active-sessions.test.ts +119 -119
  21. package/server/lib/active-sessions.ts +95 -95
  22. package/server/lib/bundle.test.ts +182 -182
  23. package/server/lib/bundle.ts +86 -86
  24. package/server/lib/claude-paths.test.ts +126 -126
  25. package/server/lib/claude-paths.ts +43 -43
  26. package/server/lib/cleanup-suggestions.ts +131 -131
  27. package/server/lib/constants.ts +8 -8
  28. package/server/lib/delete-project.ts +100 -100
  29. package/server/lib/delete.test.ts +244 -244
  30. package/server/lib/delete.ts +192 -192
  31. package/server/lib/disk-usage.ts +81 -81
  32. package/server/lib/encode-cwd.ts +24 -24
  33. package/server/lib/export-bundle.ts +236 -236
  34. package/server/lib/export-import-bundle.test.ts +337 -337
  35. package/server/lib/fs-size.ts +38 -38
  36. package/server/lib/import-bundle.ts +488 -488
  37. package/server/lib/load-memory.ts +120 -120
  38. package/server/lib/load-session.ts +209 -209
  39. package/server/lib/modified-files.test.ts +280 -280
  40. package/server/lib/modified-files.ts +228 -228
  41. package/server/lib/open-folder.ts +47 -47
  42. package/server/lib/parse-jsonl.ts +160 -139
  43. package/server/lib/port.ts +23 -23
  44. package/server/lib/safe-id.test.ts +41 -41
  45. package/server/lib/safe-id.ts +6 -6
  46. package/server/lib/safe-remove.test.ts +73 -73
  47. package/server/lib/safe-remove.ts +25 -25
  48. package/server/lib/scan.ts +289 -286
  49. package/server/lib/search-all.ts +130 -130
  50. package/server/lib/search-session.ts +203 -203
  51. package/server/lib/system-tags.ts +20 -20
  52. package/server/lib/update.ts +67 -67
  53. package/server/lib/version.test.ts +39 -39
  54. package/server/lib/version.ts +117 -117
  55. package/server/routes/disk-cleanup.ts +54 -54
  56. package/server/routes/disk.ts +9 -9
  57. package/server/routes/import.ts +87 -87
  58. package/server/routes/projects.ts +104 -104
  59. package/server/routes/search.ts +79 -79
  60. package/server/routes/sessions.ts +130 -130
  61. package/server/routes/version.ts +34 -34
  62. package/server/types.ts +1 -1
  63. package/shared/constants.ts +7 -7
  64. package/shared/types.ts +513 -511
  65. package/dist/assets/DiskUsage-CKhggLs5.js.map +0 -1
  66. package/dist/assets/ImportPage-wge4VhZ-.js.map +0 -1
  67. package/dist/assets/ProjectMemory-Q4XX40j_.js.map +0 -1
  68. package/dist/assets/index-7aMrnHJG.js +0 -7
  69. package/dist/assets/index-7aMrnHJG.js.map +0 -1
  70. package/dist/assets/index-BOeI_J4B.css +0 -1
@@ -1,2 +1,2 @@
1
- import{r as u,j as e}from"./react-CPkiFScu.js";import{u as T}from"./query-CS7JQ86v.js";import{u as y,B as Y,d as Z,P as ee,M as R,S as U,f as C,L as te,a as re,b as O,q as Q}from"./index-7aMrnHJG.js";import{b as ne,c as oe}from"./router-DwaHAh1G.js";import"./vendor-Cs8vYp-N.js";const se=/^[\s*-]*\[(?<title>[^\]]+)\]\((?<href>[^)]+)\)\s*[—–\-:]?\s*(?<hook>.*)$/;function we(){const t=y(),{projectId:r}=ne(),i=r??"",[s,l]=oe(),c=T({queryKey:Q.projectMemory(i),queryFn:()=>O(`/api/projects/${encodeURIComponent(i)}/memory`),enabled:!!i}),a=T({queryKey:Q.projects(),queryFn:()=>O("/api/projects")}),d=u.useMemo(()=>{var n;return(n=a.data)==null?void 0:n.find(p=>p.id===i)},[a.data,i]),o=c.data,m=u.useMemo(()=>(o==null?void 0:o.entries)??[],[o==null?void 0:o.entries]),x=u.useMemo(()=>fe((o==null?void 0:o.index)??null),[o==null?void 0:o.index]),f=u.useMemo(()=>{const n=new Map;for(const p of x)p.link&&n.set(p.link.href,p.link.hook);return n},[x]),{rows:h,orphans:j}=u.useMemo(()=>he(x,m),[x,m]),v=s.get("entry"),b=s.get("view"),H=v!==null||b==="raw";function V(n){const p=new URLSearchParams(s);p.set("entry",n),p.delete("view"),l(p)}function _(){const n=new URLSearchParams(s);n.set("view","raw"),n.delete("entry"),l(n)}function F(){const n=new URLSearchParams(s);n.delete("entry"),n.delete("view"),l(n)}const g=u.useMemo(()=>b==="raw"?{kind:"raw"}:v?{kind:"entry",entry:m.find(p=>p.filename===v)??null,filename:v}:null,[v,b,m]),[L,G]=u.useState(""),k=L.trim().toLowerCase(),w=k.length>0,I=u.useMemo(()=>w?h.filter(n=>n.kind==="entry"&&z(n.entry,n.hook,k)):h,[h,w,k]),E=u.useMemo(()=>w?j.filter(n=>z(n,"",k)):j,[j,w,k]),N=m.length,B=!!(o!=null&&o.index),S=N>0||B,J=I.filter(n=>n.kind==="entry").length+E.length,P=(d==null?void 0:d.decodedCwd)??i,q=P.split(/[\\/]+/).filter(Boolean),X=q.at(-1)??P,$=q.slice(0,-1).join("/"),D=u.useMemo(()=>{let n=null;for(const p of m){if(!p.mtime)continue;const M=Date.parse(p.mtime);Number.isFinite(M)&&(n===null||M>n)&&(n=M)}return n?new Date(n).toISOString():null},[m]),K=u.useMemo(()=>{const n=new Set;for(const p of m)n.add(p.type??"other");return n.size},[m]);return e.jsxs("section",{children:[e.jsx(Y,{items:[{label:t("session.crumbProjects"),to:"/"},{label:X,to:`/projects/${encodeURIComponent(i)}`,mono:!0,icon:e.jsx(Z,{})},{label:t("memory.title")}]}),e.jsx("div",{className:"surface-card mt-6 p-6",children:e.jsx(ee,{eyebrow:e.jsx("span",{className:"inline-flex items-center gap-2",children:$?e.jsxs("span",{className:"font-mono normal-case tracking-normal",children:[$,"/"]}):t("memory.action.open")}),title:t("memory.title"),meta:o?e.jsxs(e.Fragment,{children:[e.jsx(R,{label:t("memory.meta.entries"),value:N}),K>0&&e.jsxs(e.Fragment,{children:[e.jsx(U,{}),e.jsx(R,{label:t("memory.meta.types"),value:K})]}),D&&e.jsxs(e.Fragment,{children:[e.jsx(U,{}),e.jsx(R,{label:t("memory.meta.lastUpdate"),value:C(D)})]})]}):null})}),c.isLoading&&e.jsx(te,{label:t("memory.loading"),className:"mt-6"}),c.error&&e.jsxs("p",{className:"mt-6 rounded-md border border-[var(--color-danger)]/40 bg-[var(--color-danger-soft)] px-4 py-3 text-sm text-[var(--color-danger)]",children:[t("common.failedMemory"),": ",c.error.message]}),o&&!S&&e.jsx(de,{}),o&&S&&e.jsx(ae,{rows:I,orphans:E,totalMatched:J,totalEntries:N,query:L,onQuery:G,searchActive:w,indexAvailable:B,onOpenEntry:V,onOpenRaw:_}),H&&g&&e.jsx(ie,{target:g,rawIndex:(o==null?void 0:o.index)??"",hookForEntry:g.kind==="entry"&&g.entry?f.get(g.entry.filename)??null:null,onClose:F,onJumpToCover:()=>{F(),requestAnimationFrame(()=>{const n=document.getElementById("memo-index-card");n==null||n.scrollIntoView({behavior:"smooth",block:"start"})})}})]})}function ae({rows:t,orphans:r,totalMatched:i,totalEntries:s,query:l,onQuery:c,searchActive:a,indexAvailable:d,onOpenEntry:o,onOpenRaw:m}){const x=y(),f=a&&i===0;return e.jsxs("div",{id:"memo-index-card",className:"surface-card mt-6 px-7 py-6",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"eyebrow",children:x("memory.cover.title")}),e.jsx("h2",{className:"mt-0.5 font-display text-[18px] font-medium tracking-tight text-[var(--color-fg-primary)]",children:x("memory.cover.subtitle")})]}),d&&e.jsxs("button",{type:"button",onClick:m,className:"font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-muted)] hover:text-[var(--color-accent-ink)] dark:hover:text-[var(--color-accent)]",children:[x("memory.cover.viewRaw")," ↗"]})]}),e.jsxs("div",{className:"mt-4 flex flex-wrap items-center gap-3",children:[e.jsxs("div",{className:"flex flex-1 min-w-[14rem] items-center gap-2 border-b border-[var(--color-hairline)] py-1.5 transition focus-within:border-[var(--color-accent)]",children:[e.jsx(xe,{className:"text-[var(--color-fg-muted)]"}),e.jsx("input",{type:"search",value:l,onChange:h=>c(h.target.value),placeholder:x("memory.search.placeholder"),className:"w-full bg-transparent text-sm text-[var(--color-fg-primary)] placeholder:text-[var(--color-fg-faint)] focus:outline-none"})]}),e.jsx("span",{className:"font-mono text-[10.5px] uppercase tracking-[0.18em] tabular-nums text-[var(--color-fg-faint)]",children:a?x("memory.list.count",{n:i,total:s}):`${s} ${x("memory.meta.entries").toLowerCase()}`})]}),e.jsx("div",{className:"rule-dotted mt-5","aria-hidden":!0}),f?e.jsx("p",{className:"mt-6 text-sm text-[var(--color-fg-muted)]",children:x("memory.list.noResults")}):e.jsxs("ul",{className:"mt-3",children:[t.map((h,j)=>e.jsx(W,{row:h,onOpenEntry:o},j)),r.length>0&&e.jsxs(e.Fragment,{children:[!a&&t.length>0&&e.jsx("li",{"aria-hidden":!0,className:"h-3"}),e.jsx("li",{className:"pt-3 pb-2",children:e.jsxs("div",{className:"flex items-baseline gap-3",children:[e.jsx("span",{className:"font-mono text-[10.5px] uppercase tracking-[0.18em] text-[var(--color-fg-faint)]",children:x("memory.cover.orphan")}),e.jsxs("span",{className:"font-mono text-[10.5px] tabular-nums text-[var(--color-fg-faint)]",children:["· ",r.length]}),e.jsx("span",{"aria-hidden":!0,className:"ml-2 h-px flex-1 bg-[var(--color-hairline)]"})]})}),r.map(h=>e.jsx(W,{row:{kind:"entry",entry:h,hook:""},onOpenEntry:o},h.filename))]})]})]})}function W({row:t,onOpenEntry:r}){const i=y();if(t.kind==="spacer")return e.jsx("li",{"aria-hidden":!0,className:"h-2"});if(t.kind==="heading")return e.jsx("li",{className:"pt-4 pb-1",children:e.jsx("div",{className:"font-mono text-[10.5px] uppercase tracking-[0.18em] text-[var(--color-fg-muted)]",children:t.text})});if(t.kind==="text")return e.jsx("li",{className:"px-1 py-0.5 text-[12.5px] text-[var(--color-fg-faint)] whitespace-pre-wrap break-words",children:t.text});if(t.kind==="missing")return e.jsxs("li",{title:i("memory.cover.missingTooltip"),className:"flex items-baseline gap-3 px-2 py-1.5 text-[var(--color-fg-faint)]",children:[e.jsx("span",{className:"text-[14px] font-medium line-through decoration-[var(--color-fg-faint)]/50",children:t.title}),t.hook&&e.jsx("span",{className:"truncate text-[12px]",children:t.hook})]});const s=t.entry,l=s.type??"other",c=s.name??s.filename,a=t.hook||s.description||"";return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>r(s.filename),className:`memo-row memo-type-${l}`,children:[e.jsx("span",{"aria-hidden":!0,className:"memo-row-dot"}),e.jsxs("div",{className:"memo-row-content",children:[e.jsxs("div",{className:"memo-row-headline",children:[e.jsx("span",{className:"memo-row-title",children:c}),s.mtime&&e.jsx("span",{className:"memo-row-meta-inline",children:C(s.mtime)}),e.jsx(A,{k:l})]}),a&&e.jsx("p",{className:"memo-row-hook",children:a})]}),e.jsx("span",{"aria-hidden":!0,className:"memo-row-chevron",children:"↗"})]})})}function A({k:t}){const r=y(),i=r(t==="user"?"memory.type.user":t==="feedback"?"memory.type.feedback":t==="project"?"memory.type.project":t==="reference"?"memory.type.reference":"memory.type.other");return e.jsx("span",{className:"memo-chip",children:i})}function ie({target:t,rawIndex:r,hookForEntry:i,onClose:s,onJumpToCover:l}){var o;const c=y(),a=u.useRef(null);u.useEffect(()=>{const m=f=>{f.key==="Escape"&&(f.preventDefault(),s())};window.addEventListener("keydown",m);const x=document.body.style.overflow;return document.body.style.overflow="hidden",requestAnimationFrame(()=>{var f;return(f=a.current)==null?void 0:f.focus()}),()=>{window.removeEventListener("keydown",m),document.body.style.overflow=x}},[s]);const d=t.kind==="entry"?((o=t.entry)==null?void 0:o.type)??"other":"reference";return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"memo-drawer-backdrop",onClick:s,"aria-hidden":!0}),e.jsxs("div",{ref:a,role:"dialog","aria-modal":"true",tabIndex:-1,className:`memo-drawer-panel memo-type-${d} focus:outline-none`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-3 border-b border-[var(--color-hairline)] px-7 pt-7 pb-5",children:[e.jsx("div",{className:"min-w-0 flex-1",children:t.kind==="entry"?e.jsxs(e.Fragment,{children:[e.jsx(A,{k:d}),t.entry?e.jsxs(e.Fragment,{children:[e.jsx("h2",{className:"mt-3 font-display text-[24px] font-light leading-tight tracking-tight text-[var(--color-fg-primary)]",children:t.entry.name??t.entry.filename}),e.jsxs("p",{className:"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]",children:[t.entry.filename," · ",re(t.entry.bytes),t.entry.mtime?` · ${C(t.entry.mtime)}`:""]})]}):e.jsxs(e.Fragment,{children:[e.jsx("h2",{className:"mt-3 font-display text-[22px] font-light leading-tight text-[var(--color-fg-primary)]",children:c("memory.drawer.notFound.title")}),e.jsx("p",{className:"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]",children:t.filename})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"memo-chip memo-type-reference",children:c("memory.cover.title")}),e.jsx("h2",{className:"mt-3 font-display text-[24px] font-light leading-tight tracking-tight text-[var(--color-fg-primary)]",children:c("memory.raw.title")}),e.jsx("p",{className:"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]",children:c("memory.raw.subtitle")})]})}),e.jsx("button",{type:"button",onClick:s,"aria-label":c("memory.drawer.close"),className:"rounded-md p-2 text-[var(--color-fg-muted)] hover:bg-[var(--color-sunken)] hover:text-[var(--color-fg-primary)]",children:e.jsx(pe,{})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-7 py-6",children:t.kind==="entry"&&t.entry?e.jsx(le,{entry:t.entry,hookForEntry:i,onJumpToCover:l}):t.kind==="entry"?e.jsx(ce,{filename:t.filename,onJumpToCover:l}):e.jsx(me,{source:r})})]})]})}function le({entry:t,hookForEntry:r,onJumpToCover:i}){const s=y(),l=t.body.trim();return e.jsxs("div",{children:[t.description&&e.jsx("p",{className:"text-[14px] text-[var(--color-fg-secondary)]",children:t.description}),e.jsx("pre",{className:"whitespace-pre-wrap break-words rounded-[var(--radius-input)] border border-[var(--color-hairline)] bg-[var(--color-sunken)] px-4 py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--color-fg-primary)] "+(t.description?"mt-5":""),children:l||"—"}),r&&e.jsxs("div",{className:"mt-7",children:[e.jsx("div",{className:"rule-dotted","aria-hidden":!0}),e.jsxs("div",{className:"mt-4 flex items-baseline justify-between gap-3",children:[e.jsx("div",{className:"eyebrow",children:s("memory.drawer.indexHook")}),e.jsxs("button",{type:"button",onClick:i,className:"font-mono text-[10.5px] uppercase tracking-[0.16em] text-[var(--color-fg-muted)] hover:text-[var(--color-accent-ink)] dark:hover:text-[var(--color-accent)]",children:[s("memory.cover.title")," ↑"]})]}),e.jsx("p",{className:"mt-1.5 text-[13px] text-[var(--color-fg-secondary)]",children:r})]})]})}function ce({filename:t,onJumpToCover:r}){const i=y();return e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--color-fg-secondary)]",children:i("memory.drawer.notFound.body")}),e.jsx("p",{className:"mt-3 font-mono text-[12px] text-[var(--color-fg-faint)]",children:t}),e.jsxs("button",{type:"button",onClick:r,className:"mt-5 inline-flex items-center gap-1.5 rounded-[var(--radius-control)] border border-[var(--color-hairline)] px-3 py-1.5 text-[11px] font-medium uppercase tracking-[0.14em] text-[var(--color-fg-secondary)] hover:border-[var(--color-hairline-strong)] hover:text-[var(--color-fg-primary)]",children:[i("memory.cover.title")," ↑"]})]})}function me({source:t}){const r=t.trim();return e.jsx("pre",{className:"whitespace-pre-wrap break-words rounded-[var(--radius-input)] border border-[var(--color-hairline)] bg-[var(--color-sunken)] px-4 py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--color-fg-primary)]",children:r||"—"})}function de(){const t=y();return e.jsxs("div",{className:"surface-card mt-6 px-8 py-14 text-center",children:[e.jsx("div",{className:"mx-auto flex h-12 w-12 items-center justify-center rounded-full border border-[var(--color-hairline)] bg-[var(--color-sunken)] text-[var(--color-fg-muted)]",children:e.jsx(ue,{})}),e.jsx("h2",{className:"mt-5 font-display text-[20px] font-light tracking-tight text-[var(--color-fg-primary)]",children:t("memory.empty.title")}),e.jsx("p",{className:"mx-auto mt-3 max-w-xl text-[13px] leading-relaxed text-[var(--color-fg-secondary)]",children:t("memory.empty.body")})]})}function xe({className:t=""}){return e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",className:t,"aria-hidden":!0,children:[e.jsx("circle",{cx:"11",cy:"11",r:"6.2"}),e.jsx("path",{d:"M20 20l-4.3-4.3"})]})}function pe(){return e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":!0,children:e.jsx("path",{d:"M6 6l12 12M18 6L6 18"})})}function ue(){return e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:e.jsx("path",{d:"M6 4h12v17l-6-4-6 4z"})})}function z(t,r,i){return[t.name??"",t.filename,t.description??"",t.body,r].some(l=>l.toLowerCase().includes(i))}function he(t,r){const i=new Map(r.map(a=>[a.filename,a])),s=new Set,l=[];for(const a of t){if(a.link){const m=i.get(a.link.href);m?(l.push({kind:"entry",entry:m,hook:a.link.hook}),s.add(m.filename)):l.push({kind:"missing",title:a.link.title,hook:a.link.hook});continue}const d=a.raw.trim();if(!d){l.push({kind:"spacer"});continue}const o=/^(#{1,6})\s+(.+?)\s*$/.exec(d);o?l.push({kind:"heading",text:o[2]}):l.push({kind:"text",text:a.raw})}const c=r.filter(a=>!s.has(a.filename));return{rows:l,orphans:c}}function fe(t){var i,s,l;if(!t)return[];const r=[];for(const c of t.split(/\r?\n/)){const a=c.trimEnd();if(a.trim()===""){const x=r[r.length-1];x&&(x.link||x.raw.trim()!=="")&&r.push({raw:"",link:null});continue}const d=se.exec(a),o=(i=d==null?void 0:d.groups)==null?void 0:i.title,m=(s=d==null?void 0:d.groups)==null?void 0:s.href;d&&o&&m?r.push({raw:a,link:{title:o.trim(),href:m.trim(),hook:(((l=d.groups)==null?void 0:l.hook)??"").trim()}}):r.push({raw:a,link:null})}for(;r.length>0;){const c=r[r.length-1];if(c&&!c.link&&c.raw.trim()==="")r.pop();else break}return r}export{we as default};
2
- //# sourceMappingURL=ProjectMemory-Q4XX40j_.js.map
1
+ import{r as u,j as e}from"./react-CPkiFScu.js";import{u as T}from"./query-CS7JQ86v.js";import{u as y,B as Y,d as Z,P as ee,M as R,S as U,f as C,L as te,a as re,b as O,q as Q}from"./index-DTbWl1jb.js";import{b as ne,c as oe}from"./router-DwaHAh1G.js";import"./vendor-Cs8vYp-N.js";const se=/^[\s*-]*\[(?<title>[^\]]+)\]\((?<href>[^)]+)\)\s*[—–\-:]?\s*(?<hook>.*)$/;function we(){const t=y(),{projectId:r}=ne(),i=r??"",[s,l]=oe(),c=T({queryKey:Q.projectMemory(i),queryFn:()=>O(`/api/projects/${encodeURIComponent(i)}/memory`),enabled:!!i}),a=T({queryKey:Q.projects(),queryFn:()=>O("/api/projects")}),d=u.useMemo(()=>{var n;return(n=a.data)==null?void 0:n.find(p=>p.id===i)},[a.data,i]),o=c.data,m=u.useMemo(()=>(o==null?void 0:o.entries)??[],[o==null?void 0:o.entries]),x=u.useMemo(()=>fe((o==null?void 0:o.index)??null),[o==null?void 0:o.index]),f=u.useMemo(()=>{const n=new Map;for(const p of x)p.link&&n.set(p.link.href,p.link.hook);return n},[x]),{rows:h,orphans:j}=u.useMemo(()=>he(x,m),[x,m]),v=s.get("entry"),b=s.get("view"),H=v!==null||b==="raw";function V(n){const p=new URLSearchParams(s);p.set("entry",n),p.delete("view"),l(p)}function _(){const n=new URLSearchParams(s);n.set("view","raw"),n.delete("entry"),l(n)}function F(){const n=new URLSearchParams(s);n.delete("entry"),n.delete("view"),l(n)}const g=u.useMemo(()=>b==="raw"?{kind:"raw"}:v?{kind:"entry",entry:m.find(p=>p.filename===v)??null,filename:v}:null,[v,b,m]),[L,G]=u.useState(""),k=L.trim().toLowerCase(),w=k.length>0,I=u.useMemo(()=>w?h.filter(n=>n.kind==="entry"&&z(n.entry,n.hook,k)):h,[h,w,k]),E=u.useMemo(()=>w?j.filter(n=>z(n,"",k)):j,[j,w,k]),N=m.length,B=!!(o!=null&&o.index),S=N>0||B,J=I.filter(n=>n.kind==="entry").length+E.length,P=(d==null?void 0:d.decodedCwd)??i,q=P.split(/[\\/]+/).filter(Boolean),X=q.at(-1)??P,$=q.slice(0,-1).join("/"),D=u.useMemo(()=>{let n=null;for(const p of m){if(!p.mtime)continue;const M=Date.parse(p.mtime);Number.isFinite(M)&&(n===null||M>n)&&(n=M)}return n?new Date(n).toISOString():null},[m]),K=u.useMemo(()=>{const n=new Set;for(const p of m)n.add(p.type??"other");return n.size},[m]);return e.jsxs("section",{children:[e.jsx(Y,{items:[{label:t("session.crumbProjects"),to:"/"},{label:X,to:`/projects/${encodeURIComponent(i)}`,mono:!0,icon:e.jsx(Z,{})},{label:t("memory.title")}]}),e.jsx("div",{className:"surface-card mt-6 p-6",children:e.jsx(ee,{eyebrow:e.jsx("span",{className:"inline-flex items-center gap-2",children:$?e.jsxs("span",{className:"font-mono normal-case tracking-normal",children:[$,"/"]}):t("memory.action.open")}),title:t("memory.title"),meta:o?e.jsxs(e.Fragment,{children:[e.jsx(R,{label:t("memory.meta.entries"),value:N}),K>0&&e.jsxs(e.Fragment,{children:[e.jsx(U,{}),e.jsx(R,{label:t("memory.meta.types"),value:K})]}),D&&e.jsxs(e.Fragment,{children:[e.jsx(U,{}),e.jsx(R,{label:t("memory.meta.lastUpdate"),value:C(D)})]})]}):null})}),c.isLoading&&e.jsx(te,{label:t("memory.loading"),className:"mt-6"}),c.error&&e.jsxs("p",{className:"mt-6 rounded-md border border-[var(--color-danger)]/40 bg-[var(--color-danger-soft)] px-4 py-3 text-sm text-[var(--color-danger)]",children:[t("common.failedMemory"),": ",c.error.message]}),o&&!S&&e.jsx(de,{}),o&&S&&e.jsx(ae,{rows:I,orphans:E,totalMatched:J,totalEntries:N,query:L,onQuery:G,searchActive:w,indexAvailable:B,onOpenEntry:V,onOpenRaw:_}),H&&g&&e.jsx(ie,{target:g,rawIndex:(o==null?void 0:o.index)??"",hookForEntry:g.kind==="entry"&&g.entry?f.get(g.entry.filename)??null:null,onClose:F,onJumpToCover:()=>{F(),requestAnimationFrame(()=>{const n=document.getElementById("memo-index-card");n==null||n.scrollIntoView({behavior:"smooth",block:"start"})})}})]})}function ae({rows:t,orphans:r,totalMatched:i,totalEntries:s,query:l,onQuery:c,searchActive:a,indexAvailable:d,onOpenEntry:o,onOpenRaw:m}){const x=y(),f=a&&i===0;return e.jsxs("div",{id:"memo-index-card",className:"surface-card mt-6 px-7 py-6",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"eyebrow",children:x("memory.cover.title")}),e.jsx("h2",{className:"mt-0.5 font-display text-[18px] font-medium tracking-tight text-[var(--color-fg-primary)]",children:x("memory.cover.subtitle")})]}),d&&e.jsxs("button",{type:"button",onClick:m,className:"font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-muted)] hover:text-[var(--color-accent-ink)] dark:hover:text-[var(--color-accent)]",children:[x("memory.cover.viewRaw")," ↗"]})]}),e.jsxs("div",{className:"mt-4 flex flex-wrap items-center gap-3",children:[e.jsxs("div",{className:"flex flex-1 min-w-[14rem] items-center gap-2 border-b border-[var(--color-hairline)] py-1.5 transition focus-within:border-[var(--color-accent)]",children:[e.jsx(xe,{className:"text-[var(--color-fg-muted)]"}),e.jsx("input",{type:"search",value:l,onChange:h=>c(h.target.value),placeholder:x("memory.search.placeholder"),className:"w-full bg-transparent text-sm text-[var(--color-fg-primary)] placeholder:text-[var(--color-fg-faint)] focus:outline-none"})]}),e.jsx("span",{className:"font-mono text-[10.5px] uppercase tracking-[0.18em] tabular-nums text-[var(--color-fg-faint)]",children:a?x("memory.list.count",{n:i,total:s}):`${s} ${x("memory.meta.entries").toLowerCase()}`})]}),e.jsx("div",{className:"rule-dotted mt-5","aria-hidden":!0}),f?e.jsx("p",{className:"mt-6 text-sm text-[var(--color-fg-muted)]",children:x("memory.list.noResults")}):e.jsxs("ul",{className:"mt-3",children:[t.map((h,j)=>e.jsx(W,{row:h,onOpenEntry:o},j)),r.length>0&&e.jsxs(e.Fragment,{children:[!a&&t.length>0&&e.jsx("li",{"aria-hidden":!0,className:"h-3"}),e.jsx("li",{className:"pt-3 pb-2",children:e.jsxs("div",{className:"flex items-baseline gap-3",children:[e.jsx("span",{className:"font-mono text-[10.5px] uppercase tracking-[0.18em] text-[var(--color-fg-faint)]",children:x("memory.cover.orphan")}),e.jsxs("span",{className:"font-mono text-[10.5px] tabular-nums text-[var(--color-fg-faint)]",children:["· ",r.length]}),e.jsx("span",{"aria-hidden":!0,className:"ml-2 h-px flex-1 bg-[var(--color-hairline)]"})]})}),r.map(h=>e.jsx(W,{row:{kind:"entry",entry:h,hook:""},onOpenEntry:o},h.filename))]})]})]})}function W({row:t,onOpenEntry:r}){const i=y();if(t.kind==="spacer")return e.jsx("li",{"aria-hidden":!0,className:"h-2"});if(t.kind==="heading")return e.jsx("li",{className:"pt-4 pb-1",children:e.jsx("div",{className:"font-mono text-[10.5px] uppercase tracking-[0.18em] text-[var(--color-fg-muted)]",children:t.text})});if(t.kind==="text")return e.jsx("li",{className:"px-1 py-0.5 text-[12.5px] text-[var(--color-fg-faint)] whitespace-pre-wrap break-words",children:t.text});if(t.kind==="missing")return e.jsxs("li",{title:i("memory.cover.missingTooltip"),className:"flex items-baseline gap-3 px-2 py-1.5 text-[var(--color-fg-faint)]",children:[e.jsx("span",{className:"text-[14px] font-medium line-through decoration-[var(--color-fg-faint)]/50",children:t.title}),t.hook&&e.jsx("span",{className:"truncate text-[12px]",children:t.hook})]});const s=t.entry,l=s.type??"other",c=s.name??s.filename,a=t.hook||s.description||"";return e.jsx("li",{children:e.jsxs("button",{type:"button",onClick:()=>r(s.filename),className:`memo-row memo-type-${l}`,children:[e.jsx("span",{"aria-hidden":!0,className:"memo-row-dot"}),e.jsxs("div",{className:"memo-row-content",children:[e.jsxs("div",{className:"memo-row-headline",children:[e.jsx("span",{className:"memo-row-title",children:c}),s.mtime&&e.jsx("span",{className:"memo-row-meta-inline",children:C(s.mtime)}),e.jsx(A,{k:l})]}),a&&e.jsx("p",{className:"memo-row-hook",children:a})]}),e.jsx("span",{"aria-hidden":!0,className:"memo-row-chevron",children:"↗"})]})})}function A({k:t}){const r=y(),i=r(t==="user"?"memory.type.user":t==="feedback"?"memory.type.feedback":t==="project"?"memory.type.project":t==="reference"?"memory.type.reference":"memory.type.other");return e.jsx("span",{className:"memo-chip",children:i})}function ie({target:t,rawIndex:r,hookForEntry:i,onClose:s,onJumpToCover:l}){var o;const c=y(),a=u.useRef(null);u.useEffect(()=>{const m=f=>{f.key==="Escape"&&(f.preventDefault(),s())};window.addEventListener("keydown",m);const x=document.body.style.overflow;return document.body.style.overflow="hidden",requestAnimationFrame(()=>{var f;return(f=a.current)==null?void 0:f.focus()}),()=>{window.removeEventListener("keydown",m),document.body.style.overflow=x}},[s]);const d=t.kind==="entry"?((o=t.entry)==null?void 0:o.type)??"other":"reference";return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"memo-drawer-backdrop",onClick:s,"aria-hidden":!0}),e.jsxs("div",{ref:a,role:"dialog","aria-modal":"true",tabIndex:-1,className:`memo-drawer-panel memo-type-${d} focus:outline-none`,children:[e.jsxs("div",{className:"flex items-start justify-between gap-3 border-b border-[var(--color-hairline)] px-7 pt-7 pb-5",children:[e.jsx("div",{className:"min-w-0 flex-1",children:t.kind==="entry"?e.jsxs(e.Fragment,{children:[e.jsx(A,{k:d}),t.entry?e.jsxs(e.Fragment,{children:[e.jsx("h2",{className:"mt-3 font-display text-[24px] font-light leading-tight tracking-tight text-[var(--color-fg-primary)]",children:t.entry.name??t.entry.filename}),e.jsxs("p",{className:"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]",children:[t.entry.filename," · ",re(t.entry.bytes),t.entry.mtime?` · ${C(t.entry.mtime)}`:""]})]}):e.jsxs(e.Fragment,{children:[e.jsx("h2",{className:"mt-3 font-display text-[22px] font-light leading-tight text-[var(--color-fg-primary)]",children:c("memory.drawer.notFound.title")}),e.jsx("p",{className:"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]",children:t.filename})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"memo-chip memo-type-reference",children:c("memory.cover.title")}),e.jsx("h2",{className:"mt-3 font-display text-[24px] font-light leading-tight tracking-tight text-[var(--color-fg-primary)]",children:c("memory.raw.title")}),e.jsx("p",{className:"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]",children:c("memory.raw.subtitle")})]})}),e.jsx("button",{type:"button",onClick:s,"aria-label":c("memory.drawer.close"),className:"rounded-md p-2 text-[var(--color-fg-muted)] hover:bg-[var(--color-sunken)] hover:text-[var(--color-fg-primary)]",children:e.jsx(pe,{})})]}),e.jsx("div",{className:"flex-1 overflow-y-auto px-7 py-6",children:t.kind==="entry"&&t.entry?e.jsx(le,{entry:t.entry,hookForEntry:i,onJumpToCover:l}):t.kind==="entry"?e.jsx(ce,{filename:t.filename,onJumpToCover:l}):e.jsx(me,{source:r})})]})]})}function le({entry:t,hookForEntry:r,onJumpToCover:i}){const s=y(),l=t.body.trim();return e.jsxs("div",{children:[t.description&&e.jsx("p",{className:"text-[14px] text-[var(--color-fg-secondary)]",children:t.description}),e.jsx("pre",{className:"whitespace-pre-wrap break-words rounded-[var(--radius-input)] border border-[var(--color-hairline)] bg-[var(--color-sunken)] px-4 py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--color-fg-primary)] "+(t.description?"mt-5":""),children:l||"—"}),r&&e.jsxs("div",{className:"mt-7",children:[e.jsx("div",{className:"rule-dotted","aria-hidden":!0}),e.jsxs("div",{className:"mt-4 flex items-baseline justify-between gap-3",children:[e.jsx("div",{className:"eyebrow",children:s("memory.drawer.indexHook")}),e.jsxs("button",{type:"button",onClick:i,className:"font-mono text-[10.5px] uppercase tracking-[0.16em] text-[var(--color-fg-muted)] hover:text-[var(--color-accent-ink)] dark:hover:text-[var(--color-accent)]",children:[s("memory.cover.title")," ↑"]})]}),e.jsx("p",{className:"mt-1.5 text-[13px] text-[var(--color-fg-secondary)]",children:r})]})]})}function ce({filename:t,onJumpToCover:r}){const i=y();return e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-[var(--color-fg-secondary)]",children:i("memory.drawer.notFound.body")}),e.jsx("p",{className:"mt-3 font-mono text-[12px] text-[var(--color-fg-faint)]",children:t}),e.jsxs("button",{type:"button",onClick:r,className:"mt-5 inline-flex items-center gap-1.5 rounded-[var(--radius-control)] border border-[var(--color-hairline)] px-3 py-1.5 text-[11px] font-medium uppercase tracking-[0.14em] text-[var(--color-fg-secondary)] hover:border-[var(--color-hairline-strong)] hover:text-[var(--color-fg-primary)]",children:[i("memory.cover.title")," ↑"]})]})}function me({source:t}){const r=t.trim();return e.jsx("pre",{className:"whitespace-pre-wrap break-words rounded-[var(--radius-input)] border border-[var(--color-hairline)] bg-[var(--color-sunken)] px-4 py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--color-fg-primary)]",children:r||"—"})}function de(){const t=y();return e.jsxs("div",{className:"surface-card mt-6 px-8 py-14 text-center",children:[e.jsx("div",{className:"mx-auto flex h-12 w-12 items-center justify-center rounded-full border border-[var(--color-hairline)] bg-[var(--color-sunken)] text-[var(--color-fg-muted)]",children:e.jsx(ue,{})}),e.jsx("h2",{className:"mt-5 font-display text-[20px] font-light tracking-tight text-[var(--color-fg-primary)]",children:t("memory.empty.title")}),e.jsx("p",{className:"mx-auto mt-3 max-w-xl text-[13px] leading-relaxed text-[var(--color-fg-secondary)]",children:t("memory.empty.body")})]})}function xe({className:t=""}){return e.jsxs("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.7",strokeLinecap:"round",className:t,"aria-hidden":!0,children:[e.jsx("circle",{cx:"11",cy:"11",r:"6.2"}),e.jsx("path",{d:"M20 20l-4.3-4.3"})]})}function pe(){return e.jsx("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round","aria-hidden":!0,children:e.jsx("path",{d:"M6 6l12 12M18 6L6 18"})})}function ue(){return e.jsx("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,children:e.jsx("path",{d:"M6 4h12v17l-6-4-6 4z"})})}function z(t,r,i){return[t.name??"",t.filename,t.description??"",t.body,r].some(l=>l.toLowerCase().includes(i))}function he(t,r){const i=new Map(r.map(a=>[a.filename,a])),s=new Set,l=[];for(const a of t){if(a.link){const m=i.get(a.link.href);m?(l.push({kind:"entry",entry:m,hook:a.link.hook}),s.add(m.filename)):l.push({kind:"missing",title:a.link.title,hook:a.link.hook});continue}const d=a.raw.trim();if(!d){l.push({kind:"spacer"});continue}const o=/^(#{1,6})\s+(.+?)\s*$/.exec(d);o?l.push({kind:"heading",text:o[2]}):l.push({kind:"text",text:a.raw})}const c=r.filter(a=>!s.has(a.filename));return{rows:l,orphans:c}}function fe(t){var i,s,l;if(!t)return[];const r=[];for(const c of t.split(/\r?\n/)){const a=c.trimEnd();if(a.trim()===""){const x=r[r.length-1];x&&(x.link||x.raw.trim()!=="")&&r.push({raw:"",link:null});continue}const d=se.exec(a),o=(i=d==null?void 0:d.groups)==null?void 0:i.title,m=(s=d==null?void 0:d.groups)==null?void 0:s.href;d&&o&&m?r.push({raw:a,link:{title:o.trim(),href:m.trim(),hook:(((l=d.groups)==null?void 0:l.hook)??"").trim()}}):r.push({raw:a,link:null})}for(;r.length>0;){const c=r[r.length-1];if(c&&!c.link&&c.raw.trim()==="")r.pop();else break}return r}export{we as default};
2
+ //# sourceMappingURL=ProjectMemory-CcE3KbUK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectMemory-CcE3KbUK.js","sources":["../../web/src/routes/ProjectMemory.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useParams, useSearchParams } from 'react-router-dom';\nimport Breadcrumbs, { BreadcrumbFolderIcon } from '../components/Breadcrumbs.tsx';\nimport { Loading } from '../components/Loading.tsx';\nimport PageHeader, { MetaItem, Sep } from '../components/PageHeader.tsx';\nimport {\n api,\n type MemoryEntry,\n type MemoryResponse,\n type MemoryType,\n type ProjectSummary,\n} from '../lib/api.ts';\nimport { formatBytes, formatRelativeTime } from '../lib/format.ts';\nimport { useT } from '../lib/i18n.ts';\nimport { queryKeys } from '../lib/query-keys.ts';\n\ntype GroupKey = MemoryType | 'other';\n\ninterface ParsedLink {\n title: string;\n href: string;\n hook: string;\n}\ninterface IndexLine {\n raw: string;\n link: ParsedLink | null;\n}\n\ntype Row =\n | { kind: 'entry'; entry: MemoryEntry; hook: string }\n | { kind: 'missing'; title: string; hook: string }\n | { kind: 'heading'; text: string }\n | { kind: 'text'; text: string }\n | { kind: 'spacer' };\n\nconst LINK_RE = /^[\\s*-]*\\[(?<title>[^\\]]+)\\]\\((?<href>[^)]+)\\)\\s*[—–\\-:]?\\s*(?<hook>.*)$/;\n\nexport default function ProjectMemoryRoute() {\n const t = useT();\n const { projectId } = useParams<{ projectId: string }>();\n const id = projectId ?? '';\n const [searchParams, setSearchParams] = useSearchParams();\n\n const memoryQuery = useQuery({\n queryKey: queryKeys.projectMemory(id),\n queryFn: () => api<MemoryResponse>(`/api/projects/${encodeURIComponent(id)}/memory`),\n enabled: !!id,\n });\n\n const projectsQuery = useQuery({\n queryKey: queryKeys.projects(),\n queryFn: () => api<ProjectSummary[]>('/api/projects'),\n });\n const project = useMemo(\n () => projectsQuery.data?.find((p) => p.id === id),\n [projectsQuery.data, id],\n );\n\n const data = memoryQuery.data;\n const entries = useMemo(() => data?.entries ?? [], [data?.entries]);\n const indexLines = useMemo(() => parseIndex(data?.index ?? null), [data?.index]);\n\n const hookByFilename = useMemo(() => {\n const m = new Map<string, string>();\n for (const line of indexLines) {\n if (line.link) m.set(line.link.href, line.link.hook);\n }\n return m;\n }, [indexLines]);\n\n const { rows, orphans } = useMemo(\n () => buildRows(indexLines, entries),\n [indexLines, entries],\n );\n\n // URL-driven drawer state\n const drawerEntry = searchParams.get('entry');\n const drawerView = searchParams.get('view');\n const drawerOpen = drawerEntry !== null || drawerView === 'raw';\n\n function openEntry(filename: string) {\n const next = new URLSearchParams(searchParams);\n next.set('entry', filename);\n next.delete('view');\n setSearchParams(next);\n }\n function openRaw() {\n const next = new URLSearchParams(searchParams);\n next.set('view', 'raw');\n next.delete('entry');\n setSearchParams(next);\n }\n function closeDrawer() {\n const next = new URLSearchParams(searchParams);\n next.delete('entry');\n next.delete('view');\n setSearchParams(next);\n }\n\n const drawerTarget = useMemo(() => {\n if (drawerView === 'raw') return { kind: 'raw' as const };\n if (drawerEntry) {\n const entry = entries.find((e) => e.filename === drawerEntry) ?? null;\n return { kind: 'entry' as const, entry, filename: drawerEntry };\n }\n return null;\n }, [drawerEntry, drawerView, entries]);\n\n const [query, setQuery] = useState('');\n const trimmed = query.trim().toLowerCase();\n const searchActive = trimmed.length > 0;\n\n const filteredRows: Row[] = useMemo(() => {\n if (!searchActive) return rows;\n return rows.filter((r) => r.kind === 'entry' && matchEntry(r.entry, r.hook, trimmed));\n }, [rows, searchActive, trimmed]);\n\n const filteredOrphans = useMemo(\n () => (searchActive ? orphans.filter((e) => matchEntry(e, '', trimmed)) : orphans),\n [orphans, searchActive, trimmed],\n );\n\n const totalEntries = entries.length;\n const indexAvailable = !!data?.index;\n const hasContent = totalEntries > 0 || indexAvailable;\n\n const totalMatched =\n filteredRows.filter((r) => r.kind === 'entry').length + filteredOrphans.length;\n\n const cwd = project?.decodedCwd ?? id;\n const parts = cwd.split(/[\\\\/]+/).filter(Boolean);\n const tail = parts.at(-1) ?? cwd;\n const head = parts.slice(0, -1).join('/');\n\n const lastUpdate = useMemo(() => {\n let latest: number | null = null;\n for (const e of entries) {\n if (!e.mtime) continue;\n const t = Date.parse(e.mtime);\n if (Number.isFinite(t) && (latest === null || t > latest)) latest = t;\n }\n return latest ? new Date(latest).toISOString() : null;\n }, [entries]);\n\n const typeCount = useMemo(() => {\n const s = new Set<GroupKey>();\n for (const e of entries) s.add((e.type ?? 'other') as GroupKey);\n return s.size;\n }, [entries]);\n\n return (\n <section>\n <Breadcrumbs\n items={[\n { label: t('session.crumbProjects'), to: '/' },\n {\n label: tail,\n to: `/projects/${encodeURIComponent(id)}`,\n mono: true,\n icon: <BreadcrumbFolderIcon />,\n },\n { label: t('memory.title') },\n ]}\n />\n\n <div className=\"surface-card mt-6 p-6\">\n <PageHeader\n eyebrow={\n <span className=\"inline-flex items-center gap-2\">\n {head ? (\n <span className=\"font-mono normal-case tracking-normal\">{head}/</span>\n ) : (\n t('memory.action.open')\n )}\n </span>\n }\n title={t('memory.title')}\n meta={\n data ? (\n <>\n <MetaItem label={t('memory.meta.entries')} value={totalEntries} />\n {typeCount > 0 && (\n <>\n <Sep />\n <MetaItem label={t('memory.meta.types')} value={typeCount} />\n </>\n )}\n {lastUpdate && (\n <>\n <Sep />\n <MetaItem\n label={t('memory.meta.lastUpdate')}\n value={formatRelativeTime(lastUpdate)}\n />\n </>\n )}\n </>\n ) : null\n }\n />\n </div>\n\n {memoryQuery.isLoading && <Loading label={t('memory.loading')} className=\"mt-6\" />}\n {memoryQuery.error && (\n <p className=\"mt-6 rounded-md border border-[var(--color-danger)]/40 bg-[var(--color-danger-soft)] px-4 py-3 text-sm text-[var(--color-danger)]\">\n {t('common.failedMemory')}: {(memoryQuery.error as Error).message}\n </p>\n )}\n\n {data && !hasContent && <EmptyState />}\n\n {data && hasContent && (\n <IndexCard\n rows={filteredRows}\n orphans={filteredOrphans}\n totalMatched={totalMatched}\n totalEntries={totalEntries}\n query={query}\n onQuery={setQuery}\n searchActive={searchActive}\n indexAvailable={indexAvailable}\n onOpenEntry={openEntry}\n onOpenRaw={openRaw}\n />\n )}\n\n {drawerOpen && drawerTarget && (\n <Drawer\n target={drawerTarget}\n rawIndex={data?.index ?? ''}\n hookForEntry={\n drawerTarget.kind === 'entry' && drawerTarget.entry\n ? hookByFilename.get(drawerTarget.entry.filename) ?? null\n : null\n }\n onClose={closeDrawer}\n onJumpToCover={() => {\n closeDrawer();\n requestAnimationFrame(() => {\n const cover = document.getElementById('memo-index-card');\n cover?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n });\n }}\n />\n )}\n </section>\n );\n}\n\nfunction IndexCard({\n rows,\n orphans,\n totalMatched,\n totalEntries,\n query,\n onQuery,\n searchActive,\n indexAvailable,\n onOpenEntry,\n onOpenRaw,\n}: {\n rows: Row[];\n orphans: MemoryEntry[];\n totalMatched: number;\n totalEntries: number;\n query: string;\n onQuery: (v: string) => void;\n searchActive: boolean;\n indexAvailable: boolean;\n onOpenEntry: (filename: string) => void;\n onOpenRaw: () => void;\n}) {\n const t = useT();\n const noResults = searchActive && totalMatched === 0;\n\n return (\n <div id=\"memo-index-card\" className=\"surface-card mt-6 px-7 py-6\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <div>\n <div className=\"eyebrow\">{t('memory.cover.title')}</div>\n <h2 className=\"mt-0.5 font-display text-[18px] font-medium tracking-tight text-[var(--color-fg-primary)]\">\n {t('memory.cover.subtitle')}\n </h2>\n </div>\n {indexAvailable && (\n <button\n type=\"button\"\n onClick={onOpenRaw}\n className=\"font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-muted)] hover:text-[var(--color-accent-ink)] dark:hover:text-[var(--color-accent)]\"\n >\n {t('memory.cover.viewRaw')} ↗\n </button>\n )}\n </div>\n\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <div className=\"flex flex-1 min-w-[14rem] items-center gap-2 border-b border-[var(--color-hairline)] py-1.5 transition focus-within:border-[var(--color-accent)]\">\n <SearchIcon className=\"text-[var(--color-fg-muted)]\" />\n <input\n type=\"search\"\n value={query}\n onChange={(e) => onQuery(e.target.value)}\n placeholder={t('memory.search.placeholder')}\n className=\"w-full bg-transparent text-sm text-[var(--color-fg-primary)] placeholder:text-[var(--color-fg-faint)] focus:outline-none\"\n />\n </div>\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.18em] tabular-nums text-[var(--color-fg-faint)]\">\n {searchActive\n ? t('memory.list.count', { n: totalMatched, total: totalEntries })\n : `${totalEntries} ${t('memory.meta.entries').toLowerCase()}`}\n </span>\n </div>\n\n <div className=\"rule-dotted mt-5\" aria-hidden />\n\n {noResults ? (\n <p className=\"mt-6 text-sm text-[var(--color-fg-muted)]\">{t('memory.list.noResults')}</p>\n ) : (\n <ul className=\"mt-3\">\n {rows.map((row, i) => (\n <RowItem key={i} row={row} onOpenEntry={onOpenEntry} />\n ))}\n\n {orphans.length > 0 && (\n <>\n {!searchActive && rows.length > 0 && (\n <li aria-hidden className=\"h-3\" />\n )}\n <li className=\"pt-3 pb-2\">\n <div className=\"flex items-baseline gap-3\">\n <span className=\"font-mono text-[10.5px] uppercase tracking-[0.18em] text-[var(--color-fg-faint)]\">\n {t('memory.cover.orphan')}\n </span>\n <span className=\"font-mono text-[10.5px] tabular-nums text-[var(--color-fg-faint)]\">\n · {orphans.length}\n </span>\n <span aria-hidden className=\"ml-2 h-px flex-1 bg-[var(--color-hairline)]\" />\n </div>\n </li>\n {orphans.map((e) => (\n <RowItem\n key={e.filename}\n row={{ kind: 'entry', entry: e, hook: '' }}\n onOpenEntry={onOpenEntry}\n />\n ))}\n </>\n )}\n </ul>\n )}\n </div>\n );\n}\n\nfunction RowItem({\n row,\n onOpenEntry,\n}: {\n row: Row;\n onOpenEntry: (filename: string) => void;\n}) {\n const t = useT();\n\n if (row.kind === 'spacer') {\n return <li aria-hidden className=\"h-2\" />;\n }\n if (row.kind === 'heading') {\n return (\n <li className=\"pt-4 pb-1\">\n <div className=\"font-mono text-[10.5px] uppercase tracking-[0.18em] text-[var(--color-fg-muted)]\">\n {row.text}\n </div>\n </li>\n );\n }\n if (row.kind === 'text') {\n return (\n <li className=\"px-1 py-0.5 text-[12.5px] text-[var(--color-fg-faint)] whitespace-pre-wrap break-words\">\n {row.text}\n </li>\n );\n }\n if (row.kind === 'missing') {\n return (\n <li\n title={t('memory.cover.missingTooltip')}\n className=\"flex items-baseline gap-3 px-2 py-1.5 text-[var(--color-fg-faint)]\"\n >\n <span className=\"text-[14px] font-medium line-through decoration-[var(--color-fg-faint)]/50\">\n {row.title}\n </span>\n {row.hook && <span className=\"truncate text-[12px]\">{row.hook}</span>}\n </li>\n );\n }\n\n const entry = row.entry;\n const typeKey: GroupKey = entry.type ?? 'other';\n const title = entry.name ?? entry.filename;\n const hookText = row.hook || entry.description || '';\n return (\n <li>\n <button\n type=\"button\"\n onClick={() => onOpenEntry(entry.filename)}\n className={`memo-row memo-type-${typeKey}`}\n >\n <span aria-hidden className=\"memo-row-dot\" />\n <div className=\"memo-row-content\">\n <div className=\"memo-row-headline\">\n <span className=\"memo-row-title\">{title}</span>\n {entry.mtime && (\n <span className=\"memo-row-meta-inline\">{formatRelativeTime(entry.mtime)}</span>\n )}\n <TypeChip k={typeKey} />\n </div>\n {hookText && <p className=\"memo-row-hook\">{hookText}</p>}\n </div>\n <span aria-hidden className=\"memo-row-chevron\">↗</span>\n </button>\n </li>\n );\n}\n\nfunction TypeChip({ k }: { k: GroupKey }) {\n const t = useT();\n const label =\n k === 'user'\n ? t('memory.type.user')\n : k === 'feedback'\n ? t('memory.type.feedback')\n : k === 'project'\n ? t('memory.type.project')\n : k === 'reference'\n ? t('memory.type.reference')\n : t('memory.type.other');\n return <span className=\"memo-chip\">{label}</span>;\n}\n\ntype DrawerTarget =\n | { kind: 'entry'; entry: MemoryEntry | null; filename: string }\n | { kind: 'raw' };\n\nfunction Drawer({\n target,\n rawIndex,\n hookForEntry,\n onClose,\n onJumpToCover,\n}: {\n target: DrawerTarget;\n rawIndex: string;\n hookForEntry: string | null;\n onClose: () => void;\n onJumpToCover: () => void;\n}) {\n const t = useT();\n const panelRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose();\n }\n };\n window.addEventListener('keydown', onKey);\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n requestAnimationFrame(() => panelRef.current?.focus());\n return () => {\n window.removeEventListener('keydown', onKey);\n document.body.style.overflow = prevOverflow;\n };\n }, [onClose]);\n\n const typeKey: GroupKey =\n target.kind === 'entry' ? (target.entry?.type ?? 'other') : 'reference';\n\n return (\n <>\n <div className=\"memo-drawer-backdrop\" onClick={onClose} aria-hidden />\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n className={`memo-drawer-panel memo-type-${typeKey} focus:outline-none`}\n >\n <div className=\"flex items-start justify-between gap-3 border-b border-[var(--color-hairline)] px-7 pt-7 pb-5\">\n <div className=\"min-w-0 flex-1\">\n {target.kind === 'entry' ? (\n <>\n <TypeChip k={typeKey} />\n {target.entry ? (\n <>\n <h2 className=\"mt-3 font-display text-[24px] font-light leading-tight tracking-tight text-[var(--color-fg-primary)]\">\n {target.entry.name ?? target.entry.filename}\n </h2>\n <p className=\"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]\">\n {target.entry.filename} · {formatBytes(target.entry.bytes)}\n {target.entry.mtime ? ` · ${formatRelativeTime(target.entry.mtime)}` : ''}\n </p>\n </>\n ) : (\n <>\n <h2 className=\"mt-3 font-display text-[22px] font-light leading-tight text-[var(--color-fg-primary)]\">\n {t('memory.drawer.notFound.title')}\n </h2>\n <p className=\"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]\">\n {target.filename}\n </p>\n </>\n )}\n </>\n ) : (\n <>\n <span className=\"memo-chip memo-type-reference\">{t('memory.cover.title')}</span>\n <h2 className=\"mt-3 font-display text-[24px] font-light leading-tight tracking-tight text-[var(--color-fg-primary)]\">\n {t('memory.raw.title')}\n </h2>\n <p className=\"mt-1.5 font-mono text-[11px] uppercase tracking-[0.16em] text-[var(--color-fg-faint)]\">\n {t('memory.raw.subtitle')}\n </p>\n </>\n )}\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t('memory.drawer.close')}\n className=\"rounded-md p-2 text-[var(--color-fg-muted)] hover:bg-[var(--color-sunken)] hover:text-[var(--color-fg-primary)]\"\n >\n <CloseIcon />\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto px-7 py-6\">\n {target.kind === 'entry' && target.entry ? (\n <EntryDrawerBody\n entry={target.entry}\n hookForEntry={hookForEntry}\n onJumpToCover={onJumpToCover}\n />\n ) : target.kind === 'entry' ? (\n <NotFoundDrawerBody filename={target.filename} onJumpToCover={onJumpToCover} />\n ) : (\n <RawDrawerBody source={rawIndex} />\n )}\n </div>\n </div>\n </>\n );\n}\n\nfunction EntryDrawerBody({\n entry,\n hookForEntry,\n onJumpToCover,\n}: {\n entry: MemoryEntry;\n hookForEntry: string | null;\n onJumpToCover: () => void;\n}) {\n const t = useT();\n const body = entry.body.trim();\n return (\n <div>\n {entry.description && (\n <p className=\"text-[14px] text-[var(--color-fg-secondary)]\">{entry.description}</p>\n )}\n <pre\n className={\n 'whitespace-pre-wrap break-words rounded-[var(--radius-input)] border border-[var(--color-hairline)] bg-[var(--color-sunken)] px-4 py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--color-fg-primary)] ' +\n (entry.description ? 'mt-5' : '')\n }\n >\n {body || '—'}\n </pre>\n {hookForEntry && (\n <div className=\"mt-7\">\n <div className=\"rule-dotted\" aria-hidden />\n <div className=\"mt-4 flex items-baseline justify-between gap-3\">\n <div className=\"eyebrow\">{t('memory.drawer.indexHook')}</div>\n <button\n type=\"button\"\n onClick={onJumpToCover}\n className=\"font-mono text-[10.5px] uppercase tracking-[0.16em] text-[var(--color-fg-muted)] hover:text-[var(--color-accent-ink)] dark:hover:text-[var(--color-accent)]\"\n >\n {t('memory.cover.title')} ↑\n </button>\n </div>\n <p className=\"mt-1.5 text-[13px] text-[var(--color-fg-secondary)]\">{hookForEntry}</p>\n </div>\n )}\n </div>\n );\n}\n\nfunction NotFoundDrawerBody({\n filename,\n onJumpToCover,\n}: {\n filename: string;\n onJumpToCover: () => void;\n}) {\n const t = useT();\n return (\n <div>\n <p className=\"text-sm text-[var(--color-fg-secondary)]\">{t('memory.drawer.notFound.body')}</p>\n <p className=\"mt-3 font-mono text-[12px] text-[var(--color-fg-faint)]\">{filename}</p>\n <button\n type=\"button\"\n onClick={onJumpToCover}\n className=\"mt-5 inline-flex items-center gap-1.5 rounded-[var(--radius-control)] border border-[var(--color-hairline)] px-3 py-1.5 text-[11px] font-medium uppercase tracking-[0.14em] text-[var(--color-fg-secondary)] hover:border-[var(--color-hairline-strong)] hover:text-[var(--color-fg-primary)]\"\n >\n {t('memory.cover.title')} ↑\n </button>\n </div>\n );\n}\n\nfunction RawDrawerBody({ source }: { source: string }) {\n const body = source.trim();\n return (\n <pre className=\"whitespace-pre-wrap break-words rounded-[var(--radius-input)] border border-[var(--color-hairline)] bg-[var(--color-sunken)] px-4 py-3 font-mono text-[12.5px] leading-[1.65] text-[var(--color-fg-primary)]\">\n {body || '—'}\n </pre>\n );\n}\n\nfunction EmptyState() {\n const t = useT();\n return (\n <div className=\"surface-card mt-6 px-8 py-14 text-center\">\n <div className=\"mx-auto flex h-12 w-12 items-center justify-center rounded-full border border-[var(--color-hairline)] bg-[var(--color-sunken)] text-[var(--color-fg-muted)]\">\n <BookmarkIcon />\n </div>\n <h2 className=\"mt-5 font-display text-[20px] font-light tracking-tight text-[var(--color-fg-primary)]\">\n {t('memory.empty.title')}\n </h2>\n <p className=\"mx-auto mt-3 max-w-xl text-[13px] leading-relaxed text-[var(--color-fg-secondary)]\">\n {t('memory.empty.body')}\n </p>\n </div>\n );\n}\n\nfunction SearchIcon({ className = '' }: { className?: string }) {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n className={className}\n aria-hidden\n >\n <circle cx=\"11\" cy=\"11\" r=\"6.2\" />\n <path d=\"M20 20l-4.3-4.3\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n aria-hidden\n >\n <path d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n );\n}\n\nfunction BookmarkIcon() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M6 4h12v17l-6-4-6 4z\" />\n </svg>\n );\n}\n\nfunction matchEntry(entry: MemoryEntry, hook: string, q: string): boolean {\n const fields = [\n entry.name ?? '',\n entry.filename,\n entry.description ?? '',\n entry.body,\n hook,\n ];\n return fields.some((f) => f.toLowerCase().includes(q));\n}\n\nfunction buildRows(\n indexLines: IndexLine[],\n entries: MemoryEntry[],\n): { rows: Row[]; orphans: MemoryEntry[] } {\n const filenameToEntry = new Map(entries.map((e) => [e.filename, e]));\n const seen = new Set<string>();\n const rows: Row[] = [];\n\n for (const line of indexLines) {\n if (line.link) {\n const entry = filenameToEntry.get(line.link.href);\n if (entry) {\n rows.push({ kind: 'entry', entry, hook: line.link.hook });\n seen.add(entry.filename);\n } else {\n rows.push({ kind: 'missing', title: line.link.title, hook: line.link.hook });\n }\n continue;\n }\n const txt = line.raw.trim();\n if (!txt) {\n rows.push({ kind: 'spacer' });\n continue;\n }\n const headingMatch = /^(#{1,6})\\s+(.+?)\\s*$/.exec(txt);\n if (headingMatch) {\n rows.push({ kind: 'heading', text: headingMatch[2]! });\n } else {\n rows.push({ kind: 'text', text: line.raw });\n }\n }\n\n const orphans = entries.filter((e) => !seen.has(e.filename));\n return { rows, orphans };\n}\n\nfunction parseIndex(raw: string | null): IndexLine[] {\n if (!raw) return [];\n const out: IndexLine[] = [];\n for (const rawLine of raw.split(/\\r?\\n/)) {\n const line = rawLine.trimEnd();\n if (line.trim() === '') {\n const last = out[out.length - 1];\n if (last && (last.link || last.raw.trim() !== '')) {\n out.push({ raw: '', link: null });\n }\n continue;\n }\n const m = LINK_RE.exec(line);\n const title = m?.groups?.title;\n const href = m?.groups?.href;\n if (m && title && href) {\n out.push({\n raw: line,\n link: { title: title.trim(), href: href.trim(), hook: (m.groups?.hook ?? '').trim() },\n });\n } else {\n out.push({ raw: line, link: null });\n }\n }\n while (out.length > 0) {\n const last = out[out.length - 1];\n if (last && !last.link && last.raw.trim() === '') out.pop();\n else break;\n }\n return out;\n}\n"],"names":["LINK_RE","ProjectMemoryRoute","useT","projectId","useParams","id","searchParams","setSearchParams","useSearchParams","memoryQuery","useQuery","queryKeys","api","projectsQuery","project","useMemo","_a","data","entries","indexLines","parseIndex","hookByFilename","m","line","rows","orphans","buildRows","drawerEntry","drawerView","drawerOpen","openEntry","filename","next","openRaw","closeDrawer","drawerTarget","e","query","setQuery","useState","trimmed","searchActive","filteredRows","r","matchEntry","filteredOrphans","totalEntries","indexAvailable","hasContent","totalMatched","cwd","parts","tail","head","lastUpdate","latest","t","typeCount","s","jsx","Breadcrumbs","BreadcrumbFolderIcon","PageHeader","jsxs","Fragment","MetaItem","Sep","formatRelativeTime","Loading","EmptyState","IndexCard","Drawer","cover","onQuery","onOpenEntry","onOpenRaw","noResults","SearchIcon","row","i","RowItem","entry","typeKey","title","hookText","TypeChip","k","label","target","rawIndex","hookForEntry","onClose","onJumpToCover","panelRef","useRef","useEffect","onKey","prevOverflow","formatBytes","CloseIcon","EntryDrawerBody","NotFoundDrawerBody","RawDrawerBody","body","source","BookmarkIcon","className","hook","q","f","filenameToEntry","seen","txt","headingMatch","raw","out","rawLine","last","href","_b","_c"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:"Plus Jakarta Sans Variable", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", ui-sans-serif, system-ui, sans-serif;--font-mono:"Geist Mono Variable", "PingFang SC", ui-monospace, "JetBrains Mono", monospace;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-light:300;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-normal:0em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--blur-sm:8px;--blur-2xl:40px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-display:var(--font-sans);--color-canvas:oklch(97.2% .008 85);--color-surface:oklch(100% 0 0);--color-sunken:oklch(94.5% .01 85);--color-fg-primary:oklch(21% .012 85);--color-fg-secondary:oklch(36% .01 85);--color-fg-muted:oklch(52% .008 85);--color-fg-faint:oklch(68% .008 85);--color-hairline:oklch(88% .01 85);--color-hairline-strong:oklch(78% .012 85);--color-accent:oklch(72% .165 65);--color-accent-ink:oklch(32% .09 60);--color-accent-soft:oklch(94% .058 75);--color-danger:oklch(56% .18 25);--color-danger-soft:oklch(94% .052 30);--color-moss:oklch(55% .068 145);--color-moss-soft:oklch(93% .045 140);--color-iris:oklch(55% .085 240);--shadow-rise:0 1px 0 0 oklch(78% .012 85/.5), 0 12px 32px -16px oklch(30% .012 85/.18);--shadow-pop:0 4px 14px -6px oklch(30% .012 85/.18), 0 16px 48px -20px oklch(30% .012 85/.2);--radius-control:.5rem;--radius-input:.75rem;--radius-card:1.25rem;--radius-panel:1.75rem}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{background:var(--color-canvas);color:var(--color-fg-primary);font-family:var(--font-sans);font-feature-settings:"ss01","ss02","cv11";-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;color-scheme:light}body{background:var(--color-canvas);color:var(--color-fg-primary);min-height:100dvh;position:relative}body:before{content:"";z-index:0;pointer-events:none;opacity:.045;mix-blend-mode:multiply;background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='180' height='180'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.6 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");position:fixed;top:0;right:0;bottom:0;left:0}.dark body:before{opacity:.07;mix-blend-mode:screen}::selection{background:var(--color-accent);color:var(--color-canvas)}*{scrollbar-width:thin;scrollbar-color:var(--color-hairline-strong) transparent}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--color-hairline);background-clip:padding-box;border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background-color:var(--color-hairline-strong);background-clip:padding-box}h1,h2,h3{font-family:var(--font-sans);letter-spacing:-.012em}.tabular-nums{font-variant-numeric:tabular-nums}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.-top-12{top:calc(var(--spacing) * -12)}.top-0{top:calc(var(--spacing) * 0)}.top-1{top:calc(var(--spacing) * 1)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-2{top:calc(var(--spacing) * 2)}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.-right-12{right:calc(var(--spacing) * -12)}.right-1{right:calc(var(--spacing) * 1)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-6{right:calc(var(--spacing) * 6)}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-full{bottom:100%}.-left-1\.5{left:calc(var(--spacing) * -1.5)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[2\]{z-index:2}.z-\[55\]{z-index:55}.z-\[60\]{z-index:60}.m-5{margin:calc(var(--spacing) * 5)}.m-6{margin:calc(var(--spacing) * 6)}.-mx-6{margin-inline:calc(var(--spacing) * -6)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-6{margin-inline:calc(var(--spacing) * 6)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-px{margin-top:1px}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.-ml-5{margin-left:calc(var(--spacing) * -5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.aspect-square{aspect-ratio:1}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-7{height:calc(var(--spacing) * 7)}.h-9{height:calc(var(--spacing) * 9)}.h-12{height:calc(var(--spacing) * 12)}.h-32{height:calc(var(--spacing) * 32)}.h-40{height:calc(var(--spacing) * 40)}.h-72{height:calc(var(--spacing) * 72)}.h-\[13px\]{height:13px}.h-\[68px\]{height:68px}.h-full{height:100%}.h-px{height:1px}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[50vh\]{max-height:50vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-dvh{min-height:100dvh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-72{width:calc(var(--spacing) * 72)}.w-\[3em\]{width:3em}.w-\[11px\]{width:11px}.w-\[13px\]{width:13px}.w-\[20rem\]{width:20rem}.w-\[22rem\]{width:22rem}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[20rem\]{max-width:20rem}.max-w-\[260px\]{max-width:260px}.max-w-\[min\(46rem\,calc\(100\%-3rem\)\)\]{max-width:min(46rem,100% - 3rem)}.max-w-\[min\(54rem\,calc\(100\%-3rem\)\)\]{max-width:min(54rem,100% - 3rem)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[2rem\]{min-width:2rem}.min-w-\[14rem\]{min-width:14rem}.min-w-\[50\%\]{min-width:50%}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-px{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[2\.5rem_minmax\(0\,1fr\)_5rem_5\.5rem_5rem_3\.5rem\]{grid-template-columns:2.5rem minmax(0,1fr) 5rem 5.5rem 5rem 3.5rem}.grid-cols-\[14px_1fr_auto\]{grid-template-columns:14px 1fr auto}.flex-col{flex-direction:column}.flex-row-reverse{flex-direction:row-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-x-10{column-gap:calc(var(--spacing) * 10)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-6{row-gap:calc(var(--spacing) * 6)}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[3px\]{border-radius:3px}.rounded-\[5px\]{border-radius:5px}.rounded-\[10px\]{border-radius:10px}.rounded-\[inherit\]{border-radius:inherit}.rounded-\[var\(--radius-card\)\]{border-radius:var(--radius-card)}.rounded-\[var\(--radius-control\)\]{border-radius:var(--radius-control)}.rounded-\[var\(--radius-input\)\]{border-radius:var(--radius-input)}.rounded-\[var\(--radius-panel\)\]{border-radius:var(--radius-panel)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-tr-sm{border-top-right-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--color-accent\)\]{border-color:var(--color-accent)}.border-\[var\(--color-accent\)\]\/40{border-color:#e88b0066}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-accent\)\]\/40{border-color:color-mix(in oklab,var(--color-accent) 40%,transparent)}}.border-\[var\(--color-accent\)\]\/45{border-color:#e88b0073}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-accent\)\]\/45{border-color:color-mix(in oklab,var(--color-accent) 45%,transparent)}}.border-\[var\(--color-danger\)\]\/30{border-color:#c8393a4d}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-danger\)\]\/30{border-color:color-mix(in oklab,var(--color-danger) 30%,transparent)}}.border-\[var\(--color-danger\)\]\/40{border-color:#c8393a66}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-danger\)\]\/40{border-color:color-mix(in oklab,var(--color-danger) 40%,transparent)}}.border-\[var\(--color-hairline\)\]{border-color:var(--color-hairline)}.border-\[var\(--color-hairline-strong\)\]{border-color:var(--color-hairline-strong)}.border-\[var\(--color-moss\)\]{border-color:var(--color-moss)}.border-\[var\(--color-moss\)\]\/40{border-color:#587c5966}@supports (color:color-mix(in lab,red,red)){.border-\[var\(--color-moss\)\]\/40{border-color:color-mix(in oklab,var(--color-moss) 40%,transparent)}}.border-transparent{border-color:#0000}.border-l-\[var\(--color-accent\)\]{border-left-color:var(--color-accent)}.border-l-\[var\(--color-hairline-strong\)\]{border-left-color:var(--color-hairline-strong)}.bg-\[inherit\]{background-color:inherit}.bg-\[oklch\(0\.16_0\.006_85_\/_0\.5\)\]{background-color:#0e0d0a80}.bg-\[oklch\(0\.16_0\.006_85_\/_0\.55\)\]{background-color:#0e0d0a8c}.bg-\[var\(--color-accent\)\]{background-color:var(--color-accent)}.bg-\[var\(--color-accent-soft\)\]{background-color:var(--color-accent-soft)}.bg-\[var\(--color-accent-soft\)\]\/40{background-color:#ffe7c666}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-accent-soft\)\]\/40{background-color:color-mix(in oklab,var(--color-accent-soft) 40%,transparent)}}.bg-\[var\(--color-canvas\)\]{background-color:var(--color-canvas)}.bg-\[var\(--color-canvas\)\]\/65{background-color:#f8f5f0a6}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-canvas\)\]\/65{background-color:color-mix(in oklab,var(--color-canvas) 65%,transparent)}}.bg-\[var\(--color-canvas\)\]\/70{background-color:#f8f5f0b3}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-canvas\)\]\/70{background-color:color-mix(in oklab,var(--color-canvas) 70%,transparent)}}.bg-\[var\(--color-danger\)\]{background-color:var(--color-danger)}.bg-\[var\(--color-danger\)\]\/25{background-color:#c8393a40}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-danger\)\]\/25{background-color:color-mix(in oklab,var(--color-danger) 25%,transparent)}}.bg-\[var\(--color-danger-soft\)\]{background-color:var(--color-danger-soft)}.bg-\[var\(--color-fg-primary\)\]{background-color:var(--color-fg-primary)}.bg-\[var\(--color-hairline\)\]{background-color:var(--color-hairline)}.bg-\[var\(--color-hairline-strong\)\]{background-color:var(--color-hairline-strong)}.bg-\[var\(--color-moss\)\]\/30{background-color:#587c594d}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-moss\)\]\/30{background-color:color-mix(in oklab,var(--color-moss) 30%,transparent)}}.bg-\[var\(--color-moss-soft\)\]{background-color:var(--color-moss-soft)}.bg-\[var\(--color-sunken\)\]{background-color:var(--color-sunken)}.bg-\[var\(--color-sunken\)\]\/40{background-color:#f0ece566}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-sunken\)\]\/40{background-color:color-mix(in oklab,var(--color-sunken) 40%,transparent)}}.bg-\[var\(--color-surface\)\]{background-color:var(--color-surface)}.bg-\[var\(--color-surface\)\]\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-surface\)\]\/85{background-color:color-mix(in oklab,var(--color-surface) 85%,transparent)}}.bg-\[var\(--color-surface\)\]\/95{background-color:#fffffff2}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--color-surface\)\]\/95{background-color:color-mix(in oklab,var(--color-surface) 95%,transparent)}}.bg-transparent{background-color:#0000}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-8{padding-inline:calc(var(--spacing) * 8)}.px-\[5px\]{padding-inline:5px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-\[1\.5px\]{padding-block:1.5px}.py-px{padding-block:1px}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pt-7{padding-top:calc(var(--spacing) * 7)}.pt-\[12vh\]{padding-top:12vh}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16\.5px\]{font-size:16.5px}.text-\[17\.5px\]{font-size:17.5px}.text-\[18px\]{font-size:18px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[clamp\(1\.5rem\,3vw\,2rem\)\]{font-size:clamp(1.5rem,3vw,2rem)}.text-\[clamp\(1\.75rem\,3\.5vw\,2\.25rem\)\]{font-size:clamp(1.75rem,3.5vw,2.25rem)}.text-\[clamp\(1\.375rem\,2\.4vw\,1\.75rem\)\]{font-size:clamp(1.375rem,2.4vw,1.75rem)}.leading-\[1\.1\]{--tw-leading:1.1;line-height:1.1}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-\[-0\.015em\]{--tw-tracking:-.015em;letter-spacing:-.015em}.tracking-\[-0\.018em\]{--tw-tracking:-.018em;letter-spacing:-.018em}.tracking-\[0\.1em\]{--tw-tracking:.1em;letter-spacing:.1em}.tracking-\[0\.02em\]{--tw-tracking:.02em;letter-spacing:.02em}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--color-accent\)\]{color:var(--color-accent)}.text-\[var\(--color-accent-ink\)\]{color:var(--color-accent-ink)}.text-\[var\(--color-canvas\)\]{color:var(--color-canvas)}.text-\[var\(--color-danger\)\]{color:var(--color-danger)}.text-\[var\(--color-fg-faint\)\]{color:var(--color-fg-faint)}.text-\[var\(--color-fg-muted\)\]{color:var(--color-fg-muted)}.text-\[var\(--color-fg-primary\)\]{color:var(--color-fg-primary)}.text-\[var\(--color-fg-secondary\)\]{color:var(--color-fg-secondary)}.text-\[var\(--color-moss\)\]{color:var(--color-moss)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-\[var\(--color-accent\)\]\/50{text-decoration-color:#e88b0080}@supports (color:color-mix(in lab,red,red)){.decoration-\[var\(--color-accent\)\]\/50{-webkit-text-decoration-color:color-mix(in oklab,var(--color-accent) 50%,transparent);text-decoration-color:color-mix(in oklab,var(--color-accent) 50%,transparent)}}.decoration-\[var\(--color-fg-faint\)\]\/50{text-decoration-color:#9a989380}@supports (color:color-mix(in lab,red,red)){.decoration-\[var\(--color-fg-faint\)\]\/50{-webkit-text-decoration-color:color-mix(in oklab,var(--color-fg-faint) 50%,transparent);text-decoration-color:color-mix(in oklab,var(--color-fg-faint) 50%,transparent)}}.decoration-\[var\(--color-hairline-strong\)\]{-webkit-text-decoration-color:var(--color-hairline-strong);text-decoration-color:var(--color-hairline-strong)}.underline-offset-2{text-underline-offset:2px}.underline-offset-\[6px\]{text-underline-offset:6px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-\[var\(--color-accent\)\]{accent-color:var(--color-accent)}.opacity-0{opacity:0}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow-\[0_1px_0_0_var\(--color-hairline\)\]{--tw-shadow:0 1px 0 0 var(--tw-shadow-color,var(--color-hairline));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[var\(--shadow-pop\)\]{--tw-shadow:var(--shadow-pop);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[var\(--shadow-rise\)\]{--tw-shadow:var(--shadow-rise);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-\[2px\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:hidden:is(:where(.group):hover *){display:none}.group-hover\:inline-flex:is(:where(.group):hover *){display:inline-flex}.group-hover\:translate-x-0\.5:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.group-hover\:text-\[var\(--color-accent\)\]:is(:where(.group):hover *){color:var(--color-accent)}.group-hover\:text-\[var\(--color-fg-secondary\)\]:is(:where(.group):hover *){color:var(--color-fg-secondary)}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/cmd\:opacity-100:is(:where(.group\/cmd):hover *),.group-hover\/code\:opacity-100:is(:where(.group\/code):hover *){opacity:1}}.marker\:font-mono ::marker{font-family:var(--font-mono)}.marker\:font-mono::marker{font-family:var(--font-mono)}.marker\:font-mono ::-webkit-details-marker{font-family:var(--font-mono)}.marker\:font-mono::-webkit-details-marker{font-family:var(--font-mono)}.marker\:text-\[12px\] ::marker{font-size:12px}.marker\:text-\[12px\]::marker{font-size:12px}.marker\:text-\[12px\] ::-webkit-details-marker{font-size:12px}.marker\:text-\[12px\]::-webkit-details-marker{font-size:12px}.marker\:text-\[var\(--color-fg-faint\)\] ::marker{color:var(--color-fg-faint)}.marker\:text-\[var\(--color-fg-faint\)\]::marker{color:var(--color-fg-faint)}.marker\:text-\[var\(--color-fg-faint\)\] ::-webkit-details-marker{color:var(--color-fg-faint)}.marker\:text-\[var\(--color-fg-faint\)\]::-webkit-details-marker{color:var(--color-fg-faint)}.marker\:text-\[var\(--color-fg-muted\)\] ::marker{color:var(--color-fg-muted)}.marker\:text-\[var\(--color-fg-muted\)\]::marker{color:var(--color-fg-muted)}.marker\:text-\[var\(--color-fg-muted\)\] ::-webkit-details-marker{color:var(--color-fg-muted)}.marker\:text-\[var\(--color-fg-muted\)\]::-webkit-details-marker{color:var(--color-fg-muted)}.placeholder\:text-\[var\(--color-fg-faint\)\]::placeholder{color:var(--color-fg-faint)}.focus-within\:border-\[var\(--color-accent\)\]:focus-within{border-color:var(--color-accent)}@media(hover:hover){.hover\:border-\[var\(--color-accent\)\]:hover{border-color:var(--color-accent)}.hover\:border-\[var\(--color-accent\)\]\/60:hover{border-color:#e88b0099}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[var\(--color-accent\)\]\/60:hover{border-color:color-mix(in oklab,var(--color-accent) 60%,transparent)}}.hover\:border-\[var\(--color-danger\)\]:hover{border-color:var(--color-danger)}.hover\:border-\[var\(--color-danger\)\]\/40:hover{border-color:#c8393a66}@supports (color:color-mix(in lab,red,red)){.hover\:border-\[var\(--color-danger\)\]\/40:hover{border-color:color-mix(in oklab,var(--color-danger) 40%,transparent)}}.hover\:border-\[var\(--color-hairline-strong\)\]:hover{border-color:var(--color-hairline-strong)}.hover\:bg-\[color-mix\(in_oklch\,var\(--color-surface\)_60\%\,transparent\)\]:hover{background-color:#fff9}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_oklch\,var\(--color-surface\)_60\%\,transparent\)\]:hover{background-color:color-mix(in oklch,var(--color-surface) 60%,transparent)}}.hover\:bg-\[var\(--color-accent\)\]:hover{background-color:var(--color-accent)}.hover\:bg-\[var\(--color-accent-soft\)\]:hover{background-color:var(--color-accent-soft)}.hover\:bg-\[var\(--color-canvas\)\]:hover{background-color:var(--color-canvas)}.hover\:bg-\[var\(--color-danger-soft\)\]:hover{background-color:var(--color-danger-soft)}.hover\:bg-\[var\(--color-sunken\)\]:hover{background-color:var(--color-sunken)}.hover\:bg-\[var\(--color-surface\)\]:hover{background-color:var(--color-surface)}.hover\:text-\[var\(--color-accent\)\]:hover{color:var(--color-accent)}.hover\:text-\[var\(--color-accent-ink\)\]:hover{color:var(--color-accent-ink)}.hover\:text-\[var\(--color-danger\)\]:hover{color:var(--color-danger)}.hover\:text-\[var\(--color-fg-primary\)\]:hover{color:var(--color-fg-primary)}.hover\:text-\[var\(--color-fg-secondary\)\]:hover{color:var(--color-fg-secondary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-\[var\(--color-accent\)\]:hover{-webkit-text-decoration-color:var(--color-accent);text-decoration-color:var(--color-accent)}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-\[var\(--color-accent\)\]:focus{border-color:var(--color-accent)}.focus\:opacity-100:focus{opacity:1}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-offset-\[-2px\]:focus-visible{outline-offset:-2px}.focus-visible\:outline-\[var\(--color-accent\)\]:focus-visible{outline-color:var(--color-accent)}.focus-visible\:outline-\[var\(--color-danger\)\]:focus-visible{outline-color:var(--color-danger)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media(hover:hover){.disabled\:group-hover\:opacity-40:disabled:is(:where(.group):hover *){opacity:.4}.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}.disabled\:hover\:text-\[var\(--color-fg-muted\)\]:disabled:hover{color:var(--color-fg-muted)}}@media(min-width:40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-\[3rem_minmax\(0\,1fr\)_6rem_6rem_6rem_4rem\]{grid-template-columns:3rem minmax(0,1fr) 6rem 6rem 6rem 4rem}.sm\:flex-row{flex-direction:row}.sm\:px-5{padding-inline:calc(var(--spacing) * 5)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:px-8{padding-inline:calc(var(--spacing) * 8)}}@media(min-width:48rem){.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,1\.1fr\)\]{grid-template-columns:minmax(0,1fr) minmax(0,1.1fr)}.md\:items-center{align-items:center}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-0{top:calc(var(--spacing) * 0)}.lg\:top-\[var\(--ccsm-pin-top\)\]{top:var(--ccsm-pin-top)}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-dvh{height:100dvh}.lg\:translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:px-12{padding-inline:calc(var(--spacing) * 12)}.lg\:pt-3{padding-top:calc(var(--spacing) * 3)}}.dark\:text-\[var\(--color-accent\)\]:where(.dark,.dark *){color:var(--color-accent)}.dark\:text-\[var\(--color-fg-primary\)\]:where(.dark,.dark *){color:var(--color-fg-primary)}.dark\:text-\[var\(--color-fg-secondary\)\]:where(.dark,.dark *){color:var(--color-fg-secondary)}@media(hover:hover){.dark\:hover\:text-\[var\(--color-accent\)\]:where(.dark,.dark *):hover{color:var(--color-accent)}}.\[\&_code\]\:rounded-none code{border-radius:0}.\[\&_code\]\:border-0 code{border-style:var(--tw-border-style);border-width:0}.\[\&_code\]\:bg-transparent code{background-color:#0000}.\[\&_code\]\:p-0 code{padding:calc(var(--spacing) * 0)}.\[\&_code\]\:text-\[12px\] code{font-size:12px}.\[\&_code\]\:text-inherit code{color:inherit}.eyebrow{font-family:var(--font-sans);letter-spacing:.18em;text-transform:uppercase;color:var(--color-fg-muted);font-size:.6875rem;font-weight:500}.hairline{border-color:var(--color-hairline)}.hairline-strong{border-color:var(--color-hairline-strong)}.rule-dotted{background-image:radial-gradient(circle,var(--color-hairline-strong) 1px,transparent 1.2px);background-position:0;background-repeat:repeat-x;background-size:6px 1px;height:1px}.ribbon-row:not(tr){isolation:isolate;position:relative}.ribbon-row:not(tr):before{content:"";background:var(--color-accent);transform-origin:top;width:2px;transition:transform .18s cubic-bezier(.4,0,.2,1);position:absolute;top:0;bottom:0;left:0;transform:scaleY(0)}.ribbon-row:not(tr):hover:before,.ribbon-row:not(tr)[data-active=true]:before{transform:scaleY(1)}tr.ribbon-row>:first-child{position:relative}tr.ribbon-row>:first-child:before{content:"";background:var(--color-accent);transform-origin:top;width:2px;transition:transform .18s cubic-bezier(.4,0,.2,1);position:absolute;top:0;bottom:0;left:0;transform:scaleY(0)}tr.ribbon-row:hover>:first-child:before,tr.ribbon-row[data-active=true]>:first-child:before{transform:scaleY(1)}.pulse-amber{animation:1.6s cubic-bezier(.4,0,.4,1) infinite pulse-amber;box-shadow:0 0 #f5a32f99}.pulse-danger{box-shadow:0 0 #c8393a99}@supports (color:color-mix(in lab,red,red)){.pulse-danger{box-shadow:0 0 color-mix(in oklch,var(--color-danger) 60%,transparent)}}.pulse-danger{animation:1.6s cubic-bezier(.4,0,.4,1) infinite pulse-danger}.loading-rule{background:var(--color-hairline);border-radius:999px;width:12rem;max-width:100%;height:1px;position:relative;overflow:hidden}.loading-rule:after{content:"";background:linear-gradient(90deg,#0000,#e88b00b3,#0000);position:absolute;top:0;right:0;bottom:0;left:0}@supports (color:color-mix(in lab,red,red)){.loading-rule:after{background:linear-gradient(90deg,transparent 0%,color-mix(in oklch,var(--color-accent) 70%,transparent) 50%,transparent 100%)}}.loading-rule:after{animation:1.4s cubic-bezier(.4,0,.2,1) infinite loading-sweep;transform:translate(-100%)}.loading-dots{align-items:center;gap:.2rem;display:inline-flex}.loading-dots>span{opacity:.25;background:currentColor;border-radius:999px;width:.28rem;height:.28rem;animation:1.1s cubic-bezier(.4,0,.6,1) infinite loading-dot;display:inline-block}.loading-dots>span:nth-child(2){animation-delay:.18s}.loading-dots>span:nth-child(3){animation-delay:.36s}.stagger-item{opacity:0;animation:.36s cubic-bezier(.16,1,.3,1) forwards stagger-in}.surface-card{background:var(--color-surface);border:1px solid var(--color-hairline);border-radius:var(--radius-card);box-shadow:var(--shadow-rise);transition:transform .22s cubic-bezier(.16,1,.3,1),box-shadow .22s cubic-bezier(.16,1,.3,1),border-color .22s cubic-bezier(.16,1,.3,1)}.surface-card.is-interactive{cursor:pointer}.surface-card.is-interactive:hover{box-shadow:var(--shadow-pop);border-color:var(--color-hairline-strong);transform:translateY(-2px)}.surface-sunk{background:var(--color-sunken);border:1px solid var(--color-hairline);border-radius:var(--radius-input)}.topbar-glass{background:#f8f5f0c7}@supports (color:color-mix(in lab,red,red)){.topbar-glass{background:color-mix(in oklch,var(--color-canvas) 78%,transparent)}}.topbar-glass{-webkit-backdrop-filter:blur(14px)saturate(140%)}.flash-focus{border-radius:var(--radius-input);animation:1.2s cubic-bezier(.16,1,.3,1) flash-focus}.memo-type-user{--memo-tone:var(--color-iris)}.memo-type-feedback{--memo-tone:var(--color-accent)}.memo-type-project{--memo-tone:var(--color-moss)}.memo-type-reference{--memo-tone:var(--color-fg-muted)}.memo-type-other{--memo-tone:var(--color-fg-faint)}.memo-row{text-align:left;cursor:pointer;border-radius:.55rem;align-items:flex-start;gap:.7rem;width:100%;margin:0 -.75rem;padding:.45rem .75rem;transition:background .16s;display:flex;position:relative}.memo-row:hover,.memo-row:focus-visible{background:var(--color-sunken);outline:none}.memo-row-dot{background:var(--memo-tone,oklch(68% .008 85));border-radius:9999px;flex-shrink:0;width:.4rem;height:.4rem;margin-top:.45rem}@supports (color:color-mix(in lab,red,red)){.memo-row-dot{background:color-mix(in oklch,var(--memo-tone,var(--color-fg-faint)) 70%,transparent)}}.memo-row-dot{transition:background .16s,transform .16s}.memo-row:hover .memo-row-dot,.memo-row:focus-visible .memo-row-dot{background:var(--memo-tone,var(--color-fg-faint));transform:scale(1.25)}.memo-row-content{flex:1;min-width:0}.memo-row-headline{align-items:baseline;gap:.6rem;display:flex}.memo-row-title{min-width:0;font-family:var(--font-display);letter-spacing:-.01em;color:var(--color-fg-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:14px;font-weight:500;line-height:1.3;overflow:hidden}.memo-row-meta-inline{font-family:var(--font-mono);letter-spacing:.02em;color:var(--color-fg-faint);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:10px}.memo-row-hook{color:var(--color-fg-secondary);-webkit-line-clamp:1;-webkit-box-orient:vertical;margin-top:.15rem;font-size:12px;line-height:1.4;display:-webkit-box;overflow:hidden}.memo-row-chevron{color:var(--color-fg-faint);opacity:0;flex-shrink:0;margin-top:.3rem;font-size:11px;line-height:1;transition:opacity .16s,transform .16s}.memo-row:hover .memo-row-chevron,.memo-row:focus-visible .memo-row-chevron{opacity:1;transform:translate(2px,-2px)}.memo-chip{font-family:var(--font-mono);letter-spacing:.16em;text-transform:uppercase;color:var(--memo-tone,oklch(52% .008 85));border-radius:.5rem;align-items:center;gap:.375rem;padding:.25rem .55rem;font-size:10px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.memo-chip{color:color-mix(in oklch,var(--memo-tone,var(--color-fg-muted)) 70%,var(--color-fg-primary))}}.memo-chip{background:var(--memo-tone,oklch(52% .008 85))}@supports (color:color-mix(in lab,red,red)){.memo-chip{background:color-mix(in oklch,var(--memo-tone,var(--color-fg-muted)) 18%,var(--color-surface))}}.memo-chip{border:1px solid var(--memo-tone,oklch(88% .01 85))}@supports (color:color-mix(in lab,red,red)){.memo-chip{border:1px solid color-mix(in oklch,var(--memo-tone,var(--color-hairline)) 30%,var(--color-hairline))}}.memo-drawer-backdrop{background:#f8f5f066;position:fixed;top:0;right:0;bottom:0;left:0}@supports (color:color-mix(in lab,red,red)){.memo-drawer-backdrop{background:color-mix(in oklch,var(--color-canvas) 40%,transparent)}}.memo-drawer-backdrop{-webkit-backdrop-filter:blur(2px);z-index:60;animation:.2s cubic-bezier(.16,1,.3,1) both memo-drawer-fade}.memo-drawer-panel{background:var(--color-surface);border-left:1px solid var(--color-hairline);border-top-left-radius:var(--radius-panel);border-bottom-left-radius:var(--radius-panel);width:min(640px,92vw);box-shadow:var(--shadow-pop);z-index:61;flex-direction:column;animation:.28s cubic-bezier(.32,.72,0,1) both memo-drawer-slide;display:flex;position:fixed;top:0;bottom:0;right:0}}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(data:font/woff2;base64,d09GMgABAAAAAAa0ABQAAAAADOwAAAZHAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbbhwoP0hWQVJtP01WQVJGBmA/U1RBVIEcAGQvXBEICoMkgmcLFgAwhEwBNgIkAyYEIAWGXAdiDAcbOgtRlHLSRcD8TEzkdoghPRuspKefbVnJIM5yRfA8vZv9uTNJSCZY21Scrigr6qyJ/C3sE1OFKuVP3e+lxUTbYio1zb/kFdk2bufY2BlhWERRBrcDUBhB5GEpd2Cy+MDxqf9zLPX+XVsk5r+s50d6IpWLatqbdT6f2MAikiOKQocbjya2QT0DqPDX4R0jQBgAUAiCRhDA0EkvYeLk9X3I2bEWI8jBAihIANm+kUWQBgggWChcBBdFhXlAUgOCAgBA0AgKjUJ8HKvjddFCKSgAVklEBYAeEJgCQJH0qB3B+neDg4sAA4hAD0AVIEAA0IACJGeaUjMIIIhBUE/zNABjTQMBwEVRcwcYBUCObLERABAgjAA1M/ZSa9hSi4OlpsnZ2KBOVUsAZlRGl1W0NZ6gSwhQPIAFs7YFL0QS91vRQgdgx2VDAnIegKpQvwAJIoLgooBAGtCJcHizg0TDiz8vhPgIcVXaDJu37ZyDAIjFy4AAiC1JAA0olJwN6nFAACQk/zfQVUuA3t5ELKMT9hpBSRj+HBSggYCIAIEkUoC4PCIQIWHGA8+IStxf0PW15ntP22gc+Wo+BLyQAHECQiAVd+c3Ba8gZ4NOACBaLOhsbIMkAXEmuHsSAvkf4oJaAogH6nEQAzoBIEihUAwAA0AACAObAGcANYAAABaqgMmpWAhiiVyrvNyqFV8tMQ5Iyq6r9Lf7W82i8ILl2cv8zbfdJ5lnPzSnvt/XXPfRR/5pH3xA+u5uS0798EPJ3Fft33w36Wc+8E/7aIB/9fvvb1pE9erNXLB9mkw//cSg8Cnx03VGXDvZnRzKqV9Xkhn7eRHb3wVjHpg19nkZpX9bBU+vnHegrsuQcbW9Bi7oO33h+8SU0Tly/MbeYUuG1cftVz6oNxrW0qH1iezq446fkDFo/rgvTkqt7zmteFzncZ0uxXti09FFF2z+C7CODpjUudOE5NSeb3bv/mbPKcmOEzpWQ3VBgBAuj/AOY3qMm7UvgA8qo3+qvAUBBAX0wADQG4AG+jCKaSxkBe/zvcTG8jRpRZgqhCog4sd++cOo7J+/RdvaaMoc78Ri/PNPSclx6fDvG1Kt3qQFi1rq+5EaavTtt9TVvfvucYsA5wc4oESU+E1ikF9TkrOkIsIH5Fawx7SBNLnMcWlM3skBluCmQNs7GeyFvYVDamsqwhxx18n/+WdxzDgOLU1AqbUlb3m+KOT9+ONvY/7XlrdLS//5v7nN97XHj0VzJpJvz4spq0V7ioXDuv2YrSxtF/KZmvbWfKtorXSh8dfvgGu+ev/nFSaXM6jyuCE/f/EpmuP7Rqu8R98vP/+tXUdrOgKlZP9Q/s+fRF9+3CHZd4EugfPv158me9X7v/6aSMCxMJmIr//65bNXngl7+uiPP5oKx+y27D8trp+psUzMacpm80XlnYeMAct0LynxhNYgaP3dtn8/LBAi+ksr+7NvjjtJV+UXrz0uLXV1x08AZRN1S2A8EaVE5afk/dfGjz//+fdHn36Xdttz2d9/z+bawZ8/slNN1aYtq+ZPGzNuPGdwOsfYflwmHCkPgs5DcKizvdpS/3gEUMW9/lvQvWp1bGTW1fpngC/uSVYAfH3TeSusL8TtlHUD4KAAEHjahk4YpuffGwEBN/dUmpHqdHyJ3Ap8O3UlQ4gCNrMRwLBBKiskL6a+RoBi/9XGlgc8L4/CUejQxaiIyqmomdhktOhfgDbDfaNDb4+yKIPd6IgmzDa0CByijWFmL2dlSRKagTIWXeIU9HDphoZiJeBTjAefHMxDhVSRFUgVcOkW3EGMahYVMFjWHhMluB2wAcbHYqF1LpsDF9C6s+CI2fDgh4wSuFEyGadjXAmIk3CugIRibLIti9ZtC8S4VSqfikGqPaoI122XyRYLBmsOmdiiTpqK1OklUQzpMcZmQRQV4M4oJCMkfRQXK+qvjifUcQd1bRdetW/LWjacYxvcttnVjWg5h0q4xw6rZyejSpZVZ78LzC4uyDNRQ4bymHSTMyM+SZ7D75mg/7YTlmNz7W8T00h0VEiGKB+F7iWYZFvSTiA4LVxttm2ATt5EoUWLJbY4EnLGrfsvEROlHtzlKn3H9VUT5tU/2dt3/EBv7foYzV/W4upyj04woO/gh6Vwwt3WGQAA)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/assets/plus-jakarta-sans-vietnamese-wght-normal-qRpaaN48.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/assets/plus-jakarta-sans-latin-ext-wght-normal-DmpS2jIq.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Plus Jakarta Sans Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/assets/plus-jakarta-sans-latin-wght-normal-eXO_dkmS.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Plus Jakarta Sans Variable;font-style:italic;font-display:swap;font-weight:200 800;src:url(data:font/woff2;base64,d09GMgABAAAAAAboABQAAAAADegAAAZ6AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbbhwoP0hWQVJuP01WQVJGBmA/U1RBVIEYAGQvXBEICoMsgmkLFgAwhG4BNgIkAyYEIAWIMAdiDAcbLwwjEWaE9C9Ef3HAk6GPziCXq1Eh8E8EQUAcETD4qqY9zL9qXW0igea1HkEOnqd3sz93JoEY0i51HktNfM3s64mq5XBNC2hcZDFJgRXiiJ/wPjQQQg4ZcuSBeSDYPKAHgP9wzN5fdNuaD/QEzgeaLAeyyvR5jqXev2uLxPy3aMCpdVEUFUa1+MDujSKbosGaNqsCGs2sNoGaLSZJ7mpbs8+H6RVGAA8AUAiCRhDAoYA61MDQpFmENy3ftYUwBoAPAWTj6h1bsAABBAOFhWChyGQAqCAPQQEAIGgEhUYhm2houiKKJKkZAFHISACUATFQMAUbMEcwhhcCWAjQgPZG9nJjCAAaUID87vw57R+XLxd/J4J6kAcB6KEHBAALRbz3qeBJ71u3dhcAAngIEN+tlSIs6O8AhpokJ2KCOlrN839jvOwNtbKEEukDHoKA4srPmjo+lYMIJW81wn7AjMqqJHIKgMpUXwFJNIJgoYAYFlCA2rt23S7RsH7X8k0SQIgSp4QWBpjGItYhAOLyJCAA4kkFoAElITkR1L1WRlh+rTOi5kHrqI8mRSf/EgEUAoACNBBDI0AMg2lAlCgaCJGklwt5SFTyVp/wsP5f/qf+g/5qveSDmQiYSIAoCiFGEOu6F8WTICeCTgKIFgOkcDNFBQI4EUH8WtkCNQ/EvuYsceBatu0jAoADQAzwgNXAiUBcygMGyocYFwaCGCbLSM8w8kSXSoRdM8mWI3Y2uoudOd6shaEFhWuvuUUOet05+tVZziVvvOEe89prHPhg5ryjX39dDnokw73yRg58zT3mmVcmuhe++uqauZFZW4LcpXPdWRtd/Drjzr1PDX+h8JsX2P/iIWsouJR+eELk7P1yzhVfTi+6bdL82/YnY+E1O3jsqdf+zW8Pt3U3zKmb0Df7m5FZ6yo6uhZW1k+pr3Ze/Pu1zkXVNPeDpX5j5b+mn5n97tjMtRXVqVZPYZIYPrs4WM4+YNNpa484jY4D6vsK4/0LRxYsKS3tWjC8sLx/pBBVhABBLF7npZbSZumINYA/UAv1F+W2EEBQQBkOAFXABBroe23XspXP+E2SPaR/kAMVRHAgJEkMDRYUTDKlTBZYajbrG3moFwz7awBCnuzrDd+4bb4S/P/BnwcdGpBKsf9JkZo60Fv9Tfu/PDhvCfFKTDMcDAZIJHKZFOcZcIASYpD4Rg7oy1/5fSVSCF4V/wN2KTbgQH4/aB2HkzVSThPwJDgBXoghltk00WJA32KXud+rU0QWj/F+whnr36/piExM4Wy+XtPjRWFN+uH31zfibQ8Sd7PHPwd57zeM6H4Il/qN/UmaTDZLwnkn4v/9+zo+mKHx+++HAy0Op9OHgeD3i2CWc0jT181a2PfyIy/yt1urrw6Z8uDMH+H9t5ub2lV7TXhNNrH//cdtf7VN/PXamZwt7Qm4B3lCzD/O/2MtlfX69j3YfF8OL66biGtHwr2dz8hM+H8wXdSuVAoEz1js+a1pru4IuBAuQQunNUgdoQ2ycPkhB4olkbahuRy+JBybiMEgJjGI+Oc3Pv9it6u+O45bn8t59dvl/hGJO7OjKBFft3n1gmn9/X2cwPEcysZDDvJCGbFYYTPCCouzTXMPRQCVWrmqfvf40kjHb5bWXwK8d1NFJsCHV5yyyO/0o+ZS4zIUARQAAj/jsAtN+X939NBfchyobquvOEAd629GrgY+Q51PE3AOVyOAwyqCLMJECJenESBDstGIYQOPqhl1CnmqhgpPFVDTJx/ToEZupkmb7GOACplkC9Mk6R5E44lDgzy+pEkmL8YGWH4hg2RzOy0SnEmbdA6mQ5IVdIkxhR4OAwwRpolhPMoYIUo2o1ikrjaFVGCQfUyUXJtBaJYlb63Ia+MI8yNVdGM5KtT4wXNcebBQqSHC/UBbqYWesQqlN2zWOZf6jNCwvmXoWTTOI+PRMgLS/1cmYkyIMLiXSIGFF2LgDjmvDpdQiZ0WaFxqt1osmjQ8RPLDHDTEqI3poDVxbAkQileKR7hD3yntoUksmvhCdQ+ce3fep902Odc69abSHc8h+eP3OaVN0yR0J8Bq8lX4vHDwrYCDpEzVs0kBbrdfeU4pjrf6bZSODYiIhADkX2KR1SNWM+D/6a+uYNkOUPAvCi1aDDElIMFA74r/pxioqLZ4tKa3RvXPqN6wXdPXYC9fqaTVmxg/wV8doL6m6U5x2I1GAQAAAA==)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Plus Jakarta Sans Variable;font-style:italic;font-display:swap;font-weight:200 800;src:url(/assets/plus-jakarta-sans-vietnamese-wght-italic-CPBsCcxN.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Plus Jakarta Sans Variable;font-style:italic;font-display:swap;font-weight:200 800;src:url(/assets/plus-jakarta-sans-latin-ext-wght-italic-DJWiFoht.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Plus Jakarta Sans Variable;font-style:italic;font-display:swap;font-weight:200 800;src:url(/assets/plus-jakarta-sans-latin-wght-italic-DnD1KgkH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-mono-cyrillic-wght-normal-BZdD_g9V.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-mono-latin-ext-wght-normal-b6lpi8_2.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-mono-latin-wght-normal-Cjtb1TV-.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.dark{--color-canvas:oklch(15.8% .006 85);--color-surface:oklch(20.5% .006 85);--color-sunken:oklch(13% .005 85);--color-fg-primary:oklch(94.5% .01 85);--color-fg-secondary:oklch(82% .01 85);--color-fg-muted:oklch(66% .01 85);--color-fg-faint:oklch(46% .008 85);--color-hairline:oklch(29.5% .006 85);--color-hairline-strong:oklch(38% .008 85);--color-accent:oklch(78% .155 70);--color-accent-ink:oklch(95% .045 80);--color-accent-soft:oklch(32% .075 65);--color-danger:oklch(68% .175 25);--color-danger-soft:oklch(30% .09 25);--color-moss:oklch(66% .062 145);--color-moss-soft:oklch(28% .048 145);--color-iris:oklch(70% .08 240);--shadow-rise:0 1px 0 0 oklch(38% .006 85/.7), 0 18px 40px -20px oklch(0% 0 0/.55);--shadow-pop:0 8px 24px -10px oklch(0% 0 0/.6), 0 24px 60px -30px oklch(0% 0 0/.55);color-scheme:dark}@keyframes flash-focus{0%{background-color:var(--color-accent-soft)}60%{background-color:color-mix(in oklch,var(--color-accent-soft) 60%,transparent)}to{background-color:#0000}}@keyframes pulse-amber{0%{box-shadow:0 0 #f5a32f8c}70%{box-shadow:0 0 0 6px #f5a32f00}to{box-shadow:0 0 #f5a32f00}}@keyframes pulse-danger{0%{box-shadow:0 0 color-mix(in oklch,var(--color-danger) 55%,transparent)}70%{box-shadow:0 0 0 6px color-mix(in oklch,var(--color-danger) 0%,transparent)}to{box-shadow:0 0 color-mix(in oklch,var(--color-danger) 0%,transparent)}}@keyframes stagger-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes loading-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes loading-dot{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-1px)}}@keyframes memo-drawer-slide{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes memo-drawer-fade{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.memo-drawer-panel,.memo-drawer-backdrop,.memo-row,.memo-row-dot,.memo-row-chevron{transition:none!important;animation:none!important}.loading-rule:after{opacity:.6;animation:none!important;transform:none!important}.loading-dots>span{opacity:.6;animation:none!important}}#root{z-index:1;min-height:100dvh;position:relative}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}