Phase 1 MVP - Complete implementation

- Login with JWT and refresh token rotation
- Dashboard with projects cards
- ProjectView with TreeView navigation
- DocumentView with markdown editor and auto-save
- Tag management (create, assign, remove)
- Dark mode CSS variables
- Security fixes applied (logout to backend, createDocument endpoint)
This commit is contained in:
Motoko
2026-03-30 15:17:29 +00:00
commit c9cb07dbfc
1341 changed files with 1084068 additions and 0 deletions

1
dist/assets/Button-BnjR7XOq.css vendored Normal file
View File

@@ -0,0 +1 @@
.btn[data-v-a1ef9cca]{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border:none;border-radius:6px;font-family:inherit;font-weight:500;cursor:pointer;transition:all .15s ease}.btn[data-v-a1ef9cca]:disabled{opacity:.5;cursor:not-allowed}.btn--primary[data-v-a1ef9cca]{background:var(--accent);color:#fff}.btn--primary[data-v-a1ef9cca]:hover:not(:disabled){background:var(--accent-hover)}.btn--secondary[data-v-a1ef9cca]{background:var(--bg-tertiary);color:var(--text-primary)}.btn--secondary[data-v-a1ef9cca]:hover:not(:disabled){background:var(--border)}.btn--danger[data-v-a1ef9cca]{background:#ef4444;color:#fff}.btn--danger[data-v-a1ef9cca]:hover:not(:disabled){background:#dc2626}.btn--ghost[data-v-a1ef9cca]{background:transparent;color:var(--text-secondary)}.btn--ghost[data-v-a1ef9cca]:hover:not(:disabled){background:var(--bg-tertiary);color:var(--text-primary)}.btn--sm[data-v-a1ef9cca]{padding:.375rem .75rem;font-size:.875rem}.btn--md[data-v-a1ef9cca]{padding:.5rem 1rem;font-size:.9375rem}.btn--lg[data-v-a1ef9cca]{padding:.75rem 1.5rem;font-size:1rem}.btn__spinner[data-v-a1ef9cca]{width:1em;height:1em;border:2px solid transparent;border-top-color:currentColor;border-radius:50%;animation:spin-a1ef9cca .6s linear infinite}@keyframes spin-a1ef9cca{to{transform:rotate(360deg)}}

1
dist/assets/Button-DZq_qu8h.js vendored Normal file
View File

@@ -0,0 +1 @@
import{d as l,c as n,q as c,b as i,E as r,o}from"./index-BgrozaY3.js";const u=["type","disabled"],f={key:0,class:"btn__spinner"},b=l({__name:"Button",props:{variant:{default:"primary"},size:{default:"md"},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},type:{default:"button"}},setup(e){return(t,a)=>(o(),n("button",{type:e.type,disabled:e.disabled||e.loading,class:c(["btn",`btn--${e.variant}`,`btn--${e.size}`])},[e.loading?(o(),n("span",f)):i("",!0),r(t.$slots,"default",{},void 0)],10,u))}}),m=(e,t)=>{const a=e.__vccOpts||e;for(const[s,d]of t)a[s]=d;return a},y=m(b,[["__scopeId","data-v-a1ef9cca"]]);export{y as B,m as _};

1
dist/assets/Dashboard-T2HTnxGO.js vendored Normal file
View File

