@robthepcguy/rag-vault 1.7.0 → 1.8.0
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.
- package/README.md +28 -9
- package/dist/chunker/semantic-chunker.d.ts +0 -1
- package/dist/chunker/semantic-chunker.d.ts.map +1 -1
- package/dist/chunker/semantic-chunker.js +1 -1
- package/dist/chunker/semantic-chunker.js.map +1 -1
- package/dist/embedder/index.d.ts +5 -0
- package/dist/embedder/index.d.ts.map +1 -1
- package/dist/embedder/index.js +40 -5
- package/dist/embedder/index.js.map +1 -1
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/flywheel/feedback.d.ts +1 -1
- package/dist/flywheel/feedback.d.ts.map +1 -1
- package/dist/flywheel/feedback.js +1 -1
- package/dist/flywheel/feedback.js.map +1 -1
- package/dist/parser/pdf-filter.d.ts +3 -5
- package/dist/parser/pdf-filter.d.ts.map +1 -1
- package/dist/parser/pdf-filter.js +1 -1
- package/dist/parser/pdf-filter.js.map +1 -1
- package/dist/query/parser.d.ts +2 -6
- package/dist/query/parser.d.ts.map +1 -1
- package/dist/query/parser.js +14 -22
- package/dist/query/parser.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +37 -34
- package/dist/server/index.js.map +1 -1
- package/dist/server/raw-data-utils.d.ts +0 -40
- package/dist/server/raw-data-utils.d.ts.map +1 -1
- package/dist/server/raw-data-utils.js +9 -8
- package/dist/server/raw-data-utils.js.map +1 -1
- package/dist/server/remote-transport.d.ts +2 -1
- package/dist/server/remote-transport.d.ts.map +1 -1
- package/dist/server/remote-transport.js +27 -7
- package/dist/server/remote-transport.js.map +1 -1
- package/dist/server/schemas.d.ts +5 -29
- package/dist/server/schemas.d.ts.map +1 -1
- package/dist/server/schemas.js +6 -6
- package/dist/server/schemas.js.map +1 -1
- package/dist/vectordb/index.d.ts +12 -9
- package/dist/vectordb/index.d.ts.map +1 -1
- package/dist/vectordb/index.js +242 -163
- package/dist/vectordb/index.js.map +1 -1
- package/dist/web/api-routes.d.ts.map +1 -1
- package/dist/web/api-routes.js +23 -10
- package/dist/web/api-routes.js.map +1 -1
- package/dist/web/database-manager.d.ts.map +1 -1
- package/dist/web/database-manager.js +32 -25
- package/dist/web/database-manager.js.map +1 -1
- package/dist/web/http-server.d.ts +0 -5
- package/dist/web/http-server.d.ts.map +1 -1
- package/dist/web/http-server.js +4 -8
- package/dist/web/http-server.js.map +1 -1
- package/dist/web/index.js +4 -2
- package/dist/web/index.js.map +1 -1
- package/dist/web/middleware/async-handler.d.ts +2 -1
- package/dist/web/middleware/async-handler.d.ts.map +1 -1
- package/dist/web/middleware/rate-limit.d.ts +2 -1
- package/dist/web/middleware/rate-limit.d.ts.map +1 -1
- package/dist/web/middleware/request-logger.d.ts +1 -1
- package/dist/web/middleware/request-logger.d.ts.map +1 -1
- package/package.json +1 -1
- package/web-ui/dist/assets/{CollectionsPage-BDmEfv3V.js → CollectionsPage-CjLs8_5j.js} +1 -1
- package/web-ui/dist/assets/{FilesPage-pG9HmpgQ.js → FilesPage-Bw9x9aMr.js} +1 -1
- package/web-ui/dist/assets/ReaderPage-JPNiOF-x.js +28 -0
- package/web-ui/dist/assets/{ReaderSettingsContext-CkSjqsRh.js → ReaderSettingsContext-BLFJnEne.js} +1 -1
- package/web-ui/dist/assets/{SearchPage-DAltjnLL.js → SearchPage-D3_Vtbdw.js} +1 -1
- package/web-ui/dist/assets/{SettingsPage-C6J5BITP.js → SettingsPage-BAxB2264.js} +1 -1
- package/web-ui/dist/assets/{StatusPage-powRGmW3.js → StatusPage-CzJZW8Gs.js} +1 -1
- package/web-ui/dist/assets/{UploadPage-eyfSjL4u.js → UploadPage-DW8OujeJ.js} +5 -5
- package/web-ui/dist/assets/index-ANt8Xo4z.js +6 -0
- package/web-ui/dist/assets/index-DovQIIL4.css +1 -0
- package/web-ui/dist/assets/motion-Brxs0UET.js +9 -0
- package/web-ui/dist/assets/vendor-DSXQOR6A.js +10 -0
- package/web-ui/dist/index.html +3 -3
- package/web-ui/dist/assets/ReaderPage-CwMN03NU.js +0 -28
- package/web-ui/dist/assets/index-BpwaiuGL.css +0 -1
- package/web-ui/dist/assets/index-D068MV_o.js +0 -6
- package/web-ui/dist/assets/motion-CKwJwI3J.js +0 -9
- package/web-ui/dist/assets/vendor-C2QPsZ3S.js +0 -10
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ReaderPage-JPNiOF-x.js","assets/query-DPt-uCb6.js","assets/ReaderSettingsContext-BLFJnEne.js","assets/vendor-DSXQOR6A.js","assets/motion-Brxs0UET.js","assets/SearchPage-D3_Vtbdw.js","assets/UploadPage-DW8OujeJ.js","assets/FilesPage-Bw9x9aMr.js","assets/CollectionsPage-CjLs8_5j.js","assets/StatusPage-CzJZW8Gs.js","assets/format-DOJ3IkRX.js","assets/SettingsPage-BAxB2264.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a,j as i,u as q,b as H,c as _,Q as Ye,d as Ze}from"./query-DPt-uCb6.js";import{r as et,u as tt,R as nt,a as J,N as st,b as ot,B as rt}from"./vendor-DSXQOR6A.js";(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))e(t);new MutationObserver(t=>{for(const r of t)if(r.type==="childList")for(const c of r.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&e(c)}).observe(document,{childList:!0,subtree:!0});function s(t){const r={};return t.integrity&&(r.integrity=t.integrity),t.referrerPolicy&&(r.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?r.credentials="include":t.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function e(t){if(t.ep)return;t.ep=!0;const r=s(t);fetch(t.href,r)}})();var ee={},ce;function at(){if(ce)return ee;ce=1;var n=et();return ee.createRoot=n.createRoot,ee.hydrateRoot=n.hydrateRoot,ee}var it=at();class ct extends a.Component{constructor(o){super(o),this.state={hasError:!1,error:null}}static getDerivedStateFromError(o){return{hasError:!0,error:o}}componentDidCatch(o,s){console.error("ErrorBoundary caught an error:",o,s)}handleRetry=()=>{this.setState({hasError:!1,error:null})};render(){return this.state.hasError?this.props.fallback?this.props.fallback:i.jsx("div",{className:"min-h-screen flex items-center justify-center p-4",style:{background:"var(--ws-surface-1)"},children:i.jsxs("div",{className:"max-w-md w-full rounded-lg shadow-lg p-6 text-center",style:{background:"var(--ws-surface-raised)"},children:[i.jsx("div",{className:"text-red-500 mb-4",children:i.jsx("svg",{className:"w-16 h-16 mx-auto",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"})})}),i.jsx("h1",{className:"text-xl font-semibold mb-2",style:{color:"var(--ws-text)"},children:"Something went wrong"}),i.jsx("p",{className:"mb-4",style:{color:"var(--ws-text-secondary)"},children:"An unexpected error occurred. Please try again."}),this.state.error&&i.jsx("pre",{className:"text-left text-sm p-3 rounded mb-4 overflow-auto max-h-32",style:{background:"var(--ws-surface-1)",color:"var(--ws-text-secondary)"},children:this.state.error.message}),i.jsxs("div",{className:"flex gap-3 justify-center",children:[i.jsx("button",{type:"button",onClick:this.handleRetry,className:"px-4 py-2 text-white rounded-lg transition-colors",style:{background:"var(--ws-accent)"},children:"Try Again"}),i.jsx("button",{type:"button",onClick:()=>window.location.reload(),className:"px-4 py-2 rounded-lg transition-colors",style:{background:"var(--ws-surface-2)",color:"var(--ws-text-secondary)"},children:"Reload Page"})]})]})}):this.props.children}}const le={docId:null,chunkIndex:null,chunkRef:null,source:null},Ne=a.createContext(null);function lt({children:n}){const[o,s]=a.useState(le),e=a.useCallback(r=>{s({docId:r.docId,chunkIndex:r.chunkIndex??null,chunkRef:r.chunkRef??null,source:r.source})},[]),t=a.useCallback(()=>{s(le)},[]);return i.jsx(Ne.Provider,{value:{selection:o,select:e,clearSelection:t},children:n})}function V(){const n=a.useContext(Ne);if(!n)throw new Error("useSelection must be used within a SelectionProvider");return n}const de=100;function dt(){const[n,o]=a.useState([]),[s,e]=a.useState(-1),t=a.useRef(s);t.current=s;const r=a.useRef(n);r.current=n;const c=a.useMemo(()=>s>=0&&s<n.length?n[s]??null:null,[n,s]),l=s>0,h=s<n.length-1,g=a.useCallback((y,u)=>{o(v=>{const w=t.current,k=w>=0&&w<v.length?v[w]:null;if(k&&k.docId===y&&k.chunkIndex===u)return v;const x={docId:y,chunkIndex:u??null,timestamp:Date.now()},d=[...v.slice(0,w+1),x];if(d.length>de){const p=d.slice(d.length-de);return e(p.length-1),p}return e(d.length-1),d})},[]),f=a.useCallback(()=>{const y=t.current;if(y<=0)return null;const u=y-1;return e(u),r.current[u]??null},[]),m=a.useCallback(()=>{const y=t.current,u=r.current;if(y>=u.length-1)return null;const v=y+1;return e(v),u[v]??null},[]);return{push:g,goBack:f,goForward:m,canGoBack:l,canGoForward:h,current:c,history:n,currentIndex:s}}function F(n,o){const[s,e]=a.useState(()=>{try{const r=window.localStorage.getItem(n);return r?JSON.parse(r):o}catch{return o}}),t=a.useCallback(r=>{e(c=>{const l=r instanceof Function?r(c):r;try{window.localStorage.setItem(n,JSON.stringify(l))}catch(h){console.warn(`Failed to persist "${n}" to localStorage:`,h)}return l})},[n]);return a.useEffect(()=>{const r=c=>{if(c.key===n&&c.newValue!==null)try{e(JSON.parse(c.newValue))}catch{}};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)},[n]),[s,t]}function ue(n){const{storageKey:o,defaultWidth:s,min:e,max:t}=n,[r,c]=F(`ws-panel-${o}`,{width:s,collapsed:!1}),l=a.useCallback(f=>{const m=Math.max(e,Math.min(t,f));c(y=>({...y,width:m}))},[e,t,c]),h=a.useCallback(()=>{c(f=>({...f,collapsed:!f.collapsed}))},[c]),g=a.useCallback(f=>{c(m=>({...m,collapsed:f}))},[c]);return{width:r.width,collapsed:r.collapsed,setWidth:l,toggleCollapsed:h,setCollapsed:g}}function ut(n){const o=a.useRef(n);o.current=n,a.useEffect(()=>{function s(e){if(e.metaKey||e.ctrlKey)switch(e.key){case"[":e.preventDefault(),o.current.onToggleLeftRail?.();break;case"]":e.preventDefault(),o.current.onToggleRightRail?.();break;case"ArrowLeft":e.preventDefault(),o.current.onNavigateBack?.();break;case"ArrowRight":e.preventDefault(),o.current.onNavigateForward?.();break}}return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[])}const Re="/api/v1",ht=3e4,ft=3e5;async function B(n,o,s=ht){const e=new AbortController,t=setTimeout(()=>e.abort(),s);try{const r=await fetch(`${Re}${n}`,{headers:{"Content-Type":"application/json",...o?.headers},...o,signal:e.signal}),c=await r.json();if(!r.ok)throw new Error(c.error||"Request failed");return c}catch(r){throw r instanceof Error&&r.name==="AbortError"?new Error("Request timed out"):r}finally{clearTimeout(t)}}async function Ns(n,o){return(await B("/search",{method:"POST",body:JSON.stringify({query:n,limit:o})})).results}async function Rs(n){const o=new AbortController,s=setTimeout(()=>o.abort(),ft);try{const e=new FormData;e.append("file",n);const t=await fetch(`${Re}/files/upload`,{method:"POST",body:e,signal:o.signal}),r=await t.json();if(!t.ok)throw new Error(r.error||"Upload failed");return r}catch(e){throw e instanceof Error&&e.name==="AbortError"?new Error("Upload timed out"):e}finally{clearTimeout(s)}}async function Ps(n,o,s){return B("/data",{method:"POST",body:JSON.stringify({content:n,metadata:{source:o,format:s}})})}async function Pe(){return(await B("/files")).files}async function gt(n){await B("/files",{method:"DELETE",body:JSON.stringify(n)})}async function Ms(){return B("/status")}async function Me(n){const o=encodeURIComponent(n);return(await B(`/documents/chunks?filePath=${o}`)).chunks}async function mt(n,o,s){const e=new URLSearchParams({filePath:n,chunkIndex:String(o)});return(await B(`/chunks/related?${e.toString()}`)).related.map(r=>({...r,connectionReason:r.explanation?pt(r.explanation):De(r.score,r.filePath===n)}))}function pt(n){switch(n.reasonLabel){case"same_doc":return"Same document";case"very_similar":return"Very similar";case"related_topic":return"Related topic";case"loosely_related":return"Loosely related";default:return"Related"}}async function Ds(n,o){const s=await B("/chunks/batch-related",{method:"POST",body:JSON.stringify({chunks:n,limit:o})}),e={};for(const[t,r]of Object.entries(s.results)){const[c]=t.split(":");e[t]=r.map(l=>({...l,connectionReason:De(l.score,l.filePath===c)}))}return e}function De(n,o){return o?"Same document":n<.3?"Very similar":n<.5?"Related topic":"Loosely related"}async function he(n,o,s){await B("/feedback",{method:"POST",body:JSON.stringify({type:n,source:o,target:s})})}const bt={sm:"h-4 w-4",md:"h-5 w-5",lg:"h-8 w-8"};function xt({size:n="md",className:o="",style:s}){return i.jsxs("svg",{className:`animate-spin ${bt[n]} text-current ${o}`,style:s,fill:"none",viewBox:"0 0 24 24",role:"status","aria-label":"Loading",children:[i.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),i.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]})}const yt={success:{container:"ws-toast--success",icon:"ws-toast-icon--success"},error:{container:"ws-toast--error",icon:"ws-toast-icon--error"},info:{container:"ws-toast--info",icon:"ws-toast-icon--info"}};function wt({toast:n,onDismiss:o}){const s=yt[n.type],[e,t]=a.useState(!1),r=a.useRef(o);r.current=o,a.useEffect(()=>{const l=setTimeout(()=>{t(!0),setTimeout(()=>r.current(n.id),200)},5e3);return()=>clearTimeout(l)},[n.id]);const c=()=>{t(!0),setTimeout(()=>o(n.id),200)};return i.jsxs("div",{className:`ws-toast ${s.container} ${e?"ws-toast--exiting":""}`,role:"alert","aria-live":"polite",children:[i.jsxs("div",{className:`ws-toast-icon ${s.icon}`,children:[n.type==="success"&&i.jsx(kt,{}),n.type==="error"&&i.jsx(vt,{}),n.type==="info"&&i.jsx(St,{})]}),i.jsxs("div",{className:"ws-toast-content",children:[i.jsx("p",{className:"ws-toast-title",children:n.title}),n.message&&i.jsx("p",{className:"ws-toast-message",children:n.message})]}),i.jsx("button",{type:"button",onClick:c,className:"ws-toast-close","aria-label":"Dismiss",children:i.jsx(Ct,{})})]})}function kt(){return i.jsx("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})}function vt(){return i.jsx("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}function St(){return i.jsx("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}function Ct(){return i.jsx("svg",{className:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})}function It({toasts:n,onDismiss:o}){return i.jsx("div",{className:"ws-toast-container",children:n.map(s=>i.jsx(wt,{toast:s,onDismiss:o},s.id))})}const Oe=a.createContext(null);function jt({children:n}){const[o,s]=a.useState([]),e=a.useCallback(r=>{const c=`${Date.now()}-${Math.random().toString(36).slice(2,9)}`;s(l=>[...l,{...r,id:c}])},[]),t=a.useCallback(r=>{s(c=>c.filter(l=>l.id!==r))},[]);return i.jsxs(Oe.Provider,{value:{addToast:e,removeToast:t},children:[n,i.jsx(It,{toasts:o,onDismiss:t})]})}function K(){const n=a.useContext(Oe);if(!n)throw new Error("useToast must be used within a ToastProvider");return n}function Et(){const n=q(),{addToast:o}=K(),{data:s=[],isLoading:e,error:t}=H({queryKey:["files"],queryFn:Pe}),r=_({mutationFn:gt,onSuccess:()=>{n.invalidateQueries({queryKey:["files"]}),o({type:"success",title:"File deleted",message:"The file has been removed from the knowledge base."})},onError:c=>{o({type:"error",title:"Failed to delete file",message:c.message})}});return{files:s,isLoading:e,error:t,deleteFile:r.mutate,isDeleting:r.isPending}}function fe(n,o){if(!o)return!0;const s=n.toLowerCase(),e=o.toLowerCase();return s.includes(e)}function Tt(){const[n,o]=a.useState(!1),[s,e]=a.useState(""),[t,r]=a.useState(0),{files:c}=Et(),{select:l}=V(),h=tt(),g=a.useCallback(()=>{o(!0),e(""),r(0)},[]),f=a.useCallback(()=>{o(!1)},[]),m=a.useCallback(()=>{o(w=>(w||(e(""),r(0)),!w))},[]),y=a.useMemo(()=>{const w=c.map(b=>{const d=b.filePath.split("/").pop()||b.filePath;return{id:`doc:${b.filePath}`,label:d,description:b.filePath,icon:"D",category:"document",onSelect:()=>{l({docId:b.filePath,source:"command-palette"}),h(`/reader?doc=${encodeURIComponent(b.filePath)}`)}}}),k=[{id:"nav:search",label:"Search",description:"Go to search page",icon:"S",category:"navigation",onSelect:()=>h("/")},{id:"nav:upload",label:"Upload",description:"Go to upload page",icon:"U",category:"navigation",onSelect:()=>h("/upload")},{id:"nav:files",label:"Files",description:"Go to files page",icon:"F",category:"navigation",onSelect:()=>h("/files")},{id:"nav:collections",label:"Collections",description:"Go to collections page",icon:"C",category:"navigation",onSelect:()=>h("/collections")},{id:"nav:status",label:"Status",description:"Go to status page",icon:"T",category:"navigation",onSelect:()=>h("/status")},{id:"nav:settings",label:"Settings",description:"Go to settings page",icon:"G",category:"navigation",onSelect:()=>h("/settings")}],x=[{id:"action:toggle-left-rail",label:"Toggle left rail",description:"Show or hide the left sidebar",icon:"L",category:"action",onSelect:()=>{window.dispatchEvent(new CustomEvent("ws:toggle-left-rail"))}},{id:"action:toggle-right-rail",label:"Toggle right rail",description:"Show or hide the right sidebar",icon:"R",category:"action",onSelect:()=>{window.dispatchEvent(new CustomEvent("ws:toggle-right-rail"))}}];return[...w,...k,...x]},[c,l,h]),u=a.useMemo(()=>s?y.filter(w=>fe(w.label,s)||w.description&&fe(w.description,s)):y,[y,s]);a.useEffect(()=>{r(w=>u.length===0?0:Math.min(w,u.length-1))},[u.length]);const v=a.useCallback(()=>{const w=u[t];w&&(w.onSelect(),f())},[u,t,f]);return a.useEffect(()=>{function w(k){(k.metaKey||k.ctrlKey)&&k.key==="k"&&(k.preventDefault(),m())}return window.addEventListener("keydown",w),()=>window.removeEventListener("keydown",w)},[m]),{isOpen:n,open:g,close:f,toggle:m,query:s,setQuery:e,results:u,selectedIndex:t,setSelectedIndex:r,executeSelected:v}}function At(n){switch(n){case"document":return"Documents";case"navigation":return"Navigation";case"action":return"Actions"}}function Nt(){const{isOpen:n,close:o,query:s,setQuery:e,results:t,selectedIndex:r,setSelectedIndex:c,executeSelected:l}=Tt(),h=a.useRef(null),g=a.useRef(null);a.useEffect(()=>{if(n){const u=requestAnimationFrame(()=>{h.current?.focus()});return()=>cancelAnimationFrame(u)}},[n]),a.useEffect(()=>{if(!n||!g.current)return;const u=g.current.querySelector('[data-selected="true"]');u&&u.scrollIntoView({block:"nearest"})},[r,n]);function f(u){switch(u.key){case"ArrowDown":u.preventDefault(),c(Math.min(r+1,t.length-1));break;case"ArrowUp":u.preventDefault(),c(Math.max(r-1,0));break;case"Enter":u.preventDefault(),l();break;case"Escape":u.preventDefault(),o();break}}if(!n)return null;const m=[],y=new Set;for(let u=0;u<t.length;u++){const v=t[u];y.has(v.category)||(y.add(v.category),m.push({category:v.category,items:[]})),m.find(k=>k.category===v.category)?.items.push({action:v,globalIndex:u})}return i.jsxs(i.Fragment,{children:[i.jsx("div",{className:"ws-command-palette-backdrop",onClick:o,onKeyDown:u=>{u.key==="Escape"&&o()}}),i.jsxs("div",{className:"ws-command-palette",role:"dialog","aria-modal":"true","aria-label":"Command palette",onKeyDown:f,children:[i.jsx("input",{ref:h,className:"ws-command-palette-input ws-input",type:"text",placeholder:"Search documents, pages, actions...",value:s,onChange:u=>e(u.target.value),"aria-label":"Command palette search","aria-controls":"command-palette-results","aria-activedescendant":t[r]?`command-palette-item-${t[r].id}`:void 0,role:"combobox","aria-expanded":"true","aria-autocomplete":"list"}),i.jsxs("div",{ref:g,id:"command-palette-results",className:"ws-command-palette-results",role:"listbox","aria-label":"Command palette results",children:[t.length===0&&i.jsx("div",{className:"ws-command-palette-empty",children:"No results found"}),m.map(u=>i.jsxs("div",{className:"ws-command-palette-group",children:[i.jsx("div",{className:"ws-command-palette-category",children:At(u.category)}),u.items.map(({action:v,globalIndex:w})=>i.jsxs("button",{id:`command-palette-item-${v.id}`,className:`ws-command-palette-item ${w===r?"ws-command-palette-item--selected":""}`,role:"option","aria-selected":w===r,"data-selected":w===r,onClick:()=>{c(w),v.onSelect(),o()},onMouseEnter:()=>c(w),type:"button",children:[i.jsx("span",{className:"ws-command-palette-item-icon",children:v.icon}),i.jsxs("span",{className:"ws-command-palette-item-content",children:[i.jsx("span",{className:"ws-command-palette-item-label",children:v.label}),v.description&&i.jsx("span",{className:"ws-command-palette-item-description",children:v.description})]})]},v.id))]},u.category))]}),i.jsxs("div",{className:"ws-command-palette-footer",children:[i.jsxs("span",{className:"ws-command-palette-hint",children:[i.jsx("kbd",{children:"↑↓"})," navigate"]}),i.jsxs("span",{className:"ws-command-palette-hint",children:[i.jsx("kbd",{children:"Enter"})," select"]}),i.jsxs("span",{className:"ws-command-palette-hint",children:[i.jsx("kbd",{children:"Esc"})," close"]})]})]})]})}const Rt="modulepreload",Pt=function(n){return"/"+n},ge={},G=function(o,s,e){let t=Promise.resolve();if(s&&s.length>0){let h=function(g){return Promise.all(g.map(f=>Promise.resolve(f).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),l=c?.nonce||c?.getAttribute("nonce");t=h(s.map(g=>{if(g=Pt(g),g in ge)return;ge[g]=!0;const f=g.endsWith(".css"),m=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${g}"]${m}`))return;const y=document.createElement("link");if(y.rel=f?"stylesheet":Rt,f||(y.as="script"),y.crossOrigin="",y.href=g,l&&y.setAttribute("nonce",l),document.head.appendChild(y),f)return new Promise((u,v)=>{y.addEventListener("load",u),y.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${g}`)))})}))}function r(c){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=c,window.dispatchEvent(l),!l.defaultPrevented)throw c}return t.then(c=>{for(const l of c||[])l.status==="rejected"&&r(l.reason);return o().catch(r)})},me=8;function pe(){const n=crypto.randomUUID();return{tabs:[{tabId:n,kind:"search",title:"Search",scrollTop:0,lastActiveAt:Date.now(),pinned:!0}],activeTabId:n}}function be(n,o){const s=n.filter(t=>!t.pinned&&t.tabId!==o);if(s.length===0)return n;let e=s[0];for(const t of s)t.lastActiveAt<e.lastActiveAt&&(e=t);return n.filter(t=>t.tabId!==e.tabId)}const Le=a.createContext(null);function Mt({dbId:n,children:o}){const s=`rag-vault-tabs-v1-${n}`,[e,t]=F(s,pe()),r=a.useCallback((u,v,w)=>{t(k=>{const x=k.tabs.find(p=>p.kind==="doc"&&p.docId===u);if(x)return{...k,activeTabId:x.tabId,tabs:k.tabs.map(p=>p.tabId===x.tabId?{...p,lastActiveAt:Date.now()}:p)};const b={tabId:crypto.randomUUID(),kind:"doc",docId:u,chunkRef:w,title:v,scrollTop:0,lastActiveAt:Date.now(),pinned:!1};let d=[...k.tabs,b];return d.length>me&&(d=be(d,b.tabId)),{tabs:d,activeTabId:b.tabId}})},[t]),c=a.useCallback((u,v)=>{t(w=>{const k=w.tabs.find(d=>d.kind===u);if(k)return{...w,activeTabId:k.tabId,tabs:w.tabs.map(d=>d.tabId===k.tabId?{...d,lastActiveAt:Date.now()}:d)};const x={tabId:crypto.randomUUID(),kind:u,title:v,scrollTop:0,lastActiveAt:Date.now(),pinned:!1};let b=[...w.tabs,x];return b.length>me&&(b=be(b,x.tabId)),{tabs:b,activeTabId:x.tabId}})},[t]),l=a.useCallback(u=>{t(v=>{const w=v.tabs.findIndex(b=>b.tabId===u);if(w===-1)return v;const k=v.tabs.filter(b=>b.tabId!==u);if(k.length===0)return pe();let x=v.activeTabId;if(v.activeTabId===u){const b=Math.min(w,k.length-1);x=k[b].tabId}return{tabs:k,activeTabId:x}})},[t]),h=a.useCallback(u=>{t(v=>({...v,activeTabId:u,tabs:v.tabs.map(w=>w.tabId===u?{...w,lastActiveAt:Date.now()}:w)}))},[t]),g=a.useCallback((u,v)=>{t(w=>({...w,tabs:w.tabs.map(k=>k.tabId===u?{...k,scrollTop:v}:k)}))},[t]),f=a.useCallback((u,v)=>{t(w=>({...w,tabs:w.tabs.map(k=>k.tabId===u?{...k,pinned:v}:k)}))},[t]),m=a.useMemo(()=>e.tabs.find(u=>u.tabId===e.activeTabId),[e.tabs,e.activeTabId]),y=a.useMemo(()=>({tabs:e.tabs,activeTabId:e.activeTabId,activeTab:m,openDoc:r,openPage:c,closeTab:l,setActiveTab:h,updateTabScroll:g,pinTab:f}),[e.tabs,e.activeTabId,m,r,c,l,h,g,f]);return i.jsx(Le.Provider,{value:y,children:o})}function Dt(){const n=a.useContext(Le);if(!n)throw new Error("useTabs must be used within a TabsProvider");return n}const Ot=a.forwardRef(({variant:n="default",size:o="md",className:s="",children:e,...t},r)=>i.jsx("button",{ref:r,"data-variant":n,"data-size":o,className:`ws-button ${s}`,...t,children:e}));Ot.displayName="WsButton";const Lt=a.forwardRef(({error:n,className:o="",...s},e)=>i.jsx("input",{ref:e,"data-error":n||void 0,className:`ws-input ${o}`,...s}));Lt.displayName="WsInput";const Ft=a.forwardRef(({error:n,className:o="",children:s,...e},t)=>i.jsx("select",{ref:t,"data-error":n||void 0,className:`ws-select ${o}`,...e,children:s}));Ft.displayName="WsSelect";function Fe({tabs:n,activeId:o,onSelect:s,onClose:e,variant:t="underline",className:r=""}){const c=a.useRef(null),l=h=>{const g=c.current?.querySelectorAll('[role="tab"]');if(!g?.length)return;const f=Array.from(g).indexOf(document.activeElement);let m=f;if(h.key==="ArrowRight"?(h.preventDefault(),m=f+1>=g.length?0:f+1):h.key==="ArrowLeft"&&(h.preventDefault(),m=f-1<0?g.length-1:f-1),m!==f){const y=g[m];if(y){y.focus();const u=y.dataset.tabId;u&&s(u)}}};return i.jsx("div",{ref:c,role:"tablist",className:`ws-tabs ws-tabs--${t} ${r}`,onKeyDown:l,children:n.map(h=>{const g=h.id===o;return i.jsxs("button",{role:"tab",type:"button","aria-selected":g,tabIndex:g?0:-1,"data-tab-id":h.id,className:"ws-tab",onClick:()=>s(h.id),children:[h.icon&&i.jsx("span",{className:"ws-tab-icon",children:h.icon}),h.label,h.badge!==void 0&&i.jsx("span",{className:"ws-tab-badge",children:h.badge}),h.closeable&&!h.pinned&&i.jsx("span",{role:"button",tabIndex:-1,className:"ws-tab-close",onClick:f=>{f.stopPropagation(),e?.(h.id)},onKeyDown:f=>{(f.key==="Enter"||f.key===" ")&&(f.stopPropagation(),e?.(h.id))},children:"x"})]},h.id)})})}function oe({variant:n="default",count:o,children:s,className:e="",...t}){return i.jsxs("span",{"data-variant":n,className:`ws-badge ${e}`,...t,children:[s,o!==void 0&&i.jsx("span",{className:"ws-badge-count",children:o})]})}function $t({content:n,side:o="top",delay:s=300,children:e}){const[t,r]=a.useState(!1),c=a.useRef(null),l=a.useCallback(()=>{c.current=setTimeout(()=>r(!0),s)},[s]),h=a.useCallback(()=>{c.current&&(clearTimeout(c.current),c.current=null),r(!1)},[]);return a.useEffect(()=>()=>{c.current&&clearTimeout(c.current)},[]),i.jsxs("span",{className:"ws-tooltip-anchor",onMouseEnter:l,onMouseLeave:h,onFocus:l,onBlur:h,children:[e,t&&i.jsx("span",{className:`ws-tooltip ws-tooltip--${o}`,role:"tooltip",children:n})]})}function _t(){const{tabs:n,activeTabId:o,setActiveTab:s,closeTab:e}=Dt(),t=n.map(r=>({id:r.tabId,label:r.title,closeable:!r.pinned,pinned:r.pinned}));return i.jsx("div",{className:"ws-tab-bar",children:i.jsx(Fe,{tabs:t,activeId:o,onSelect:s,onClose:e,variant:"pill"})})}const Kt=a.lazy(()=>G(()=>import("./ReaderPage-JPNiOF-x.js"),__vite__mapDeps([0,1,2,3,4])).then(n=>({default:n.ReaderPage}))),zt=a.lazy(()=>G(()=>import("./SearchPage-D3_Vtbdw.js"),__vite__mapDeps([5,1,3])).then(n=>({default:n.SearchPage}))),Wt=a.lazy(()=>G(()=>import("./UploadPage-DW8OujeJ.js"),__vite__mapDeps([6,1,3])).then(n=>({default:n.UploadPage}))),qt=a.lazy(()=>G(()=>import("./FilesPage-Bw9x9aMr.js"),__vite__mapDeps([7,1,3])).then(n=>({default:n.FilesPage}))),Bt=a.lazy(()=>G(()=>import("./CollectionsPage-CjLs8_5j.js"),__vite__mapDeps([8,1,4,3])).then(n=>({default:n.CollectionsPage}))),Ut=a.lazy(()=>G(()=>import("./StatusPage-CzJZW8Gs.js"),__vite__mapDeps([9,1,10,3])).then(n=>({default:n.StatusPage}))),Ht=a.lazy(()=>G(()=>import("./SettingsPage-BAxB2264.js"),__vite__mapDeps([11,1,10,4,3])).then(n=>({default:n.SettingsPage}))),Vt=a.lazy(()=>G(()=>import("./ReaderSettingsContext-BLFJnEne.js"),__vite__mapDeps([2,1,3])).then(n=>({default:n.ReaderSettingsProvider})));function xe(){return i.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%"},children:i.jsx(xt,{})})}function Gt(){return i.jsxs("div",{className:"ws-center-pane",children:[i.jsx(_t,{}),i.jsx("div",{className:"ws-center-content",children:i.jsx(a.Suspense,{fallback:i.jsx(xe,{}),children:i.jsxs(nt,{children:[i.jsx(J,{path:"/",element:i.jsx(zt,{})}),i.jsx(J,{path:"/read",element:i.jsx(a.Suspense,{fallback:i.jsx(xe,{}),children:i.jsx(Vt,{children:i.jsx(Kt,{})})})}),i.jsx(J,{path:"/upload",element:i.jsx(Wt,{})}),i.jsx(J,{path:"/files",element:i.jsx(qt,{})}),i.jsx(J,{path:"/collections",element:i.jsx(Bt,{})}),i.jsx(J,{path:"/status",element:i.jsx(Ut,{})}),i.jsx(J,{path:"/settings",element:i.jsx(Ht,{})})]})})})]})}const Jt={theme:"system",lastBrowsedPath:"/",showHiddenFiles:!1,statsRefreshInterval:0},$e=a.createContext(null);function Qt(){return typeof window>"u"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Xt({children:n}){const[o,s]=F("rag-vault-preferences",Jt),e=o.theme==="system"?Qt():o.theme;a.useEffect(()=>{const h=document.documentElement;e==="dark"?h.classList.add("dark"):h.classList.remove("dark")},[e]),a.useEffect(()=>{if(o.theme!=="system")return;const h=window.matchMedia("(prefers-color-scheme: dark)"),g=()=>{const f=document.documentElement;h.matches?f.classList.add("dark"):f.classList.remove("dark")};return h.addEventListener("change",g),()=>h.removeEventListener("change",g)},[o.theme]);const t=a.useCallback(h=>{s(g=>({...g,theme:h}))},[s]),r=a.useCallback(h=>{s(g=>({...g,lastBrowsedPath:h}))},[s]),c=a.useCallback(h=>{s(g=>({...g,showHiddenFiles:h}))},[s]),l=a.useCallback(h=>{s(g=>({...g,statsRefreshInterval:h}))},[s]);return i.jsx($e.Provider,{value:{preferences:o,setTheme:t,setLastBrowsedPath:r,setShowHiddenFiles:c,setStatsRefreshInterval:l,effectiveTheme:e},children:n})}function Os(){const n=a.useContext($e);if(!n)throw new Error("usePreferences must be used within a PreferencesProvider");return n}const Yt="/api/v1/config",Zt=3e4;async function O(n,o,s=Zt){const e=new AbortController,t=setTimeout(()=>e.abort(),s);try{const r=await fetch(`${Yt}${n}`,{headers:{"Content-Type":"application/json",...o?.headers},...o,signal:e.signal}),c=await r.json();if(!r.ok)throw new Error(c.error||"Request failed");return c}catch(r){throw r instanceof Error&&r.name==="AbortError"?new Error("Request timed out"):r}finally{clearTimeout(t)}}async function en(){return O("/current")}async function tn(){return(await O("/databases")).databases}async function nn(n){return(await O("/databases/switch",{method:"POST",body:JSON.stringify({dbPath:n})})).config}async function sn(n,o,s){return(await O("/databases/create",{method:"POST",body:JSON.stringify({dbPath:n,name:o,modelName:s})})).config}async function on(n){return(await O("/databases/scan",{method:"POST",body:JSON.stringify({scanPath:n})})).databases}async function rn(n,o=!1){return(await O("/databases",{method:"DELETE",body:JSON.stringify({dbPath:n,deleteFiles:o})})).databases}async function an(){return O("/allowed-roots")}async function cn(n){return O("/allowed-roots",{method:"POST",body:JSON.stringify({path:n})})}async function ln(n){return O("/allowed-roots",{method:"DELETE",body:JSON.stringify({path:n})})}async function dn(n,o=!1){const s=new URLSearchParams({path:n});return o&&s.set("showHidden","true"),O(`/browse?${s.toString()}`)}async function un(){return(await O("/models")).models}async function hn(){return O("/export")}async function fn(n){return O("/import",{method:"POST",body:JSON.stringify({config:n})})}async function gn(){return(await O("/hybrid-weight")).weight}async function mn(n){await O("/hybrid-weight",{method:"PUT",body:JSON.stringify({weight:n})})}function pn(n=0){const{data:o,isLoading:s,error:e,refetch:t,isFetching:r}=H({queryKey:["config","current"],queryFn:en,refetchInterval:n>0?n:!1});return{config:o,isLoading:s,error:e,refetch:t,isFetching:r}}function Ls(){const{data:n,isLoading:o,error:s,refetch:e}=H({queryKey:["config","databases"],queryFn:tn});return{databases:n||[],isLoading:o,error:s,refetch:e}}function Fs(){const n=q(),{addToast:o}=K(),s=_({mutationFn:e=>nn(e),onSuccess:(e,t)=>{n.invalidateQueries({queryKey:["config"]}),n.invalidateQueries({queryKey:["files"]}),n.invalidateQueries({queryKey:["status"]}),o({type:"success",title:"Database switched",message:`Now using ${t.split("/").pop()||t}`})},onError:e=>{o({type:"error",title:"Failed to switch database",message:e.message})}});return{switchDatabase:s.mutate,switchDatabaseAsync:s.mutateAsync,isLoading:s.isPending,error:s.error,isSuccess:s.isSuccess}}function $s(){const n=q(),{addToast:o}=K(),s=_({mutationFn:({dbPath:e,name:t,modelName:r})=>sn(e,t,r),onSuccess:(e,t)=>{n.invalidateQueries({queryKey:["config"]}),n.invalidateQueries({queryKey:["files"]}),n.invalidateQueries({queryKey:["status"]}),o({type:"success",title:"Database created",message:`Created and switched to ${t.dbPath.split("/").pop()||t.dbPath}`})},onError:e=>{o({type:"error",title:"Failed to create database",message:e.message})}});return{createDatabase:s.mutate,createDatabaseAsync:s.mutateAsync,isLoading:s.isPending,error:s.error,isSuccess:s.isSuccess}}function _s(){const{addToast:n}=K(),o=_({mutationFn:s=>on(s),onError:s=>{n({type:"error",title:"Scan failed",message:s.message})}});return{scan:o.mutate,scanAsync:o.mutateAsync,isLoading:o.isPending,error:o.error,data:o.data,reset:o.reset}}function Ks(){const n=q(),{addToast:o}=K(),s=_({mutationFn:({dbPath:e,deleteFiles:t})=>rn(e,t),onSuccess:(e,t)=>{n.invalidateQueries({queryKey:["config","databases"]});const r=t.dbPath.split("/").pop()||t.dbPath;o({type:"success",title:"Database removed",message:t.deleteFiles?`Deleted ${r} and its files`:`Removed ${r} from list`})},onError:e=>{o({type:"error",title:"Failed to delete database",message:e.message})}});return{deleteDatabase:s.mutate,deleteDatabaseAsync:s.mutateAsync,isLoading:s.isPending,error:s.error}}function zs(){const{data:n,isLoading:o,error:s,refetch:e}=H({queryKey:["config","allowed-roots"],queryFn:an});return{data:n,isLoading:o,error:s,refetch:e}}function Ws(){const n=q(),{addToast:o}=K(),s=_({mutationFn:e=>cn(e),onSuccess:()=>{n.invalidateQueries({queryKey:["config","allowed-roots"]}),o({type:"success",title:"Root added",message:"Allowed root added successfully"})},onError:e=>{o({type:"error",title:"Failed to add root",message:e.message})}});return{addRoot:s.mutate,addRootAsync:s.mutateAsync,isLoading:s.isPending,error:s.error}}function qs(){const n=q(),{addToast:o}=K(),s=_({mutationFn:e=>ln(e),onSuccess:()=>{n.invalidateQueries({queryKey:["config","allowed-roots"]}),o({type:"success",title:"Root removed",message:"Allowed root removed successfully"})},onError:e=>{o({type:"error",title:"Failed to remove root",message:e.message})}});return{removeRoot:s.mutate,removeRootAsync:s.mutateAsync,isLoading:s.isPending,error:s.error}}function Bs(){const{addToast:n}=K(),o=_({mutationFn:({path:t,showHidden:r=!1})=>dn(t,r),onError:t=>{n({type:"error",title:"Failed to browse directory",message:t.message})}}),s=a.useCallback((t,r=!1)=>o.mutate({path:t,showHidden:r}),[o.mutate]),e=a.useCallback((t,r=!1)=>o.mutateAsync({path:t,showHidden:r}),[o.mutateAsync]);return{browse:s,browseAsync:e,isLoading:o.isPending,error:o.error,data:o.data,reset:o.reset}}function Us(){const{data:n,isLoading:o,error:s}=H({queryKey:["config","models"],queryFn:un});return{models:n||[],isLoading:o,error:s}}function Hs(){const{addToast:n}=K(),o=_({mutationFn:hn,onSuccess:()=>{n({type:"success",title:"Configuration exported",message:"Download should begin automatically"})},onError:s=>{n({type:"error",title:"Failed to export configuration",message:s.message})}});return{exportConfig:o.mutate,exportConfigAsync:o.mutateAsync,isLoading:o.isPending,error:o.error,data:o.data}}function Vs(){const n=q(),{addToast:o}=K(),s=_({mutationFn:e=>fn(e),onSuccess:()=>{n.invalidateQueries({queryKey:["config","allowed-roots"]}),o({type:"success",title:"Configuration imported",message:"Settings have been restored"})},onError:e=>{o({type:"error",title:"Failed to import configuration",message:e.message})}});return{importConfig:s.mutate,importConfigAsync:s.mutateAsync,isLoading:s.isPending,error:s.error}}function Gs(){const{data:n,isLoading:o,error:s,refetch:e}=H({queryKey:["config","hybrid-weight"],queryFn:gn});return{weight:n??.6,isLoading:o,error:s,refetch:e}}function Js(){const n=q(),{addToast:o}=K(),s=_({mutationFn:e=>mn(e),onSuccess:()=>{n.invalidateQueries({queryKey:["config","hybrid-weight"]}),o({type:"success",title:"Search weight updated",message:"Hybrid search weight has been adjusted"})},onError:e=>{o({type:"error",title:"Failed to update search weight",message:e.message})}});return{setWeight:s.mutate,setWeightAsync:s.mutateAsync,isLoading:s.isPending,error:s.error}}function bn(n){const{data:o=[],isLoading:s,error:e,refetch:t}=H({queryKey:["documentChunks",n],queryFn:()=>n?Me(n):Promise.resolve([]),enabled:!!n,staleTime:3e5});return{chunks:o,isLoading:s,error:e,refetch:t}}function _e(n,o,s){const{data:e=[],isLoading:t,error:r,refetch:c}=H({queryKey:["relatedChunks",n,o,s],queryFn:()=>n&&o!==null?mt(n,o):Promise.resolve([]),enabled:!!n&&o!==null,staleTime:3e5});return{related:e,isLoading:t,error:r,refetch:c}}function te(){return crypto.randomUUID()}async function ye(n){const s=new TextEncoder().encode(n),e=await crypto.subtle.digest("SHA-256",s);return Array.from(new Uint8Array(e)).map(r=>r.toString(16).padStart(2,"0")).join("")}function Q(n,o){return n.fingerprint&&o.fingerprint?n.fingerprint===o.fingerprint:n.filePath===o.filePath&&n.chunkIndex===o.chunkIndex}const xn={version:1,vaultId:"",pins:[],trails:[],bookmarks:[]},Ke=a.createContext(null);function yn({children:n,vaultId:o="default"}){const s=`rag-vault-links-v1-${o}`,[e,t]=F(s,{...xn,vaultId:o}),r=a.useCallback((R,T,C,I,N)=>{const E={id:te(),createdAt:new Date().toISOString(),sourceKey:R,sourceText:C.slice(0,200),sourceFingerprint:"",targetKey:T,targetText:I.slice(0,200),targetFingerprint:"",label:N?.label,autoGenerated:N?.autoGenerated??!1,originalScore:N?.originalScore};return Promise.all([ye(C),ye(I)]).then(([P,D])=>{t($=>({...$,pins:$.pins.map(Y=>Y.id===E.id?{...Y,sourceFingerprint:P,targetFingerprint:D}:Y)})),he("pin",{...R,fingerprint:P},{...T,fingerprint:D}).catch(()=>{})}).catch(P=>{console.warn("Failed to hash text for pin fingerprints, removing incomplete pin:",P),t(D=>({...D,pins:D.pins.filter($=>$.id!==E.id)}))}),t(P=>({...P,pins:[...P.pins,E]})),E},[t]),c=a.useCallback(R=>{const T=e.pins.find(C=>C.id===R);t(C=>({...C,pins:C.pins.filter(I=>I.id!==R)})),T&&he("unpin",{...T.sourceKey,fingerprint:T.sourceFingerprint},{...T.targetKey,fingerprint:T.targetFingerprint}).catch(()=>{})},[t,e.pins]),l=a.useCallback((R,T)=>{t(C=>({...C,pins:C.pins.map(I=>I.id===R?{...I,label:T}:I)}))},[t]),h=a.useCallback(R=>e.pins.filter(T=>Q(T.sourceKey,R)),[e.pins]),g=a.useCallback(R=>e.pins.filter(T=>Q(T.targetKey,R)),[e.pins]),f=a.useCallback((R,T)=>e.pins.some(C=>Q(C.sourceKey,R)&&Q(C.targetKey,T)),[e.pins]),[m,y]=F(`rag-vault-current-trail-${o}`,null),u=a.useCallback(()=>{const R={id:te(),name:"",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),steps:[]};y(R)},[y]),v=a.useCallback((R,T)=>{y(C=>{if(!C)return{id:te(),name:"",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString(),steps:[{chunkKey:R,visitedAt:new Date().toISOString(),connectionReason:T}]};const I=C.steps[C.steps.length-1];return I&&Q(I.chunkKey,R)?C:{...C,updatedAt:new Date().toISOString(),steps:[...C.steps,{chunkKey:R,visitedAt:new Date().toISOString(),connectionReason:T}]}})},[y]),w=a.useCallback(R=>{if(!m)throw new Error("No current trail to save");const T={...m,name:R,updatedAt:new Date().toISOString()};return t(C=>({...C,trails:[...C.trails,T]})),y(null),T},[m,t,y]),k=a.useCallback(R=>{const T=e.trails.find(C=>C.id===R);return T&&y({...T}),T||null},[e.trails,y]),x=a.useCallback(R=>{t(T=>({...T,trails:T.trails.filter(C=>C.id!==R)}))},[t]),b=a.useCallback(()=>{y(null)},[y]),d=a.useCallback((R,T)=>{const C={id:te(),chunkKey:R,note:T,createdAt:new Date().toISOString()};return t(I=>({...I,bookmarks:[...I.bookmarks||[],C]})),C},[t]),p=a.useCallback(R=>{t(T=>({...T,bookmarks:(T.bookmarks||[]).filter(C=>C.id!==R)}))},[t]),S=a.useCallback((R,T)=>{t(C=>({...C,bookmarks:(C.bookmarks||[]).map(I=>I.id===R?{...I,note:T}:I)}))},[t]),j=a.useCallback(R=>(e.bookmarks||[]).filter(T=>T.chunkKey.filePath===R).sort((T,C)=>T.chunkKey.chunkIndex-C.chunkKey.chunkIndex),[e.bookmarks]),A=a.useCallback(R=>(e.bookmarks||[]).some(T=>Q(T.chunkKey,R)),[e.bookmarks]),M=a.useCallback(R=>{const T=(e.bookmarks||[]).find(C=>Q(C.chunkKey,R));return T?(p(T.id),!1):(d(R),!0)},[e.bookmarks,d,p]),z=a.useCallback(()=>JSON.stringify(e,null,2),[e]),W=a.useCallback(R=>{const T=[];let C=0;try{const I=JSON.parse(R);if(I.version!==1)return T.push(`Unsupported version: ${I.version}`),{imported:C,errors:T};if(Array.isArray(I.pins))for(const N of I.pins)N.id&&N.sourceKey&&N.targetKey&&!e.pins.some(E=>E.id===N.id)&&(t(E=>({...E,pins:[...E.pins,N]})),C++);if(Array.isArray(I.trails))for(const N of I.trails)N.id&&N.name&&Array.isArray(N.steps)&&!e.trails.some(E=>E.id===N.id)&&(t(E=>({...E,trails:[...E.trails,N]})),C++);if(Array.isArray(I.bookmarks))for(const N of I.bookmarks)N.id&&N.chunkKey&&!(e.bookmarks||[]).some(E=>E.id===N.id)&&(t(E=>({...E,bookmarks:[...E.bookmarks||[],N]})),C++)}catch(I){T.push(`Invalid JSON: ${I.message}`)}return{imported:C,errors:T}},[e,t]),U=a.useMemo(()=>({pins:e.pins,createPin:r,deletePin:c,updatePinLabel:l,getPinsFromChunk:h,getBacklinks:g,isPinned:f,trails:e.trails,currentTrail:m,startNewTrail:u,addToTrail:v,saveTrail:w,loadTrail:k,deleteTrail:x,clearCurrentTrail:b,bookmarks:e.bookmarks||[],createBookmark:d,deleteBookmark:p,updateBookmarkNote:S,getBookmarksForDocument:j,isBookmarked:A,toggleBookmark:M,exportLinks:z,importLinks:W}),[e.pins,e.trails,e.bookmarks,r,c,l,h,g,f,m,u,v,w,k,x,b,d,p,S,j,A,M,z,W]);return i.jsx(Ke.Provider,{value:U,children:n})}function ze(){const n=a.useContext(Ke);if(!n)throw new Error("useLinks must be used within a LinksProvider");return n}function wn(){const n=ze(),o=a.useMemo(()=>{const e=new Set;for(const t of n.pins)e.add(`${t.targetKey.filePath}:${t.targetKey.chunkIndex}`);return e},[n.pins]),s=a.useCallback((e,t,r,c,l)=>{const h=n.pins.find(g=>g.sourceKey.filePath===e.filePath&&g.sourceKey.chunkIndex===e.chunkIndex&&g.targetKey.filePath===t.filePath&&g.targetKey.chunkIndex===t.chunkIndex);h?n.deletePin(h.id):n.createPin(e,t,r,c,{autoGenerated:!1,originalScore:l})},[n]);return{pins:n.pins,pinnedChunkKeys:o,createPin:n.createPin,deletePin:n.deletePin,updatePinLabel:n.updatePinLabel,isPinned:n.isPinned,togglePin:s,getPinsFromChunk:n.getPinsFromChunk}}function kn(n,o){const s=ze(),e=a.useMemo(()=>!n||o===null?[]:s.getBacklinks({filePath:n,chunkIndex:o}),[s,n,o]);return{backlinks:e,hasBacklinks:e.length>0,backlinkCount:e.length}}const vn=/^(#{1,6})\s+(.+)$/m,Sn=/^([A-Z][A-Z0-9\s]{4,79})$/m,Cn=/^(\d+(?:\.\d+)*)\s+(.+)$/m;function In(n){const o=n.match(vn);if(o){const[,t,r]=o;if(t&&r)return{text:r.trim(),level:t.length,type:"markdown"}}const s=n.match(Cn);if(s){const[,t,r]=s;if(t&&r){const c=t.split(".").length;return{text:`${t} ${r.trim()}`,level:c,type:"numbered"}}}const e=n.trim();if(e.length>=5&&e.length<=80){const t=e.match(Sn);if(t?.[1]){const r=t[1].match(/[A-Z]/g);if(r&&r.length>=3)return{text:t[1].trim(),level:1,type:"allcaps"}}}return null}function jn(n,o){const s=[],e=n.split(`
|
|
3
|
+
`);for(const t of e){const r=In(t);r&&s.push({...r,chunkIndex:o,text:r.text.length>80?`${r.text.slice(0,77)}...`:r.text})}return s}function En(n){const o=Math.max(1,Math.floor(n.length/10));return n.filter((s,e)=>e%o===0).map((s,e)=>({id:`fallback-${s.chunkIndex}`,text:`Section ${e+1}`,level:1,chunkIndex:s.chunkIndex,type:"fallback"}))}function Tn({chunks:n,minHeadings:o=2}){return a.useMemo(()=>{if(n.length===0)return{entries:[],hasHeadings:!1,isFallback:!1};const e=[];for(const c of n){const l=jn(c.text,c.chunkIndex);e.push(...l)}const t=[];for(const c of e){const l=t[t.length-1];(!l||l.text!==c.text||l.chunkIndex!==c.chunkIndex)&&t.push(c)}return t.length<o?{entries:En(n),hasHeadings:!1,isFallback:!0}:{entries:t.map((c,l)=>({...c,id:`toc-${l}-${c.chunkIndex}`})),hasHeadings:!0,isFallback:!1}},[n,o])}function we(){return crypto.randomUUID()}function An(n,o){return n.filePath===o.filePath&&n.chunkIndex===o.chunkIndex}const Nn={version:1,vaultId:"",highlights:[],annotations:[]},We=a.createContext(null);function Rn({children:n,vaultId:o="default"}){const s=`rag-vault-annotations-v1-${o}`,[e,t]=F(s,{...Nn,vaultId:o}),r=a.useCallback((k,x,b,d,p,S)=>{const j={id:we(),chunkKey:k,range:x,text:b,contextBefore:d.slice(-30),contextAfter:p.slice(0,30),color:S,createdAt:new Date().toISOString()};return t(A=>({...A,highlights:[...A.highlights,j]})),j},[t]),c=a.useCallback(k=>{t(x=>({...x,highlights:x.highlights.filter(b=>b.id!==k),annotations:x.annotations.filter(b=>b.highlightId!==k)}))},[t]),l=a.useCallback((k,x)=>{t(b=>({...b,highlights:b.highlights.map(d=>d.id===k?{...d,color:x}:d)}))},[t]),h=a.useCallback(k=>e.highlights.filter(x=>An(x.chunkKey,k)).sort((x,b)=>x.range.startOffset-b.range.startOffset),[e.highlights]),g=a.useCallback((k,x)=>{const b={id:we(),highlightId:k,note:x,createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return t(d=>({...d,annotations:[...d.annotations,b]})),b},[t]),f=a.useCallback((k,x)=>{t(b=>({...b,annotations:b.annotations.map(d=>d.id===k?{...d,note:x,updatedAt:new Date().toISOString()}:d)}))},[t]),m=a.useCallback(k=>{t(x=>({...x,annotations:x.annotations.filter(b=>b.id!==k)}))},[t]),y=a.useCallback(k=>e.annotations.find(x=>x.highlightId===k),[e.annotations]),u=a.useCallback(()=>JSON.stringify(e,null,2),[e]),v=a.useCallback(k=>{const x=[];let b=0;try{const d=JSON.parse(k);if(d.version!==1)return x.push(`Unsupported version: ${d.version}`),{imported:b,errors:x};if(Array.isArray(d.highlights))for(const p of d.highlights)p.id&&p.chunkKey&&p.range&&!e.highlights.some(S=>S.id===p.id)&&(t(S=>({...S,highlights:[...S.highlights,p]})),b++);if(Array.isArray(d.annotations))for(const p of d.annotations)p.id&&p.highlightId&&!e.annotations.some(S=>S.id===p.id)&&(t(S=>({...S,annotations:[...S.annotations,p]})),b++)}catch(d){x.push(`Invalid JSON: ${d.message}`)}return{imported:b,errors:x}},[e,t]),w=a.useMemo(()=>({highlights:e.highlights,createHighlight:r,deleteHighlight:c,updateHighlightColor:l,getHighlightsForChunk:h,annotations:e.annotations,createAnnotation:g,updateAnnotation:f,deleteAnnotation:m,getAnnotationForHighlight:y,exportAnnotations:u,importAnnotations:v}),[e.highlights,e.annotations,r,c,l,h,g,f,m,y,u,v]);return i.jsx(We.Provider,{value:w,children:n})}function Qs(){const n=a.useContext(We);if(!n)throw new Error("useAnnotations must be used within an AnnotationsProvider");return n}function Pn({filePath:n,activeChunkIndex:o,relatedChunks:s,pins:e,maxNodes:t=150}){const r=a.useMemo(()=>{const l=new Map,h=[],g=o!==null?`${n}:${o}`:null;g&&l.set(g,{id:g,filePath:n,chunkIndex:o,text:"(current chunk)"});for(const u of s){const v=`${u.filePath}:${u.chunkIndex}`;l.has(v)||l.set(v,{id:v,filePath:u.filePath,chunkIndex:u.chunkIndex,text:u.text.slice(0,100)+(u.text.length>100?"...":"")}),g&&g!==v&&h.push({source:g,target:v,score:u.score,type:"semantic",label:u.connectionReason})}for(const u of e){const v=`${u.sourceKey.filePath}:${u.sourceKey.chunkIndex}`,w=`${u.targetKey.filePath}:${u.targetKey.chunkIndex}`;l.has(v)||l.set(v,{id:v,filePath:u.sourceKey.filePath,chunkIndex:u.sourceKey.chunkIndex,text:u.sourceText.slice(0,100)+(u.sourceText.length>100?"...":"")}),l.has(w)||l.set(w,{id:w,filePath:u.targetKey.filePath,chunkIndex:u.targetKey.chunkIndex,text:u.targetText.slice(0,100)+(u.targetText.length>100?"...":"")});const k=h.findIndex(x=>x.source===v&&x.target===w);if(k>=0){const x=h[k];x&&(h[k]={...x,type:"pinned",label:u.label||x.label})}else h.push({source:v,target:w,score:u.originalScore??.5,type:"pinned",label:u.label})}let f=Array.from(l.values());if(f.length>t){const u=new Set(e.flatMap(x=>[`${x.sourceKey.filePath}:${x.sourceKey.chunkIndex}`,`${x.targetKey.filePath}:${x.targetKey.chunkIndex}`])),v=f.filter(x=>x.id===g||u.has(x.id)),w=Math.max(0,t-v.length),k=f.filter(x=>x.id!==g&&!u.has(x.id)).slice(0,w);f=v.concat(k)}const m=new Set(f.map(u=>u.id)),y=h.filter(u=>m.has(u.source)&&m.has(u.target));return{nodes:f,edges:y}},[n,o,s,e,t]),c=o!==null?`${n}:${o}`:null;return{graphData:r,currentNodeId:c}}function ke(){return crypto.randomUUID()}const Mn={version:1,vaultId:"",updatedAt:new Date().toISOString(),tags:[],taggedItems:[]},Xs={red:{bg:"bg-red-100 dark:bg-red-900/40",text:"text-red-700 dark:text-red-300",border:"border-red-200 dark:border-red-800"},orange:{bg:"bg-orange-100 dark:bg-orange-900/40",text:"text-orange-700 dark:text-orange-300",border:"border-orange-200 dark:border-orange-800"},yellow:{bg:"bg-yellow-100 dark:bg-yellow-900/40",text:"text-yellow-700 dark:text-yellow-300",border:"border-yellow-200 dark:border-yellow-800"},green:{bg:"bg-green-100 dark:bg-green-900/40",text:"text-green-700 dark:text-green-300",border:"border-green-200 dark:border-green-800"},blue:{bg:"bg-blue-100 dark:bg-blue-900/40",text:"text-blue-700 dark:text-blue-300",border:"border-blue-200 dark:border-blue-800"},purple:{bg:"bg-purple-100 dark:bg-purple-900/40",text:"text-purple-700 dark:text-purple-300",border:"border-purple-200 dark:border-purple-800"},pink:{bg:"bg-pink-100 dark:bg-pink-900/40",text:"text-pink-700 dark:text-pink-300",border:"border-pink-200 dark:border-pink-800"},gray:{bg:"bg-gray-100 dark:bg-gray-700",text:"text-gray-700 dark:text-gray-300",border:"border-gray-200 dark:border-gray-600"}},qe=a.createContext(null);function Dn({children:n,vaultId:o="default"}){const s=`rag-vault-tags-v1-${o}`,[e,t]=F(s,{...Mn,vaultId:o}),r=a.useCallback((d,p)=>{const S={id:ke(),name:d.trim(),color:p,usageCount:0,lastUsedAt:new Date().toISOString(),createdAt:new Date().toISOString()};return t(j=>({...j,updatedAt:new Date().toISOString(),tags:[...j.tags,S]})),S},[t]),c=a.useCallback((d,p)=>{t(S=>({...S,updatedAt:new Date().toISOString(),tags:S.tags.map(j=>{if(j.id!==d)return j;const A={...p};return A.name!==void 0&&(A.name=A.name.trim()),{...j,...A}})}))},[t]),l=a.useCallback(d=>{t(p=>({...p,updatedAt:new Date().toISOString(),tags:p.tags.filter(S=>S.id!==d),taggedItems:p.taggedItems.filter(S=>S.tagId!==d)}))},[t]),h=a.useCallback(d=>e.tags.find(p=>p.id===d),[e.tags]),g=a.useCallback((d,p,S)=>{const j={id:ke(),tagId:d,targetType:p,targetKey:S,createdAt:new Date().toISOString()};return t(A=>({...A,updatedAt:new Date().toISOString(),taggedItems:[...A.taggedItems,j],tags:A.tags.map(M=>M.id===d?{...M,usageCount:M.usageCount+1,lastUsedAt:new Date().toISOString()}:M)})),j},[t]),f=a.useCallback(d=>{t(p=>({...p,updatedAt:new Date().toISOString(),taggedItems:p.taggedItems.filter(S=>S.id!==d)}))},[t]),m=a.useCallback((d,p,S)=>{t(j=>({...j,updatedAt:new Date().toISOString(),taggedItems:j.taggedItems.filter(A=>!(A.tagId===d&&A.targetType===p&&A.targetKey===S))}))},[t]),y=a.useCallback((d,p)=>{const S=e.taggedItems.filter(j=>j.targetType===d&&j.targetKey===p).map(j=>j.tagId);return e.tags.filter(j=>S.includes(j.id))},[e.tags,e.taggedItems]),u=a.useCallback(d=>e.taggedItems.filter(p=>p.tagId===d),[e.taggedItems]),v=a.useCallback((d,p,S)=>e.taggedItems.some(j=>j.tagId===d&&j.targetType===p&&j.targetKey===S),[e.taggedItems]),w=a.useCallback((d=10)=>[...e.tags].sort((p,S)=>S.usageCount!==p.usageCount?S.usageCount-p.usageCount:new Date(S.lastUsedAt).getTime()-new Date(p.lastUsedAt).getTime()).slice(0,d),[e.tags]),k=a.useCallback(()=>JSON.stringify(e,null,2),[e]),x=a.useCallback(d=>{const p=[];let S=0;try{const j=JSON.parse(d);if(j.version!==1)return p.push(`Unsupported version: ${j.version}`),{imported:S,errors:p};if(Array.isArray(j.tags))for(const A of j.tags)A.id&&A.name&&!e.tags.some(M=>M.id===A.id)&&(t(M=>({...M,updatedAt:new Date().toISOString(),tags:[...M.tags,A]})),S++);if(Array.isArray(j.taggedItems))for(const A of j.taggedItems)A.id&&A.tagId&&A.targetKey&&!e.taggedItems.some(M=>M.id===A.id)&&(t(M=>({...M,updatedAt:new Date().toISOString(),taggedItems:[...M.taggedItems,A]})),S++)}catch(j){p.push(`Invalid JSON: ${j.message}`)}return{imported:S,errors:p}},[e,t]),b=a.useMemo(()=>({tags:e.tags,createTag:r,updateTag:c,deleteTag:l,getTag:h,taggedItems:e.taggedItems,addTag:g,removeTag:f,removeTagFromTarget:m,getTagsForTarget:y,getTargetsForTag:u,isTagged:v,getTagSuggestions:w,exportTags:k,importTags:x}),[e.tags,e.taggedItems,r,c,l,h,g,f,m,y,u,v,w,k,x]);return i.jsx(qe.Provider,{value:b,children:n})}function Ys(){const n=a.useContext(qe);if(!n)throw new Error("useTags must be used within a TagsProvider");return n}function On(){return crypto.randomUUID()}const Ln={version:1,vaultId:"",updatedAt:new Date().toISOString(),collections:[]},Zs=["red","orange","yellow","green","blue","purple","pink","gray"],eo={red:{bg:"bg-red-100 dark:bg-red-900/40",text:"text-red-700 dark:text-red-300",border:"border-red-200 dark:border-red-800"},orange:{bg:"bg-orange-100 dark:bg-orange-900/40",text:"text-orange-700 dark:text-orange-300",border:"border-orange-200 dark:border-orange-800"},yellow:{bg:"bg-yellow-100 dark:bg-yellow-900/40",text:"text-yellow-700 dark:text-yellow-300",border:"border-yellow-200 dark:border-yellow-800"},green:{bg:"bg-green-100 dark:bg-green-900/40",text:"text-green-700 dark:text-green-300",border:"border-green-200 dark:border-green-800"},blue:{bg:"bg-blue-100 dark:bg-blue-900/40",text:"text-blue-700 dark:text-blue-300",border:"border-blue-200 dark:border-blue-800"},purple:{bg:"bg-purple-100 dark:bg-purple-900/40",text:"text-purple-700 dark:text-purple-300",border:"border-purple-200 dark:border-purple-800"},pink:{bg:"bg-pink-100 dark:bg-pink-900/40",text:"text-pink-700 dark:text-pink-300",border:"border-pink-200 dark:border-pink-800"},gray:{bg:"bg-gray-100 dark:bg-gray-700",text:"text-gray-700 dark:text-gray-300",border:"border-gray-200 dark:border-gray-600"}},Be=a.createContext(null);function Fn({children:n,vaultId:o="default"}){const s=`rag-vault-collections-v1-${o}`,[e,t]=F(s,{...Ln,vaultId:o}),r=a.useCallback((x,b,d)=>{const p={id:On(),name:x.trim(),description:d?.trim(),color:b,documents:[],createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()};return t(S=>({...S,updatedAt:new Date().toISOString(),collections:[...S.collections,p]})),p},[t]),c=a.useCallback((x,b)=>{t(d=>({...d,updatedAt:new Date().toISOString(),collections:d.collections.map(p=>p.id===x?{...p,...b,updatedAt:new Date().toISOString()}:p)}))},[t]),l=a.useCallback(x=>{t(b=>({...b,updatedAt:new Date().toISOString(),collections:b.collections.filter(d=>d.id!==x)}))},[t]),h=a.useCallback(x=>e.collections.find(b=>b.id===x),[e.collections]),g=a.useCallback((x,b)=>{t(d=>({...d,updatedAt:new Date().toISOString(),collections:d.collections.map(p=>p.id!==x||p.documents.includes(b)?p:{...p,documents:[...p.documents,b],updatedAt:new Date().toISOString()})}))},[t]),f=a.useCallback((x,b)=>{t(d=>({...d,updatedAt:new Date().toISOString(),collections:d.collections.map(p=>p.id!==x?p:{...p,documents:p.documents.filter(S=>S!==b),updatedAt:new Date().toISOString()})}))},[t]),m=a.useCallback(x=>e.collections.filter(b=>b.documents.includes(x)),[e.collections]),y=a.useCallback(x=>e.collections.find(d=>d.id===x)?.documents??[],[e.collections]),u=a.useCallback((x,b)=>e.collections.find(p=>p.id===x)?.documents.includes(b)??!1,[e.collections]),v=a.useCallback(()=>JSON.stringify(e,null,2),[e]),w=a.useCallback(x=>{const b=[];let d=0;try{const p=JSON.parse(x);if(p.version!==1)return b.push(`Unsupported version: ${p.version}`),{imported:d,errors:b};if(Array.isArray(p.collections))for(const S of p.collections)S.id&&S.name&&!e.collections.some(j=>j.id===S.id)&&(t(j=>({...j,updatedAt:new Date().toISOString(),collections:[...j.collections,S]})),d++)}catch(p){b.push(`Invalid JSON: ${p.message}`)}return{imported:d,errors:b}},[e,t]),k=a.useMemo(()=>({collections:e.collections,createCollection:r,updateCollection:c,deleteCollection:l,getCollection:h,addDocumentToCollection:g,removeDocumentFromCollection:f,getCollectionsForDocument:m,getDocumentsInCollection:y,isDocumentInCollection:u,exportCollections:v,importCollections:w}),[e.collections,r,c,l,h,g,f,m,y,u,v,w]);return i.jsx(Be.Provider,{value:k,children:n})}function to(){const n=a.useContext(Be);if(!n)throw new Error("useCollections must be used within a CollectionsProvider");return n}const re={pan:{x:0,y:0},zoom:1},ve={version:1,vaultId:"",nodePositions:{},viewState:re},$n=a.createContext(null);function _n({children:n,vaultId:o="default"}){const s=`rag-vault-graph-state-v1-${o}`,[e,t]=F(s,{...ve,vaultId:o}),r=a.useCallback(k=>e.nodePositions[k],[e.nodePositions]),c=a.useCallback((k,x)=>{t(b=>({...b,nodePositions:{...b.nodePositions,[k]:{x:x.x,y:x.y,fixedAt:new Date().toISOString()}}}))},[t]),l=a.useCallback(()=>{t(k=>({...k,nodePositions:{}}))},[t]),h=a.useCallback(k=>{t(x=>({...x,viewState:{...x.viewState,pan:k}}))},[t]),g=a.useCallback(k=>{t(x=>({...x,viewState:{...x.viewState,zoom:k}}))},[t]),f=a.useCallback(k=>{t(x=>({...x,viewState:k}))},[t]),m=a.useCallback(()=>{t(k=>({...k,viewState:re}))},[t]),y=a.useCallback(()=>{t(k=>({...ve,vaultId:k.vaultId}))},[t]),u=a.useCallback(()=>JSON.stringify(e,null,2),[e]),v=a.useCallback(k=>{try{const x=JSON.parse(k);return x.version!==1?{success:!1,error:`Unsupported version: ${x.version}`}:(t(b=>({...b,nodePositions:x.nodePositions||{},viewState:x.viewState||re})),{success:!0})}catch(x){return{success:!1,error:`Invalid JSON: ${x.message}`}}},[t]),w=a.useMemo(()=>({nodePositions:e.nodePositions,getNodePosition:r,setNodePosition:c,clearNodePositions:l,viewState:e.viewState,setPan:h,setZoom:g,setViewState:f,resetViewState:m,resetAll:y,exportGraphState:u,importGraphState:v}),[e.nodePositions,e.viewState,r,c,l,h,g,f,m,y,u,v]);return i.jsx($n.Provider,{value:w,children:n})}const Kn={version:1,vaultId:"",documents:{}},zn=a.createContext(null);function Wn({children:n,vaultId:o="default"}){const s=`rag-vault-reading-stats-v1-${o}`,[e,t]=F(s,{...Kn,vaultId:o}),r=a.useCallback(b=>e.documents[b],[e.documents]),c=a.useCallback((b,d)=>{const p=e.documents[b];if(p)return p.chunkStats[d]},[e.documents]),l=a.useCallback((b,d)=>{const p=e.documents[b];return p?p.totalChunks!==d?{...p,totalChunks:d}:p:{filePath:b,totalChunks:d,chunksRead:0,totalTimeMs:0,sessions:[],chunkStats:{}}},[e.documents]),h=a.useCallback((b,d,p)=>{t(S=>{const j=l(b,p),A=j.chunkStats[d]||{totalTimeMs:0,readCount:0,lastReadAt:""},M=A.readCount===0,z={...A,readCount:A.readCount+1,lastReadAt:new Date().toISOString()},W={...j,chunksRead:M?j.chunksRead+1:j.chunksRead,chunkStats:{...j.chunkStats,[d]:z}};return{...S,documents:{...S.documents,[b]:W}}})},[t,l]),g=a.useCallback((b,d,p)=>{p<=0||t(S=>{const j=S.documents[b];if(!j)return S;const A=j.chunkStats[d]||{totalTimeMs:0,readCount:0,lastReadAt:new Date().toISOString()},M={...A,totalTimeMs:A.totalTimeMs+p},z=!j.chunkStats[d],W={...j,totalTimeMs:j.totalTimeMs+p,chunksRead:z?j.chunksRead+1:j.chunksRead,chunkStats:{...j.chunkStats,[d]:M}};return{...S,documents:{...S.documents,[b]:W}}})},[t]),f=a.useCallback(b=>{t(d=>{const p=d.documents[b];if(!p)return d;const S=p.sessions[p.sessions.length-1];if(S&&!S.endedAt)return d;const j={startedAt:new Date().toISOString(),endedAt:"",durationMs:0},A=[...p.sessions,j].slice(-10);return{...d,documents:{...d.documents,[b]:{...p,sessions:A}}}})},[t]),m=a.useCallback(b=>{t(d=>{const p=d.documents[b];if(!p)return d;const S=[...p.sessions],j=S[S.length-1];if(!j||j.endedAt)return d;const A=new Date().toISOString(),M=new Date(A).getTime()-new Date(j.startedAt).getTime();return S[S.length-1]={...j,endedAt:A,durationMs:M},{...d,documents:{...d.documents,[b]:{...p,sessions:S}}}})},[t]),y=a.useCallback(b=>{const d=e.documents[b];return!d||d.totalChunks===0?0:Math.round(d.chunksRead/d.totalChunks*100)},[e.documents]),u=a.useCallback(b=>e.documents[b]?.totalTimeMs??0,[e.documents]),v=a.useCallback(b=>{const d=e.documents[b];return!d||d.chunksRead===0?0:Math.round(d.totalTimeMs/d.chunksRead)},[e.documents]),w=a.useCallback(()=>JSON.stringify(e,null,2),[e]),k=a.useCallback(b=>{t(b?d=>{const{[b]:p,...S}=d.documents;return{...d,documents:S}}:d=>({...d,documents:{}}))},[t]),x=a.useMemo(()=>({getDocumentStats:r,getChunkStats:c,recordChunkView:h,recordTimeSpent:g,startSession:f,endSession:m,getCompletionPercent:y,getTotalReadingTime:u,getAverageTimePerChunk:v,exportStats:w,clearStats:k}),[r,c,h,g,f,m,y,u,v,w,k]);return i.jsx(zn.Provider,{value:x,children:n})}const qn=[{to:"/",label:"Search",shortcut:""},{to:"/upload",label:"Upload",shortcut:""},{to:"/files",label:"Files",shortcut:""},{to:"/collections",label:"Collections",shortcut:""},{to:"/status",label:"Status",shortcut:""},{to:"/settings",label:"Settings",shortcut:""}];function Bn({collapsed:n,onToggle:o,width:s}){const{config:e}=pn();return i.jsxs("aside",{className:"ws-left-rail",style:{width:n?"var(--ws-left-rail-collapsed)":s},children:[i.jsx("nav",{className:"ws-left-rail-nav",children:qn.map(t=>i.jsx($t,{content:t.label,side:"right",delay:n?100:1e3,children:i.jsxs(st,{to:t.to,className:({isActive:r})=>`ws-nav-item ${r?"ws-nav-item--active":""} ${n?"ws-nav-item--collapsed":""}`,end:t.to==="/",children:[i.jsx("span",{className:"ws-nav-icon",children:t.label.charAt(0)}),!n&&i.jsx("span",{className:"ws-nav-label",children:t.label})]})},t.to))}),i.jsx("div",{style:{flex:1}}),e&&!n&&i.jsx("div",{className:"ws-left-rail-footer",children:i.jsxs("div",{className:"ws-db-indicator",title:e.dbPath,children:[i.jsx("span",{className:"ws-db-dot"}),i.jsx("span",{className:"ws-db-name",children:e.name}),i.jsxs("span",{className:"ws-db-count",children:[e.documentCount," docs"]})]})}),i.jsx("button",{type:"button",className:"ws-rail-toggle",onClick:o,"aria-label":"Toggle left rail",children:n?"›":"‹"})]})}function Se({onResize:n,direction:o}){const s=a.useRef(0),e=a.useRef(null);a.useEffect(()=>()=>{e.current?.()},[]);const t=a.useCallback(r=>{r.preventDefault(),s.current=r.clientX;const c=h=>{const g=h.clientX-s.current;s.current=h.clientX,n(o==="right"?-g:g)},l=()=>{document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l),document.body.style.cursor="",document.body.style.userSelect="",e.current=null};document.addEventListener("mousemove",c),document.addEventListener("mouseup",l),document.body.style.cursor="col-resize",document.body.style.userSelect="none",e.current=()=>{document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",l),document.body.style.cursor="",document.body.style.userSelect=""}},[n,o]);return i.jsx("div",{className:"ws-resize-handle",onMouseDown:t,role:"separator","aria-orientation":"vertical","aria-valuenow":50,tabIndex:0})}const Ce=12;function ae(n={}){const{delay:o=300,hideDelay:s=150}=n,[e,t]=a.useState({isVisible:!1,position:{x:0,y:0},targetRef:null}),r=a.useRef(null),c=a.useRef(null),l=a.useCallback(()=>{r.current!==null&&(clearTimeout(r.current),r.current=null)},[]),h=a.useCallback(()=>{c.current!==null&&(clearTimeout(c.current),c.current=null)},[]),g=a.useCallback(()=>{l(),h()},[l,h]),f=a.useCallback((w,k)=>{h();const x=k.left+k.width/2,b=k.bottom+8,d=Math.max(Ce,Math.min(x,window.innerWidth-Ce)),S=window.innerHeight-k.bottom<200?k.top-8:b;l(),r.current=setTimeout(()=>{t({isVisible:!0,position:{x:d,y:S},targetRef:w})},o)},[o,h,l]),m=a.useCallback(()=>{l(),c.current=setTimeout(()=>{t(w=>({...w,isVisible:!1,targetRef:null}))},s)},[s,l]),y=a.useCallback(()=>{h()},[h]),u=a.useCallback(()=>{c.current=setTimeout(()=>{t(w=>({...w,isVisible:!1,targetRef:null}))},s)},[s]),v=a.useCallback(()=>{g(),t({isVisible:!1,position:{x:0,y:0},targetRef:null})},[g]);return a.useEffect(()=>()=>g(),[g]),{state:e,onHoverStart:f,onHoverEnd:m,onPreviewEnter:y,onPreviewLeave:u,hide:v}}const se=150,X=12;function Un(n){if(n.length<=se)return n;const o=n.slice(0,se),s=o.lastIndexOf(" ");return s>se*.6?`${o.slice(0,s)}...`:`${o}...`}function Hn(n){return`${Math.round(n*100)}%`}function ie({docTitle:n,excerpt:o,backlinkCount:s,score:e,position:t,onNavigate:r,onOpenInNewTab:c,onPinAsLink:l,onMouseEnter:h,onMouseLeave:g}){const f=a.useRef(null),[m,y]=a.useState(t),[u,v]=a.useState(!0),w=s!==void 0&&s>0||e!==void 0,k=c!==void 0||l!==void 0;return a.useEffect(()=>{const x=f.current;if(!x)return;const b=x.getBoundingClientRect();let{x:d,y:p}=t;d=d-b.width/2,d+b.width>window.innerWidth-X&&(d=window.innerWidth-X-b.width),d<X&&(d=X),p+b.height>window.innerHeight-X&&(p=t.y-b.height-16),p<X&&(p=X),y({x:d,y:p})},[t]),a.useEffect(()=>{const x=requestAnimationFrame(()=>{v(!1)});return()=>cancelAnimationFrame(x)},[]),i.jsxs("div",{ref:f,className:`ws-hover-preview ${u?"ws-hover-preview--entering":""}`,style:{left:m.x,top:m.y},onMouseEnter:h,onMouseLeave:g,children:[i.jsx("div",{className:"ws-hover-preview-title",children:n}),o&&i.jsx("p",{className:"ws-hover-preview-excerpt",children:Un(o)}),w&&i.jsxs("div",{className:"ws-hover-preview-meta",children:[s!==void 0&&s>0&&i.jsxs("span",{className:"ws-badge","data-variant":"link-backlink",children:[s," ",s===1?"backlink":"backlinks"]}),e!==void 0&&i.jsxs("span",{className:"ws-badge","data-variant":"link-semantic",children:[Hn(e)," match"]})]}),i.jsxs("div",{className:"ws-hover-preview-actions",children:[i.jsx("button",{type:"button",className:"ws-button","data-variant":"primary","data-size":"sm",onClick:r,children:"Open"}),k&&i.jsxs("div",{className:"ws-hover-preview-secondary-actions",children:[c&&i.jsx("button",{type:"button",className:"ws-button","data-variant":"ghost","data-size":"sm",onClick:c,children:"New Tab"}),l&&i.jsx("button",{type:"button",className:"ws-button","data-variant":"ghost","data-size":"sm",onClick:l,children:"Pin as Link"})]})]})]})}function L({message:n}){return i.jsx("div",{className:"ws-rail-empty-state",children:i.jsx("p",{children:n})})}function Z(n,o,s){let e=s.initialDeps??[],t,r=!0;function c(){var l,h,g;let f;s.key&&((l=s.debug)!=null&&l.call(s))&&(f=Date.now());const m=n();if(!(m.length!==e.length||m.some((v,w)=>e[w]!==v)))return t;e=m;let u;if(s.key&&((h=s.debug)!=null&&h.call(s))&&(u=Date.now()),t=o(...m),s.key&&((g=s.debug)!=null&&g.call(s))){const v=Math.round((Date.now()-f)*100)/100,w=Math.round((Date.now()-u)*100)/100,k=w/16,x=(b,d)=>{for(b=String(b);b.length<d;)b=" "+b;return b};console.info(`%c⏱ ${x(w,5)} /${x(v,5)} ms`,`
|
|
4
|
+
font-size: .6rem;
|
|
5
|
+
font-weight: bold;
|
|
6
|
+
color: hsl(${Math.max(0,Math.min(120-120*k,120))}deg 100% 31%);`,s?.key)}return s?.onChange&&!(r&&s.skipInitialOnChange)&&s.onChange(t),r=!1,t}return c.updateDeps=l=>{e=l},c}function Ie(n,o){if(n===void 0)throw new Error("Unexpected undefined");return n}const Vn=(n,o)=>Math.abs(n-o)<1.01,Gn=(n,o,s)=>{let e;return function(...t){n.clearTimeout(e),e=n.setTimeout(()=>o.apply(this,t),s)}},je=n=>{const{offsetWidth:o,offsetHeight:s}=n;return{width:o,height:s}},Jn=n=>n,Qn=n=>{const o=Math.max(n.startIndex-n.overscan,0),s=Math.min(n.endIndex+n.overscan,n.count-1),e=[];for(let t=o;t<=s;t++)e.push(t);return e},Xn=(n,o)=>{const s=n.scrollElement;if(!s)return;const e=n.targetWindow;if(!e)return;const t=c=>{const{width:l,height:h}=c;o({width:Math.round(l),height:Math.round(h)})};if(t(je(s)),!e.ResizeObserver)return()=>{};const r=new e.ResizeObserver(c=>{const l=()=>{const h=c[0];if(h?.borderBoxSize){const g=h.borderBoxSize[0];if(g){t({width:g.inlineSize,height:g.blockSize});return}}t(je(s))};n.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(l):l()});return r.observe(s,{box:"border-box"}),()=>{r.unobserve(s)}},Ee={passive:!0},Te=typeof window>"u"?!0:"onscrollend"in window,Yn=(n,o)=>{const s=n.scrollElement;if(!s)return;const e=n.targetWindow;if(!e)return;let t=0;const r=n.options.useScrollendEvent&&Te?()=>{}:Gn(e,()=>{o(t,!1)},n.options.isScrollingResetDelay),c=f=>()=>{const{horizontal:m,isRtl:y}=n.options;t=m?s.scrollLeft*(y&&-1||1):s.scrollTop,r(),o(t,f)},l=c(!0),h=c(!1);s.addEventListener("scroll",l,Ee);const g=n.options.useScrollendEvent&&Te;return g&&s.addEventListener("scrollend",h,Ee),()=>{s.removeEventListener("scroll",l),g&&s.removeEventListener("scrollend",h)}},Zn=(n,o,s)=>{if(o?.borderBoxSize){const e=o.borderBoxSize[0];if(e)return Math.round(e[s.options.horizontal?"inlineSize":"blockSize"])}return n[s.options.horizontal?"offsetWidth":"offsetHeight"]},es=(n,{adjustments:o=0,behavior:s},e)=>{var t,r;const c=n+o;(r=(t=e.scrollElement)==null?void 0:t.scrollTo)==null||r.call(t,{[e.options.horizontal?"left":"top"]:c,behavior:s})};class ts{constructor(o){this.unsubs=[],this.scrollElement=null,this.targetWindow=null,this.isScrolling=!1,this.currentScrollToIndex=null,this.measurementsCache=[],this.itemSizeCache=new Map,this.laneAssignments=new Map,this.pendingMeasuredCacheIndexes=[],this.prevLanes=void 0,this.lanesChangedFlag=!1,this.lanesSettling=!1,this.scrollRect=null,this.scrollOffset=null,this.scrollDirection=null,this.scrollAdjustments=0,this.elementsCache=new Map,this.observer=(()=>{let s=null;const e=()=>s||(!this.targetWindow||!this.targetWindow.ResizeObserver?null:s=new this.targetWindow.ResizeObserver(t=>{t.forEach(r=>{const c=()=>{this._measureElement(r.target,r)};this.options.useAnimationFrameWithResizeObserver?requestAnimationFrame(c):c()})}));return{disconnect:()=>{var t;(t=e())==null||t.disconnect(),s=null},observe:t=>{var r;return(r=e())==null?void 0:r.observe(t,{box:"border-box"})},unobserve:t=>{var r;return(r=e())==null?void 0:r.unobserve(t)}}})(),this.range=null,this.setOptions=s=>{Object.entries(s).forEach(([e,t])=>{typeof t>"u"&&delete s[e]}),this.options={debug:!1,initialOffset:0,overscan:1,paddingStart:0,paddingEnd:0,scrollPaddingStart:0,scrollPaddingEnd:0,horizontal:!1,getItemKey:Jn,rangeExtractor:Qn,onChange:()=>{},measureElement:Zn,initialRect:{width:0,height:0},scrollMargin:0,gap:0,indexAttribute:"data-index",initialMeasurementsCache:[],lanes:1,isScrollingResetDelay:150,enabled:!0,isRtl:!1,useScrollendEvent:!1,useAnimationFrameWithResizeObserver:!1,...s}},this.notify=s=>{var e,t;(t=(e=this.options).onChange)==null||t.call(e,this,s)},this.maybeNotify=Z(()=>(this.calculateRange(),[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]),s=>{this.notify(s)},{key:!1,debug:()=>this.options.debug,initialDeps:[this.isScrolling,this.range?this.range.startIndex:null,this.range?this.range.endIndex:null]}),this.cleanup=()=>{this.unsubs.filter(Boolean).forEach(s=>s()),this.unsubs=[],this.observer.disconnect(),this.scrollElement=null,this.targetWindow=null},this._didMount=()=>()=>{this.cleanup()},this._willUpdate=()=>{var s;const e=this.options.enabled?this.options.getScrollElement():null;if(this.scrollElement!==e){if(this.cleanup(),!e){this.maybeNotify();return}this.scrollElement=e,this.scrollElement&&"ownerDocument"in this.scrollElement?this.targetWindow=this.scrollElement.ownerDocument.defaultView:this.targetWindow=((s=this.scrollElement)==null?void 0:s.window)??null,this.elementsCache.forEach(t=>{this.observer.observe(t)}),this.unsubs.push(this.options.observeElementRect(this,t=>{this.scrollRect=t,this.maybeNotify()})),this.unsubs.push(this.options.observeElementOffset(this,(t,r)=>{this.scrollAdjustments=0,this.scrollDirection=r?this.getScrollOffset()<t?"forward":"backward":null,this.scrollOffset=t,this.isScrolling=r,this.maybeNotify()})),this._scrollToOffset(this.getScrollOffset(),{adjustments:void 0,behavior:void 0})}},this.getSize=()=>this.options.enabled?(this.scrollRect=this.scrollRect??this.options.initialRect,this.scrollRect[this.options.horizontal?"width":"height"]):(this.scrollRect=null,0),this.getScrollOffset=()=>this.options.enabled?(this.scrollOffset=this.scrollOffset??(typeof this.options.initialOffset=="function"?this.options.initialOffset():this.options.initialOffset),this.scrollOffset):(this.scrollOffset=null,0),this.getFurthestMeasurement=(s,e)=>{const t=new Map,r=new Map;for(let c=e-1;c>=0;c--){const l=s[c];if(t.has(l.lane))continue;const h=r.get(l.lane);if(h==null||l.end>h.end?r.set(l.lane,l):l.end<h.end&&t.set(l.lane,!0),t.size===this.options.lanes)break}return r.size===this.options.lanes?Array.from(r.values()).sort((c,l)=>c.end===l.end?c.index-l.index:c.end-l.end)[0]:void 0},this.getMeasurementOptions=Z(()=>[this.options.count,this.options.paddingStart,this.options.scrollMargin,this.options.getItemKey,this.options.enabled,this.options.lanes],(s,e,t,r,c,l)=>(this.prevLanes!==void 0&&this.prevLanes!==l&&(this.lanesChangedFlag=!0),this.prevLanes=l,this.pendingMeasuredCacheIndexes=[],{count:s,paddingStart:e,scrollMargin:t,getItemKey:r,enabled:c,lanes:l}),{key:!1}),this.getMeasurements=Z(()=>[this.getMeasurementOptions(),this.itemSizeCache],({count:s,paddingStart:e,scrollMargin:t,getItemKey:r,enabled:c,lanes:l},h)=>{if(!c)return this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),[];if(this.laneAssignments.size>s)for(const y of this.laneAssignments.keys())y>=s&&this.laneAssignments.delete(y);this.lanesChangedFlag&&(this.lanesChangedFlag=!1,this.lanesSettling=!0,this.measurementsCache=[],this.itemSizeCache.clear(),this.laneAssignments.clear(),this.pendingMeasuredCacheIndexes=[]),this.measurementsCache.length===0&&!this.lanesSettling&&(this.measurementsCache=this.options.initialMeasurementsCache,this.measurementsCache.forEach(y=>{this.itemSizeCache.set(y.key,y.size)}));const g=this.lanesSettling?0:this.pendingMeasuredCacheIndexes.length>0?Math.min(...this.pendingMeasuredCacheIndexes):0;this.pendingMeasuredCacheIndexes=[],this.lanesSettling&&this.measurementsCache.length===s&&(this.lanesSettling=!1);const f=this.measurementsCache.slice(0,g),m=new Array(l).fill(void 0);for(let y=0;y<g;y++){const u=f[y];u&&(m[u.lane]=y)}for(let y=g;y<s;y++){const u=r(y),v=this.laneAssignments.get(y);let w,k;if(v!==void 0&&this.options.lanes>1){w=v;const p=m[w],S=p!==void 0?f[p]:void 0;k=S?S.end+this.options.gap:e+t}else{const p=this.options.lanes===1?f[y-1]:this.getFurthestMeasurement(f,y);k=p?p.end+this.options.gap:e+t,w=p?p.lane:y%this.options.lanes,this.options.lanes>1&&this.laneAssignments.set(y,w)}const x=h.get(u),b=typeof x=="number"?x:this.options.estimateSize(y),d=k+b;f[y]={index:y,start:k,size:b,end:d,key:u,lane:w},m[w]=y}return this.measurementsCache=f,f},{key:!1,debug:()=>this.options.debug}),this.calculateRange=Z(()=>[this.getMeasurements(),this.getSize(),this.getScrollOffset(),this.options.lanes],(s,e,t,r)=>this.range=s.length>0&&e>0?ns({measurements:s,outerSize:e,scrollOffset:t,lanes:r}):null,{key:!1,debug:()=>this.options.debug}),this.getVirtualIndexes=Z(()=>{let s=null,e=null;const t=this.calculateRange();return t&&(s=t.startIndex,e=t.endIndex),this.maybeNotify.updateDeps([this.isScrolling,s,e]),[this.options.rangeExtractor,this.options.overscan,this.options.count,s,e]},(s,e,t,r,c)=>r===null||c===null?[]:s({startIndex:r,endIndex:c,overscan:e,count:t}),{key:!1,debug:()=>this.options.debug}),this.indexFromElement=s=>{const e=this.options.indexAttribute,t=s.getAttribute(e);return t?parseInt(t,10):(console.warn(`Missing attribute name '${e}={index}' on measured element.`),-1)},this._measureElement=(s,e)=>{const t=this.indexFromElement(s),r=this.measurementsCache[t];if(!r)return;const c=r.key,l=this.elementsCache.get(c);l!==s&&(l&&this.observer.unobserve(l),this.observer.observe(s),this.elementsCache.set(c,s)),s.isConnected&&this.resizeItem(t,this.options.measureElement(s,e,this))},this.resizeItem=(s,e)=>{const t=this.measurementsCache[s];if(!t)return;const r=this.itemSizeCache.get(t.key)??t.size,c=e-r;c!==0&&((this.shouldAdjustScrollPositionOnItemSizeChange!==void 0?this.shouldAdjustScrollPositionOnItemSizeChange(t,c,this):t.start<this.getScrollOffset()+this.scrollAdjustments)&&this._scrollToOffset(this.getScrollOffset(),{adjustments:this.scrollAdjustments+=c,behavior:void 0}),this.pendingMeasuredCacheIndexes.push(t.index),this.itemSizeCache=new Map(this.itemSizeCache.set(t.key,e)),this.notify(!1))},this.measureElement=s=>{if(!s){this.elementsCache.forEach((e,t)=>{e.isConnected||(this.observer.unobserve(e),this.elementsCache.delete(t))});return}this._measureElement(s,void 0)},this.getVirtualItems=Z(()=>[this.getVirtualIndexes(),this.getMeasurements()],(s,e)=>{const t=[];for(let r=0,c=s.length;r<c;r++){const l=s[r],h=e[l];t.push(h)}return t},{key:!1,debug:()=>this.options.debug}),this.getVirtualItemForOffset=s=>{const e=this.getMeasurements();if(e.length!==0)return Ie(e[Ue(0,e.length-1,t=>Ie(e[t]).start,s)])},this.getMaxScrollOffset=()=>{if(!this.scrollElement)return 0;if("scrollHeight"in this.scrollElement)return this.options.horizontal?this.scrollElement.scrollWidth-this.scrollElement.clientWidth:this.scrollElement.scrollHeight-this.scrollElement.clientHeight;{const s=this.scrollElement.document.documentElement;return this.options.horizontal?s.scrollWidth-this.scrollElement.innerWidth:s.scrollHeight-this.scrollElement.innerHeight}},this.getOffsetForAlignment=(s,e,t=0)=>{if(!this.scrollElement)return 0;const r=this.getSize(),c=this.getScrollOffset();e==="auto"&&(e=s>=c+r?"end":"start"),e==="center"?s+=(t-r)/2:e==="end"&&(s-=r);const l=this.getMaxScrollOffset();return Math.max(Math.min(l,s),0)},this.getOffsetForIndex=(s,e="auto")=>{s=Math.max(0,Math.min(s,this.options.count-1));const t=this.measurementsCache[s];if(!t)return;const r=this.getSize(),c=this.getScrollOffset();if(e==="auto")if(t.end>=c+r-this.options.scrollPaddingEnd)e="end";else if(t.start<=c+this.options.scrollPaddingStart)e="start";else return[c,e];if(e==="end"&&s===this.options.count-1)return[this.getMaxScrollOffset(),e];const l=e==="end"?t.end+this.options.scrollPaddingEnd:t.start-this.options.scrollPaddingStart;return[this.getOffsetForAlignment(l,e,t.size),e]},this.isDynamicMode=()=>this.elementsCache.size>0,this.scrollToOffset=(s,{align:e="start",behavior:t}={})=>{t==="smooth"&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getOffsetForAlignment(s,e),{adjustments:void 0,behavior:t})},this.scrollToIndex=(s,{align:e="auto",behavior:t}={})=>{t==="smooth"&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),s=Math.max(0,Math.min(s,this.options.count-1)),this.currentScrollToIndex=s;let r=0;const c=10,l=g=>{if(!this.targetWindow)return;const f=this.getOffsetForIndex(s,g);if(!f){console.warn("Failed to get offset for index:",s);return}const[m,y]=f;this._scrollToOffset(m,{adjustments:void 0,behavior:t}),this.targetWindow.requestAnimationFrame(()=>{if(!this.targetWindow)return;const u=()=>{if(this.currentScrollToIndex!==s)return;const v=this.getScrollOffset(),w=this.getOffsetForIndex(s,y);if(!w){console.warn("Failed to get offset for index:",s);return}Vn(w[0],v)||h(y)};this.isDynamicMode()?this.targetWindow.requestAnimationFrame(u):u()})},h=g=>{this.targetWindow&&this.currentScrollToIndex===s&&(r++,r<c?this.targetWindow.requestAnimationFrame(()=>l(g)):console.warn(`Failed to scroll to index ${s} after ${c} attempts.`))};l(e)},this.scrollBy=(s,{behavior:e}={})=>{e==="smooth"&&this.isDynamicMode()&&console.warn("The `smooth` scroll behavior is not fully supported with dynamic size."),this._scrollToOffset(this.getScrollOffset()+s,{adjustments:void 0,behavior:e})},this.getTotalSize=()=>{var s;const e=this.getMeasurements();let t;if(e.length===0)t=this.options.paddingStart;else if(this.options.lanes===1)t=((s=e[e.length-1])==null?void 0:s.end)??0;else{const r=Array(this.options.lanes).fill(null);let c=e.length-1;for(;c>=0&&r.some(l=>l===null);){const l=e[c];r[l.lane]===null&&(r[l.lane]=l.end),c--}t=Math.max(...r.filter(l=>l!==null))}return Math.max(t-this.options.scrollMargin+this.options.paddingEnd,0)},this._scrollToOffset=(s,{adjustments:e,behavior:t})=>{this.options.scrollToFn(s,{behavior:t,adjustments:e},this)},this.measure=()=>{this.itemSizeCache=new Map,this.laneAssignments=new Map,this.notify(!1)},this.setOptions(o)}}const Ue=(n,o,s,e)=>{for(;n<=o;){const t=(n+o)/2|0,r=s(t);if(r<e)n=t+1;else if(r>e)o=t-1;else return t}return n>0?n-1:0};function ns({measurements:n,outerSize:o,scrollOffset:s,lanes:e}){const t=n.length-1,r=h=>n[h].start;if(n.length<=e)return{startIndex:0,endIndex:t};let c=Ue(0,t,r,s),l=c;if(e===1)for(;l<t&&n[l].end<s+o;)l++;else if(e>1){const h=Array(e).fill(0);for(;l<t&&h.some(f=>f<s+o);){const f=n[l];h[f.lane]=f.end,l++}const g=Array(e).fill(s+o);for(;c>=0&&g.some(f=>f>=s);){const f=n[c];g[f.lane]=f.start,c--}c=Math.max(0,c-c%e),l=Math.min(t,l+(e-1-l%e))}return{startIndex:c,endIndex:l}}const Ae=typeof document<"u"?a.useLayoutEffect:a.useEffect;function ss({useFlushSync:n=!0,...o}){const s=a.useReducer(()=>({}),{})[1],e={...o,onChange:(r,c)=>{var l;n&&c?ot.flushSync(s):s(),(l=o.onChange)==null||l.call(o,r,c)}},[t]=a.useState(()=>new ts(e));return t.setOptions(e),Ae(()=>t._didMount(),[]),Ae(()=>t._willUpdate()),t}function os(n){return ss({observeElementRect:Xn,observeElementOffset:Yn,scrollToFn:es,...n})}const rs=50,as=72;function ne({items:n,renderItem:o,getKey:s}){const e=a.useRef(null),t=os({count:n.length,getScrollElement:()=>e.current,estimateSize:()=>as,overscan:5});return n.length<=rs?i.jsx("div",{className:"ws-rail-list",children:n.map((r,c)=>i.jsx("div",{children:o(r,c)},s(r,c)))}):i.jsx("div",{ref:e,className:"ws-rail-list",style:{height:"100%",overflow:"auto"},children:i.jsx("div",{style:{height:t.getTotalSize(),width:"100%",position:"relative"},children:t.getVirtualItems().map(r=>{const c=n[r.index];return i.jsx("div",{"data-index":r.index,ref:t.measureElement,style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${r.start}px)`},children:o(c,r.index)},s(c,r.index))})})})}function He(){const{selection:n,select:o}=V(),{backlinks:s,backlinkCount:e}=kn(n.docId??null,n.chunkIndex??null),{state:t,onHoverStart:r,onHoverEnd:c,onPreviewEnter:l,onPreviewLeave:h,hide:g}=ae();if(!n.docId)return i.jsx(L,{message:"Select a document to see backlinks"});if(e===0)return i.jsx(L,{message:"No backlinks found for this document"});const f=t.isVisible?s.find(m=>m.id===t.targetRef):null;return i.jsxs(i.Fragment,{children:[i.jsx(ne,{items:s,getKey:m=>m.id,renderItem:m=>{const y=m.sourceKey.filePath.split("/").pop()??m.sourceKey.filePath;return i.jsxs("button",{type:"button",className:"ws-rail-item",onClick:()=>{g(),o({docId:m.sourceKey.filePath,chunkIndex:m.sourceKey.chunkIndex,source:"backlink"})},onMouseEnter:u=>r(m.id,u.currentTarget.getBoundingClientRect()),onMouseLeave:c,children:[i.jsx("span",{className:"ws-rail-item-title",children:y}),i.jsxs("span",{className:"ws-rail-item-meta",children:["Chunk #",m.sourceKey.chunkIndex]}),m.label&&i.jsx("span",{className:"ws-rail-item-label",children:m.label}),i.jsxs("p",{className:"ws-rail-item-excerpt",children:[m.sourceText.slice(0,120),"..."]})]})}}),f&&i.jsx(ie,{docTitle:f.sourceKey.filePath.split("/").pop()??f.sourceKey.filePath,excerpt:f.sourceText,backlinkCount:e,position:t.position,onNavigate:()=>{g(),o({docId:f.sourceKey.filePath,chunkIndex:f.sourceKey.chunkIndex,source:"backlink"})},onMouseEnter:l,onMouseLeave:h})]})}function is(){const{selection:n,select:o}=V(),{related:s,isLoading:e}=_e(n.docId??null,n.chunkIndex??null),{state:t,onHoverStart:r,onHoverEnd:c,onPreviewEnter:l,onPreviewLeave:h,hide:g}=ae();if(!n.docId)return i.jsx(L,{message:"Select a document to see related passages"});if(e)return i.jsx("div",{className:"ws-rail-loading",children:"Loading related..."});if(!s||s.length===0)return i.jsx(L,{message:"No related passages found"});const f=t.isVisible?s.find(m=>`${m.filePath}-${m.chunkIndex}`===t.targetRef):null;return i.jsxs(i.Fragment,{children:[i.jsx(ne,{items:s,getKey:m=>`${m.filePath}-${m.chunkIndex}`,renderItem:m=>{const y=`${m.filePath}-${m.chunkIndex}`;return i.jsxs("button",{type:"button",className:"ws-rail-item",onClick:()=>{g(),o({docId:m.filePath,chunkIndex:m.chunkIndex,source:"backlink"})},onMouseEnter:u=>r(y,u.currentTarget.getBoundingClientRect()),onMouseLeave:c,children:[i.jsx("span",{className:"ws-rail-item-title",children:m.filePath.split("/").pop()}),i.jsxs("span",{className:"ws-rail-item-meta",children:["Score: ",m.score.toFixed(3)]}),i.jsxs("p",{className:"ws-rail-item-excerpt",children:[m.text.slice(0,120),"..."]})]})}}),f&&i.jsx(ie,{docTitle:f.filePath.split("/").pop()??f.filePath,excerpt:f.text,score:f.score,position:t.position,onNavigate:()=>{g(),o({docId:f.filePath,chunkIndex:f.chunkIndex,source:"backlink"})},onMouseEnter:l,onMouseLeave:h})]})}function cs(){const{selection:n}=V(),{chunks:o}=bn(n.docId??null),{entries:s}=Tn({chunks:o??[]});return n.docId?s.length===0?i.jsx(L,{message:"No headings found in this document"}):i.jsx("nav",{className:"ws-rail-list",children:s.map(e=>i.jsx("button",{type:"button",className:"ws-rail-item",style:{paddingLeft:`calc(var(--ws-space-3) + ${(e.level-1)*12}px)`},children:i.jsx("span",{className:"ws-rail-item-title",children:e.text})},e.id))}):i.jsx(L,{message:"Select a document to see its outline"})}function ls(){const n=a.useRef(null),[o,s]=a.useState(null),[e,t]=a.useState(!1),[r,c]=a.useState(null);a.useEffect(()=>{const g=new Worker(new URL("/assets/link-indexer.worker-DGXNsXmZ.js",import.meta.url),{type:"module"});return g.onmessage=f=>{const m=f.data;m.type==="scan-complete"&&m.index?(s(m.index),t(!1),c(null)):m.type==="error"&&(c(new Error(m.message??"Worker error")),t(!1))},g.onerror=f=>{c(new Error(f.message||"Worker initialization error")),t(!1)},n.current=g,()=>{g.terminate(),n.current=null}},[]);const l=a.useCallback(g=>{n.current&&(t(!0),c(null),n.current.postMessage({type:"scan",documents:g}))},[]),h=a.useCallback(async()=>{t(!0),c(null);try{const g=await Pe(),f=await Promise.all(g.map(async m=>{const y=await Me(m.filePath);return{filePath:m.filePath,chunks:y.map(u=>({chunkIndex:u.chunkIndex,text:u.text}))}}));if(!n.current)return;n.current.postMessage({type:"scan",documents:f})}catch(g){c(g instanceof Error?g:new Error("Failed to fetch documents for scan")),t(!1)}},[]);return{index:o,isScanning:e,error:r,scan:l,rescan:h}}const Ve=a.createContext(null);function ds({children:n}){const{index:o,isScanning:s,rescan:e}=ls(),t=q();a.useEffect(()=>{e()},[e]),a.useEffect(()=>t.getQueryCache().subscribe(m=>{m.type==="updated"&&m.query.queryKey[0]==="files"&&m.action.type==="success"&&e()}),[t,e]);const r=a.useMemo(()=>{if(!o)return new Set;const f=new Set,m=new Set;if(o.outgoing)for(const y of Object.keys(o.outgoing))m.add(y);if(o.incoming)for(const y of Object.values(o.incoming))for(const u of y)m.add(u.sourceDoc);for(const y of m){const u=y.split("/"),v=u[u.length-1]??y,w=v.replace(/\.[^.]+$/,"");f.add(w.toLowerCase()),f.add(v.toLowerCase())}return f},[o]),c=a.useCallback(f=>o?o.outgoing[f]??[]:[],[o]),l=a.useCallback(f=>o?o.incoming[f]??[]:[],[o]),h=a.useCallback(f=>r.has(f.toLowerCase()),[r]),g=a.useMemo(()=>({index:o,isScanning:s,rescan:e,getOutgoingLinks:c,getIncomingLinks:l,isResolved:h}),[o,s,e,c,l,h]);return i.jsx(Ve.Provider,{value:g,children:n})}function Ge(){const n=a.useContext(Ve);if(!n)throw new Error("useLinkIndexContext must be used within a LinkIndexProvider");return n}function us(){const{selection:n,select:o}=V(),{getOutgoingLinks:s,isResolved:e,isScanning:t}=Ge(),{state:r,onHoverStart:c,onHoverEnd:l,onPreviewEnter:h,onPreviewLeave:g,hide:f}=ae(),m=a.useMemo(()=>n.docId?s(n.docId):[],[n.docId,s]);if(!n.docId)return i.jsx(L,{message:"Select a document to see outgoing links"});if(t)return i.jsx("div",{className:"ws-rail-loading",children:"Scanning links..."});if(m.length===0)return i.jsx(L,{message:"No outgoing links found"});const y=r.isVisible?m.find((u,v)=>`${u.targetTitle}-${u.chunkIndex}-${v}`===r.targetRef):null;return i.jsxs(i.Fragment,{children:[i.jsx(ne,{items:m,getKey:(u,v)=>`${u.targetTitle}-${u.chunkIndex}-${v}`,renderItem:(u,v)=>{const w=e(u.targetTitle),k=`${u.targetTitle}-${u.chunkIndex}-${v}`,x=[];return u.heading&&x.push(`# ${u.heading}`),u.blockRef&&x.push(`^ ${u.blockRef}`),x.push(`Chunk #${u.chunkIndex}`),i.jsxs("button",{type:"button",className:"ws-rail-item",disabled:!w,onClick:()=>{w&&(f(),o({docId:u.targetTitle,source:"backlink"}))},onMouseEnter:b=>{w&&c(k,b.currentTarget.getBoundingClientRect())},onMouseLeave:l,children:[i.jsx("span",{className:"ws-rail-item-title",children:u.alias??u.targetTitle}),i.jsx("span",{className:"ws-rail-item-meta",children:x.join(" - ")}),i.jsx(oe,{variant:w?"link-explicit":"link-unresolved",children:w?"Resolved":"Unresolved"})]})}}),y&&i.jsx(ie,{docTitle:y.alias??y.targetTitle,excerpt:y.heading?`# ${y.heading}`:void 0,position:r.position,onNavigate:()=>{f(),o({docId:y.targetTitle,source:"backlink"})},onMouseEnter:h,onMouseLeave:g})]})}function hs(n){const o=n.split("/");return(o[o.length-1]??n).replace(/\.[^.]+$/,"")}function fs(){const{selection:n,select:o}=V(),{index:s,isScanning:e,getIncomingLinks:t}=Ge(),r=a.useMemo(()=>n.docId?hs(n.docId):null,[n.docId]),c=a.useMemo(()=>{if(!r)return[];const g=t(r);if(g.length===0)return[];const f=new Map;for(const m of g){const y=f.get(m.sourceDoc);y?y.push(m):f.set(m.sourceDoc,[m])}return Array.from(f.entries()).map(([m,y])=>({sourceDoc:m,edges:y}))},[r,t]),l=a.useMemo(()=>{if(!r||!s)return 0;const g=new Set(t(r).map(m=>m.sourceDoc));let f=0;for(const m of Object.keys(s.outgoing))m!==n.docId&&(g.has(m)||f++);return f},[r,s,n.docId,t]);if(!n.docId)return i.jsx(L,{message:"Select a document to see unlinked mentions"});if(e)return i.jsx("div",{className:"ws-rail-loading",children:"Scanning for mentions..."});if(!s)return i.jsx(L,{message:"Link index not available"});const h=c.length>0;return!h&&l===0?i.jsx(L,{message:"No mentions found for this document"}):i.jsxs("div",{className:"ws-rail-list",children:[h&&i.jsxs(i.Fragment,{children:[i.jsxs("div",{className:"ws-rail-item-meta",style:{padding:"0.5rem 0.75rem"},children:["Linked mentions",i.jsx(oe,{variant:"success",count:c.length,style:{marginLeft:"0.5rem"},children:"linked"})]}),i.jsx(ne,{items:c,getKey:g=>g.sourceDoc,renderItem:g=>{const f=g.sourceDoc.split("/").pop()??g.sourceDoc,m=g.edges.map(y=>`#${y.chunkIndex}`).join(", ");return i.jsxs("button",{type:"button",className:"ws-rail-item",onClick:()=>{o({docId:g.sourceDoc,source:"backlink"})},children:[i.jsx("span",{className:"ws-rail-item-title",children:f}),i.jsxs("span",{className:"ws-rail-item-meta",children:[g.edges.length," link",g.edges.length!==1?"s":""," - Chunks"," ",m]})]})}})]}),l>0&&i.jsxs("div",{className:"ws-rail-item-meta",style:{padding:"0.5rem 0.75rem",marginTop:h?"0.75rem":0},children:[i.jsx(oe,{variant:"info",count:l,style:{marginRight:"0.5rem"},children:"unlinked"}),l," document",l!==1?"s":"",' scanned without a link to "',r,'".',i.jsx("p",{className:"ws-rail-item-excerpt",style:{marginTop:"0.375rem"},children:"Full text scanning for unlinked mentions requires fetching all document chunks and is planned for a future update."})]})]})}const Je={nodeRadius:8,activeNodeRadius:12,currentNodeColor:"#3b82f6",defaultNodeColor:"#9ca3af",pinnedNodeColor:"#10b981",edgeWidth:1.5,pinnedEdgeColor:"#3b82f6",semanticEdgeColor:"#d1d5db",backlinkEdgeColor:"#8b5cf6",repulsionStrength:150,attractionStrength:.3,centerGravity:.05,velocityDecay:.4,maxNodes:150,neighborsToShow:10};function gs({graphData:n,config:o,width:s,height:e,enabled:t=!0}){const r=a.useMemo(()=>({...Je,...o}),[o]),[c,l]=a.useState([]),[h,g]=a.useState(!1),f=a.useRef(null),m=a.useRef(0);a.useEffect(()=>{const w=s/2,k=e/2,x=n.nodes.map((b,d)=>{const p=c.find(A=>A.id===b.id);if(p&&p.x!==void 0&&p.y!==void 0)return{...b,x:p.x,y:p.y,vx:0,vy:0};const S=d/n.nodes.length*Math.PI*2,j=Math.min(s,e)*.3;return{...b,x:w+Math.cos(S)*j+(Math.random()-.5)*50,y:k+Math.sin(S)*j+(Math.random()-.5)*50,vx:0,vy:0}});l(x),g(!1),m.current=0},[n.nodes.length,s,e,n.nodes.map,c.find]);const y=a.useRef(new Map);a.useEffect(()=>{const w=new Map;for(const k of n.edges){const x=w.get(k.source)||[];x.push(k.target),w.set(k.source,x);const b=w.get(k.target)||[];b.push(k.source),w.set(k.target,b)}y.current=w},[n.edges]);const u=a.useCallback(()=>{if(!t||c.length===0)return!1;const w=s/2,k=e/2;let x=0;const b=c.map(d=>{let p=0,S=0;if(d.fx!==void 0&&d.fx!==null&&d.fy!==void 0&&d.fy!==null)return{...d,x:d.fx,y:d.fy};for(const I of c){if(I.id===d.id)continue;const N=(d.x??0)-(I.x??0),E=(d.y??0)-(I.y??0),P=Math.sqrt(N*N+E*E)||1,D=r.repulsionStrength/(P*P);p+=N/P*D,S+=E/P*D}const j=y.current.get(d.id)||[];for(const I of j){const N=c.find(D=>D.id===I);if(!N)continue;const E=(N.x??0)-(d.x??0),P=(N.y??0)-(d.y??0);p+=E*r.attractionStrength,S+=P*r.attractionStrength}p+=(w-(d.x??0))*r.centerGravity,S+=(k-(d.y??0))*r.centerGravity;const A=((d.vx??0)+p)*(1-r.velocityDecay),M=((d.vy??0)+S)*(1-r.velocityDecay),z=(d.x??0)+A,W=(d.y??0)+M,U=40,R=Math.max(U,Math.min(s-U,z)),T=Math.max(U,Math.min(e-U,W)),C=Math.sqrt(A*A+M*M);return x=Math.max(x,C),{...d,x:R,y:T,vx:A,vy:M}});return l(b),m.current++,x>.5&&m.current<300},[c,t,s,e,r]);a.useEffect(()=>{if(!t){f.current&&cancelAnimationFrame(f.current);return}const w=()=>{u()?f.current=requestAnimationFrame(w):g(!0)};return f.current=requestAnimationFrame(w),()=>{f.current&&cancelAnimationFrame(f.current)}},[u,t]);const v=a.useCallback(()=>{g(!1),m.current=0,l(w=>w.map(k=>({...k,vx:(Math.random()-.5)*10,vy:(Math.random()-.5)*10})))},[]);return{nodes:c,isStable:h,reheat:v}}function ms({graphData:n,currentNodeId:o,pinnedNodeIds:s,onNodeClick:e,config:t}){const r=a.useRef(null),c=a.useRef(null),[l,h]=a.useState({width:600,height:300}),[g,f]=a.useState(null),[m,y]=a.useState(null),[u,v]=a.useState({x:0,y:0}),[w,k]=a.useState(1),x=a.useRef(!1),b=a.useRef({x:0,y:0}),d=a.useMemo(()=>({...Je,...t}),[t]),{nodes:p,isStable:S}=gs({graphData:n,config:t,width:l.width,height:l.height,enabled:n.nodes.length>0});a.useEffect(()=>{const C=c.current;if(!C)return;const I=new ResizeObserver(N=>{const E=N[0];E&&h({width:E.contentRect.width,height:E.contentRect.height})});return I.observe(C),()=>I.disconnect()},[]);const j=a.useCallback((C,I)=>{const N=r.current;if(!N)return{x:0,y:0};const E=N.getBoundingClientRect(),P=(C-E.left-u.x)/w,D=(I-E.top-u.y)/w;return{x:P,y:D}},[u,w]),A=a.useCallback((C,I)=>{for(const N of p){if(N.x===void 0||N.y===void 0)continue;const E=C-N.x,P=I-N.y,D=N.id===o?d.activeNodeRadius:d.nodeRadius;if(E*E+P*P<=D*D*1.5)return N}return null},[p,o,d.nodeRadius,d.activeNodeRadius]),M=a.useCallback(C=>{x.current=!0,b.current={x:C.clientX,y:C.clientY}},[]),z=a.useCallback(()=>{x.current=!1},[]),W=a.useCallback(C=>{if(x.current){const P=C.clientX-b.current.x,D=C.clientY-b.current.y;v($=>({x:$.x+P,y:$.y+D})),b.current={x:C.clientX,y:C.clientY};return}const{x:I,y:N}=j(C.clientX,C.clientY),E=A(I,N);if(f(E),E){const P=r.current;if(P){const D=P.getBoundingClientRect();y({x:C.clientX-D.left,y:C.clientY-D.top,node:E})}}else y(null)},[j,A]),U=a.useCallback(C=>{const{x:I,y:N}=j(C.clientX,C.clientY),E=A(I,N);E&&e&&e(E)},[j,A,e]),R=a.useCallback(C=>{C.preventDefault();const I=C.deltaY>0?.9:1.1;k(N=>Math.max(.3,Math.min(3,N*I)))},[]);a.useEffect(()=>{const C=r.current;if(!C)return;const I=C.getContext("2d");if(!I)return;C.width=l.width*window.devicePixelRatio,C.height=l.height*window.devicePixelRatio,I.scale(window.devicePixelRatio,window.devicePixelRatio),I.clearRect(0,0,l.width,l.height),I.save(),I.translate(u.x,u.y),I.scale(w,w);const N=new Map;for(const E of p)E.x!==void 0&&E.y!==void 0&&N.set(E.id,{x:E.x,y:E.y});for(const E of n.edges){const P=N.get(E.source),D=N.get(E.target);!P||!D||(I.beginPath(),I.moveTo(P.x,P.y),I.lineTo(D.x,D.y),I.strokeStyle=E.type==="pinned"?d.pinnedEdgeColor:E.type==="backlink"?d.backlinkEdgeColor:d.semanticEdgeColor,I.lineWidth=E.type==="pinned"?d.edgeWidth*1.5:d.edgeWidth,E.type==="semantic"?I.setLineDash([4,4]):I.setLineDash([]),I.stroke())}I.setLineDash([]);for(const E of p){if(E.x===void 0||E.y===void 0)continue;const P=E.id===o,D=s.has(E.id),$=g?.id===E.id,Y=P?d.activeNodeRadius:d.nodeRadius,Xe=P?d.currentNodeColor:D?d.pinnedNodeColor:d.defaultNodeColor;I.beginPath(),I.arc(E.x,E.y,$?Y*1.3:Y,0,Math.PI*2),I.fillStyle=Xe,I.fill(),I.strokeStyle=$?"#fff":"rgba(0,0,0,0.2)",I.lineWidth=$?2:1,I.stroke(),P&&(I.font="10px sans-serif",I.fillStyle="#fff",I.textAlign="center",I.textBaseline="middle",I.fillText("●",E.x,E.y))}I.restore()},[p,n.edges,l,u,w,o,s,g,d]);const T=C=>{const I=C.split(/[/\\]/);return I[I.length-1]||C};return i.jsxs("div",{ref:c,className:"w-full h-full relative rounded-lg overflow-hidden",style:{background:"var(--ws-surface-1)"},children:[i.jsx("canvas",{ref:r,className:"w-full h-full cursor-grab active:cursor-grabbing",style:{width:l.width,height:l.height},onMouseDown:M,onMouseUp:z,onMouseMove:W,onMouseLeave:()=>{f(null),y(null),x.current=!1},onClick:U,onWheel:R}),m&&i.jsxs("div",{className:"absolute pointer-events-none z-10 max-w-xs px-3 py-2 text-xs rounded-lg shadow-lg",style:{background:"var(--ws-surface-0)",color:"var(--ws-text)",left:Math.min(m.x+10,l.width-200),top:Math.min(m.y+10,l.height-60)},children:[i.jsx("p",{className:"font-medium truncate",children:T(m.node.filePath)}),i.jsxs("p",{style:{color:"var(--ws-text-faint)"},children:["Chunk #",m.node.chunkIndex]}),i.jsx("p",{className:"mt-1 line-clamp-2",style:{color:"var(--ws-text-muted)"},children:m.node.text})]}),i.jsxs("div",{className:"absolute bottom-2 right-2 flex gap-1",children:[i.jsx("button",{type:"button",onClick:()=>k(C=>Math.min(3,C*1.2)),className:"p-1.5 rounded shadow",style:{background:"var(--ws-surface-raised)",color:"var(--ws-text-secondary)"},title:"Zoom in",children:i.jsx(ps,{className:"w-4 h-4"})}),i.jsx("button",{type:"button",onClick:()=>k(C=>Math.max(.3,C*.8)),className:"p-1.5 rounded shadow",style:{background:"var(--ws-surface-raised)",color:"var(--ws-text-secondary)"},title:"Zoom out",children:i.jsx(bs,{className:"w-4 h-4"})}),i.jsx("button",{type:"button",onClick:()=>{v({x:0,y:0}),k(1)},className:"p-1.5 rounded shadow",style:{background:"var(--ws-surface-raised)",color:"var(--ws-text-secondary)"},title:"Reset view",children:i.jsx(xs,{className:"w-4 h-4"})}),!S&&i.jsx("span",{className:"p-1.5 text-xs",style:{color:"var(--ws-text-muted)"},children:"Simulating..."})]}),i.jsxs("div",{className:"absolute top-2 left-2 text-xs px-2 py-1 rounded",style:{color:"var(--ws-text-secondary)",background:"var(--ws-surface-raised)"},children:[i.jsxs("span",{className:"inline-flex items-center gap-1",children:[i.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:d.currentNodeColor}}),"Current"]}),i.jsxs("span",{className:"inline-flex items-center gap-1 ml-3",children:[i.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:d.pinnedNodeColor}}),"Pinned"]}),i.jsxs("span",{className:"inline-flex items-center gap-1 ml-3",children:[i.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:d.defaultNodeColor}}),"Related"]})]})]})}function ps({className:n}){return i.jsx("svg",{className:n,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 4v16m8-8H4"})})}function bs({className:n}){return i.jsx("svg",{className:n,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M20 12H4"})})}function xs({className:n}){return i.jsx("svg",{className:n,fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:i.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})}function ys(){const{selection:n,select:o}=V(),s=n.docId??null,e=n.chunkIndex??null,{related:t,isLoading:r}=_e(s,e),{pins:c}=wn(),{graphData:l,currentNodeId:h}=Pn({filePath:s??"",activeChunkIndex:e,relatedChunks:t,pins:c}),g=a.useMemo(()=>{const m=new Set;for(const y of c)m.add(`${y.sourceKey.filePath}:${y.sourceKey.chunkIndex}`),m.add(`${y.targetKey.filePath}:${y.targetKey.chunkIndex}`);return m},[c]),f=m=>{o({docId:m.filePath,chunkIndex:m.chunkIndex,source:"graph"})};return s?r?i.jsx("div",{className:"ws-rail-loading",children:"Loading graph..."}):l.nodes.length===0?i.jsx(L,{message:"No graph data available"}):i.jsx("div",{style:{height:"100%",minHeight:300},children:i.jsx(ms,{graphData:l,currentNodeId:h,pinnedNodeIds:g,onNodeClick:f})}):i.jsx(L,{message:"Select a document to see its graph"})}const ws=[{id:"backlinks",label:"Backlinks"},{id:"outgoing",label:"Outgoing"},{id:"related",label:"Related"},{id:"mentions",label:"Mentions"},{id:"outline",label:"Outline"},{id:"graph",label:"Graph"}],ks={backlinks:He,outgoing:us,related:is,mentions:fs,outline:cs,graph:ys};function vs({collapsed:n,onToggle:o,width:s}){const[e,t]=F("ws-right-rail-tab","backlinks");if(n)return i.jsx("aside",{className:"ws-right-rail ws-right-rail--collapsed",children:i.jsx("button",{type:"button",className:"ws-rail-toggle",onClick:o,"aria-label":"Toggle right rail",children:"‹"})});const r=ks[e]??He;return i.jsxs("aside",{className:"ws-right-rail",style:{width:s},children:[i.jsxs("div",{className:"ws-right-rail-header",children:[i.jsx(Fe,{tabs:ws,activeId:e,onSelect:c=>t(c),variant:"pill",className:"ws-right-rail-tabs"}),i.jsx("button",{type:"button",className:"ws-rail-toggle",onClick:o,"aria-label":"Toggle right rail",children:"›"})]}),i.jsx("div",{className:"ws-right-rail-content",children:i.jsx(r,{})})]})}function Ss(){const n=ue({storageKey:"left-rail",defaultWidth:220,min:180,max:320}),o=ue({storageKey:"right-rail",defaultWidth:300,min:240,max:420}),{selection:s,select:e}=V(),t=dt(),r=a.useRef(!1);a.useEffect(()=>{if(r.current){r.current=!1;return}s.docId&&t.push(s.docId,s.chunkIndex)},[s.docId,s.chunkIndex]);const c=a.useCallback(()=>{const h=t.goBack();h&&(r.current=!0,e({docId:h.docId,chunkIndex:h.chunkIndex,source:"backlink"}))},[t,e]),l=a.useCallback(()=>{const h=t.goForward();h&&(r.current=!0,e({docId:h.docId,chunkIndex:h.chunkIndex,source:"backlink"}))},[t,e]);return ut({onToggleLeftRail:n.toggleCollapsed,onToggleRightRail:o.toggleCollapsed,onNavigateBack:c,onNavigateForward:l}),i.jsxs("div",{className:"ws-shell",children:[i.jsx(Nt,{}),i.jsx(Bn,{collapsed:n.collapsed,onToggle:n.toggleCollapsed,width:n.width}),!n.collapsed&&i.jsx(Se,{direction:"left",onResize:h=>n.setWidth(n.width+h)}),i.jsx(Gt,{}),!o.collapsed&&i.jsx(Se,{direction:"right",onResize:h=>o.setWidth(o.width+h)}),i.jsx(vs,{collapsed:o.collapsed,onToggle:o.toggleCollapsed,width:o.width})]})}function Cs(){return i.jsx(ct,{children:i.jsx(Ss,{})})}const Is=a.createContext(null);function js({children:n,vaultId:o="default"}){const s=`rag-vault-reading-mode-${o}`,[e,t]=F(s,"full"),r=a.useCallback(h=>{t(h)},[t]),c=a.useCallback(()=>{t(h=>h==="skim"?"full":"skim")},[t]),l=a.useMemo(()=>({mode:e,setMode:r,toggleMode:c,isSkimMode:e==="skim",isFullMode:e==="full"}),[e,r,c]);return i.jsx(Is.Provider,{value:l,children:n})}const Es=new Ye({defaultOptions:{queries:{staleTime:1e3*60,retry:1}}}),Qe=document.getElementById("root");if(!Qe)throw new Error('Root element not found. Ensure index.html has <div id="root"></div>');it.createRoot(Qe).render(i.jsx(a.StrictMode,{children:i.jsx(Ze,{client:Es,children:i.jsx(rt,{children:i.jsx(Xt,{children:i.jsx(jt,{children:i.jsx(lt,{children:i.jsx(Mt,{dbId:"default",children:i.jsx(yn,{children:i.jsx(ds,{children:i.jsx(Rn,{children:i.jsx(Dn,{children:i.jsx(Fn,{children:i.jsx(_n,{children:i.jsx(js,{children:i.jsx(Wn,{children:i.jsx(Cs,{})})})})})})})})})})})})})})})}));export{Fs as A,Ks as B,Zs as C,$s as D,_s as E,zs as F,Ws as G,qs as H,ms as K,xt as S,Xs as T,Fe as W,F as a,Qs as b,Pn as c,bn as d,Tn as e,wn as f,Ds as g,Rs as h,Ps as i,Et as j,to as k,Ys as l,eo as m,Ms as n,Os as o,Bs as p,Us as q,Hs as r,Ns as s,Vs as t,ze as u,K as v,Gs as w,Js as x,pn as y,Ls as z};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@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-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-outline-style:solid;--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}}}:root{--ws-bg:#0f1117;--ws-surface-1:#161922;--ws-surface-2:#1c1f2b;--ws-surface-3:#242836;--ws-surface-raised:#2a2e3d;--ws-border:#2a2e3d;--ws-border-subtle:#1e2230;--ws-border-strong:#3a3f52;--ws-text:#e2e4ea;--ws-text-secondary:#a0a4b4;--ws-text-muted:#6b7084;--ws-text-faint:#4a4f62;--ws-accent:#e8863a;--ws-accent-hover:#f09a52;--ws-accent-muted:#e8863a26;--ws-accent-subtle:#e8863a14;--ws-accent-text:#f0a060;--ws-success:#34d399;--ws-success-muted:#34d39926;--ws-warning:#fbbf24;--ws-warning-muted:#fbbf2426;--ws-danger:#f87171;--ws-danger-muted:#f8717126;--ws-info:#60a5fa;--ws-info-muted:#60a5fa26;--ws-link-explicit:#60a5fa;--ws-link-semantic:#a78bfa;--ws-link-backlink:#818cf8;--ws-link-unresolved:#f87171;--ws-link-mention:#34d399;--ws-focus-ring:var(--ws-accent);--ws-focus-ring-offset:var(--ws-bg);--ws-radius-xs:3px;--ws-radius-sm:5px;--ws-radius-md:8px;--ws-radius-lg:12px;--ws-radius-xl:16px;--ws-shadow-sm:0 1px 2px #0000004d;--ws-shadow-md:0 2px 8px #00000059;--ws-shadow-lg:0 4px 16px #0006;--ws-shadow-xl:0 8px 32px #00000080;--ws-shadow-popover:0 4px 24px #00000080, 0 0 0 1px #ffffff0d;--ws-space-1:4px;--ws-space-2:8px;--ws-space-3:12px;--ws-space-4:16px;--ws-space-5:20px;--ws-space-6:24px;--ws-space-7:28px;--ws-space-8:32px;--ws-space-9:36px;--ws-space-10:40px;--ws-space-11:44px;--ws-space-12:48px;--ws-font-ui:"DM Sans", system-ui, -apple-system, sans-serif;--ws-font-mono:"JetBrains Mono", "Fira Code", ui-monospace, monospace;--ws-font-reader:Georgia, "Palatino Linotype", "Book Antiqua", Palatino, serif;--ws-text-xs:.6875rem;--ws-text-sm:.8125rem;--ws-text-base:.875rem;--ws-text-md:.9375rem;--ws-text-lg:1.0625rem;--ws-text-xl:1.25rem;--ws-text-2xl:1.5rem;--ws-leading-tight:1.3;--ws-leading-normal:1.5;--ws-leading-relaxed:1.7;--ws-transition-fast:.1s ease;--ws-transition-base:.15s ease;--ws-transition-slow:.25s ease;--ws-left-rail-width:220px;--ws-left-rail-min:180px;--ws-left-rail-max:320px;--ws-left-rail-collapsed:52px;--ws-right-rail-width:300px;--ws-right-rail-min:240px;--ws-right-rail-max:420px;--ws-tab-bar-height:36px;--ws-header-height:40px}.light,:root:not(.dark){--ws-bg:#f0ece6;--ws-surface-1:#f7f4ef;--ws-surface-2:#fdfcfa;--ws-surface-3:#fff;--ws-surface-raised:#fff;--ws-border:#d8d3ca;--ws-border-subtle:#e6e2db;--ws-border-strong:#c0b9ae;--ws-text:#1e1b16;--ws-text-secondary:#52504a;--ws-text-muted:#8a8780;--ws-text-faint:#b0ada6;--ws-accent:#c06820;--ws-accent-hover:#a85a18;--ws-accent-muted:#c068201f;--ws-accent-subtle:#c068200f;--ws-accent-text:#9a5518;--ws-success:#16a364;--ws-success-muted:#16a3641a;--ws-warning:#d97706;--ws-warning-muted:#d977061a;--ws-danger:#dc2626;--ws-danger-muted:#dc26261a;--ws-info:#2563eb;--ws-info-muted:#2563eb1a;--ws-link-explicit:#2563eb;--ws-link-semantic:#7c3aed;--ws-link-backlink:#6366f1;--ws-link-unresolved:#dc2626;--ws-link-mention:#16a364;--ws-shadow-sm:0 1px 2px #0000000f;--ws-shadow-md:0 2px 8px #00000014;--ws-shadow-lg:0 4px 16px #0000001a;--ws-shadow-xl:0 8px 32px #0000001f;--ws-shadow-popover:0 4px 24px #0000001f, 0 0 0 1px #0000000d}.ws-button{justify-content:center;align-items:center;gap:var(--ws-space-2);border-radius:var(--ws-radius-md);font-family:var(--ws-font-ui);cursor:pointer;transition:background var(--ws-transition-fast),color var(--ws-transition-fast),border-color var(--ws-transition-fast),box-shadow var(--ws-transition-fast);white-space:nowrap;border:1px solid #0000;outline:none;font-weight:500;display:inline-flex}.ws-button:focus-visible{box-shadow:0 0 0 2px var(--ws-focus-ring-offset),0 0 0 4px var(--ws-focus-ring)}.ws-button:disabled{opacity:.4;cursor:not-allowed}.ws-button[data-size=sm]{font-size:var(--ws-text-xs);padding:var(--ws-space-1) var(--ws-space-2);height:28px}.ws-button[data-size=md]{font-size:var(--ws-text-sm);padding:var(--ws-space-1) var(--ws-space-3);height:32px}.ws-button[data-size=lg]{font-size:var(--ws-text-base);padding:var(--ws-space-2) var(--ws-space-4);height:38px}.ws-button[data-variant=default]{background:var(--ws-surface-2);color:var(--ws-text-secondary);border-color:var(--ws-border)}.ws-button[data-variant=default]:hover:not(:disabled){background:var(--ws-surface-3);color:var(--ws-text);border-color:var(--ws-border-strong)}.ws-button[data-variant=primary]{background:var(--ws-accent);color:#fff}.ws-button[data-variant=primary]:hover:not(:disabled){background:var(--ws-accent-hover)}.ws-button[data-variant=ghost]{color:var(--ws-text-secondary);background:0 0}.ws-button[data-variant=ghost]:hover:not(:disabled){background:var(--ws-accent-subtle);color:var(--ws-text)}.ws-button[data-variant=danger]{background:var(--ws-danger-muted);color:var(--ws-danger);border-color:#0000}.ws-button[data-variant=danger]:hover:not(:disabled){background:var(--ws-danger);color:#fff}.ws-input{width:100%;height:32px;padding:var(--ws-space-1) var(--ws-space-3);font-family:var(--ws-font-ui);font-size:var(--ws-text-sm);color:var(--ws-text);background:var(--ws-surface-1);border:1px solid var(--ws-border);border-radius:var(--ws-radius-md);transition:border-color var(--ws-transition-fast),box-shadow var(--ws-transition-fast);outline:none}.ws-input::placeholder{color:var(--ws-text-faint)}.ws-input:focus{border-color:var(--ws-accent);box-shadow:0 0 0 2px var(--ws-focus-ring-offset),0 0 0 4px var(--ws-focus-ring)}.ws-input[data-error]{border-color:var(--ws-danger)}.ws-input:disabled{opacity:.4;cursor:not-allowed}.ws-badge{align-items:center;gap:var(--ws-space-1);font-family:var(--ws-font-ui);font-size:var(--ws-text-xs);padding:2px var(--ws-space-2);border-radius:var(--ws-radius-sm);font-weight:500;line-height:var(--ws-leading-tight);white-space:nowrap;display:inline-flex}.ws-badge[data-variant=default]{background:var(--ws-surface-3);color:var(--ws-text-secondary)}.ws-badge[data-variant=accent]{background:var(--ws-accent-muted);color:var(--ws-accent-text)}.ws-badge[data-variant=success]{background:var(--ws-success-muted);color:var(--ws-success)}.ws-badge[data-variant=warning]{background:var(--ws-warning-muted);color:var(--ws-warning)}.ws-badge[data-variant=danger]{background:var(--ws-danger-muted);color:var(--ws-danger)}.ws-badge[data-variant=info]{background:var(--ws-info-muted);color:var(--ws-info)}.ws-badge[data-variant=link-explicit]{color:var(--ws-link-explicit);background:#60a5fa26}.ws-badge[data-variant=link-semantic]{color:var(--ws-link-semantic);background:#a78bfa26}.ws-badge[data-variant=link-backlink]{color:var(--ws-link-backlink);background:#818cf826}.ws-badge[data-variant=link-unresolved]{background:var(--ws-danger-muted);color:var(--ws-link-unresolved)}.ws-badge-count{background:var(--ws-accent);color:#fff;border-radius:99px;justify-content:center;align-items:center;min-width:16px;height:16px;font-size:10px;font-weight:600;display:inline-flex}.ws-tabs{scrollbar-width:none;align-items:center;gap:0;display:flex;overflow-x:auto}.ws-tabs::-webkit-scrollbar{display:none}.ws-tab{align-items:center;gap:var(--ws-space-1);padding:var(--ws-space-2) var(--ws-space-3);font-family:var(--ws-font-ui);font-size:var(--ws-text-sm);color:var(--ws-text-muted);cursor:pointer;white-space:nowrap;transition:color var(--ws-transition-fast),background var(--ws-transition-fast);background:0 0;border:none;outline:none;font-weight:500;display:inline-flex;position:relative}.ws-tab:hover{color:var(--ws-text)}.ws-tab[aria-selected=true]{color:var(--ws-accent-text)}.ws-tab:focus-visible{box-shadow:inset 0 0 0 2px var(--ws-focus-ring);border-radius:var(--ws-radius-sm)}.ws-tabs--underline{border-bottom:1px solid var(--ws-border-subtle)}.ws-tabs--underline .ws-tab[aria-selected=true]:after{content:"";bottom:-1px;left:var(--ws-space-3);right:var(--ws-space-3);background:var(--ws-accent);border-radius:1px;height:2px;position:absolute}.ws-tabs--pill{gap:var(--ws-space-1);padding:var(--ws-space-1)}.ws-tabs--pill .ws-tab{border-radius:var(--ws-radius-sm)}.ws-tabs--pill .ws-tab[aria-selected=true]{background:var(--ws-accent-muted);color:var(--ws-accent-text)}.ws-tab-icon{align-items:center;display:flex}.ws-tab-badge{background:var(--ws-accent-muted);min-width:16px;height:16px;color:var(--ws-accent-text);border-radius:99px;justify-content:center;align-items:center;font-size:10px;font-weight:600;display:inline-flex}.ws-tab-close{width:16px;height:16px;color:var(--ws-text-faint);border-radius:var(--ws-radius-xs);cursor:pointer;justify-content:center;align-items:center;font-size:11px;display:inline-flex}.ws-tab-close:hover{background:var(--ws-danger-muted);color:var(--ws-danger)}.ws-select{height:32px;padding:var(--ws-space-1) var(--ws-space-3);padding-right:var(--ws-space-8);font-family:var(--ws-font-ui);font-size:var(--ws-text-sm);color:var(--ws-text);background:var(--ws-surface-1);border:1px solid var(--ws-border);border-radius:var(--ws-radius-md);cursor:pointer;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236b7084' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;outline:none}.ws-select:focus{border-color:var(--ws-accent);box-shadow:0 0 0 2px var(--ws-focus-ring-offset),0 0 0 4px var(--ws-focus-ring)}.ws-card{background:var(--ws-surface-2);border:1px solid var(--ws-border);border-radius:var(--ws-radius-lg)}.ws-card[data-padding=sm]>.ws-card-body{padding:var(--ws-space-3)}.ws-card[data-padding=md]>.ws-card-body{padding:var(--ws-space-4)}.ws-card[data-padding=lg]>.ws-card-body{padding:var(--ws-space-6)}.ws-card-header{justify-content:space-between;align-items:flex-start;gap:var(--ws-space-4);padding:var(--ws-space-4);border-bottom:1px solid var(--ws-border-subtle);display:flex}.ws-card-title{font-size:var(--ws-text-md);color:var(--ws-text);font-weight:600}.ws-card-subtitle{font-size:var(--ws-text-sm);color:var(--ws-text-muted);margin-top:2px}.ws-card-actions{align-items:center;gap:var(--ws-space-2);display:flex}.ws-tooltip-anchor{display:inline-flex;position:relative}.ws-tooltip{z-index:9999;padding:var(--ws-space-1) var(--ws-space-2);font-family:var(--ws-font-ui);font-size:var(--ws-text-xs);color:var(--ws-text);background:var(--ws-surface-raised);border:1px solid var(--ws-border);border-radius:var(--ws-radius-sm);box-shadow:var(--ws-shadow-md);white-space:nowrap;pointer-events:none;animation:.1s ws-tooltip-in;position:absolute}.ws-tooltip--top{bottom:calc(100% + 6px);left:50%;transform:translate(-50%)}.ws-tooltip--bottom{top:calc(100% + 6px);left:50%;transform:translate(-50%)}.ws-tooltip--left{top:50%;right:calc(100% + 6px);transform:translateY(-50%)}.ws-tooltip--right{top:50%;left:calc(100% + 6px);transform:translateY(-50%)}@keyframes ws-tooltip-in{0%{opacity:0}to{opacity:1}}.ws-panel{background:var(--ws-surface-1);flex-direction:column;height:100%;display:flex;overflow:hidden}.ws-panel-header{padding:var(--ws-space-3) var(--ws-space-4);border-bottom:1px solid var(--ws-border-subtle);flex-shrink:0}.ws-panel-body{flex:1;overflow-y:auto}.ws-panel-footer{padding:var(--ws-space-3) var(--ws-space-4);border-top:1px solid var(--ws-border-subtle);flex-shrink:0}.ws-shell{background:var(--ws-bg);width:100vw;height:100vh;color:var(--ws-text);font-family:var(--ws-font-ui);display:flex;overflow:hidden}.ws-left-rail{background:var(--ws-surface-1);border-right:1px solid var(--ws-border-subtle);transition:width var(--ws-transition-slow);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.ws-left-rail-nav{padding:var(--ws-space-2);flex-direction:column;gap:2px;display:flex}.ws-nav-item{align-items:center;gap:var(--ws-space-2);padding:var(--ws-space-2) var(--ws-space-3);border-radius:var(--ws-radius-md);font-size:var(--ws-text-sm);color:var(--ws-text-secondary);transition:background var(--ws-transition-fast),color var(--ws-transition-fast);font-weight:500;text-decoration:none;display:flex}.ws-nav-item:hover{background:var(--ws-surface-2);color:var(--ws-text)}.ws-nav-item--active{font-weight:600;background:var(--ws-accent-muted)!important;color:var(--ws-accent-text)!important}.ws-nav-item--collapsed{padding:var(--ws-space-2);justify-content:center}.ws-nav-icon{width:20px;height:20px;font-size:var(--ws-text-xs);color:inherit;opacity:.7;justify-content:center;align-items:center;font-weight:700;display:flex}.ws-nav-item--active .ws-nav-icon{opacity:1}.ws-left-rail-footer{padding:var(--ws-space-3);border-top:1px solid var(--ws-border-subtle)}.ws-db-indicator{align-items:center;gap:var(--ws-space-2);font-size:var(--ws-text-xs);color:var(--ws-text-muted);display:flex}.ws-db-dot{background:var(--ws-success);border-radius:50%;flex-shrink:0;width:6px;height:6px}.ws-db-name{color:var(--ws-text-secondary);font-weight:500}.ws-db-count{color:var(--ws-text-faint)}.ws-rail-toggle{height:32px;margin:var(--ws-space-2);border-radius:var(--ws-radius-sm);background:var(--ws-surface-2);border:1px solid var(--ws-border-subtle);color:var(--ws-text-muted);font-size:var(--ws-text-lg);cursor:pointer;transition:background var(--ws-transition-fast);justify-content:center;align-items:center;display:flex}.ws-rail-toggle:hover{background:var(--ws-surface-3);color:var(--ws-text)}.ws-resize-handle{cursor:col-resize;width:4px;transition:background var(--ws-transition-fast);z-index:10;background:0 0;flex-shrink:0;position:relative}.ws-resize-handle:hover,.ws-resize-handle:active{background:var(--ws-accent-muted)}.ws-resize-handle:after{content:"";position:absolute;inset:0 -3px}.ws-center-pane{flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.ws-tab-bar{height:var(--ws-tab-bar-height);background:var(--ws-surface-1);border-bottom:1px solid var(--ws-border-subtle);padding:0 var(--ws-space-2);flex-shrink:0;align-items:center;display:flex}.ws-center-content{padding:var(--ws-space-6);flex:1;overflow-y:auto}.ws-right-rail{background:var(--ws-surface-1);border-left:1px solid var(--ws-border-subtle);flex-direction:column;flex-shrink:0;display:flex;overflow:hidden}.ws-right-rail--collapsed{width:36px;padding-top:var(--ws-space-2);align-items:center}.ws-right-rail-header{padding:var(--ws-space-1) var(--ws-space-2);border-bottom:1px solid var(--ws-border-subtle);flex-shrink:0;justify-content:space-between;align-items:center;display:flex}.ws-right-rail-tabs{flex:1;overflow-x:auto}.ws-right-rail-content{flex:1;overflow-y:auto}@media(max-width:1024px){.ws-right-rail:not(.ws-right-rail--collapsed){z-index:50;box-shadow:var(--ws-shadow-xl);position:fixed;top:0;bottom:0;right:0}}@media(max-width:768px){.ws-left-rail{width:var(--ws-left-rail-collapsed)!important}.ws-nav-item{padding:var(--ws-space-2);justify-content:center}.ws-nav-label{display:none}}.ws-page{color:var(--ws-text)}.ws-page-title{font-size:var(--ws-text-xl);color:var(--ws-text);font-weight:600}.ws-page-subtitle{font-size:var(--ws-text-sm);color:var(--ws-text-muted);margin-top:4px}.ws-surface{background:var(--ws-surface-2);border:1px solid var(--ws-border);border-radius:var(--ws-radius-lg)}.ws-error-box{background:var(--ws-danger-muted);border:1px solid var(--ws-danger);border-radius:var(--ws-radius-md);padding:var(--ws-space-4);color:var(--ws-danger)}.ws-success-box{background:var(--ws-success-muted);border:1px solid var(--ws-success);border-radius:var(--ws-radius-md);padding:var(--ws-space-4);color:var(--ws-success)}.ws-info-box{background:var(--ws-info-muted);border:1px solid var(--ws-info);border-radius:var(--ws-radius-md);padding:var(--ws-space-4);color:var(--ws-info)}.ws-rail-list{flex-direction:column;display:flex}.ws-rail-item{padding:var(--ws-space-3) var(--ws-space-4);border-bottom:1px solid var(--ws-border-subtle);cursor:pointer;text-align:left;color:var(--ws-text);font-family:var(--ws-font-ui);transition:background var(--ws-transition-fast);background:0 0;border-top:none;border-left:none;border-right:none;flex-direction:column;gap:2px;width:100%;display:flex}.ws-rail-item:hover{background:var(--ws-surface-2)}.ws-rail-item-title{font-size:var(--ws-text-sm);color:var(--ws-text);font-weight:500}.ws-rail-item-meta{font-size:var(--ws-text-xs);color:var(--ws-text-muted)}.ws-rail-item-label{font-size:var(--ws-text-xs);color:var(--ws-accent-text)}.ws-rail-item-excerpt{font-size:var(--ws-text-xs);color:var(--ws-text-secondary);line-height:var(--ws-leading-normal);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0;display:-webkit-box;overflow:hidden}.ws-rail-empty{padding:var(--ws-space-6);text-align:center;color:var(--ws-text-faint);font-size:var(--ws-text-sm)}.ws-rail-loading{padding:var(--ws-space-6);text-align:center;color:var(--ws-text-muted);font-size:var(--ws-text-sm)}.ws-rail-empty-state{padding:var(--ws-space-8);text-align:center;color:var(--ws-text-faint);font-size:var(--ws-text-sm)}.ws-link-popover{z-index:100;background:var(--ws-surface-raised);border:1px solid var(--ws-border);border-radius:var(--ws-radius-lg);box-shadow:var(--ws-shadow-xl);padding:var(--ws-space-3);max-width:320px;font-family:var(--ws-font-ui);position:fixed}.ws-link-popover-header{align-items:center;gap:var(--ws-space-2);margin-bottom:var(--ws-space-2);display:flex}.ws-link-popover-status{border-radius:50%;flex-shrink:0;width:8px;height:8px}.ws-link-popover-status--resolved{background:var(--ws-link-explicit)}.ws-link-popover-status--unresolved{background:var(--ws-link-unresolved)}.ws-link-popover-title{font-size:var(--ws-text-sm);color:var(--ws-text);font-weight:600}.ws-link-popover-heading{font-size:var(--ws-text-xs);color:var(--ws-text-muted)}.ws-link-popover-preview{font-size:var(--ws-text-xs);color:var(--ws-text-secondary);line-height:var(--ws-leading-normal);margin:0 0 var(--ws-space-2) 0;-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.ws-link-popover-actions{gap:var(--ws-space-2);border-top:1px solid var(--ws-border-subtle);padding-top:var(--ws-space-2);display:flex}.ws-link-popover-action{font-size:var(--ws-text-xs);color:var(--ws-accent);cursor:pointer;padding:var(--ws-space-1) var(--ws-space-2);border-radius:var(--ws-radius-sm);font-weight:500;font-family:var(--ws-font-ui);background:0 0;border:none}.ws-link-popover-action:hover{background:var(--ws-accent-subtle)}.ws-hover-preview{z-index:100;background:var(--ws-surface-2);border:1px solid var(--ws-border-strong);border-radius:var(--ws-radius-lg);box-shadow:var(--ws-shadow-popover);padding:var(--ws-space-4);min-width:280px;max-width:400px;font-family:var(--ws-font-ui);opacity:1;transition:opacity .15s,transform .15s;position:fixed;transform:translateY(0)}.ws-hover-preview--entering{opacity:0;transform:translateY(4px)}.ws-hover-preview-title{font-size:var(--ws-text-sm);color:var(--ws-text);font-weight:600;line-height:var(--ws-leading-tight);margin-bottom:var(--ws-space-2)}.ws-hover-preview-excerpt{font-size:var(--ws-text-xs);color:var(--ws-text-secondary);line-height:var(--ws-leading-normal);margin:0 0 var(--ws-space-3) 0;-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.ws-hover-preview-meta{align-items:center;gap:var(--ws-space-2);margin-bottom:var(--ws-space-3);display:flex}.ws-hover-preview-actions{justify-content:space-between;align-items:center;gap:var(--ws-space-2);border-top:1px solid var(--ws-border-subtle);padding-top:var(--ws-space-3);display:flex}.ws-hover-preview-secondary-actions{align-items:center;gap:var(--ws-space-1);display:flex}.ws-toast-container{bottom:var(--ws-space-4);right:var(--ws-space-4);z-index:50;gap:var(--ws-space-2);flex-direction:column;max-width:24rem;display:flex;position:fixed}.ws-toast{align-items:flex-start;gap:var(--ws-space-3);padding:var(--ws-space-4);border-radius:var(--ws-radius-lg);box-shadow:var(--ws-shadow-lg);border:1px solid;animation:.2s forwards ws-toast-in;display:flex}@keyframes ws-toast-in{0%{opacity:0;transform:translate(100px)scale(.9)}to{opacity:1;transform:translate(0)scale(1)}}.ws-toast--exiting{animation:.2s forwards ws-toast-out}@keyframes ws-toast-out{0%{opacity:1;transform:translate(0)scale(1)}to{opacity:0;transform:translate(100px)scale(.9)}}.ws-toast--success{background:#22c55e}@supports (color:color-mix(in lab,red,red)){.ws-toast--success{background:color-mix(in srgb,#22c55e 10%,var(--ws-surface-1))}}.ws-toast--success{border-color:#22c55e}@supports (color:color-mix(in lab,red,red)){.ws-toast--success{border-color:color-mix(in srgb,#22c55e 25%,var(--ws-border))}}.ws-toast--error{background:#ef4444}@supports (color:color-mix(in lab,red,red)){.ws-toast--error{background:color-mix(in srgb,#ef4444 10%,var(--ws-surface-1))}}.ws-toast--error{border-color:#ef4444}@supports (color:color-mix(in lab,red,red)){.ws-toast--error{border-color:color-mix(in srgb,#ef4444 25%,var(--ws-border))}}.ws-toast--info{background:#3b82f6}@supports (color:color-mix(in lab,red,red)){.ws-toast--info{background:color-mix(in srgb,#3b82f6 10%,var(--ws-surface-1))}}.ws-toast--info{border-color:#3b82f6}@supports (color:color-mix(in lab,red,red)){.ws-toast--info{border-color:color-mix(in srgb,#3b82f6 25%,var(--ws-border))}}.ws-toast-icon{flex-shrink:0}.ws-toast-icon--success{color:#22c55e}.ws-toast-icon--error{color:#ef4444}.ws-toast-icon--info{color:#3b82f6}.ws-toast-content{flex:1;min-width:0}.ws-toast-title{font-size:var(--ws-text-sm);color:var(--ws-text);font-weight:500}.ws-toast-message{margin-top:var(--ws-space-1);font-size:var(--ws-text-sm);color:var(--ws-text-secondary)}.ws-toast-close{color:var(--ws-text-muted);cursor:pointer;transition:color var(--ws-transition-fast);background:0 0;border:none;flex-shrink:0;padding:0}.ws-toast-close:hover{color:var(--ws-text)}.ws-autocomplete{z-index:100;background:var(--ws-surface-raised);border:1px solid var(--ws-border);border-radius:var(--ws-radius-md);box-shadow:var(--ws-shadow-lg);min-width:200px;max-width:400px;max-height:240px;position:fixed;overflow-y:auto}.ws-autocomplete-item{padding:var(--ws-space-2) var(--ws-space-3);text-align:left;border:none;border-bottom:1px solid var(--ws-border-subtle);cursor:pointer;width:100%;font-family:var(--ws-font-ui);color:var(--ws-text);transition:background var(--ws-transition-fast);background:0 0;flex-direction:column;gap:1px;display:flex}.ws-autocomplete-item:last-child{border-bottom:none}.ws-autocomplete-item:hover,.ws-autocomplete-item--selected{background:var(--ws-accent-subtle)}.ws-autocomplete-title{font-size:var(--ws-text-sm);font-weight:500}.ws-autocomplete-path{font-size:var(--ws-text-xs);color:var(--ws-text-muted)}.ws-command-palette-backdrop{z-index:200;background:#00000080;animation:.1s ws-palette-backdrop-in;position:fixed;inset:0}@keyframes ws-palette-backdrop-in{0%{opacity:0}to{opacity:1}}.ws-command-palette{z-index:201;width:520px;max-width:calc(100vw - var(--ws-space-8));background:var(--ws-surface-2);border:1px solid var(--ws-border);border-radius:var(--ws-radius-xl);max-height:480px;box-shadow:var(--ws-shadow-xl);flex-direction:column;animation:.15s ws-palette-in;display:flex;position:fixed;top:20%;left:50%;overflow:hidden;transform:translate(-50%)}@keyframes ws-palette-in{0%{opacity:0;transform:translate(-50%)translateY(-8px)scale(.98)}to{opacity:1;transform:translate(-50%)translateY(0)scale(1)}}.ws-command-palette-input{border:none;border-bottom:1px solid var(--ws-border-subtle);height:44px;padding:var(--ws-space-3) var(--ws-space-4);font-size:var(--ws-text-base);background:var(--ws-surface-2);border-radius:0;flex-shrink:0}.ws-command-palette-input:focus{box-shadow:none;border-color:var(--ws-border-subtle)}.ws-command-palette-results{padding:var(--ws-space-2) 0;flex:1;overflow-y:auto}.ws-command-palette-empty{padding:var(--ws-space-8);text-align:center;color:var(--ws-text-faint);font-size:var(--ws-text-sm)}.ws-command-palette-group{padding-bottom:var(--ws-space-1)}.ws-command-palette-category{padding:var(--ws-space-2) var(--ws-space-4) var(--ws-space-1);font-size:var(--ws-text-xs);color:var(--ws-text-muted);text-transform:uppercase;letter-spacing:.04em;font-weight:600}.ws-command-palette-item{align-items:center;gap:var(--ws-space-3);width:100%;padding:var(--ws-space-2) var(--ws-space-4);color:var(--ws-text);font-family:var(--ws-font-ui);font-size:var(--ws-text-sm);cursor:pointer;text-align:left;transition:background var(--ws-transition-fast);background:0 0;border:none;display:flex}.ws-command-palette-item:hover,.ws-command-palette-item--selected{background:var(--ws-accent-subtle)}.ws-command-palette-item--selected{background:var(--ws-accent-muted)}.ws-command-palette-item-icon{width:24px;height:24px;font-size:var(--ws-text-xs);color:var(--ws-text-muted);background:var(--ws-surface-3);border-radius:var(--ws-radius-sm);flex-shrink:0;justify-content:center;align-items:center;font-weight:700;display:flex}.ws-command-palette-item-content{flex-direction:column;gap:1px;min-width:0;display:flex}.ws-command-palette-item-label{color:var(--ws-text);white-space:nowrap;text-overflow:ellipsis;font-weight:500;overflow:hidden}.ws-command-palette-item-description{font-size:var(--ws-text-xs);color:var(--ws-text-muted);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.ws-command-palette-footer{align-items:center;gap:var(--ws-space-4);padding:var(--ws-space-2) var(--ws-space-4);border-top:1px solid var(--ws-border-subtle);background:var(--ws-surface-1);flex-shrink:0;display:flex}.ws-command-palette-hint{align-items:center;gap:var(--ws-space-1);font-size:var(--ws-text-xs);color:var(--ws-text-faint);display:inline-flex}.ws-command-palette-hint kbd{min-width:18px;height:18px;padding:0 var(--ws-space-1);font-family:var(--ws-font-ui);color:var(--ws-text-muted);background:var(--ws-surface-3);border:1px solid var(--ws-border);border-radius:var(--ws-radius-xs);justify-content:center;align-items:center;font-size:10px;font-weight:600;display:inline-flex}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-900:oklch(40.8% .123 38.172);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-emerald-500:oklch(69.6% .17 162.48);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-900:oklch(39.8% .07 227.392);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-900:oklch(38.1% .176 304.987);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-900:oklch(40.8% .153 2.432);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--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);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--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)}}@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%;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]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset: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-0{top:calc(var(--spacing) * 0)}.top-2{top:calc(var(--spacing) * 2)}.top-5{top:calc(var(--spacing) * 5)}.top-16{top:calc(var(--spacing) * 16)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-full{bottom:100%}.-left-1{left:calc(var(--spacing) * -1)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-4{margin:calc(var(--spacing) * 4)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.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-6{margin-top:calc(var(--spacing) * 6)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-4{margin-right:calc(var(--spacing) * 4)}.-mb-px{margin-bottom:-1px}.mb-0\.5{margin-bottom:calc(var(--spacing) * .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-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-4{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.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-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-32{height:calc(var(--spacing) * 32)}.h-64{height:calc(var(--spacing) * 64)}.h-\[calc\(100vh-4rem\)\]{height:calc(100vh - 4rem)}.h-full{height:100%}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.min-h-\[300px\]{min-height:300px}.min-h-screen{min-height:100vh}.w-0\.5{width:calc(var(--spacing) * .5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-56{width:calc(var(--spacing) * 56)}.w-60{width:calc(var(--spacing) * 60)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[40\%\]{width:40%}.w-\[60\%\]{width:60%}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-32{max-width:calc(var(--spacing) * 32)}.max-w-\[100px\]{max-width:100px}.max-w-\[150px\]{max-width:150px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[2rem\]{min-width:2rem}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.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-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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-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-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(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}.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-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.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-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-gray-200{border-color:var(--color-gray-200)}.border-green-200{border-color:var(--color-green-200)}.border-orange-200{border-color:var(--color-orange-200)}.border-pink-200{border-color:var(--color-pink-200)}.border-purple-200{border-color:var(--color-purple-200)}.border-red-200{border-color:var(--color-red-200)}.border-stone-200\/50{border-color:#e7e5e480}@supports (color:color-mix(in lab,red,red)){.border-stone-200\/50{border-color:color-mix(in oklab,var(--color-stone-200) 50%,transparent)}}.border-transparent{border-color:#0000}.border-yellow-200{border-color:var(--color-yellow-200)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100\/60{background-color:#fef3c699}@supports (color:color-mix(in lab,red,red)){.bg-amber-100\/60{background-color:color-mix(in oklab,var(--color-amber-100) 60%,transparent)}}.bg-amber-500\/60{background-color:#f99c0099}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/60{background-color:color-mix(in oklab,var(--color-amber-500) 60%,transparent)}}.bg-amber-600{background-color:var(--color-amber-600)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-300{background-color:var(--color-blue-300)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-cyan-50{background-color:var(--color-cyan-50)}.bg-cyan-600{background-color:var(--color-cyan-600)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-200{background-color:var(--color-green-200)}.bg-green-300{background-color:var(--color-green-300)}.bg-green-500{background-color:var(--color-green-500)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-orange-200{background-color:var(--color-orange-200)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-pink-200{background-color:var(--color-pink-200)}.bg-pink-300{background-color:var(--color-pink-300)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-purple-300{background-color:var(--color-purple-300)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-stone-200{background-color:var(--color-stone-200)}.bg-stone-200\/50{background-color:#e7e5e480}@supports (color:color-mix(in lab,red,red)){.bg-stone-200\/50{background-color:color-mix(in oklab,var(--color-stone-200) 50%,transparent)}}.bg-stone-300{background-color:var(--color-stone-300)}.bg-transparent{background-color:#0000}.bg-violet-500{background-color:var(--color-violet-500)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-200{background-color:var(--color-yellow-200)}.bg-yellow-300{background-color:var(--color-yellow-300)}.bg-yellow-600{background-color:var(--color-yellow-600)}.p-0{padding:calc(var(--spacing) * 0)}.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-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.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-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-8{padding-inline:calc(var(--spacing) * 8)}.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-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--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))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-current{color:currentColor}.text-cyan-600{color:var(--color-cyan-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-orange-700{color:var(--color-orange-700)}.text-pink-700{color:var(--color-pink-700)}.text-purple-500{color:var(--color-purple-500)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-stone-300{color:var(--color-stone-300)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-stone-600{color:var(--color-stone-600)}.text-stone-700{color:var(--color-stone-700)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-white{color:var(--color-white)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.underline{text-decoration-line:underline}.decoration-orange-500{-webkit-text-decoration-color:var(--color-orange-500);text-decoration-color:var(--color-orange-500)}.decoration-purple-200\/40{text-decoration-color:#e9d5ff66}@supports (color:color-mix(in lab,red,red)){.decoration-purple-200\/40{-webkit-text-decoration-color:color-mix(in oklab,var(--color-purple-200) 40%,transparent);text-decoration-color:color-mix(in oklab,var(--color-purple-200) 40%,transparent)}}.decoration-purple-300\/50{text-decoration-color:#d9b3ff80}@supports (color:color-mix(in lab,red,red)){.decoration-purple-300\/50{-webkit-text-decoration-color:color-mix(in oklab,var(--color-purple-300) 50%,transparent);text-decoration-color:color-mix(in oklab,var(--color-purple-300) 50%,transparent)}}.decoration-purple-400\/60{text-decoration-color:#c07eff99}@supports (color:color-mix(in lab,red,red)){.decoration-purple-400\/60{-webkit-text-decoration-color:color-mix(in oklab,var(--color-purple-400) 60%,transparent);text-decoration-color:color-mix(in oklab,var(--color-purple-400) 60%,transparent)}}.decoration-purple-500\/80{text-decoration-color:#ac4bffcc}@supports (color:color-mix(in lab,red,red)){.decoration-purple-500\/80{-webkit-text-decoration-color:color-mix(in oklab,var(--color-purple-500) 80%,transparent);text-decoration-color:color-mix(in oklab,var(--color-purple-500) 80%,transparent)}}.decoration-dotted{text-decoration-style:dotted}.decoration-1{text-decoration-thickness:1px}.decoration-2{text-decoration-thickness:2px}.decoration-\[1\.5px\]{text-decoration-thickness:1.5px}.underline-offset-2{text-underline-offset:2px}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.accent-cyan-600{accent-color:var(--color-cyan-600)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-amber-500{--tw-ring-color:var(--color-amber-500)}.ring-blue-400{--tw-ring-color:var(--color-blue-400)}.ring-blue-500{--tw-ring-color:var(--color-blue-500)}.ring-green-400{--tw-ring-color:var(--color-green-400)}.ring-orange-500{--tw-ring-color:var(--color-orange-500)}.ring-pink-400{--tw-ring-color:var(--color-pink-400)}.ring-purple-400{--tw-ring-color:var(--color-purple-400)}.ring-yellow-400{--tw-ring-color:var(--color-yellow-400)}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-white{--tw-ring-offset-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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,)}.filter{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-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-all{transition-property:all;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-shadow{transition-property:box-shadow;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-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\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.hover\:bg-cyan-700:hover{background-color:var(--color-cyan-700)}.hover\:bg-green-50:hover{background-color:var(--color-green-50)}.hover\:bg-green-300:hover{background-color:var(--color-green-300)}.hover\:bg-pink-300:hover{background-color:var(--color-pink-300)}.hover\:bg-purple-50:hover{background-color:var(--color-purple-50)}.hover\:bg-purple-100:hover{background-color:var(--color-purple-100)}.hover\:bg-purple-300:hover{background-color:var(--color-purple-300)}.hover\:bg-purple-700:hover{background-color:var(--color-purple-700)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-yellow-300:hover{background-color:var(--color-yellow-300)}.hover\:bg-yellow-700:hover{background-color:var(--color-yellow-700)}.hover\:text-amber-500:hover{color:var(--color-amber-500)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-purple-600:hover{-webkit-text-decoration-color:var(--color-purple-600);text-decoration-color:var(--color-purple-600)}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-amber-400:focus{--tw-ring-color:var(--color-amber-400)}.focus\:ring-amber-500:focus{--tw-ring-color:var(--color-amber-500)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-purple-500:focus{--tw-ring-color:var(--color-purple-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:flex-row{flex-direction:row}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:border-amber-700{border-color:var(--color-amber-700)}.dark\:border-amber-800\/30{border-color:#953d004d}@supports (color:color-mix(in lab,red,red)){.dark\:border-amber-800\/30{border-color:color-mix(in oklab,var(--color-amber-800) 30%,transparent)}}.dark\:border-blue-700{border-color:var(--color-blue-700)}.dark\:border-blue-800{border-color:var(--color-blue-800)}.dark\:border-gray-600{border-color:var(--color-gray-600)}.dark\:border-green-800{border-color:var(--color-green-800)}.dark\:border-orange-800{border-color:var(--color-orange-800)}.dark\:border-pink-800{border-color:var(--color-pink-800)}.dark\:border-purple-700{border-color:var(--color-purple-700)}.dark\:border-purple-800{border-color:var(--color-purple-800)}.dark\:border-red-700{border-color:var(--color-red-700)}.dark\:border-red-800{border-color:var(--color-red-800)}.dark\:border-stone-700\/50{border-color:#44403b80}@supports (color:color-mix(in lab,red,red)){.dark\:border-stone-700\/50{border-color:color-mix(in oklab,var(--color-stone-700) 50%,transparent)}}.dark\:border-yellow-700{border-color:var(--color-yellow-700)}.dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark\:bg-amber-600\/50{background-color:#dd740080}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-600\/50{background-color:color-mix(in oklab,var(--color-amber-600) 50%,transparent)}}.dark\:bg-amber-900\/20{background-color:#7b330633}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/20{background-color:color-mix(in oklab,var(--color-amber-900) 20%,transparent)}}.dark\:bg-amber-900\/30{background-color:#7b33064d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/30{background-color:color-mix(in oklab,var(--color-amber-900) 30%,transparent)}}.dark\:bg-blue-800\/60{background-color:#193cb899}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-800\/60{background-color:color-mix(in oklab,var(--color-blue-800) 60%,transparent)}}.dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900) 20%,transparent)}}.dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900) 30%,transparent)}}.dark\:bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-900\/40{background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.dark\:bg-cyan-900\/30{background-color:#104e644d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-cyan-900\/30{background-color:color-mix(in oklab,var(--color-cyan-900) 30%,transparent)}}.dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark\:bg-green-800\/60{background-color:#01663099}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-800\/60{background-color:color-mix(in oklab,var(--color-green-800) 60%,transparent)}}.dark\:bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900) 30%,transparent)}}.dark\:bg-green-900\/40{background-color:#0d542b66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-900\/40{background-color:color-mix(in oklab,var(--color-green-900) 40%,transparent)}}.dark\:bg-orange-800\/60{background-color:#9f2d0099}@supports (color:color-mix(in lab,red,red)){.dark\:bg-orange-800\/60{background-color:color-mix(in oklab,var(--color-orange-800) 60%,transparent)}}.dark\:bg-orange-900\/30{background-color:#7e2a0c4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-orange-900\/30{background-color:color-mix(in oklab,var(--color-orange-900) 30%,transparent)}}.dark\:bg-orange-900\/40{background-color:#7e2a0c66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-orange-900\/40{background-color:color-mix(in oklab,var(--color-orange-900) 40%,transparent)}}.dark\:bg-pink-800\/60{background-color:#a2004c99}@supports (color:color-mix(in lab,red,red)){.dark\:bg-pink-800\/60{background-color:color-mix(in oklab,var(--color-pink-800) 60%,transparent)}}.dark\:bg-pink-900\/40{background-color:#86104366}@supports (color:color-mix(in lab,red,red)){.dark\:bg-pink-900\/40{background-color:color-mix(in oklab,var(--color-pink-900) 40%,transparent)}}.dark\:bg-purple-800\/60{background-color:#6e11b099}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-800\/60{background-color:color-mix(in oklab,var(--color-purple-800) 60%,transparent)}}.dark\:bg-purple-900\/30{background-color:#59168b4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-900\/30{background-color:color-mix(in oklab,var(--color-purple-900) 30%,transparent)}}.dark\:bg-purple-900\/40{background-color:#59168b66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-purple-900\/40{background-color:color-mix(in oklab,var(--color-purple-900) 40%,transparent)}}.dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900) 20%,transparent)}}.dark\:bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/30{background-color:color-mix(in oklab,var(--color-red-900) 30%,transparent)}}.dark\:bg-red-900\/40{background-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-red-900\/40{background-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.dark\:bg-stone-600{background-color:var(--color-stone-600)}.dark\:bg-stone-700{background-color:var(--color-stone-700)}.dark\:bg-stone-700\/50{background-color:#44403b80}@supports (color:color-mix(in lab,red,red)){.dark\:bg-stone-700\/50{background-color:color-mix(in oklab,var(--color-stone-700) 50%,transparent)}}.dark\:bg-yellow-800\/60{background-color:#874b0099}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-800\/60{background-color:color-mix(in oklab,var(--color-yellow-800) 60%,transparent)}}.dark\:bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900) 20%,transparent)}}.dark\:bg-yellow-900\/40{background-color:#733e0a66}@supports (color:color-mix(in lab,red,red)){.dark\:bg-yellow-900\/40{background-color:color-mix(in oklab,var(--color-yellow-900) 40%,transparent)}}.dark\:text-amber-200{color:var(--color-amber-200)}.dark\:text-amber-300{color:var(--color-amber-300)}.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-amber-500{color:var(--color-amber-500)}.dark\:text-blue-300{color:var(--color-blue-300)}.dark\:text-blue-400{color:var(--color-blue-400)}.dark\:text-cyan-400{color:var(--color-cyan-400)}.dark\:text-gray-300{color:var(--color-gray-300)}.dark\:text-green-300{color:var(--color-green-300)}.dark\:text-green-400{color:var(--color-green-400)}.dark\:text-orange-300{color:var(--color-orange-300)}.dark\:text-pink-300{color:var(--color-pink-300)}.dark\:text-purple-300{color:var(--color-purple-300)}.dark\:text-purple-400{color:var(--color-purple-400)}.dark\:text-red-300{color:var(--color-red-300)}.dark\:text-red-400{color:var(--color-red-400)}.dark\:text-stone-300{color:var(--color-stone-300)}.dark\:text-stone-400{color:var(--color-stone-400)}.dark\:text-stone-500{color:var(--color-stone-500)}.dark\:text-stone-600{color:var(--color-stone-600)}.dark\:text-violet-400{color:var(--color-violet-400)}.dark\:text-yellow-200{color:var(--color-yellow-200)}.dark\:text-yellow-300{color:var(--color-yellow-300)}.dark\:decoration-orange-400{-webkit-text-decoration-color:var(--color-orange-400);text-decoration-color:var(--color-orange-400)}.dark\:ring-amber-400{--tw-ring-color:var(--color-amber-400)}.dark\:ring-orange-400{--tw-ring-color:var(--color-orange-400)}@media(hover:hover){.dark\:hover\:bg-amber-900\/50:hover{background-color:#7b330680}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-amber-900\/50:hover{background-color:color-mix(in oklab,var(--color-amber-900) 50%,transparent)}}.dark\:hover\:bg-blue-700\/60:hover{background-color:#1447e699}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-blue-700\/60:hover{background-color:color-mix(in oklab,var(--color-blue-700) 60%,transparent)}}.dark\:hover\:bg-blue-900\/40:hover{background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-blue-900\/40:hover{background-color:color-mix(in oklab,var(--color-blue-900) 40%,transparent)}}.dark\:hover\:bg-blue-900\/50:hover{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-blue-900\/50:hover{background-color:color-mix(in oklab,var(--color-blue-900) 50%,transparent)}}.dark\:hover\:bg-green-700\/60:hover{background-color:#00813899}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-green-700\/60:hover{background-color:color-mix(in oklab,var(--color-green-700) 60%,transparent)}}.dark\:hover\:bg-pink-700\/60:hover{background-color:#c4005c99}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-pink-700\/60:hover{background-color:color-mix(in oklab,var(--color-pink-700) 60%,transparent)}}.dark\:hover\:bg-purple-700\/60:hover{background-color:#8200da99}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-purple-700\/60:hover{background-color:color-mix(in oklab,var(--color-purple-700) 60%,transparent)}}.dark\:hover\:bg-purple-900\/20:hover{background-color:#59168b33}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-purple-900\/20:hover{background-color:color-mix(in oklab,var(--color-purple-900) 20%,transparent)}}.dark\:hover\:bg-purple-900\/50:hover{background-color:#59168b80}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-purple-900\/50:hover{background-color:color-mix(in oklab,var(--color-purple-900) 50%,transparent)}}.dark\:hover\:bg-red-900\/20:hover{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/20:hover{background-color:color-mix(in oklab,var(--color-red-900) 20%,transparent)}}.dark\:hover\:bg-red-900\/30:hover{background-color:#82181a4d}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/30:hover{background-color:color-mix(in oklab,var(--color-red-900) 30%,transparent)}}.dark\:hover\:bg-red-900\/50:hover{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-red-900\/50:hover{background-color:color-mix(in oklab,var(--color-red-900) 50%,transparent)}}.dark\:hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.dark\:hover\:bg-yellow-700\/60:hover{background-color:#a3610099}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-yellow-700\/60:hover{background-color:color-mix(in oklab,var(--color-yellow-700) 60%,transparent)}}.dark\:hover\:text-amber-400:hover{color:var(--color-amber-400)}.dark\:hover\:text-red-300:hover{color:var(--color-red-300)}.dark\:hover\:text-red-400:hover{color:var(--color-red-400)}}.dark\:focus\:ring-amber-600:focus{--tw-ring-color:var(--color-amber-600)}}}:root{--toast-enter-duration:.3s;--toast-exit-duration:.2s}body{background-color:var(--ws-bg);color:var(--ws-text);font-family:var(--ws-font-ui);font-size:var(--ws-text-base);line-height:var(--ws-leading-normal);transition:background-color var(--ws-transition-slow),color var(--ws-transition-slow)}.dark ::-webkit-scrollbar{width:8px;height:8px}.dark ::-webkit-scrollbar-track{background-color:var(--ws-surface-1)}.dark ::-webkit-scrollbar-thumb{background-color:var(--ws-border-strong);border-radius:var(--ws-radius-sm)}.dark ::-webkit-scrollbar-thumb:hover{background-color:var(--ws-text-muted)}@keyframes slideInRight{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes slideOutRight{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(100%)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes scaleIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}.zettel-paper{background:linear-gradient(#fffdf0,#fcfaeb)}.dark .zettel-paper{background:linear-gradient(#292524,#1c1917)}.zettel-margin{background:linear-gradient(#fefdfb,#faf8f3)}.dark .zettel-margin{background:linear-gradient(#1c1917,#171412)}.zettel-slip{border-radius:var(--radius-lg);padding:calc(var(--spacing) * 3);background:linear-gradient(#fffdf0,#fcfaeb);transition:transform .2s,box-shadow .2s;transform:rotate(-.3deg);box-shadow:0 1px 3px #00000014,0 4px 6px #0000000d}.dark .zettel-slip{background:linear-gradient(#292524,#1c1917);box-shadow:0 1px 3px #0000004d,0 4px 6px #0003}.zettel-slip:hover{transform:rotate(0)translateY(-2px);box-shadow:0 4px 8px #0000001f,0 8px 16px #00000014}.dark .zettel-slip:hover{box-shadow:0 4px 8px #0006,0 8px 16px #0000004d}.zettel-backlink{border-left:3px solid #3b82f6}.zettel-forward{border-left:3px solid #10b981}.zettel-semantic{border-left:3px solid #8b5cf6}.zettel-header{border-bottom-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);background:linear-gradient(90deg,#faf8f3,#fefdfb);border-color:#78716c33;border-bottom-width:1px}.dark .zettel-header{background:linear-gradient(90deg,#1c1917,#292524);border-color:#57534e4d}.zettel-selection-pill{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:#7c3aed;background:#8b5cf61a;border:1px solid #8b5cf633;border-radius:3.40282e38px}.dark .zettel-selection-pill{color:#a78bfa;background:#8b5cf633;border-color:#8b5cf64d}.zettel-searching{align-items:center;gap:calc(var(--spacing) * 2);border-radius:var(--radius-lg);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);background:#8b5cf60d;border:1px dashed #8b5cf64d;display:flex}.dark .zettel-searching{background:#8b5cf61a;border-color:#8b5cf666}.book-reader{background:linear-gradient(#faf8f5,#f5f2ed);min-height:100%}.dark .book-reader{background:linear-gradient(#1a1815,#141210)}.book-page{background:linear-gradient(#fffcf7,#faf7f2);border-radius:4px;position:relative;box-shadow:0 1px 3px #0000000d,0 4px 12px #00000008,inset 0 0 60px #fffaf080}.dark .book-page{background:linear-gradient(#1e1b18,#1a1714);box-shadow:0 1px 3px #0000004d,0 4px 12px #0003,inset 0 0 60px #1e191480}.book-page:before{content:"";pointer-events:none;background:linear-gradient(90deg,#00000008,#0000);width:20px;position:absolute;top:0;bottom:0;left:0}.dark .book-page:before{background:linear-gradient(90deg,#00000026,#0000)}.book-text{color:#2c2416;letter-spacing:.01em;font-family:Georgia,Palatino Linotype,Book Antiqua,Palatino,serif;line-height:1.8}.dark .book-text{color:#d4cfc5}.book-chunk-active{background:linear-gradient(90deg,#b48c5014,#b48c5008 20%,#0000);border-left:3px solid #b4a060}.dark .book-chunk-active{background:linear-gradient(90deg,#b48c501f,#b48c500d 20%,#0000);border-left:3px solid #9a8650}.book-header{background:linear-gradient(#f5f2ed,#ebe7e0);border-bottom:1px solid #b4a0824d}.dark .book-header{background:linear-gradient(#1e1b18,#171412);border-bottom:1px solid #645a464d}.book-title{color:#3d3425;font-family:Georgia,Palatino Linotype,serif;font-weight:600}.dark .book-title{color:#c9c2b5}.book-link{color:#6b5b3d;cursor:pointer;border-bottom:1px dotted #b4a080;text-decoration:none;transition:all .15s}.book-link:hover{color:#4a3f2a;background:#b4a0801a;border-bottom-color:#8b7355}.dark .book-link{color:#b8a988;border-bottom-color:#7a6b50}.dark .book-link:hover{color:#d4c9b0;background:#b4a08026;border-bottom-color:#9a8b70}.book-chunk-badge{color:#9a8a70;background:#b4a08226;border-radius:3px;padding:2px 6px;font-family:Georgia,serif;font-size:.7rem}.dark .book-chunk-badge{color:#8a7a60;background:#78644633}.book-progress{background:linear-gradient(90deg,#b4a060,#d4c090);height:2px;transition:width .3s}.dark .book-progress{background:linear-gradient(90deg,#8a7040,#a48850)}.book-paragraph{text-indent:1.5em;margin-bottom:.5em}.book-paragraph:first-of-type{text-indent:0}.book-dropcap:first-letter{float:left;color:#5a4a30;margin-top:.1em;margin-right:.1em;font-size:3.2em;line-height:.8}.dark .book-dropcap:first-letter{color:#a09080}@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-divide-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-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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|