@@ -0,0 +1 @@
import{d as b,k as x,c as a,a as t,t as u,l as c,f as p,g as i,F as P,m as B,r as f,o as n,h as m,e as y,v as g,w as N,j as D,b as M}from"./index-BgrozaY3.js";import{u as V}from"./projects-DjCvBaCn.js";import{B as _,_ as S}from"./Button-DZq_qu8h.js";import{M as $}from"./Modal-e0fwVA9W.js";const F={class:"dashboard"},U={class:"dashboard__header"},z={class:"dashboard__subtitle"},L={key:0,class:"dashboard__loading"},H={key:1,class:"dashboard__empty"},R={key:2,class:"dashboard__grid"},T=["onClick"],E={class:"project-card__content"},I={class:"project-card__name"},Y={key:0,class:"project-card__desc"},q={class:"project-card__date"},A={class:"form__field"},G={class:"form__field"},J=b({__name:"Dashboard",setup(K){const k=D(),s=V(),l=f(!1),d=f(""),v=f(""),j=f(!1);x(async()=>{await s.fetchProjects()});function h(r){k.push(`/projects/${r}`)}async function w(){if(d.value.trim()){j.value=!0;try{const r=await s.createProject(d.value.trim(),v.value.trim());l.value=!1,d.value="",v.value="",h(r.id)}catch(r){console.error("Failed to create project:",r)}finally{j.value=!1}}}function C(r){return new Date(r).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}return(r,e)=>(n(),a("div",F,[t("div",U,[t("div",null,[e[6]||(e[6]=t("h1",{class:"dashboard__title"},"Your Projects",-1)),t("p",z,u(c(s).projects.length)+" project"+u(c(s).projects.length!==1?"s":""),1)]),p(_,{variant:"primary",onClick:e[0]||(e[0]=o=>l.value=!0)},{default:i(()=>[...e[7]||(e[7]=[t("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),t("line",{x1:"5",y1:"12",x2:"19",y2:"12"})],-1),m(" New Project ",-1)])]),_:1})]),c(s).loading?(n(),a("div",L,[...e[8]||(e[8]=[t("div",{class:"dashboard__spinner"},null,-1),t("p",null,"Loading projects...",-1)])])):c(s).projects.length===0?(n(),a("div",H,[e[10]||(e[10]=t("svg",{width:"64",height:"64",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.5"},[t("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})],-1)),e[11]||(e[11]=t("h2",null,"No projects yet",-1)),e[12]||(e[12]=t("p",null,"Create your first project to start organizing your documents",-1)),p(_,{variant:"primary",onClick:e[1]||(e[1]=o=>l.value=!0)},{default:i(()=>[...e[9]||(e[9]=[m(" Create First Project ",-1)])]),_:1})])):(n(),a("div",R,[(n(!0),a(P,null,B(c(s).projects,o=>(n(),a("article",{key:o.id,class:"project-card",onClick:O=>h(o.id)},[e[13]||(e[13]=t("div",{class:"project-card__icon"},[t("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"})])],-1)),t("div",E,[t("h3",I,u(o.name),1),o.description?(n(),a("p",Y,u(o.description),1)):M("",!0),t("p",q," Updated "+u(C(o.updated_at)),1)]),e[14]||(e[14]=t("svg",{class:"project-card__arrow",width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[t("path",{d:"m9 18 6-6-6-6"})],-1))],8,T))),128))])),p($,{show:l.value,title:"Create New Project",onClose:e[5]||(e[5]=o=>l.value=!1)},{footer:i(()=>[p(_,{variant:"secondary",onClick:e[4]||(e[4]=o=>l.value=!1)},{default:i(()=>[...e[17]||(e[17]=[m("Cancel",-1)])]),_:1}),p(_,{variant:"primary",loading:j.value,onClick:w},{default:i(()=>[...e[18]||(e[18]=[m("Create Project",-1)])]),_:1},8,["loading"])]),default:i(()=>[t("form",{onSubmit:N(w,["prevent"])},[t("div",A,[e[15]||(e[15]=t("label",{for:"project-name",class:"form__label"},"Project Name",-1)),y(t("input",{id:"project-name","onUpdate:modelValue":e[2]||(e[2]=o=>d.value=o),type:"text",class:"form__input",placeholder:"My Research Project",autofocus:""},null,512),[[g,d.value]])]),t("div",G,[e[16]||(e[16]=t("label",{for:"project-desc",class:"form__label"},"Description (optional)",-1)),y(t("textarea",{id:"project-desc","onUpdate:modelValue":e[3]||(e[3]=o=>v.value=o),class:"form__textarea",placeholder:"Brief description of your project...",rows:"3"},null,512),[[g,v.value]])])],32)]),_:1},8,["show"])]))}}),ee=S(J,[["__scopeId","data-v-a5d62dba"]]);export{ee as default};

1
dist/assets/Dashboard-bZb0kvk2.css vendored Normal file
View File

@@ -0,0 +1 @@
.dashboard[data-v-a5d62dba]{max-width:1200px;margin:0 auto;padding:2rem}.dashboard__header[data-v-a5d62dba]{display:flex;align-items:center;justify-content:space-between;margin-bottom:2rem}.dashboard__title[data-v-a5d62dba]{margin:0;font-size:1.75rem;font-weight:600;color:var(--text-primary)}.dashboard__subtitle[data-v-a5d62dba]{margin:.25rem 0 0;font-size:.9375rem;color:var(--text-secondary)}.dashboard__loading[data-v-a5d62dba]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;padding:4rem;color:var(--text-secondary)}.dashboard__spinner[data-v-a5d62dba]{width:32px;height:32px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin-a5d62dba .8s linear infinite}@keyframes spin-a5d62dba{to{transform:rotate(360deg)}}.dashboard__empty[data-v-a5d62dba]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;padding:4rem 2rem;text-align:center;color:var(--text-secondary)}.dashboard__empty h2[data-v-a5d62dba]{margin:0;font-size:1.25rem;color:var(--text-primary)}.dashboard__empty p[data-v-a5d62dba]{margin:0;max-width:320px}.dashboard__grid[data-v-a5d62dba]{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:1.25rem}.project-card[data-v-a5d62dba]{display:flex;align-items:flex-start;gap:1rem;padding:1.25rem;background:var(--bg-primary);border:1px solid var(--border);border-radius:12px;cursor:pointer;transition:all .15s}.project-card[data-v-a5d62dba]:hover{border-color:var(--accent);box-shadow:0 4px 12px #0000001a}.project-card__icon[data-v-a5d62dba]{flex-shrink:0;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:var(--bg-secondary);border-radius:10px;color:var(--accent)}.project-card__content[data-v-a5d62dba]{flex:1;min-width:0}.project-card__name[data-v-a5d62dba]{margin:0;font-size:1rem;font-weight:600;color:var(--text-primary)}.project-card__desc[data-v-a5d62dba]{margin:.375rem 0 0;font-size:.875rem;color:var(--text-secondary);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.project-card__date[data-v-a5d62dba]{margin:.5rem 0 0;font-size:.8125rem;color:var(--text-secondary)}.project-card__arrow[data-v-a5d62dba]{flex-shrink:0;color:var(--text-secondary);opacity:0;transition:opacity .15s}.project-card:hover .project-card__arrow[data-v-a5d62dba]{opacity:1}.form__field[data-v-a5d62dba]{margin-bottom:1.25rem}.form__field[data-v-a5d62dba]:last-child{margin-bottom:0}.form__label[data-v-a5d62dba]{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:var(--text-primary)}.form__input[data-v-a5d62dba],.form__textarea[data-v-a5d62dba]{width:100%;padding:.75rem 1rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;font-size:.9375rem;font-family:inherit;color:var(--text-primary);outline:none;transition:border-color .15s,box-shadow .15s;box-sizing:border-box}.form__input[data-v-a5d62dba]::placeholder,.form__textarea[data-v-a5d62dba]::placeholder{color:var(--text-secondary)}.form__input[data-v-a5d62dba]:focus,.form__textarea[data-v-a5d62dba]:focus{border-color:var(--accent);box-shadow:0 0 0 3px #6366f11a}.form__textarea[data-v-a5d62dba]{resize:vertical;min-height:80px}

1
dist/assets/DocumentView-BzRSDLeb.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/DocumentView-DyhIzOS7.css vendored Normal file
View File

@@ -0,0 +1 @@
.layout[data-v-e3416a05]{display:flex;flex-direction:column;height:100vh}.layout__body[data-v-e3416a05]{flex:1;display:flex;overflow:hidden}.layout__content[data-v-e3416a05]{flex:1;overflow-y:auto;background:var(--bg-primary)}.loading[data-v-e3416a05],.error[data-v-e3416a05]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;height:100%;color:var(--text-secondary)}.loading__spinner[data-v-e3416a05]{width:32px;height:32px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin-e3416a05 .8s linear infinite}@keyframes spin-e3416a05{to{transform:rotate(360deg)}}.doc-view[data-v-e3416a05]{max-width:800px;margin:0 auto;padding:2rem}.doc-view__toolbar[data-v-e3416a05]{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem}.doc-view__back[data-v-e3416a05]{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;background:none;border:none;border-radius:6px;font-size:.875rem;color:var(--text-secondary);cursor:pointer;transition:all .15s}.doc-view__back[data-v-e3416a05]:hover{background:var(--bg-secondary);color:var(--text-primary)}.doc-view__saving[data-v-e3416a05]{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;color:var(--text-secondary)}.doc-view__saving-dot[data-v-e3416a05]{width:8px;height:8px;background:var(--accent);border-radius:50%;animation:pulse-e3416a05 1s ease-in-out infinite}@keyframes pulse-e3416a05{0%,to{opacity:1}50%{opacity:.4}}.doc-view__saved[data-v-e3416a05]{display:flex;align-items:center;gap:.375rem;font-size:.8125rem;color:#22c55e}.doc-view__header[data-v-e3416a05]{margin-bottom:1rem}.doc-view__title[data-v-e3416a05]{width:100%;padding:0;background:none;border:none;font-size:2rem;font-weight:600;color:var(--text-primary);outline:none}.doc-view__title[data-v-e3416a05]::placeholder{color:var(--text-secondary)}.doc-view__tags[data-v-e3416a05]{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:1.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--border)}.doc-view__tag[data-v-e3416a05]{display:inline-flex;align-items:center;gap:.375rem;padding:.25rem .625rem;border:1px solid;border-radius:9999px;font-size:.8125rem;font-weight:500}.doc-view__tag-remove[data-v-e3416a05]{display:flex;align-items:center;justify-content:center;width:14px;height:14px;padding:0;background:none;border:none;border-radius:50%;font-size:1rem;line-height:1;cursor:pointer;opacity:.7}.doc-view__tag-remove[data-v-e3416a05]:hover{opacity:1}.doc-view__add-tag[data-v-e3416a05]{display:inline-flex;align-items:center;gap:.375rem;padding:.25rem .625rem;background:var(--bg-secondary);border:1px dashed var(--border);border-radius:9999px;font-size:.8125rem;color:var(--text-secondary);cursor:pointer;transition:all .15s}.doc-view__add-tag[data-v-e3416a05]:hover{border-color:var(--accent);color:var(--accent)}.doc-view__editor[data-v-e3416a05]{flex:1}.doc-view__textarea[data-v-e3416a05]{width:100%;min-height:400px;padding:1rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;font-family:JetBrains Mono,Fira Code,monospace;font-size:.9375rem;line-height:1.7;color:var(--text-primary);resize:vertical;outline:none;transition:border-color .15s;box-sizing:border-box}.doc-view__textarea[data-v-e3416a05]::placeholder{color:var(--text-secondary)}.doc-view__textarea[data-v-e3416a05]:focus{border-color:var(--accent)}.form__field[data-v-e3416a05]{margin-bottom:1.25rem}.form__field[data-v-e3416a05]:last-child{margin-bottom:0}.form__label[data-v-e3416a05]{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:var(--text-primary)}.form__input[data-v-e3416a05]{width:100%;padding:.75rem 1rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;font-size:.9375rem;color:var(--text-primary);outline:none;transition:border-color .15s,box-shadow .15s;box-sizing:border-box}.form__input[data-v-e3416a05]::placeholder{color:var(--text-secondary)}.form__input[data-v-e3416a05]:focus{border-color:var(--accent);box-shadow:0 0 0 3px #6366f11a}.color-picker[data-v-e3416a05]{display:flex;flex-wrap:wrap;gap:.5rem}.color-picker__option[data-v-e3416a05]{width:32px;height:32px;border:2px solid transparent;border-radius:6px;cursor:pointer;transition:transform .1s,border-color .1s}.color-picker__option[data-v-e3416a05]:hover{transform:scale(1.1)}.color-picker__option--selected[data-v-e3416a05]{border-color:var(--text-primary)}

1
dist/assets/Header-BGQ1nCqG.css vendored Normal file
View File

@@ -0,0 +1 @@
.header[data-v-0d1f0999]{display:flex;align-items:center;justify-content:space-between;height:56px;padding:0 1.5rem;background:var(--bg-primary);border-bottom:1px solid var(--border)}.header__left[data-v-0d1f0999]{flex:1}.header__logo[data-v-0d1f0999]{display:flex;align-items:center;gap:.75rem;text-decoration:none}.header__title[data-v-0d1f0999]{font-size:1.125rem;font-weight:600;color:var(--text-primary)}.header__center[data-v-0d1f0999]{flex:2;max-width:480px}.header__search[data-v-0d1f0999]{position:relative;display:flex;align-items:center}.header__search-icon[data-v-0d1f0999]{position:absolute;left:.75rem;color:var(--text-secondary)}.header__search-input[data-v-0d1f0999]{width:100%;padding:.5rem 4rem .5rem 2.25rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;font-size:.875rem;color:var(--text-primary);outline:none;transition:border-color .15s,box-shadow .15s}.header__search-input[data-v-0d1f0999]::placeholder{color:var(--text-secondary)}.header__search-input[data-v-0d1f0999]:focus{border-color:var(--accent);box-shadow:0 0 0 3px #6366f11a}.header__kbd[data-v-0d1f0999]{position:absolute;right:.75rem;padding:.125rem .375rem;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:4px;font-size:.75rem;color:var(--text-secondary)}.header__right[data-v-0d1f0999]{flex:1;display:flex;justify-content:flex-end}.header__user[data-v-0d1f0999]{position:relative;display:flex;align-items:center;gap:.5rem;padding:.375rem .75rem .375rem .375rem;border-radius:8px;cursor:pointer;transition:background .15s}.header__user[data-v-0d1f0999]:hover{background:var(--bg-secondary)}.header__avatar[data-v-0d1f0999]{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:var(--accent);border-radius:6px;color:#fff;font-weight:600;font-size:.875rem}.header__username[data-v-0d1f0999]{font-size:.875rem;color:var(--text-primary)}.header__dropdown[data-v-0d1f0999]{position:absolute;top:100%;right:0;margin-top:.5rem;min-width:180px;background:var(--bg-primary);border:1px solid var(--border);border-radius:8px;box-shadow:0 10px 30px #00000026;overflow:hidden;z-index:100}.header__dropdown-item[data-v-0d1f0999]{display:flex;align-items:center;gap:.5rem;width:100%;padding:.75rem 1rem;background:none;border:none;font-size:.875rem;color:var(--text-primary);cursor:pointer;text-align:left;text-decoration:none}.header__dropdown-item[data-v-0d1f0999]:hover{background:var(--bg-secondary)}.header__dropdown-item--info[data-v-0d1f0999]{flex-direction:column;align-items:flex-start;gap:.125rem}.header__dropdown-item--info small[data-v-0d1f0999]{color:var(--text-secondary);font-size:.75rem}.header__dropdown-divider[data-v-0d1f0999]{margin:.25rem 0;border:none;border-top:1px solid var(--border)}.fade-enter-active[data-v-0d1f0999],.fade-leave-active[data-v-0d1f0999]{transition:opacity .15s,transform .15s}.fade-enter-from[data-v-0d1f0999],.fade-leave-to[data-v-0d1f0999]{opacity:0;transform:translateY(-4px)}

1
dist/assets/Header-BKAFjNNX.js vendored Normal file
View File

@@ -0,0 +1 @@
import{y as B,z as M,r as v,d as V,j as U,u as H,p as N,o as $,c as b,a as e,f as S,g as T,w as A,e as j,v as q,t as w,l as y,T as E,h as F,b as z}from"./index-BgrozaY3.js";import{_ as K}from"./Button-DZq_qu8h.js";const I=B("documents",()=>{const n=v(null),d=v([]),l=v(!1),u=v(null),c=v(!1),r=M();async function k(t){l.value=!0,u.value=null;try{n.value=await r.get(`/documents/${t}`)}catch(s){throw u.value=s instanceof Error?s.message:"Failed to fetch document",s}finally{l.value=!1}}async function D(t,s,o="",i=null){const g=i?`/folders/${i}/documents`:`/projects/${t}/documents`;return await r.post(g,{title:s,content:o})}async function a(t,s,o){var C;const i={title:s};o!==void 0&&(i.folder_id=o);const g=await r.put(`/documents/${t}`,i);return((C=n.value)==null?void 0:C.id)===t&&(n.value=g),g}async function x(t,s){var o;c.value=!0;try{await r.put(`/documents/${t}/content`,{content:s}),((o=n.value)==null?void 0:o.id)===t&&(n.value.content=s)}finally{c.value=!1}}async function f(t){var s;await r.delete(`/documents/${t}`),((s=n.value)==null?void 0:s.id)===t&&(n.value=null)}async function _(){try{d.value=await r.get("/tags")}catch(t){console.error("Failed to fetch tags:",t)}}async function p(t,s){const o=await r.post("/tags",{name:t,color:s});return d.value.push(o),o}async function h(t,s){var o;await r.put(`/documents/${t}/tags`,{tag_ids:s}),((o=n.value)==null?void 0:o.id)===t&&(n.value.tags=d.value.filter(i=>s.includes(i.id)))}async function m(t,s){var o;await r.delete(`/documents/${t}/tags/${s}`),((o=n.value)==null?void 0:o.id)===t&&(n.value.tags=n.value.tags.filter(i=>i.id!==s))}return{currentDocument:n,tags:d,loading:l,error:u,saving:c,fetchDocument:k,createDocument:D,updateDocument:a,updateDocumentContent:x,deleteDocument:f,fetchTags:_,createTag:p,assignTags:h,removeTag:m}}),L={class:"header"},Q={class:"header__left"},R={class:"header__center"},G={class:"header__right"},J={class:"header__avatar"},O={class:"header__username"},P={key:0,class:"header__dropdown"},W={class:"header__dropdown-item header__dropdown-item--info"},X=V({__name:"Header",setup(n){const d=U(),l=H(),u=v(""),c=v(!1);function r(){u.value.trim()&&d.push({name:"dashboard",query:{q:u.value}})}function k(){l.logout(),d.push("/login")}return(D,a)=>{var f,_,p;const x=N("router-link");return $(),b("header",L,[e("div",Q,[S(x,{to:"/dashboard",class:"header__logo"},{default:T(()=>[...a[2]||(a[2]=[e("svg",{width:"28",height:"28",viewBox:"0 0 28 28",fill:"none"},[e("rect",{width:"28",height:"28",rx:"6",fill:"var(--accent)"}),e("path",{d:"M8 10h12M8 14h8M8 18h10",stroke:"white","stroke-width":"2","stroke-linecap":"round"})],-1),e("span",{class:"header__title"},"Claudia Docs",-1)])]),_:1})]),e("div",R,[e("form",{class:"header__search",onSubmit:A(r,["prevent"])},[a[3]||(a[3]=e("svg",{class:"header__search-icon",width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("circle",{cx:"11",cy:"11",r:"8"}),e("path",{d:"m21 21-4.35-4.35"})],-1)),j(e("input",{"onUpdate:modelValue":a[0]||(a[0]=h=>u.value=h),type:"text",placeholder:"Search documents...",class:"header__search-input"},null,512),[[q,u.value]]),a[4]||(a[4]=e("kbd",{class:"header__kbd"},"⌘K",-1))],32)]),e("div",G,[e("div",{class:"header__user",onClick:a[1]||(a[1]=h=>c.value=!c.value)},[e("div",J,w(((_=(f=y(l).user)==null?void 0:f.username)==null?void 0:_.charAt(0).toUpperCase())||"U"),1),e("span",O,w(((p=y(l).user)==null?void 0:p.username)||"User"),1),a[7]||(a[7]=e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"m6 9 6 6 6-6"})],-1)),S(E,{name:"fade"},{default:T(()=>{var h,m;return[c.value?($(),b("div",P,[e("div",W,[e("span",null,w((h=y(l).user)==null?void 0:h.username),1),e("small",null,w((m=y(l).user)==null?void 0:m.role),1)]),a[6]||(a[6]=e("hr",{class:"header__dropdown-divider"},null,-1)),e("button",{class:"header__dropdown-item",onClick:k},[...a[5]||(a[5]=[e("svg",{width:"16",height:"16",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e("path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"}),e("polyline",{points:"16 17 21 12 16 7"}),e("line",{x1:"21",y1:"12",x2:"9",y2:"12"})],-1),F(" Logout ",-1)])])])):z("",!0)]}),_:1})])])])}}}),ee=K(X,[["__scopeId","data-v-0d1f0999"]]);export{ee as H,I as u};

1
dist/assets/Login-B_rHAN5Z.css vendored Normal file
View File

@@ -0,0 +1 @@
.login[data-v-d1a9e623]{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;background:var(--bg-secondary)}.login__card[data-v-d1a9e623]{width:100%;max-width:400px;padding:2.5rem;background:var(--bg-primary);border:1px solid var(--border);border-radius:16px;box-shadow:0 10px 40px #0000001a}.login__header[data-v-d1a9e623]{text-align:center;margin-bottom:2rem}.login__header svg[data-v-d1a9e623]{margin-bottom:1rem}.login__title[data-v-d1a9e623]{margin:0;font-size:1.5rem;font-weight:600;color:var(--text-primary)}.login__subtitle[data-v-d1a9e623]{margin:.5rem 0 0;font-size:.9375rem;color:var(--text-secondary)}.login__form[data-v-d1a9e623]{display:flex;flex-direction:column;gap:1.25rem}.login__error[data-v-d1a9e623]{padding:.75rem 1rem;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;font-size:.875rem;color:#dc2626}.login__field[data-v-d1a9e623]{display:flex;flex-direction:column;gap:.5rem}.login__label[data-v-d1a9e623]{font-size:.875rem;font-weight:500;color:var(--text-primary)}.login__input[data-v-d1a9e623]{padding:.75rem 1rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;font-size:.9375rem;color:var(--text-primary);outline:none;transition:border-color .15s,box-shadow .15s}.login__input[data-v-d1a9e623]::placeholder{color:var(--text-secondary)}.login__input[data-v-d1a9e623]:focus{border-color:var(--accent);box-shadow:0 0 0 3px #6366f11a}.login__toggle[data-v-d1a9e623]{margin:0;text-align:center;font-size:.875rem;color:var(--text-secondary)}.login__toggle-btn[data-v-d1a9e623]{background:none;border:none;padding:0;font-size:inherit;color:var(--accent);cursor:pointer;text-decoration:underline}.login__toggle-btn[data-v-d1a9e623]:hover{color:var(--accent-hover)}.login__footer[data-v-d1a9e623]{margin-top:2rem;font-size:.8125rem;color:var(--text-secondary)}

1
dist/assets/Login-EYgYtJ8O.js vendored Normal file
View File

@@ -0,0 +1 @@
import{d as C,u as k,c as _,a as e,t as n,w as S,b as A,e as v,v as g,f as B,g as M,h as p,r as i,i as m,j as V,o as f}from"./index-BgrozaY3.js";import{B as D,_ as E}from"./Button-DZq_qu8h.js";const N={class:"login"},I={class:"login__card"},L={class:"login__header"},T={class:"login__title"},U={class:"login__subtitle"},P={key:0,class:"login__error"},R={class:"login__field"},j={class:"login__field"},z={class:"login__toggle"},W=C({__name:"Login",setup(q){const h=V(),r=k(),o=i(""),s=i(""),a=i(!1),u=i(!1),l=i(""),w=m(()=>a.value?"Create Account":"Welcome Back"),y=m(()=>a.value?"Create Account":"Sign In");async function b(){if(!o.value||!s.value){l.value="Please fill in all fields";return}u.value=!0,l.value="";try{a.value?(await r.register(o.value,s.value),await r.login(o.value,s.value)):await r.login(o.value,s.value),h.push("/dashboard")}catch(d){l.value=d instanceof Error?d.message:"Authentication failed"}finally{u.value=!1}}function x(){a.value=!a.value,l.value=""}return(d,t)=>(f(),_("div",N,[e("div",I,[e("div",L,[t[2]||(t[2]=e("svg",{width:"40",height:"40",viewBox:"0 0 28 28",fill:"none"},[e("rect",{width:"28",height:"28",rx:"6",fill:"var(--accent)"}),e("path",{d:"M8 10h12M8 14h8M8 18h10",stroke:"white","stroke-width":"2","stroke-linecap":"round"})],-1)),e("h1",T,n(w.value),1),e("p",U,n(a.value?"Create your account to get started":"Sign in to access your documents"),1)]),e("form",{class:"login__form",onSubmit:S(b,["prevent"])},[l.value?(f(),_("div",P,n(l.value),1)):A("",!0),e("div",R,[t[3]||(t[3]=e("label",{for:"username",class:"login__label"},"Username",-1)),v(e("input",{id:"username","onUpdate:modelValue":t[0]||(t[0]=c=>o.value=c),type:"text",class:"login__input",placeholder:"Enter your username",autocomplete:"username"},null,512),[[g,o.value]])]),e("div",j,[t[4]||(t[4]=e("label",{for:"password",class:"login__label"},"Password",-1)),v(e("input",{id:"password","onUpdate:modelValue":t[1]||(t[1]=c=>s.value=c),type:"password",class:"login__input",placeholder:"Enter your password",autocomplete:"current-password"},null,512),[[g,s.value]])]),B(D,{type:"submit",variant:"primary",size:"lg",loading:u.value,style:{width:"100%"}},{default:M(()=>[p(n(y.value),1)]),_:1},8,["loading"]),e("p",z,[p(n(a.value?"Already have an account?":"Don't have an account?")+" ",1),e("button",{type:"button",class:"login__toggle-btn",onClick:x},n(a.value?"Sign in":"Create one"),1)])],32)]),t[5]||(t[5]=e("p",{class:"login__footer"}," Claudia Docs — Document Management for AI Agents ",-1))]))}}),H=E(W,[["__scopeId","data-v-d1a9e623"]]);export{H as default};

1
dist/assets/Modal-DqLHG8CN.css vendored Normal file
View File

@@ -0,0 +1 @@
.modal[data-v-f5a1757e]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:flex;align-items:center;justify-content:center;background:#00000080;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.modal__content[data-v-f5a1757e]{background:var(--bg-primary);border-radius:12px;box-shadow:0 20px 40px #0003;max-height:90vh;overflow:auto}.modal__content--sm[data-v-f5a1757e]{width:90%;max-width:400px}.modal__content--md[data-v-f5a1757e]{width:90%;max-width:560px}.modal__content--lg[data-v-f5a1757e]{width:90%;max-width:800px}.modal__header[data-v-f5a1757e]{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem;border-bottom:1px solid var(--border)}.modal__title[data-v-f5a1757e]{margin:0;font-size:1.125rem;font-weight:600;color:var(--text-primary)}.modal__close[data-v-f5a1757e]{background:none;border:none;font-size:1.5rem;color:var(--text-secondary);cursor:pointer;padding:0;line-height:1}.modal__close[data-v-f5a1757e]:hover{color:var(--text-primary)}.modal__body[data-v-f5a1757e]{padding:1.5rem}.modal__footer[data-v-f5a1757e]{display:flex;justify-content:flex-end;gap:.75rem;padding:1rem 1.5rem;border-top:1px solid var(--border)}.modal-enter-active[data-v-f5a1757e],.modal-leave-active[data-v-f5a1757e]{transition:opacity .2s ease}.modal-enter-active .modal__content[data-v-f5a1757e],.modal-leave-active .modal__content[data-v-f5a1757e]{transition:transform .2s ease}.modal-enter-from[data-v-f5a1757e],.modal-leave-to[data-v-f5a1757e]{opacity:0}.modal-enter-from .modal__content[data-v-f5a1757e],.modal-leave-to .modal__content[data-v-f5a1757e]{transform:scale(.95)}

1
dist/assets/Modal-e0fwVA9W.js vendored Normal file
View File

@@ -0,0 +1 @@
import{d as _,n as f,C as u,s as k,f as h,T as v,g as p,D as y,o as s,c as l,a,t as C,b as n,E as i,q as B}from"./index-BgrozaY3.js";import{_ as w}from"./Button-DZq_qu8h.js";const E={key:0,class:"modal__header"},$={class:"modal__title"},b={class:"modal__body"},g={key:1,class:"modal__footer"},z=_({__name:"Modal",props:{show:{type:Boolean},title:{},size:{default:"md"}},emits:["close"],setup(o,{emit:c}){const t=c;function r(e){e.target.classList.contains("modal")&&t("close")}function m(e){e.key==="Escape"&&t("close")}return f(()=>t,()=>{},{immediate:!0}),u(()=>{document.removeEventListener("keydown",m)}),(e,d)=>(s(),k(y,{to:"body"},[h(v,{name:"modal"},{default:p(()=>[o.show?(s(),l("div",{key:0,class:"modal",onClick:r},[a("div",{class:B(["modal__content",`modal__content--${o.size}`])},[o.title?(s(),l("div",E,[a("h2",$,C(o.title),1),a("button",{class:"modal__close",onClick:d[0]||(d[0]=M=>t("close"))},"×")])):n("",!0),a("div",b,[i(e.$slots,"default",{},void 0,!0)]),e.$slots.footer?(s(),l("div",g,[i(e.$slots,"footer",{},void 0,!0)])):n("",!0)],2)])):n("",!0)]),_:3})]))}}),V=w(z,[["__scopeId","data-v-f5a1757e"]]);export{V as M};

1
dist/assets/ProjectView-CIKrsclR.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/ProjectView-DYVW7MC2.css vendored Normal file
View File

@@ -0,0 +1 @@
.tree[data-v-e9acf25c]{list-style:none;margin:0;padding:0}.tree__item[data-v-e9acf25c]{margin:2px 0}.tree__node[data-v-e9acf25c]{display:flex;align-items:center;gap:.375rem;padding:.375rem .5rem;border-radius:6px;cursor:pointer;transition:background .1s}.tree__node[data-v-e9acf25c]:hover{background:var(--bg-tertiary)}.tree__toggle[data-v-e9acf25c]{display:flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;background:none;border:none;color:var(--text-secondary);cursor:pointer}.tree__icon[data-v-e9acf25c]{display:flex;align-items:center;justify-content:center;width:18px;color:var(--text-secondary)}.tree__arrow[data-v-e9acf25c]{transition:transform .15s}.tree__arrow--expanded[data-v-e9acf25c]{transform:rotate(90deg)}.tree__label[data-v-e9acf25c]{flex:1;font-size:.875rem;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tree__children[data-v-e9acf25c]{margin-left:1rem}.expand-enter-active[data-v-e9acf25c],.expand-leave-active[data-v-e9acf25c]{transition:all .2s ease;overflow:hidden}.expand-enter-from[data-v-e9acf25c],.expand-leave-to[data-v-e9acf25c]{opacity:0;max-height:0}.expand-enter-to[data-v-e9acf25c],.expand-leave-from[data-v-e9acf25c]{max-height:500px}.sidebar[data-v-f979c4be]{width:280px;min-width:280px;height:100%;background:var(--bg-secondary);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:hidden}.sidebar__header[data-v-f979c4be]{padding:1rem;border-bottom:1px solid var(--border)}.sidebar__back[data-v-f979c4be]{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem;background:none;border:none;border-radius:6px;font-size:.875rem;color:var(--text-secondary);cursor:pointer;text-align:left;transition:all .15s}.sidebar__back[data-v-f979c4be]:hover{background:var(--bg-tertiary);color:var(--text-primary)}.sidebar__content[data-v-f979c4be]{flex:1;display:flex;flex-direction:column;overflow:hidden}.sidebar__project[data-v-f979c4be]{padding:1rem;border-bottom:1px solid var(--border)}.sidebar__project-name[data-v-f979c4be]{margin:0;font-size:1rem;font-weight:600;color:var(--text-primary)}.sidebar__project-desc[data-v-f979c4be]{margin:.25rem 0 0;font-size:.8125rem;color:var(--text-secondary);line-height:1.4}.sidebar__actions[data-v-f979c4be]{display:flex;gap:.5rem;padding:.75rem 1rem;border-bottom:1px solid var(--border)}.sidebar__tree[data-v-f979c4be]{flex:1;overflow-y:auto;padding:.5rem}.sidebar__empty[data-v-f979c4be]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;padding:2rem;color:var(--text-secondary);text-align:center}.sidebar__empty p[data-v-f979c4be]{margin:0;font-size:.875rem}.layout[data-v-333c564d]{display:flex;flex-direction:column;height:100vh}.layout__body[data-v-333c564d]{flex:1;display:flex;overflow:hidden}.layout__content[data-v-333c564d]{flex:1;overflow-y:auto;background:var(--bg-primary)}.loading[data-v-333c564d],.error[data-v-333c564d]{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1rem;height:100%;color:var(--text-secondary)}.loading__spinner[data-v-333c564d]{width:32px;height:32px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin-333c564d .8s linear infinite}@keyframes spin-333c564d{to{transform:rotate(360deg)}}.project[data-v-333c564d]{padding:2rem}.project__welcome[data-v-333c564d]{max-width:600px;margin:0 auto;text-align:center;padding:4rem 2rem}.project__title[data-v-333c564d]{margin:0;font-size:1.75rem;font-weight:600;color:var(--text-primary)}.project__desc[data-v-333c564d]{margin:.75rem 0 0;font-size:1rem;color:var(--text-secondary);line-height:1.5}.project__hint[data-v-333c564d]{margin:1.5rem 0 0;font-size:.9375rem;color:var(--text-secondary)}.form__field[data-v-333c564d]{margin-bottom:1.25rem}.form__field[data-v-333c564d]:last-child{margin-bottom:0}.form__label[data-v-333c564d]{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:var(--text-primary)}.form__input[data-v-333c564d]{width:100%;padding:.75rem 1rem;background:var(--bg-secondary);border:1px solid var(--border);border-radius:8px;font-size:.9375rem;color:var(--text-primary);outline:none;transition:border-color .15s,box-shadow .15s;box-sizing:border-box}.form__input[data-v-333c564d]::placeholder{color:var(--text-secondary)}.form__input[data-v-333c564d]:focus{border-color:var(--accent);box-shadow:0 0 0 3px #6366f11a}

1
dist/assets/index-BG6SLZYI.css vendored Normal file
View File

@@ -0,0 +1 @@
:root{--bg-primary: #ffffff;--bg-secondary: #f7f8fa;--bg-tertiary: #ebedf0;--text-primary: #1a1d21;--text-secondary: #5c6370;--accent: #6366f1;--accent-hover: #4f46e5;--border: #e2e8f0}.dark{--bg-primary: #0f1117;--bg-secondary: #1a1d26;--bg-tertiary: #252a36;--text-primary: #e2e8f0;--text-secondary: #9ca3af;--accent: #818cf8;--accent-hover: #a5b4fc;--border: #2d3748}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{background:var(--bg-primary);color:var(--text-primary)}@media (prefers-color-scheme: dark){:root:not(.light){--bg-primary: #0f1117;--bg-secondary: #1a1d26;--bg-tertiary: #252a36;--text-primary: #e2e8f0;--text-secondary: #9ca3af;--accent: #818cf8;--accent-hover: #a5b4fc;--border: #2d3748}}a{color:inherit;text-decoration:none}button,input,textarea{font-family:inherit}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--bg-secondary)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--text-secondary)}

30
dist/assets/index-BgrozaY3.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/assets/projects-DjCvBaCn.js vendored Normal file
View File

@@ -0,0 +1 @@
import{y as x,z as E,r as s}from"./index-BgrozaY3.js";const M=x("projects",()=>{const c=s([]),a=s(null),u=s([]),d=s([]),p=s([]),i=s(!1),l=s(null),r=E();async function j(){i.value=!0,l.value=null;try{const e=await r.get("/projects");c.value=e.projects}catch(e){throw l.value=e instanceof Error?e.message:"Failed to fetch projects",e}finally{i.value=!1}}async function y(e){i.value=!0,l.value=null;try{a.value=await r.get(`/projects/${e}`),await f(e)}catch(o){throw l.value=o instanceof Error?o.message:"Failed to fetch project",o}finally{i.value=!1}}async function f(e){try{const[o,t]=await Promise.all([r.get(`/projects/${e}/folders`),r.get(`/projects/${e}/documents`)]);u.value=o.folders,d.value=t.documents,m()}catch(o){throw l.value=o instanceof Error?o.message:"Failed to fetch project tree",o}}function m(){const e=new Map,o=[];for(const t of u.value){const n={id:t.id,name:t.name,type:"folder",children:[],parent_id:t.parent_id};e.set(t.id,n)}for(const t of d.value)if(!t.folder_id){const n={id:t.id,name:t.title,type:"document",parent_id:null};e.set(t.id,n)}for(const t of d.value)if(t.folder_id){const n=e.get(t.folder_id);n&&n.children&&n.children.push({id:t.id,name:t.title,type:"document",parent_id:t.folder_id})}for(const t of e.values())if(t.parent_id===null)o.push(t);else{const n=e.get(t.parent_id);n&&n.children&&n.children.push(t)}p.value=o}async function w(e,o){const t=await r.post("/projects",{name:e,description:o});return c.value.push(t),t}async function _(e,o,t){var h;const n=await r.put(`/projects/${e}`,{name:o,description:t}),v=c.value.findIndex(F=>F.id===e);return v!==-1&&(c.value[v]=n),((h=a.value)==null?void 0:h.id)===e&&(a.value=n),n}async function g(e){var o;await r.delete(`/projects/${e}`),c.value=c.value.filter(t=>t.id!==e),((o=a.value)==null?void 0:o.id)===e&&(a.value=null)}async function P(e,o,t=null){const n=await r.post(`/projects/${e}/folders`,{name:o,parent_id:t});return u.value.push(n),await f(e),n}async function $(e){await r.delete(`/folders/${e}`),a.value&&await f(a.value.id)}return{projects:c,currentProject:a,folders:u,documents:d,treeNodes:p,loading:i,error:l,fetchProjects:j,fetchProject:y,fetchProjectTree:f,createProject:w,updateProject:_,deleteProject:g,createFolder:P,deleteFolder:$}});export{M as u};

14
dist/index.html vendored Normal file
View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Claudia Docs</title>
<script type="module" crossorigin src="/assets/index-BgrozaY3.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BG6SLZYI.css">
</head>
<body>
<div id="app"></div>
</body>
</html>