living-ai-documentation 3.27.0 → 3.29.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/dist/frontend-svelte/assets/{index-eGimZybK.js → index-DnKuITXE.js} +8 -8
- package/dist/frontend-svelte/assets/{main-OYlepKtL.js → main-C6KyG7XM.js} +1 -1
- package/dist/frontend-svelte/index.html +1 -1
- package/dist/src/lib/folderName.d.ts +3 -0
- package/dist/src/lib/folderName.d.ts.map +1 -0
- package/dist/src/lib/folderName.js +23 -0
- package/dist/src/lib/folderName.js.map +1 -0
- package/dist/src/routes/browse.d.ts.map +1 -1
- package/dist/src/routes/browse.js +9 -3
- package/dist/src/routes/browse.js.map +1 -1
- package/dist/src/routes/workspace.d.ts.map +1 -1
- package/dist/src/routes/workspace.js +73 -21
- package/dist/src/routes/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -82,7 +82,7 @@ Texte`};case`link`:return{text:Se(`snip-link-text`),textFallback:X(`snippet.link
|
|
|
82
82
|
|
|
83
83
|
`,t+1);return n>=0?n:e.length}s=s.previousElementSibling}let c=a.nextElementSibling;for(;c;){let t=Yl(e,c,r);if(t!==null){let n=e.lastIndexOf(`
|
|
84
84
|
|
|
85
|
-
`,t);return n>=0?n:0}c=c.nextElementSibling}return e.length}function Zl(e,t,n){if(!e||typeof t!=`string`)return()=>{};let r=Bl(t);Hl(e,r);let i=i=>{let a=i.target?.closest(`[data-inline-snippet-index]`);if(a&&e.contains(a)){let e=r[Number(a.dataset.inlineSnippetIndex)];if(!e)return;i.preventDefault();let t=Al(e.type),o=Ml(e.type);Wl(i,[{iconClass:t.iconClass,labelKey:t.labelKey,dataAction:`edit`,dataType:e.type,onActivate:()=>n.onEdit(e)},{iconClass:o.iconClass,labelKey:o.labelKey,dataAction:`delete`,dataType:e.type,onActivate:()=>n.onDelete(e)}]);return}if(!e.contains(i.target))return;let o=Xl(t,e,i.target,r,i.clientY);o!==null&&(i.preventDefault(),Wl(i,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(o)}))};e.addEventListener(`contextmenu`,i);let a=t=>{let i=t.target?.closest(`[data-inline-snippet-index]`);if(!i||!e.contains(i))return;let a=r[Number(i.dataset.inlineSnippetIndex)];!a||a.type!==`table`||(t.preventDefault(),t.stopPropagation(),Ul(),n.onEdit({...a,tableFocusCell:Kl(t.target,i)||void 0}))};e.addEventListener(`dblclick`,a);let o=e.closest(`#home-content-area`)||e.closest(`main`),s=null;o&&(s=r=>{r.defaultPrevented||e.offsetParent!==null&&(r.target?.closest(`textarea, input, [data-inline-snippet-index]`)||e.contains(r.target)||(r.preventDefault(),Wl(r,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(t.length)})))},o.addEventListener(`contextmenu`,s));let c=e=>{Pl&&!Pl.contains(e.target)&&Ul()},l=e=>{e.key===`Escape`&&Ul()};return document.addEventListener(`click`,c),document.addEventListener(`keydown`,l),()=>{e.removeEventListener(`contextmenu`,i),e.removeEventListener(`dblclick`,a),o&&s&&o.removeEventListener(`contextmenu`,s),document.removeEventListener(`click`,c),document.removeEventListener(`keydown`,l),Ul(),e.querySelectorAll(`[data-inline-snippet-index]`).forEach(e=>{e.removeAttribute(`data-inline-snippet-index`),e.classList.remove(`ld-inline-snippet-target`)})}}var Ql=W(`<textarea id="doc-editor" data-testid="doc-editor" spellcheck="false" class="w-full min-h-[70vh] px-4 py-3 text-sm font-mono leading-relaxed rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 resize-y"></textarea>`),$l=W(`<div id="doc-content" data-testid="doc-content"></div>`),eu=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-5"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"> </h3> <div class="space-y-1.5"><label for="img-paste-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> <span class="font-normal text-gray-400"> </span></label> <div class="flex items-center gap-2"><input id="img-paste-name" type="text" class="flex-1 px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="text-xs text-gray-400 shrink-0"> </span></div></div> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`),tu=W(`<div data-testid="content-lightbox" class="fixed inset-0 z-50 bg-white flex items-center justify-center cursor-pointer p-4"><img data-testid="lightbox-image" class="max-w-full max-h-full object-contain select-none"/> <button class="absolute top-4 right-4 text-gray-500 hover:text-gray-950 text-2xl leading-none">×</button></div>`),nu=W(`<!> <!> <!> <!>`,1);function ru(e,t){Ge(t,!0);let n=Bi(t,`onopen`,3,()=>{}),r=Bi(t,`onanchor`,3,D),i=Bi(t,`onconfirmdelete`,3,void 0),a=Bi(t,`oncontentwired`,3,void 0),o=Bi(t,`rewireSignal`,3,void 0),s=Bi(t,`editing`,15,!1),c=Bi(t,`saveMsg`,15,null),l=F(null),u=F(null),d=F(``),f=null,p=F(!1),m=F(`insert`),h=F(null),g=F(0),_=F(!1),v=F(``),y=F(`png`),b=null,x=0,S=0,C=F(null),w=F(``),T=/[̀-ͯ]/g;function E(e){return(e||``).normalize(`NFD`).replace(T,``).toLowerCase().replace(/[^a-z0-9]/g,`_`)}function D(e){document.getElementById(e)?.scrollIntoView({behavior:`smooth`,block:`start`})}Vi(()=>{let e=window;return e.openSnippetsModal=()=>{I(m,`insert`),I(p,!0)},e.openSnippetsModalForInlineInsert=e=>{I(m,`inline-insert`),I(g,Math.max(0,Number(e)||0),!0),I(p,!0)},()=>{delete e.openSnippetsModal,delete e.openSnippetsModalForInlineInsert}}),On(()=>{if(o(),t.html,t.content,f?.(),f=null,!(s()||!H(l)))return Fs(H(l),t.html,{content:t.content,codeBlockMaxHeight:Z.codeBlockMaxHeight,t:X,onDocLink:(e,t)=>n()(e,t),onAnchor:r()}),f=Zl(H(l),t.content,{onEdit:e=>{I(m,`inline-edit`),I(h,e,!0),I(p,!0)},onInsert:e=>{I(m,`inline-insert`),I(g,e,!0),I(p,!0)},onDelete:async e=>{(i()?await i()():confirm(X(`snippet.inline_delete_message`)))&&await t.onsave(t.content.slice(0,e.start)+t.content.slice(e.end))}}),a()?.(H(l)),()=>{f?.(),f=null}});function ee(){I(d,t.content,!0),s(!0),c(null),requestAnimationFrame(()=>H(u)?.focus())}function O(){s(!1),c(null)}async function k(){c({text:X(`doc.saving`),cls:`text-gray-400`});try{await t.onsave(H(d)),s(!1),c(null)}catch(e){c({text:X(`error.save`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`})}}function A(){I(m,`insert`),I(p,!0)}function te(){return s()}function ne(e){let t=Array.from(e.clipboardData?.items??[]).find(e=>e.type.startsWith(`image/`));if(t){e.preventDefault(),x=H(u).selectionStart,S=H(u).selectionEnd,I(y,t.type.split(`/`)[1].replace(`jpeg`,`jpg`)||`png`,!0);let n=t.getAsFile();if(!n)return;b=n,I(v,E(Date.now().toString()),!0),I(_,!0);return}let n=Array.from(e.clipboardData?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(n.length){e.preventDefault();let t=H(u).selectionStart,r=H(u).selectionEnd;(async()=>{for(let e of n)await se(e,t,r)})()}}function re(e){let t=Array.from(e.dataTransfer?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(!t.length)return;e.preventDefault(),e.stopPropagation();let n=H(u).selectionStart,r=H(u).selectionEnd;(async()=>{for(let e of t)await se(e,n,r)})()}function ie(e){e.dataTransfer?.types?.includes(`Files`)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`)}function ae(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function oe(e,t,n){let r=H(d).slice(0,t),i=H(d).slice(n);I(d,r+e+i),requestAnimationFrame(()=>{H(u).selectionStart=H(u).selectionEnd=t+e.length,H(u).focus()})}async function se(e,n,r){if(e.size>19922944){c({text:X(`doc.file_too_large`)+` (${(e.size/1024/1024).toFixed(1)} MB, max 19 MB)`,cls:`text-red-500 dark:text-red-400`});return}c({text:X(`doc.uploading_file`),cls:`text-gray-400`});try{let i=await ae(e),a=await fetch(`/api/files/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:i,name:e.name,documentId:t.docId})});if(!a.ok){let e=``;try{e=(await a.json()).error||``}catch{e=await a.text()}throw Error(e||`HTTP ${a.status}`)}let{url:o,originalName:s}=await a.json();oe(`[📎 ${s||e.name}](${o})`,n,r),c(null)}catch(e){c({text:X(`doc.file_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`})}}function ce(){I(_,!1),b=null}async function le(){let e=E(H(v))||Date.now().toString();if(I(_,!1),b){c({text:X(`doc.uploading_image`),cls:`text-gray-400`});try{let t=await ae(b),n=await fetch(`/api/images/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:t,ext:H(y),name:e})});if(!n.ok)throw Error(await n.text());let{filename:r}=await n.json();oe(``,x,S),c(null)}catch(e){c({text:X(`doc.image_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`})}finally{b=null}}}function ue(){I(C,null),I(w,``)}function de(e){if(!e.shiftKey&&!e.metaKey)return;let t=e.target,n=t.closest(`img`),r=t.closest(`.mermaid`)?.querySelector(`svg`);if(!n&&!r)return;if(e.preventDefault(),e.stopPropagation(),n){I(C,n.src,!0),I(w,n.alt||``,!0);return}let i=new XMLSerializer().serializeToString(r);I(C,`data:image/svg+xml;charset=utf-8,${encodeURIComponent(i)}`),I(w,X(`doc.mermaid_diagram_alt`),!0)}function fe(e){e.key===`Escape`&&H(C)&&ue()}var pe={enterEdit:ee,cancelEdit:O,save:k,openSnippets:A,isEditing:te},me=nu();Mr(`keydown`,an,fe);var he=z(me),ge=e=>{var t=Ql();vn(t),Li(t,e=>I(u,e),()=>H(u)),Mr(`paste`,t,ne),Mr(`drop`,t,re),Mr(`dragover`,t,ie),Mi(t,()=>H(d),e=>I(d,e)),G(e,t)},_e=e=>{var t=$l();Li(t,e=>I(l,e),()=>H(l)),V(()=>hi(t,1,`prose prose-gray dark:prose-invert max-w-none prose-headings:scroll-mt-4 prose-headings:font-semibold prose-h1:text-[2.1875rem] prose-h2:text-[1.8125rem] prose-h3:text-[1.5rem] prose-h4:text-[1.25rem] prose-a:text-blue-600 dark:prose-a:text-blue-400 prose-code:before:content-none prose-code:after:content-none ${Z.codeBlockLightTheme?`prose-pre:bg-[#f6f8fa] prose-pre:text-gray-800 prose-pre:border prose-pre:border-gray-200 prose-pre:rounded-lg dark:prose-pre:bg-[#0d1117] dark:prose-pre:text-gray-100 dark:prose-pre:border-gray-700`:`prose-pre:bg-[#0d1117] prose-pre:border prose-pre:border-gray-700`} ${Z.imageRoundedCorners?`[&_img]:rounded-xl`:``} ${Z.imageCentered?`[&_img]:mx-auto [&_img]:block`:``} ${Z.imageBorder?`[&_img]:[box-shadow:0_0_0_1px_rgba(0,0,0,0.10),0_4px_12px_rgba(0,0,0,0.04)] dark:[&_img]:[box-shadow:0_0_0_1px_rgba(255,255,255,0.08),0_4px_12px_rgba(255,255,255,0.25)]`:``}`)),U(`click`,t,de),G(e,t)};q(he,e=>{s()?e(ge):e(_e,-1)});var ve=B(he,2);Dl(ve,{get open(){return H(p)},get editor(){return H(u)},get mode(){return H(m)},get docId(){return t.docId},get content(){return t.content},get range(){return H(h)},get insertPos(){return H(g)},get onsave(){return t.onsave},onclose:()=>I(p,!1)});var ye=B(ve,2),be=e=>{var t=eu(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a),s=R(o),c=B(s),l=R(c,!0);N(c),N(o);var u=B(o,2),d=R(u);Ei(d);var f=B(d,2),p=R(f);N(f),N(u),N(a);var m=B(a,2),h=R(m),g=R(h,!0);N(h);var _=B(h,2),b=R(_,!0);N(_),N(m),N(n),N(t),V((e,t,n,r,a)=>{K(i,`🖼️ ${e??``}`),K(s,`${t??``} `),K(l,n),Di(d,H(v)),K(p,`.${H(y)??``}`),K(g,r),K(b,a)},[()=>X(`modal.img_paste.title`),()=>X(`modal.img_paste.filename_label`),()=>X(`modal.img_paste.saved_hint`),()=>X(`common.cancel`),()=>X(`modal.img_paste.paste_btn`)]),U(`input`,d,e=>I(v,E(e.target.value),!0)),U(`click`,h,ce),U(`click`,_,le),G(e,t)};q(ye,e=>{H(_)&&e(be)});var xe=B(ye,2),Se=e=>{var t=tu(),n=R(t),r=B(n,2);N(t),V(()=>{Y(n,`src`,H(C)),Y(n,`alt`,H(w))}),U(`click`,t,ue),U(`click`,n,e=>e.stopPropagation()),U(`click`,r,ue),G(e,t)};return q(xe,e=>{H(C)&&e(Se)}),G(e,me),Ke(pe)}Nr([`click`,`input`]);var iu=W(`<span> </span> <code> </code>`,1),au=W(`<button type="button" data-testid="bp-copy-doc-id"><i aria-hidden="true"></i></button>`),ou=W(`<button class="bpadr-icon-btn" data-testid="bp-edit" type="button">✏️</button> <button class="bpadr-icon-btn" data-testid="bp-delete" type="button">🗑️</button>`,1),su=W(`<span> </span>`),cu=W(`<footer class="bpadr-footer bpadr-doc-footer"><!> <button type="button" class="bpadr-btn-ghost" data-testid="bp-cancel"> </button> <button type="button" class="bpadr-btn-ghost" data-testid="bp-snippets"> </button> <button type="button" class="bpadr-btn-primary" data-testid="bp-save"> </button></footer>`),lu=W(`<div class="bpadr-read"><!></div> <!>`,1),uu=W(`<form class="bpadr-form"><input type="hidden" name="category"/> <input type="hidden" name="folder"/> <div class="bpadr-field"><label for="adr-title"> </label> <input id="adr-title" type="text" class="bpadr-input"/></div> <div class="bpadr-field bpadr-field-grow"><label for="adr-content"> </label> <textarea id="adr-content" class="bpadr-textarea"></textarea></div> <footer class="bpadr-footer"><button type="button" class="bpadr-btn-ghost"> </button> <button type="button" data-testid="bp-form-snippets" class="bpadr-btn-ghost"> </button> <button type="submit" class="bpadr-btn-primary"> </button></footer></form> <!>`,1),du=W(`<div class="bpadr-folder-confirm"><p></p> <p class="bpadr-muted"> </p> <footer class="bpadr-footer"><button type="button" class="bpadr-btn-ghost"> </button> <button type="button" class="bpadr-btn-primary"> </button></footer></div>`),fu=W(`<div class="bpadr-overlay"><div class="bpadr-modal"><header class="bpadr-header"><div class="bpadr-title-row"><h2 class="bpadr-title"><!></h2> <!></div> <div class="bpadr-header-actions"><!> <button class="bpadr-icon-btn" type="button" title="Close">×</button></div></header> <!></div></div>`),pu=W(`<div class="fixed inset-0 z-[60] flex items-center justify-center bg-black/50 p-4"><div class="w-full max-w-sm bg-white dark:bg-gray-900 border border-red-200 dark:border-red-700 rounded-xl shadow-2xl p-5 flex flex-col gap-3"><p class="text-sm text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-500 dark:text-gray-400 italic truncate"> </p> <div class="flex justify-end gap-2 mt-2"><button type="button" data-testid="bp-delete-cancel" class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button type="button" data-testid="bp-delete-confirm" class="text-sm px-4 py-1.5 rounded-lg bg-red-500 hover:bg-red-600 text-white font-semibold transition-colors"> </button></div></div></div>`),mu=W(`<!> <!>`,1);function hu(e,t){Ge(t,!0);let n=Bi(t,`onchanged`,3,()=>{}),r=`000_BLUEPRINT`;function i(e){return e.normalize(`NFKD`).replace(/[̀-ͯ]/g,``).toUpperCase().replace(/[^A-Z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`FOLDER`}function a(e){return`/${(e.folder.path||e.folder.name).replace(/^\/+|\/+$/g,``)||e.folder.name}`}let o=F(`closed`),s=F(``),c=F(``),l=F(``),u=F(``),d=F(``),f=F(``),p=F(``),m=F(``),h=F(null),g=F(null),_=F(null),v=F(!1),y=F(null),b=F(null),x=F(!1),S=F(!1),C=F(!1);async function w(e){I(g,e,!0),I(h,null),I(v,!1),I(y,null);let t=i(e.folder.name);if(I(l,t,!0),I(c,e.folder.name,!0),I(u,``),I(d,``),I(f,``),I(m,a(e),!0),I(s,X(`blueprint.adr.new_title`,{folder:e.folder.name}),!0),I(o,`form`),!(await fetch(`/api/blueprint/blueprint-folder`).then(e=>e.json())).exists){I(p,r),I(o,`folder-confirm`);return}await E(e,t)}async function T(e){return fetch(`/api/documents/${encodeURIComponent(e)}`).then(e=>e.json())}async function E(e,t){let n=await fetch(`/api/blueprint/blueprint-adr?category=${encodeURIComponent(t)}`).then(e=>e.json());if(n.found&&n.doc){I(h,n.doc.id,!0);let e=await T(n.doc.id);I(c,e.title,!0),I(d,e.content,!0),I(f,e.html,!0),I(s,e.title,!0),I(v,!1),I(o,`doc`)}else I(c,e.folder.name,!0),I(u,``),I(o,`form`)}function D(){I(o,`closed`),I(v,!1),I(h,null),I(g,null),I(m,``),I(C,!1)}async function ee(){if(H(h))try{await navigator.clipboard.writeText(decodeURIComponent(H(h))),I(C,!0),setTimeout(()=>I(C,!1),1800)}catch{}}async function O(){await fetch(`/api/blueprint/blueprint-folder`,{method:`POST`}),H(g)&&await E(H(g),i(H(g).folder.name))}async function k(e){if(!H(h))return;await fetch(`/api/documents/${encodeURIComponent(H(h))}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:H(c).trim()||H(g)?.folder.name||X(`common.untitled`),category:H(l),folder:r,content:e})});let t=await T(H(h));I(s,t.title,!0),I(d,t.content,!0),I(f,t.html,!0)}async function A(e){e.preventDefault();let t={title:H(c).trim()||H(g)?.folder.name||X(`common.untitled`),category:H(l),folder:r},i=await fetch(`/api/documents/`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}).then(e=>e.json());I(h,i.id,!0);let a=await T(i.id);I(s,a.title,!0),I(d,a.content,!0),I(f,a.html,!0),I(v,!1),I(o,`doc`),n()()}async function te(){I(S,!1),H(h)&&(await fetch(`/api/documents/${encodeURIComponent(H(h))}`,{method:`DELETE`}),D(),n()())}var ne={open:w},re=mu(),ie=z(re),ae=e=>{var t=fu(),n=R(t),i=R(n),a=R(i),g=R(a),w=R(g),T=e=>{var t=iu(),n=z(t),r=R(n,!0);N(n);var i=B(n,2),a=R(i,!0);N(i),V(e=>{K(r,e),K(a,H(m))},[()=>X(`blueprint.adr.folder_title`)]),G(e,t)},E=e=>{var t=Hr();V(()=>K(t,H(s))),G(e,t)};q(w,e=>{H(m)?e(T):e(E,-1)}),N(g);var te=B(g,2),ne=e=>{var t=au(),n=R(t);N(t),V(e=>{Y(t,`title`,e),hi(t,1,`bpadr-copy-btn ${H(C)?`copied`:``}`),hi(n,1,`fa-${H(C)?`solid fa-check`:`regular fa-copy`}`)},[()=>X(`doc.copy_mcp_id`)]),U(`click`,t,ee),G(e,t)};q(te,e=>{H(h)&&e(ne)}),N(a);var re=B(a,2),ie=R(re),ae=e=>{var t=ou(),n=z(t),r=B(n,2);V((e,t)=>{Y(n,`title`,e),Y(r,`title`,t)},[()=>X(`doc.edit`),()=>X(`doc.delete`)]),U(`click`,n,()=>H(_).enterEdit()),U(`click`,r,()=>I(S,!0)),G(e,t)};q(ie,e=>{H(o)===`doc`&&!H(v)&&e(ae)});var oe=B(ie,2);N(re),N(i);var se=B(i,2),ce=e=>{var t=lu(),n=z(t),r=R(n);{let e=P(()=>H(h)??``);Li(ru(r,{get docId(){return H(e)},get content(){return H(d)},get html(){return H(f)},onsave:k,get editing(){return H(v)},set editing(e){I(v,e,!0)},get saveMsg(){return H(y)},set saveMsg(e){I(y,e,!0)}}),e=>I(_,e,!0),()=>H(_))}N(n);var i=B(n,2),a=e=>{var t=cu(),n=R(t),r=e=>{var t=su(),n=R(t,!0);N(t),V(()=>{hi(t,1,`text-xs ${H(y).cls??``}`),K(n,H(y).text)}),G(e,t)};q(n,e=>{H(y)&&e(r)});var i=B(n,2),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(t),V((e,t,n)=>{K(a,e),K(s,t),K(l,n)},[()=>X(`common.cancel`),()=>X(`doc.snippets_btn`),()=>X(`common.save`)]),U(`click`,i,()=>H(_).cancelEdit()),U(`click`,o,()=>H(_).openSnippets()),U(`click`,c,()=>H(_).save()),G(e,t)};q(i,e=>{H(v)&&e(a)}),G(e,t)},le=e=>{var t=uu(),n=z(t),i=R(n);Ei(i);var a=B(i,2);Ei(a),Di(a,r);var s=B(a,2),d=R(s),f=R(d,!0);N(d);var p=B(d,2);Ei(p),N(s);var m=B(s,2),g=R(m),_=R(g,!0);N(g);var v=B(g,2);vn(v),Li(v,e=>I(b,e),()=>H(b)),N(m);var y=B(m,2),S=R(y),C=R(S,!0);N(S);var w=B(S,2),T=R(w,!0);N(w);var E=B(w,2),ee=R(E,!0);N(E),N(y),N(n),Dl(B(n,2),{get open(){return H(x)},get editor(){return H(b)},mode:`insert`,get content(){return H(u)},onclose:()=>I(x,!1)}),V((e,t,n,r,a)=>{Di(i,H(l)),K(f,e),K(_,t),K(C,n),K(T,r),K(ee,a)},[()=>X(`blueprint.adr.title_label`),()=>X(`blueprint.adr.content_label`),()=>X(`common.cancel`),()=>X(`doc.snippets_btn`),()=>X(`common.save`)]),Mr(`submit`,n,A),Mi(p,()=>H(c),e=>I(c,e)),Mi(v,()=>H(u),e=>I(u,e)),U(`click`,S,()=>{H(h)?I(o,`doc`):D()}),U(`click`,w,()=>I(x,!0)),G(e,t)},ue=e=>{var t=du(),n=R(t);ii(n,()=>X(`blueprint.adr.folder_missing`,{name:H(p)}),!0),N(n);var r=B(n,2),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(a),N(t),V((e,t,n)=>{K(i,e),K(s,t),K(l,n)},[()=>X(`blueprint.adr.folder_create_prompt`),()=>X(`common.cancel`),()=>X(`blueprint.adr.create_folder_btn`)]),U(`click`,o,D),U(`click`,c,O),G(e,t)};q(se,e=>{H(o)===`doc`?e(ce):H(o)===`form`?e(le,1):H(o)===`folder-confirm`&&e(ue,2)}),N(n),N(t),U(`click`,t,e=>{e.target===e.currentTarget&&D()}),U(`click`,oe,D),G(e,t)};q(ie,e=>{H(o)!==`closed`&&e(ae)});var oe=B(ie,2),se=e=>{var t=pu(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var c=B(a,2),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d,!0);N(d),N(c),N(n),N(t),V((e,t,n)=>{K(i,e),K(o,H(s)),K(u,t),K(f,n)},[()=>X(`doc.confirm_delete`),()=>X(`common.cancel`),()=>X(`doc.confirm_delete_btn`)]),U(`click`,t,e=>{e.target===e.currentTarget&&I(S,!1)}),U(`click`,l,()=>I(S,!1)),U(`click`,d,te),G(e,t)};return q(oe,e=>{H(S)&&e(se)}),G(e,re),Ke(ne)}Nr([`click`]);var gu=W(`<span class="breadcrumb-sep">›</span>`),_u=W(`<span class="breadcrumb-item current"> </span>`),vu=W(`<button class="breadcrumb-item" type="button"> </button>`),yu=W(`<!> <!>`,1),bu=W(`<nav class="breadcrumb"></nav>`),xu=W(`<div class="app-shell"><!> <section class="workspace-shell"><!> <!></section></div> <!>`,1);function Su(e,t){Ge(t,!0),Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}});let n=F(L([])),r=F(null),i=F(null),a=F(null),o=F(null);function s(e){l(),H(i).loadPath(e,!0)}async function c(e){I(r,e.folder.path,!0),await br(),await H(a).open(e.folder.path)}function l(){I(r,null)}async function u(e){await H(i).navigateToFolder(e)}var d=xu(),f=z(d),p=R(f);{let e=P(()=>X(`blueprint.subtitle`));Ja(p,{title:`Blueprint`,get subtitle(){return H(e)},children:(e,t)=>{var r=bu();J(r,21,()=>H(n),Yr,(e,t,r)=>{var i=yu(),a=z(i),o=e=>{G(e,gu())};q(a,e=>{r>0&&e(o)});var c=B(a,2),l=e=>{var n=_u(),r=R(n,!0);N(n),V(()=>K(r,H(t).name)),G(e,n)},u=e=>{var n=vu(),r=R(n,!0);N(n),V(()=>K(r,H(t).name)),U(`click`,n,()=>s(H(t).path)),G(e,n)};q(c,e=>{r===H(n).length-1?e(l):e(u,-1)}),G(e,i)}),N(r),G(e,r)},$$slots:{default:!0}})}var m=B(p,2),h=R(m);Li(_o(h,{get activeExplorerPath(){return H(r)},onbreadcrumbchange:e=>I(n,e,!0),onopenexplorer:c,onclosefilerexplorer:l,onopenAdr:e=>H(o).open(e)}),e=>I(i,e,!0),()=>H(i));var g=B(h,2),_=e=>{Li(Lo(e,{onclose:l,onnavigate:u}),e=>I(a,e,!0),()=>H(a))};q(g,e=>{H(r)!==null&&e(_)}),N(m),N(f),Li(hu(B(f,2),{onchanged:()=>H(i).loadPath(H(n).at(-1)?.path??``,!1)}),e=>I(o,e,!0),()=>H(o)),G(e,d),Ke()}Nr([`click`]);var Cu=164,wu=64,Tu=132,Eu=78,Du=6,Ou=24,ku=96,Au=540,ju=780,Mu=1/2,Nu=9999,Pu=44,Fu=255,Iu=178,Lu=Math.PI*.7,Ru=Math.PI*1.1,zu=Math.PI*1.45,Bu=Math.PI*1.75,Vu=14,Hu=260,Uu=56,Wu=32,Gu=[`pointerdown`,`mousedown`,`click`,`dblclick`,`touchstart`,`wheel`],Ku=.35,qu=2.2,Ju=.0018,Yu=4,Xu=46,Zu=4,Qu=44,$u=360,ed=300,td=44,nd=48,rd=7,id=875,ad=450,od=600*1e3,sd,Q,cd,ld,ud,dd,fd,pd,md,hd,gd,_d,vd,yd,bd,xd,Sd,Cd,wd,Td,Ed,Dd,Od,kd,Ad,jd,Md,Nd,Pd=null,Fd=null,Id=null,Ld,$,Rd,zd=!1;function Bd(){return sd=document.getElementById(`workspaceCanvas`),Q=sd.getContext(`2d`),cd=document.getElementById(`apiStatus`),ld=document.getElementById(`addButton`),ud=document.getElementById(`fitButton`),dd=document.getElementById(`testNodeButton`),fd=document.getElementById(`loadModelsButton`),pd=document.getElementById(`closePanelButton`),md=document.getElementById(`deleteNodeButton`),hd=document.getElementById(`renameConfirmOverlay`),gd=document.getElementById(`renameConfirmMessage`),_d=document.getElementById(`cancelRenameButton`),vd=document.getElementById(`confirmRenameButton`),yd=document.getElementById(`deleteConfirmOverlay`),bd=document.getElementById(`deleteConfirmMessage`),xd=document.getElementById(`cancelDeleteButton`),Sd=document.getElementById(`confirmDeleteButton`),Cd=document.getElementById(`agentRunOverlay`),wd=document.getElementById(`agentRunTitle`),Td=document.getElementById(`agentRunHint`),Ed=document.getElementById(`agentRunInputField`),Dd=document.getElementById(`agentRunInput`),Od=document.getElementById(`agentRunResult`),kd=document.getElementById(`cancelAgentRunButton`),Ad=document.getElementById(`executeAgentRunButton`),jd=document.getElementById(`fallbackPanelHost`),Md=document.getElementById(`configSurface`),Nd=Md,Pd=null,Fd=null,Id=null,Ld={name:document.getElementById(`nodeName`),kind:document.getElementById(`nodeKind`),endpoint:document.getElementById(`nodeEndpoint`),token:document.getElementById(`nodeToken`),model:document.getElementById(`nodeModel`),workspaceField:document.getElementById(`agentWorkspaceField`),workspaceFolder:document.getElementById(`nodeWorkspaceFolder`),timeout:document.getElementById(`nodeTimeout`),description:document.getElementById(`nodeDescription`),typeBadge:document.getElementById(`nodeTypeBadge`),llmFields:document.getElementById(`llmFields`),mcpInventory:document.getElementById(`mcpInventory`),agentSection:document.getElementById(`agentSection`),systemPrompt:document.getElementById(`nodeSystemPrompt`),requiresUserInput:document.getElementById(`nodeRequiresUserInput`),userInputDescriptionField:document.getElementById(`agentUserInputDescriptionField`),userInputDescription:document.getElementById(`nodeUserInputDescription`),expectedOutputMarker:document.getElementById(`nodeExpectedOutputMarker`)},$={entities:rf([nf(`root`,`Living AI Documentation`,`system`,null),nf(`mcp`,`MCP`,`mcp`,`root`)]),selectedId:null,cameraX:0,cameraY:0,zoom:1,isPanning:!1,panStartX:0,panStartY:0,panStartCameraX:0,panStartCameraY:0,didPan:!1,viewAnimationId:null,dpr:window.devicePixelRatio||1,apiMode:`fallback`,lastSaveAt:null,pendingDeleteId:null,panelShiftX:0,saveTimerId:null,isHydrated:!1},zd=!!sd.requestPaint&&typeof Q.drawElementImage==`function`,zd?($.apiMode=`html-in-canvas`,cd.textContent=`HTML-in-Canvas active`,cd.classList.add(`is-live`),sd.onpaint=Qf):(jd.appendChild(Md),cd.textContent=`DOM fallback`,cd.classList.add(`is-fallback`)),Rd=new ResizeObserver(([e])=>{let t=e.devicePixelContentBoxSize&&e.devicePixelContentBoxSize[0],n=e.contentRect.width,r=e.contentRect.height;$.dpr=t?t.inlineSize/n:window.devicePixelRatio||1,sd.width=t?t.inlineSize:Math.floor(n*$.dpr),sd.height=t?t.blockSize:Math.floor(r*$.dpr),ff(),sp(!1,!$.cameraX&&!$.cameraY),Zf()}),Rd.observe(sd,{box:`device-pixel-content-box`}),Vd(),Hd(),ld.addEventListener(`click`,()=>{lf()}),ud.addEventListener(`click`,()=>{ff(),sp(!0,!0),qd(),Zf()}),sd.addEventListener(`pointerdown`,e=>{if(e.target!==sd)return;let t=Ap(e),n=_p(t),r=[...$.entities].reverse().find(e=>Cp(e,n));if(r){r.id!==`root`&&wf(r.id);return}$.isPanning=!0,$.didPan=!1,$.panStartX=t.x,$.panStartY=t.y,$.panStartCameraX=$.cameraX,$.panStartCameraY=$.cameraY,sd.classList.add(`is-panning`),sd.setPointerCapture?.(e.pointerId)}),sd.addEventListener(`pointermove`,e=>{if(!$.isPanning)return;let t=Ap(e),n=t.x-$.panStartX,r=t.y-$.panStartY;Math.hypot(n,r)>Yu&&($.didPan=!0),$.cameraX=$.panStartCameraX+n,$.cameraY=$.panStartCameraY+r,Zf()}),sd.addEventListener(`pointerup`,e=>{$.isPanning&&($.isPanning=!1,sd.classList.remove(`is-panning`),sd.releasePointerCapture?.(e.pointerId),!$.didPan&&$.selectedId?wf(null):$.didPan&&qd())}),sd.addEventListener(`pointercancel`,e=>{$.isPanning=!1,sd.classList.remove(`is-panning`),sd.releasePointerCapture?.(e.pointerId)}),sd.addEventListener(`wheel`,e=>{e.target===sd&&(e.preventDefault(),gp(Ap(e),Math.exp(-e.deltaY*Ju)),qd())},{passive:!1}),Nd.addEventListener(`submit`,e=>{e.preventDefault(),kf(),$.lastSaveAt=new Date,ff(),Jd(!0),Zf()}),Nd.addEventListener(`input`,e=>{kf(),ff(),e.target===Ld.name&&Kf()?.kind===`agent`||qd(),Zf()}),pd.addEventListener(`click`,()=>{wf(null)}),md.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation();let t=$.selectedId,n=t?qf(t):null;!n||Jf(t)||Tf(n)}),xd.addEventListener(`click`,Ef),yd.addEventListener(`click`,e=>{e.target===yd&&Ef()}),Sd.addEventListener(`click`,()=>{$.pendingDeleteId&&Df($.pendingDeleteId),Ef()}),dd.addEventListener(`click`,()=>{if(Kf()?.kind===`agent`){Mf();return}Wf()}),fd.addEventListener(`click`,()=>{Uf()}),Ld.name.addEventListener(`blur`,()=>{let e=Kf();if(!e||e.kind!==`agent`)return;let t=Ld.name.value.trim();if(!t||!Pd||!Fd||t===Pd)return;let n=of(t);n!==Fd&&(gd.textContent=`Renommer le dossier "${Fd}" en "${n}" ?`,hd.hidden=!1,_d.focus())}),_d.addEventListener(`click`,()=>{hd.hidden=!0;let e=Kf();e&&Pd&&(e.label=Pd,Ld.name.value=Pd,ff(),Zf())}),vd.addEventListener(`click`,()=>{hd.hidden=!0;let e=Kf();if(!e||!Fd)return;e.config.workspaceFolder=Fd,Ld.workspaceFolder.value=Fd;let t=Ld.name.value.trim();t&&(Pd=t),Fd=of(t),qd()}),Ld.model.addEventListener(`change`,()=>{dd.disabled=!Ld.model.value;let e=Kf();e&&(e.config.model=Ld.model.value)}),kd.addEventListener(`click`,()=>{Nf()}),Ad.addEventListener(`click`,()=>{Pf()}),Cd.addEventListener(`click`,e=>{e.target===Cd&&Nf()}),Wd(),()=>{Rd.disconnect(),$?.saveTimerId&&clearTimeout($.saveTimerId)}}function Vd(){for(let e of Gu)Md.addEventListener(e,Ud),jd.addEventListener(e,Ud)}function Hd(){for(let e of Gu)yd.addEventListener(e,Ud),hd.addEventListener(e,Ud),Cd.addEventListener(e,Ud)}function Ud(e){e.stopPropagation()}async function Wd(){let e=await ja();e?.entities?.length&&($.entities=Gd(e.entities),$.cameraX=tf(e.camera?.x,$.cameraX),$.cameraY=tf(e.camera?.y,$.cameraY),$.zoom=vp(tf(e.camera?.zoom,$.zoom),Ku,qu),$.lastSaveAt=e.updatedAt?new Date(e.updatedAt):null),$.isHydrated=!0,ff(),e?.entities?.length||sp(!1,!0),Of(),Zf()}function Gd(e){let t=e.map(Kd).filter(e=>!!e),n=t.some(e=>e.id===`root`),r=t.some(e=>e.id===`mcp`),i=[...n?[]:[nf(`root`,`Living AI Documentation`,`system`,null)],...t,...r?[]:[nf(`mcp`,`MCP`,`mcp`,`root`)]],a=new Set(i.map(e=>e.id));return i.map(e=>{let t=e.id===`root`?`system`:e.id===`mcp`?`mcp`:e.kind,n=e.id===`root`?null:e.id===`mcp`?`root`:e.parentId&&a.has(e.parentId)?e.parentId:null;return{...e,kind:t,parentId:n,config:{...nf(e.id,e.label,t,n).config,...e.config}}})}function Kd(e){if(!Qd(e))return null;let t=$d(e.id),n=$d(e.label),r=ef(e.kind);if(!t||!n||!r)return null;let i=e.parentId===null?null:$d(e.parentId),a=Qd(e.config)?e.config:{};return{id:t,label:n,kind:r,parentId:i,x:tf(e.x,0),y:tf(e.y,0),angle:tf(e.angle,0),config:{endpoint:$d(a.endpoint)||af(t,r),token:$d(a.token),model:$d(a.model),timeout:tf(a.timeout,180),description:$d(a.description)||cf(r),workspaceFolder:$d(a.workspaceFolder)||(r===`agent`?of(n):``),systemPrompt:$d(a.systemPrompt),requiresUserInput:a.requiresUserInput===!0,userInputDescription:$d(a.userInputDescription),expectedOutputMarker:$d(a.expectedOutputMarker)}}}function qd(){$.isHydrated&&($.saveTimerId&&clearTimeout($.saveTimerId),$.saveTimerId=window.setTimeout(()=>{$.saveTimerId=null,Jd(!1)},ad))}async function Jd(e=!1){if(!$.isHydrated)return;$.saveTimerId&&(clearTimeout($.saveTimerId),$.saveTimerId=null);let t=await Ma(Zd());t?($.entities=Gd(t.entities),$.lastSaveAt=new Date(t.updatedAt),Kf()&&Of(),e&&Xd(`Workspace saved`)):e&&Xd(`Save failed`)}function Yd(e,t){return Oa(e,t)}function Xd(e,t=`success`,n,r){return ka(e,t,n,r)}function Zd(){return{version:1,updatedAt:new Date().toISOString(),entities:$.entities.map(e=>({id:e.id,label:e.label,kind:e.kind,parentId:e.parentId,x:e.x,y:e.y,angle:e.angle,config:{...e.config}})),camera:{x:$.cameraX,y:$.cameraY,zoom:$.zoom}}}function Qd(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $d(e){return typeof e==`string`?e:``}function ef(e){return e===`system`||e===`llm`||e===`agent`||e===`mcp`?e:null}function tf(e,t){return typeof e==`number`&&Number.isFinite(e)?e:t}function nf(e,t,n,r){return{id:e,label:t,kind:n,parentId:r,x:0,y:0,angle:0,config:{endpoint:af(e,n),token:``,model:``,timeout:180,description:cf(n),workspaceFolder:n===`agent`?of(t):``,systemPrompt:``,requiresUserInput:!1,userInputDescription:``,expectedOutputMarker:``}}}function rf(e){return e.map(e=>({...e,config:{...e.config}}))}function af(e,t){return t===`llm`?`http://localhost:11434`:t===`mcp`?`http://localhost:4321/mcp`:``}function of(e){return`AI/WORKSPACE/${sf(e)}`}function sf(e){return e.normalize(`NFKD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`llm_provider`}function cf(e){let t={system:`Owns the documentation workspace, MCP access, providers, and agent topology.`,llm:`Routes model calls and hosts the agents assigned to this provider.`,agent:`Runs focused automation against documentation, source, or quality signals.`,mcp:`Exposes the local Living Documentation MCP consultation panel to agents.`};return t[e]||t.agent}function lf(){let e=Kf(),t=e?.kind===`llm`?e:qf(e?.parentId);if(e?.kind===`llm`||t?.kind===`llm`){df(t.id);return}uf()}function uf(){let e=!!$.selectedId,t=Yf(`root`).filter(e=>e.kind===`llm`).length+1,n=nf(`provider-${Date.now().toString(36)}`,`LLM Provider ${t}`,`llm`,`root`);$.entities=[...$.entities,n],$.selectedId=n.id,ff(),cp(e,!0,!0),Of(),qd(),Zf()}function df(e){let t=!!$.selectedId,n=Yf(e).filter(e=>e.kind===`agent`).length+1,r=nf(`agent-${Date.now().toString(36)}`,`Agent ${n}`,`agent`,e);$.entities=[...$.entities,r],$.selectedId=r.id,ff(),cp(t,!0,!0),Of(),qd(),Zf()}function ff(){let e=qf(`root`);e.x=0,e.y=0,e.angle=0,pf(e)}function pf(e){let t=Yf(e.id),n=yf(t,Tu,Fu,{spread:Math.PI*2,includeSubtree:!1}),r=new Map(t.map(e=>[e.id,_f(e,n)]));for(let n=0;n<=rd;n+=1)if(mf(e,t,r),hf(),!gf(t,r))return;mf(e,t,r),hf()}function mf(e,t,n){let r=Math.max(1,t.length);t.forEach((t,i)=>{let a=-Math.PI/2+i/r*Math.PI*2,o=n.get(t.id)||Fu;t.angle=a,t.x=e.x+Math.cos(a)*o,t.y=e.y+Math.sin(a)*o})}function hf(){for(let e of $.entities.filter(e=>e.kind===`llm`))vf(e)}function gf(e,t){let n=!1;for(let r=0;r<e.length;r+=1)for(let i=r+1;i<e.length;i+=1){let a=e[r],o=e[i];kp(Ep(a),Ep(o),td)&&(t.set(a.id,Math.min(id,t.get(a.id)+nd)),t.set(o.id,Math.min(id,t.get(o.id)+nd)),n=!0)}return n}function _f(e,t){if(e.kind!==`llm`)return t;let n=Yf(e.id).length;if(n<=Zu)return t;let r=(n-Zu)*Qu,i=Math.max(0,Sf(e)-ed)*.65;return t+Math.min($u,Math.max(r,i))}function vf(e){let t=Yf(e.id);if(!t.length)return;let n=Math.atan2(e.y,e.x),r=bf(t.length),i=yf(t,Eu,Iu,{spread:r,includeSubtree:!1});t.forEach((a,o)=>{let s=xf(n,r,o,t.length);a.angle=s,a.x=e.x+Math.cos(s)*i,a.y=e.y+Math.sin(s)*i})}function yf(e,t,n,r={}){if(!e.length)return n;let i=!!r.includeSubtree,a=r.spread||Math.PI*2,o=Math.max(...e.map(e=>i?Sf(e):Cf(e))),s=t+o+Xu;if(e.length===1)return Math.max(n,s);let c=o*2+Xu,l=a>=Math.PI*2-.001?Math.PI*2/e.length:a/(e.length-1),u=c/(2*Math.sin(l/2));return Math.max(n,s,u)}function bf(e){return e<=1?0:e<=2?Lu:e<=4?Ru:e<=7?zu:Bu}function xf(e,t,n,r){return r<=1||t===0?e:e-t/2+n/(r-1)*t}function Sf(e){if(e.kind!==`llm`)return Cf(e);let t=Yf(e.id);return t.length?yf(t,Eu,Iu,{spread:bf(t.length),includeSubtree:!1})+Math.max(...t.map(e=>Cf(e))):Eu}function Cf(e){if(e.kind===`system`)return Tu;if(e.kind===`llm`)return Eu;let{width:t,height:n}=Tp(e);return Math.hypot(t/2,n/2)}function wf(e){let t=!!$.selectedId;$.selectedId=e;let n=e?qf(e):null;Pd=n?.kind===`agent`?n.label:null,Fd=n?.kind===`agent`?n.config.workspaceFolder||of(n.label):null,ff(),cp(t,!!e,!0),Of(),Zf()}function Tf(e){let t=Xf(e.id),n=Yf(e.id).length,r=t.length?` This node has ${n} direct child${n===1?``:`ren`} and ${t.length} total descendant${t.length===1?``:`s`}; they will also be deleted.`:` This node has no children.`;$.pendingDeleteId=e.id,bd.textContent=`You are about to delete "${e.label}".${r} This action cannot be undone.`,yd.hidden=!1,Sd.focus()}function Ef(){$.pendingDeleteId=null,yd.hidden=!0}function Df(e){let t=qf(e);if(!t||Jf(e))return;let n=t.parentId||`root`,r=!!$.selectedId,i=new Set([e,...Xf(e)]);$.entities=$.entities.filter(e=>!i.has(e.id)),$.selectedId=qf(n)?n:null,ff(),cp(r,!!$.selectedId,!0),Of(),qd(),Zf()}function Of(){let e=Kf(),t=!!e;if(Md.hidden=!t,jd.hidden=!t||zd,!e){ld.title=`Add LLM provider`,dd.textContent=`Test`,dd.hidden=!0,dd.disabled=!0;return}Ld.name.value=e.label,Ld.kind.value=e.kind,Ld.endpoint.value=e.config.endpoint,Ld.token.value=e.config.token,jf(e.config.model),Ld.workspaceFolder.value=e.config.workspaceFolder,Ld.workspaceField.hidden=e.kind!==`agent`,Ld.timeout.value=String(e.config.timeout),Ld.description.value=e.config.description,Ld.typeBadge.textContent=Gf(e.kind),Ld.kind.disabled=!0,Ld.llmFields.hidden=e.kind===`mcp`||e.kind===`agent`,Ld.mcpInventory.hidden=e.kind!==`mcp`,Ld.agentSection.hidden=e.kind!==`agent`,Ld.systemPrompt.value=e.config.systemPrompt,Ld.requiresUserInput.checked=e.config.requiresUserInput,Af(),Ld.userInputDescription.value=e.config.userInputDescription,Ld.expectedOutputMarker.value=e.config.expectedOutputMarker,md.hidden=Jf(e.id),dd.textContent=`Test`,dd.hidden=e.kind!==`llm`&&e.kind!==`agent`,dd.disabled=e.kind===`llm`?!e.config.model:e.kind!==`agent`,ld.title=e.kind===`llm`||qf(e.parentId)?.kind===`llm`?`Add agent`:`Add LLM provider`}function kf(){let e=Kf();if(e&&(e.label=Ld.name.value.trim()||`Untitled node`,e.kind=Ld.kind.value,e.config.endpoint=Ld.endpoint.value,e.config.token=Ld.token.value,e.config.model=Ld.model.value,e.config.timeout=Number(Ld.timeout.value||30),e.config.description=Ld.description.value,e.config.systemPrompt=Ld.systemPrompt.value,e.config.requiresUserInput=Ld.requiresUserInput.checked,e.config.userInputDescription=Ld.userInputDescription.value,e.config.expectedOutputMarker=Ld.expectedOutputMarker.value,Af(),Ld.typeBadge.textContent=Gf(e.kind),e.kind===`llm`))for(let t of $.entities)t.parentId===e.id&&t.kind===`agent`&&(t.config.model=e.config.model,t.config.timeout=e.config.timeout)}function Af(){let e=Kf()?.kind===`agent`&&Ld.requiresUserInput.checked;Ld.userInputDescriptionField.hidden=!e,Ld.userInputDescription.required=e}function jf(e){let t=Array.from(Ld.model.options).map(e=>e.value);if(e&&!t.includes(e)){Ld.model.innerHTML=``;let t=document.createElement(`option`);t.value=e,t.textContent=e,Ld.model.appendChild(t)}Ld.model.value=e||(t[0]??``)}function Mf(){let e=Kf();if(!e||e.kind!==`agent`)return;kf();let t=qf(e.parentId??``);if(!t||t.kind!==`llm`){Xd(`No parent LLM found for this agent.`,`error`);return}if(!t.config.model){Xd(`Parent LLM has no model selected.`,`error`);return}if(!e.config.systemPrompt.trim()){Xd(`Write a system prompt first.`,`error`);return}if(e.config.requiresUserInput&&!e.config.userInputDescription.trim()){Xd(`Describe the required user input first.`,`error`);return}Id=e.id,wd.textContent=`Test ${e.label}`,Td.textContent=e.config.requiresUserInput?e.config.userInputDescription:`Run this agent with its configured system prompt.`,Ed.hidden=!e.config.requiresUserInput,Dd.required=e.config.requiresUserInput,Dd.value=``,Od.hidden=!0,Od.textContent=``,Ad.disabled=!1,Ad.textContent=`Run`,Cd.hidden=!1,e.config.requiresUserInput?window.setTimeout(()=>Dd.focus(),0):window.setTimeout(()=>Ad.focus(),0)}function Nf(){Cd.hidden=!0,Id=null}async function Pf(){if(Dd.required&&!Dd.value.trim()){Dd.reportValidity();return}let e=Id?qf(Id):null;if(!e||e.kind!==`agent`){zf(`error`,`The selected agent is no longer available.`);return}let t=qf(e.parentId??``);if(!t||t.kind!==`llm`){zf(`error`,`No parent LLM found for this agent.`);return}Ad.disabled=!0,Ad.textContent=`Running…`;let n=Yd(`Running agent…`);If();let r=$.entities.find(e=>e.kind===`mcp`),i=!1,a=await Pa({providerId:t.id,endpoint:t.config.endpoint,model:t.config.model,systemPrompt:e.config.systemPrompt,userInput:Dd.value.trim()||void 0,timeout:t.config.timeout,mcpEndpoint:r?.config.endpoint||void 0,expectedOutputMarker:e.config.expectedOutputMarker||void 0},e=>{e.type===`error`&&(i=!0),e.type!==`final`&&e.type!==`error`&&Yd(Ff(e),n),Lf(e)});Ad.disabled=!1,Ad.textContent=`Run`,a.ok&&a.content?(Rf(a.content),Xd(`Agent responded. Result saved in AI/WORKSPACE.`,`success`,od,n)):(i||Lf({type:`error`,message:a.error??`Agent failed.`}),Od.dataset.state=`error`,Xd(a.error??`Agent failed.`,`error`,od,n))}function Ff(e){return e.type===`tool_call`&&e.toolName?`Agent tool call: ${e.toolName}`:e.type===`tool_result`&&e.toolName?`Agent tool result: ${e.toolName}`:`Agent: ${e.message}`}function If(){Od.hidden=!1,Od.dataset.state=`loading`,Od.textContent=``,Lf({type:`status`,message:`Preparing agent request`})}function Lf(e){Od.hidden=!1,e.type===`error`&&(Od.dataset.state=`error`);let t=document.createElement(`div`);t.className=`agent-run-event agent-run-event-${e.type.replace(`_`,`-`)}`;let n=document.createElement(`span`);n.className=`agent-run-event-dot`,n.setAttribute(`aria-hidden`,`true`);let r=document.createElement(`div`);r.className=`agent-run-event-body`;let i=document.createElement(`p`);i.className=`agent-run-event-title`,i.textContent=e.message,r.appendChild(i);let a=[];if(e.turn&&a.push(`Turn ${e.turn}`),e.toolName&&a.push(e.toolName),e.detail&&a.push(e.detail),a.length){let e=document.createElement(`p`);e.className=`agent-run-event-meta`,e.textContent=a.join(` · `),r.appendChild(e)}t.append(n,r),Od.appendChild(t),Od.scrollTop=Od.scrollHeight}function Rf(e){Od.dataset.state=`success`;let t=document.createElement(`section`);t.className=`agent-run-final`;let n=document.createElement(`h3`);n.textContent=`Final response`;let r=document.createElement(`pre`);r.textContent=e,t.append(n,r),Od.appendChild(t),Od.scrollTop=Od.scrollHeight}function zf(e,t){Od.hidden=!1,Od.dataset.state=e,Od.textContent=t}var Bf=/^(?:env:[A-Za-z_][A-Za-z0-9_]*|\$\{[A-Za-z_][A-Za-z0-9_]*\})$/;function Vf(e){let t=e.trim();return t!==``&&!Bf.test(t)}var Hf=`API token must reference an environment variable, e.g. env:OPENROUTER_API_KEY`;async function Uf(){let e=Kf();if(!e||e.kind!==`llm`)return;kf();let t=e.config.endpoint;if(!t){Xd(`Set an endpoint first.`);return}if(Vf(e.config.token)){Xd(Hf);return}fd.classList.add(`loading`),fd.disabled=!0,Ld.model.disabled=!0;let n=await Na({endpoint:t,token:e.config.token});if(fd.classList.remove(`loading`),fd.disabled=!1,Ld.model.disabled=!1,!n.ok||!n.models?.length){Xd(n.error??`No models found.`);return}let r=Ld.model.value;Ld.model.innerHTML=``;for(let e of n.models){let t=document.createElement(`option`);t.value=e,t.textContent=e,Ld.model.appendChild(t)}Ld.model.value=n.models.includes(r)?r:n.models[0],e.config.model=Ld.model.value,dd.disabled=!Ld.model.value,Xd(`${n.models.length} model${n.models.length===1?``:`s`} loaded.`),Zf()}async function Wf(){let e=Kf();if(!e||e.kind!==`llm`)return;if(kf(),Vf(e.config.token)){Xd(Hf);return}dd.disabled=!0,Yd(`Testing ${e.config.model}…`),Zf();let t=await Ia({endpoint:e.config.endpoint,token:e.config.token,model:e.config.model,timeout:e.config.timeout});dd.disabled=!1,t.ok?Xd(t.detail??`Connection OK`,`success`):Xd(t.error||`Connection failed (${t.status||`no status`})`,`error`),Zf()}function Gf(e){return{system:`System`,llm:`LLM provider`,agent:`Agent`,mcp:`MCP`}[e]||`Node`}function Kf(){return $.selectedId?qf($.selectedId):null}function qf(e){return $.entities.find(t=>t.id===e)}function Jf(e){return e===`root`||e===`mcp`}function Yf(e){return $.entities.filter(t=>t.parentId===e)}function Xf(e){let t=[];for(let n of Yf(e))t.push(n.id,...Xf(n.id));return t}function Zf(){zd?sd.requestPaint():requestAnimationFrame(Qf)}function Qf(){let e=sd.width/$.dpr,t=sd.height/$.dpr;Q.reset(),Q.setTransform($.dpr,0,0,$.dpr,0,0),Q.clearRect(0,0,e,t),Q.save(),Q.translate($.cameraX,$.cameraY),Q.scale($.zoom,$.zoom),$f(e,t),ep(),Q.restore(),zd&&op(e,t)}function $f(e,t){Q.save(),Q.lineWidth=1/$.zoom;let n=_p({x:0,y:0}),r=_p({x:e,y:t}),i=Math.floor(n.x/Ou)*Ou,a=Math.ceil(r.x/Ou)*Ou,o=Math.floor(n.y/Ou)*Ou,s=Math.ceil(r.y/Ou)*Ou;for(let e=i;e<=a;e+=Ou)Q.strokeStyle=e%ku===0?`#d7dce5`:`#edf0f4`,Pp(e,o,e,s);for(let e=o;e<=s;e+=Ou)Q.strokeStyle=e%ku===0?`#d7dce5`:`#edf0f4`,Pp(i,e,a,e);Q.restore()}function ep(){tp();for(let e of $.entities)np(e)}function tp(){Q.save(),Q.strokeStyle=`#111827`,Q.lineWidth=2/$.zoom;for(let e of $.entities){let t=qf(e.parentId);if(!t)continue;let n=Math.atan2(e.y-t.y,e.x-t.x),r=yp(t,n),i=yp(e,n+Math.PI);Q.beginPath(),Q.moveTo(r.x,r.y),Q.lineTo(i.x,i.y),Q.stroke()}Q.restore()}function np(e){if(e.kind===`system`||e.kind===`llm`){rp(e);return}ip(e)}function rp(e){let t=e.id===$.selectedId,n=e.kind===`system`?Tu:Eu,r=Yf(e.id),i=Math.max(Du,r.length),a=jp(e.x,e.y,n,i);Q.save(),Q.beginPath(),a.forEach((e,t)=>{t===0?Q.moveTo(e.x,e.y):Q.lineTo(e.x,e.y)}),Q.closePath(),Q.fillStyle=t?`#111827`:`#ffffff`,Q.strokeStyle=`#0f172a`,Q.lineWidth=(t?3:2)/$.zoom,Q.shadowColor=`rgb(15 23 42 / 8%)`,Q.shadowBlur=e.kind===`system`?20:14,Q.shadowOffsetY=e.kind===`system`?8:5,Q.fill(),Q.shadowColor=`transparent`,Q.stroke(),Q.fillStyle=t?`#ffffff`:`#111827`,Q.textAlign=`center`,Q.textBaseline=`middle`,Q.font=e.kind===`system`?`800 21px Inter, system-ui, sans-serif`:`800 16px Inter, system-ui, sans-serif`,Np(e.label,e.x,e.y-8,n*1.32,e.kind===`system`?26:20),ap(e,t,n),Q.restore()}function ip(e){let t=e.id===$.selectedId,n=e.kind===`mcp`?116:Cu,r=e.kind===`mcp`?58:wu;Q.save(),Mp(e.x-n/2,e.y-r/2,n,r,20),Q.fillStyle=t?`#111827`:`#ffffff`,Q.strokeStyle=e.kind===`mcp`?`#276ef1`:`#0f172a`,Q.lineWidth=(t?3:2)/$.zoom,Q.fill(),Q.stroke(),Q.fillStyle=t?`#ffffff`:`#111827`,Q.font=`760 15px Inter, system-ui, sans-serif`,Q.textAlign=`center`,Q.textBaseline=`middle`,Np(e.label,e.x,e.y,n*.78,18),ap(e,t,Math.max(n,r)/2),Q.restore()}function ap(e,t,n){t&&(Q.beginPath(),Q.arc(e.x+n*.62,e.y-n*.66,5,0,Math.PI*2),Q.fillStyle=`#34d399`,Q.fill())}function op(e,t){if(!Kf())return;let n=wp(e),r=Math.min(Nu,t-118),i=e-n-24,a=Math.max(24,(t-r)/2);try{let e=Q.drawElementImage(Md,i,a,n,r);Md.style.transform=e.toString()}catch{cd.textContent=`Waiting for HTML snapshot`}}function sp(e,t){let n=sd.clientWidth,r=sd.clientHeight,i=Kf()?wp(n)+Pu:0,a=Math.max(360,n-i),o=pp(),s=mp(o,a,r),c=t?s:Math.min($.zoom,s),l=(o.minX+o.maxX)/2,u=(o.minY+o.maxY)/2,d=a*.5-l*c,f=r*.5-u*c;if(!e||!$.cameraX||!$.cameraY){hp(),$.cameraX=d,$.cameraY=f,$.zoom=c,$.panelShiftX=i;return}$.panelShiftX=i,fp(d,f,c)}function cp(e,t,n){if(t){if(e){let e=lp();$.panelShiftX+=Math.max(0,-e),dp(e,n)}else{let e=Kf();if(e){let t=wp(sd.clientWidth)+Pu,n=(sd.clientWidth-t)/2-e.x*$.zoom,r=n-$.cameraX;$.panelShiftX=-r,fp(n,$.cameraY,$.zoom)}}return}if(!e)return;let r=$.panelShiftX;$.panelShiftX=0,dp(r,n)}function lp(){let e=Kf();if(!e)return 0;let t=sd.clientWidth-wp(sd.clientWidth)-24-Wu,n=up(e);return n.right<=t?0:t-n.right}function up(e){let t=Dp(e);return{left:t.left*$.zoom+$.cameraX,top:t.top*$.zoom+$.cameraY,right:t.right*$.zoom+$.cameraX,bottom:t.bottom*$.zoom+$.cameraY}}function dp(e,t){if(hp(),!e)return;let n=$.cameraX+e;if(!t){$.cameraX=n;return}fp(n,$.cameraY,$.zoom)}function fp(e,t,n){hp();let r=$.cameraX,i=$.cameraY,a=$.zoom,o=performance.now();function s(c){let l=Math.min(1,(c-o)/Hu),u=1-(1-l)**3;$.cameraX=r+(e-r)*u,$.cameraY=i+(t-i)*u,$.zoom=a+(n-a)*u,ff(),Zf(),l<1?$.viewAnimationId=requestAnimationFrame(s):$.viewAnimationId=null}$.viewAnimationId=requestAnimationFrame(s)}function pp(){return $.entities.reduce((e,t)=>{let n=Cf(t);return{minX:Math.min(e.minX,t.x-n),minY:Math.min(e.minY,t.y-n),maxX:Math.max(e.maxX,t.x+n),maxY:Math.max(e.maxY,t.y+n)}},{minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0})}function mp(e,t,n){let r=e.maxX-e.minX,i=e.maxY-e.minY;if(!Number.isFinite(r)||!Number.isFinite(i)||r<=0||i<=0)return 1;let a=Math.max(1,t-Uu*2),o=Math.max(1,n-Uu*2);return vp(Math.min(1,a/r,o/i),Ku,1)}function hp(){$.viewAnimationId&&(cancelAnimationFrame($.viewAnimationId),$.viewAnimationId=null)}function gp(e,t){hp();let n=_p(e);$.zoom=vp($.zoom*t,Ku,qu),$.cameraX=e.x-n.x*$.zoom,$.cameraY=e.y-n.y*$.zoom,Zf()}function _p(e){return{x:(e.x-$.cameraX)/$.zoom,y:(e.y-$.cameraY)/$.zoom}}function vp(e,t,n){return Math.min(n,Math.max(t,e))}function yp(e,t){if(e.kind!==`system`&&e.kind!==`llm`)return Sp(e,t);let n=e.kind===`system`?Tu:Eu,r=Yf(e.id);return bp(e,n,Math.max(Du,r.length),t)||{x:e.x+Math.cos(t)*n,y:e.y+Math.sin(t)*n}}function bp(e,t,n,r){let i={x:Math.cos(r),y:Math.sin(r)},a=jp(e.x,e.y,t,n),o=null;for(let t=0;t<a.length;t+=1){let n=a[t],r=a[(t+1)%a.length],s={x:r.x-n.x,y:r.y-n.y},c={x:n.x-e.x,y:n.y-e.y},l=xp(i,s);if(Math.abs(l)<1e-4)continue;let u=xp(c,s)/l,d=xp(c,i)/l;if(u>=0&&d>=0&&d<=1){let t={x:e.x+i.x*u,y:e.y+i.y*u};(!o||u<o.rayDistance)&&(o={...t,rayDistance:u})}}return o?{x:o.x,y:o.y}:null}function xp(e,t){return e.x*t.y-e.y*t.x}function Sp(e,t){let n=Tp(e),r=n.width/2,i=n.height/2,a=Math.cos(t),o=Math.sin(t),s=Math.min(Math.abs(r/(a||2**-52)),Math.abs(i/(o||2**-52)));return{x:e.x+a*s,y:e.y+o*s}}function Cp(e,t){if(e.kind===`system`||e.kind===`llm`){let n=e.kind===`system`?Tu:Eu;return Math.hypot(t.x-e.x,t.y-e.y)<=n+Vu}let{width:n,height:r}=Tp(e);return Math.abs(t.x-e.x)<=n/2+Vu&&Math.abs(t.y-e.y)<=r/2+Vu}function wp(e){return Math.min(ju,Math.max(Au,Math.floor(e*Mu)))}function Tp(e){return e.kind===`mcp`?{width:116,height:58}:{width:Cu,height:wu}}function Ep(e){return[e,...Xf(e.id).map(qf)].filter(Boolean).map(Dp).reduce(Op)}function Dp(e){if(e.kind===`system`||e.kind===`llm`){let t=e.kind===`system`?Tu:Eu;return{left:e.x-t,top:e.y-t,right:e.x+t,bottom:e.y+t}}let{width:t,height:n}=Tp(e);return{left:e.x-t/2,top:e.y-n/2,right:e.x+t/2,bottom:e.y+n/2}}function Op(e,t){return{left:Math.min(e.left,t.left),top:Math.min(e.top,t.top),right:Math.max(e.right,t.right),bottom:Math.max(e.bottom,t.bottom)}}function kp(e,t,n){return!(e.right+n<t.left||e.left-n>t.right||e.bottom+n<t.top||e.top-n>t.bottom)}function Ap(e){let t=sd.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}function jp(e,t,n,r){return Array.from({length:r},(i,a)=>{let o=-Math.PI/2+a/r*Math.PI*2;return{x:e+Math.cos(o)*n,y:t+Math.sin(o)*n}})}function Mp(e,t,n,r,i){let a=e+n,o=t+r;Q.beginPath(),Q.moveTo(e+i,t),Q.lineTo(a-i,t),Q.quadraticCurveTo(a,t,a,t+i),Q.lineTo(a,o-i),Q.quadraticCurveTo(a,o,a-i,o),Q.lineTo(e+i,o),Q.quadraticCurveTo(e,o,e,o-i),Q.lineTo(e,t+i),Q.quadraticCurveTo(e,t,e+i,t),Q.closePath()}function Np(e,t,n,r,i){let a=e.split(/\s+/),o=[],s=``;for(let e of a){let t=s?`${s} ${e}`:e;Q.measureText(t).width>r&&s?(o.push(s),s=e):s=t}o.push(s);let c=n-(o.length-1)*i/2;o.forEach((e,n)=>{Q.fillText(e,t,c+n*i)})}function Pp(e,t,n,r){Q.beginPath(),Q.moveTo(e,t),Q.lineTo(n,r),Q.stroke()}var Fp=W(`<div class="status-row"><span id="apiStatus"></span></div>`),Ip=W('<div class="app-shell"><!> <section class="workspace-shell" aria-label="Configuration graph workspace"><nav class="rail" aria-label="Workspace tools"><button id="addButton" class="tool-button primary" type="button" title="Add node">+</button> <button id="fitButton" class="tool-button" type="button" title="Fit view">⌖</button></nav> <canvas id="workspaceCanvas" class="workspace-canvas" layoutsubtree=""><form id="configSurface" class="config-surface" autocomplete="off"><div class="panel-kicker"><span id="nodeTypeBadge">Provider</span> <button id="closePanelButton" class="icon-button close" type="button" title="Close panel">×</button></div> <div class="panel-title-row"><label class="eyebrow" for="nodeName">Node name</label> <input id="nodeName" name="nodeName" class="title-input" type="text"/></div> <div class="form-grid"><label class="field"><span>Kind</span> <select id="nodeKind" name="nodeKind"><option>System</option><option>LLM provider</option><option>Agent</option><option>MCP</option></select></label> <div id="llmFields" class="contents"><label class="field wide"><span>Endpoint</span> <input id="nodeEndpoint" name="nodeEndpoint" type="url" placeholder="http://localhost:11434"/></label> <label class="field wide"><span>API token</span> <input id="nodeToken" name="nodeToken" type="text" autocomplete="off" spellcheck="false" placeholder="env:OPENROUTER_API_KEY"/> <small class="field-note">Reference an environment variable only — <code>env:VAR_NAME</code> (or <code>{VAR_NAME}</code>). The secret is read from the server environment at request time; literal tokens are not stored (the workspace file is tracked by git).</small></label> <div class="field wide model-field-row"><span>Model</span> <div class="model-select-wrap"><select id="nodeModel" name="nodeModel"><option disabled="" selected="">— click ↻ to load models —</option></select> <button id="loadModelsButton" class="icon-button" type="button" title="Load models from endpoint">↻</button></div></div> <label class="field"><span>Timeout</span> <input id="nodeTimeout" name="nodeTimeout" type="number" min="1" max="600" step="1"/></label></div> <label class="field wide"><span>Description</span> <textarea id="nodeDescription" name="nodeDescription" rows="3"></textarea></label></div> <section id="agentSection" class="agent-section" hidden=""><label id="agentWorkspaceField" class="field wide"><span>Workspace folder</span> <input id="nodeWorkspaceFolder" name="nodeWorkspaceFolder" type="text" readonly=""/></label> <label class="field wide"><span>System prompt</span> <textarea id="nodeSystemPrompt" name="nodeSystemPrompt" rows="5" placeholder="You are a helpful assistant…"></textarea></label> <label class="field wide checkbox-field"><input id="nodeRequiresUserInput" name="nodeRequiresUserInput" type="checkbox"/> <span>Require a user input</span></label> <label id="agentUserInputDescriptionField" class="field wide" hidden=""><span>Describe User input</span> <textarea id="nodeUserInputDescription" name="nodeUserInputDescription" rows="3" placeholder="Describe exactly what the user must provide before running this agent."></textarea></label> <label class="field wide"><span>Required output marker</span> <input id="nodeExpectedOutputMarker" name="nodeExpectedOutputMarker" type="text" placeholder="Optional, e.g. ```mermaid"/></label></section> <section id="mcpInventory" class="mcp-inventory" hidden=""><div class="inventory-header"><span>MCP consultation surface</span> <strong>Streamable HTTP</strong></div> <div class="inventory-grid"><article><h2>Tools</h2> <ul><li>list_documents</li><li>read_document</li><li>create_document</li> <li>update_document</li><li>list_diagrams</li><li>read_diagram</li> <li>create_diagram</li><li>list_source_files</li><li>read_source_file</li> <li>search_source</li><li>add_metadata</li><li>refresh_metadata</li> <li>get_accuracy</li><li>review_adr_relevance</li><li>retrodocument_adrs_from_git</li></ul></article> <article><h2>Prompts</h2> <ul><li>audit-adrs-drift</li><li>review-adr-relevance</li> <li>retrodocument-adrs-from-git</li><li>erd</li> <li>feature-workflow</li><li>create-context-diagram</li> <li>create-container-diagram</li><li>document-source-decision</li></ul></article></div></section> <footer class="panel-actions"><div class="panel-actions-left"><button id="testNodeButton" class="secondary-button" type="button">Test</button></div> <div class="panel-actions-right"><button id="deleteNodeButton" class="danger-button" type="button">Delete</button></div></footer></form></canvas> <div id="fallbackPanelHost" class="fallback-panel-host" hidden=""></div></section> <div id="deleteConfirmOverlay" class="confirm-overlay" hidden=""><section class="confirm-dialog" role="dialog" aria-modal="true" aria-labelledby="deleteConfirmTitle"><div><p class="confirm-kicker">Destructive change</p> <h2 id="deleteConfirmTitle">Delete node?</h2> <p id="deleteConfirmMessage" class="confirm-message"></p></div> <footer class="confirm-actions"><button id="cancelDeleteButton" class="secondary-button" type="button">Cancel</button> <button id="confirmDeleteButton" class="danger-button" type="button">Delete</button></footer></section></div> <div id="renameConfirmOverlay" class="confirm-overlay" hidden=""><section class="confirm-dialog" role="dialog" aria-modal="true" aria-labelledby="renameConfirmTitle"><div><p class="confirm-kicker">Renommage de dossier</p> <h2 id="renameConfirmTitle">Renommer le dossier ?</h2> <p id="renameConfirmMessage" class="confirm-message"></p></div> <footer class="confirm-actions"><button id="cancelRenameButton" class="secondary-button" type="button">Annuler</button> <button id="confirmRenameButton" class="primary-button" type="button">Renommer</button></footer></section></div> <div id="agentRunOverlay" class="confirm-overlay" hidden=""><section class="agent-run-dialog" role="dialog" aria-modal="true" aria-labelledby="agentRunTitle"><div><p class="confirm-kicker">Agent test</p> <h2 id="agentRunTitle">Run agent</h2> <p id="agentRunHint" class="confirm-message"></p></div> <label id="agentRunInputField" class="field wide agent-run-input-field"><span>User input</span> <textarea id="agentRunInput" name="agentRunInput" rows="6" placeholder="Document ID, question, or any input for the agent…"></textarea></label> <div id="agentRunResult" class="agent-run-result" hidden=""></div> <footer class="confirm-actions"><button id="cancelAgentRunButton" class="secondary-button" type="button">Close</button> <button id="executeAgentRunButton" class="primary-button" type="button">Run</button></footer></section></div></div>');function Lp(e,t){Ge(t,!0),Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}return Bd()});var n=Ip(),r=R(n);Ja(r,{title:`Living AI Documentation`,subtitle:`Graph-native configuration workspace`,children:(e,t)=>{var n=Fp(),r=R(n);hi(r,1,`status-pill `),r.textContent=`Detecting canvas API`,N(n),G(e,n)},$$slots:{default:!0}});var i=B(r,2),a=B(R(i),2),o=R(a),s=B(R(o),4),c=R(s),l=B(R(c),2),u=R(l);u.value=u.__value=`system`;var d=B(u);d.value=d.__value=`llm`;var f=B(d);f.value=f.__value=`agent`;var p=B(f);p.value=p.__value=`mcp`,N(l),N(c);var m=B(c,2),h=B(R(m),4),g=B(R(h),2),_=R(g),v=R(_);v.value=v.__value=``,N(_),Pe(2),N(g),N(h),Pe(2),N(m),Pe(2),N(s),Pe(6),N(o),N(a),Pe(2),N(i),Pe(6),N(n),G(e,n),Ke()}var Rp=W(`<p class="files-msg svelte-4q2lov"> </p>`),zp=W(`<p class="files-msg files-msg--error svelte-4q2lov"> </p>`),Bp=W(`<p class="files-msg files-msg--empty svelte-4q2lov"> </p>`),Vp=W(`<option> </option>`),Hp=W(`<div class="files-toolbar svelte-4q2lov"><label for="files-folder-filter" class="svelte-4q2lov"> </label> <select id="files-folder-filter" data-testid="files-folder-filter" class="svelte-4q2lov"><option> </option><!></select></div>`),Up=W(`<span class="files-folder svelte-4q2lov"> </span> ·`,1),Wp=W(`<p class="files-row-error svelte-4q2lov"> </p>`),Gp=W(`<li class="files-row svelte-4q2lov"><span class="files-icon svelte-4q2lov">📎</span> <div class="files-info svelte-4q2lov"><a target="_blank" rel="noopener" class="files-name svelte-4q2lov"> </a> <div class="files-meta svelte-4q2lov"><!><!> </div> <!></div> <div class="files-actions svelte-4q2lov"><button type="button" class="files-btn svelte-4q2lov"> </button> <button type="button" class="files-btn files-btn--danger svelte-4q2lov"> </button></div></li>`),Kp=W(`<ul class="files-list svelte-4q2lov"></ul>`),qp=W(`<!> <!>`,1),Jp=W(`<!> <div class="app-shell"><!> <div class="files-page svelte-4q2lov"><!></div></div>`,1);function Yp(e,t){Ge(t,!0);let n=F(null),r=F(L([])),i=F(L([])),a=F(``),o=F(!0),s=F(``),c=F(L({})),l=F(L({})),u=F(L({})),d=P(()=>H(a)?H(r).filter(e=>e.folder===H(a)||e.folder.startsWith(H(a)+`/`)):H(r));function f(e){return e<1024?X(`files.size_bytes`).replace(`{n}`,String(e)):e<1024*1024?X(`files.size_kb`).replace(`{n}`,(e/1024).toFixed(1)):X(`files.size_mb`).replace(`{n}`,(e/1024/1024).toFixed(2))}function p(e){if(!e)return``;let t=new Date(e);if(isNaN(t.getTime()))return``;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}async function m(){I(o,!0),I(s,``);try{let e=await fetch(`/api/files`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();I(r,Array.isArray(t.files)?t.files:[],!0),I(i,Array.isArray(t.folders)?t.folders:[],!0),H(a)&&!H(i).includes(H(a))&&I(a,``)}catch(e){I(s,X(`files.error_load`)+(e instanceof Error?e.message:String(e)))}finally{I(o,!1)}}function h(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function g(e){let t=document.createElement(`input`);t.type=`file`,t.style.display=`none`,document.body.appendChild(t),t.addEventListener(`change`,async()=>{let r=t.files?.[0];if(t.remove(),r&&await H(n).show({kicker:X(`files.confirm_replace_title`),title:X(`files.confirm_replace_message`).replace(`{name}`,e.displayName||e.filename).replace(`{newName}`,r.name),message:X(`files.confirm_replace_detail`),confirmLabel:X(`files.replace`),cancelLabel:X(`common.cancel`),danger:!0})){if(r.size>19922944){I(c,{...H(c),[e.filename]:X(`files.error_replace`)+`${(r.size/1024/1024).toFixed(1)} MB (max 19 MB)`},!0);return}I(l,{...H(l),[e.filename]:!0},!0),I(c,{...H(c),[e.filename]:``},!0);try{let t=await h(r),n=await fetch(`/api/files/${encodeURIComponent(e.filename)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:t})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}await m()}catch(t){I(c,{...H(c),[e.filename]:X(`files.error_replace`)+(t instanceof Error?t.message:String(t))},!0)}finally{I(l,{...H(l),[e.filename]:!1},!0)}}}),t.click()}async function _(e){if(await H(n).show({kicker:X(`files.confirm_delete_title`),title:X(`files.confirm_delete_message`).replace(`{name}`,e.displayName||e.filename),message:X(`files.confirm_delete_detail`),confirmLabel:X(`files.delete`),cancelLabel:X(`common.cancel`),danger:!0})){I(u,{...H(u),[e.filename]:!0},!0),I(c,{...H(c),[e.filename]:``},!0);try{let t=await fetch(`/api/files/${encodeURIComponent(e.filename)}`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||`HTTP ${t.status}`)}await m()}catch(t){I(c,{...H(c),[e.filename]:X(`files.error_delete`)+(t instanceof Error?t.message:String(t))},!0)}finally{I(u,{...H(u),[e.filename]:!1},!0)}}}Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}await m()});var v=Jp(),y=z(v);Li(wl(y,{}),e=>I(n,e,!0),()=>H(n));var b=B(y,2),x=R(b);{let e=P(()=>X(`files.title`));Ja(x,{get title(){return H(e)},subtitle:``})}var S=B(x,2),C=R(S),w=e=>{var t=Rp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},T=e=>{var t=zp(),n=R(t,!0);N(t),V(()=>K(n,H(s))),G(e,t)},E=e=>{var t=Bp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`files.empty`)]),G(e,t)},D=e=>{var t=qp(),n=z(t),r=e=>{var t=Hp(),n=R(t),r=R(n,!0);N(n);var o=B(n,2),s=R(o),c=R(s,!0);N(s),s.value=s.__value=``,J(B(s),16,()=>H(i),e=>e,(e,t)=>{var n=Vp(),r=R(n,!0);N(n);var i={};V(()=>{K(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),G(e,n)}),N(o);var l;yi(o),N(t),V((e,t)=>{K(r,e),K(c,t),l!==(l=H(a))&&(o.value=(o.__value=H(a))??``,vi(o,H(a)))},[()=>X(`files.filter_label`),()=>X(`files.filter_all`)]),U(`change`,o,e=>I(a,e.target.value,!0)),G(e,t)};q(n,e=>{H(i).length>0&&e(r)});var o=B(n,2),s=e=>{var t=Bp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`files.empty_filter`)]),G(e,t)},m=e=>{var t=Kp();J(t,21,()=>H(d),Yr,(e,t)=>{var n=Gp(),r=B(R(n),2),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o),d=e=>{var n=Up(),r=z(n),i=R(r,!0);N(r),Pe(),V(()=>K(i,H(t).folder)),G(e,n)};q(s,e=>{H(t).folder&&e(d)});var m=B(s),h=e=>{var n=Hr();V(e=>K(n,`${e??``} ·`),[()=>p(H(t).uploadedAt)]),G(e,n)};q(m,e=>{H(t).uploadedAt&&e(h)});var v=B(m,1,!0);N(o);var y=B(o,2),b=e=>{var n=Wp(),r=R(n,!0);N(n),V(()=>K(r,H(c)[H(t).filename])),G(e,n)};q(y,e=>{H(c)[H(t).filename]&&e(b)}),N(r);var x=B(r,2),S=R(x),C=R(S,!0);N(S);var w=B(S,2),T=R(w,!0);N(w),N(x),N(n),V((e,n,r)=>{Y(i,`href`,H(t).url),K(a,H(t).displayName||H(t).filename),K(v,e),S.disabled=H(l)[H(t).filename]||H(u)[H(t).filename],K(C,n),w.disabled=H(l)[H(t).filename]||H(u)[H(t).filename],K(T,r)},[()=>f(H(t).size||0),()=>H(l)[H(t).filename]?X(`files.replacing`):X(`files.replace`),()=>H(u)[H(t).filename]?X(`files.deleting`):X(`files.delete`)]),U(`click`,S,()=>g(H(t))),U(`click`,w,()=>_(H(t))),G(e,n)}),N(t),G(e,t)};q(o,e=>{H(d).length===0?e(s):e(m,-1)}),G(e,t)};q(C,e=>{H(o)?e(w):H(s)?e(T,1):H(r).length===0?e(E,2):e(D,-1)}),N(S),N(b),G(e,v),Ke()}Nr([`change`,`click`]);var Xp=W(`<p class="browser-msg"> </p>`),Zp=W(`<p class="browser-msg browser-msg--error"> </p>`),Qp=W(`<button class="browser-row browser-row--dir"><span class="browser-row-name"> </span></button>`),$p=W(`<span class="badge-added"> </span>`),em=W(`<button class="link-btn"> </button>`),tm=W(`<div class="browser-row browser-row--file"><span class="browser-row-name"> </span> <!></div>`),nm=W(`<!> <!>`,1),rm=W(`<div class="file-browser"><div class="file-browser-toolbar"><button class="link-btn"> </button> <span class="file-browser-path"> </span></div> <div class="file-browser-list" data-testid="instruction-browse-list"><!></div></div>`),im=W(`<p class="empty-msg svelte-e5jhdq"> </p>`),am=W(`<button class="remove-btn"> </button>`),om=W(`<div class="instruction-row svelte-e5jhdq"><div class="instruction-info svelte-e5jhdq"><a class="instruction-path svelte-e5jhdq"> </a> <div class="instruction-meta svelte-e5jhdq"> <!></div></div> <div class="instruction-actions svelte-e5jhdq"><span> </span> <!></div></div>`),sm=W(`<div class="section-card svelte-e5jhdq"><div class="section-header svelte-e5jhdq"><span class="section-title svelte-e5jhdq"> </span> <div class="header-actions svelte-e5jhdq"><span class="count-label svelte-e5jhdq"> </span> <button class="secondary-button btn-sm"> </button></div></div> <!> <div class="instruction-list svelte-e5jhdq" data-testid="instruction-list"><!></div></div>`);function cm(e,t){Ge(t,!0);let n=Bi(t,`items`,27,()=>L([])),r=F(!1),i=F(``),a=F(``),o=F(L([])),s=F(L([])),c=F(!1),l=F(!1),u=P(()=>new Set(n().map(e=>d(e.path))));function d(e){return String(e||``).split(/[/\\]/).pop()||``}function f(e){let t=encodeURIComponent(String(e||``).replace(/\.md$/i,``));return`/?doc=`+encodeURIComponent(t)}function p(e){return X(`context.root.${e}`)}function m(e){return X(`context.type.${e}`)}async function h(e){I(c,!0),I(l,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(i,t.current,!0),I(a,t.parent||``,!0),I(o,t.dirs||[],!0),I(s,t.files||[],!0)}catch{I(l,!0)}finally{I(c,!1)}}async function g(){I(r,!H(r)),H(r)&&!H(i)&&await h((await fetch(`/api/context/orientation`).then(e=>e.json()).catch(()=>({}))).sourceRoot||``)}async function _(e){await t.onAdd(e),H(r)&&H(i)&&await h(H(i))}var v=sm(),y=R(v),b=R(y),x=R(b,!0);N(b);var S=B(b,2),C=R(S),w=R(C);N(C);var T=B(C,2),E=R(T,!0);N(T),N(S),N(y);var D=B(y,2),ee=e=>{var t=rm(),n=R(t),r=R(n),d=R(r,!0);N(r);var f=B(r,2),p=R(f,!0);N(f),N(n);var m=B(n,2),g=R(m),v=e=>{var t=Xp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},y=e=>{var t=Zp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.cannot_read_dir`)]),G(e,t)},b=e=>{var t=Xp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.empty_dir`)]),G(e,t)},x=e=>{var t=nm(),n=z(t);J(n,17,()=>H(o),Yr,(e,t)=>{var n=Qp(),r=R(n),i=R(r);N(r),N(n),V(()=>K(i,`📁 ${H(t).name??``}`)),U(`click`,n,()=>h(H(t).path)),G(e,n)}),J(B(n,2),17,()=>H(s),Yr,(e,t)=>{var n=tm(),r=R(n),i=R(r);N(r);var a=B(r,2),o=e=>{var t=$p(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`context.added`)]),G(e,t)},s=P(()=>H(u).has(H(t).name)),c=e=>{var n=em(),r=R(n,!0);N(n),V(e=>K(r,e),[()=>X(`context.add_file_action`)]),U(`click`,n,()=>_(H(t).path)),G(e,n)};q(a,e=>{H(s)?e(o):e(c,-1)}),N(n),V(()=>K(i,`📄 ${H(t).name??``}`)),G(e,n)}),G(e,t)};q(g,e=>{H(c)?e(v):H(l)?e(y,1):!H(o).length&&!H(s).length?e(b,2):e(x,-1)}),N(m),N(t),V(e=>{r.disabled=!H(a),K(d,e),K(p,H(i))},[()=>X(`common.up`)]),U(`click`,r,()=>H(a)&&h(H(a))),G(e,t)};q(D,e=>{H(r)&&e(ee)});var O=B(D,2),k=R(O),A=e=>{var t=im(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`context.no_instructions`)]),G(e,t)},te=e=>{var r=Ur();J(z(r),17,n,Yr,(e,n)=>{var r=om(),i=R(r),a=R(i),o=R(a,!0);N(a);var s=B(a,2),c=R(s),l=B(c),u=e=>{var t=Hr();V(e=>K(t,`· ${e??``} KB`),[()=>Math.round(H(n).size/1024)]),G(e,t)};q(l,e=>{H(n).size!==null&&e(u)}),N(s),N(i);var h=B(i,2),g=R(h),_=R(g,!0);N(g);var v=B(g,2),y=e=>{var r=am(),i=R(r,!0);N(r),V(e=>K(i,e),[()=>X(`common.remove`)]),U(`click`,r,()=>t.onRemove(d(H(n).path))),G(e,r)};q(v,e=>{H(n).exists&&e(y)}),N(h),N(r),V((e,t,r,i)=>{Y(a,`href`,e),K(o,H(n).path),K(c,`${t??``} · ${r??``} `),hi(g,1,li(H(n).exists?`status-ok`:`status-missing`),`svelte-e5jhdq`),K(_,i)},[()=>f(H(n).path),()=>p(H(n).root),()=>m(H(n).type),()=>H(n).exists?X(`context.exists`):X(`context.missing`)]),G(e,r)}),G(e,r)};q(k,e=>{n().length?e(te,-1):e(A)}),N(O),N(v),V((e,t,r)=>{K(x,e),K(w,`${t??``}/${n().length??``}`),K(E,r)},[()=>X(`context.instructions_title`),()=>n().filter(e=>e.exists).length,()=>H(r)?X(`context.hide_instruction_browser`):X(`context.add_instruction_file`)]),U(`click`,T,g),G(e,v),Ke()}Nr([`click`]);var lm=W(`<span class="rules-folder svelte-1r3tey2"> </span>`),um=W(`<p class="empty-msg svelte-1r3tey2"> </p>`),dm=W(`<span class="tag svelte-1r3tey2"> </span>`),fm=W(`<div class="rule-tags svelte-1r3tey2"></div>`),pm=W(`<div class="rule-applies svelte-1r3tey2"> </div>`),mm=W(`<article class="rule-row svelte-1r3tey2"><div class="rule-top svelte-1r3tey2"><div class="rule-title-wrap svelte-1r3tey2"><h3 class="rule-title svelte-1r3tey2"><a class="rule-link svelte-1r3tey2"> </a></h3> <a class="rule-path svelte-1r3tey2"> </a></div> <span class="severity-badge svelte-1r3tey2"> </span></div> <p class="rule-desc svelte-1r3tey2"> </p> <!> <!></article>`),hm=W(`<div class="rules-layout svelte-1r3tey2"><div class="section-card svelte-1r3tey2"><div class="section-header svelte-1r3tey2"><span class="section-title svelte-1r3tey2" data-testid="rules-title"> </span> <!></div> <div class="rule-list svelte-1r3tey2" data-testid="rule-list"><!></div></div> <div class="section-card aside-card svelte-1r3tey2"><span class="section-title svelte-1r3tey2" data-testid="add-rule-title"> </span> <div class="field-group"><label class="field-label" for="ruleTitle"> </label> <input id="ruleTitle" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleSeverity"> </label> <select id="ruleSeverity" class="field-input"><option> </option><option> </option><option> </option></select></div> <div class="field-group"><label class="field-label" for="ruleDescription"> </label> <input id="ruleDescription" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleTags"> </label> <input id="ruleTags" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleAppliesTo"> </label> <input id="ruleAppliesTo" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleBody"> </label> <textarea id="ruleBody" rows="7" class="field-input"></textarea></div> <button class="btn-primary" style="width:100%"> </button></div></div>`);function gm(e,t){Ge(t,!0);let n=Bi(t,`rules`,19,()=>[]),r=Bi(t,`rulesFolder`,3,``),i=F(``),a=F(`guideline`),o=F(``),s=F(``),c=F(``),l=F(``),u=F(!1);function d(e){let t=encodeURIComponent(String(e||``).replace(/\.md$/i,``));return`/?doc=`+encodeURIComponent(t)}function f(e){let t=`context.rule_severity_${e}`,n=X(t);return n===t?e:n}function p(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}async function m(){if(H(i).trim()){I(u,!0);try{await t.onAdd({title:H(i).trim(),severity:H(a),description:H(o).trim(),tags:p(H(s)),appliesTo:p(H(c)),body:H(l).trim()}),I(i,``),I(o,``),I(s,``),I(c,``),I(l,``)}finally{I(u,!1)}}}var h=hm(),g=R(h),_=R(g),v=R(_),y=R(v,!0);N(v);var b=B(v,2),x=e=>{var t=lm(),n=R(t,!0);N(t),V(()=>K(n,r())),G(e,t)};q(b,e=>{r()&&e(x)}),N(_);var S=B(_,2),C=R(S),w=e=>{var t=um(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`context.no_rules`)]),G(e,t)},T=e=>{var t=Ur();J(z(t),17,n,Yr,(e,t)=>{var n=mm(),r=R(n),i=R(r),a=R(i),o=R(a),s=R(o,!0);N(o),N(a);var c=B(a,2),l=R(c,!0);N(c),N(i);var u=B(i,2),p=R(u,!0);N(u),N(r);var m=B(r,2),h=R(m,!0);N(m);var g=B(m,2),_=e=>{var n=fm();J(n,21,()=>H(t).tags,Yr,(e,t)=>{var n=dm(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(n),G(e,n)};q(g,e=>{H(t).tags?.length&&e(_)});var v=B(g,2),y=e=>{var n=pm(),r=R(n,!0);N(n),V(e=>K(r,e),[()=>H(t).appliesTo.join(`, `)]),G(e,n)};q(v,e=>{H(t).appliesTo?.length&&e(y)}),N(n),V((e,n,r)=>{Y(o,`href`,e),K(s,H(t).title),Y(c,`href`,n),K(l,H(t).path),K(p,r),K(h,H(t).description)},[()=>d(H(t).path),()=>d(H(t).path),()=>f(H(t).severity)]),G(e,n)}),G(e,t)};q(C,e=>{n().length?e(T,-1):e(w)}),N(S),N(g);var E=B(g,2),D=R(E),ee=R(D,!0);N(D);var O=B(D,2),k=R(O),A=R(k,!0);N(k);var te=B(k,2);Ei(te),N(O);var ne=B(O,2),re=R(ne),ie=R(re,!0);N(re);var ae=B(re,2),oe=R(ae),se=R(oe,!0);N(oe),oe.value=oe.__value=`guideline`;var ce=B(oe),le=R(ce,!0);N(ce),ce.value=ce.__value=`warning`;var ue=B(ce),de=R(ue,!0);N(ue),ue.value=ue.__value=`required`,N(ae),N(ne);var fe=B(ne,2),pe=R(fe),me=R(pe,!0);N(pe);var he=B(pe,2);Ei(he),N(fe);var ge=B(fe,2),_e=R(ge),ve=R(_e,!0);N(_e);var ye=B(_e,2);Ei(ye),N(ge);var be=B(ge,2),xe=R(be),Se=R(xe,!0);N(xe);var j=B(xe,2);Ei(j),N(be);var Ce=B(be,2),M=R(Ce),we=R(M,!0);N(M);var Te=B(M,2);vn(Te),N(Ce);var Ee=B(Ce,2),De=R(Ee,!0);N(Ee),N(E),N(h),V((e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_)=>{K(y,e),K(ee,t),K(A,n),Y(te,`placeholder`,r),K(ie,i),K(se,a),K(le,o),K(de,s),K(me,c),Y(he,`placeholder`,l),K(ve,u),Y(ye,`placeholder`,d),K(Se,f),Y(j,`placeholder`,p),K(we,m),Y(Te,`placeholder`,h),Ee.disabled=g,K(De,_)},[()=>X(`context.rules_title`),()=>X(`context.add_rule_title`),()=>X(`context.rule_title_label`),()=>X(`context.rule_title_placeholder`),()=>X(`context.rule_severity_label`),()=>X(`context.rule_severity_guideline`),()=>X(`context.rule_severity_warning`),()=>X(`context.rule_severity_required`),()=>X(`context.rule_description_label`),()=>X(`context.rule_description_placeholder`),()=>X(`context.rule_tags_label`),()=>X(`context.rule_tags_placeholder`),()=>X(`context.rule_applies_to_label`),()=>X(`context.rule_applies_to_placeholder`),()=>X(`context.rule_body_label`),()=>X(`context.rule_body_placeholder`),()=>H(u)||!H(i).trim(),()=>X(`context.add_rule_button`)]),Mi(te,()=>H(i),e=>I(i,e)),bi(ae,()=>H(a),e=>I(a,e)),Mi(he,()=>H(o),e=>I(o,e)),Mi(ye,()=>H(s),e=>I(s,e)),Mi(j,()=>H(c),e=>I(c,e)),Mi(Te,()=>H(l),e=>I(l,e)),U(`click`,Ee,m),G(e,h),Ke()}Nr([`click`]);var _m=W(`<p class="empty-msg svelte-1ui2b6s"> </p>`),vm=W(`<p class="mcp-desc svelte-1ui2b6s"> </p>`),ym=W(`<div class="mcp-schema-wrap svelte-1ui2b6s"><h4 class="mcp-schema-title svelte-1ui2b6s"> </h4> <pre class="mcp-schema-pre svelte-1ui2b6s"> </pre></div>`),bm=W(`<div class="mcp-result svelte-1ui2b6s" data-testid="mcp-result"></div>`),xm=W(`<details class="mcp-detail svelte-1ui2b6s"><summary class="mcp-summary svelte-1ui2b6s"> </summary> <!> <!> <div class="mcp-run-area svelte-1ui2b6s"><label class="mcp-run-label svelte-1ui2b6s"> </label> <textarea rows="4" spellcheck="false" class="field-input mcp-textarea svelte-1ui2b6s" data-testid="mcp-args"></textarea> <div class="mcp-run-footer svelte-1ui2b6s"><span class="mcp-error-text svelte-1ui2b6s" data-testid="mcp-error"> </span> <button class="btn-primary btn-sm"> </button></div> <!></div></details>`),Sm=W(`<p class="mcp-arg-desc svelte-1ui2b6s"> </p>`),Cm=W(`<li class="mcp-arg-item svelte-1ui2b6s"><div class="mcp-arg-name-row svelte-1ui2b6s"><span class="mcp-arg-name svelte-1ui2b6s"> </span> <span class="mcp-arg-req svelte-1ui2b6s"> </span></div> <!></li>`),wm=W(`<div class="mcp-schema-wrap svelte-1ui2b6s"><h4 class="mcp-schema-title svelte-1ui2b6s"> </h4> <ul class="mcp-args-list svelte-1ui2b6s"></ul></div>`),Tm=W(`<div class="section-card svelte-1ui2b6s"><div class="section-header svelte-1ui2b6s"><span class="section-title svelte-1ui2b6s" data-testid="mcp-title"> </span> <button class="secondary-button btn-sm"> </button></div> <p class="section-desc svelte-1ui2b6s"> </p> <div class="mcp-info-grid svelte-1ui2b6s"><div class="mcp-info-cell svelte-1ui2b6s"><div class="mcp-info-label svelte-1ui2b6s"> </div> <div> </div></div> <div class="mcp-info-cell svelte-1ui2b6s"><div class="mcp-info-label svelte-1ui2b6s"> </div> <div class="mcp-info-value mono svelte-1ui2b6s"> </div></div> <div class="mcp-info-cell wide svelte-1ui2b6s"><div class="mcp-info-label svelte-1ui2b6s"> </div> <div class="mcp-info-value mono break svelte-1ui2b6s" data-testid="mcp-endpoint"> </div></div></div> <div><div class="subsection-header svelte-1ui2b6s"><span class="subsection-title svelte-1ui2b6s"> </span> <div class="subsection-actions svelte-1ui2b6s"><span class="count-label svelte-1ui2b6s"> </span> <button class="secondary-button btn-sm"> </button></div></div> <div class="mcp-items svelte-1ui2b6s" data-testid="mcp-tool-list"><!></div></div> <div><div class="subsection-header svelte-1ui2b6s"><span class="subsection-title svelte-1ui2b6s"> </span> <div class="subsection-actions svelte-1ui2b6s"><span class="count-label svelte-1ui2b6s"> </span> <button class="secondary-button btn-sm"> </button></div></div> <div class="mcp-items svelte-1ui2b6s" data-testid="mcp-prompt-list"><!></div></div></div>`);function Em(e,t){Ge(t,!0);let n=F(`-`),r=F(!1),i=F(`-`),a=F(`-`),o=F(L([])),s=F(L([])),c=F(!1),l=F(L(new Map)),u=F(L(new Map));function d(e,t){let n=H(e===`tool`?l:u);return n.has(t)||n.set(t,{argsJson:`{}`,running:!1,error:``,resultHtml:``}),n.get(t)}function f(e,t,n){let r=H(e===`tool`?l:u).get(t)??{argsJson:`{}`,running:!1,error:``,resultHtml:``};e===`tool`?I(l,new Map(H(l)).set(t,{...r,...n}),!0):I(u,new Map(H(u)).set(t,{...r,...n}),!0)}function p(e){if(!e||typeof e!=`object`)return null;if(e.type===`string`)return``;if(e.type===`number`||e.type===`integer`)return 0;if(e.type===`boolean`)return!1;if(e.type===`array`)return[];if(e.type===`object`||e.properties){let t={},n=e.properties||{};return(Array.isArray(e.required)?e.required:[]).forEach(e=>{t[e]=p(n[e])??``}),t}return null}function m(e){let t=p(e.inputSchema)??{},n=JSON.stringify(t,null,2);I(l,new Map(H(l)).set(e.name,{argsJson:n,running:!1,error:``,resultHtml:``}),!0)}function h(e){let t={};(e.arguments||[]).forEach(e=>{e.required&&(t[e.name]=``)});let n=JSON.stringify(t,null,2);I(u,new Map(H(u)).set(e.name,{argsJson:n,running:!1,error:``,resultHtml:``}),!0)}function g(e){let t=e.match(/^data:\s*(\{.*\})\s*$/m);if(!t)throw Error(e.slice(0,300)||`No MCP response body`);return JSON.parse(t[1])}async function _(e,t,n){let r=await fetch(`/mcp`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json, text/event-stream`},body:JSON.stringify({jsonrpc:`2.0`,id:e,method:t,params:n})}),i=await r.text();if(!r.ok)throw Error(i||`HTTP ${r.status}`);return g(i)}async function v(){await _(1,`initialize`,{protocolVersion:`2025-03-26`,capabilities:{},clientInfo:{name:`living-ai-documentation-context`,version:`1.0.0`}})}function y(e){return"```json\n"+JSON.stringify(e,null,2).replaceAll("```","`\\`\\`")+"\n```"}function b(e){if(typeof e!=`string`)return y(e);try{return y(JSON.parse(e))}catch{return e}}function x(e){if(typeof e==`string`)return e;if(!e||typeof e!=`object`)return String(e??``);if(e.error)return y(e.error);let t=e.result;return!t||typeof t!=`object`?y(e):Array.isArray(t.messages)?t.messages.map(e=>`${e.role?`[${e.role}]`:``}\n${b(e.content?.text??e.content??e)}`.trim()).join(`
|
|
85
|
+
`,t);return n>=0?n:0}c=c.nextElementSibling}return e.length}function Zl(e,t,n){if(!e||typeof t!=`string`)return()=>{};let r=Bl(t);Hl(e,r);let i=i=>{let a=i.target?.closest(`[data-inline-snippet-index]`);if(a&&e.contains(a)){let e=r[Number(a.dataset.inlineSnippetIndex)];if(!e)return;i.preventDefault();let t=Al(e.type),o=Ml(e.type);Wl(i,[{iconClass:t.iconClass,labelKey:t.labelKey,dataAction:`edit`,dataType:e.type,onActivate:()=>n.onEdit(e)},{iconClass:o.iconClass,labelKey:o.labelKey,dataAction:`delete`,dataType:e.type,onActivate:()=>n.onDelete(e)}]);return}if(!e.contains(i.target))return;let o=Xl(t,e,i.target,r,i.clientY);o!==null&&(i.preventDefault(),Wl(i,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(o)}))};e.addEventListener(`contextmenu`,i);let a=t=>{let i=t.target?.closest(`[data-inline-snippet-index]`);if(!i||!e.contains(i))return;let a=r[Number(i.dataset.inlineSnippetIndex)];!a||a.type!==`table`||(t.preventDefault(),t.stopPropagation(),Ul(),n.onEdit({...a,tableFocusCell:Kl(t.target,i)||void 0}))};e.addEventListener(`dblclick`,a);let o=e.closest(`#home-content-area`)||e.closest(`main`),s=null;o&&(s=r=>{r.defaultPrevented||e.offsetParent!==null&&(r.target?.closest(`textarea, input, [data-inline-snippet-index]`)||e.contains(r.target)||(r.preventDefault(),Wl(r,{iconClass:`fa-solid fa-plus`,labelKey:`snippet.inline_insert_btn`,dataAction:`insert`,onActivate:()=>n.onInsert(t.length)})))},o.addEventListener(`contextmenu`,s));let c=e=>{Pl&&!Pl.contains(e.target)&&Ul()},l=e=>{e.key===`Escape`&&Ul()};return document.addEventListener(`click`,c),document.addEventListener(`keydown`,l),()=>{e.removeEventListener(`contextmenu`,i),e.removeEventListener(`dblclick`,a),o&&s&&o.removeEventListener(`contextmenu`,s),document.removeEventListener(`click`,c),document.removeEventListener(`keydown`,l),Ul(),e.querySelectorAll(`[data-inline-snippet-index]`).forEach(e=>{e.removeAttribute(`data-inline-snippet-index`),e.classList.remove(`ld-inline-snippet-target`)})}}var Ql=W(`<textarea id="doc-editor" data-testid="doc-editor" spellcheck="false" class="w-full min-h-[70vh] px-4 py-3 text-sm font-mono leading-relaxed rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500 resize-y"></textarea>`),$l=W(`<div id="doc-content" data-testid="doc-content"></div>`),eu=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-5"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"> </h3> <div class="space-y-1.5"><label for="img-paste-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> <span class="font-normal text-gray-400"> </span></label> <div class="flex items-center gap-2"><input id="img-paste-name" type="text" class="flex-1 px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="text-xs text-gray-400 shrink-0"> </span></div></div> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`),tu=W(`<div data-testid="content-lightbox" class="fixed inset-0 z-50 bg-white flex items-center justify-center cursor-pointer p-4"><img data-testid="lightbox-image" class="max-w-full max-h-full object-contain select-none"/> <button class="absolute top-4 right-4 text-gray-500 hover:text-gray-950 text-2xl leading-none">×</button></div>`),nu=W(`<!> <!> <!> <!>`,1);function ru(e,t){Ge(t,!0);let n=Bi(t,`onopen`,3,()=>{}),r=Bi(t,`onanchor`,3,D),i=Bi(t,`onconfirmdelete`,3,void 0),a=Bi(t,`oncontentwired`,3,void 0),o=Bi(t,`rewireSignal`,3,void 0),s=Bi(t,`editing`,15,!1),c=Bi(t,`saveMsg`,15,null),l=F(null),u=F(null),d=F(``),f=null,p=F(!1),m=F(`insert`),h=F(null),g=F(0),_=F(!1),v=F(``),y=F(`png`),b=null,x=0,S=0,C=F(null),w=F(``),T=/[̀-ͯ]/g;function E(e){return(e||``).normalize(`NFD`).replace(T,``).toLowerCase().replace(/[^a-z0-9]/g,`_`)}function D(e){document.getElementById(e)?.scrollIntoView({behavior:`smooth`,block:`start`})}Vi(()=>{let e=window;return e.openSnippetsModal=()=>{I(m,`insert`),I(p,!0)},e.openSnippetsModalForInlineInsert=e=>{I(m,`inline-insert`),I(g,Math.max(0,Number(e)||0),!0),I(p,!0)},()=>{delete e.openSnippetsModal,delete e.openSnippetsModalForInlineInsert}}),On(()=>{if(o(),t.html,t.content,f?.(),f=null,!(s()||!H(l)))return Fs(H(l),t.html,{content:t.content,codeBlockMaxHeight:Z.codeBlockMaxHeight,t:X,onDocLink:(e,t)=>n()(e,t),onAnchor:r()}),f=Zl(H(l),t.content,{onEdit:e=>{I(m,`inline-edit`),I(h,e,!0),I(p,!0)},onInsert:e=>{I(m,`inline-insert`),I(g,e,!0),I(p,!0)},onDelete:async e=>{(i()?await i()():confirm(X(`snippet.inline_delete_message`)))&&await t.onsave(t.content.slice(0,e.start)+t.content.slice(e.end))}}),a()?.(H(l)),()=>{f?.(),f=null}});function ee(){I(d,t.content,!0),s(!0),c(null),requestAnimationFrame(()=>H(u)?.focus())}function O(){s(!1),c(null)}async function k(){c({text:X(`doc.saving`),cls:`text-gray-400`});try{await t.onsave(H(d)),s(!1),c(null)}catch(e){c({text:X(`error.save`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`})}}function A(){I(m,`insert`),I(p,!0)}function te(){return s()}function ne(e){let t=Array.from(e.clipboardData?.items??[]).find(e=>e.type.startsWith(`image/`));if(t){e.preventDefault(),x=H(u).selectionStart,S=H(u).selectionEnd,I(y,t.type.split(`/`)[1].replace(`jpeg`,`jpg`)||`png`,!0);let n=t.getAsFile();if(!n)return;b=n,I(v,E(Date.now().toString()),!0),I(_,!0);return}let n=Array.from(e.clipboardData?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(n.length){e.preventDefault();let t=H(u).selectionStart,r=H(u).selectionEnd;(async()=>{for(let e of n)await se(e,t,r)})()}}function re(e){let t=Array.from(e.dataTransfer?.files??[]).filter(e=>!e.type.startsWith(`image/`));if(!t.length)return;e.preventDefault(),e.stopPropagation();let n=H(u).selectionStart,r=H(u).selectionEnd;(async()=>{for(let e of t)await se(e,n,r)})()}function ie(e){e.dataTransfer?.types?.includes(`Files`)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`)}function ae(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function oe(e,t,n){let r=H(d).slice(0,t),i=H(d).slice(n);I(d,r+e+i),requestAnimationFrame(()=>{H(u).selectionStart=H(u).selectionEnd=t+e.length,H(u).focus()})}async function se(e,n,r){if(e.size>19922944){c({text:X(`doc.file_too_large`)+` (${(e.size/1024/1024).toFixed(1)} MB, max 19 MB)`,cls:`text-red-500 dark:text-red-400`});return}c({text:X(`doc.uploading_file`),cls:`text-gray-400`});try{let i=await ae(e),a=await fetch(`/api/files/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:i,name:e.name,documentId:t.docId})});if(!a.ok){let e=``;try{e=(await a.json()).error||``}catch{e=await a.text()}throw Error(e||`HTTP ${a.status}`)}let{url:o,originalName:s}=await a.json();oe(`[📎 ${s||e.name}](${o})`,n,r),c(null)}catch(e){c({text:X(`doc.file_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`})}}function ce(){I(_,!1),b=null}async function le(){let e=E(H(v))||Date.now().toString();if(I(_,!1),b){c({text:X(`doc.uploading_image`),cls:`text-gray-400`});try{let t=await ae(b),n=await fetch(`/api/images/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:t,ext:H(y),name:e})});if(!n.ok)throw Error(await n.text());let{filename:r}=await n.json();oe(``,x,S),c(null)}catch(e){c({text:X(`doc.image_upload_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`})}finally{b=null}}}function ue(){I(C,null),I(w,``)}function de(e){if(!e.shiftKey&&!e.metaKey)return;let t=e.target,n=t.closest(`img`),r=t.closest(`.mermaid`)?.querySelector(`svg`);if(!n&&!r)return;if(e.preventDefault(),e.stopPropagation(),n){I(C,n.src,!0),I(w,n.alt||``,!0);return}let i=new XMLSerializer().serializeToString(r);I(C,`data:image/svg+xml;charset=utf-8,${encodeURIComponent(i)}`),I(w,X(`doc.mermaid_diagram_alt`),!0)}function fe(e){e.key===`Escape`&&H(C)&&ue()}var pe={enterEdit:ee,cancelEdit:O,save:k,openSnippets:A,isEditing:te},me=nu();Mr(`keydown`,an,fe);var he=z(me),ge=e=>{var t=Ql();vn(t),Li(t,e=>I(u,e),()=>H(u)),Mr(`paste`,t,ne),Mr(`drop`,t,re),Mr(`dragover`,t,ie),Mi(t,()=>H(d),e=>I(d,e)),G(e,t)},_e=e=>{var t=$l();Li(t,e=>I(l,e),()=>H(l)),V(()=>hi(t,1,`prose prose-gray dark:prose-invert max-w-none prose-headings:scroll-mt-4 prose-headings:font-semibold prose-h1:text-[2.1875rem] prose-h2:text-[1.8125rem] prose-h3:text-[1.5rem] prose-h4:text-[1.25rem] prose-a:text-blue-600 dark:prose-a:text-blue-400 prose-code:before:content-none prose-code:after:content-none ${Z.codeBlockLightTheme?`prose-pre:bg-[#f6f8fa] prose-pre:text-gray-800 prose-pre:border prose-pre:border-gray-200 prose-pre:rounded-lg dark:prose-pre:bg-[#0d1117] dark:prose-pre:text-gray-100 dark:prose-pre:border-gray-700`:`prose-pre:bg-[#0d1117] prose-pre:border prose-pre:border-gray-700`} ${Z.imageRoundedCorners?`[&_img]:rounded-xl`:``} ${Z.imageCentered?`[&_img]:mx-auto [&_img]:block`:``} ${Z.imageBorder?`[&_img]:[box-shadow:0_0_0_1px_rgba(0,0,0,0.10),0_4px_12px_rgba(0,0,0,0.04)] dark:[&_img]:[box-shadow:0_0_0_1px_rgba(255,255,255,0.08),0_4px_12px_rgba(255,255,255,0.25)]`:``}`)),U(`click`,t,de),G(e,t)};q(he,e=>{s()?e(ge):e(_e,-1)});var ve=B(he,2);Dl(ve,{get open(){return H(p)},get editor(){return H(u)},get mode(){return H(m)},get docId(){return t.docId},get content(){return t.content},get range(){return H(h)},get insertPos(){return H(g)},get onsave(){return t.onsave},onclose:()=>I(p,!1)});var ye=B(ve,2),be=e=>{var t=eu(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a),s=R(o),c=B(s),l=R(c,!0);N(c),N(o);var u=B(o,2),d=R(u);Ei(d);var f=B(d,2),p=R(f);N(f),N(u),N(a);var m=B(a,2),h=R(m),g=R(h,!0);N(h);var _=B(h,2),b=R(_,!0);N(_),N(m),N(n),N(t),V((e,t,n,r,a)=>{K(i,`🖼️ ${e??``}`),K(s,`${t??``} `),K(l,n),Di(d,H(v)),K(p,`.${H(y)??``}`),K(g,r),K(b,a)},[()=>X(`modal.img_paste.title`),()=>X(`modal.img_paste.filename_label`),()=>X(`modal.img_paste.saved_hint`),()=>X(`common.cancel`),()=>X(`modal.img_paste.paste_btn`)]),U(`input`,d,e=>I(v,E(e.target.value),!0)),U(`click`,h,ce),U(`click`,_,le),G(e,t)};q(ye,e=>{H(_)&&e(be)});var xe=B(ye,2),Se=e=>{var t=tu(),n=R(t),r=B(n,2);N(t),V(()=>{Y(n,`src`,H(C)),Y(n,`alt`,H(w))}),U(`click`,t,ue),U(`click`,n,e=>e.stopPropagation()),U(`click`,r,ue),G(e,t)};return q(xe,e=>{H(C)&&e(Se)}),G(e,me),Ke(pe)}Nr([`click`,`input`]);var iu=W(`<span> </span> <code> </code>`,1),au=W(`<button type="button" data-testid="bp-copy-doc-id"><i aria-hidden="true"></i></button>`),ou=W(`<button class="bpadr-icon-btn" data-testid="bp-edit" type="button">✏️</button> <button class="bpadr-icon-btn" data-testid="bp-delete" type="button">🗑️</button>`,1),su=W(`<span> </span>`),cu=W(`<footer class="bpadr-footer bpadr-doc-footer"><!> <button type="button" class="bpadr-btn-ghost" data-testid="bp-cancel"> </button> <button type="button" class="bpadr-btn-ghost" data-testid="bp-snippets"> </button> <button type="button" class="bpadr-btn-primary" data-testid="bp-save"> </button></footer>`),lu=W(`<div class="bpadr-read"><!></div> <!>`,1),uu=W(`<form class="bpadr-form"><input type="hidden" name="category"/> <input type="hidden" name="folder"/> <div class="bpadr-field"><label for="adr-title"> </label> <input id="adr-title" type="text" class="bpadr-input"/></div> <div class="bpadr-field bpadr-field-grow"><label for="adr-content"> </label> <textarea id="adr-content" class="bpadr-textarea"></textarea></div> <footer class="bpadr-footer"><button type="button" class="bpadr-btn-ghost"> </button> <button type="button" data-testid="bp-form-snippets" class="bpadr-btn-ghost"> </button> <button type="submit" class="bpadr-btn-primary"> </button></footer></form> <!>`,1),du=W(`<div class="bpadr-folder-confirm"><p></p> <p class="bpadr-muted"> </p> <footer class="bpadr-footer"><button type="button" class="bpadr-btn-ghost"> </button> <button type="button" class="bpadr-btn-primary"> </button></footer></div>`),fu=W(`<div class="bpadr-overlay"><div class="bpadr-modal"><header class="bpadr-header"><div class="bpadr-title-row"><h2 class="bpadr-title"><!></h2> <!></div> <div class="bpadr-header-actions"><!> <button class="bpadr-icon-btn" type="button" title="Close">×</button></div></header> <!></div></div>`),pu=W(`<div class="fixed inset-0 z-[60] flex items-center justify-center bg-black/50 p-4"><div class="w-full max-w-sm bg-white dark:bg-gray-900 border border-red-200 dark:border-red-700 rounded-xl shadow-2xl p-5 flex flex-col gap-3"><p class="text-sm text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-500 dark:text-gray-400 italic truncate"> </p> <div class="flex justify-end gap-2 mt-2"><button type="button" data-testid="bp-delete-cancel" class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button type="button" data-testid="bp-delete-confirm" class="text-sm px-4 py-1.5 rounded-lg bg-red-500 hover:bg-red-600 text-white font-semibold transition-colors"> </button></div></div></div>`),mu=W(`<!> <!>`,1);function hu(e,t){Ge(t,!0);let n=Bi(t,`onchanged`,3,()=>{}),r=`000_BLUEPRINT`;function i(e){return e.normalize(`NFKD`).replace(/[̀-ͯ]/g,``).toUpperCase().replace(/[^A-Z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`FOLDER`}function a(e){return`/${(e.folder.path||e.folder.name).replace(/^\/+|\/+$/g,``)||e.folder.name}`}let o=F(`closed`),s=F(``),c=F(``),l=F(``),u=F(``),d=F(``),f=F(``),p=F(``),m=F(``),h=F(null),g=F(null),_=F(null),v=F(!1),y=F(null),b=F(null),x=F(!1),S=F(!1),C=F(!1);async function w(e){I(g,e,!0),I(h,null),I(v,!1),I(y,null);let t=i(e.folder.name);if(I(l,t,!0),I(c,e.folder.name,!0),I(u,``),I(d,``),I(f,``),I(m,a(e),!0),I(s,X(`blueprint.adr.new_title`,{folder:e.folder.name}),!0),I(o,`form`),!(await fetch(`/api/blueprint/blueprint-folder`).then(e=>e.json())).exists){I(p,r),I(o,`folder-confirm`);return}await E(e,t)}async function T(e){return fetch(`/api/documents/${encodeURIComponent(e)}`).then(e=>e.json())}async function E(e,t){let n=await fetch(`/api/blueprint/blueprint-adr?category=${encodeURIComponent(t)}`).then(e=>e.json());if(n.found&&n.doc){I(h,n.doc.id,!0);let e=await T(n.doc.id);I(c,e.title,!0),I(d,e.content,!0),I(f,e.html,!0),I(s,e.title,!0),I(v,!1),I(o,`doc`)}else I(c,e.folder.name,!0),I(u,``),I(o,`form`)}function D(){I(o,`closed`),I(v,!1),I(h,null),I(g,null),I(m,``),I(C,!1)}async function ee(){if(H(h))try{await navigator.clipboard.writeText(decodeURIComponent(H(h))),I(C,!0),setTimeout(()=>I(C,!1),1800)}catch{}}async function O(){await fetch(`/api/blueprint/blueprint-folder`,{method:`POST`}),H(g)&&await E(H(g),i(H(g).folder.name))}async function k(e){if(!H(h))return;await fetch(`/api/documents/${encodeURIComponent(H(h))}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:H(c).trim()||H(g)?.folder.name||X(`common.untitled`),category:H(l),folder:r,content:e})});let t=await T(H(h));I(s,t.title,!0),I(d,t.content,!0),I(f,t.html,!0)}async function A(e){e.preventDefault();let t={title:H(c).trim()||H(g)?.folder.name||X(`common.untitled`),category:H(l),folder:r},i=await fetch(`/api/documents/`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)}).then(e=>e.json());I(h,i.id,!0);let a=await T(i.id);I(s,a.title,!0),I(d,a.content,!0),I(f,a.html,!0),I(v,!1),I(o,`doc`),n()()}async function te(){I(S,!1),H(h)&&(await fetch(`/api/documents/${encodeURIComponent(H(h))}`,{method:`DELETE`}),D(),n()())}var ne={open:w},re=mu(),ie=z(re),ae=e=>{var t=fu(),n=R(t),i=R(n),a=R(i),g=R(a),w=R(g),T=e=>{var t=iu(),n=z(t),r=R(n,!0);N(n);var i=B(n,2),a=R(i,!0);N(i),V(e=>{K(r,e),K(a,H(m))},[()=>X(`blueprint.adr.folder_title`)]),G(e,t)},E=e=>{var t=Hr();V(()=>K(t,H(s))),G(e,t)};q(w,e=>{H(m)?e(T):e(E,-1)}),N(g);var te=B(g,2),ne=e=>{var t=au(),n=R(t);N(t),V(e=>{Y(t,`title`,e),hi(t,1,`bpadr-copy-btn ${H(C)?`copied`:``}`),hi(n,1,`fa-${H(C)?`solid fa-check`:`regular fa-copy`}`)},[()=>X(`doc.copy_mcp_id`)]),U(`click`,t,ee),G(e,t)};q(te,e=>{H(h)&&e(ne)}),N(a);var re=B(a,2),ie=R(re),ae=e=>{var t=ou(),n=z(t),r=B(n,2);V((e,t)=>{Y(n,`title`,e),Y(r,`title`,t)},[()=>X(`doc.edit`),()=>X(`doc.delete`)]),U(`click`,n,()=>H(_).enterEdit()),U(`click`,r,()=>I(S,!0)),G(e,t)};q(ie,e=>{H(o)===`doc`&&!H(v)&&e(ae)});var oe=B(ie,2);N(re),N(i);var se=B(i,2),ce=e=>{var t=lu(),n=z(t),r=R(n);{let e=P(()=>H(h)??``);Li(ru(r,{get docId(){return H(e)},get content(){return H(d)},get html(){return H(f)},onsave:k,get editing(){return H(v)},set editing(e){I(v,e,!0)},get saveMsg(){return H(y)},set saveMsg(e){I(y,e,!0)}}),e=>I(_,e,!0),()=>H(_))}N(n);var i=B(n,2),a=e=>{var t=cu(),n=R(t),r=e=>{var t=su(),n=R(t,!0);N(t),V(()=>{hi(t,1,`text-xs ${H(y).cls??``}`),K(n,H(y).text)}),G(e,t)};q(n,e=>{H(y)&&e(r)});var i=B(n,2),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(t),V((e,t,n)=>{K(a,e),K(s,t),K(l,n)},[()=>X(`common.cancel`),()=>X(`doc.snippets_btn`),()=>X(`common.save`)]),U(`click`,i,()=>H(_).cancelEdit()),U(`click`,o,()=>H(_).openSnippets()),U(`click`,c,()=>H(_).save()),G(e,t)};q(i,e=>{H(v)&&e(a)}),G(e,t)},le=e=>{var t=uu(),n=z(t),i=R(n);Ei(i);var a=B(i,2);Ei(a),Di(a,r);var s=B(a,2),d=R(s),f=R(d,!0);N(d);var p=B(d,2);Ei(p),N(s);var m=B(s,2),g=R(m),_=R(g,!0);N(g);var v=B(g,2);vn(v),Li(v,e=>I(b,e),()=>H(b)),N(m);var y=B(m,2),S=R(y),C=R(S,!0);N(S);var w=B(S,2),T=R(w,!0);N(w);var E=B(w,2),ee=R(E,!0);N(E),N(y),N(n),Dl(B(n,2),{get open(){return H(x)},get editor(){return H(b)},mode:`insert`,get content(){return H(u)},onclose:()=>I(x,!1)}),V((e,t,n,r,a)=>{Di(i,H(l)),K(f,e),K(_,t),K(C,n),K(T,r),K(ee,a)},[()=>X(`blueprint.adr.title_label`),()=>X(`blueprint.adr.content_label`),()=>X(`common.cancel`),()=>X(`doc.snippets_btn`),()=>X(`common.save`)]),Mr(`submit`,n,A),Mi(p,()=>H(c),e=>I(c,e)),Mi(v,()=>H(u),e=>I(u,e)),U(`click`,S,()=>{H(h)?I(o,`doc`):D()}),U(`click`,w,()=>I(x,!0)),G(e,t)},ue=e=>{var t=du(),n=R(t);ii(n,()=>X(`blueprint.adr.folder_missing`,{name:H(p)}),!0),N(n);var r=B(n,2),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(a),N(t),V((e,t,n)=>{K(i,e),K(s,t),K(l,n)},[()=>X(`blueprint.adr.folder_create_prompt`),()=>X(`common.cancel`),()=>X(`blueprint.adr.create_folder_btn`)]),U(`click`,o,D),U(`click`,c,O),G(e,t)};q(se,e=>{H(o)===`doc`?e(ce):H(o)===`form`?e(le,1):H(o)===`folder-confirm`&&e(ue,2)}),N(n),N(t),U(`click`,t,e=>{e.target===e.currentTarget&&D()}),U(`click`,oe,D),G(e,t)};q(ie,e=>{H(o)!==`closed`&&e(ae)});var oe=B(ie,2),se=e=>{var t=pu(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var c=B(a,2),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d,!0);N(d),N(c),N(n),N(t),V((e,t,n)=>{K(i,e),K(o,H(s)),K(u,t),K(f,n)},[()=>X(`doc.confirm_delete`),()=>X(`common.cancel`),()=>X(`doc.confirm_delete_btn`)]),U(`click`,t,e=>{e.target===e.currentTarget&&I(S,!1)}),U(`click`,l,()=>I(S,!1)),U(`click`,d,te),G(e,t)};return q(oe,e=>{H(S)&&e(se)}),G(e,re),Ke(ne)}Nr([`click`]);var gu=W(`<span class="breadcrumb-sep">›</span>`),_u=W(`<span class="breadcrumb-item current"> </span>`),vu=W(`<button class="breadcrumb-item" type="button"> </button>`),yu=W(`<!> <!>`,1),bu=W(`<nav class="breadcrumb"></nav>`),xu=W(`<div class="app-shell"><!> <section class="workspace-shell"><!> <!></section></div> <!>`,1);function Su(e,t){Ge(t,!0),Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}});let n=F(L([])),r=F(null),i=F(null),a=F(null),o=F(null);function s(e){l(),H(i).loadPath(e,!0)}async function c(e){I(r,e.folder.path,!0),await br(),await H(a).open(e.folder.path)}function l(){I(r,null)}async function u(e){await H(i).navigateToFolder(e)}var d=xu(),f=z(d),p=R(f);{let e=P(()=>X(`blueprint.subtitle`));Ja(p,{title:`Blueprint`,get subtitle(){return H(e)},children:(e,t)=>{var r=bu();J(r,21,()=>H(n),Yr,(e,t,r)=>{var i=yu(),a=z(i),o=e=>{G(e,gu())};q(a,e=>{r>0&&e(o)});var c=B(a,2),l=e=>{var n=_u(),r=R(n,!0);N(n),V(()=>K(r,H(t).name)),G(e,n)},u=e=>{var n=vu(),r=R(n,!0);N(n),V(()=>K(r,H(t).name)),U(`click`,n,()=>s(H(t).path)),G(e,n)};q(c,e=>{r===H(n).length-1?e(l):e(u,-1)}),G(e,i)}),N(r),G(e,r)},$$slots:{default:!0}})}var m=B(p,2),h=R(m);Li(_o(h,{get activeExplorerPath(){return H(r)},onbreadcrumbchange:e=>I(n,e,!0),onopenexplorer:c,onclosefilerexplorer:l,onopenAdr:e=>H(o).open(e)}),e=>I(i,e,!0),()=>H(i));var g=B(h,2),_=e=>{Li(Lo(e,{onclose:l,onnavigate:u}),e=>I(a,e,!0),()=>H(a))};q(g,e=>{H(r)!==null&&e(_)}),N(m),N(f),Li(hu(B(f,2),{onchanged:()=>H(i).loadPath(H(n).at(-1)?.path??``,!1)}),e=>I(o,e,!0),()=>H(o)),G(e,d),Ke()}Nr([`click`]);var Cu=164,wu=64,Tu=132,Eu=78,Du=6,Ou=24,ku=96,Au=540,ju=780,Mu=1/2,Nu=9999,Pu=44,Fu=255,Iu=178,Lu=Math.PI*.7,Ru=Math.PI*1.1,zu=Math.PI*1.45,Bu=Math.PI*1.75,Vu=14,Hu=260,Uu=56,Wu=32,Gu=[`pointerdown`,`mousedown`,`click`,`dblclick`,`touchstart`,`wheel`],Ku=.35,qu=2.2,Ju=.0018,Yu=4,Xu=46,Zu=4,Qu=44,$u=360,ed=300,td=44,nd=48,rd=7,id=875,ad=450,od=600*1e3,sd,Q,cd,ld,ud,dd,fd,pd,md,hd,gd,_d,vd,yd,bd,xd,Sd,Cd,wd,Td,Ed,Dd,Od,kd,Ad,jd,Md,Nd,Pd=null,Fd=null,Id=null,Ld,$,Rd,zd=!1;function Bd(){return sd=document.getElementById(`workspaceCanvas`),Q=sd.getContext(`2d`),cd=document.getElementById(`apiStatus`),ld=document.getElementById(`addButton`),ud=document.getElementById(`fitButton`),dd=document.getElementById(`testNodeButton`),fd=document.getElementById(`loadModelsButton`),pd=document.getElementById(`closePanelButton`),md=document.getElementById(`deleteNodeButton`),hd=document.getElementById(`renameConfirmOverlay`),gd=document.getElementById(`renameConfirmMessage`),_d=document.getElementById(`cancelRenameButton`),vd=document.getElementById(`confirmRenameButton`),yd=document.getElementById(`deleteConfirmOverlay`),bd=document.getElementById(`deleteConfirmMessage`),xd=document.getElementById(`cancelDeleteButton`),Sd=document.getElementById(`confirmDeleteButton`),Cd=document.getElementById(`agentRunOverlay`),wd=document.getElementById(`agentRunTitle`),Td=document.getElementById(`agentRunHint`),Ed=document.getElementById(`agentRunInputField`),Dd=document.getElementById(`agentRunInput`),Od=document.getElementById(`agentRunResult`),kd=document.getElementById(`cancelAgentRunButton`),Ad=document.getElementById(`executeAgentRunButton`),jd=document.getElementById(`fallbackPanelHost`),Md=document.getElementById(`configSurface`),Nd=Md,Pd=null,Fd=null,Id=null,Ld={name:document.getElementById(`nodeName`),kind:document.getElementById(`nodeKind`),endpoint:document.getElementById(`nodeEndpoint`),token:document.getElementById(`nodeToken`),model:document.getElementById(`nodeModel`),workspaceField:document.getElementById(`agentWorkspaceField`),workspaceFolder:document.getElementById(`nodeWorkspaceFolder`),timeout:document.getElementById(`nodeTimeout`),description:document.getElementById(`nodeDescription`),typeBadge:document.getElementById(`nodeTypeBadge`),llmFields:document.getElementById(`llmFields`),mcpInventory:document.getElementById(`mcpInventory`),agentSection:document.getElementById(`agentSection`),systemPrompt:document.getElementById(`nodeSystemPrompt`),requiresUserInput:document.getElementById(`nodeRequiresUserInput`),userInputDescriptionField:document.getElementById(`agentUserInputDescriptionField`),userInputDescription:document.getElementById(`nodeUserInputDescription`),expectedOutputMarker:document.getElementById(`nodeExpectedOutputMarker`)},$={entities:rf([nf(`root`,`Living AI Documentation`,`system`,null),nf(`mcp`,`MCP`,`mcp`,`root`)]),selectedId:null,cameraX:0,cameraY:0,zoom:1,isPanning:!1,panStartX:0,panStartY:0,panStartCameraX:0,panStartCameraY:0,didPan:!1,viewAnimationId:null,dpr:window.devicePixelRatio||1,apiMode:`fallback`,lastSaveAt:null,pendingDeleteId:null,panelShiftX:0,saveTimerId:null,isHydrated:!1},zd=!!sd.requestPaint&&typeof Q.drawElementImage==`function`,zd?($.apiMode=`html-in-canvas`,cd.textContent=`HTML-in-Canvas active`,cd.classList.add(`is-live`),sd.onpaint=Qf):(jd.appendChild(Md),cd.textContent=`DOM fallback`,cd.classList.add(`is-fallback`)),Rd=new ResizeObserver(([e])=>{let t=e.devicePixelContentBoxSize&&e.devicePixelContentBoxSize[0],n=e.contentRect.width,r=e.contentRect.height;$.dpr=t?t.inlineSize/n:window.devicePixelRatio||1,sd.width=t?t.inlineSize:Math.floor(n*$.dpr),sd.height=t?t.blockSize:Math.floor(r*$.dpr),ff(),sp(!1,!$.cameraX&&!$.cameraY),Zf()}),Rd.observe(sd,{box:`device-pixel-content-box`}),Vd(),Hd(),ld.addEventListener(`click`,()=>{lf()}),ud.addEventListener(`click`,()=>{ff(),sp(!0,!0),qd(),Zf()}),sd.addEventListener(`pointerdown`,e=>{if(e.target!==sd)return;let t=Ap(e),n=_p(t),r=[...$.entities].reverse().find(e=>Cp(e,n));if(r){r.id!==`root`&&wf(r.id);return}$.isPanning=!0,$.didPan=!1,$.panStartX=t.x,$.panStartY=t.y,$.panStartCameraX=$.cameraX,$.panStartCameraY=$.cameraY,sd.classList.add(`is-panning`),sd.setPointerCapture?.(e.pointerId)}),sd.addEventListener(`pointermove`,e=>{if(!$.isPanning)return;let t=Ap(e),n=t.x-$.panStartX,r=t.y-$.panStartY;Math.hypot(n,r)>Yu&&($.didPan=!0),$.cameraX=$.panStartCameraX+n,$.cameraY=$.panStartCameraY+r,Zf()}),sd.addEventListener(`pointerup`,e=>{$.isPanning&&($.isPanning=!1,sd.classList.remove(`is-panning`),sd.releasePointerCapture?.(e.pointerId),!$.didPan&&$.selectedId?wf(null):$.didPan&&qd())}),sd.addEventListener(`pointercancel`,e=>{$.isPanning=!1,sd.classList.remove(`is-panning`),sd.releasePointerCapture?.(e.pointerId)}),sd.addEventListener(`wheel`,e=>{e.target===sd&&(e.preventDefault(),gp(Ap(e),Math.exp(-e.deltaY*Ju)),qd())},{passive:!1}),Nd.addEventListener(`submit`,e=>{e.preventDefault(),kf(),$.lastSaveAt=new Date,ff(),Jd(!0),Zf()}),Nd.addEventListener(`input`,e=>{kf(),ff(),e.target===Ld.name&&Kf()?.kind===`agent`||qd(),Zf()}),pd.addEventListener(`click`,()=>{wf(null)}),md.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation();let t=$.selectedId,n=t?qf(t):null;!n||Jf(t)||Tf(n)}),xd.addEventListener(`click`,Ef),yd.addEventListener(`click`,e=>{e.target===yd&&Ef()}),Sd.addEventListener(`click`,()=>{$.pendingDeleteId&&Df($.pendingDeleteId),Ef()}),dd.addEventListener(`click`,()=>{if(Kf()?.kind===`agent`){Mf();return}Wf()}),fd.addEventListener(`click`,()=>{Uf()}),Ld.name.addEventListener(`blur`,()=>{let e=Kf();if(!e||e.kind!==`agent`)return;let t=Ld.name.value.trim();if(!t||!Pd||!Fd||t===Pd)return;let n=of(t);n!==Fd&&(gd.textContent=`Renommer le dossier "${Fd}" en "${n}" ?`,hd.hidden=!1,_d.focus())}),_d.addEventListener(`click`,()=>{hd.hidden=!0;let e=Kf();e&&Pd&&(e.label=Pd,Ld.name.value=Pd,ff(),Zf())}),vd.addEventListener(`click`,()=>{hd.hidden=!0;let e=Kf();if(!e||!Fd)return;e.config.workspaceFolder=Fd,Ld.workspaceFolder.value=Fd;let t=Ld.name.value.trim();t&&(Pd=t),Fd=of(t),qd()}),Ld.model.addEventListener(`change`,()=>{dd.disabled=!Ld.model.value;let e=Kf();e&&(e.config.model=Ld.model.value)}),kd.addEventListener(`click`,()=>{Nf()}),Ad.addEventListener(`click`,()=>{Pf()}),Cd.addEventListener(`click`,e=>{e.target===Cd&&Nf()}),Wd(),()=>{Rd.disconnect(),$?.saveTimerId&&clearTimeout($.saveTimerId)}}function Vd(){for(let e of Gu)Md.addEventListener(e,Ud),jd.addEventListener(e,Ud)}function Hd(){for(let e of Gu)yd.addEventListener(e,Ud),hd.addEventListener(e,Ud),Cd.addEventListener(e,Ud)}function Ud(e){e.stopPropagation()}async function Wd(){let e=await ja();e?.entities?.length&&($.entities=Gd(e.entities),$.cameraX=tf(e.camera?.x,$.cameraX),$.cameraY=tf(e.camera?.y,$.cameraY),$.zoom=vp(tf(e.camera?.zoom,$.zoom),Ku,qu),$.lastSaveAt=e.updatedAt?new Date(e.updatedAt):null),$.isHydrated=!0,ff(),e?.entities?.length||sp(!1,!0),Of(),Zf()}function Gd(e){let t=e.map(Kd).filter(e=>!!e),n=t.some(e=>e.id===`root`),r=t.some(e=>e.id===`mcp`),i=[...n?[]:[nf(`root`,`Living AI Documentation`,`system`,null)],...t,...r?[]:[nf(`mcp`,`MCP`,`mcp`,`root`)]],a=new Set(i.map(e=>e.id));return i.map(e=>{let t=e.id===`root`?`system`:e.id===`mcp`?`mcp`:e.kind,n=e.id===`root`?null:e.id===`mcp`?`root`:e.parentId&&a.has(e.parentId)?e.parentId:null;return{...e,kind:t,parentId:n,config:{...nf(e.id,e.label,t,n).config,...e.config}}})}function Kd(e){if(!Qd(e))return null;let t=$d(e.id),n=$d(e.label),r=ef(e.kind);if(!t||!n||!r)return null;let i=e.parentId===null?null:$d(e.parentId),a=Qd(e.config)?e.config:{};return{id:t,label:n,kind:r,parentId:i,x:tf(e.x,0),y:tf(e.y,0),angle:tf(e.angle,0),config:{endpoint:$d(a.endpoint)||af(t,r),token:$d(a.token),model:$d(a.model),timeout:tf(a.timeout,180),description:$d(a.description)||cf(r),workspaceFolder:$d(a.workspaceFolder)||(r===`agent`?of(n):``),systemPrompt:$d(a.systemPrompt),requiresUserInput:a.requiresUserInput===!0,userInputDescription:$d(a.userInputDescription),expectedOutputMarker:$d(a.expectedOutputMarker)}}}function qd(){$.isHydrated&&($.saveTimerId&&clearTimeout($.saveTimerId),$.saveTimerId=window.setTimeout(()=>{$.saveTimerId=null,Jd(!1)},ad))}async function Jd(e=!1){if(!$.isHydrated)return;$.saveTimerId&&(clearTimeout($.saveTimerId),$.saveTimerId=null);let t=await Ma(Zd());t?($.entities=Gd(t.entities),$.lastSaveAt=new Date(t.updatedAt),Kf()&&Of(),e&&Xd(`Workspace saved`)):e&&Xd(`Save failed`)}function Yd(e,t){return Oa(e,t)}function Xd(e,t=`success`,n,r){return ka(e,t,n,r)}function Zd(){return{version:1,updatedAt:new Date().toISOString(),entities:$.entities.map(e=>({id:e.id,label:e.label,kind:e.kind,parentId:e.parentId,x:e.x,y:e.y,angle:e.angle,config:{...e.config}})),camera:{x:$.cameraX,y:$.cameraY,zoom:$.zoom}}}function Qd(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function $d(e){return typeof e==`string`?e:``}function ef(e){return e===`system`||e===`llm`||e===`agent`||e===`mcp`?e:null}function tf(e,t){return typeof e==`number`&&Number.isFinite(e)?e:t}function nf(e,t,n,r){return{id:e,label:t,kind:n,parentId:r,x:0,y:0,angle:0,config:{endpoint:af(e,n),token:``,model:``,timeout:180,description:cf(n),workspaceFolder:n===`agent`?of(t):``,systemPrompt:``,requiresUserInput:!1,userInputDescription:``,expectedOutputMarker:``}}}function rf(e){return e.map(e=>({...e,config:{...e.config}}))}function af(e,t){return t===`llm`?`http://localhost:11434`:t===`mcp`?`http://localhost:4321/mcp`:``}function of(e){return`AI/WORKSPACE/${sf(e)}`}function sf(e){return e.normalize(`NFKD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`_`).replace(/^_+|_+$/g,``)||`llm_provider`}function cf(e){let t={system:`Owns the documentation workspace, MCP access, providers, and agent topology.`,llm:`Routes model calls and hosts the agents assigned to this provider.`,agent:`Runs focused automation against documentation, source, or quality signals.`,mcp:`Exposes the local Living Documentation MCP consultation panel to agents.`};return t[e]||t.agent}function lf(){let e=Kf(),t=e?.kind===`llm`?e:qf(e?.parentId);if(e?.kind===`llm`||t?.kind===`llm`){df(t.id);return}uf()}function uf(){let e=!!$.selectedId,t=Yf(`root`).filter(e=>e.kind===`llm`).length+1,n=nf(`provider-${Date.now().toString(36)}`,`LLM Provider ${t}`,`llm`,`root`);$.entities=[...$.entities,n],$.selectedId=n.id,ff(),cp(e,!0,!0),Of(),qd(),Zf()}function df(e){let t=!!$.selectedId,n=Yf(e).filter(e=>e.kind===`agent`).length+1,r=nf(`agent-${Date.now().toString(36)}`,`Agent ${n}`,`agent`,e);$.entities=[...$.entities,r],$.selectedId=r.id,ff(),cp(t,!0,!0),Of(),qd(),Zf()}function ff(){let e=qf(`root`);e.x=0,e.y=0,e.angle=0,pf(e)}function pf(e){let t=Yf(e.id),n=yf(t,Tu,Fu,{spread:Math.PI*2,includeSubtree:!1}),r=new Map(t.map(e=>[e.id,_f(e,n)]));for(let n=0;n<=rd;n+=1)if(mf(e,t,r),hf(),!gf(t,r))return;mf(e,t,r),hf()}function mf(e,t,n){let r=Math.max(1,t.length);t.forEach((t,i)=>{let a=-Math.PI/2+i/r*Math.PI*2,o=n.get(t.id)||Fu;t.angle=a,t.x=e.x+Math.cos(a)*o,t.y=e.y+Math.sin(a)*o})}function hf(){for(let e of $.entities.filter(e=>e.kind===`llm`))vf(e)}function gf(e,t){let n=!1;for(let r=0;r<e.length;r+=1)for(let i=r+1;i<e.length;i+=1){let a=e[r],o=e[i];kp(Ep(a),Ep(o),td)&&(t.set(a.id,Math.min(id,t.get(a.id)+nd)),t.set(o.id,Math.min(id,t.get(o.id)+nd)),n=!0)}return n}function _f(e,t){if(e.kind!==`llm`)return t;let n=Yf(e.id).length;if(n<=Zu)return t;let r=(n-Zu)*Qu,i=Math.max(0,Sf(e)-ed)*.65;return t+Math.min($u,Math.max(r,i))}function vf(e){let t=Yf(e.id);if(!t.length)return;let n=Math.atan2(e.y,e.x),r=bf(t.length),i=yf(t,Eu,Iu,{spread:r,includeSubtree:!1});t.forEach((a,o)=>{let s=xf(n,r,o,t.length);a.angle=s,a.x=e.x+Math.cos(s)*i,a.y=e.y+Math.sin(s)*i})}function yf(e,t,n,r={}){if(!e.length)return n;let i=!!r.includeSubtree,a=r.spread||Math.PI*2,o=Math.max(...e.map(e=>i?Sf(e):Cf(e))),s=t+o+Xu;if(e.length===1)return Math.max(n,s);let c=o*2+Xu,l=a>=Math.PI*2-.001?Math.PI*2/e.length:a/(e.length-1),u=c/(2*Math.sin(l/2));return Math.max(n,s,u)}function bf(e){return e<=1?0:e<=2?Lu:e<=4?Ru:e<=7?zu:Bu}function xf(e,t,n,r){return r<=1||t===0?e:e-t/2+n/(r-1)*t}function Sf(e){if(e.kind!==`llm`)return Cf(e);let t=Yf(e.id);return t.length?yf(t,Eu,Iu,{spread:bf(t.length),includeSubtree:!1})+Math.max(...t.map(e=>Cf(e))):Eu}function Cf(e){if(e.kind===`system`)return Tu;if(e.kind===`llm`)return Eu;let{width:t,height:n}=Tp(e);return Math.hypot(t/2,n/2)}function wf(e){let t=!!$.selectedId;$.selectedId=e;let n=e?qf(e):null;Pd=n?.kind===`agent`?n.label:null,Fd=n?.kind===`agent`?n.config.workspaceFolder||of(n.label):null,ff(),cp(t,!!e,!0),Of(),Zf()}function Tf(e){let t=Xf(e.id),n=Yf(e.id).length,r=t.length?` This node has ${n} direct child${n===1?``:`ren`} and ${t.length} total descendant${t.length===1?``:`s`}; they will also be deleted.`:` This node has no children.`;$.pendingDeleteId=e.id,bd.textContent=`You are about to delete "${e.label}".${r} This action cannot be undone.`,yd.hidden=!1,Sd.focus()}function Ef(){$.pendingDeleteId=null,yd.hidden=!0}function Df(e){let t=qf(e);if(!t||Jf(e))return;let n=t.parentId||`root`,r=!!$.selectedId,i=new Set([e,...Xf(e)]);$.entities=$.entities.filter(e=>!i.has(e.id)),$.selectedId=qf(n)?n:null,ff(),cp(r,!!$.selectedId,!0),Of(),qd(),Zf()}function Of(){let e=Kf(),t=!!e;if(Md.hidden=!t,jd.hidden=!t||zd,!e){ld.title=`Add LLM provider`,dd.textContent=`Test`,dd.hidden=!0,dd.disabled=!0;return}Ld.name.value=e.label,Ld.kind.value=e.kind,Ld.endpoint.value=e.config.endpoint,Ld.token.value=e.config.token,jf(e.config.model),Ld.workspaceFolder.value=e.config.workspaceFolder,Ld.workspaceField.hidden=e.kind!==`agent`,Ld.timeout.value=String(e.config.timeout),Ld.description.value=e.config.description,Ld.typeBadge.textContent=Gf(e.kind),Ld.kind.disabled=!0,Ld.llmFields.hidden=e.kind===`mcp`||e.kind===`agent`,Ld.mcpInventory.hidden=e.kind!==`mcp`,Ld.agentSection.hidden=e.kind!==`agent`,Ld.systemPrompt.value=e.config.systemPrompt,Ld.requiresUserInput.checked=e.config.requiresUserInput,Af(),Ld.userInputDescription.value=e.config.userInputDescription,Ld.expectedOutputMarker.value=e.config.expectedOutputMarker,md.hidden=Jf(e.id),dd.textContent=`Test`,dd.hidden=e.kind!==`llm`&&e.kind!==`agent`,dd.disabled=e.kind===`llm`?!e.config.model:e.kind!==`agent`,ld.title=e.kind===`llm`||qf(e.parentId)?.kind===`llm`?`Add agent`:`Add LLM provider`}function kf(){let e=Kf();if(e&&(e.label=Ld.name.value.trim()||`Untitled node`,e.kind=Ld.kind.value,e.config.endpoint=Ld.endpoint.value,e.config.token=Ld.token.value,e.config.model=Ld.model.value,e.config.timeout=Number(Ld.timeout.value||30),e.config.description=Ld.description.value,e.config.systemPrompt=Ld.systemPrompt.value,e.config.requiresUserInput=Ld.requiresUserInput.checked,e.config.userInputDescription=Ld.userInputDescription.value,e.config.expectedOutputMarker=Ld.expectedOutputMarker.value,Af(),Ld.typeBadge.textContent=Gf(e.kind),e.kind===`llm`))for(let t of $.entities)t.parentId===e.id&&t.kind===`agent`&&(t.config.model=e.config.model,t.config.timeout=e.config.timeout)}function Af(){let e=Kf()?.kind===`agent`&&Ld.requiresUserInput.checked;Ld.userInputDescriptionField.hidden=!e,Ld.userInputDescription.required=e}function jf(e){let t=Array.from(Ld.model.options).map(e=>e.value);if(e&&!t.includes(e)){Ld.model.innerHTML=``;let t=document.createElement(`option`);t.value=e,t.textContent=e,Ld.model.appendChild(t)}Ld.model.value=e||(t[0]??``)}function Mf(){let e=Kf();if(!e||e.kind!==`agent`)return;kf();let t=qf(e.parentId??``);if(!t||t.kind!==`llm`){Xd(`No parent LLM found for this agent.`,`error`);return}if(!t.config.model){Xd(`Parent LLM has no model selected.`,`error`);return}if(!e.config.systemPrompt.trim()){Xd(`Write a system prompt first.`,`error`);return}if(e.config.requiresUserInput&&!e.config.userInputDescription.trim()){Xd(`Describe the required user input first.`,`error`);return}Id=e.id,wd.textContent=`Test ${e.label}`,Td.textContent=e.config.requiresUserInput?e.config.userInputDescription:`Run this agent with its configured system prompt.`,Ed.hidden=!e.config.requiresUserInput,Dd.required=e.config.requiresUserInput,Dd.value=``,Od.hidden=!0,Od.textContent=``,Ad.disabled=!1,Ad.textContent=`Run`,Cd.hidden=!1,e.config.requiresUserInput?window.setTimeout(()=>Dd.focus(),0):window.setTimeout(()=>Ad.focus(),0)}function Nf(){Cd.hidden=!0,Id=null}async function Pf(){if(Dd.required&&!Dd.value.trim()){Dd.reportValidity();return}let e=Id?qf(Id):null;if(!e||e.kind!==`agent`){zf(`error`,`The selected agent is no longer available.`);return}let t=qf(e.parentId??``);if(!t||t.kind!==`llm`){zf(`error`,`No parent LLM found for this agent.`);return}Ad.disabled=!0,Ad.textContent=`Running…`;let n=Yd(`Running agent…`);If();let r=$.entities.find(e=>e.kind===`mcp`),i=!1,a=await Pa({providerId:t.id,endpoint:t.config.endpoint,model:t.config.model,systemPrompt:e.config.systemPrompt,userInput:Dd.value.trim()||void 0,timeout:t.config.timeout,mcpEndpoint:r?.config.endpoint||void 0,expectedOutputMarker:e.config.expectedOutputMarker||void 0},e=>{e.type===`error`&&(i=!0),e.type!==`final`&&e.type!==`error`&&Yd(Ff(e),n),Lf(e)});Ad.disabled=!1,Ad.textContent=`Run`,a.ok&&a.content?(Rf(a.content),Xd(`Agent responded. Result saved in AI/WORKSPACE.`,`success`,od,n)):(i||Lf({type:`error`,message:a.error??`Agent failed.`}),Od.dataset.state=`error`,Xd(a.error??`Agent failed.`,`error`,od,n))}function Ff(e){return e.type===`tool_call`&&e.toolName?`Agent tool call: ${e.toolName}`:e.type===`tool_result`&&e.toolName?`Agent tool result: ${e.toolName}`:`Agent: ${e.message}`}function If(){Od.hidden=!1,Od.dataset.state=`loading`,Od.textContent=``,Lf({type:`status`,message:`Preparing agent request`})}function Lf(e){Od.hidden=!1,e.type===`error`&&(Od.dataset.state=`error`);let t=document.createElement(`div`);t.className=`agent-run-event agent-run-event-${e.type.replace(`_`,`-`)}`;let n=document.createElement(`span`);n.className=`agent-run-event-dot`,n.setAttribute(`aria-hidden`,`true`);let r=document.createElement(`div`);r.className=`agent-run-event-body`;let i=document.createElement(`p`);i.className=`agent-run-event-title`,i.textContent=e.message,r.appendChild(i);let a=[];if(e.turn&&a.push(`Turn ${e.turn}`),e.toolName&&a.push(e.toolName),e.detail&&a.push(e.detail),a.length){let e=document.createElement(`p`);e.className=`agent-run-event-meta`,e.textContent=a.join(` · `),r.appendChild(e)}t.append(n,r),Od.appendChild(t),Od.scrollTop=Od.scrollHeight}function Rf(e){Od.dataset.state=`success`;let t=document.createElement(`section`);t.className=`agent-run-final`;let n=document.createElement(`h3`);n.textContent=`Final response`;let r=document.createElement(`pre`);r.textContent=e,t.append(n,r),Od.appendChild(t),Od.scrollTop=Od.scrollHeight}function zf(e,t){Od.hidden=!1,Od.dataset.state=e,Od.textContent=t}var Bf=/^(?:env:[A-Za-z_][A-Za-z0-9_]*|\$\{[A-Za-z_][A-Za-z0-9_]*\})$/;function Vf(e){let t=e.trim();return t!==``&&!Bf.test(t)}var Hf=`API token must reference an environment variable, e.g. env:LLM_API_KEY`;async function Uf(){let e=Kf();if(!e||e.kind!==`llm`)return;kf();let t=e.config.endpoint;if(!t){Xd(`Set an endpoint first.`);return}if(Vf(e.config.token)){Xd(Hf);return}fd.classList.add(`loading`),fd.disabled=!0,Ld.model.disabled=!0;let n=await Na({endpoint:t,token:e.config.token});if(fd.classList.remove(`loading`),fd.disabled=!1,Ld.model.disabled=!1,!n.ok||!n.models?.length){Xd(n.error??`No models found.`);return}let r=Ld.model.value;Ld.model.innerHTML=``;for(let e of n.models){let t=document.createElement(`option`);t.value=e,t.textContent=e,Ld.model.appendChild(t)}Ld.model.value=n.models.includes(r)?r:n.models[0],e.config.model=Ld.model.value,dd.disabled=!Ld.model.value,Xd(`${n.models.length} model${n.models.length===1?``:`s`} loaded.`),Zf()}async function Wf(){let e=Kf();if(!e||e.kind!==`llm`)return;if(kf(),Vf(e.config.token)){Xd(Hf);return}dd.disabled=!0,Yd(`Testing ${e.config.model}…`),Zf();let t=await Ia({endpoint:e.config.endpoint,token:e.config.token,model:e.config.model,timeout:e.config.timeout});dd.disabled=!1,t.ok?Xd(t.detail??`Connection OK`,`success`):Xd(t.error||`Connection failed (${t.status||`no status`})`,`error`),Zf()}function Gf(e){return{system:`System`,llm:`LLM provider`,agent:`Agent`,mcp:`MCP`}[e]||`Node`}function Kf(){return $.selectedId?qf($.selectedId):null}function qf(e){return $.entities.find(t=>t.id===e)}function Jf(e){return e===`root`||e===`mcp`}function Yf(e){return $.entities.filter(t=>t.parentId===e)}function Xf(e){let t=[];for(let n of Yf(e))t.push(n.id,...Xf(n.id));return t}function Zf(){zd?sd.requestPaint():requestAnimationFrame(Qf)}function Qf(){let e=sd.width/$.dpr,t=sd.height/$.dpr;Q.reset(),Q.setTransform($.dpr,0,0,$.dpr,0,0),Q.clearRect(0,0,e,t),Q.save(),Q.translate($.cameraX,$.cameraY),Q.scale($.zoom,$.zoom),$f(e,t),ep(),Q.restore(),zd&&op(e,t)}function $f(e,t){Q.save(),Q.lineWidth=1/$.zoom;let n=_p({x:0,y:0}),r=_p({x:e,y:t}),i=Math.floor(n.x/Ou)*Ou,a=Math.ceil(r.x/Ou)*Ou,o=Math.floor(n.y/Ou)*Ou,s=Math.ceil(r.y/Ou)*Ou;for(let e=i;e<=a;e+=Ou)Q.strokeStyle=e%ku===0?`#d7dce5`:`#edf0f4`,Pp(e,o,e,s);for(let e=o;e<=s;e+=Ou)Q.strokeStyle=e%ku===0?`#d7dce5`:`#edf0f4`,Pp(i,e,a,e);Q.restore()}function ep(){tp();for(let e of $.entities)np(e)}function tp(){Q.save(),Q.strokeStyle=`#111827`,Q.lineWidth=2/$.zoom;for(let e of $.entities){let t=qf(e.parentId);if(!t)continue;let n=Math.atan2(e.y-t.y,e.x-t.x),r=yp(t,n),i=yp(e,n+Math.PI);Q.beginPath(),Q.moveTo(r.x,r.y),Q.lineTo(i.x,i.y),Q.stroke()}Q.restore()}function np(e){if(e.kind===`system`||e.kind===`llm`){rp(e);return}ip(e)}function rp(e){let t=e.id===$.selectedId,n=e.kind===`system`?Tu:Eu,r=Yf(e.id),i=Math.max(Du,r.length),a=jp(e.x,e.y,n,i);Q.save(),Q.beginPath(),a.forEach((e,t)=>{t===0?Q.moveTo(e.x,e.y):Q.lineTo(e.x,e.y)}),Q.closePath(),Q.fillStyle=t?`#111827`:`#ffffff`,Q.strokeStyle=`#0f172a`,Q.lineWidth=(t?3:2)/$.zoom,Q.shadowColor=`rgb(15 23 42 / 8%)`,Q.shadowBlur=e.kind===`system`?20:14,Q.shadowOffsetY=e.kind===`system`?8:5,Q.fill(),Q.shadowColor=`transparent`,Q.stroke(),Q.fillStyle=t?`#ffffff`:`#111827`,Q.textAlign=`center`,Q.textBaseline=`middle`,Q.font=e.kind===`system`?`800 21px Inter, system-ui, sans-serif`:`800 16px Inter, system-ui, sans-serif`,Np(e.label,e.x,e.y-8,n*1.32,e.kind===`system`?26:20),ap(e,t,n),Q.restore()}function ip(e){let t=e.id===$.selectedId,n=e.kind===`mcp`?116:Cu,r=e.kind===`mcp`?58:wu;Q.save(),Mp(e.x-n/2,e.y-r/2,n,r,20),Q.fillStyle=t?`#111827`:`#ffffff`,Q.strokeStyle=e.kind===`mcp`?`#276ef1`:`#0f172a`,Q.lineWidth=(t?3:2)/$.zoom,Q.fill(),Q.stroke(),Q.fillStyle=t?`#ffffff`:`#111827`,Q.font=`760 15px Inter, system-ui, sans-serif`,Q.textAlign=`center`,Q.textBaseline=`middle`,Np(e.label,e.x,e.y,n*.78,18),ap(e,t,Math.max(n,r)/2),Q.restore()}function ap(e,t,n){t&&(Q.beginPath(),Q.arc(e.x+n*.62,e.y-n*.66,5,0,Math.PI*2),Q.fillStyle=`#34d399`,Q.fill())}function op(e,t){if(!Kf())return;let n=wp(e),r=Math.min(Nu,t-118),i=e-n-24,a=Math.max(24,(t-r)/2);try{let e=Q.drawElementImage(Md,i,a,n,r);Md.style.transform=e.toString()}catch{cd.textContent=`Waiting for HTML snapshot`}}function sp(e,t){let n=sd.clientWidth,r=sd.clientHeight,i=Kf()?wp(n)+Pu:0,a=Math.max(360,n-i),o=pp(),s=mp(o,a,r),c=t?s:Math.min($.zoom,s),l=(o.minX+o.maxX)/2,u=(o.minY+o.maxY)/2,d=a*.5-l*c,f=r*.5-u*c;if(!e||!$.cameraX||!$.cameraY){hp(),$.cameraX=d,$.cameraY=f,$.zoom=c,$.panelShiftX=i;return}$.panelShiftX=i,fp(d,f,c)}function cp(e,t,n){if(t){if(e){let e=lp();$.panelShiftX+=Math.max(0,-e),dp(e,n)}else{let e=Kf();if(e){let t=wp(sd.clientWidth)+Pu,n=(sd.clientWidth-t)/2-e.x*$.zoom,r=n-$.cameraX;$.panelShiftX=-r,fp(n,$.cameraY,$.zoom)}}return}if(!e)return;let r=$.panelShiftX;$.panelShiftX=0,dp(r,n)}function lp(){let e=Kf();if(!e)return 0;let t=sd.clientWidth-wp(sd.clientWidth)-24-Wu,n=up(e);return n.right<=t?0:t-n.right}function up(e){let t=Dp(e);return{left:t.left*$.zoom+$.cameraX,top:t.top*$.zoom+$.cameraY,right:t.right*$.zoom+$.cameraX,bottom:t.bottom*$.zoom+$.cameraY}}function dp(e,t){if(hp(),!e)return;let n=$.cameraX+e;if(!t){$.cameraX=n;return}fp(n,$.cameraY,$.zoom)}function fp(e,t,n){hp();let r=$.cameraX,i=$.cameraY,a=$.zoom,o=performance.now();function s(c){let l=Math.min(1,(c-o)/Hu),u=1-(1-l)**3;$.cameraX=r+(e-r)*u,$.cameraY=i+(t-i)*u,$.zoom=a+(n-a)*u,ff(),Zf(),l<1?$.viewAnimationId=requestAnimationFrame(s):$.viewAnimationId=null}$.viewAnimationId=requestAnimationFrame(s)}function pp(){return $.entities.reduce((e,t)=>{let n=Cf(t);return{minX:Math.min(e.minX,t.x-n),minY:Math.min(e.minY,t.y-n),maxX:Math.max(e.maxX,t.x+n),maxY:Math.max(e.maxY,t.y+n)}},{minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0})}function mp(e,t,n){let r=e.maxX-e.minX,i=e.maxY-e.minY;if(!Number.isFinite(r)||!Number.isFinite(i)||r<=0||i<=0)return 1;let a=Math.max(1,t-Uu*2),o=Math.max(1,n-Uu*2);return vp(Math.min(1,a/r,o/i),Ku,1)}function hp(){$.viewAnimationId&&(cancelAnimationFrame($.viewAnimationId),$.viewAnimationId=null)}function gp(e,t){hp();let n=_p(e);$.zoom=vp($.zoom*t,Ku,qu),$.cameraX=e.x-n.x*$.zoom,$.cameraY=e.y-n.y*$.zoom,Zf()}function _p(e){return{x:(e.x-$.cameraX)/$.zoom,y:(e.y-$.cameraY)/$.zoom}}function vp(e,t,n){return Math.min(n,Math.max(t,e))}function yp(e,t){if(e.kind!==`system`&&e.kind!==`llm`)return Sp(e,t);let n=e.kind===`system`?Tu:Eu,r=Yf(e.id);return bp(e,n,Math.max(Du,r.length),t)||{x:e.x+Math.cos(t)*n,y:e.y+Math.sin(t)*n}}function bp(e,t,n,r){let i={x:Math.cos(r),y:Math.sin(r)},a=jp(e.x,e.y,t,n),o=null;for(let t=0;t<a.length;t+=1){let n=a[t],r=a[(t+1)%a.length],s={x:r.x-n.x,y:r.y-n.y},c={x:n.x-e.x,y:n.y-e.y},l=xp(i,s);if(Math.abs(l)<1e-4)continue;let u=xp(c,s)/l,d=xp(c,i)/l;if(u>=0&&d>=0&&d<=1){let t={x:e.x+i.x*u,y:e.y+i.y*u};(!o||u<o.rayDistance)&&(o={...t,rayDistance:u})}}return o?{x:o.x,y:o.y}:null}function xp(e,t){return e.x*t.y-e.y*t.x}function Sp(e,t){let n=Tp(e),r=n.width/2,i=n.height/2,a=Math.cos(t),o=Math.sin(t),s=Math.min(Math.abs(r/(a||2**-52)),Math.abs(i/(o||2**-52)));return{x:e.x+a*s,y:e.y+o*s}}function Cp(e,t){if(e.kind===`system`||e.kind===`llm`){let n=e.kind===`system`?Tu:Eu;return Math.hypot(t.x-e.x,t.y-e.y)<=n+Vu}let{width:n,height:r}=Tp(e);return Math.abs(t.x-e.x)<=n/2+Vu&&Math.abs(t.y-e.y)<=r/2+Vu}function wp(e){return Math.min(ju,Math.max(Au,Math.floor(e*Mu)))}function Tp(e){return e.kind===`mcp`?{width:116,height:58}:{width:Cu,height:wu}}function Ep(e){return[e,...Xf(e.id).map(qf)].filter(Boolean).map(Dp).reduce(Op)}function Dp(e){if(e.kind===`system`||e.kind===`llm`){let t=e.kind===`system`?Tu:Eu;return{left:e.x-t,top:e.y-t,right:e.x+t,bottom:e.y+t}}let{width:t,height:n}=Tp(e);return{left:e.x-t/2,top:e.y-n/2,right:e.x+t/2,bottom:e.y+n/2}}function Op(e,t){return{left:Math.min(e.left,t.left),top:Math.min(e.top,t.top),right:Math.max(e.right,t.right),bottom:Math.max(e.bottom,t.bottom)}}function kp(e,t,n){return!(e.right+n<t.left||e.left-n>t.right||e.bottom+n<t.top||e.top-n>t.bottom)}function Ap(e){let t=sd.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}function jp(e,t,n,r){return Array.from({length:r},(i,a)=>{let o=-Math.PI/2+a/r*Math.PI*2;return{x:e+Math.cos(o)*n,y:t+Math.sin(o)*n}})}function Mp(e,t,n,r,i){let a=e+n,o=t+r;Q.beginPath(),Q.moveTo(e+i,t),Q.lineTo(a-i,t),Q.quadraticCurveTo(a,t,a,t+i),Q.lineTo(a,o-i),Q.quadraticCurveTo(a,o,a-i,o),Q.lineTo(e+i,o),Q.quadraticCurveTo(e,o,e,o-i),Q.lineTo(e,t+i),Q.quadraticCurveTo(e,t,e+i,t),Q.closePath()}function Np(e,t,n,r,i){let a=e.split(/\s+/),o=[],s=``;for(let e of a){let t=s?`${s} ${e}`:e;Q.measureText(t).width>r&&s?(o.push(s),s=e):s=t}o.push(s);let c=n-(o.length-1)*i/2;o.forEach((e,n)=>{Q.fillText(e,t,c+n*i)})}function Pp(e,t,n,r){Q.beginPath(),Q.moveTo(e,t),Q.lineTo(n,r),Q.stroke()}var Fp=W(`<div class="status-row"><span id="apiStatus"></span></div>`),Ip=W('<div class="app-shell"><!> <section class="workspace-shell" aria-label="Configuration graph workspace"><nav class="rail" aria-label="Workspace tools"><button id="addButton" class="tool-button primary" type="button" title="Add node">+</button> <button id="fitButton" class="tool-button" type="button" title="Fit view">⌖</button></nav> <canvas id="workspaceCanvas" class="workspace-canvas" layoutsubtree=""><form id="configSurface" class="config-surface" autocomplete="off"><div class="panel-kicker"><span id="nodeTypeBadge">Provider</span> <button id="closePanelButton" class="icon-button close" type="button" title="Close panel">×</button></div> <div class="panel-title-row"><label class="eyebrow" for="nodeName">Node name</label> <input id="nodeName" name="nodeName" class="title-input" type="text"/></div> <div class="form-grid"><label class="field"><span>Kind</span> <select id="nodeKind" name="nodeKind"><option>System</option><option>LLM provider</option><option>Agent</option><option>MCP</option></select></label> <div id="llmFields" class="contents"><label class="field wide"><span>Endpoint</span> <input id="nodeEndpoint" name="nodeEndpoint" type="url" placeholder="http://localhost:11434"/></label> <label class="field wide"><span>API token</span> <input id="nodeToken" name="nodeToken" type="text" autocomplete="off" spellcheck="false" placeholder="env:LLM_API_KEY"/> <small class="field-note">Reference an environment variable only — <code>env:VAR_NAME</code> (or <code>{VAR_NAME}</code>). The secret is read from the server environment at request time; literal tokens are not stored (the workspace file is tracked by git).</small></label> <div class="field wide model-field-row"><span>Model</span> <div class="model-select-wrap"><select id="nodeModel" name="nodeModel"><option disabled="" selected="">— click ↻ to load models —</option></select> <button id="loadModelsButton" class="icon-button" type="button" title="Load models from endpoint">↻</button></div></div> <label class="field"><span>Timeout</span> <input id="nodeTimeout" name="nodeTimeout" type="number" min="1" max="600" step="1"/></label></div> <label class="field wide"><span>Description</span> <textarea id="nodeDescription" name="nodeDescription" rows="3"></textarea></label></div> <section id="agentSection" class="agent-section" hidden=""><label id="agentWorkspaceField" class="field wide"><span>Workspace folder</span> <input id="nodeWorkspaceFolder" name="nodeWorkspaceFolder" type="text" readonly=""/></label> <label class="field wide"><span>System prompt</span> <textarea id="nodeSystemPrompt" name="nodeSystemPrompt" rows="5" placeholder="You are a helpful assistant…"></textarea></label> <label class="field wide checkbox-field"><input id="nodeRequiresUserInput" name="nodeRequiresUserInput" type="checkbox"/> <span>Require a user input</span></label> <label id="agentUserInputDescriptionField" class="field wide" hidden=""><span>Describe User input</span> <textarea id="nodeUserInputDescription" name="nodeUserInputDescription" rows="3" placeholder="Describe exactly what the user must provide before running this agent."></textarea></label> <label class="field wide"><span>Required output marker</span> <input id="nodeExpectedOutputMarker" name="nodeExpectedOutputMarker" type="text" placeholder="Optional, e.g. ```mermaid"/></label></section> <section id="mcpInventory" class="mcp-inventory" hidden=""><div class="inventory-header"><span>MCP consultation surface</span> <strong>Streamable HTTP</strong></div> <div class="inventory-grid"><article><h2>Tools</h2> <ul><li>list_documents</li><li>read_document</li><li>create_document</li> <li>update_document</li><li>list_diagrams</li><li>read_diagram</li> <li>create_diagram</li><li>list_source_files</li><li>read_source_file</li> <li>search_source</li><li>add_metadata</li><li>refresh_metadata</li> <li>get_accuracy</li><li>review_adr_relevance</li><li>retrodocument_adrs_from_git</li></ul></article> <article><h2>Prompts</h2> <ul><li>audit-adrs-drift</li><li>review-adr-relevance</li> <li>retrodocument-adrs-from-git</li><li>erd</li> <li>feature-workflow</li><li>create-context-diagram</li> <li>create-container-diagram</li><li>document-source-decision</li></ul></article></div></section> <footer class="panel-actions"><div class="panel-actions-left"><button id="testNodeButton" class="secondary-button" type="button">Test</button></div> <div class="panel-actions-right"><button id="deleteNodeButton" class="danger-button" type="button">Delete</button></div></footer></form></canvas> <div id="fallbackPanelHost" class="fallback-panel-host" hidden=""></div></section> <div id="deleteConfirmOverlay" class="confirm-overlay" hidden=""><section class="confirm-dialog" role="dialog" aria-modal="true" aria-labelledby="deleteConfirmTitle"><div><p class="confirm-kicker">Destructive change</p> <h2 id="deleteConfirmTitle">Delete node?</h2> <p id="deleteConfirmMessage" class="confirm-message"></p></div> <footer class="confirm-actions"><button id="cancelDeleteButton" class="secondary-button" type="button">Cancel</button> <button id="confirmDeleteButton" class="danger-button" type="button">Delete</button></footer></section></div> <div id="renameConfirmOverlay" class="confirm-overlay" hidden=""><section class="confirm-dialog" role="dialog" aria-modal="true" aria-labelledby="renameConfirmTitle"><div><p class="confirm-kicker">Renommage de dossier</p> <h2 id="renameConfirmTitle">Renommer le dossier ?</h2> <p id="renameConfirmMessage" class="confirm-message"></p></div> <footer class="confirm-actions"><button id="cancelRenameButton" class="secondary-button" type="button">Annuler</button> <button id="confirmRenameButton" class="primary-button" type="button">Renommer</button></footer></section></div> <div id="agentRunOverlay" class="confirm-overlay" hidden=""><section class="agent-run-dialog" role="dialog" aria-modal="true" aria-labelledby="agentRunTitle"><div><p class="confirm-kicker">Agent test</p> <h2 id="agentRunTitle">Run agent</h2> <p id="agentRunHint" class="confirm-message"></p></div> <label id="agentRunInputField" class="field wide agent-run-input-field"><span>User input</span> <textarea id="agentRunInput" name="agentRunInput" rows="6" placeholder="Document ID, question, or any input for the agent…"></textarea></label> <div id="agentRunResult" class="agent-run-result" hidden=""></div> <footer class="confirm-actions"><button id="cancelAgentRunButton" class="secondary-button" type="button">Close</button> <button id="executeAgentRunButton" class="primary-button" type="button">Run</button></footer></section></div></div>');function Lp(e,t){Ge(t,!0),Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}return Bd()});var n=Ip(),r=R(n);Ja(r,{title:`Living AI Documentation`,subtitle:`Graph-native configuration workspace`,children:(e,t)=>{var n=Fp(),r=R(n);hi(r,1,`status-pill `),r.textContent=`Detecting canvas API`,N(n),G(e,n)},$$slots:{default:!0}});var i=B(r,2),a=B(R(i),2),o=R(a),s=B(R(o),4),c=R(s),l=B(R(c),2),u=R(l);u.value=u.__value=`system`;var d=B(u);d.value=d.__value=`llm`;var f=B(d);f.value=f.__value=`agent`;var p=B(f);p.value=p.__value=`mcp`,N(l),N(c);var m=B(c,2),h=B(R(m),4),g=B(R(h),2),_=R(g),v=R(_);v.value=v.__value=``,N(_),Pe(2),N(g),N(h),Pe(2),N(m),Pe(2),N(s),Pe(6),N(o),N(a),Pe(2),N(i),Pe(6),N(n),G(e,n),Ke()}var Rp=W(`<p class="files-msg svelte-4q2lov"> </p>`),zp=W(`<p class="files-msg files-msg--error svelte-4q2lov"> </p>`),Bp=W(`<p class="files-msg files-msg--empty svelte-4q2lov"> </p>`),Vp=W(`<option> </option>`),Hp=W(`<div class="files-toolbar svelte-4q2lov"><label for="files-folder-filter" class="svelte-4q2lov"> </label> <select id="files-folder-filter" data-testid="files-folder-filter" class="svelte-4q2lov"><option> </option><!></select></div>`),Up=W(`<span class="files-folder svelte-4q2lov"> </span> ·`,1),Wp=W(`<p class="files-row-error svelte-4q2lov"> </p>`),Gp=W(`<li class="files-row svelte-4q2lov"><span class="files-icon svelte-4q2lov">📎</span> <div class="files-info svelte-4q2lov"><a target="_blank" rel="noopener" class="files-name svelte-4q2lov"> </a> <div class="files-meta svelte-4q2lov"><!><!> </div> <!></div> <div class="files-actions svelte-4q2lov"><button type="button" class="files-btn svelte-4q2lov"> </button> <button type="button" class="files-btn files-btn--danger svelte-4q2lov"> </button></div></li>`),Kp=W(`<ul class="files-list svelte-4q2lov"></ul>`),qp=W(`<!> <!>`,1),Jp=W(`<!> <div class="app-shell"><!> <div class="files-page svelte-4q2lov"><!></div></div>`,1);function Yp(e,t){Ge(t,!0);let n=F(null),r=F(L([])),i=F(L([])),a=F(``),o=F(!0),s=F(``),c=F(L({})),l=F(L({})),u=F(L({})),d=P(()=>H(a)?H(r).filter(e=>e.folder===H(a)||e.folder.startsWith(H(a)+`/`)):H(r));function f(e){return e<1024?X(`files.size_bytes`).replace(`{n}`,String(e)):e<1024*1024?X(`files.size_kb`).replace(`{n}`,(e/1024).toFixed(1)):X(`files.size_mb`).replace(`{n}`,(e/1024/1024).toFixed(2))}function p(e){if(!e)return``;let t=new Date(e);if(isNaN(t.getTime()))return``;let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}async function m(){I(o,!0),I(s,``);try{let e=await fetch(`/api/files`);if(!e.ok)throw Error(`HTTP ${e.status}`);let t=await e.json();I(r,Array.isArray(t.files)?t.files:[],!0),I(i,Array.isArray(t.folders)?t.folders:[],!0),H(a)&&!H(i).includes(H(a))&&I(a,``)}catch(e){I(s,X(`files.error_load`)+(e instanceof Error?e.message:String(e)))}finally{I(o,!1)}}function h(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(r.result),r.onerror=n,r.readAsDataURL(e)})}function g(e){let t=document.createElement(`input`);t.type=`file`,t.style.display=`none`,document.body.appendChild(t),t.addEventListener(`change`,async()=>{let r=t.files?.[0];if(t.remove(),r&&await H(n).show({kicker:X(`files.confirm_replace_title`),title:X(`files.confirm_replace_message`).replace(`{name}`,e.displayName||e.filename).replace(`{newName}`,r.name),message:X(`files.confirm_replace_detail`),confirmLabel:X(`files.replace`),cancelLabel:X(`common.cancel`),danger:!0})){if(r.size>19922944){I(c,{...H(c),[e.filename]:X(`files.error_replace`)+`${(r.size/1024/1024).toFixed(1)} MB (max 19 MB)`},!0);return}I(l,{...H(l),[e.filename]:!0},!0),I(c,{...H(c),[e.filename]:``},!0);try{let t=await h(r),n=await fetch(`/api/files/${encodeURIComponent(e.filename)}`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:t})});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error||`HTTP ${n.status}`)}await m()}catch(t){I(c,{...H(c),[e.filename]:X(`files.error_replace`)+(t instanceof Error?t.message:String(t))},!0)}finally{I(l,{...H(l),[e.filename]:!1},!0)}}}),t.click()}async function _(e){if(await H(n).show({kicker:X(`files.confirm_delete_title`),title:X(`files.confirm_delete_message`).replace(`{name}`,e.displayName||e.filename),message:X(`files.confirm_delete_detail`),confirmLabel:X(`files.delete`),cancelLabel:X(`common.cancel`),danger:!0})){I(u,{...H(u),[e.filename]:!0},!0),I(c,{...H(c),[e.filename]:``},!0);try{let t=await fetch(`/api/files/${encodeURIComponent(e.filename)}`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error||`HTTP ${t.status}`)}await m()}catch(t){I(c,{...H(c),[e.filename]:X(`files.error_delete`)+(t instanceof Error?t.message:String(t))},!0)}finally{I(u,{...H(u),[e.filename]:!1},!0)}}}Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}await m()});var v=Jp(),y=z(v);Li(wl(y,{}),e=>I(n,e,!0),()=>H(n));var b=B(y,2),x=R(b);{let e=P(()=>X(`files.title`));Ja(x,{get title(){return H(e)},subtitle:``})}var S=B(x,2),C=R(S),w=e=>{var t=Rp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},T=e=>{var t=zp(),n=R(t,!0);N(t),V(()=>K(n,H(s))),G(e,t)},E=e=>{var t=Bp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`files.empty`)]),G(e,t)},D=e=>{var t=qp(),n=z(t),r=e=>{var t=Hp(),n=R(t),r=R(n,!0);N(n);var o=B(n,2),s=R(o),c=R(s,!0);N(s),s.value=s.__value=``,J(B(s),16,()=>H(i),e=>e,(e,t)=>{var n=Vp(),r=R(n,!0);N(n);var i={};V(()=>{K(r,t),i!==(i=t)&&(n.value=(n.__value=t)??``)}),G(e,n)}),N(o);var l;yi(o),N(t),V((e,t)=>{K(r,e),K(c,t),l!==(l=H(a))&&(o.value=(o.__value=H(a))??``,vi(o,H(a)))},[()=>X(`files.filter_label`),()=>X(`files.filter_all`)]),U(`change`,o,e=>I(a,e.target.value,!0)),G(e,t)};q(n,e=>{H(i).length>0&&e(r)});var o=B(n,2),s=e=>{var t=Bp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`files.empty_filter`)]),G(e,t)},m=e=>{var t=Kp();J(t,21,()=>H(d),Yr,(e,t)=>{var n=Gp(),r=B(R(n),2),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o),d=e=>{var n=Up(),r=z(n),i=R(r,!0);N(r),Pe(),V(()=>K(i,H(t).folder)),G(e,n)};q(s,e=>{H(t).folder&&e(d)});var m=B(s),h=e=>{var n=Hr();V(e=>K(n,`${e??``} ·`),[()=>p(H(t).uploadedAt)]),G(e,n)};q(m,e=>{H(t).uploadedAt&&e(h)});var v=B(m,1,!0);N(o);var y=B(o,2),b=e=>{var n=Wp(),r=R(n,!0);N(n),V(()=>K(r,H(c)[H(t).filename])),G(e,n)};q(y,e=>{H(c)[H(t).filename]&&e(b)}),N(r);var x=B(r,2),S=R(x),C=R(S,!0);N(S);var w=B(S,2),T=R(w,!0);N(w),N(x),N(n),V((e,n,r)=>{Y(i,`href`,H(t).url),K(a,H(t).displayName||H(t).filename),K(v,e),S.disabled=H(l)[H(t).filename]||H(u)[H(t).filename],K(C,n),w.disabled=H(l)[H(t).filename]||H(u)[H(t).filename],K(T,r)},[()=>f(H(t).size||0),()=>H(l)[H(t).filename]?X(`files.replacing`):X(`files.replace`),()=>H(u)[H(t).filename]?X(`files.deleting`):X(`files.delete`)]),U(`click`,S,()=>g(H(t))),U(`click`,w,()=>_(H(t))),G(e,n)}),N(t),G(e,t)};q(o,e=>{H(d).length===0?e(s):e(m,-1)}),G(e,t)};q(C,e=>{H(o)?e(w):H(s)?e(T,1):H(r).length===0?e(E,2):e(D,-1)}),N(S),N(b),G(e,v),Ke()}Nr([`change`,`click`]);var Xp=W(`<p class="browser-msg"> </p>`),Zp=W(`<p class="browser-msg browser-msg--error"> </p>`),Qp=W(`<button class="browser-row browser-row--dir"><span class="browser-row-name"> </span></button>`),$p=W(`<span class="badge-added"> </span>`),em=W(`<button class="link-btn"> </button>`),tm=W(`<div class="browser-row browser-row--file"><span class="browser-row-name"> </span> <!></div>`),nm=W(`<!> <!>`,1),rm=W(`<div class="file-browser"><div class="file-browser-toolbar"><button class="link-btn"> </button> <span class="file-browser-path"> </span></div> <div class="file-browser-list" data-testid="instruction-browse-list"><!></div></div>`),im=W(`<p class="empty-msg svelte-e5jhdq"> </p>`),am=W(`<button class="remove-btn"> </button>`),om=W(`<div class="instruction-row svelte-e5jhdq"><div class="instruction-info svelte-e5jhdq"><a class="instruction-path svelte-e5jhdq"> </a> <div class="instruction-meta svelte-e5jhdq"> <!></div></div> <div class="instruction-actions svelte-e5jhdq"><span> </span> <!></div></div>`),sm=W(`<div class="section-card svelte-e5jhdq"><div class="section-header svelte-e5jhdq"><span class="section-title svelte-e5jhdq"> </span> <div class="header-actions svelte-e5jhdq"><span class="count-label svelte-e5jhdq"> </span> <button class="secondary-button btn-sm"> </button></div></div> <!> <div class="instruction-list svelte-e5jhdq" data-testid="instruction-list"><!></div></div>`);function cm(e,t){Ge(t,!0);let n=Bi(t,`items`,27,()=>L([])),r=F(!1),i=F(``),a=F(``),o=F(L([])),s=F(L([])),c=F(!1),l=F(!1),u=P(()=>new Set(n().map(e=>d(e.path))));function d(e){return String(e||``).split(/[/\\]/).pop()||``}function f(e){let t=encodeURIComponent(String(e||``).replace(/\.md$/i,``));return`/?doc=`+encodeURIComponent(t)}function p(e){return X(`context.root.${e}`)}function m(e){return X(`context.type.${e}`)}async function h(e){I(c,!0),I(l,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(i,t.current,!0),I(a,t.parent||``,!0),I(o,t.dirs||[],!0),I(s,t.files||[],!0)}catch{I(l,!0)}finally{I(c,!1)}}async function g(){I(r,!H(r)),H(r)&&!H(i)&&await h((await fetch(`/api/context/orientation`).then(e=>e.json()).catch(()=>({}))).sourceRoot||``)}async function _(e){await t.onAdd(e),H(r)&&H(i)&&await h(H(i))}var v=sm(),y=R(v),b=R(y),x=R(b,!0);N(b);var S=B(b,2),C=R(S),w=R(C);N(C);var T=B(C,2),E=R(T,!0);N(T),N(S),N(y);var D=B(y,2),ee=e=>{var t=rm(),n=R(t),r=R(n),d=R(r,!0);N(r);var f=B(r,2),p=R(f,!0);N(f),N(n);var m=B(n,2),g=R(m),v=e=>{var t=Xp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},y=e=>{var t=Zp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.cannot_read_dir`)]),G(e,t)},b=e=>{var t=Xp(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.empty_dir`)]),G(e,t)},x=e=>{var t=nm(),n=z(t);J(n,17,()=>H(o),Yr,(e,t)=>{var n=Qp(),r=R(n),i=R(r);N(r),N(n),V(()=>K(i,`📁 ${H(t).name??``}`)),U(`click`,n,()=>h(H(t).path)),G(e,n)}),J(B(n,2),17,()=>H(s),Yr,(e,t)=>{var n=tm(),r=R(n),i=R(r);N(r);var a=B(r,2),o=e=>{var t=$p(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`context.added`)]),G(e,t)},s=P(()=>H(u).has(H(t).name)),c=e=>{var n=em(),r=R(n,!0);N(n),V(e=>K(r,e),[()=>X(`context.add_file_action`)]),U(`click`,n,()=>_(H(t).path)),G(e,n)};q(a,e=>{H(s)?e(o):e(c,-1)}),N(n),V(()=>K(i,`📄 ${H(t).name??``}`)),G(e,n)}),G(e,t)};q(g,e=>{H(c)?e(v):H(l)?e(y,1):!H(o).length&&!H(s).length?e(b,2):e(x,-1)}),N(m),N(t),V(e=>{r.disabled=!H(a),K(d,e),K(p,H(i))},[()=>X(`common.up`)]),U(`click`,r,()=>H(a)&&h(H(a))),G(e,t)};q(D,e=>{H(r)&&e(ee)});var O=B(D,2),k=R(O),A=e=>{var t=im(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`context.no_instructions`)]),G(e,t)},te=e=>{var r=Ur();J(z(r),17,n,Yr,(e,n)=>{var r=om(),i=R(r),a=R(i),o=R(a,!0);N(a);var s=B(a,2),c=R(s),l=B(c),u=e=>{var t=Hr();V(e=>K(t,`· ${e??``} KB`),[()=>Math.round(H(n).size/1024)]),G(e,t)};q(l,e=>{H(n).size!==null&&e(u)}),N(s),N(i);var h=B(i,2),g=R(h),_=R(g,!0);N(g);var v=B(g,2),y=e=>{var r=am(),i=R(r,!0);N(r),V(e=>K(i,e),[()=>X(`common.remove`)]),U(`click`,r,()=>t.onRemove(d(H(n).path))),G(e,r)};q(v,e=>{H(n).exists&&e(y)}),N(h),N(r),V((e,t,r,i)=>{Y(a,`href`,e),K(o,H(n).path),K(c,`${t??``} · ${r??``} `),hi(g,1,li(H(n).exists?`status-ok`:`status-missing`),`svelte-e5jhdq`),K(_,i)},[()=>f(H(n).path),()=>p(H(n).root),()=>m(H(n).type),()=>H(n).exists?X(`context.exists`):X(`context.missing`)]),G(e,r)}),G(e,r)};q(k,e=>{n().length?e(te,-1):e(A)}),N(O),N(v),V((e,t,r)=>{K(x,e),K(w,`${t??``}/${n().length??``}`),K(E,r)},[()=>X(`context.instructions_title`),()=>n().filter(e=>e.exists).length,()=>H(r)?X(`context.hide_instruction_browser`):X(`context.add_instruction_file`)]),U(`click`,T,g),G(e,v),Ke()}Nr([`click`]);var lm=W(`<span class="rules-folder svelte-1r3tey2"> </span>`),um=W(`<p class="empty-msg svelte-1r3tey2"> </p>`),dm=W(`<span class="tag svelte-1r3tey2"> </span>`),fm=W(`<div class="rule-tags svelte-1r3tey2"></div>`),pm=W(`<div class="rule-applies svelte-1r3tey2"> </div>`),mm=W(`<article class="rule-row svelte-1r3tey2"><div class="rule-top svelte-1r3tey2"><div class="rule-title-wrap svelte-1r3tey2"><h3 class="rule-title svelte-1r3tey2"><a class="rule-link svelte-1r3tey2"> </a></h3> <a class="rule-path svelte-1r3tey2"> </a></div> <span class="severity-badge svelte-1r3tey2"> </span></div> <p class="rule-desc svelte-1r3tey2"> </p> <!> <!></article>`),hm=W(`<div class="rules-layout svelte-1r3tey2"><div class="section-card svelte-1r3tey2"><div class="section-header svelte-1r3tey2"><span class="section-title svelte-1r3tey2" data-testid="rules-title"> </span> <!></div> <div class="rule-list svelte-1r3tey2" data-testid="rule-list"><!></div></div> <div class="section-card aside-card svelte-1r3tey2"><span class="section-title svelte-1r3tey2" data-testid="add-rule-title"> </span> <div class="field-group"><label class="field-label" for="ruleTitle"> </label> <input id="ruleTitle" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleSeverity"> </label> <select id="ruleSeverity" class="field-input"><option> </option><option> </option><option> </option></select></div> <div class="field-group"><label class="field-label" for="ruleDescription"> </label> <input id="ruleDescription" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleTags"> </label> <input id="ruleTags" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleAppliesTo"> </label> <input id="ruleAppliesTo" class="field-input"/></div> <div class="field-group"><label class="field-label" for="ruleBody"> </label> <textarea id="ruleBody" rows="7" class="field-input"></textarea></div> <button class="btn-primary" style="width:100%"> </button></div></div>`);function gm(e,t){Ge(t,!0);let n=Bi(t,`rules`,19,()=>[]),r=Bi(t,`rulesFolder`,3,``),i=F(``),a=F(`guideline`),o=F(``),s=F(``),c=F(``),l=F(``),u=F(!1);function d(e){let t=encodeURIComponent(String(e||``).replace(/\.md$/i,``));return`/?doc=`+encodeURIComponent(t)}function f(e){let t=`context.rule_severity_${e}`,n=X(t);return n===t?e:n}function p(e){return e.split(`,`).map(e=>e.trim()).filter(Boolean)}async function m(){if(H(i).trim()){I(u,!0);try{await t.onAdd({title:H(i).trim(),severity:H(a),description:H(o).trim(),tags:p(H(s)),appliesTo:p(H(c)),body:H(l).trim()}),I(i,``),I(o,``),I(s,``),I(c,``),I(l,``)}finally{I(u,!1)}}}var h=hm(),g=R(h),_=R(g),v=R(_),y=R(v,!0);N(v);var b=B(v,2),x=e=>{var t=lm(),n=R(t,!0);N(t),V(()=>K(n,r())),G(e,t)};q(b,e=>{r()&&e(x)}),N(_);var S=B(_,2),C=R(S),w=e=>{var t=um(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`context.no_rules`)]),G(e,t)},T=e=>{var t=Ur();J(z(t),17,n,Yr,(e,t)=>{var n=mm(),r=R(n),i=R(r),a=R(i),o=R(a),s=R(o,!0);N(o),N(a);var c=B(a,2),l=R(c,!0);N(c),N(i);var u=B(i,2),p=R(u,!0);N(u),N(r);var m=B(r,2),h=R(m,!0);N(m);var g=B(m,2),_=e=>{var n=fm();J(n,21,()=>H(t).tags,Yr,(e,t)=>{var n=dm(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(n),G(e,n)};q(g,e=>{H(t).tags?.length&&e(_)});var v=B(g,2),y=e=>{var n=pm(),r=R(n,!0);N(n),V(e=>K(r,e),[()=>H(t).appliesTo.join(`, `)]),G(e,n)};q(v,e=>{H(t).appliesTo?.length&&e(y)}),N(n),V((e,n,r)=>{Y(o,`href`,e),K(s,H(t).title),Y(c,`href`,n),K(l,H(t).path),K(p,r),K(h,H(t).description)},[()=>d(H(t).path),()=>d(H(t).path),()=>f(H(t).severity)]),G(e,n)}),G(e,t)};q(C,e=>{n().length?e(T,-1):e(w)}),N(S),N(g);var E=B(g,2),D=R(E),ee=R(D,!0);N(D);var O=B(D,2),k=R(O),A=R(k,!0);N(k);var te=B(k,2);Ei(te),N(O);var ne=B(O,2),re=R(ne),ie=R(re,!0);N(re);var ae=B(re,2),oe=R(ae),se=R(oe,!0);N(oe),oe.value=oe.__value=`guideline`;var ce=B(oe),le=R(ce,!0);N(ce),ce.value=ce.__value=`warning`;var ue=B(ce),de=R(ue,!0);N(ue),ue.value=ue.__value=`required`,N(ae),N(ne);var fe=B(ne,2),pe=R(fe),me=R(pe,!0);N(pe);var he=B(pe,2);Ei(he),N(fe);var ge=B(fe,2),_e=R(ge),ve=R(_e,!0);N(_e);var ye=B(_e,2);Ei(ye),N(ge);var be=B(ge,2),xe=R(be),Se=R(xe,!0);N(xe);var j=B(xe,2);Ei(j),N(be);var Ce=B(be,2),M=R(Ce),we=R(M,!0);N(M);var Te=B(M,2);vn(Te),N(Ce);var Ee=B(Ce,2),De=R(Ee,!0);N(Ee),N(E),N(h),V((e,t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_)=>{K(y,e),K(ee,t),K(A,n),Y(te,`placeholder`,r),K(ie,i),K(se,a),K(le,o),K(de,s),K(me,c),Y(he,`placeholder`,l),K(ve,u),Y(ye,`placeholder`,d),K(Se,f),Y(j,`placeholder`,p),K(we,m),Y(Te,`placeholder`,h),Ee.disabled=g,K(De,_)},[()=>X(`context.rules_title`),()=>X(`context.add_rule_title`),()=>X(`context.rule_title_label`),()=>X(`context.rule_title_placeholder`),()=>X(`context.rule_severity_label`),()=>X(`context.rule_severity_guideline`),()=>X(`context.rule_severity_warning`),()=>X(`context.rule_severity_required`),()=>X(`context.rule_description_label`),()=>X(`context.rule_description_placeholder`),()=>X(`context.rule_tags_label`),()=>X(`context.rule_tags_placeholder`),()=>X(`context.rule_applies_to_label`),()=>X(`context.rule_applies_to_placeholder`),()=>X(`context.rule_body_label`),()=>X(`context.rule_body_placeholder`),()=>H(u)||!H(i).trim(),()=>X(`context.add_rule_button`)]),Mi(te,()=>H(i),e=>I(i,e)),bi(ae,()=>H(a),e=>I(a,e)),Mi(he,()=>H(o),e=>I(o,e)),Mi(ye,()=>H(s),e=>I(s,e)),Mi(j,()=>H(c),e=>I(c,e)),Mi(Te,()=>H(l),e=>I(l,e)),U(`click`,Ee,m),G(e,h),Ke()}Nr([`click`]);var _m=W(`<p class="empty-msg svelte-1ui2b6s"> </p>`),vm=W(`<p class="mcp-desc svelte-1ui2b6s"> </p>`),ym=W(`<div class="mcp-schema-wrap svelte-1ui2b6s"><h4 class="mcp-schema-title svelte-1ui2b6s"> </h4> <pre class="mcp-schema-pre svelte-1ui2b6s"> </pre></div>`),bm=W(`<div class="mcp-result svelte-1ui2b6s" data-testid="mcp-result"></div>`),xm=W(`<details class="mcp-detail svelte-1ui2b6s"><summary class="mcp-summary svelte-1ui2b6s"> </summary> <!> <!> <div class="mcp-run-area svelte-1ui2b6s"><label class="mcp-run-label svelte-1ui2b6s"> </label> <textarea rows="4" spellcheck="false" class="field-input mcp-textarea svelte-1ui2b6s" data-testid="mcp-args"></textarea> <div class="mcp-run-footer svelte-1ui2b6s"><span class="mcp-error-text svelte-1ui2b6s" data-testid="mcp-error"> </span> <button class="btn-primary btn-sm"> </button></div> <!></div></details>`),Sm=W(`<p class="mcp-arg-desc svelte-1ui2b6s"> </p>`),Cm=W(`<li class="mcp-arg-item svelte-1ui2b6s"><div class="mcp-arg-name-row svelte-1ui2b6s"><span class="mcp-arg-name svelte-1ui2b6s"> </span> <span class="mcp-arg-req svelte-1ui2b6s"> </span></div> <!></li>`),wm=W(`<div class="mcp-schema-wrap svelte-1ui2b6s"><h4 class="mcp-schema-title svelte-1ui2b6s"> </h4> <ul class="mcp-args-list svelte-1ui2b6s"></ul></div>`),Tm=W(`<div class="section-card svelte-1ui2b6s"><div class="section-header svelte-1ui2b6s"><span class="section-title svelte-1ui2b6s" data-testid="mcp-title"> </span> <button class="secondary-button btn-sm"> </button></div> <p class="section-desc svelte-1ui2b6s"> </p> <div class="mcp-info-grid svelte-1ui2b6s"><div class="mcp-info-cell svelte-1ui2b6s"><div class="mcp-info-label svelte-1ui2b6s"> </div> <div> </div></div> <div class="mcp-info-cell svelte-1ui2b6s"><div class="mcp-info-label svelte-1ui2b6s"> </div> <div class="mcp-info-value mono svelte-1ui2b6s"> </div></div> <div class="mcp-info-cell wide svelte-1ui2b6s"><div class="mcp-info-label svelte-1ui2b6s"> </div> <div class="mcp-info-value mono break svelte-1ui2b6s" data-testid="mcp-endpoint"> </div></div></div> <div><div class="subsection-header svelte-1ui2b6s"><span class="subsection-title svelte-1ui2b6s"> </span> <div class="subsection-actions svelte-1ui2b6s"><span class="count-label svelte-1ui2b6s"> </span> <button class="secondary-button btn-sm"> </button></div></div> <div class="mcp-items svelte-1ui2b6s" data-testid="mcp-tool-list"><!></div></div> <div><div class="subsection-header svelte-1ui2b6s"><span class="subsection-title svelte-1ui2b6s"> </span> <div class="subsection-actions svelte-1ui2b6s"><span class="count-label svelte-1ui2b6s"> </span> <button class="secondary-button btn-sm"> </button></div></div> <div class="mcp-items svelte-1ui2b6s" data-testid="mcp-prompt-list"><!></div></div></div>`);function Em(e,t){Ge(t,!0);let n=F(`-`),r=F(!1),i=F(`-`),a=F(`-`),o=F(L([])),s=F(L([])),c=F(!1),l=F(L(new Map)),u=F(L(new Map));function d(e,t){let n=H(e===`tool`?l:u);return n.has(t)||n.set(t,{argsJson:`{}`,running:!1,error:``,resultHtml:``}),n.get(t)}function f(e,t,n){let r=H(e===`tool`?l:u).get(t)??{argsJson:`{}`,running:!1,error:``,resultHtml:``};e===`tool`?I(l,new Map(H(l)).set(t,{...r,...n}),!0):I(u,new Map(H(u)).set(t,{...r,...n}),!0)}function p(e){if(!e||typeof e!=`object`)return null;if(e.type===`string`)return``;if(e.type===`number`||e.type===`integer`)return 0;if(e.type===`boolean`)return!1;if(e.type===`array`)return[];if(e.type===`object`||e.properties){let t={},n=e.properties||{};return(Array.isArray(e.required)?e.required:[]).forEach(e=>{t[e]=p(n[e])??``}),t}return null}function m(e){let t=p(e.inputSchema)??{},n=JSON.stringify(t,null,2);I(l,new Map(H(l)).set(e.name,{argsJson:n,running:!1,error:``,resultHtml:``}),!0)}function h(e){let t={};(e.arguments||[]).forEach(e=>{e.required&&(t[e.name]=``)});let n=JSON.stringify(t,null,2);I(u,new Map(H(u)).set(e.name,{argsJson:n,running:!1,error:``,resultHtml:``}),!0)}function g(e){let t=e.match(/^data:\s*(\{.*\})\s*$/m);if(!t)throw Error(e.slice(0,300)||`No MCP response body`);return JSON.parse(t[1])}async function _(e,t,n){let r=await fetch(`/mcp`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json, text/event-stream`},body:JSON.stringify({jsonrpc:`2.0`,id:e,method:t,params:n})}),i=await r.text();if(!r.ok)throw Error(i||`HTTP ${r.status}`);return g(i)}async function v(){await _(1,`initialize`,{protocolVersion:`2025-03-26`,capabilities:{},clientInfo:{name:`living-ai-documentation-context`,version:`1.0.0`}})}function y(e){return"```json\n"+JSON.stringify(e,null,2).replaceAll("```","`\\`\\`")+"\n```"}function b(e){if(typeof e!=`string`)return y(e);try{return y(JSON.parse(e))}catch{return e}}function x(e){if(typeof e==`string`)return e;if(!e||typeof e!=`object`)return String(e??``);if(e.error)return y(e.error);let t=e.result;return!t||typeof t!=`object`?y(e):Array.isArray(t.messages)?t.messages.map(e=>`${e.role?`[${e.role}]`:``}\n${b(e.content?.text??e.content??e)}`.trim()).join(`
|
|
86
86
|
|
|
87
87
|
`):Array.isArray(t.content)?t.content.map(e=>e&&e.type===`text`&&typeof e.text==`string`?b(e.text):y(e)).join(`
|
|
88
88
|
|
|
@@ -104,7 +104,7 @@ Texte`};case`link`:return{text:Se(`snip-link-text`),textFallback:X(`snippet.link
|
|
|
104
104
|
<div id="ld-local-search-title" class="px-3 py-1.5 text-xs font-medium text-gray-500 dark:text-gray-400 border-b border-gray-100 dark:border-gray-800"></div>
|
|
105
105
|
<ol id="ld-local-search-list" class="max-h-40 overflow-y-auto divide-y divide-gray-100 dark:divide-gray-800 list-none m-0 p-0"></ol>
|
|
106
106
|
</div>`,t.appendChild(s),t.classList.remove(`hidden`);let c=s.querySelector(`#ld-local-search-input`),l=s.querySelector(`#ld-local-search-clear`),u=s.querySelector(`#ld-local-search-results`),d=s.querySelector(`#ld-local-search-title`),f=s.querySelector(`#ld-local-search-list`),p=null;function m(){e.querySelectorAll(`mark.ld-local-mark`).forEach(e=>{let t=e.parentNode;for(;e.firstChild;)t.insertBefore(e.firstChild,e);t.removeChild(e)}),e.normalize()}function h(e,t){let n=new Set;t.includes(e)&&n.add(e);let r=eg(e.length);if(r===0)return n;let a=e[0];for(let t of i)t!==e&&(Math.abs(t.length-e.length)>r||e.length>=3&&t[0]!==a||$h(e,t,r)<=r&&n.add(t));return n}function g(t){if(m(),!t){u.classList.add(`hidden`),l.classList.add(`hidden`),f.innerHTML=``;return}l.classList.remove(`hidden`);let r=Qh(t),i=r.split(` `).filter(Boolean);if(!i.length){u.classList.add(`hidden`);return}let a=Qh(e.textContent||``),o=i.map(e=>h(e,a));if(!o.some(e=>e.size>0)){d.textContent=n(`local_search.no_results`)||`No matches found.`,f.innerHTML=``,u.classList.remove(`hidden`);return}let s=new Set;o.forEach((e,t)=>{e.forEach(e=>{let n=e===i[t];s.add(n?e:`\\b`+ng(e)+`\\b`)})});let c=Array.from(s).sort((e,t)=>t.length-e.length),p=RegExp(`(`+c.map(e=>e.startsWith(`\\b`)?e:ng(e)).join(`|`)+`)`,`g`),g=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode(e){return e.parentElement&&e.parentElement.closest(`mark`)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}}),v=[];for(;g.nextNode();)v.push(g.currentNode);let y=0,b=new Map;v.forEach(e=>{let t=e.textContent||``,{normalized:n,map:r}=Zh(t);if(!n)return;let i=[],a;for(p.lastIndex=0;(a=p.exec(n))!==null;){if(a[0].length===0){p.lastIndex++;continue}i.push({start:a.index,end:a.index+a[0].length,term:a[0]})}if(!i.length)return;let s=e.parentElement?.closest(`p, li, td, h1, h2, h3, h4, h5, h6, pre, blockquote`)||e.parentElement,c=``,l=0;i.forEach(e=>{let n=r[e.start],i=r[e.end];if(!(n<l)&&(c+=tg(t.slice(l,n)),c+=`<mark class="ld-local-mark" id="ld-local-match-${y++}">${tg(t.slice(n,i))}</mark>`,l=i,s)){b.has(s)||b.set(s,new Set);let t=b.get(s);o.forEach((n,r)=>{n.has(e.term)&&t.add(r)})}}),c+=tg(t.slice(l));let u=document.createElement(`span`);u.innerHTML=c,e.parentNode.replaceChild(u,e)});let x=i.length,S=[];for(let[e,t]of b.entries())t.size===x&&S.push(e);let C;if(S.length>0){let t=new Set(S);C=Array.from(e.querySelectorAll(`mark.ld-local-mark`)).filter(e=>{let n=e.closest(`p, li, td, h1, h2, h3, h4, h5, h6, pre, blockquote`)||e.parentElement;return t.has(n)})}else C=Array.from(e.querySelectorAll(`mark.ld-local-mark`));if(!C.length){d.textContent=n(`local_search.no_results`)||`No matches found.`,f.innerHTML=``,u.classList.remove(`hidden`);return}d.textContent=(C.length===1?n(`local_search.count_singular`)||`{count} match`:n(`local_search.count_plural`)||`{count} matches`).replace(`{count}`,String(C.length)),f.innerHTML=C.map((e,t)=>{let n=e.closest(`p, li, td, h1, h2, h3, h4, h5, h6, pre, blockquote`)||e.parentElement,i=(n?n.textContent||``:e.textContent||``).trim(),a=Qh(i),s=-1;for(let e of o)for(let t of e){let e=a.indexOf(t);e>=0&&(s<0||e<s)&&(s=e)}s<0&&(s=a.indexOf(r.split(` `)[0])),s<0&&(s=0);let c=Math.max(0,s-40),l=Math.min(i.length,s+80),u=(c>0?`…`:``)+i.slice(c,l)+(l<i.length?`…`:``);return`<li><button type="button" data-target="${e.id}" class="ld-local-item w-full text-left px-3 py-1.5 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors text-xs"><span class="text-gray-400 font-mono mr-2">${t+1}.</span>${tg(u)}</button></li>`}).join(``),u.classList.remove(`hidden`),f.querySelectorAll(`.ld-local-item`).forEach(e=>{e.addEventListener(`click`,()=>_(e.dataset.target))})}function _(t){let n=document.getElementById(t),r=document.getElementById(`home-content-area`);if(!n||!r)return;let i=n.parentElement;for(;i&&i!==r;)i.tagName===`DETAILS`&&!i.open&&(i.open=!0),i=i.parentElement;e.querySelectorAll(`mark.ld-local-mark.ld-local-active`).forEach(e=>e.classList.remove(`ld-local-active`)),n.classList.add(`ld-local-active`),f.querySelectorAll(`.ld-local-item`).forEach(e=>{e.classList.toggle(`ld-local-item-active`,e.dataset.target===t)});let a=document.querySelector(`#home-doc-view header`),o=a?a.getBoundingClientRect().height:0,s=n.getBoundingClientRect().top,c=r.getBoundingClientRect().top,l=o+(r.clientHeight-o)/3;r.scrollTop+=s-c-l}c.addEventListener(`input`,()=>{p&&clearTimeout(p),p=window.setTimeout(()=>g(c.value.trim()),250)}),l.addEventListener(`click`,()=>{c.value=``,g(``),c.focus()}),c.addEventListener(`keydown`,e=>{e.key===`Escape`&&(c.value=``,g(``),c.blur())})}var ig={codeLabel:`Code block.`,imageLabel:`Image: {alt}.`,diagramLabel:`Diagram.`,tableLabel:`Table.`,readCode:!1},ag=new Set([`H1`,`H2`,`H3`,`H4`,`H5`,`H6`]);function og(e){return e.classList.contains(`mermaid`)||e.querySelector(`.mermaid`)!==null}function sg(e){let t=[],n=/[^.!?…\n]*(?:[.!?…]+|\n+|$)/g,r;for(;(r=n.exec(e))!==null;){if(r[0].length===0){if(n.lastIndex>=e.length)break;n.lastIndex++;continue}let i=r[0],a=i.length-i.trimStart().length,o=i.trim();if(o){let e=r.index+a;t.push({text:o,start:e,end:e+o.length})}if(n.lastIndex>=e.length)break}return t}function cg(e,t){let n=(e.textContent??``).replace(/\s+/g,` `).trim();if(!n)return null;let r=sg(n);return{type:t,el:e,spokenText:n,sentences:r.length?r:[{text:n,start:0,end:n.length}],highlightWhole:!1}}function lg(e,t,n){let r=n.trim();return r?{type:t,el:e,spokenText:r,sentences:[{text:r,start:0,end:r.length}],highlightWhole:!0}:null}function ug(e,t,n){for(let r of Array.from(e.children)){let e=r.tagName;if(og(r)){dg(n,lg(r,`diagram`,t.diagramLabel));continue}if(e===`PRE`||e===`DIV`&&r.querySelector(`:scope > pre`)){dg(n,t.readCode?cg(r,`code`):lg(r,`code`,t.codeLabel));continue}if(e===`TABLE`){dg(n,lg(r,`table`,t.tableLabel));continue}if(e===`IMG`||e===`FIGURE`&&r.querySelector(`img`)){let i=(e===`IMG`?r:r.querySelector(`img`))?.getAttribute(`alt`)?.trim()??``;dg(n,lg(r,`image`,t.imageLabel.includes(`{alt}`)?i?t.imageLabel.replace(`{alt}`,i):t.imageLabel.replace(/:?\s*\{alt\}/,``).trim()||`Image.`:t.imageLabel));continue}if(ag.has(e)){dg(n,cg(r,`heading`));continue}if(e===`P`){dg(n,cg(r,`paragraph`));continue}if(e===`LI`){dg(n,cg(r,`list-item`));continue}if(e===`BLOCKQUOTE`){r.querySelector(`:scope > p, :scope > ul, :scope > ol`)?ug(r,t,n):dg(n,cg(r,`quote`));continue}if(e===`UL`||e===`OL`||e===`DIV`||e===`SECTION`||e===`DETAILS`){ug(r,t,n);continue}}}function dg(e,t){t&&e.push(t)}function fg(e,t={}){let n={...ig,...t},r=[];return ug(e,n,r),r}var pg=`tts-sentence`;function mg(){if(typeof document>`u`||document.getElementById(`tts-highlight-style`))return;let e=document.createElement(`style`);e.id=`tts-highlight-style`,e.textContent=`::highlight(${pg}){background-color:rgba(250,204,21,0.45);color:inherit;}.dark ::highlight(${pg}){background-color:rgba(250,204,21,0.35);}`,document.head.appendChild(e)}function hg(e,t,n){let r=[],i=!0,a=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),o=a.nextNode();for(;o;){let e=o.data;for(let t=0;t<e.length;t++)/\s/.test(e[t])?i||=(r.push({node:o,offset:t}),!0):(r.push({node:o,offset:t}),i=!1);o=a.nextNode()}if(t>=r.length)return null;let s=r[t],c=document.createRange();if(c.setStart(s.node,s.offset),n<r.length){let e=r[n];c.setEnd(e.node,e.offset)}else{let e=r[r.length-1];c.setEnd(e.node,e.offset+1)}return c}var gg=new class{#e=F(`idle`);get status(){return H(this.#e)}set status(e){I(this.#e,e,!0)}#t=F(-1);get index(){return H(this.#t)}set index(e){I(this.#t,e,!0)}#n=F(0);get total(){return H(this.#n)}set total(e){I(this.#n,e,!0)}#r=F(null);get error(){return H(this.#r)}set error(e){I(this.#r,e,!0)}units=[];ctx=null;source=null;cache=new Map;token=0;voice;speed;language=`en`;fallbackEl=null;get active(){return this.status===`playing`||this.status===`paused`||this.status===`loading`}async start(e,t={}){this.stop();let{voice:n,speed:r,language:i,...a}=t;this.voice=n,this.speed=r,this.language=i??`en`;let o=fg(e,a);if(this.units=o.flatMap(e=>e.highlightWhole?[{seg:e,text:e.spokenText,start:0,end:e.spokenText.length,whole:!0}]:e.sentences.map(t=>({seg:e,text:t.text,start:t.start,end:t.end,whole:!1}))),this.total=this.units.length,this.units.length===0)return;this.ctx=new AudioContext,this.error=null;let s=++this.token;this.status=`loading`,await this.playFrom(0,s)}async playFrom(e,t){if(t!==this.token)return;if(e>=this.units.length){this.stop();return}this.index=e,this.highlight(this.units[e]);let n;try{n=await this.audioFor(e)}catch(e){if(t!==this.token)return;this.error=e instanceof Error?e.message:String(e),this.stop(!1);return}if(t!==this.token||!this.ctx)return;this.prefetch(e+1);let r=this.ctx.createBufferSource();r.buffer=n,r.connect(this.ctx.destination),r.onended=()=>{t===this.token&&(this.source=null,this.playFrom(e+1,t))},this.source=r,this.status=`playing`,r.start()}audioFor(e){let t=this.cache.get(e);return t||(t=this.fetchAudio(this.units[e].text),this.cache.set(e,t)),t}prefetch(e){e<this.units.length&&!this.cache.has(e)&&this.cache.set(e,this.fetchAudio(this.units[e].text).catch(e=>Promise.reject(e)))}async fetchAudio(e){let t=await fetch(`/api/tts`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({text:e,voice:this.voice,speed:this.speed,language:this.language})});if(!t.ok){let e=`HTTP ${t.status}`;try{e=(await t.json()).error||e}catch{}throw Error(e)}let n=await t.arrayBuffer();return this.ctx.decodeAudioData(n)}pause(){this.status===`playing`&&this.ctx&&(this.ctx.suspend(),this.status=`paused`)}resume(){this.status===`paused`&&this.ctx&&(this.ctx.resume(),this.status=`playing`)}toggle(){this.status===`playing`?this.pause():this.status===`paused`&&this.resume()}stop(e=!0){if(this.token++,this.source){try{this.source.onended=null,this.source.stop()}catch{}this.source=null}this.ctx&&=(this.ctx.close(),null),this.cache.clear(),this.clearHighlight(),this.status=`idle`,this.index=-1,this.total=0,e&&(this.error=null)}highlight(e){mg(),this.clearHighlight();let t=typeof CSS<`u`&&`highlights`in CSS&&typeof Highlight<`u`;if(t&&!e.whole){let t=hg(e.seg.el,e.start,e.end);t?CSS.highlights.set(pg,new Highlight(t)):this.fallbackHighlight(e.seg.el)}else if(t){let t=document.createRange();t.selectNodeContents(e.seg.el),CSS.highlights.set(pg,new Highlight(t))}else this.fallbackHighlight(e.seg.el);e.seg.el.scrollIntoView({block:`center`,behavior:`smooth`})}fallbackHighlight(e){e.classList.add(`tts-active`),this.fallbackEl=e}clearHighlight(){typeof CSS<`u`&&`highlights`in CSS&&CSS.highlights.delete(pg),this.fallbackEl&&=(this.fallbackEl.classList.remove(`tts-active`),null)}},_g=/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/,vg=/^(\s*(?:\*\*)?(?:language|lang|locale|langue)(?:\*\*)?\s*:\s*(?:\*\*)?\s*)(.+?)\s*$/i;function yg(e){let t=(e??``).trim().toLowerCase();return t?t===`en`||t.startsWith(`en-`)||t===`english`||t===`anglais`?`en`:t===`fr`||t.startsWith(`fr-`)||t===`french`||t===`francais`||t===`français`?`fr`:null:null}function bg(e){let t=e.match(_g)?.[1];if(!t)return null;for(let e of t.split(/\r?\n/)){let t=e.match(vg);if(t)return yg(t[2])}return null}function xg(e,t){let n=e.match(_g);if(!n)return`---\n**language:** ${t}\n---\n\n${e}`;let r=n[0],i=n[1].split(/\r?\n/),a=i.findIndex(e=>vg.test(e));if(a>=0)i[a]=i[a].replace(vg,`$1${t}`);else{let e=i.findIndex(e=>/^\s*(?:\*\*)?date(?:\*\*)?\s*:\s*(?:\*\*)?/i.test(e)),n=e>=0?e+1:i.length;i.splice(n,0,`**language:** ${t}`)}return`---\n${i.join(`
|
|
107
|
-
`)}\n---\n`+e.slice(r.length)}var Sg=e=>e.normalize(`NFC`).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase();function Cg(e,t){let n=Sg(t);if(!n)return[];let r=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),i=[];for(;r.nextNode();)i.push(r.currentNode);let a=0;i.forEach(e=>{let t=(e.textContent||``).normalize(`NFC`),r=Sg(t);if(!r.includes(n))return;let i=``,o=0;for(;o<=r.length;){let e=r.indexOf(n,o);if(e===-1){i+=t.slice(o);break}i+=t.slice(o,e),i+=`<mark id="match-${a++}">${t.slice(e,e+n.length)}</mark>`,o=e+n.length}let s=document.createElement(`span`);s.innerHTML=i,e.parentNode.replaceChild(s,e)});let o=[];return e.querySelectorAll(`mark[id^='match-']`).forEach(e=>{let r=((e.closest(`p, li, td, h1, h2, h3, h4, h5, h6, pre`)||e.parentElement).textContent||``).trim(),i=Sg(r).indexOf(n),a=Math.max(0,i-40),s=Math.min(r.length,i+t.length+40),c=(a>0?`…`:``)+r.slice(a,s)+(s<r.length?`…`:``);o.push({id:e.id,snippet:c})}),o}function wg(e){let t=document.getElementById(e),n=document.getElementById(`home-content-area`);if(!t||!n)return;let r=t.parentElement;for(;r&&r!==n;)r.tagName===`DETAILS`&&!r.open&&(r.open=!0),r=r.parentElement;document.querySelectorAll(`mark.match-active`).forEach(e=>e.classList.remove(`match-active`)),t.classList.add(`match-active`);let i=document.querySelector(`#home-doc-view header`),a=i?i.getBoundingClientRect().height:0,o=t.getBoundingClientRect().top,s=n.getBoundingClientRect().top,c=a+(n.clientHeight-a)/3;n.scrollTop+=o-s-c}var Tg=W(`<span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-violet-100 text-violet-700 dark:bg-violet-900/40 dark:text-violet-300"> </span>`),Eg=W(`<span class="text-xs text-gray-400 dark:text-gray-500"> </span>`),Dg=W(`<span> </span>`),Og=W(`<div data-testid="edit-actions" class="flex items-center gap-2"><!> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div>`),kg=W(`<button data-testid="validate-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-green-700 bg-green-600 text-white font-semibold hover:bg-green-700 transition-colors"><i class="fa-solid fa-check" style="margin-right:4px"></i> </button>`),Ag=W(`<button data-testid="tts-toggle" class="no-print text-sm px-3 py-1.5 rounded-lg border border-blue-300 dark:border-blue-700 bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 hover:bg-blue-100 dark:hover:bg-blue-900/50 transition-colors"><i></i></button> <button data-testid="tts-stop" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-stop"></i></button>`,1),jg=W(`<button data-testid="tts-play" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-headphones" style="margin-right:4px"></i> </button>`),Mg=Vr(`<g><line x1="8" y1="8" x2="92" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line><line x1="92" y1="8" x2="8" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line></g>`),Ng=W(`<div data-testid="view-actions" class="flex items-center gap-2"><!> <!> <button><svg width="18" height="18" viewBox="0 0 100 100" fill="none" style="display:inline-block;vertical-align:middle;margin-right:4px"><rect x="28" y="10" width="44" height="52" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><rect x="52" y="8" width="22" height="30" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><polygon points="28,60 10,80 30,80 38,72" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><polygon points="28,48 19,70 36,75 55,70" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><line x1="10" y1="90" x2="72" y2="90" stroke="currentColor" stroke-width="6" stroke-linecap="round"></line><!></svg> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-link"></i> </button> <button data-testid="metadata-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-code-compare"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-file-pen"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-red-200 dark:border-red-700 text-red-500 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/40 transition-colors"><i class="fa-solid fa-trash"></i> </button> <button><i class="fa-solid fa-list-ul"></i></button></div>`),Pg=W(`<span class="text-gray-300 dark:text-gray-600 mx-1">·</span>`),Fg=W(`<!> <button class="text-blue-600 dark:text-blue-400 hover:underline"> </button>`,1),Ig=W(`<div class="no-print mt-2 flex flex-wrap gap-1 text-xs"></div>`),Lg=W(`<li><button class="w-full text-left px-3 py-1.5 hover:bg-yellow-100 dark:hover:bg-yellow-900/30 transition-colors"><span class="text-yellow-600 dark:text-yellow-500 font-mono text-xs mr-2"> </span><span class="text-xs"> </span></button></li>`),Rg=W(`<div class="mt-4 rounded-lg bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-sm text-yellow-800 dark:text-yellow-300 overflow-hidden"><div class="px-3 py-2 font-medium border-b border-yellow-200 dark:border-yellow-800"> </div> <ol class="max-h-40 overflow-y-auto divide-y divide-yellow-100 dark:divide-yellow-900/40 list-none m-0 p-0"></ol></div>`),zg=W(`<div data-testid="tts-error" class="mt-4 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-300"> </div>`),Bg=W(`<li class="m-0 p-0"><a class="block text-xs text-gray-500 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:underline py-0.5 leading-snug transition-colors truncate"> </a></li>`),Vg=W(`<div></div> <aside class="no-print shrink-0 sticky self-start overflow-y-auto py-8 pr-4 pl-3 ld-toc-aside"><p class="text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 mb-3"> </p> <nav><ul class="space-y-1 list-none m-0 p-0"></ul></nav></aside>`,1),Hg=W(`<div data-testid="tts-language-modal" class="fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4"><div class="w-full max-w-sm rounded-xl border border-gray-200 bg-white p-5 shadow-2xl dark:border-gray-700 dark:bg-gray-900"><h2 class="text-base font-semibold text-gray-900 dark:text-gray-50"> </h2> <p class="mt-2 text-sm text-gray-600 dark:text-gray-300"> </p> <div class="mt-4 grid grid-cols-2 gap-2"><button type="button" data-testid="tts-language-en" class="rounded-lg border border-gray-200 px-3 py-2 text-sm font-semibold text-gray-700 transition-colors hover:bg-gray-50 disabled:opacity-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800"> </button> <button type="button" data-testid="tts-language-fr" class="rounded-lg border border-gray-200 px-3 py-2 text-sm font-semibold text-gray-700 transition-colors hover:bg-gray-50 disabled:opacity-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800"> </button></div> <div class="mt-3 flex justify-end"><button type="button" class="rounded-lg border border-gray-200 px-3 py-1.5 text-sm text-gray-600 transition-colors hover:bg-gray-50 disabled:opacity-50 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800"> </button></div></div></div>`),Ug=W(`<div class="fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4"><div class="w-full max-w-sm bg-white dark:bg-gray-900 border border-red-200 dark:border-red-700 rounded-xl shadow-2xl p-5 flex flex-col gap-3"><p class="text-sm text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-500 dark:text-gray-400 italic truncate"> </p> <div class="flex justify-end gap-2 mt-2"><button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-red-500 hover:bg-red-600 text-white font-semibold transition-colors"> </button></div></div></div>`),Wg=W(`<header id="home-doc-header" class="sticky top-0 z-10 bg-gray-50 dark:bg-gray-950 px-6 pt-8 pb-6 border-b border-gray-300 dark:border-gray-800"><div class="flex items-start gap-4 flex-wrap"><div class="shrink min-w-0"><div class="flex items-center gap-2 mb-2 flex-wrap"><span class="flex items-center gap-2 flex-wrap"><!> <span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300"> </span></span> <!></div> <div class="flex items-center gap-2"><h1 data-testid="doc-title" class="min-w-0 text-2xl font-bold text-gray-900 dark:text-gray-50 leading-tight"> </h1> <button type="button" data-testid="copy-doc-id-btn"><i aria-hidden="true"></i></button></div></div> <div class="flex items-center gap-2 flex-wrap ml-auto"><!></div></div> <!> <!> <!> <!> <div class="hidden no-print"></div></header> <div class="flex min-h-full items-start"><article id="home-doc-view" data-testid="doc-view" class="flex-1 min-w-0 px-6 pt-8 pb-8"><!></article> <!></div> <!> <!> <!> <!> <!>`,1);function Gg(e,t){Ge(t,!0);let n=Bi(t,`navHistory`,19,()=>[]),r=F(null),i=F(null),a=F(null),o=F(null),s=F(!1),c=F(null),l=F(L([])),u=``,d=P(()=>H(l).length?X(H(l).length===1?`search.notice_singular`:`search.notice_plural`).replace(`{count}`,String(H(l).length)).replace(`{query}`,Z.searchQuery):``),f=P(()=>jh(t.doc.content)),p=P(()=>(H(f)||``).toUpperCase()===`TO BE VALIDATED`),m=F(!1),h=F(null),g=F(!1),_=F(!1),v=F(!1),y=F(!1),b=F(!1);function x(e){let t=document.getElementById(`home-content-area`),n=document.getElementById(e);if(!t||!n)return;let r=document.querySelector(`#home-doc-view header`),i=r?r.getBoundingClientRect().height:0;t.scrollTop+=n.getBoundingClientRect().top-t.getBoundingClientRect().top-i-8}function S(e){I(r,e,!0);let n=t.doc.id,i=Z.searchQuery,o=typeof i==`string`&&i.toLowerCase().startsWith(`metadata://`);I(l,i&&!o?Cg(e,i):[],!0),H(c)&&rg(e,H(c),X),n===u?H(a)?.apply():(u=n,H(a)?.load(n),Dh.load(n)),I(E,Array.from(e.querySelectorAll(`h1,h2,h3,h4,h5,h6`)).map(e=>({id:e.id,text:e.textContent?.trim()??``,level:parseInt(e.tagName[1])})).filter(e=>e.id&&e.text),!0)}function C(){return H(o).show({title:X(`snippet.inline_delete_title`),message:X(`snippet.inline_delete_message`),confirmLabel:X(`snippet.inline_delete_confirm_btn`),cancelLabel:X(`common.cancel`),danger:!0})}async function w(){let e=1;try{let n=await Dh.load(t.doc.id);n&&typeof n.accuracy==`number`&&(e=n.accuracy)}catch{}let n=Math.round(e*100),r=n<100,i=Nh(t.doc.id),a=X(i?`doc.validate_worklog_message`:`doc.validate_message`),s=r?X(`doc.validate_detail_low_accuracy`).replace(`{accuracy}`,n+`%`):void 0;if(!await H(o).show({title:X(`doc.validate_title`),message:a,detail:s,confirmLabel:X(`doc.validate_confirm`),cancelLabel:X(`common.cancel`)}))return;let c=Mh(t.doc.content,i?`Done`:`Accepted`);if(c!==t.doc.content)try{await t.onsave(c),r&&await fetch(`/api/metadata/`+encodeURIComponent(t.doc.id)+`/refresh`,{method:`POST`}),await Dh.load(t.doc.id),Z.docStatuses={...Z.docStatuses,[t.doc.id]:i?`Done`:`Accepted`}}catch(e){I(h,{text:X(`doc.validate_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}On(()=>{try{I(g,localStorage.getItem(`ld-full-width`)===`1`)}catch{}});let T=F(!1),E=F(L([])),D=P(()=>H(T)&&H(E).length>0),ee=`ld-toc-w`,O=F(!1),k=F(null),A=F(null),te=F(0);On(()=>{if(!H(A))return;let e=new ResizeObserver(()=>{I(te,H(A).offsetHeight,!0)});return e.observe(H(A)),I(te,H(A).offsetHeight,!0),()=>e.disconnect()});function ne(e){if(e.preventDefault(),!H(k))return;let t=e.clientX,n=H(k).getBoundingClientRect().width;I(O,!0),H(k).style.transition=`none`,document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`;let r=e=>{let r=Math.max(160,Math.min(400,n-(e.clientX-t)));H(k).style.width=r+`px`},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``,I(O,!1),H(k).style.transition=``;try{localStorage.setItem(ee,String(parseInt(H(k).style.width,10)))}catch{}};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}On(()=>{try{I(T,localStorage.getItem(`ld-toc-open`)===`1`)}catch{}try{let e=parseInt(localStorage.getItem(ee)||``,10);H(k)&&e>=160&&e<=400&&(H(k).style.width=e+`px`)}catch{}});function re(){I(T,!H(T));try{localStorage.setItem(`ld-toc-open`,H(T)?`1`:`0`)}catch{}}function ie(e){let t=document.getElementById(e),n=document.getElementById(`home-content-area`),r=document.getElementById(`home-doc-header`);if(!t||!n)return;let i=t.parentElement;for(;i&&i!==n;)i.tagName===`DETAILS`&&(i.open=!0),i=i.parentElement;let a=r?r.getBoundingClientRect().height:0,o=t.getBoundingClientRect().top-n.getBoundingClientRect().top+n.scrollTop;n.scrollTo({top:o-a-16,behavior:`smooth`})}async function ae(){try{await navigator.clipboard.writeText(location.href)}catch{}}async function oe(){try{await navigator.clipboard.writeText(decodeURIComponent(t.doc.id)),I(v,!0),setTimeout(()=>I(v,!1),1800)}catch{}}function se(){window.print()}function ce(e){H(r)&&gg.start(H(r),{language:e,codeLabel:X(`tts.code_label`),imageLabel:X(`tts.image_label`),diagramLabel:X(`tts.diagram_label`),tableLabel:X(`tts.table_label`)})}function le(){let e=bg(t.doc.content);if(!e){I(y,!0);return}ce(e)}async function ue(e){I(b,!0);try{let n=xg(t.doc.content,e);n!==t.doc.content&&await t.onsave(n),I(y,!1),ce(e)}catch(e){I(h,{text:X(`tts.language_save_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}finally{I(b,!1)}}On(()=>(t.doc.id,H(m),()=>{I(y,!1),gg.stop()}));var de=Wg(),fe=z(de),pe=R(fe),me=R(pe),he=R(me),ge=R(he),_e=R(ge);J(_e,17,()=>t.doc.folder||[],Yr,(e,t)=>{var n=Tg(),r=R(n,!0);N(n),V(e=>{Y(n,`title`,H(t)),K(r,e)},[()=>Hm(H(t))]),G(e,n)});var ve=B(_e,2),ye=R(ve,!0);N(ve),N(ge);var be=B(ge,2),xe=e=>{var n=Eg(),r=R(n,!0);N(n),V(()=>K(r,t.doc.formattedDate)),G(e,n)};q(be,e=>{t.doc.formattedDate&&e(xe)}),N(he);var Se=B(he,2),j=R(Se),Ce=R(j,!0);N(j);var M=B(j,2),we=R(M);N(M),N(Se),N(me);var Te=B(me,2),Ee=R(Te),De=e=>{var t=Og(),n=R(t),r=e=>{var t=Dg(),n=R(t,!0);N(t),V(()=>{hi(t,1,`text-xs ${H(h).cls??``}`),K(n,H(h).text)}),G(e,t)};q(n,e=>{H(h)&&e(r)});var a=B(n,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(t),V((e,t,n,r)=>{K(o,e),Y(s,`title`,t),K(c,n),K(u,r)},[()=>X(`common.cancel`),()=>X(`doc.snippets`),()=>X(`doc.snippets_btn`),()=>X(`common.save`)]),U(`click`,a,()=>H(i).cancelEdit()),U(`click`,s,()=>H(i).openSnippets()),U(`click`,l,()=>H(i).save()),G(e,t)},Oe=e=>{let t=P(()=>Z.markerActive?`#fef08a`:`#bfdbfe`),n=P(()=>Z.markerActive?`#fef08a`:`#93c5fd`),r=P(()=>Z.markerActive?`#fde047`:`#93c5fd`);var a=Ng(),o=R(a),c=e=>{var t=kg(),n=B(R(t),1,!0);N(t),V((e,r)=>{Y(t,`title`,e),K(n,r)},[()=>X(`doc.validate_mode`),()=>X(`doc.validate_btn`)]),U(`click`,t,w),G(e,t)};q(o,e=>{H(p)&&e(c)});var l=B(o,2),u=e=>{var t=Ag(),n=z(t),r=R(n);N(n);var i=B(n,2);V((e,t)=>{Y(n,`title`,e),hi(r,1,`fa-solid ${gg.status===`playing`?`fa-pause`:`fa-play`}`),Y(i,`title`,t)},[()=>gg.status===`playing`?X(`tts.pause`):X(`tts.resume`),()=>X(`tts.stop`)]),U(`click`,n,()=>gg.toggle()),U(`click`,i,()=>gg.stop()),G(e,t)},d=e=>{var t=jg(),n=B(R(t),1,!0);N(t),V((e,r)=>{Y(t,`title`,e),K(n,r)},[()=>X(`tts.play`),()=>X(`tts.play_btn`)]),U(`click`,t,le),G(e,t)};q(l,e=>{gg.active?e(u):e(d,-1)});var f=B(l,2),m=R(f),h=R(m),g=B(h),v=B(g),y=B(v),b=B(y,2),x=e=>{G(e,Mg())};q(b,e=>{Z.markerHidden&&e(x)}),N(m);var S=B(m,1,!0);N(f);var C=B(f,2),E=R(C);N(C);var D=B(C,2),ee=B(R(D));N(D);var O=B(D,2),k=B(R(O));N(O);var A=B(O,2),te=B(R(A));N(A);var ne=B(A,2),ie=B(R(ne));N(ne);var oe=B(ne,2);N(a),V((e,i,a,o,s,c,l,u,d,p,m,_,b)=>{Y(f,`title`,e),hi(f,1,`no-print text-sm px-3 py-1.5 rounded-lg border transition-colors ${Z.markerActive?`border-yellow-400 bg-yellow-100 dark:bg-yellow-900/40 text-yellow-700 dark:text-yellow-300`:`border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700`}`),Y(h,`fill`,H(t)),Y(g,`fill`,H(n)),Y(v,`fill`,H(r)),Y(y,`fill`,H(r)),K(S,i),Y(C,`title`,a),K(E,`📄 ${o??``}`),Y(D,`title`,s),K(ee,` ${c??``}`),Y(O,`title`,l),K(k,` ${u??``}`),Y(A,`title`,d),K(te,` ${p??``}`),Y(ne,`title`,m),K(ie,` ${_??``}`),Y(oe,`title`,b),hi(oe,1,`no-print text-sm px-3 py-1.5 rounded-lg border transition-colors ${H(T)?`border-blue-400 bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400`:`border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700`}`)},[()=>X(`doc.marker_mode`),()=>X(`doc.marker_btn`),()=>X(`doc.export_pdf`),()=>X(`doc.export_pdf_btn`),()=>X(`doc.copy_link`),()=>X(`doc.copy_link_btn`),()=>X(`metadata.button_title`),()=>X(`metadata.button`),()=>X(`doc.edit`),()=>X(`doc.edit_btn`),()=>X(`doc.delete`),()=>X(`doc.delete_btn`),()=>X(`doc.toc_toggle`)]),U(`click`,f,()=>Z.toggleMarker()),U(`click`,C,se),U(`click`,D,ae),U(`click`,O,()=>I(s,!0)),U(`click`,A,()=>H(i).enterEdit()),U(`click`,ne,()=>I(_,!0)),U(`click`,oe,re),G(e,a)};q(Ee,e=>{H(m)?e(De):e(Oe,-1)}),N(Te),N(pe);var ke=B(pe,2),Ae=e=>{kh(e,{onopen:()=>I(s,!0)})};q(ke,e=>{H(m)||e(Ae)});var je=B(ke,2),Me=e=>{var r=Ig();J(r,21,n,Yr,(e,n,r)=>{var i=Fg(),a=z(i),o=e=>{G(e,Pg())};q(a,e=>{r>0&&e(o)});var s=B(a,2),c=R(s);N(s),V(()=>K(c,`← ${H(n).title??``}`)),U(`click`,s,()=>t.ongoback?.(r)),G(e,i)}),N(r),G(e,r)};q(je,e=>{!H(m)&&n().length&&e(Me)});var Ne=B(je,2),Pe=e=>{var t=Rg(),n=R(t),r=R(n,!0);N(n);var i=B(n,2);J(i,23,()=>H(l),e=>e.id,(e,t,n)=>{var r=Lg(),i=R(r),a=R(i),o=R(a);N(a);var s=B(a),c=R(s,!0);N(s),N(i),N(r),V(()=>{K(o,`${H(n)+1}.`),K(c,H(t).snippet)}),U(`click`,i,()=>wg(H(t).id)),G(e,r)}),N(i),N(t),V(()=>K(r,H(d))),G(e,t)};q(Ne,e=>{!H(m)&&H(l).length&&Z.searchQuery&&e(Pe)});var Fe=B(Ne,2),Ie=e=>{var t=zg(),n=R(t,!0);N(t),V(()=>K(n,gg.error)),G(e,t)};q(Fe,e=>{!H(m)&&gg.error&&e(Ie)}),Li(B(Fe,2),e=>I(c,e),()=>H(c)),N(fe),Li(fe,e=>I(A,e),()=>H(A));var Le=B(fe,2),Re=R(Le);Li(ru(R(Re),{get docId(){return t.doc.id},get content(){return t.doc.content},get html(){return t.doc.html},get onsave(){return t.onsave},get onopen(){return t.onopen},onanchor:x,onconfirmdelete:C,oncontentwired:S,get rewireSignal(){return Z.searchQuery},get editing(){return H(m)},set editing(e){I(m,e,!0)},get saveMsg(){return H(h)},set saveMsg(e){I(h,e,!0)}}),e=>I(i,e,!0),()=>H(i)),N(Re);var ze=B(Re,2),Be=e=>{var t=Vg(),n=z(t),r=B(n,2),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o);J(s,21,()=>H(E),Yr,(e,t)=>{var n=Bg(),r=R(n),i=R(r,!0);N(r),N(n),V(()=>{_i(n,`padding-left: ${(H(t).level-1)*.75}rem`),Y(r,`href`,`#${H(t).id??``}`),Y(r,`title`,H(t).text),K(i,H(t).text)}),U(`mousedown`,r,e=>e.preventDefault()),U(`click`,r,e=>{e.preventDefault(),ie(H(t).id)}),G(e,n)}),N(s),N(o),N(r),Li(r,e=>I(k,e),()=>H(k)),V(e=>{hi(n,1,`no-print w-1 shrink-0 self-stretch cursor-col-resize select-none transition-colors ${H(O)?`bg-blue-500/60`:`bg-transparent hover:bg-blue-500/40`}`),_i(r,`width: 224px; top: ${H(te)??``}px; max-height: calc(100vh - ${H(te)??``}px)`),K(a,e)},[()=>X(`doc.toc_title`)]),U(`mousedown`,n,ne),G(e,t)};q(ze,e=>{H(D)&&e(Be)}),N(Le);var Ve=B(Le,2);Li(xh(Ve,{get contentEl(){return H(r)},get docId(){return t.doc.id}}),e=>I(a,e,!0),()=>H(a));var He=B(Ve,2);Xh(He,{get open(){return H(s)},get docId(){return t.doc.id},get content(){return t.doc.content},onclose:()=>I(s,!1)});var Ue=B(He,2);Li(wl(Ue,{}),e=>I(o,e,!0),()=>H(o));var We=B(Ue,2),qe=e=>{var t=Hg(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s),l=R(c,!0);N(c);var u=B(c,2),d=R(u,!0);N(u),N(s);var f=B(s,2),p=R(f),m=R(p,!0);N(p),N(f),N(n),N(t),V((e,t,n,r,a)=>{K(i,e),K(o,t),c.disabled=H(b),K(l,n),u.disabled=H(b),K(d,r),p.disabled=H(b),K(m,a)},[()=>X(`tts.language_title`),()=>X(`tts.language_message`),()=>X(`tts.language_en`),()=>X(`tts.language_fr`),()=>X(`common.cancel`)]),U(`click`,t,e=>{e.target===e.currentTarget&&!H(b)&&I(y,!1)}),U(`click`,c,()=>ue(`en`)),U(`click`,u,()=>ue(`fr`)),U(`click`,p,()=>I(y,!1)),G(e,t)};q(We,e=>{H(y)&&e(qe)});var Je=B(We,2),Ye=e=>{var n=Ug(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d,!0);N(d),N(c),N(r),N(n),V((e,n,r)=>{K(a,e),K(s,t.doc.title),K(u,n),K(f,r)},[()=>X(`doc.confirm_delete`),()=>X(`common.cancel`),()=>X(`doc.confirm_delete_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&I(_,!1)}),U(`click`,l,()=>I(_,!1)),U(`click`,d,async()=>{I(_,!1),await t.ondelete()}),G(e,n)};q(Je,e=>{H(_)&&e(Ye)}),V(e=>{K(ye,t.doc.category),K(Ce,t.doc.title),Y(M,`title`,e),hi(M,1,`no-print inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition-colors hover:bg-gray-50 hover:text-blue-600 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-blue-400 ${H(v)?`text-green-600 dark:text-green-400`:``}`),hi(we,1,`fa-${H(v)?`solid fa-check`:`regular fa-copy`}`)},[()=>X(`doc.copy_mcp_id`)]),U(`click`,M,oe),G(e,de),Ke()}Nr([`click`,`mousedown`]);var Kg=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),qg=W(`<p class="px-3 py-3 text-xs text-red-400 text-center"> </p>`),Jg=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),Yg=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">📁</span> <span class="truncate text-gray-700 dark:text-gray-300"> </span></button>`),Xg=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden text-sm"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="text-xs text-gray-500 dark:text-gray-400 font-mono truncate flex-1"> </span></div> <div class="max-h-40 overflow-y-auto divide-y divide-gray-100 dark:divide-gray-800"><!></div></div>`),Zg=W(`<p class="text-xs text-red-500"> </p>`),Qg=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-md mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><svg width="16" height="16" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" class="inline-block mr-1 align-text-bottom"><path d="M2 5a2 2 0 012-2h3.586a1 1 0 01.707.293L9.707 4.707A1 1 0 0010.414 5H16a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V5z" stroke="currentColor" stroke-width="1.5" fill="none"></path><line x1="10" y1="8" x2="10" y2="14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line><line x1="7" y1="11" x2="13" y2="11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line></svg> <span> </span></h3> <div class="space-y-1.5"><label for="new-folder-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-folder-name" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 text-sm text-gray-600 dark:text-gray-300 font-mono truncate"> </span> <button class="text-xs px-2 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-500 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0"> </button></div> <!></div> <div class="space-y-1"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs font-mono text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 truncate"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function $g(e,t){Ge(t,!0);let n=F(``),r=F(null),i=F(null),a=F(``),o=F(``),s=F(`/ (root)`),c=F(!1),l=F(``),u=F(L([])),d=F(!1),f=F(!1),p=F(``),m=F(!1),h=F(null),g=!1;On(()=>{t.open&&!g?(g=!0,_()):t.open||(g=!1)});async function _(){try{I(n,(await fetch(`/api/config`).then(e=>e.json())).docsFolder||``,!0)}catch{I(n,``)}let e=``;if(Z.currentDocId){let t=decodeURIComponent(Z.currentDocId);if(!t.startsWith(`/`)){let n=t.split(`/`);n.length>1&&(e=n.slice(0,-1).join(`/`))}}I(a,e?H(n)+`/`+e:H(n),!0),I(r,H(a),!0),I(i,null),I(o,``),I(s,e?`/`+e:`/ (root)`,!0),I(c,!1),I(p,``),I(m,!1),setTimeout(()=>H(h)?.focus(),50)}let v=P(()=>{let e=H(o).trim();if(!e)return X(`modal.new_folder.enter_name`);let t=H(a)||H(n),r=t.startsWith(H(n))?t.slice(H(n).length).replace(/^\//,``):``;return(r?r+`/`:``)+e});function y(){I(c,!H(c)),H(c)&&b(H(r)||H(n))}async function b(e){I(d,!0),I(f,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(r,t.current,!0),I(i,t.parent,!0),I(a,t.current,!0),I(l,t.current,!0),I(s,(t.current.startsWith(H(n)+`/`)?t.current.slice(H(n).length):t.current===H(n)?``:t.current)||`/ (root)`,!0),I(u,t.dirs||[],!0)}catch{I(f,!0),I(u,[],!0)}finally{I(d,!1)}}let x=P(()=>H(r)===H(n));function S(){H(i)&&b(H(i))}async function C(){let e=H(o).trim();if(I(p,``),!e){I(p,X(`modal.new_folder.error_empty`),!0);return}if(!/^[a-zA-Z0-9_\-. ]+$/.test(e)){I(p,X(`modal.new_folder.error_invalid_chars`),!0);return}let r=H(a)||H(n);if(r===H(n)&&(e===`files`||e===`images`)){I(p,X(`modal.new_folder.error_reserved`),!0);return}let i=r.endsWith(`/`)?r+e:r+`/`+e;I(m,!0);try{let e=await fetch(`/api/browse/mkdir`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:i})});if(!e.ok)throw Error(await e.text());t.onclose(),t.onsuccess()}catch(e){I(m,!1),I(p,X(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}}var w=Ur(),T=z(w),E=e=>{var n=Qg(),r=R(n),i=R(r),a=B(R(i),2),g=R(a,!0);N(a),N(i);var _=B(i,2),w=R(_),T=R(w,!0);N(w);var E=B(w,2);Ei(E),Li(E,e=>I(h,e),()=>H(h)),N(_);var D=B(_,2),ee=R(D),O=R(ee,!0);N(ee);var k=B(ee,2),A=R(k),te=R(A,!0);N(A);var ne=B(A,2),re=R(ne,!0);N(ne),N(k);var ie=B(k,2),ae=e=>{var t=Xg(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),p=e=>{var t=Kg(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},m=e=>{var t=qg(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`modal.new_folder.error_loading`)]),G(e,t)},h=e=>{var t=Jg(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`modal.new_folder.no_subfolders`)]),G(e,t)},g=e=>{var t=Ur();J(z(t),17,()=>H(u),e=>e.path,(e,t)=>{var n=Yg(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>b(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(d)?e(p):H(f)?e(m,1):H(u).length===0?e(h,2):e(g,-1)}),N(s),N(t),V(e=>{r.disabled=H(x),K(i,e),K(o,H(l))},[()=>X(`common.up`)]),U(`click`,r,S),G(e,t)};q(ie,e=>{H(c)&&e(ae)}),N(D);var oe=B(D,2),se=R(oe),ce=R(se,!0);N(se);var le=B(se,2),ue=R(le,!0);N(le),N(oe);var de=B(oe,2),fe=e=>{var t=Zg(),n=R(t,!0);N(t),V(()=>K(n,H(p))),G(e,t)};q(de,e=>{H(p)&&e(fe)});var pe=B(de,2),me=R(pe),he=R(me,!0);N(me);var ge=B(me,2),_e=R(ge,!0);N(ge),N(pe),N(r),N(n),V((e,t,n,r,i,a,o,c)=>{K(g,e),K(T,t),Y(E,`placeholder`,n),K(O,r),K(te,H(s)),K(re,i),K(ce,a),K(ue,H(v)),K(he,o),ge.disabled=H(m),K(_e,c)},[()=>X(`modal.new_folder.title`),()=>X(`modal.new_folder.name_label`),()=>X(`modal.new_folder.name_placeholder`),()=>X(`modal.new_folder.location_label`),()=>X(`modal.new_folder.browse_btn`),()=>X(`modal.new_folder.will_be_created`),()=>X(`common.cancel`),()=>H(m)?X(`modal.new_folder.creating_btn`):X(`modal.new_folder.create_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),Mi(E,()=>H(o),e=>I(o,e)),U(`click`,ne,y),U(`click`,me,function(...e){t.onclose?.apply(this,e)}),U(`click`,ge,C),G(e,n)};q(T,e=>{t.open&&e(E)}),G(e,w),Ke()}Nr([`click`]);var e_=W(`<option></option>`),t_=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),n_=W(`<p class="px-3 py-4 text-xs text-red-400 text-center"> </p>`),r_=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),i_=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">📁</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button>`),a_=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-40 overflow-y-auto"><!></div> <div class="border-t border-gray-200 dark:border-gray-700 flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800/50"><input type="text" class="flex-1 px-2 py-1 text-xs rounded border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-blue-400"/> <button class="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors shrink-0"> </button></div></div>`),o_=W(`<p class="text-xs text-red-500"> </p>`),s_=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-lg mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50">➕ <span> </span></h3> <div class="space-y-1.5"><label for="new-doc-title" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-title" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label for="new-doc-category" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-category" type="text" list="new-doc-category-options" autocomplete="off" placeholder="GENERAL" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <datalist id="new-doc-category-options"></datalist></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 px-3 py-2 text-xs rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-500 dark:text-gray-400 font-mono truncate"> </span> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">📁 <span> </span></button></div> <!></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 font-mono text-gray-600 dark:text-gray-300 break-all"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function c_(e,t){Ge(t,!0);let n=F(``),r=F(`YYYY_MM_DD_HH_mm_[Category]_title`),i=F(null),a=F(null),o=F(``),s=F(``),c=F(``),l=F(`/ (root)`),u=F(!1),d=F(``),f=F(L([])),p=F(!1),m=F(!1),h=F(``),g=F(L([])),_=F(``),v=F(!1),y=F(null);function b(e){return(e||``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toUpperCase().replace(/[^A-Z0-9_-]/g,``)}function x(e){let t=H(n);return e===t?``:e.startsWith(t+`/`)?e.slice(t.length+1):e}let S=!1;On(()=>{t.open&&!S?(S=!0,C()):t.open||(S=!1)});async function C(){try{let e=await fetch(`/api/config`).then(e=>e.json());I(n,e.docsFolder||``,!0),I(r,e.filenamePattern||`YYYY_MM_DD_HH_mm_[Category]_title`,!0)}catch{I(n,``),I(r,`YYYY_MM_DD_HH_mm_[Category]_title`)}let e=Z.currentDocId&&Z.allDocs.find(e=>e.id===Z.currentDocId),t=b(e&&e.category||`General`)||`GENERAL`,d=``;if(Z.currentDocId){let e=decodeURIComponent(Z.currentDocId);if(!e.startsWith(`/`)){let t=e.split(`/`);t.length>1&&(d=t.slice(0,-1).join(`/`))}}let f=d?H(n)+`/`+d:``;I(o,d,!0),I(i,f||null,!0),I(a,null),w(),I(s,``),I(c,t,!0),I(l,d?`/`+d:`/ (root)`,!0),I(u,!1),I(h,``),I(_,``),I(v,!1),setTimeout(()=>H(y)?.focus(),50)}function w(){let e=new Set;(Z.allDocs||[]).forEach(t=>{let n=b(t.category||``);n&&e.add(n)}),I(g,Array.from(e).sort((e,t)=>e.localeCompare(t)),!0)}function T(){let e=b(H(c));H(c)!==e&&I(c,e,!0)}let E=P(()=>{let e=H(s).trim();if(!e)return X(`modal.new_doc.title_placeholder`);let t=b(H(c))||`GENERAL`,n=new Date,i=n.getFullYear(),a=String(n.getMonth()+1).padStart(2,`0`),l=String(n.getDate()).padStart(2,`0`),u=String(n.getHours()).padStart(2,`0`),d=String(n.getMinutes()).padStart(2,`0`),f=e.toLowerCase().replace(/\s+/g,`_`).replace(/[^a-z0-9_]/g,``).replace(/_+/g,`_`).replace(/^_|_$/g,``)||`document`,p=H(r).replace(`YYYY`,String(i)).replace(`MM`,a).replace(`DD`,l).replace(`HH`,u).replace(`mm`,d).replace(/\[Category\]/i,`[${t}]`).replace(/(?<![a-z0-9])(?:title_words|title)(?![a-z0-9])/i,f)+`.md`;return H(o)?H(o)+`/`+p:p});function D(){I(u,!H(u)),H(u)&&ee(H(i)||H(n))}async function ee(e){I(p,!0),I(m,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(i,t.current,!0),I(a,t.parent,!0),I(o,x(t.current),!0),I(d,t.current,!0),I(l,H(o)?`/`+H(o):`/ (root)`,!0),I(f,t.dirs||[],!0)}catch{I(m,!0),I(f,[],!0)}finally{I(p,!1)}}let O=P(()=>H(i)===H(n));function k(){H(i)!==H(n)&&H(a)&&ee(H(a))}function A(){let e=H(h).trim();if(!e)return;let t=H(i)||H(n);if(t===H(n)&&(e===`files`||e===`images`)){I(_,X(`modal.new_folder.error_reserved`),!0);return}I(_,``);let r=(x(t)?x(t)+`/`:``)+e;I(o,r),I(l,`/`+r),I(h,``)}async function te(){let e=H(s).trim(),n=b(H(c))||`GENERAL`;if(!e){I(_,X(`modal.new_doc.error_empty_title`),!0);return}I(_,``),I(v,!0);try{let r=await fetch(`/api/documents`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:e,category:n,folder:H(o)})});if(!r.ok){let e=await r.json();throw Error(e.error||`Creation failed`)}let i=await r.json();t.onclose(),t.onsuccess(i.id)}catch(e){I(_,X(`common.error_prefix`)+(e instanceof Error?e.message:String(e))),I(v,!1)}}function ne(e){e.key===`Enter`&&te(),e.key===`Escape`&&t.onclose()}var re=Ur(),ie=z(re),ae=e=>{var n=s_(),r=R(n),i=R(r),a=B(R(i)),o=R(a,!0);N(a),N(i);var b=B(i,2),x=R(b),S=R(x,!0);N(x);var C=B(x,2);Ei(C),Li(C,e=>I(y,e),()=>H(y)),N(b);var w=B(b,2),re=R(w),ie=R(re,!0);N(re);var ae=B(re,2);Ei(ae);var oe=B(ae,2);J(oe,20,()=>H(g),e=>e,(e,t)=>{var n=e_(),r={};V(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),G(e,n)}),N(oe),N(w);var se=B(w,2),ce=R(se),le=R(ce,!0);N(ce);var ue=B(ce,2),de=R(ue),fe=R(de,!0);N(de);var pe=B(de,2),me=B(R(pe)),he=R(me,!0);N(me),N(pe),N(ue);var ge=B(ue,2),_e=e=>{var t=a_(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),l=e=>{var t=t_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},u=e=>{var t=n_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.cannot_read_dir`)]),G(e,t)},g=e=>{var t=r_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`modal.new_doc.no_subfolders`)]),G(e,t)},_=e=>{var t=Ur();J(z(t),17,()=>H(f),e=>e.path,(e,t)=>{var n=i_(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>ee(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(p)?e(l):H(m)?e(u,1):H(f).length===0?e(g,2):e(_,-1)}),N(s);var v=B(s,2),y=R(v);Ei(y);var b=B(y,2),x=R(b,!0);N(b),N(v),N(t),V((e,t,n)=>{r.disabled=H(O),K(i,`↑ ${e??``}`),K(o,H(d)),Y(y,`placeholder`,t),K(x,n)},[()=>X(`common.up`),()=>X(`modal.new_doc.new_folder_placeholder`),()=>X(`modal.new_doc.create_folder_btn`)]),U(`click`,r,k),U(`keydown`,y,e=>{e.key===`Enter`&&A()}),Mi(y,()=>H(h),e=>I(h,e)),U(`click`,b,A),G(e,t)};q(ge,e=>{H(u)&&e(_e)}),N(se);var ve=B(se,2),ye=R(ve),be=R(ye,!0);N(ye);var xe=B(ye,2),Se=R(xe,!0);N(xe),N(ve);var j=B(ve,2),Ce=e=>{var t=o_(),n=R(t,!0);N(t),V(()=>K(n,H(_))),G(e,t)};q(j,e=>{H(_)&&e(Ce)});var M=B(j,2),we=R(M),Te=R(we,!0);N(we);var Ee=B(we,2),De=R(Ee,!0);N(Ee),N(M),N(r),N(n),V((e,t,n,r,i,a,s,c,u)=>{K(o,e),K(S,t),Y(C,`placeholder`,n),K(ie,r),K(le,i),K(fe,H(l)),K(he,a),K(be,s),K(Se,H(E)),K(Te,c),Ee.disabled=H(v),K(De,u)},[()=>X(`modal.new_doc.title`),()=>X(`modal.new_doc.title_label`),()=>X(`modal.new_doc.title_placeholder`),()=>X(`modal.new_doc.category_label`),()=>X(`modal.new_doc.location_label`),()=>X(`modal.new_doc.browse_btn`),()=>X(`modal.new_doc.filename_label`),()=>X(`common.cancel`),()=>H(v)?X(`modal.new_folder.creating_btn`):X(`common.create`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),U(`keydown`,C,ne),Mi(C,()=>H(s),e=>I(s,e)),U(`input`,ae,T),U(`keydown`,ae,ne),Mi(ae,()=>H(c),e=>I(c,e)),U(`click`,pe,D),U(`click`,we,function(...e){t.onclose?.apply(this,e)}),U(`click`,Ee,te),G(e,n)};q(ie,e=>{t.open&&e(ae)}),G(e,re),Ke()}Nr([`click`,`keydown`,`input`]);var l_=W(`<p class="text-sm text-gray-400 py-2"> </p>`),u_=W(`<p class="text-sm text-red-500"> </p>`),d_=W(`<label class="flex items-center gap-3 px-1 py-1.5 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer"><input type="checkbox" class="w-4 h-4 rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500"/> <span class="text-sm text-gray-700 dark:text-gray-300"> </span></label>`),f_=W(`<div><div class="max-h-48 overflow-y-auto space-y-0.5 border border-gray-200 dark:border-gray-700 rounded-lg p-2"><!></div></div>`),p_=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),m_=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg border border-blue-500 text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 font-semibold transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),h_=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><i class="fa-solid fa-file-export mr-2 text-blue-500"></i> <span> </span></h3> <div class="flex gap-0 border-b border-gray-200 dark:border-gray-700"><button> </button> <button> </button> <button> </button></div> <!> <!> <!> <!></div></div>`);function g_(e,t){Ge(t,!0);let n=F(`markdown`),r=!1,i=F(!1),a=F(!1),o=F(L([])),s=F(L({})),c=F(!1),l=F(!1),u=F(!1),d=F(!1),f=!1;On(()=>{t.open&&!f?(f=!0,I(n,`markdown`),r=!1,I(o,[],!0),I(s,{},!0)):t.open||(f=!1)});function p(e){return String(e??``).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function m(e){I(n,e,!0),e===`html`&&h()}async function h(){if(!r){I(i,!0),I(a,!1);try{let e=await fetch(`/api/documents`).then(e=>e.json()),t=new Set;e.forEach(e=>t.add(e.folder?.[0]??e.category??`General`)),I(o,[...t].sort((e,t)=>e===`General`?-1:t===`General`?1:e.localeCompare(t)),!0),r=!0}catch{I(a,!0)}finally{I(i,!1)}}}async function g(){I(c,!0);try{let e=await fetch(`/api/export/markdown`,{method:`POST`,headers:{"Content-Type":`application/json`},body:`{}`});if(!e.ok)throw Error(await e.text());let n=await e.blob(),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`export-markdown.zip`,i.click(),URL.revokeObjectURL(r),t.onclose()}catch(e){alert(X(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(c,!1)}}async function _(e){let n=H(o).filter(e=>H(s)[e]);if(n.length){I(e===`confluence`?u:l,!0);try{let r=await fetch(`/api/export/html`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folders:n,mode:e})});if(!r.ok)throw Error(await r.text());let i=await r.blob(),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=`export-${e}.zip`,o.click(),URL.revokeObjectURL(a),t.onclose()}catch(e){alert(X(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(u,!1),I(l,!1)}}}async function v(){I(d,!0);try{let e=Z.allDocs&&Z.allDocs.length?Z.allDocs:await fetch(`/api/documents`).then(e=>e.json()),n={};for(let t=0;t<e.length;t+=5){let r=e.slice(t,t+5),i=await Promise.all(r.map(e=>fetch(`/api/documents/`+e.id).then(e=>e.ok?e.json():null).catch(()=>null)));for(let r of i)r&&(n[r.id??e[t]?.id]=r);r.forEach((e,t)=>{i[t]&&(n[e.id]=i[t])})}function r(e){let t={categories:{},children:{}};for(let n of e){let e=t;for(let t of n.folder||[])e.children[t]||(e.children[t]={categories:{},children:{}}),e=e.children[t];e.categories[n.category]||(e.categories[n.category]=[]),e.categories[n.category].push(n)}return t}function i(e){let t=[];e.categories.General&&t.push(...e.categories.General);let n=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let r of n)t.push(...i(e.children[r]));let r=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let n of r)t.push(...e.categories[n]);return t}function a(e){return e.replace(/^\d+_/,``).replace(/[_-]+/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function o(e,t){let n=``,r=t*1.25,i=(e,i)=>{let a=t===0&&e===`General`?`General`:e;n+=`<li style="margin-left:${r}rem;margin-top:${t===0?`0.75`:`0.4`}rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#6b7280;">${a}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`;for(let e of i)n+=`<li style="margin-left:${r+.75}rem;padding:0.15rem 0;">`,n+=`<a href="#doc-${e.id}" style="color:#1d4ed8;text-decoration:none;font-size:0.875rem;">${p(e.title)}</a>`,e.formattedDate&&(n+=`<span style="color:#9ca3af;font-size:0.7rem;margin-left:0.5rem;">${p(e.formattedDate)}</span>`),n+=`</li>`;n+=`</ul></li>`};e.categories.General&&i(`General`,e.categories.General);let s=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let i of s)n+=`<li style="margin-left:${r}rem;margin-top:0.75rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#7c3aed;">📁 ${a(i)}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`,n+=o(e.children[i],t+1),n+=`</ul></li>`;let c=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let t of c)i(t,e.categories[t]);return n}function s(e){return e.replace(/href="[^"]*\?doc=([^"&#]+)(?:#[^"]*)?"/g,(e,t)=>`href="#doc-${t}"`)}let c=p(document.title||`Living Documentation`),l=r(e),u=i(l),d=`<!DOCTYPE html>
|
|
107
|
+
`)}\n---\n`+e.slice(r.length)}var Sg=e=>e.normalize(`NFC`).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toLowerCase();function Cg(e,t){let n=Sg(t);if(!n)return[];let r=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),i=[];for(;r.nextNode();)i.push(r.currentNode);let a=0;i.forEach(e=>{let t=(e.textContent||``).normalize(`NFC`),r=Sg(t);if(!r.includes(n))return;let i=``,o=0;for(;o<=r.length;){let e=r.indexOf(n,o);if(e===-1){i+=t.slice(o);break}i+=t.slice(o,e),i+=`<mark id="match-${a++}">${t.slice(e,e+n.length)}</mark>`,o=e+n.length}let s=document.createElement(`span`);s.innerHTML=i,e.parentNode.replaceChild(s,e)});let o=[];return e.querySelectorAll(`mark[id^='match-']`).forEach(e=>{let r=((e.closest(`p, li, td, h1, h2, h3, h4, h5, h6, pre`)||e.parentElement).textContent||``).trim(),i=Sg(r).indexOf(n),a=Math.max(0,i-40),s=Math.min(r.length,i+t.length+40),c=(a>0?`…`:``)+r.slice(a,s)+(s<r.length?`…`:``);o.push({id:e.id,snippet:c})}),o}function wg(e){let t=document.getElementById(e),n=document.getElementById(`home-content-area`);if(!t||!n)return;let r=t.parentElement;for(;r&&r!==n;)r.tagName===`DETAILS`&&!r.open&&(r.open=!0),r=r.parentElement;document.querySelectorAll(`mark.match-active`).forEach(e=>e.classList.remove(`match-active`)),t.classList.add(`match-active`);let i=document.querySelector(`#home-doc-view header`),a=i?i.getBoundingClientRect().height:0,o=t.getBoundingClientRect().top,s=n.getBoundingClientRect().top,c=a+(n.clientHeight-a)/3;n.scrollTop+=o-s-c}var Tg=W(`<span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-violet-100 text-violet-700 dark:bg-violet-900/40 dark:text-violet-300"> </span>`),Eg=W(`<span class="text-xs text-gray-400 dark:text-gray-500"> </span>`),Dg=W(`<span> </span>`),Og=W(`<div data-testid="edit-actions" class="flex items-center gap-2"><!> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div>`),kg=W(`<button data-testid="validate-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-green-700 bg-green-600 text-white font-semibold hover:bg-green-700 transition-colors"><i class="fa-solid fa-check" style="margin-right:4px"></i> </button>`),Ag=W(`<button data-testid="tts-toggle" class="no-print text-sm px-3 py-1.5 rounded-lg border border-blue-300 dark:border-blue-700 bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400 hover:bg-blue-100 dark:hover:bg-blue-900/50 transition-colors"><i></i></button> <button data-testid="tts-stop" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-stop"></i></button>`,1),jg=W(`<button data-testid="tts-play" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-headphones" style="margin-right:4px"></i> </button>`),Mg=Vr(`<g><line x1="8" y1="8" x2="92" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line><line x1="92" y1="8" x2="8" y2="92" stroke="currentColor" stroke-width="8" stroke-linecap="round"></line></g>`),Ng=W(`<div data-testid="view-actions" class="flex items-center gap-2"><!> <!> <button><svg width="18" height="18" viewBox="0 0 100 100" fill="none" style="display:inline-block;vertical-align:middle;margin-right:4px"><rect x="28" y="10" width="44" height="52" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><rect x="52" y="8" width="22" height="30" rx="6" transform="rotate(40 50 50)" stroke="currentColor" stroke-width="6"></rect><polygon points="28,60 10,80 30,80 38,72" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><polygon points="28,48 19,70 36,75 55,70" stroke="currentColor" stroke-width="5" stroke-linejoin="round"></polygon><line x1="10" y1="90" x2="72" y2="90" stroke="currentColor" stroke-width="6" stroke-linecap="round"></line><!></svg> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-link"></i> </button> <button data-testid="metadata-btn" class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-code-compare"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors"><i class="fa-solid fa-file-pen"></i> </button> <button class="no-print text-sm px-3 py-1.5 rounded-lg border border-red-200 dark:border-red-700 text-red-500 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/40 transition-colors"><i class="fa-solid fa-trash"></i> </button> <button><i class="fa-solid fa-list-ul"></i></button></div>`),Pg=W(`<span class="text-gray-300 dark:text-gray-600 mx-1">·</span>`),Fg=W(`<!> <button class="text-blue-600 dark:text-blue-400 hover:underline"> </button>`,1),Ig=W(`<div class="no-print mt-2 flex flex-wrap gap-1 text-xs"></div>`),Lg=W(`<li><button class="w-full text-left px-3 py-1.5 hover:bg-yellow-100 dark:hover:bg-yellow-900/30 transition-colors"><span class="text-yellow-600 dark:text-yellow-500 font-mono text-xs mr-2"> </span><span class="text-xs"> </span></button></li>`),Rg=W(`<div class="mt-4 rounded-lg bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-sm text-yellow-800 dark:text-yellow-300 overflow-hidden"><div class="px-3 py-2 font-medium border-b border-yellow-200 dark:border-yellow-800"> </div> <ol class="max-h-40 overflow-y-auto divide-y divide-yellow-100 dark:divide-yellow-900/40 list-none m-0 p-0"></ol></div>`),zg=W(`<div data-testid="tts-error" class="mt-4 rounded-lg border border-red-200 bg-red-50 px-3 py-2 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/20 dark:text-red-300"> </div>`),Bg=W(`<li class="m-0 p-0"><a class="block text-xs text-gray-500 dark:text-gray-400 hover:text-blue-600 dark:hover:text-blue-400 hover:underline py-0.5 leading-snug transition-colors truncate"> </a></li>`),Vg=W(`<div></div> <aside class="no-print shrink-0 sticky self-start overflow-y-auto py-8 pr-4 pl-3 ld-toc-aside"><p class="text-xs font-semibold uppercase tracking-wider text-gray-400 dark:text-gray-500 mb-3"> </p> <nav><ul class="space-y-1 list-none m-0 p-0"></ul></nav></aside>`,1),Hg=W(`<div data-testid="tts-language-modal" class="fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4"><div class="w-full max-w-sm rounded-xl border border-gray-200 bg-white p-5 shadow-2xl dark:border-gray-700 dark:bg-gray-900"><h2 class="text-base font-semibold text-gray-900 dark:text-gray-50"> </h2> <p class="mt-2 text-sm text-gray-600 dark:text-gray-300"> </p> <div class="mt-4 grid grid-cols-2 gap-2"><button type="button" data-testid="tts-language-en" class="rounded-lg border border-gray-200 px-3 py-2 text-sm font-semibold text-gray-700 transition-colors hover:bg-gray-50 disabled:opacity-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800"> </button> <button type="button" data-testid="tts-language-fr" class="rounded-lg border border-gray-200 px-3 py-2 text-sm font-semibold text-gray-700 transition-colors hover:bg-gray-50 disabled:opacity-50 dark:border-gray-700 dark:text-gray-200 dark:hover:bg-gray-800"> </button></div> <div class="mt-3 flex justify-end"><button type="button" class="rounded-lg border border-gray-200 px-3 py-1.5 text-sm text-gray-600 transition-colors hover:bg-gray-50 disabled:opacity-50 dark:border-gray-700 dark:text-gray-300 dark:hover:bg-gray-800"> </button></div></div></div>`),Ug=W(`<div class="fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4"><div class="w-full max-w-sm bg-white dark:bg-gray-900 border border-red-200 dark:border-red-700 rounded-xl shadow-2xl p-5 flex flex-col gap-3"><p class="text-sm text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-500 dark:text-gray-400 italic truncate"> </p> <div class="flex justify-end gap-2 mt-2"><button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-1.5 rounded-lg bg-red-500 hover:bg-red-600 text-white font-semibold transition-colors"> </button></div></div></div>`),Wg=W(`<header id="home-doc-header" class="sticky top-0 z-10 bg-gray-50 dark:bg-gray-950 px-6 pt-8 pb-6 border-b border-gray-300 dark:border-gray-800"><div class="flex items-start gap-4 flex-wrap"><div class="shrink min-w-0"><div class="flex items-center gap-2 mb-2 flex-wrap"><span class="flex items-center gap-2 flex-wrap"><!> <span class="inline-block text-xs font-semibold px-2.5 py-0.5 rounded-full bg-blue-100 text-blue-700 dark:bg-blue-900/40 dark:text-blue-300"> </span></span> <!></div> <div class="flex items-center gap-2"><h1 data-testid="doc-title" class="min-w-0 text-2xl font-bold text-gray-900 dark:text-gray-50 leading-tight"> </h1> <button type="button" data-testid="copy-doc-id-btn"><i aria-hidden="true"></i></button></div></div> <div class="flex items-center gap-2 flex-wrap ml-auto"><!></div></div> <!> <!> <!> <!> <div class="hidden no-print"></div></header> <div class="flex min-h-full items-start"><article id="home-doc-view" data-testid="doc-view" class="flex-1 min-w-0 px-6 pt-8 pb-8"><!></article> <!></div> <!> <!> <!> <!> <!>`,1);function Gg(e,t){Ge(t,!0);let n=Bi(t,`navHistory`,19,()=>[]),r=F(null),i=F(null),a=F(null),o=F(null),s=F(!1),c=F(null),l=F(L([])),u=``,d=P(()=>H(l).length?X(H(l).length===1?`search.notice_singular`:`search.notice_plural`).replace(`{count}`,String(H(l).length)).replace(`{query}`,Z.searchQuery):``),f=P(()=>jh(t.doc.content)),p=P(()=>(H(f)||``).toUpperCase()===`TO BE VALIDATED`),m=F(!1),h=F(null),g=F(!1),_=F(!1),v=F(!1),y=F(!1),b=F(!1);function x(e){let t=document.getElementById(`home-content-area`),n=document.getElementById(e);if(!t||!n)return;let r=document.querySelector(`#home-doc-view header`),i=r?r.getBoundingClientRect().height:0;t.scrollTop+=n.getBoundingClientRect().top-t.getBoundingClientRect().top-i-8}function S(e){I(r,e,!0);let n=t.doc.id,i=Z.searchQuery,o=typeof i==`string`&&i.toLowerCase().startsWith(`metadata://`);I(l,i&&!o?Cg(e,i):[],!0),H(c)&&rg(e,H(c),X),n===u?H(a)?.apply():(u=n,H(a)?.load(n),Dh.load(n)),I(E,Array.from(e.querySelectorAll(`h1,h2,h3,h4,h5,h6`)).map(e=>({id:e.id,text:e.textContent?.trim()??``,level:parseInt(e.tagName[1])})).filter(e=>e.id&&e.text),!0)}function C(){return H(o).show({title:X(`snippet.inline_delete_title`),message:X(`snippet.inline_delete_message`),confirmLabel:X(`snippet.inline_delete_confirm_btn`),cancelLabel:X(`common.cancel`),danger:!0})}async function w(){let e=1;try{let n=await Dh.load(t.doc.id);n&&typeof n.accuracy==`number`&&(e=n.accuracy)}catch{}let n=Math.round(e*100),r=n<100,i=Nh(t.doc.id),a=X(i?`doc.validate_worklog_message`:`doc.validate_message`),s=r?X(`doc.validate_detail_low_accuracy`).replace(`{accuracy}`,n+`%`):void 0;if(!await H(o).show({title:X(`doc.validate_title`),message:a,detail:s,confirmLabel:X(`doc.validate_confirm`),cancelLabel:X(`common.cancel`)}))return;let c=Mh(t.doc.content,i?`Done`:`Accepted`);if(c!==t.doc.content)try{await t.onsave(c),r&&await fetch(`/api/metadata/`+encodeURIComponent(t.doc.id)+`/refresh`,{method:`POST`}),await Dh.load(t.doc.id),Z.docStatuses={...Z.docStatuses,[t.doc.id]:i?`Done`:`Accepted`}}catch(e){I(h,{text:X(`doc.validate_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}}On(()=>{try{I(g,localStorage.getItem(`ld-full-width`)===`1`)}catch{}});let T=F(!1),E=F(L([])),D=P(()=>H(T)&&H(E).length>0),ee=`ld-toc-w`,O=F(!1),k=F(null),A=F(null),te=F(0);On(()=>{if(!H(A))return;let e=new ResizeObserver(()=>{I(te,H(A).offsetHeight,!0)});return e.observe(H(A)),I(te,H(A).offsetHeight,!0),()=>e.disconnect()});function ne(e){if(e.preventDefault(),!H(k))return;let t=e.clientX,n=H(k).getBoundingClientRect().width;I(O,!0),H(k).style.transition=`none`,document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`;let r=e=>{let r=Math.max(160,Math.min(400,n-(e.clientX-t)));H(k).style.width=r+`px`},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i),document.body.style.cursor=``,document.body.style.userSelect=``,I(O,!1),H(k).style.transition=``;try{localStorage.setItem(ee,String(parseInt(H(k).style.width,10)))}catch{}};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)}On(()=>{try{I(T,localStorage.getItem(`ld-toc-open`)===`1`)}catch{}try{let e=parseInt(localStorage.getItem(ee)||``,10);H(k)&&e>=160&&e<=400&&(H(k).style.width=e+`px`)}catch{}});function re(){I(T,!H(T));try{localStorage.setItem(`ld-toc-open`,H(T)?`1`:`0`)}catch{}}function ie(e){let t=document.getElementById(e),n=document.getElementById(`home-content-area`),r=document.getElementById(`home-doc-header`);if(!t||!n)return;let i=t.parentElement;for(;i&&i!==n;)i.tagName===`DETAILS`&&(i.open=!0),i=i.parentElement;let a=r?r.getBoundingClientRect().height:0,o=t.getBoundingClientRect().top-n.getBoundingClientRect().top+n.scrollTop;n.scrollTo({top:o-a-16,behavior:`smooth`})}async function ae(){try{await navigator.clipboard.writeText(location.href)}catch{}}async function oe(){try{await navigator.clipboard.writeText(decodeURIComponent(t.doc.id)),I(v,!0),setTimeout(()=>I(v,!1),1800)}catch{}}function se(){window.print()}function ce(e){H(r)&&gg.start(H(r),{language:e,codeLabel:X(`tts.code_label`),imageLabel:X(`tts.image_label`),diagramLabel:X(`tts.diagram_label`),tableLabel:X(`tts.table_label`)})}function le(){let e=bg(t.doc.content);if(!e){I(y,!0);return}ce(e)}async function ue(e){I(b,!0);try{let n=xg(t.doc.content,e);n!==t.doc.content&&await t.onsave(n),I(y,!1),ce(e)}catch(e){I(h,{text:X(`tts.language_save_failed`)+(e instanceof Error?e.message:String(e)),cls:`text-red-500 dark:text-red-400`},!0)}finally{I(b,!1)}}On(()=>(t.doc.id,H(m),()=>{I(y,!1),gg.stop()}));var de=Wg(),fe=z(de),pe=R(fe),me=R(pe),he=R(me),ge=R(he),_e=R(ge);J(_e,17,()=>t.doc.folder||[],Yr,(e,t)=>{var n=Tg(),r=R(n,!0);N(n),V(e=>{Y(n,`title`,H(t)),K(r,e)},[()=>Hm(H(t))]),G(e,n)});var ve=B(_e,2),ye=R(ve,!0);N(ve),N(ge);var be=B(ge,2),xe=e=>{var n=Eg(),r=R(n,!0);N(n),V(()=>K(r,t.doc.formattedDate)),G(e,n)};q(be,e=>{t.doc.formattedDate&&e(xe)}),N(he);var Se=B(he,2),j=R(Se),Ce=R(j,!0);N(j);var M=B(j,2),we=R(M);N(M),N(Se),N(me);var Te=B(me,2),Ee=R(Te),De=e=>{var t=Og(),n=R(t),r=e=>{var t=Dg(),n=R(t,!0);N(t),V(()=>{hi(t,1,`text-xs ${H(h).cls??``}`),K(n,H(h).text)}),G(e,t)};q(n,e=>{H(h)&&e(r)});var a=B(n,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(t),V((e,t,n,r)=>{K(o,e),Y(s,`title`,t),K(c,n),K(u,r)},[()=>X(`common.cancel`),()=>X(`doc.snippets`),()=>X(`doc.snippets_btn`),()=>X(`common.save`)]),U(`click`,a,()=>H(i).cancelEdit()),U(`click`,s,()=>H(i).openSnippets()),U(`click`,l,()=>H(i).save()),G(e,t)},Oe=e=>{let t=P(()=>Z.markerActive?`#fef08a`:`#bfdbfe`),n=P(()=>Z.markerActive?`#fef08a`:`#93c5fd`),r=P(()=>Z.markerActive?`#fde047`:`#93c5fd`);var a=Ng(),o=R(a),c=e=>{var t=kg(),n=B(R(t),1,!0);N(t),V((e,r)=>{Y(t,`title`,e),K(n,r)},[()=>X(`doc.validate_mode`),()=>X(`doc.validate_btn`)]),U(`click`,t,w),G(e,t)};q(o,e=>{H(p)&&e(c)});var l=B(o,2),u=e=>{var t=Ag(),n=z(t),r=R(n);N(n);var i=B(n,2);V((e,t)=>{Y(n,`title`,e),hi(r,1,`fa-solid ${gg.status===`playing`?`fa-pause`:`fa-play`}`),Y(i,`title`,t)},[()=>gg.status===`playing`?X(`tts.pause`):X(`tts.resume`),()=>X(`tts.stop`)]),U(`click`,n,()=>gg.toggle()),U(`click`,i,()=>gg.stop()),G(e,t)},d=e=>{var t=jg(),n=B(R(t),1,!0);N(t),V((e,r)=>{Y(t,`title`,e),K(n,r)},[()=>X(`tts.play`),()=>X(`tts.play_btn`)]),U(`click`,t,le),G(e,t)};q(l,e=>{gg.active?e(u):e(d,-1)});var f=B(l,2),m=R(f),h=R(m),g=B(h),v=B(g),y=B(v),b=B(y,2),x=e=>{G(e,Mg())};q(b,e=>{Z.markerHidden&&e(x)}),N(m);var S=B(m,1,!0);N(f);var C=B(f,2),E=R(C);N(C);var D=B(C,2),ee=B(R(D));N(D);var O=B(D,2),k=B(R(O));N(O);var A=B(O,2),te=B(R(A));N(A);var ne=B(A,2),ie=B(R(ne));N(ne);var oe=B(ne,2);N(a),V((e,i,a,o,s,c,l,u,d,p,m,_,b)=>{Y(f,`title`,e),hi(f,1,`no-print text-sm px-3 py-1.5 rounded-lg border transition-colors ${Z.markerActive?`border-yellow-400 bg-yellow-100 dark:bg-yellow-900/40 text-yellow-700 dark:text-yellow-300`:`border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700`}`),Y(h,`fill`,H(t)),Y(g,`fill`,H(n)),Y(v,`fill`,H(r)),Y(y,`fill`,H(r)),K(S,i),Y(C,`title`,a),K(E,`📄 ${o??``}`),Y(D,`title`,s),K(ee,` ${c??``}`),Y(O,`title`,l),K(k,` ${u??``}`),Y(A,`title`,d),K(te,` ${p??``}`),Y(ne,`title`,m),K(ie,` ${_??``}`),Y(oe,`title`,b),hi(oe,1,`no-print text-sm px-3 py-1.5 rounded-lg border transition-colors ${H(T)?`border-blue-400 bg-blue-50 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400`:`border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700`}`)},[()=>X(`doc.marker_mode`),()=>X(`doc.marker_btn`),()=>X(`doc.export_pdf`),()=>X(`doc.export_pdf_btn`),()=>X(`doc.copy_link`),()=>X(`doc.copy_link_btn`),()=>X(`metadata.button_title`),()=>X(`metadata.button`),()=>X(`doc.edit`),()=>X(`doc.edit_btn`),()=>X(`doc.delete`),()=>X(`doc.delete_btn`),()=>X(`doc.toc_toggle`)]),U(`click`,f,()=>Z.toggleMarker()),U(`click`,C,se),U(`click`,D,ae),U(`click`,O,()=>I(s,!0)),U(`click`,A,()=>H(i).enterEdit()),U(`click`,ne,()=>I(_,!0)),U(`click`,oe,re),G(e,a)};q(Ee,e=>{H(m)?e(De):e(Oe,-1)}),N(Te),N(pe);var ke=B(pe,2),Ae=e=>{kh(e,{onopen:()=>I(s,!0)})};q(ke,e=>{H(m)||e(Ae)});var je=B(ke,2),Me=e=>{var r=Ig();J(r,21,n,Yr,(e,n,r)=>{var i=Fg(),a=z(i),o=e=>{G(e,Pg())};q(a,e=>{r>0&&e(o)});var s=B(a,2),c=R(s);N(s),V(()=>K(c,`← ${H(n).title??``}`)),U(`click`,s,()=>t.ongoback?.(r)),G(e,i)}),N(r),G(e,r)};q(je,e=>{!H(m)&&n().length&&e(Me)});var Ne=B(je,2),Pe=e=>{var t=Rg(),n=R(t),r=R(n,!0);N(n);var i=B(n,2);J(i,23,()=>H(l),e=>e.id,(e,t,n)=>{var r=Lg(),i=R(r),a=R(i),o=R(a);N(a);var s=B(a),c=R(s,!0);N(s),N(i),N(r),V(()=>{K(o,`${H(n)+1}.`),K(c,H(t).snippet)}),U(`click`,i,()=>wg(H(t).id)),G(e,r)}),N(i),N(t),V(()=>K(r,H(d))),G(e,t)};q(Ne,e=>{!H(m)&&H(l).length&&Z.searchQuery&&e(Pe)});var Fe=B(Ne,2),Ie=e=>{var t=zg(),n=R(t,!0);N(t),V(()=>K(n,gg.error)),G(e,t)};q(Fe,e=>{!H(m)&&gg.error&&e(Ie)}),Li(B(Fe,2),e=>I(c,e),()=>H(c)),N(fe),Li(fe,e=>I(A,e),()=>H(A));var Le=B(fe,2),Re=R(Le);Li(ru(R(Re),{get docId(){return t.doc.id},get content(){return t.doc.content},get html(){return t.doc.html},get onsave(){return t.onsave},get onopen(){return t.onopen},onanchor:x,onconfirmdelete:C,oncontentwired:S,get rewireSignal(){return Z.searchQuery},get editing(){return H(m)},set editing(e){I(m,e,!0)},get saveMsg(){return H(h)},set saveMsg(e){I(h,e,!0)}}),e=>I(i,e,!0),()=>H(i)),N(Re);var ze=B(Re,2),Be=e=>{var t=Vg(),n=z(t),r=B(n,2),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o);J(s,21,()=>H(E),Yr,(e,t)=>{var n=Bg(),r=R(n),i=R(r,!0);N(r),N(n),V(()=>{_i(n,`padding-left: ${(H(t).level-1)*.75}rem`),Y(r,`href`,`#${H(t).id??``}`),Y(r,`title`,H(t).text),K(i,H(t).text)}),U(`mousedown`,r,e=>e.preventDefault()),U(`click`,r,e=>{e.preventDefault(),ie(H(t).id)}),G(e,n)}),N(s),N(o),N(r),Li(r,e=>I(k,e),()=>H(k)),V(e=>{hi(n,1,`no-print w-1 shrink-0 self-stretch cursor-col-resize select-none transition-colors ${H(O)?`bg-blue-500/60`:`bg-transparent hover:bg-blue-500/40`}`),_i(r,`width: 224px; top: ${H(te)??``}px; max-height: calc(100vh - ${H(te)??``}px)`),K(a,e)},[()=>X(`doc.toc_title`)]),U(`mousedown`,n,ne),G(e,t)};q(ze,e=>{H(D)&&e(Be)}),N(Le);var Ve=B(Le,2);Li(xh(Ve,{get contentEl(){return H(r)},get docId(){return t.doc.id}}),e=>I(a,e,!0),()=>H(a));var He=B(Ve,2);Xh(He,{get open(){return H(s)},get docId(){return t.doc.id},get content(){return t.doc.content},onclose:()=>I(s,!1)});var Ue=B(He,2);Li(wl(Ue,{}),e=>I(o,e,!0),()=>H(o));var We=B(Ue,2),qe=e=>{var t=Hg(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s),l=R(c,!0);N(c);var u=B(c,2),d=R(u,!0);N(u),N(s);var f=B(s,2),p=R(f),m=R(p,!0);N(p),N(f),N(n),N(t),V((e,t,n,r,a)=>{K(i,e),K(o,t),c.disabled=H(b),K(l,n),u.disabled=H(b),K(d,r),p.disabled=H(b),K(m,a)},[()=>X(`tts.language_title`),()=>X(`tts.language_message`),()=>X(`tts.language_en`),()=>X(`tts.language_fr`),()=>X(`common.cancel`)]),U(`click`,t,e=>{e.target===e.currentTarget&&!H(b)&&I(y,!1)}),U(`click`,c,()=>ue(`en`)),U(`click`,u,()=>ue(`fr`)),U(`click`,p,()=>I(y,!1)),G(e,t)};q(We,e=>{H(y)&&e(qe)});var Je=B(We,2),Ye=e=>{var n=Ug(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d,!0);N(d),N(c),N(r),N(n),V((e,n,r)=>{K(a,e),K(s,t.doc.title),K(u,n),K(f,r)},[()=>X(`doc.confirm_delete`),()=>X(`common.cancel`),()=>X(`doc.confirm_delete_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&I(_,!1)}),U(`click`,l,()=>I(_,!1)),U(`click`,d,async()=>{I(_,!1),await t.ondelete()}),G(e,n)};q(Je,e=>{H(_)&&e(Ye)}),V(e=>{K(ye,t.doc.category),K(Ce,t.doc.title),Y(M,`title`,e),hi(M,1,`no-print inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition-colors hover:bg-gray-50 hover:text-blue-600 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-800 dark:hover:text-blue-400 ${H(v)?`text-green-600 dark:text-green-400`:``}`),hi(we,1,`fa-${H(v)?`solid fa-check`:`regular fa-copy`}`)},[()=>X(`doc.copy_mcp_id`)]),U(`click`,M,oe),G(e,de),Ke()}Nr([`click`,`mousedown`]);var Kg=/[\u0300-\u036f]/g,qg=/[^a-zA-Z0-9_.-]+/g;function Jg(e){return(e||``).normalize(`NFD`).replace(Kg,``).trim().replace(qg,`_`).replace(/_+/g,`_`).replace(/^_+|_+$/g,``)}var Yg=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),Xg=W(`<p class="px-3 py-3 text-xs text-red-400 text-center"> </p>`),Zg=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),Qg=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">📁</span> <span class="truncate text-gray-700 dark:text-gray-300"> </span></button>`),$g=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden text-sm"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="text-xs text-gray-500 dark:text-gray-400 font-mono truncate flex-1"> </span></div> <div class="max-h-40 overflow-y-auto divide-y divide-gray-100 dark:divide-gray-800"><!></div></div>`),e_=W(`<p class="text-xs text-red-500"> </p>`),t_=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-md mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><svg width="16" height="16" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg" class="inline-block mr-1 align-text-bottom"><path d="M2 5a2 2 0 012-2h3.586a1 1 0 01.707.293L9.707 4.707A1 1 0 0010.414 5H16a2 2 0 012 2v8a2 2 0 01-2 2H4a2 2 0 01-2-2V5z" stroke="currentColor" stroke-width="1.5" fill="none"></path><line x1="10" y1="8" x2="10" y2="14" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line><line x1="7" y1="11" x2="13" y2="11" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"></line></svg> <span> </span></h3> <div class="space-y-1.5"><label for="new-folder-name" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-folder-name" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 text-sm text-gray-600 dark:text-gray-300 font-mono truncate"> </span> <button class="text-xs px-2 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-500 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0"> </button></div> <!></div> <div class="space-y-1"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs font-mono text-gray-500 dark:text-gray-400 bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 truncate"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function n_(e,t){Ge(t,!0);let n=F(``),r=F(null),i=F(null),a=F(``),o=F(``),s=F(`/ (root)`),c=F(!1),l=F(``),u=F(L([])),d=F(!1),f=F(!1),p=F(``),m=F(!1),h=F(null),g=!1;On(()=>{t.open&&!g?(g=!0,_()):t.open||(g=!1)});async function _(){try{I(n,(await fetch(`/api/config`).then(e=>e.json())).docsFolder||``,!0)}catch{I(n,``)}let e=``;if(Z.currentDocId){let t=decodeURIComponent(Z.currentDocId);if(!t.startsWith(`/`)){let n=t.split(`/`);n.length>1&&(e=n.slice(0,-1).join(`/`))}}I(a,e?H(n)+`/`+e:H(n),!0),I(r,H(a),!0),I(i,null),I(o,``),I(s,e?`/`+e:`/ (root)`,!0),I(c,!1),I(p,``),I(m,!1),setTimeout(()=>H(h)?.focus(),50)}let v=P(()=>{let e=Jg(H(o));if(!e)return X(`modal.new_folder.enter_name`);let t=H(a)||H(n),r=t.startsWith(H(n))?t.slice(H(n).length).replace(/^\//,``):``;return(r?r+`/`:``)+e});function y(){let e=Jg(H(o));H(o)!==e&&I(o,e,!0)}function b(){I(c,!H(c)),H(c)&&x(H(r)||H(n))}async function x(e){I(d,!0),I(f,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(r,t.current,!0),I(i,t.parent,!0),I(a,t.current,!0),I(l,t.current,!0),I(s,(t.current.startsWith(H(n)+`/`)?t.current.slice(H(n).length):t.current===H(n)?``:t.current)||`/ (root)`,!0),I(u,t.dirs||[],!0)}catch{I(f,!0),I(u,[],!0)}finally{I(d,!1)}}let S=P(()=>H(r)===H(n));function C(){H(i)&&x(H(i))}async function w(){let e=Jg(H(o));if(I(p,``),!e){I(p,X(`modal.new_folder.error_empty`),!0);return}if(!/^[a-zA-Z0-9_.-]+$/.test(e)){I(p,X(`modal.new_folder.error_invalid_chars`),!0);return}let r=H(a)||H(n);if(r===H(n)&&(e===`files`||e===`images`)){I(p,X(`modal.new_folder.error_reserved`),!0);return}let i=r.endsWith(`/`)?r+e:r+`/`+e;I(m,!0);try{let e=await fetch(`/api/browse/mkdir`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({path:i})});if(!e.ok)throw Error(await e.text());t.onclose(),t.onsuccess()}catch(e){I(m,!1),I(p,X(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}}var T=Ur(),E=z(T),D=e=>{var n=t_(),r=R(n),i=R(r),a=B(R(i),2),g=R(a,!0);N(a),N(i);var _=B(i,2),T=R(_),E=R(T,!0);N(T);var D=B(T,2);Ei(D),Li(D,e=>I(h,e),()=>H(h)),N(_);var ee=B(_,2),O=R(ee),k=R(O,!0);N(O);var A=B(O,2),te=R(A),ne=R(te,!0);N(te);var re=B(te,2),ie=R(re,!0);N(re),N(A);var ae=B(A,2),oe=e=>{var t=$g(),n=R(t),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),p=e=>{var t=Yg(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},m=e=>{var t=Xg(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`modal.new_folder.error_loading`)]),G(e,t)},h=e=>{var t=Zg(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`modal.new_folder.no_subfolders`)]),G(e,t)},g=e=>{var t=Ur();J(z(t),17,()=>H(u),e=>e.path,(e,t)=>{var n=Qg(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>x(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(d)?e(p):H(f)?e(m,1):H(u).length===0?e(h,2):e(g,-1)}),N(s),N(t),V(e=>{r.disabled=H(S),K(i,e),K(o,H(l))},[()=>X(`common.up`)]),U(`click`,r,C),G(e,t)};q(ae,e=>{H(c)&&e(oe)}),N(ee);var se=B(ee,2),ce=R(se),le=R(ce,!0);N(ce);var ue=B(ce,2),de=R(ue,!0);N(ue),N(se);var fe=B(se,2),pe=e=>{var t=e_(),n=R(t,!0);N(t),V(()=>K(n,H(p))),G(e,t)};q(fe,e=>{H(p)&&e(pe)});var me=B(fe,2),he=R(me),ge=R(he,!0);N(he);var _e=B(he,2),ve=R(_e,!0);N(_e),N(me),N(r),N(n),V((e,t,n,r,i,a,o,c)=>{K(g,e),K(E,t),Y(D,`placeholder`,n),K(k,r),K(ne,H(s)),K(ie,i),K(le,a),K(de,H(v)),K(ge,o),_e.disabled=H(m),K(ve,c)},[()=>X(`modal.new_folder.title`),()=>X(`modal.new_folder.name_label`),()=>X(`modal.new_folder.name_placeholder`),()=>X(`modal.new_folder.location_label`),()=>X(`modal.new_folder.browse_btn`),()=>X(`modal.new_folder.will_be_created`),()=>X(`common.cancel`),()=>H(m)?X(`modal.new_folder.creating_btn`):X(`modal.new_folder.create_btn`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),U(`input`,D,y),Mi(D,()=>H(o),e=>I(o,e)),U(`click`,re,b),U(`click`,he,function(...e){t.onclose?.apply(this,e)}),U(`click`,_e,w),G(e,n)};q(E,e=>{t.open&&e(D)}),G(e,T),Ke()}Nr([`click`,`input`]);var r_=W(`<option></option>`),i_=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),a_=W(`<p class="px-3 py-4 text-xs text-red-400 text-center"> </p>`),o_=W(`<p class="px-3 py-3 text-xs text-gray-400 text-center"> </p>`),s_=W(`<button class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="text-gray-400 shrink-0">📁</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button>`),c_=W(`<div class="border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0"> </button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-40 overflow-y-auto"><!></div> <div class="border-t border-gray-200 dark:border-gray-700 flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800/50"><input type="text" class="flex-1 px-2 py-1 text-xs rounded border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-blue-400"/> <button class="text-xs px-2 py-1 rounded bg-gray-100 dark:bg-gray-800 text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 transition-colors shrink-0"> </button></div></div>`),l_=W(`<p class="text-xs text-red-500"> </p>`),u_=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-lg mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50">➕ <span> </span></h3> <div class="space-y-1.5"><label for="new-doc-title" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-title" type="text" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/></div> <div class="space-y-1.5"><label for="new-doc-category" class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <input id="new-doc-category" type="text" list="new-doc-category-options" autocomplete="off" placeholder="GENERAL" class="w-full px-3 py-2 text-sm rounded-lg border border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <datalist id="new-doc-category-options"></datalist></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <div class="flex items-center gap-2"><span class="flex-1 px-3 py-2 text-xs rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-500 dark:text-gray-400 font-mono truncate"> </span> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">📁 <span> </span></button></div> <!></div> <div class="space-y-1.5"><label class="block text-xs font-medium text-gray-500 dark:text-gray-400"> </label> <p class="text-xs bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 font-mono text-gray-600 dark:text-gray-300 break-all"> </p></div> <!> <div class="flex justify-end gap-3 pt-1"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div></div>`);function d_(e,t){Ge(t,!0);let n=F(``),r=F(`YYYY_MM_DD_HH_mm_[Category]_title`),i=F(null),a=F(null),o=F(``),s=F(``),c=F(``),l=F(`/ (root)`),u=F(!1),d=F(``),f=F(L([])),p=F(!1),m=F(!1),h=F(``),g=F(L([])),_=F(``),v=F(!1),y=F(null);function b(e){return(e||``).normalize(`NFD`).replace(/[̀-ͯ]/g,``).toUpperCase().replace(/[^A-Z0-9_-]/g,``)}function x(e){let t=H(n);return e===t?``:e.startsWith(t+`/`)?e.slice(t.length+1):e}let S=!1;On(()=>{t.open&&!S?(S=!0,C()):t.open||(S=!1)});async function C(){try{let e=await fetch(`/api/config`).then(e=>e.json());I(n,e.docsFolder||``,!0),I(r,e.filenamePattern||`YYYY_MM_DD_HH_mm_[Category]_title`,!0)}catch{I(n,``),I(r,`YYYY_MM_DD_HH_mm_[Category]_title`)}let e=Z.currentDocId&&Z.allDocs.find(e=>e.id===Z.currentDocId),t=b(e&&e.category||`General`)||`GENERAL`,d=``;if(Z.currentDocId){let e=decodeURIComponent(Z.currentDocId);if(!e.startsWith(`/`)){let t=e.split(`/`);t.length>1&&(d=t.slice(0,-1).join(`/`))}}let f=d?H(n)+`/`+d:``;I(o,d,!0),I(i,f||null,!0),I(a,null),w(),I(s,``),I(c,t,!0),I(l,d?`/`+d:`/ (root)`,!0),I(u,!1),I(h,``),I(_,``),I(v,!1),setTimeout(()=>H(y)?.focus(),50)}function w(){let e=new Set;(Z.allDocs||[]).forEach(t=>{let n=b(t.category||``);n&&e.add(n)}),I(g,Array.from(e).sort((e,t)=>e.localeCompare(t)),!0)}function T(){let e=b(H(c));H(c)!==e&&I(c,e,!0)}function E(){let e=Jg(H(h));H(h)!==e&&I(h,e,!0)}let D=P(()=>{let e=H(s).trim();if(!e)return X(`modal.new_doc.title_placeholder`);let t=b(H(c))||`GENERAL`,n=new Date,i=n.getFullYear(),a=String(n.getMonth()+1).padStart(2,`0`),l=String(n.getDate()).padStart(2,`0`),u=String(n.getHours()).padStart(2,`0`),d=String(n.getMinutes()).padStart(2,`0`),f=e.toLowerCase().replace(/\s+/g,`_`).replace(/[^a-z0-9_]/g,``).replace(/_+/g,`_`).replace(/^_|_$/g,``)||`document`,p=H(r).replace(`YYYY`,String(i)).replace(`MM`,a).replace(`DD`,l).replace(`HH`,u).replace(`mm`,d).replace(/\[Category\]/i,`[${t}]`).replace(/(?<![a-z0-9])(?:title_words|title)(?![a-z0-9])/i,f)+`.md`;return H(o)?H(o)+`/`+p:p});function ee(){I(u,!H(u)),H(u)&&O(H(i)||H(n))}async function O(e){I(p,!0),I(m,!1);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(i,t.current,!0),I(a,t.parent,!0),I(o,x(t.current),!0),I(d,t.current,!0),I(l,H(o)?`/`+H(o):`/ (root)`,!0),I(f,t.dirs||[],!0)}catch{I(m,!0),I(f,[],!0)}finally{I(p,!1)}}let k=P(()=>H(i)===H(n));function A(){H(i)!==H(n)&&H(a)&&O(H(a))}function te(){let e=Jg(H(h));if(!e)return;let t=H(i)||H(n);if(t===H(n)&&(e===`files`||e===`images`)){I(_,X(`modal.new_folder.error_reserved`),!0);return}I(_,``);let r=(x(t)?x(t)+`/`:``)+e;I(o,r),I(l,`/`+r),I(h,``)}async function ne(){let e=H(s).trim(),n=b(H(c))||`GENERAL`;if(!e){I(_,X(`modal.new_doc.error_empty_title`),!0);return}I(_,``),I(v,!0);try{let r=await fetch(`/api/documents`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({title:e,category:n,folder:H(o)})});if(!r.ok){let e=await r.json();throw Error(e.error||`Creation failed`)}let i=await r.json();t.onclose(),t.onsuccess(i.id)}catch(e){I(_,X(`common.error_prefix`)+(e instanceof Error?e.message:String(e))),I(v,!1)}}function re(e){e.key===`Enter`&&ne(),e.key===`Escape`&&t.onclose()}var ie=Ur(),ae=z(ie),oe=e=>{var n=u_(),r=R(n),i=R(r),a=B(R(i)),o=R(a,!0);N(a),N(i);var b=B(i,2),x=R(b),S=R(x,!0);N(x);var C=B(x,2);Ei(C),Li(C,e=>I(y,e),()=>H(y)),N(b);var w=B(b,2),ie=R(w),ae=R(ie,!0);N(ie);var oe=B(ie,2);Ei(oe);var se=B(oe,2);J(se,20,()=>H(g),e=>e,(e,t)=>{var n=r_(),r={};V(()=>{r!==(r=t)&&(n.value=(n.__value=t)??``)}),G(e,n)}),N(se),N(w);var ce=B(w,2),le=R(ce),ue=R(le,!0);N(le);var de=B(le,2),fe=R(de),pe=R(fe,!0);N(fe);var me=B(fe,2),he=B(R(me)),ge=R(he,!0);N(he),N(me),N(de);var _e=B(de,2),ve=e=>{var t=c_(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2),o=R(a,!0);N(a),N(n);var s=B(n,2),c=R(s),l=e=>{var t=i_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},u=e=>{var t=a_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.cannot_read_dir`)]),G(e,t)},g=e=>{var t=o_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`modal.new_doc.no_subfolders`)]),G(e,t)},_=e=>{var t=Ur();J(z(t),17,()=>H(f),e=>e.path,(e,t)=>{var n=s_(),r=B(R(n),2),i=R(r,!0);N(r),N(n),V(()=>K(i,H(t).name)),U(`click`,n,()=>O(H(t).path)),G(e,n)}),G(e,t)};q(c,e=>{H(p)?e(l):H(m)?e(u,1):H(f).length===0?e(g,2):e(_,-1)}),N(s);var v=B(s,2),y=R(v);Ei(y);var b=B(y,2),x=R(b,!0);N(b),N(v),N(t),V((e,t,n)=>{r.disabled=H(k),K(i,`↑ ${e??``}`),K(o,H(d)),Y(y,`placeholder`,t),K(x,n)},[()=>X(`common.up`),()=>X(`modal.new_doc.new_folder_placeholder`),()=>X(`modal.new_doc.create_folder_btn`)]),U(`click`,r,A),U(`input`,y,E),U(`keydown`,y,e=>{e.key===`Enter`&&te()}),Mi(y,()=>H(h),e=>I(h,e)),U(`click`,b,te),G(e,t)};q(_e,e=>{H(u)&&e(ve)}),N(ce);var ye=B(ce,2),be=R(ye),xe=R(be,!0);N(be);var Se=B(be,2),j=R(Se,!0);N(Se),N(ye);var Ce=B(ye,2),M=e=>{var t=l_(),n=R(t,!0);N(t),V(()=>K(n,H(_))),G(e,t)};q(Ce,e=>{H(_)&&e(M)});var we=B(Ce,2),Te=R(we),Ee=R(Te,!0);N(Te);var De=B(Te,2),Oe=R(De,!0);N(De),N(we),N(r),N(n),V((e,t,n,r,i,a,s,c,u)=>{K(o,e),K(S,t),Y(C,`placeholder`,n),K(ae,r),K(ue,i),K(pe,H(l)),K(ge,a),K(xe,s),K(j,H(D)),K(Ee,c),De.disabled=H(v),K(Oe,u)},[()=>X(`modal.new_doc.title`),()=>X(`modal.new_doc.title_label`),()=>X(`modal.new_doc.title_placeholder`),()=>X(`modal.new_doc.category_label`),()=>X(`modal.new_doc.location_label`),()=>X(`modal.new_doc.browse_btn`),()=>X(`modal.new_doc.filename_label`),()=>X(`common.cancel`),()=>H(v)?X(`modal.new_folder.creating_btn`):X(`common.create`)]),U(`click`,n,e=>{e.target===e.currentTarget&&t.onclose()}),U(`keydown`,C,re),Mi(C,()=>H(s),e=>I(s,e)),U(`input`,oe,T),U(`keydown`,oe,re),Mi(oe,()=>H(c),e=>I(c,e)),U(`click`,me,ee),U(`click`,Te,function(...e){t.onclose?.apply(this,e)}),U(`click`,De,ne),G(e,n)};q(ae,e=>{t.open&&e(oe)}),G(e,ie),Ke()}Nr([`click`,`keydown`,`input`]);var f_=W(`<p class="text-sm text-gray-400 py-2"> </p>`),p_=W(`<p class="text-sm text-red-500"> </p>`),m_=W(`<label class="flex items-center gap-3 px-1 py-1.5 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-800 cursor-pointer"><input type="checkbox" class="w-4 h-4 rounded border-gray-300 dark:border-gray-600 text-blue-600 focus:ring-blue-500"/> <span class="text-sm text-gray-700 dark:text-gray-300"> </span></label>`),h_=W(`<div><div class="max-h-48 overflow-y-auto space-y-0.5 border border-gray-200 dark:border-gray-700 rounded-lg p-2"><!></div></div>`),g_=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),__=W(`<div><p class="text-xs text-gray-500 dark:text-gray-400"> </p> <div class="flex justify-end gap-3 pt-2"><button class="text-sm px-4 py-2 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg border border-blue-500 text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 font-semibold transition-colors"> </button> <button class="text-sm px-4 py-2 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors"> </button></div></div>`),v_=W(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/50"><div class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-full max-w-sm mx-4 p-6 space-y-4"><h3 class="text-base font-semibold text-gray-900 dark:text-gray-50"><i class="fa-solid fa-file-export mr-2 text-blue-500"></i> <span> </span></h3> <div class="flex gap-0 border-b border-gray-200 dark:border-gray-700"><button> </button> <button> </button> <button> </button></div> <!> <!> <!> <!></div></div>`);function y_(e,t){Ge(t,!0);let n=F(`markdown`),r=!1,i=F(!1),a=F(!1),o=F(L([])),s=F(L({})),c=F(!1),l=F(!1),u=F(!1),d=F(!1),f=!1;On(()=>{t.open&&!f?(f=!0,I(n,`markdown`),r=!1,I(o,[],!0),I(s,{},!0)):t.open||(f=!1)});function p(e){return String(e??``).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function m(e){I(n,e,!0),e===`html`&&h()}async function h(){if(!r){I(i,!0),I(a,!1);try{let e=await fetch(`/api/documents`).then(e=>e.json()),t=new Set;e.forEach(e=>t.add(e.folder?.[0]??e.category??`General`)),I(o,[...t].sort((e,t)=>e===`General`?-1:t===`General`?1:e.localeCompare(t)),!0),r=!0}catch{I(a,!0)}finally{I(i,!1)}}}async function g(){I(c,!0);try{let e=await fetch(`/api/export/markdown`,{method:`POST`,headers:{"Content-Type":`application/json`},body:`{}`});if(!e.ok)throw Error(await e.text());let n=await e.blob(),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=`export-markdown.zip`,i.click(),URL.revokeObjectURL(r),t.onclose()}catch(e){alert(X(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(c,!1)}}async function _(e){let n=H(o).filter(e=>H(s)[e]);if(n.length){I(e===`confluence`?u:l,!0);try{let r=await fetch(`/api/export/html`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({folders:n,mode:e})});if(!r.ok)throw Error(await r.text());let i=await r.blob(),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=`export-${e}.zip`,o.click(),URL.revokeObjectURL(a),t.onclose()}catch(e){alert(X(`common.error_prefix`)+(e instanceof Error?e.message:String(e)))}finally{I(u,!1),I(l,!1)}}}async function v(){I(d,!0);try{let e=Z.allDocs&&Z.allDocs.length?Z.allDocs:await fetch(`/api/documents`).then(e=>e.json()),n={};for(let t=0;t<e.length;t+=5){let r=e.slice(t,t+5),i=await Promise.all(r.map(e=>fetch(`/api/documents/`+e.id).then(e=>e.ok?e.json():null).catch(()=>null)));for(let r of i)r&&(n[r.id??e[t]?.id]=r);r.forEach((e,t)=>{i[t]&&(n[e.id]=i[t])})}function r(e){let t={categories:{},children:{}};for(let n of e){let e=t;for(let t of n.folder||[])e.children[t]||(e.children[t]={categories:{},children:{}}),e=e.children[t];e.categories[n.category]||(e.categories[n.category]=[]),e.categories[n.category].push(n)}return t}function i(e){let t=[];e.categories.General&&t.push(...e.categories.General);let n=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let r of n)t.push(...i(e.children[r]));let r=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let n of r)t.push(...e.categories[n]);return t}function a(e){return e.replace(/^\d+_/,``).replace(/[_-]+/g,` `).replace(/\b\w/g,e=>e.toUpperCase())}function o(e,t){let n=``,r=t*1.25,i=(e,i)=>{let a=t===0&&e===`General`?`General`:e;n+=`<li style="margin-left:${r}rem;margin-top:${t===0?`0.75`:`0.4`}rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#6b7280;">${a}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`;for(let e of i)n+=`<li style="margin-left:${r+.75}rem;padding:0.15rem 0;">`,n+=`<a href="#doc-${e.id}" style="color:#1d4ed8;text-decoration:none;font-size:0.875rem;">${p(e.title)}</a>`,e.formattedDate&&(n+=`<span style="color:#9ca3af;font-size:0.7rem;margin-left:0.5rem;">${p(e.formattedDate)}</span>`),n+=`</li>`;n+=`</ul></li>`};e.categories.General&&i(`General`,e.categories.General);let s=Object.keys(e.children).sort((e,t)=>e.localeCompare(t));for(let i of s)n+=`<li style="margin-left:${r}rem;margin-top:0.75rem;">`,n+=`<span style="font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.05em;color:#7c3aed;">📁 ${a(i)}</span>`,n+=`<ul style="margin:0.2rem 0 0 0;padding:0;list-style:none;">`,n+=o(e.children[i],t+1),n+=`</ul></li>`;let c=Object.keys(e.categories).filter(e=>e!==`General`).sort((e,t)=>e.localeCompare(t));for(let t of c)i(t,e.categories[t]);return n}function s(e){return e.replace(/href="[^"]*\?doc=([^"&#]+)(?:#[^"]*)?"/g,(e,t)=>`href="#doc-${t}"`)}let c=p(document.title||`Living Documentation`),l=r(e),u=i(l),d=`<!DOCTYPE html>
|
|
108
108
|
<html>
|
|
109
109
|
<head>
|
|
110
110
|
<meta charset="UTF-8">
|
|
@@ -147,17 +147,17 @@ Texte`};case`link`:return{text:Se(`snip-link-text`),textFallback:X(`snippet.link
|
|
|
147
147
|
setTimeout(() => window.print(), 800);
|
|
148
148
|
<\/script>
|
|
149
149
|
</body>
|
|
150
|
-
</html>`,f=window.open(``,`_blank`);if(!f){alert(X(`error.pdf_popup`));return}f.document.write(d),f.document.close(),t.onclose()}catch(e){alert(X(`error.pdf_export`)+(e instanceof Error?e.message:String(e)))}finally{I(d,!1)}}let y=`px-4 py-2 text-sm border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 font-semibold transition-colors`,b=`px-4 py-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors`;var x=Ur(),S=z(x),C=e=>{var r=h_(),f=R(r),p=R(f),h=B(R(p),2),x=R(h,!0);N(h),N(p);var S=B(p,2),C=R(S),w=R(C,!0);N(C);var T=B(C,2),E=R(T,!0);N(T);var D=B(T,2),ee=R(D,!0);N(D),N(S);var O=B(S,2),k=e=>{var t=f_(),n=R(t),r=R(n),c=e=>{var t=l_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},l=e=>{var t=u_(),n=R(t);N(t),V(e=>K(n,`${e??``}failed to load folders`),[()=>X(`common.error_prefix`)]),G(e,t)},u=e=>{var t=Ur();J(z(t),16,()=>H(o),e=>e,(e,t)=>{var n=d_(),r=R(n);Ei(r);var i,a=B(r,2),o=R(a,!0);N(a),N(n),V(()=>{i!==(i=t)&&(r.value=(r.__value=t)??``),K(o,t)}),Ni(r,()=>H(s)[t],e=>H(s)[t]=e),G(e,n)}),G(e,t)};q(r,e=>{H(i)?e(c):H(a)?e(l,1):e(u,-1)}),N(n),N(t),G(e,t)};q(O,e=>{H(n)===`html`&&e(k)});var A=B(O,2),te=e=>{var n=p_(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var l=B(o,2),u=R(l,!0);N(l),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),l.disabled=H(c),K(u,n)},[()=>X(`modal.export.markdown_hint`),()=>X(`common.cancel`),()=>H(c)?`⏳`:X(`modal.export.markdown_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,l,g),G(e,n)};q(A,e=>{H(n)===`markdown`&&e(te)});var ne=B(A,2),re=e=>{var n=m_(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),d=R(c,!0);N(c);var f=B(c,2),p=R(f,!0);N(f),N(a),N(n),V((e,t,n,r)=>{K(i,e),K(s,t),c.disabled=H(l),K(d,n),f.disabled=H(u),K(p,r)},[()=>X(`modal.export_html.hint`),()=>X(`common.cancel`),()=>H(l)?`⏳`:X(`modal.export_html.notion_btn`),()=>H(u)?`⏳`:X(`modal.export_html.confluence_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,()=>_(`notion`)),U(`click`,f,()=>_(`confluence`)),G(e,n)};q(ne,e=>{H(n)===`html`&&e(re)});var ie=B(ne,2),ae=e=>{var n=p_(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),c.disabled=H(d),K(l,n)},[()=>X(`modal.export.pdf_hint`),()=>X(`common.cancel`),()=>H(d)?`⏳`:X(`modal.export.pdf_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,v),G(e,n)};q(ie,e=>{H(n)===`pdf`&&e(ae)}),N(f),N(r),V((e,t,r,i)=>{K(x,e),hi(C,1,li(H(n)===`markdown`?y:b)),K(w,t),hi(T,1,li(H(n)===`html`?y:b)),K(E,r),hi(D,1,li(H(n)===`pdf`?y:b)),K(ee,i)},[()=>X(`modal.export.title`),()=>X(`modal.export.tab_markdown`),()=>X(`modal.export.tab_html`),()=>X(`modal.export.tab_pdf`)]),U(`click`,r,e=>{e.target===e.currentTarget&&t.onclose()}),U(`click`,C,()=>m(`markdown`)),U(`click`,T,()=>m(`html`)),U(`click`,D,()=>m(`pdf`)),G(e,r)};q(S,e=>{t.open&&e(C)}),G(e,x),Ke()}Nr([`click`]);var __=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),v_=W(`<p> </p>`),y_=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">📁</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),b_=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-gray-500 dark:text-gray-400"><span class="shrink-0 opacity-40">📄</span> <span class="truncate font-mono"> </span></span> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),x_=W(`<div class="border-t border-gray-200 dark:border-gray-700"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0">↑ Up</button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-52 overflow-y-auto"><!></div></div>`),S_=W(`<label class="flex items-center gap-1.5 text-xs text-gray-700 dark:text-gray-300 cursor-pointer"><input type="checkbox"/> </label>`),C_=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">📁</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Exclude this folder" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 px-3 py-2 text-sm transition-opacity">⊖</button></div>`),w_=W(`<button class="w-full px-3 py-2 text-xs text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-950/30 text-left font-medium border-t border-gray-100 dark:border-gray-800">✓ Select: <span class="font-mono"> </span></button>`),T_=W(`<!> <!>`,1),E_=W(`<div> </div>`),D_=W(`<div> </div> <div> </div> <div> </div> <!>`,1),O_=W(`<div role="button" tabindex="0" class="flex items-center gap-2 px-3 py-1 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors"><span class="text-gray-400 dark:text-gray-600 w-5 text-right shrink-0 tabular-nums text-xs"></span> <div class="flex-1 min-w-0"><div class="flex items-center justify-between gap-1"><span class="text-gray-800 dark:text-gray-200 font-medium truncate text-xs"> </span> <span class="text-gray-400 dark:text-gray-600 tabular-nums shrink-0 text-xs"> </span></div> <div class="h-1 bg-gray-100 dark:bg-gray-800 rounded-full mt-0.5"><div class="h-1 bg-blue-400 dark:bg-blue-600 rounded-full"></div></div></div></div>`),k_=W(`<div class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 text-xs text-gray-500 dark:text-gray-400 space-y-0.5 border-b border-gray-100 dark:border-gray-800"><!></div> <div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center gap-2"><span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 cursor-help"> </span> <input type="number" min="1" max="20" class="w-12 px-1.5 py-0.5 text-xs rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-800 dark:text-gray-200 focus:outline-none"/> <button class="text-xs text-blue-600 dark:text-blue-400 hover:underline"> </button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto"></div></div>`),A_=W(`<p class="absolute inset-0 flex items-center justify-center text-gray-400 dark:text-gray-500 text-sm animate-pulse"> </p>`),j_=W(`<div class="flex items-center gap-1 group py-0.5"><span class="text-gray-600 dark:text-gray-400 break-all font-mono flex-1 text-xs"> </span> <button title="Exclude this file" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 text-xs leading-none px-1 transition-opacity">⊖</button></div>`),M_=W(`<div class="text-gray-400 text-center py-2">—</div>`),N_=W(`<div class="w-80 shrink-0 border-l border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between"><span class="font-bold text-sm text-gray-900 dark:text-gray-100"> </span> <button class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 text-xs leading-none">✕</button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto px-3 py-1 space-y-1 text-xs"><!></div></div>`),P_=W(`<div class="fixed inset-0 z-50 flex flex-col bg-white dark:bg-gray-950"><div class="flex items-center justify-between px-6 h-14 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><h2 class="font-semibold text-base"> </h2> <button class="text-sm px-3 py-1.5 rounded-lg text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"> </button></div> <div class="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><div class="flex items-center gap-3 px-6 py-3"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </label> <input type="text" readonly="" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono cursor-default focus:outline-none"/> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">📁 <span> </span></button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors shrink-0"> </button></div> <div class="flex items-start gap-3 px-6 pb-2"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0 pt-1.5"> </label> <textarea rows="3" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-1 focus:ring-blue-400 resize-y"></textarea> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">📁 <span> </span></button></div> <!> <div class="flex items-center gap-x-4 gap-y-2 px-6 pb-3 flex-wrap"><span class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </span> <label class="flex items-center gap-1.5 text-xs font-medium text-blue-600 dark:text-blue-400 cursor-pointer shrink-0"><input type="checkbox"/> </label> <!></div> <!></div> <div class="flex-1 overflow-hidden flex"><!> <div class="flex-1 relative overflow-hidden"><!> <canvas style="position: absolute; inset: 0"></canvas></div> <!></div></div>`);function F_(e,t){Ge(t,!0);let n=new Set(`the.a.an.and.or.but.not.nor.so.yet.both.either.neither.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.shall.should.may.might.can.could.must.need.dare.ought.used.to.of.in.for.on.with.at.by.from.up.about.into.through.during.before.after.above.below.between.out.off.over.under.again.further.then.once.here.there.when.where.why.how.all.each.few.more.most.other.some.such.no.only.own.same.than.too.very.just.also.still.already.always.never.often.sometimes.usually.this.that.these.those.its.your.our.their.his.her.him.she.you.they.we.me.my.it.who.which.what.whose.whom.if.though.although.because.since.while.unless.until.whether.as.like.via.per.i.am.he.us.see.now.new.old.got.let.put.say.said.says.get.use.make.made.take.come.came.go.went.know.think.look.want.give.seem.back.down.even.much.well.good.work.tell.keep.hold.turn.move.play.live.help.run.start.off.way.too.few.show.hear.etc.eg.ie.one.two.three.four.five.six.seven.eight.nine.ten.le.la.les.un.une.des.du.de.d.l.au.aux.ce.ci.cet.cette.ces.mon.ma.mes.ton.ta.tes.son.sa.ses.notre.nos.votre.vos.leur.leurs.je.tu.il.elle.on.nous.vous.ils.elles.me.te.se.lui.y.en.qui.que.quoi.dont.où.et.ou.mais.donc.or.ni.car.si.ne.pas.plus.moins.très.bien.mal.peu.beaucoup.trop.assez.aussi.comme.pour.par.avec.sans.dans.sur.sous.entre.vers.chez.contre.avant.après.pendant.depuis.selon.malgré.sauf.est.sont.était.être.avoir.fait.faire.dit.dire.peut.pouvoir.doit.devoir.veut.vouloir.sait.savoir.va.aller.vient.venir.tout.tous.toute.toutes.autre.autres.même.chaque.quel.quelle.quels.quelles.aucun.aucune.certain.certaine.plusieurs.quelque.quelques.tel.telle.tels.telles.cela.ceci.ça.celui.celle.ceux.celles.ici.voici.voilà.alors.ainsi.encore.déjà.jamais.toujours.souvent.parfois.rien.personne.chose.fois.jour.temps.part.cas.point.lieu.monde.cependant.néanmoins.pourtant.toutefois.quand.lorsque.puisque.parce.afin.puis.lors.notamment.surtout.seulement.vraiment.enfin.ensuite.ailleurs.là.ici.voici.voilà.dont.lequel.laquelle.lesquels.lesquelles`.split(`.`)),r=new Set(`public.private.protected.static.void.class.interface.abstract.final.const.let.var.function.return.if.else.for.while.do.switch.case.break.continue.try.catch.throw.throws.finally.new.this.self.super.import.export.from.package.module.require.include.using.namespace.struct.enum.trait.impl.fn.def.func.fun.val.mut.async.await.yield.lambda.extends.implements.override.virtual.sealed.data.object.companion.where.when.match.guard.defer.go.chan.select.type.alias.as.is.in.of.with.true.false.null.nil.none.undefined.println.printf.fmt.log.print.main.args.argv.init.setup.teardown.describe.test.expect.assert.before.after.not.and.or.delete.typeof.instanceof.readonly.keyof.infer.never.unknown.declare.satisfies.get.set.add.remove.update.create.find.fetch.load.save.put.post.patch.list.map.filter.reduce.sort.merge.parse.format.convert.transform.validate.check.handle.process.execute.start.stop.reset.clear.close.open.read.write.send.receive.emit.trigger.dispatch.subscribe.unsubscribe.listen.notify.register.unregister.bind.apply.call.invoke.callback.handler.listener.middleware.interceptor.resolver.provider.consumer.producer.builder.factory.adapter.wrapper.proxy.decorator.observer.visitor.strategy.command.controller.service.repository.dao.dto.entity.model.schema.config.context.state.store.action.reducer.selector.hook.ref.effect.memo.component.module.plugin.extension.util.utils.helper.helpers.common.shared.base.default.index.app.core.lib.src.test.spec.mock.stub.fixture.impl.internal.api.sdk.client.server.request.response.status.code.error.exception.message.result.data.value.key.name.label.title.description.item.element.node.child.parent.root.container.wrapper.layout.view.page.screen.panel.header.footer.sidebar.navbar.body.content.section.row.col.column.grid.flex.block.inline.span.div.input.output.param.params.arg.option.options.props.attr.attrs.field.fields.property.properties.method.methods.string.number.boolean.integer.float.double.long.short.byte.char.array.object.map.set.list.vector.queue.stack.hash.table.tree.graph.pair.tuple.optional.nullable.void.unit.any.bool.bytes.none.int.str.bool.all.each.every.some.many.single.multi.first.last.next.prev.previous.current.old.temp.tmp.new.top.bottom.left.right.center.middle.start.end.begin.min.max.count.total.sum.avg.size.length.width.height.depth.flag.num.idx.id.uid.uuid.num.str.val.obj.arr.fn.cb.ctx.req.res.err.msg.src.dst.evt.doc.db.io.fs.os.env.sys.http.https.url.uri.path.port.host.tcp.udp.ssl.tls.html.css.json.xml.yml.yaml.csv.sql.regex.utf.ascii.rgb.rgba.hex.px.em.rem.vh.vw.auto.inherit.initial.application.file.local.source.messages.logging.alerting.programmed.offset.offsets.zone.zoned.decimal.big.integer.constructor.mapper.captor.publisher.verify.subscriber.org.edr.ack.ref.ssr.ssg.csr.isr.mockito.junit.vitest.jest.mocha.rspec.pytest.cypress.playwright.captor.spy.given.then.verify.times.never.invocation.argumentcaptor.inorder.donothing.doreturn.ippon.springframework.jakarta.javax.todo.fixme.hack.note.deprecated.experimental.eslint.prettier.typescript.javascript.java.kotlin.python.golang.rust.csharp.swift.ruby.spring.boot.javax.jakarta.hibernate.lombok.gradle.maven.webpack.vite.react.angular.vue.svelte.nuxt.express.fastapi.flask.django.rails.fiber.gin.actix.tokio.asyncio.junit.jest.mocha.pytest.rspec.docker.kubernetes.aws.gcp.azure.terraform.ansible.nginx.apache.linux.nextjs.remix.astro.sveltekit.gatsby.nuxtjs.qwik.solid.vercel.netlify.cloudflare.supabase.firebase.mongodb.postgres.prisma.drizzle.typeorm.sequelize.mongoose.redis.neon.trpc.graphql.grpc.rest.openapi.swagger.zod.yup.valibot.tailwind.shadcn.radix.headless.chakra.mantine.antd.mui.tanstack.tanstackquery.zustand.jotai.recoil.redux.mobx.storybook.cypress.playwright.vitest.turbopack.turborepo.getserversideprops.getstaticprops.getstaticpaths.generatestaticparams.generatemetadata.serveraction.revalidate.notfound.redirect.permanentredirect.unstablecache.unstablenostore.cookies.headers.userouter.usepathname.usesearchparams.useparams.useformstate.useformstatus.useoptimistic.useserveraction.classname.onclick.onchange.onsubmit.onfocus.onblur.onkeydown.onkeyup.onmousedown.onmouseup.defaultvalue.htmlfor.tabindex.strokewidth.viewbox.fillopacity.strokeopacity.pathdata.children.fragment.portal.suspense.errorboundary.strictmode.createelement.createcontext.createref.forwardref.usestate.useeffect.useref.usecontext.usememo.usecallback.usereducer.useid.usetransition.usedeferredvalue.useimperativehandle.mutex.lock.thread.goroutine.coroutine.channel.buffer.stream.pipe.observable.promise.future.completable.deferred.disposable.lifecycle.scope.annotation.attribute.metadata.reflection.generic.template.macro.preprocessor.compiler.runtime.debug.release.production.development.staging.build.deploy.lint.coverage.report.the.and.for.are.but.not.you.all.this.that.with.have.from.they.will.been.can.has.was.its.our.their.more.also.when.what.about.which.would.into.than.then.each.just.over.after.such.here.some.were.very.only`.split(`.`));function i(e){return n.has(e)||r.has(e)||e.length<3||/^\d+$/.test(e)||/^[^a-z]/.test(e)}function a(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/([A-Z]+)([A-Z][a-z])/g,`$1 $2`).replace(/[_\-./]+/g,` `).toLowerCase().trim().split(/\s+/).filter(e=>e.length>=3)}function o(e){return e.toLowerCase().split(/[^a-zàâäéèêëïîôùûü]+/).filter(e=>e.length>=3)}let s=[{value:`adoc`,cat:`prose`},{value:`asciidoc`,cat:`prose`},{value:`asm`,cat:`code`},{value:`astro`,cat:`code`},{value:`avsc`,cat:`config`},{value:`bash`,cat:`code`},{value:`bat`,cat:`code`},{value:`bicep`,cat:`config`},{value:`c`,cat:`code`},{value:`cc`,cat:`code`},{value:`cfg`,cat:`config`},{value:`cjs`,cat:`code`},{value:`clj`,cat:`code`},{value:`cljs`,cat:`code`},{value:`cmake`,cat:`code`},{value:`cmd`,cat:`code`},{value:`conf`,cat:`config`},{value:`cpp`,cat:`code`},{value:`cql`,cat:`code`},{value:`cs`,cat:`code`},{value:`cshtml`,cat:`code`},{value:`css`,cat:`config`},{value:`cxx`,cat:`code`},{value:`dart`,cat:`code`},{value:`env`,cat:`config`},{value:`erb`,cat:`code`},{value:`erl`,cat:`code`},{value:`ex`,cat:`code`},{value:`exs`,cat:`code`},{value:`fish`,cat:`code`},{value:`fs`,cat:`code`},{value:`fsx`,cat:`code`},{value:`go`,cat:`code`},{value:`gql`,cat:`code`},{value:`gradle`,cat:`code`},{value:`graphql`,cat:`code`},{value:`groovy`,cat:`code`},{value:`h`,cat:`code`},{value:`hcl`,cat:`config`},{value:`hpp`,cat:`code`},{value:`hs`,cat:`code`},{value:`html`,cat:`config`},{value:`ini`,cat:`config`},{value:`java`,cat:`code`},{value:`jl`,cat:`code`},{value:`js`,cat:`code`},{value:`json`,cat:`config`},{value:`jsx`,cat:`code`,jsx:!0},{value:`kt`,cat:`code`},{value:`less`,cat:`config`},{value:`lua`,cat:`code`},{value:`m`,cat:`code`},{value:`md`,cat:`prose`,def:!0},{value:`mdx`,cat:`prose`},{value:`mjs`,cat:`code`},{value:`mk`,cat:`code`},{value:`ml`,cat:`code`},{value:`mli`,cat:`code`},{value:`mm`,cat:`code`},{value:`nim`,cat:`code`},{value:`php`,cat:`code`},{value:`pl`,cat:`code`},{value:`prisma`,cat:`code`},{value:`properties`,cat:`config`},{value:`proto`,cat:`code`},{value:`ps1`,cat:`code`},{value:`py`,cat:`code`},{value:`r`,cat:`code`},{value:`razor`,cat:`code`},{value:`rb`,cat:`code`},{value:`rs`,cat:`code`},{value:`rst`,cat:`prose`},{value:`s`,cat:`code`},{value:`scala`,cat:`code`},{value:`scss`,cat:`config`},{value:`sh`,cat:`code`},{value:`sol`,cat:`code`},{value:`sql`,cat:`code`},{value:`styl`,cat:`config`},{value:`svelte`,cat:`code`},{value:`swift`,cat:`code`},{value:`tex`,cat:`prose`},{value:`tf`,cat:`config`},{value:`tfvars`,cat:`config`},{value:`thrift`,cat:`code`},{value:`toml`,cat:`config`},{value:`ts`,cat:`code`},{value:`tsx`,cat:`code`,jsx:!0},{value:`txt`,cat:`prose`},{value:`v`,cat:`code`},{value:`vb`,cat:`code`},{value:`vue`,cat:`code`},{value:`xml`,cat:`config`},{value:`yaml`,cat:`config`},{value:`yml`,cat:`config`},{value:`zig`,cat:`code`},{value:`zsh`,cat:`code`}],c=new Set(s.filter(e=>e.cat===`prose`).map(e=>e.value)),l=new Set(s.filter(e=>e.cat===`code`).map(e=>e.value)),u=new Set(s.filter(e=>e.cat===`config`).map(e=>e.value)),d=new Set(s.filter(e=>e.jsx).map(e=>e.value));function f(e,t){let n=[];if(c.has(t)){let t=e.replace(/^\s*(import|export\s+\{[^}]*\}|export\s+\*|package|require|#include|from\s+['"][^'"]+['"]\s*(import)?)\b.*/gm,``).replace(/```[\s\S]*?```/g,` `).replace(/`[^`\n]+`/g,` `).replace(/!\[[^\]]*\]\([^)]*\)/g,` `).replace(/\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/https?:\/\/\S+/g,` `).replace(/[#*_~>`|!\[\](){}=+\-]/g,` `);n.push(...o(t))}else l.has(t)?(d.has(t)&&(e=e.replace(/<\/?[A-Z][A-Za-z0-9.]*[^>]*>/g,` `),e=e.replace(/<\/?(div|span|main|section|article|aside|nav|header|footer|form|input|button|select|option|textarea|table|thead|tbody|tr|td|th|ul|ol|li|a|img|p|h[1-6]|label|figure|figcaption|picture|video|audio|canvas|svg|path|circle|rect|g|defs|use|link|meta|head|html|body|script|style|br|hr|strong|em|code|pre|blockquote|small|sub|sup)\b[^>]*>/gi,` `),e=e.replace(/\b(className|onClick|onChange|onSubmit|onFocus|onBlur|onKeyDown|onKeyUp|onMouseDown|onMouseUp|htmlFor|tabIndex|strokeWidth|viewBox|fillOpacity|strokeOpacity|defaultValue|placeholder|disabled|checked|readOnly|required|multiple|autoFocus|autoComplete|type|href|src|alt|width|height|style|key|ref)\s*=/g,` =`)),e=e.replace(/^\s*(import\s+[\w.*{},\s'"@/-]+;?|from\s+['"][^'"]+['"]\s*;?|package\s+[\w.]+;?|namespace\s+[\w.]+;?|using\s+[\w.]+;?|require\s*\(?\s*['"][^'"]+['"]\s*\)?;?)\s*$/gm,``),e.replace(/(?:\/\/|#(?!.*[{}[\]<>])| -- )\s*(.+)$/gm,(e,t)=>(n.push(...o(t)),e)),e.replace(/\/\*[\s\S]*?\*\//g,e=>(n.push(...o(e)),e)),e.replace(/"""[\s\S]*?"""|'''[\s\S]*?'''/g,e=>(n.push(...o(e)),e)),e.replace(/["'`]([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ\s,.'éàèùâêîôûç]{3,})["'`]/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e))):u.has(t)&&(e.replace(/:\s*["']([^"']{3,})["']/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e)));return n.filter(e=>!i(e))}let p=F(``),m=F(``),h=F(1),g=F(``),_=F(!0),v=F(!1),y=F(L(s.map(e=>({value:e.value,label:`.`+e.value,checked:!!e.def}))));function b(){return H(y).filter(e=>e.checked).map(e=>e.value)}let x=P(()=>H(y).every(e=>e.checked)),S=F(null),C=F(null),w=F(0),T=F(null),E=F(L([])),D=F(L([])),ee=F(!1),O=F(``),k=F(0),A=F(L([]));function te(){localStorage.setItem(`wc-exts`,JSON.stringify(b()))}function ne(){let e=H(x);I(y,H(y).map(t=>({...t,checked:!e})),!0),te()}function re(){te()}function ie(){return new Set((H(m)||``).split(/[\n,]/).map(e=>e.trim()).filter(Boolean))}function ae(e){let t=ie();t.has(e)||(t.add(e),I(m,[...t].join(`, `),!0),localStorage.setItem(`wc-exclude`,H(m)),H(ue)&&_e(H(fe)),se())}function oe(){localStorage.setItem(`wc-exclude`,H(m)),H(ue)&&_e(H(fe)),se()}function se(){H(ee)&&H(O)&&je(H(O))}function ce(){H(S)&&Ae()}function le(){let e=localStorage.getItem(`wc-root`);e&&(I(p,e,!0),I(xe,e,!0));let t=localStorage.getItem(`wc-exclude`);t&&I(m,t,!0);let n=localStorage.getItem(`wc-exts`);if(n)try{let e=JSON.parse(n);I(y,H(y).map(t=>({...t,checked:e.includes(t.value)})),!0)}catch{}}let ue=F(!1),de=F(null),fe=F(``),pe=F(``),me=F(null),he=F(``);function ge(){I(ue,!H(ue)),H(ue)&&_e(H(fe)||H(p)||`/`)}async function _e(e){I(me,null),I(he,`Loading…`);try{let t=await fetch(`/api/browse?all=1&path=`+encodeURIComponent(e)).then(e=>e.json());I(fe,t.current,!0),I(de,t.parent,!0),I(pe,t.current,!0);let n=H(p).trim(),r=(e,t)=>n&&e.startsWith(n+`/`)?e.slice(n.length+1):t,i=ie(),a=(t.dirs||[]).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`dir`,name:e.name,path:e.path,entry:r(e.path,e.name)})),o=b(),s=(t.files||[]).filter(e=>o.some(t=>e.name.endsWith(`.`+t))).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`file`,name:e.name,entry:r(e.path,e.name)})),c=[...a,...s];I(me,c,!0),I(he,c.length?``:`Empty directory`,!0)}catch{I(me,[],!0),I(he,`Cannot read directory`)}}function ve(){H(de)&&_e(H(de))}let ye=F(!1),be=F(null),xe=F(``),Se=F(``),j=F(null),Ce=F(``);function M(){I(ye,!H(ye)),H(ye)&&we(H(xe)||H(p)||`/`)}async function we(e){I(j,null),I(Ce,`Loading…`);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(xe,t.current,!0),I(be,t.parent,!0),I(Se,t.current,!0),I(j,(t.dirs||[]).map(e=>({name:e.name,path:e.path})),!0),I(Ce,H(j).length?``:`No sub-folders`,!0)}catch{I(j,[],!0),I(Ce,`Cannot read directory`)}}function Te(){H(be)&&we(H(be))}function Ee(){I(p,H(xe),!0),localStorage.setItem(`wc-root`,H(xe)),I(ye,!1),I(m,``),localStorage.removeItem(`wc-exclude`),I(fe,H(xe),!0)}let De=F(null),Oe=F(null),ke=F(!1);function Ae(){if(!H(S)||!H(C))return;let e=Math.max(1,H(h)||1),t=[...H(S).entries()].sort((e,t)=>t[1]-e[1]),n=t.filter(([t])=>(H(C).get(t)||new Set).size>=e).slice(0,150);if(!n.length){let n=t.length;I(g,n?`${n} domain word(s) found but none appear in ${e}+ file(s). Lower the "Min files" threshold to 1.`:`No domain words extracted. Try adding more file extensions or a broader folder.`,!0),I(_,!0),I(ke,!1),I(v,!1);return}let r=[...H(S).keys()].filter(t=>(H(C).get(t)||new Set).size>=e).length;I(T,{scanned:H(w),unique:r,shown:n.length},!0);let i=n.slice(0,50),a=i[0][1];I(D,i.map(([e,t])=>({word:e,freq:t,pct:Math.round(t/a*100)})),!0),I(v,!0),I(_,!1);let o=document.documentElement.classList.contains(`dark`),s=o?[`#60a5fa`,`#34d399`,`#f9a8d4`,`#a78bfa`,`#fbbf24`,`#6ee7b7`,`#93c5fd`,`#fb923c`,`#4ade80`,`#f472b6`]:[`#1d4ed8`,`#047857`,`#7c3aed`,`#b45309`,`#be123c`,`#0369a1`,`#4338ca`,`#c2410c`,`#15803d`,`#9333ea`];requestAnimationFrame(()=>{if(!H(De)||!H(Oe))return;let e=H(De),t=H(Oe);e.width=Math.max(400,t.offsetWidth),e.height=Math.max(300,t.offsetHeight),e.style.width=e.width+`px`,e.style.height=e.height+`px`,I(ke,!0);let n=Math.sqrt(e.width*e.height/(800*500)),r=Math.min(220,Math.round(72*n)),c=i.map(([e,t])=>[e,Math.max(12,Math.round(r*t/a))]);window.WordCloud?.(e,{list:c,gridSize:Math.round(4*e.width/1024),fontFamily:`ui-sans-serif, system-ui, sans-serif`,color:()=>s[Math.floor(Math.random()*s.length)],backgroundColor:o?`#030712`:`#ffffff`,rotateRatio:.2,minSize:6,shrinkToFit:!0,click:e=>je(e[0])})})}function je(e){if(!H(C)||!H(S))return;let t=[...H(C).get(e)||[]].sort(),n=H(S).get(e)||0;I(O,e,!0),I(k,n,!0),I(A,t,!0),I(ee,!0)}function Me(){I(ee,!1)}async function Ne(){let e=H(p).trim();if(!e){I(g,`Please select a root folder first.`),I(_,!0);return}let t=b();if(!t.length){I(g,`Please select at least one extension.`),I(_,!0);return}I(ye,!1),I(v,!1),I(ee,!1),I(g,`Reading files…`),I(_,!0),I(ke,!1);try{let n=H(m).trim(),r=n?n.split(/[\n,]/).map(e=>e.trim()).filter(Boolean):[];localStorage.setItem(`wc-exclude`,n);let i=new URLSearchParams({path:e});t.forEach(e=>i.append(`ext`,e)),r.forEach(e=>i.append(`exclude`,e));let a=await fetch(`/api/wordcloud?`+i);if(!a.ok){I(g,`Error: `+((await a.json()).error||a.statusText));return}let{files:o,fileTexts:s}=await a.json();I(g,`Analyzing ${o} file(s)…`);let c=new Map,l=new Map,u=new Set;I(w,o,!0);for(let{path:e,text:t}of s){let n=(e.split(`.`).pop()||``).toLowerCase();n&&u.add(n);let r=f(t,n),i=new Set;for(let t of r)c.set(t,(c.get(t)||0)+1),i.has(t)||(i.add(t),l.has(t)||l.set(t,new Set),l.get(t).add(e))}I(S,c,!0),I(C,l,!0),I(E,[...u].sort().map(e=>`.`+e),!0),Ae()}catch(e){I(g,`Error: `+e.message)}}let Pe=!1;On(()=>{t.open&&!Pe?(Pe=!0,I(g,`Choose a root folder and click Launch.`),I(_,!0),I(ke,!1),I(v,!1),I(ee,!1),I(S,null),I(C,null),I(T,null),I(D,[],!0),I(ye,!1),I(ue,!1),I(h,1),le(),H(p)||fetch(`/api/config`).then(e=>e.json()).then(e=>{e.docsFolder&&(I(p,e.docsFolder,!0),I(xe,e.docsFolder,!0))}).catch(()=>{})):t.open||(Pe=!1)});var Fe=Ur(),Ie=z(Fe),Le=e=>{var n=P_(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o),N(r);var c=B(r,2),l=R(c),u=R(l),d=R(u,!0);N(u);var f=B(u,2);Ei(f);var b=B(f,2),S=B(R(b)),C=R(S,!0);N(S),N(b);var w=B(b,2),te=R(w,!0);N(w),N(l);var ie=B(l,2),se=R(ie),le=R(se,!0);N(se);var fe=B(se,2);vn(fe);var xe=B(fe,2),Ae=B(R(xe)),Pe=R(Ae,!0);N(Ae),N(xe),N(ie);var Fe=B(ie,2),Ie=e=>{var t=x_(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=__(),n=R(t,!0);N(t),V(()=>K(n,H(he))),G(e,t)},l=e=>{var t=v_(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(he)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(he))}),G(e,t)},u=e=>{var t=Ur();J(z(t),17,()=>H(me),Yr,(e,t)=>{var n=Ur(),r=z(n),i=e=>{var n=y_(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>_e(H(t).path)),U(`click`,o,()=>ae(H(t).entry)),G(e,n)},a=e=>{var n=b_(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,o,()=>ae(H(t).entry)),G(e,n)};q(r,e=>{H(t).kind===`dir`?e(i):e(a,-1)}),G(e,n)}),G(e,t)};q(s,e=>{H(me)===null?e(c):H(me).length===0?e(l,1):e(u,-1)}),N(o),N(t),V(()=>{r.disabled=!H(de),K(a,H(pe))}),U(`click`,r,ve),G(e,t)};q(Fe,e=>{H(ue)&&e(Ie)});var Le=B(Fe,2),Re=R(Le),ze=R(Re,!0);N(Re);var Be=B(Re,2),Ve=R(Be);Ei(Ve);var He=B(Ve);N(Be),J(B(Be,2),17,()=>H(y),e=>e.value,(e,t,n)=>{var r=S_(),i=R(r);Ei(i);var a=B(i);N(r),V(()=>K(a,` ${H(t).label??``}`)),U(`change`,i,re),Ni(i,()=>H(t).checked,e=>H(t).checked=e),G(e,r)}),N(Le);var Ue=B(Le,2),We=e=>{var t=x_(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=__(),n=R(t,!0);N(t),V(()=>K(n,H(Ce))),G(e,t)},l=e=>{var t=T_(),n=z(t),r=e=>{var t=v_(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(Ce)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(Ce))}),G(e,t)},i=e=>{var t=Ur();J(z(t),17,()=>H(j),Yr,(e,t)=>{var n=C_(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>we(H(t).path)),U(`click`,o,()=>ae(H(t).name)),G(e,n)}),G(e,t)};q(n,e=>{H(j).length===0?e(r):e(i,-1)});var a=B(n,2),o=e=>{var t=w_(),n=B(R(t)),r=R(n,!0);N(n),N(t),V(()=>K(r,H(Se))),U(`click`,t,Ee),G(e,t)};q(a,e=>{H(Ce)!==`Cannot read directory`&&e(o)}),G(e,t)};q(s,e=>{H(j)===null?e(c):e(l,-1)}),N(o),N(t),V(()=>{r.disabled=!H(be),K(a,H(Se))}),U(`click`,r,Te),G(e,t)};q(Ue,e=>{H(ye)&&e(We)}),N(c);var Ge=B(c,2),Ke=R(Ge),qe=e=>{var t=k_(),n=R(t),r=R(n),i=e=>{var t=D_(),n=z(t),r=R(n);N(n);var i=B(n,2),a=R(i);N(i);var o=B(i,2),s=R(o);N(o);var c=B(o,2),l=e=>{var t=E_(),n=R(t);N(t),V((e,r)=>{Y(t,`title`,e),K(n,`${H(E).length??``} extension${H(E).length>1?`s`:``} found (${r??``})`)},[()=>H(E).join(`, `),()=>H(E).join(`, `)]),G(e,t)};q(c,e=>{H(E).length&&e(l)}),V(()=>{K(r,`${H(T).scanned??``} file(s) scanned`),K(a,`${H(T).unique??``} unique domain words`),K(s,`${H(T).shown??``} shown`)}),G(e,t)};q(r,e=>{H(T)&&e(i)}),N(n);var a=B(n,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2);Ei(c);var l=B(c,2),u=R(l,!0);N(l),N(a);var d=B(a,2),f=R(d,!0);N(d);var p=B(d,2);J(p,21,()=>H(D),Yr,(e,t,n)=>{var r=O_(),i=R(r);i.textContent=n+1;var a=B(i,2),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(o);var d=B(o,2),f=R(d);N(d),N(a),N(r),V(()=>{K(c,H(t).word),K(u,H(t).freq),_i(f,`width:${H(t).pct??``}%`)}),U(`click`,r,()=>je(H(t).word)),G(e,r)}),N(p),N(t),V((e,t,n,r,i,a)=>{Y(o,`title`,e),K(s,t),Y(c,`title`,n),Y(l,`title`,r),K(u,i),K(f,a)},[()=>X(`wc.min_files_hint`),()=>X(`wc.min_files_label`),()=>X(`wc.min_files_hint`),()=>X(`wc.apply_hint`),()=>X(`wc.apply_btn`),()=>X(`wc.top_words`)]),Mi(c,()=>H(h),e=>I(h,e)),U(`click`,l,ce),G(e,t)};q(Ke,e=>{H(v)&&e(qe)});var Je=B(Ke,2),Ye=R(Je),Xe=e=>{var t=A_(),n=R(t,!0);N(t),V(()=>K(n,H(g))),G(e,t)};q(Ye,e=>{H(_)&&e(Xe)});var Ze=B(Ye,2);let Qe;Li(Ze,e=>I(De,e),()=>H(De)),N(Je),Li(Je,e=>I(Oe,e),()=>H(Oe));var $e=B(Je,2),et=e=>{var t=N_(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2);N(n);var o=B(n,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=e=>{var t=Ur();J(z(t),17,()=>H(A),Yr,(e,t)=>{var n=j_(),r=R(n),i=R(r,!0);N(r);var a=B(r,2);N(n),V(()=>K(i,H(t))),U(`click`,a,()=>ae(H(t))),G(e,n)}),G(e,t)},d=e=>{G(e,M_())};q(l,e=>{H(A).length?e(u):e(d,-1)}),N(c),N(t),V(e=>{K(i,`${H(O)??``} ×${H(k)??``}`),K(s,e)},[()=>X(`wc.found_in`)]),U(`click`,a,Me),G(e,t)};q($e,e=>{H(ee)&&e(et)}),N(Ge),N(n),V((e,t,n,r,i,o,c,l,u,f)=>{K(a,e),K(s,t),K(d,n),K(C,r),K(te,i),K(le,o),Y(fe,`placeholder`,c),K(Pe,l),K(ze,u),Oi(Ve,H(x)),K(He,` ${f??``}`),Qe=hi(Ze,1,``,null,Qe,{hidden:!H(ke)})},[()=>X(`wc.title`),()=>X(`wc.close_btn`),()=>X(`wc.search_root_label`),()=>X(`wc.browse_btn`),()=>X(`wc.launch_btn`),()=>X(`wc.exclude_label`),()=>X(`wc.exclude_placeholder`),()=>X(`wc.browse_btn`),()=>X(`wc.extensions_label`),()=>X(`wc.all_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),Mi(f,()=>H(p),e=>I(p,e)),U(`click`,b,M),U(`click`,w,Ne),U(`input`,fe,oe),Mi(fe,()=>H(m),e=>I(m,e)),U(`click`,xe,ge),U(`change`,Ve,ne),G(e,n)};q(Ie,e=>{t.open&&e(Le)}),G(e,Fe),Ke()}Nr([`click`,`input`,`change`]);var I_=W(`<button class="ghost-button"><i class="fa-solid fa-cloud"></i></button> <button title="Toggle dark mode" class="ghost-button" aria-label="Toggle dark mode"> </button>`,1),L_=W(`<div class="relative hidden sm:block"><input type="search" class="w-56 pl-8 pr-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="absolute left-2.5 top-2 text-gray-400 text-sm pointer-events-none">🔍</span></div>`),R_=W(`<p class="p-8 text-red-500"> </p>`),z_=W(`<div class="h-full flex items-center justify-center p-8"><div class="max-w-md text-center"><div class="text-5xl mb-4 select-none" aria-hidden="true">📚</div> <h2 class="text-xl font-semibold text-gray-700 dark:text-gray-300 mb-2"> </h2> <p class="text-sm text-gray-500 dark:text-gray-500"> </p> <p class="mt-4 text-xs text-gray-400 dark:text-gray-600 font-mono bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 inline-block"> </p> <p class="mt-2 text-xs text-gray-400"> </p></div></div>`),B_=W(`<div class="app-shell bg-gray-50 text-gray-900 dark:bg-gray-900 dark:text-gray-100"><!> <div class="flex overflow-hidden"><!> <main id="home-content-area" class="flex-1 overflow-y-auto"><!></main></div></div> <!> <!> <!> <!>`,1);function V_(e,t){Ge(t,!0);let n=F(!1),r=F(!1),i=F(!1),a=F(!1),o=F(null),s=F(!1),c=F(``),l=F(!1),u=F(`Living AI Documentation`),d=F(`YYYY_MM_DD_HH_mm_[Category]_title.md`),f=null;function p(){try{let e=localStorage.getItem(`ld-dark`);if(e!==null)return e===`true`}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches}function m(e){I(l,e,!0),document.documentElement.classList.toggle(`dark`,e)}function h(){m(!H(l));try{localStorage.setItem(`ld-dark`,String(H(l)))}catch{}}On(()=>{let e=document.getElementById(`hljs-dark`),t=document.getElementById(`hljs-light`);if(!e||!t)return;let n=Z.codeBlockLightTheme&&!H(l);e.disabled=n,t.disabled=!n,document.body.classList.toggle(`ld-code-light`,n)});function g(e){let t=e.trim();if(f&&clearTimeout(f),!t){Z.searchQuery=``,Z.searchResults=null;return}Z.searchQuery=t,Z.searchResults=Z.allDocs.filter(e=>e.title.toLowerCase().includes(t.toLowerCase())||e.category.toLowerCase().includes(t.toLowerCase())),f=window.setTimeout(async()=>{try{let e=await Lm(t);t===Z.searchQuery&&(Z.searchResults=e)}catch{}},350)}let _=F(L([]));function v(e){let t=H(_)[e];t&&(I(_,H(_).slice(0,e),!0),y(t.id,!1,`restore`))}async function y(e,t=!1,n=!1,r=null){if(n===!0&&Z.currentDocId&&Z.currentDocId!==e){let t=H(_).findIndex(t=>t.id===e);if(t!==-1)I(_,H(_).slice(0,t),!0);else{let e=Z.allDocs.find(e=>e.id===Z.currentDocId);I(_,[...H(_),{id:Z.currentDocId,title:e?e.title:Z.currentDocId}],!0)}}else n||I(_,[],!0);Z.currentDocId=e;let i=Z.allDocs.find(t=>t.id===e);if(i&&Z.revealDoc(i),!t){let t=new URL(location.href);t.searchParams.set(`doc`,e),t.hash=r?`#${r}`:``,history.pushState({docId:e,anchor:r||null},``,t)}I(s,!0),I(c,``);try{let t=await Nm(e);t.id=e,I(o,t,!0),document.title=t.title,requestAnimationFrame(()=>{let e=document.getElementById(`home-content-area`);if(r){let t=document.getElementById(r);t&&e&&(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top-80)}else e&&(e.scrollTop=0)})}catch(e){I(c,X(`doc.failed_to_load`)+(e instanceof Error?e.message:String(e)))}finally{I(s,!1)}}async function b(e){if(!H(o))return;let t=H(o).id,n=await fetch(`/api/documents/`+t,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({content:e})});if(!n.ok)throw Error(await n.text());let r=await Nm(t);r.id=t,I(o,r,!0);let i=e.match(/\]\(\s*\.?\/files\/[^)\s]+/g),a={...Z.fileAttachmentCounts};i&&i.length?a[t]=i.length:delete a[t],Z.fileAttachmentCounts=a}function x(e){let t=Z.allDocs.find(t=>t.id===e);if(!t)return null;let n=(t.folder||[]).join(`/`),r=e=>(e.folder||[]).join(`/`)===n,i=Z.hideCategories?Z.allDocs.filter(r).slice().sort((e,t)=>(e.filename||``).localeCompare(t.filename||``)):Z.allDocs.filter(e=>r(e)&&e.category===t.category),a=i.findIndex(t=>t.id===e);if(a===-1)return null;let o=i[a+1]??i[a-1];return o?o.id:null}async function S(){if(!H(o))return;let e=H(o).id;if(!(await fetch(`/api/documents/`+encodeURIComponent(e),{method:`DELETE`})).ok)return;let t=x(e);Z.allDocs=Z.allDocs.filter(t=>t.id!==e),Array.isArray(Z.searchResults)&&(Z.searchResults=Z.searchResults.filter(t=>t.id!==e));let n={...Z.annotationCounts};delete n[e],Z.annotationCounts=n;let r={...Z.fileAttachmentCounts};delete r[e],Z.fileAttachmentCounts=r,t?await y(t):(Z.currentDocId=null,I(o,null),history.pushState({},``,location.pathname))}async function C(){let[e,t]=await Promise.all([jm(),Am()]);if(Z.allDocs=e,t.docsFolder)try{Z.allFolderPaths=await Mm(t.docsFolder)}catch{Z.allFolderPaths=[]}let[n,r,i]=await Promise.all([Pm(),Fm(),Im()]);Z.annotationCounts=n,Z.fileAttachmentCounts=r,Z.docStatuses=i}Vi(async()=>{m(p());let e=await Am();await la(e.language||`en`),e.title&&(document.title=e.title,I(u,e.title,!0)),e.filenamePattern&&I(d,e.filenamePattern+`.md`),Z.exclusiveFolderExpansion=!!e.exclusiveFolderExpansion,Z.exclusiveCategoryExpansion=!!e.exclusiveCategoryExpansion,Z.codeBlockMaxHeight=typeof e.codeBlockMaxHeight==`number`?e.codeBlockMaxHeight:400,Z.imageRoundedCorners=!!e.imageRoundedCorners,Z.imageCentered=!!e.imageCentered,Z.imageBorder=!!e.imageBorder,Z.codeBlockLightTheme=!!e.codeBlockLightTheme,Z.codeBlockMaxHeight>0&&document.documentElement.style.setProperty(`--ld-code-max-h`,Z.codeBlockMaxHeight+`px`),Z.expandedCategories.size===0&&(Z.expandedCategories=new Set([`General`])),await C();let t=new URLSearchParams(location.search).get(`doc`);if(t)y(t,!0,!1,location.hash?location.hash.slice(1):null);else{let e=Z.allDocs.find(e=>e.category===`General`)??Z.allDocs[0];e&&y(e.id,!0)}let n=e=>{let t=e.state?.docId||new URLSearchParams(location.search).get(`doc`),n=e.state?.anchor||(location.hash.length>1?location.hash.slice(1):null);t&&y(t,!0,!1,n)};window.addEventListener(`popstate`,n);let r=()=>{C()};return window.addEventListener(`ld:documents-changed`,r),()=>{window.removeEventListener(`popstate`,n),window.removeEventListener(`ld:documents-changed`,r)}});var w=B_(),T=z(w),E=R(T);Ja(E,{get title(){return H(u)},subtitle:``,actions:e=>{var t=I_(),n=z(t),r=B(n,2),i=R(r,!0);N(r),V((e,t)=>{Y(n,`title`,e),Y(n,`aria-label`,t),K(i,H(l)?`☀`:`☾`)},[()=>X(`nav.word_cloud`),()=>X(`nav.word_cloud`)]),U(`click`,n,()=>I(a,!0)),U(`click`,r,h),G(e,t)},children:(e,t)=>{var n=L_(),r=R(n);Ei(r),Pe(2),N(n),V(e=>{Y(r,`placeholder`,e),Di(r,Z.searchQuery)},[()=>X(`nav.search_placeholder`)]),U(`input`,r,e=>g(e.target.value)),G(e,n)},$$slots:{actions:!0,default:!0}});var D=B(E,2),ee=R(D);lh(ee,{onopen:e=>y(e),onsearch:g,onexport:()=>I(i,!0),onnewfolder:()=>I(n,!0),onnewdoc:()=>I(r,!0)});var O=B(ee,2),k=R(O),A=e=>{var t=Ur(),n=z(t),r=e=>{var t=R_(),n=R(t,!0);N(t),V(()=>K(n,H(c))),G(e,t)},i=e=>{Gg(e,{get doc(){return H(o)},get navHistory(){return H(_)},ongoback:v,onopen:(e,t)=>y(e,!1,!0,t),onsave:b,ondelete:S})};q(n,e=>{H(c)?e(r):e(i,-1)}),G(e,t)},te=e=>{var t=z_(),n=R(t),r=B(R(n),2),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(n),N(t),V((e,t,n)=>{K(i,e),K(o,t),K(c,H(d)),K(u,n)},[()=>X(`welcome.title`),()=>X(`welcome.hint`),()=>X(`welcome.pattern_hint`)]),G(e,t)};q(k,e=>{H(o)?e(A):e(te,-1)}),N(O),N(D),N(T);var ne=B(T,2);$g(ne,{get open(){return H(n)},onclose:()=>I(n,!1),onsuccess:C});var re=B(ne,2);c_(re,{get open(){return H(r)},onclose:()=>I(r,!1),onsuccess:async e=>{await C(),y(e)}});var ie=B(re,2);g_(ie,{get open(){return H(i)},onclose:()=>I(i,!1)}),F_(B(ie,2),{get open(){return H(a)},onclose:()=>I(a,!1)}),G(e,w),Ke()}Nr([`click`,`input`]);var H_=`modulepreload`,U_=function(e){return`/`+e},W_={},G_=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,new URL(`../../../src/node/plugins/importAnalysisBuild.ts`,import.meta.url)).href}r=o(t.map(t=>{if(t=U_(t,n),t=s(t),t in W_)return;W_[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:H_,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},K_=W(`<div class="flex flex-col h-screen overflow-hidden bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"><header class="flex items-center gap-1 px-2 h-12 shrink-0 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-sm z-10"><button class="tool-btn !w-auto px-2 text-xs font-medium text-gray-500 dark:text-gray-400"> </button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSidebar" class="tool-btn">☰</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnCopyDiagramId" class="tool-btn"><svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="5" width="8" height="9" rx="1.5"></rect><path d="M3 11V3a1 1 0 0 1 1-1h7"></path></svg></button> <button id="toolSelect" class="tool-btn tool-active"><svg width="11" height="13" viewBox="0 0 11 13" fill="currentColor" stroke="none"><path d="M1 1 L1 12 L4 9 L6.5 13 L8 12.2 L5.5 8.2 L10 8.2 Z"></path></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolBox" class="tool-btn"><svg width="15" height="10" viewBox="0 0 15 10" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="1" y="1" width="13" height="8" rx="1"></rect></svg></button> <button id="toolEllipse" class="tool-btn"><svg width="16" height="10" viewBox="0 0 16 10" fill="none" stroke="currentColor" stroke-width="1.5"><ellipse cx="8" cy="5" rx="7" ry="4"></ellipse></svg></button> <button id="toolDatabase" class="tool-btn"><svg width="12" height="16" viewBox="0 0 12 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><ellipse cx="6" cy="3" rx="5" ry="2"></ellipse><path d="M1 3v10c0 1.1 2.2 2 5 2s5-.9 5-2V3"></path><path d="M11 7.5c0 1.1-2.2 2-5 2s-5-.9-5-2"></path></svg></button> <button id="toolCircle" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="6.5" cy="6.5" r="5.5"></circle></svg></button> <button id="toolActor" class="tool-btn"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="6" cy="3" r="2.2"></circle><line x1="6" y1="5.2" x2="6" y2="10"></line><line x1="1.5" y1="7.5" x2="10.5" y2="7.5"></line><line x1="6" y1="10" x2="2.5" y2="15"></line><line x1="6" y1="10" x2="9.5" y2="15"></line></svg></button> <button id="toolPostIt" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4"><path d="M1 1 H9 L12 4 V12 H1 Z"></path><path d="M9 1 V4 H12" stroke-opacity="0.5"></path></svg></button> <button id="toolTextFree" class="tool-btn" style="font-size:11px; font-weight:600;">T</button> <button id="toolImage" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" rx="1.5"></rect><circle cx="4.5" cy="4.5" r="1.2"></circle><path d="M1 9.5 L4 6.5 L6.5 9 L9 7 L13 10.5"></path></svg></button> <a href="/shape-editor" class="tool-btn">✦</a> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolArrow" class="tool-btn">→</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDelete" class="tool-btn"><svg width="11" height="11" viewBox="0 0 11 11" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><line x1="1" y1="1" x2="10" y2="10"></line><line x1="10" y1="1" x2="1" y2="10"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDiagramDefaults" class="tool-btn"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button> <button id="btnAlign" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4"><line x1="0.5" y1="7.5" x2="13.5" y2="7.5"></line><line x1="3.5" y1="0.5" x2="3.5" y2="13.5" stroke-dasharray="1.5 1.5"></line><line x1="10.5" y1="0.5" x2="10.5" y2="13.5" stroke-dasharray="1.5 1.5"></line></svg></button> <button id="btnGrid" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.2"><line x1="5" y1="1" x2="5" y2="13"></line><line x1="9" y1="1" x2="9" y2="13"></line><line x1="1" y1="5" x2="13" y2="5"></line><line x1="1" y1="9" x2="13" y2="9"></line><rect x="1" y="1" width="12" height="12" rx="1"></rect></svg></button> <button id="btnEdgeStraight" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><line x1="2" y1="12" x2="12" y2="2"></line><polyline points="8,2 12,2 12,6"></polyline></svg></button> <button id="btnEvidenceMode" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M4 1.5 H8.5 L11 4 V12.5 H4 Z"></path><path d="M8.5 1.5 V4 H11"></path><path d="M1.5 5.5 H6.5"></path><path d="M1.5 8 H6.5"></path><path d="M1.5 10.5 H5"></path></svg></button> <button id="btnResizeMode" class="tool-btn active-tool"><svg id="icon-resize-corner" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="7,10 10,10 10,7"></polyline></svg> <svg id="icon-resize-center" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="hidden"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="4,6.5 4,4 6.5,4"></polyline><polyline points="10,7.5 10,10 7.5,10"></polyline><line x1="10" y1="4" x2="4" y2="10"></line><polyline points="7.5,4 10,4 10,6.5"></polyline><polyline points="4,7.5 4,10 6.5,10"></polyline></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <input id="diagramTitle" type="text" class="flex-1 min-w-0 px-2 py-1 text-sm bg-transparent border-0 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded text-gray-700 dark:text-gray-300 placeholder:text-gray-400"/> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnZoomOut" class="tool-btn">−</button> <span id="zoomLevel" class="text-xs text-gray-500 dark:text-gray-400 w-10 text-center tabular-nums select-none">100%</span> <button id="btnZoomIn" class="tool-btn">+</button> <button id="btnZoomReset" class="tool-btn">⊡</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDark" class="tool-btn"><span id="darkIcon">☽</span></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDebug" class="hidden tool-btn text-xs font-mono">dbg</button> <div id="sepDebug" class="hidden w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnExportDrawio" class="tool-btn"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSave" disabled="" class="px-3 py-1.5 text-xs font-semibold rounded-lg bg-blue-600 hover:bg-blue-700 text-white disabled:opacity-40 disabled:cursor-not-allowed shrink-0 transition-colors"><span> </span></button></header> <div class="flex flex-1 overflow-hidden"><div id="sidebar" class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 flex flex-col overflow-hidden" style="transition: width 0.2s ease"><div class="flex items-center justify-between px-3 py-2 border-b border-gray-200 dark:border-gray-700 shrink-0"><span class="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider"> </span> <button id="btnNewDiagram" class="text-xs font-medium text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors"> </button></div> <div id="diagramList" class="flex-1 overflow-y-auto py-1"></div></div> <div role="separator" aria-orientation="vertical"></div> <div class="relative flex-1 overflow-hidden bg-gray-50 dark:bg-gray-950"><div id="vis-canvas" class="w-full h-full"></div> <div id="customShapeBar" class="hidden"><div id="customShapeBarBody"></div></div> <div id="debugLayer"></div> <div id="evidenceLayer" class="hidden"></div> <div id="stampOverlay" style="position:absolute;inset:0;display:none;z-index:11;cursor:crosshair;"></div> <div id="selectionOverlay"><div id="rh-tl" class="resize-handle" style="top: -5px; left: -5px; cursor: nw-resize"></div> <div id="rh-tr" class="resize-handle" style="top: -5px; right: -5px; cursor: ne-resize"></div> <div id="rh-bl" class="resize-handle" style="bottom: -5px; left: -5px; cursor: sw-resize"></div> <div id="rh-br" class="resize-handle" style="bottom: -5px; right: -5px; cursor: se-resize"></div> <div id="rh-rotate">↻</div> <div id="rh-label-rotate" style="left: 0; top: -28px;"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><g transform="rotate(25,5,5)"><line x1="2.5" y1="3" x2="7.5" y2="3"></line><line x1="5" y1="3" x2="5" y2="8"></line></g></svg></div></div> <aside id="evidencePanel" class="hidden absolute top-0 right-0 bottom-0 w-80 max-w-[85vw] z-30 bg-gray-50 dark:bg-gray-900 border-l border-gray-200 dark:border-gray-700 shadow-xl flex flex-col"><div class="flex items-center justify-between gap-2 px-4 py-3 border-b border-gray-200 dark:border-gray-700"><h2 id="evidencePanelTitle" class="text-sm font-semibold text-gray-800 dark:text-gray-100"> </h2> <button id="btnEvidenceClose" class="tool-btn !w-7 !h-7">×</button></div> <div id="evidencePanelBody" class="flex-1 overflow-y-auto p-3 space-y-3"></div></aside> <div id="nodePanel" class="float-panel hidden"><button id="btnNodeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="nodePanelControls" class="contents"><button id="nodeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#f5f5f4;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <input id="nodeBgOpacity" type="range" min="0" max="100" step="5" value="100" class="w-16 h-1 accent-orange-500 cursor-pointer"/> <div class="panel-sep"></div> <button id="btnNodeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnNodeLink" class="tool-btn !w-6 !h-6"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5a3.5 3.5 0 0 0 5 0l1.5-1.5a3.5 3.5 0 0 0-5-5L5 2.5"></path><path d="M8 5.5a3.5 3.5 0 0 0-5 0L1.5 7a3.5 3.5 0 0 0 5 5L8 10.5"></path></svg></button> <div class="panel-sep"></div> <button id="btnNodeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="nodeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">13</span> <button id="btnNodeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnAlignLeft" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="1" y1="5" x2="7" y2="5"></line><line x1="1" y1="8" x2="9" y2="8"></line></svg></button> <button id="btnAlignCenter" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="2.5" y1="5" x2="9.5" y2="5"></line><line x1="1.5" y1="8" x2="10.5" y2="8"></line></svg></button> <button id="btnAlignRight" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="5" y1="5" x2="11" y2="5"></line><line x1="3" y1="8" x2="11" y2="8"></line></svg></button> <div class="panel-sep"></div> <button id="btnValignTop" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="1.5" x2="9" y2="1.5" stroke-width="2"></line><line x1="1" y1="5" x2="8" y2="5" stroke-width="1.3"></line><line x1="1" y1="8.5" x2="6" y2="8.5" stroke-width="1.3"></line></svg></button> <button id="btnValignMiddle" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="2.5" x2="8" y2="2.5" stroke-width="1.3"></line><line x1="1" y1="6" x2="9" y2="6" stroke-width="2"></line><line x1="1" y1="9.5" x2="6" y2="9.5" stroke-width="1.3"></line></svg></button> <button id="btnValignBottom" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="3.5" x2="8" y2="3.5" stroke-width="1.3"></line><line x1="1" y1="7" x2="6" y2="7" stroke-width="1.3"></line><line x1="1" y1="10.5" x2="9" y2="10.5" stroke-width="2"></line></svg></button> <div class="panel-sep"></div> <div id="customShapeLabelPlacementControls" class="hidden"><button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="above">T↑</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="below">T↓</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="left">←T</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="right">T→</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="center">T□</button> <div class="panel-sep"></div></div> <button id="btnZOrderBack" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1"></rect><rect x="5" y="1" width="8" height="8" rx="1" stroke-opacity="0.35"></rect></svg></button> <button id="btnZOrderFront" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1" stroke-opacity="0.35"></rect><rect x="5" y="1" width="8" height="8" rx="1"></rect></svg></button> <div class="panel-sep"></div> <button id="btnStampColor" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M7 2 C7 2 3 6.5 3 9 a4 4 0 0 0 8 0 C11 6.5 7 2 7 2 Z" fill="currentColor" fill-opacity="0.25"></path></svg></button> <button id="btnStampFontSize" class="tool-btn !w-7 !h-6 font-mono text-xs font-bold">Aa</button> <button id="btnStampSize" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="6" height="6" rx="0.8" fill="currentColor" fill-opacity="0.25"></rect><path d="M10 2 L12 2 L12 4"></path><path d="M12 2 L9 5"></path><path d="M10 12 L12 12 L12 10"></path><path d="M12 12 L9 9"></path></svg></button> <div class="panel-sep"></div> <button id="btnRotateCCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↺</button> <button id="btnRotateCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↻</button> <div class="panel-sep"></div> <button id="btnCopyPng" class="tool-btn !h-6 px-1.5 font-mono text-xs font-semibold flex items-center gap-0.5"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="7" x2="5" y2="1"></line><polyline points="2,4 5,1 8,4"></polyline><line x1="1" y1="9" x2="9" y2="9"></line></svg> PNG</button> <div class="panel-sep"></div> <button id="btnGroup" class="tool-btn !w-8 !h-7"><svg width="22" height="14" viewBox="0 0 22 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="20.6" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="4" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="15" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <button id="btnUngroup" class="tool-btn !w-8 !h-7"><svg width="26" height="14" viewBox="0 0 26 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="3" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="16.3" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="19" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <div class="panel-sep"></div> <button id="btnSaveShapeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <div id="linkPanel" class="float-panel hidden" style="min-width:260px; flex-direction:column; align-items:stretch; gap:0.5rem; padding:0.75rem;"><div class="text-xs font-semibold text-gray-500 dark:text-gray-400 mb-1"> </div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeUrl" value="url" class="accent-orange-500"/> <span> </span></label> <div id="linkUrlRow"><input id="linkUrlInput" type="url" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeDiagram" value="diagram" class="accent-orange-500"/> <span> </span></label> <div id="linkDiagramRow" class="hidden"><select id="linkDiagramSelect" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"></select></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeNew" value="new" class="accent-orange-500"/> <span> </span></label> <div id="linkNewRow" class="hidden"><input id="linkNewName" type="text" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <div class="flex gap-1 mt-1"><button id="btnLinkSave" class="flex-1 text-xs bg-orange-500 hover:bg-orange-600 text-white rounded px-2 py-1"> </button> <button id="btnLinkRemove" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-red-50 dark:hover:bg-red-900/20 hover:text-red-600"> </button> <button id="btnLinkCancel" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-gray-100 dark:hover:bg-gray-700">✕</button></div></div> <div id="edgePanel" class="float-panel hidden"><button id="btnEdgeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="edgePanelControls" class="contents"><button id="edgeBtnNone" class="tool-btn !w-7 !h-6 font-mono text-xs">—</button> <button id="edgeBtnFrom" class="tool-btn !w-7 !h-6 text-xs">←</button> <button id="edgeBtnTo" class="tool-btn !w-7 !h-6 text-xs">→</button> <button id="edgeBtnBoth" class="tool-btn !w-8 !h-6 text-xs">←→</button> <div class="panel-sep"></div> <button id="edgeBtnSolid" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round"></line></svg></button> <button id="edgeBtnDashed" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-dasharray="4,3"></line></svg></button> <div class="panel-sep"></div> <button id="btnEdgeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="edgeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">11</span> <button id="btnEdgeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnEdgeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnEdgeLabelWidthReset" class="tool-btn !w-6 !h-6 text-xs">↔</button> <div class="panel-sep"></div> <button id="btnEdgeLabelRotateCCW" class="tool-btn !w-7 !h-6 text-sm">↺</button> <button id="btnEdgeLabelRotateCW" class="tool-btn !w-7 !h-6 text-sm">↻</button> <div class="panel-sep"></div> <button id="btnEdgeLabelOffsetLeft" class="tool-btn !w-6 !h-6 text-sm">←</button> <button id="btnEdgeLabelOffsetRight" class="tool-btn !w-6 !h-6 text-sm">→</button> <button id="btnEdgeLabelOffsetUp" class="tool-btn !w-6 !h-6 text-sm">↑</button> <button id="btnEdgeLabelOffsetDown" class="tool-btn !w-6 !h-6 text-sm">↓</button> <button id="btnEdgeLabelOffsetReset" class="tool-btn !w-6 !h-6 text-xs">⊙</button> <div class="panel-sep"></div> <button id="btnEdgeWidthDecrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W−</button> <button id="btnEdgeWidthIncrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W+</button> <div class="panel-sep"></div> <button id="edgeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#a8a29e;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <button id="btnEdgeClearPorts" class="tool-btn !w-8 !h-6 text-xs">⊗</button> <div class="panel-sep"></div> <button id="btnSaveEdgeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <textarea id="labelInput" class="hidden" rows="1"></textarea> <div id="emptyState" class="absolute inset-0 flex flex-col items-center justify-center text-gray-400 dark:text-gray-600 pointer-events-none select-none"><svg width="52" height="44" viewBox="0 0 52 44" fill="none" stroke="currentColor" stroke-width="1.5" class="mb-3 opacity-50"><rect x="2" y="4" width="18" height="12" rx="2"></rect><rect x="32" y="28" width="18" height="12" rx="2"></rect><line x1="20" y1="10" x2="32" y2="34" stroke-dasharray="4,3"></line><rect x="17" y="16" width="18" height="12" rx="2"></rect><line x1="26" y1="16" x2="26" y2="10" stroke-dasharray="4,3"></line></svg> <p class="text-sm"> </p></div></div></div> <div id="toastContainer"></div> <div id="imageNameModal" style="display:none;position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,0.5);" class="flex items-center justify-center"><div class="bg-white dark:bg-gray-800 rounded-xl shadow-2xl p-6 w-80 flex flex-col gap-3"><p class="text-sm font-semibold text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-400 dark:text-gray-500">Lettres, chiffres, <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">_</code> et <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">-</code> uniquement.
|
|
150
|
+
</html>`,f=window.open(``,`_blank`);if(!f){alert(X(`error.pdf_popup`));return}f.document.write(d),f.document.close(),t.onclose()}catch(e){alert(X(`error.pdf_export`)+(e instanceof Error?e.message:String(e)))}finally{I(d,!1)}}let y=`px-4 py-2 text-sm border-b-2 border-blue-500 text-blue-600 dark:text-blue-400 font-semibold transition-colors`,b=`px-4 py-2 text-sm text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-300 transition-colors`;var x=Ur(),S=z(x),C=e=>{var r=v_(),f=R(r),p=R(f),h=B(R(p),2),x=R(h,!0);N(h),N(p);var S=B(p,2),C=R(S),w=R(C,!0);N(C);var T=B(C,2),E=R(T,!0);N(T);var D=B(T,2),ee=R(D,!0);N(D),N(S);var O=B(S,2),k=e=>{var t=h_(),n=R(t),r=R(n),c=e=>{var t=f_(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},l=e=>{var t=p_(),n=R(t);N(t),V(e=>K(n,`${e??``}failed to load folders`),[()=>X(`common.error_prefix`)]),G(e,t)},u=e=>{var t=Ur();J(z(t),16,()=>H(o),e=>e,(e,t)=>{var n=m_(),r=R(n);Ei(r);var i,a=B(r,2),o=R(a,!0);N(a),N(n),V(()=>{i!==(i=t)&&(r.value=(r.__value=t)??``),K(o,t)}),Ni(r,()=>H(s)[t],e=>H(s)[t]=e),G(e,n)}),G(e,t)};q(r,e=>{H(i)?e(c):H(a)?e(l,1):e(u,-1)}),N(n),N(t),G(e,t)};q(O,e=>{H(n)===`html`&&e(k)});var A=B(O,2),te=e=>{var n=g_(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var l=B(o,2),u=R(l,!0);N(l),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),l.disabled=H(c),K(u,n)},[()=>X(`modal.export.markdown_hint`),()=>X(`common.cancel`),()=>H(c)?`⏳`:X(`modal.export.markdown_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,l,g),G(e,n)};q(A,e=>{H(n)===`markdown`&&e(te)});var ne=B(A,2),re=e=>{var n=__(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),d=R(c,!0);N(c);var f=B(c,2),p=R(f,!0);N(f),N(a),N(n),V((e,t,n,r)=>{K(i,e),K(s,t),c.disabled=H(l),K(d,n),f.disabled=H(u),K(p,r)},[()=>X(`modal.export_html.hint`),()=>X(`common.cancel`),()=>H(l)?`⏳`:X(`modal.export_html.notion_btn`),()=>H(u)?`⏳`:X(`modal.export_html.confluence_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,()=>_(`notion`)),U(`click`,f,()=>_(`confluence`)),G(e,n)};q(ne,e=>{H(n)===`html`&&e(re)});var ie=B(ne,2),ae=e=>{var n=g_(),r=R(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2),l=R(c,!0);N(c),N(a),N(n),V((e,t,n)=>{K(i,e),K(s,t),c.disabled=H(d),K(l,n)},[()=>X(`modal.export.pdf_hint`),()=>X(`common.cancel`),()=>H(d)?`⏳`:X(`modal.export.pdf_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),U(`click`,c,v),G(e,n)};q(ie,e=>{H(n)===`pdf`&&e(ae)}),N(f),N(r),V((e,t,r,i)=>{K(x,e),hi(C,1,li(H(n)===`markdown`?y:b)),K(w,t),hi(T,1,li(H(n)===`html`?y:b)),K(E,r),hi(D,1,li(H(n)===`pdf`?y:b)),K(ee,i)},[()=>X(`modal.export.title`),()=>X(`modal.export.tab_markdown`),()=>X(`modal.export.tab_html`),()=>X(`modal.export.tab_pdf`)]),U(`click`,r,e=>{e.target===e.currentTarget&&t.onclose()}),U(`click`,C,()=>m(`markdown`)),U(`click`,T,()=>m(`html`)),U(`click`,D,()=>m(`pdf`)),G(e,r)};q(S,e=>{t.open&&e(C)}),G(e,x),Ke()}Nr([`click`]);var b_=W(`<p class="px-3 py-4 text-xs text-gray-400 text-center"> </p>`),x_=W(`<p> </p>`),S_=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">📁</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),C_=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><span class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-gray-500 dark:text-gray-400"><span class="shrink-0 opacity-40">📄</span> <span class="truncate font-mono"> </span></span> <button title="Add to exclusions" class="shrink-0 text-red-400 hover:text-red-600 px-3 py-2 text-sm font-bold transition-colors">⊖</button></div>`),w_=W(`<div class="border-t border-gray-200 dark:border-gray-700"><div class="flex items-center gap-2 px-3 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700"><button class="text-xs text-blue-600 dark:text-blue-400 hover:underline disabled:opacity-30 disabled:pointer-events-none shrink-0">↑ Up</button> <span class="font-mono text-xs text-gray-400 dark:text-gray-500 truncate flex-1 text-right"> </span></div> <div class="divide-y divide-gray-100 dark:divide-gray-800 max-h-52 overflow-y-auto"><!></div></div>`),T_=W(`<label class="flex items-center gap-1.5 text-xs text-gray-700 dark:text-gray-300 cursor-pointer"><input type="checkbox"/> </label>`),E_=W(`<div class="group flex items-center hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"><button class="flex-1 flex items-center gap-2 px-3 py-2 text-sm text-left"><span class="text-gray-400 shrink-0">📁</span> <span class="text-gray-700 dark:text-gray-300 truncate"> </span></button> <button title="Exclude this folder" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 px-3 py-2 text-sm transition-opacity">⊖</button></div>`),D_=W(`<button class="w-full px-3 py-2 text-xs text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-950/30 text-left font-medium border-t border-gray-100 dark:border-gray-800">✓ Select: <span class="font-mono"> </span></button>`),O_=W(`<!> <!>`,1),k_=W(`<div> </div>`),A_=W(`<div> </div> <div> </div> <div> </div> <!>`,1),j_=W(`<div role="button" tabindex="0" class="flex items-center gap-2 px-3 py-1 cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors"><span class="text-gray-400 dark:text-gray-600 w-5 text-right shrink-0 tabular-nums text-xs"></span> <div class="flex-1 min-w-0"><div class="flex items-center justify-between gap-1"><span class="text-gray-800 dark:text-gray-200 font-medium truncate text-xs"> </span> <span class="text-gray-400 dark:text-gray-600 tabular-nums shrink-0 text-xs"> </span></div> <div class="h-1 bg-gray-100 dark:bg-gray-800 rounded-full mt-0.5"><div class="h-1 bg-blue-400 dark:bg-blue-600 rounded-full"></div></div></div></div>`),M_=W(`<div class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 text-xs text-gray-500 dark:text-gray-400 space-y-0.5 border-b border-gray-100 dark:border-gray-800"><!></div> <div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center gap-2"><span class="text-xs text-gray-500 dark:text-gray-400 shrink-0 cursor-help"> </span> <input type="number" min="1" max="20" class="w-12 px-1.5 py-0.5 text-xs rounded border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-800 dark:text-gray-200 focus:outline-none"/> <button class="text-xs text-blue-600 dark:text-blue-400 hover:underline"> </button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto"></div></div>`),N_=W(`<p class="absolute inset-0 flex items-center justify-center text-gray-400 dark:text-gray-500 text-sm animate-pulse"> </p>`),P_=W(`<div class="flex items-center gap-1 group py-0.5"><span class="text-gray-600 dark:text-gray-400 break-all font-mono flex-1 text-xs"> </span> <button title="Exclude this file" class="shrink-0 opacity-0 group-hover:opacity-100 text-red-400 hover:text-red-600 text-xs leading-none px-1 transition-opacity">⊖</button></div>`),F_=W(`<div class="text-gray-400 text-center py-2">—</div>`),I_=W(`<div class="w-80 shrink-0 border-l border-gray-200 dark:border-gray-800 flex flex-col bg-white dark:bg-gray-900 overflow-hidden"><div class="px-3 py-2 border-b border-gray-100 dark:border-gray-800 flex items-center justify-between"><span class="font-bold text-sm text-gray-900 dark:text-gray-100"> </span> <button class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 text-xs leading-none">✕</button></div> <p class="px-3 pt-2 pb-1 text-xs font-semibold text-gray-400 dark:text-gray-600 uppercase tracking-wider"> </p> <div class="flex-1 overflow-y-auto px-3 py-1 space-y-1 text-xs"><!></div></div>`),L_=W(`<div class="fixed inset-0 z-50 flex flex-col bg-white dark:bg-gray-950"><div class="flex items-center justify-between px-6 h-14 border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><h2 class="font-semibold text-base"> </h2> <button class="text-sm px-3 py-1.5 rounded-lg text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"> </button></div> <div class="border-b border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900 shrink-0"><div class="flex items-center gap-3 px-6 py-3"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </label> <input type="text" readonly="" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono cursor-default focus:outline-none"/> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">📁 <span> </span></button> <button class="text-sm px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-semibold transition-colors shrink-0"> </button></div> <div class="flex items-start gap-3 px-6 pb-2"><label class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0 pt-1.5"> </label> <textarea rows="3" spellcheck="false" class="flex-1 px-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 font-mono focus:outline-none focus:ring-1 focus:ring-blue-400 resize-y"></textarea> <button class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0">📁 <span> </span></button></div> <!> <div class="flex items-center gap-x-4 gap-y-2 px-6 pb-3 flex-wrap"><span class="text-xs font-medium text-gray-500 dark:text-gray-400 shrink-0"> </span> <label class="flex items-center gap-1.5 text-xs font-medium text-blue-600 dark:text-blue-400 cursor-pointer shrink-0"><input type="checkbox"/> </label> <!></div> <!></div> <div class="flex-1 overflow-hidden flex"><!> <div class="flex-1 relative overflow-hidden"><!> <canvas style="position: absolute; inset: 0"></canvas></div> <!></div></div>`);function R_(e,t){Ge(t,!0);let n=new Set(`the.a.an.and.or.but.not.nor.so.yet.both.either.neither.is.are.was.were.be.been.being.have.has.had.do.does.did.will.would.shall.should.may.might.can.could.must.need.dare.ought.used.to.of.in.for.on.with.at.by.from.up.about.into.through.during.before.after.above.below.between.out.off.over.under.again.further.then.once.here.there.when.where.why.how.all.each.few.more.most.other.some.such.no.only.own.same.than.too.very.just.also.still.already.always.never.often.sometimes.usually.this.that.these.those.its.your.our.their.his.her.him.she.you.they.we.me.my.it.who.which.what.whose.whom.if.though.although.because.since.while.unless.until.whether.as.like.via.per.i.am.he.us.see.now.new.old.got.let.put.say.said.says.get.use.make.made.take.come.came.go.went.know.think.look.want.give.seem.back.down.even.much.well.good.work.tell.keep.hold.turn.move.play.live.help.run.start.off.way.too.few.show.hear.etc.eg.ie.one.two.three.four.five.six.seven.eight.nine.ten.le.la.les.un.une.des.du.de.d.l.au.aux.ce.ci.cet.cette.ces.mon.ma.mes.ton.ta.tes.son.sa.ses.notre.nos.votre.vos.leur.leurs.je.tu.il.elle.on.nous.vous.ils.elles.me.te.se.lui.y.en.qui.que.quoi.dont.où.et.ou.mais.donc.or.ni.car.si.ne.pas.plus.moins.très.bien.mal.peu.beaucoup.trop.assez.aussi.comme.pour.par.avec.sans.dans.sur.sous.entre.vers.chez.contre.avant.après.pendant.depuis.selon.malgré.sauf.est.sont.était.être.avoir.fait.faire.dit.dire.peut.pouvoir.doit.devoir.veut.vouloir.sait.savoir.va.aller.vient.venir.tout.tous.toute.toutes.autre.autres.même.chaque.quel.quelle.quels.quelles.aucun.aucune.certain.certaine.plusieurs.quelque.quelques.tel.telle.tels.telles.cela.ceci.ça.celui.celle.ceux.celles.ici.voici.voilà.alors.ainsi.encore.déjà.jamais.toujours.souvent.parfois.rien.personne.chose.fois.jour.temps.part.cas.point.lieu.monde.cependant.néanmoins.pourtant.toutefois.quand.lorsque.puisque.parce.afin.puis.lors.notamment.surtout.seulement.vraiment.enfin.ensuite.ailleurs.là.ici.voici.voilà.dont.lequel.laquelle.lesquels.lesquelles`.split(`.`)),r=new Set(`public.private.protected.static.void.class.interface.abstract.final.const.let.var.function.return.if.else.for.while.do.switch.case.break.continue.try.catch.throw.throws.finally.new.this.self.super.import.export.from.package.module.require.include.using.namespace.struct.enum.trait.impl.fn.def.func.fun.val.mut.async.await.yield.lambda.extends.implements.override.virtual.sealed.data.object.companion.where.when.match.guard.defer.go.chan.select.type.alias.as.is.in.of.with.true.false.null.nil.none.undefined.println.printf.fmt.log.print.main.args.argv.init.setup.teardown.describe.test.expect.assert.before.after.not.and.or.delete.typeof.instanceof.readonly.keyof.infer.never.unknown.declare.satisfies.get.set.add.remove.update.create.find.fetch.load.save.put.post.patch.list.map.filter.reduce.sort.merge.parse.format.convert.transform.validate.check.handle.process.execute.start.stop.reset.clear.close.open.read.write.send.receive.emit.trigger.dispatch.subscribe.unsubscribe.listen.notify.register.unregister.bind.apply.call.invoke.callback.handler.listener.middleware.interceptor.resolver.provider.consumer.producer.builder.factory.adapter.wrapper.proxy.decorator.observer.visitor.strategy.command.controller.service.repository.dao.dto.entity.model.schema.config.context.state.store.action.reducer.selector.hook.ref.effect.memo.component.module.plugin.extension.util.utils.helper.helpers.common.shared.base.default.index.app.core.lib.src.test.spec.mock.stub.fixture.impl.internal.api.sdk.client.server.request.response.status.code.error.exception.message.result.data.value.key.name.label.title.description.item.element.node.child.parent.root.container.wrapper.layout.view.page.screen.panel.header.footer.sidebar.navbar.body.content.section.row.col.column.grid.flex.block.inline.span.div.input.output.param.params.arg.option.options.props.attr.attrs.field.fields.property.properties.method.methods.string.number.boolean.integer.float.double.long.short.byte.char.array.object.map.set.list.vector.queue.stack.hash.table.tree.graph.pair.tuple.optional.nullable.void.unit.any.bool.bytes.none.int.str.bool.all.each.every.some.many.single.multi.first.last.next.prev.previous.current.old.temp.tmp.new.top.bottom.left.right.center.middle.start.end.begin.min.max.count.total.sum.avg.size.length.width.height.depth.flag.num.idx.id.uid.uuid.num.str.val.obj.arr.fn.cb.ctx.req.res.err.msg.src.dst.evt.doc.db.io.fs.os.env.sys.http.https.url.uri.path.port.host.tcp.udp.ssl.tls.html.css.json.xml.yml.yaml.csv.sql.regex.utf.ascii.rgb.rgba.hex.px.em.rem.vh.vw.auto.inherit.initial.application.file.local.source.messages.logging.alerting.programmed.offset.offsets.zone.zoned.decimal.big.integer.constructor.mapper.captor.publisher.verify.subscriber.org.edr.ack.ref.ssr.ssg.csr.isr.mockito.junit.vitest.jest.mocha.rspec.pytest.cypress.playwright.captor.spy.given.then.verify.times.never.invocation.argumentcaptor.inorder.donothing.doreturn.ippon.springframework.jakarta.javax.todo.fixme.hack.note.deprecated.experimental.eslint.prettier.typescript.javascript.java.kotlin.python.golang.rust.csharp.swift.ruby.spring.boot.javax.jakarta.hibernate.lombok.gradle.maven.webpack.vite.react.angular.vue.svelte.nuxt.express.fastapi.flask.django.rails.fiber.gin.actix.tokio.asyncio.junit.jest.mocha.pytest.rspec.docker.kubernetes.aws.gcp.azure.terraform.ansible.nginx.apache.linux.nextjs.remix.astro.sveltekit.gatsby.nuxtjs.qwik.solid.vercel.netlify.cloudflare.supabase.firebase.mongodb.postgres.prisma.drizzle.typeorm.sequelize.mongoose.redis.neon.trpc.graphql.grpc.rest.openapi.swagger.zod.yup.valibot.tailwind.shadcn.radix.headless.chakra.mantine.antd.mui.tanstack.tanstackquery.zustand.jotai.recoil.redux.mobx.storybook.cypress.playwright.vitest.turbopack.turborepo.getserversideprops.getstaticprops.getstaticpaths.generatestaticparams.generatemetadata.serveraction.revalidate.notfound.redirect.permanentredirect.unstablecache.unstablenostore.cookies.headers.userouter.usepathname.usesearchparams.useparams.useformstate.useformstatus.useoptimistic.useserveraction.classname.onclick.onchange.onsubmit.onfocus.onblur.onkeydown.onkeyup.onmousedown.onmouseup.defaultvalue.htmlfor.tabindex.strokewidth.viewbox.fillopacity.strokeopacity.pathdata.children.fragment.portal.suspense.errorboundary.strictmode.createelement.createcontext.createref.forwardref.usestate.useeffect.useref.usecontext.usememo.usecallback.usereducer.useid.usetransition.usedeferredvalue.useimperativehandle.mutex.lock.thread.goroutine.coroutine.channel.buffer.stream.pipe.observable.promise.future.completable.deferred.disposable.lifecycle.scope.annotation.attribute.metadata.reflection.generic.template.macro.preprocessor.compiler.runtime.debug.release.production.development.staging.build.deploy.lint.coverage.report.the.and.for.are.but.not.you.all.this.that.with.have.from.they.will.been.can.has.was.its.our.their.more.also.when.what.about.which.would.into.than.then.each.just.over.after.such.here.some.were.very.only`.split(`.`));function i(e){return n.has(e)||r.has(e)||e.length<3||/^\d+$/.test(e)||/^[^a-z]/.test(e)}function a(e){return e.replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/([A-Z]+)([A-Z][a-z])/g,`$1 $2`).replace(/[_\-./]+/g,` `).toLowerCase().trim().split(/\s+/).filter(e=>e.length>=3)}function o(e){return e.toLowerCase().split(/[^a-zàâäéèêëïîôùûü]+/).filter(e=>e.length>=3)}let s=[{value:`adoc`,cat:`prose`},{value:`asciidoc`,cat:`prose`},{value:`asm`,cat:`code`},{value:`astro`,cat:`code`},{value:`avsc`,cat:`config`},{value:`bash`,cat:`code`},{value:`bat`,cat:`code`},{value:`bicep`,cat:`config`},{value:`c`,cat:`code`},{value:`cc`,cat:`code`},{value:`cfg`,cat:`config`},{value:`cjs`,cat:`code`},{value:`clj`,cat:`code`},{value:`cljs`,cat:`code`},{value:`cmake`,cat:`code`},{value:`cmd`,cat:`code`},{value:`conf`,cat:`config`},{value:`cpp`,cat:`code`},{value:`cql`,cat:`code`},{value:`cs`,cat:`code`},{value:`cshtml`,cat:`code`},{value:`css`,cat:`config`},{value:`cxx`,cat:`code`},{value:`dart`,cat:`code`},{value:`env`,cat:`config`},{value:`erb`,cat:`code`},{value:`erl`,cat:`code`},{value:`ex`,cat:`code`},{value:`exs`,cat:`code`},{value:`fish`,cat:`code`},{value:`fs`,cat:`code`},{value:`fsx`,cat:`code`},{value:`go`,cat:`code`},{value:`gql`,cat:`code`},{value:`gradle`,cat:`code`},{value:`graphql`,cat:`code`},{value:`groovy`,cat:`code`},{value:`h`,cat:`code`},{value:`hcl`,cat:`config`},{value:`hpp`,cat:`code`},{value:`hs`,cat:`code`},{value:`html`,cat:`config`},{value:`ini`,cat:`config`},{value:`java`,cat:`code`},{value:`jl`,cat:`code`},{value:`js`,cat:`code`},{value:`json`,cat:`config`},{value:`jsx`,cat:`code`,jsx:!0},{value:`kt`,cat:`code`},{value:`less`,cat:`config`},{value:`lua`,cat:`code`},{value:`m`,cat:`code`},{value:`md`,cat:`prose`,def:!0},{value:`mdx`,cat:`prose`},{value:`mjs`,cat:`code`},{value:`mk`,cat:`code`},{value:`ml`,cat:`code`},{value:`mli`,cat:`code`},{value:`mm`,cat:`code`},{value:`nim`,cat:`code`},{value:`php`,cat:`code`},{value:`pl`,cat:`code`},{value:`prisma`,cat:`code`},{value:`properties`,cat:`config`},{value:`proto`,cat:`code`},{value:`ps1`,cat:`code`},{value:`py`,cat:`code`},{value:`r`,cat:`code`},{value:`razor`,cat:`code`},{value:`rb`,cat:`code`},{value:`rs`,cat:`code`},{value:`rst`,cat:`prose`},{value:`s`,cat:`code`},{value:`scala`,cat:`code`},{value:`scss`,cat:`config`},{value:`sh`,cat:`code`},{value:`sol`,cat:`code`},{value:`sql`,cat:`code`},{value:`styl`,cat:`config`},{value:`svelte`,cat:`code`},{value:`swift`,cat:`code`},{value:`tex`,cat:`prose`},{value:`tf`,cat:`config`},{value:`tfvars`,cat:`config`},{value:`thrift`,cat:`code`},{value:`toml`,cat:`config`},{value:`ts`,cat:`code`},{value:`tsx`,cat:`code`,jsx:!0},{value:`txt`,cat:`prose`},{value:`v`,cat:`code`},{value:`vb`,cat:`code`},{value:`vue`,cat:`code`},{value:`xml`,cat:`config`},{value:`yaml`,cat:`config`},{value:`yml`,cat:`config`},{value:`zig`,cat:`code`},{value:`zsh`,cat:`code`}],c=new Set(s.filter(e=>e.cat===`prose`).map(e=>e.value)),l=new Set(s.filter(e=>e.cat===`code`).map(e=>e.value)),u=new Set(s.filter(e=>e.cat===`config`).map(e=>e.value)),d=new Set(s.filter(e=>e.jsx).map(e=>e.value));function f(e,t){let n=[];if(c.has(t)){let t=e.replace(/^\s*(import|export\s+\{[^}]*\}|export\s+\*|package|require|#include|from\s+['"][^'"]+['"]\s*(import)?)\b.*/gm,``).replace(/```[\s\S]*?```/g,` `).replace(/`[^`\n]+`/g,` `).replace(/!\[[^\]]*\]\([^)]*\)/g,` `).replace(/\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/https?:\/\/\S+/g,` `).replace(/[#*_~>`|!\[\](){}=+\-]/g,` `);n.push(...o(t))}else l.has(t)?(d.has(t)&&(e=e.replace(/<\/?[A-Z][A-Za-z0-9.]*[^>]*>/g,` `),e=e.replace(/<\/?(div|span|main|section|article|aside|nav|header|footer|form|input|button|select|option|textarea|table|thead|tbody|tr|td|th|ul|ol|li|a|img|p|h[1-6]|label|figure|figcaption|picture|video|audio|canvas|svg|path|circle|rect|g|defs|use|link|meta|head|html|body|script|style|br|hr|strong|em|code|pre|blockquote|small|sub|sup)\b[^>]*>/gi,` `),e=e.replace(/\b(className|onClick|onChange|onSubmit|onFocus|onBlur|onKeyDown|onKeyUp|onMouseDown|onMouseUp|htmlFor|tabIndex|strokeWidth|viewBox|fillOpacity|strokeOpacity|defaultValue|placeholder|disabled|checked|readOnly|required|multiple|autoFocus|autoComplete|type|href|src|alt|width|height|style|key|ref)\s*=/g,` =`)),e=e.replace(/^\s*(import\s+[\w.*{},\s'"@/-]+;?|from\s+['"][^'"]+['"]\s*;?|package\s+[\w.]+;?|namespace\s+[\w.]+;?|using\s+[\w.]+;?|require\s*\(?\s*['"][^'"]+['"]\s*\)?;?)\s*$/gm,``),e.replace(/(?:\/\/|#(?!.*[{}[\]<>])| -- )\s*(.+)$/gm,(e,t)=>(n.push(...o(t)),e)),e.replace(/\/\*[\s\S]*?\*\//g,e=>(n.push(...o(e)),e)),e.replace(/"""[\s\S]*?"""|'''[\s\S]*?'''/g,e=>(n.push(...o(e)),e)),e.replace(/["'`]([A-Za-zÀ-ÿ][A-Za-zÀ-ÿ\s,.'éàèùâêîôûç]{3,})["'`]/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e))):u.has(t)&&(e.replace(/:\s*["']([^"']{3,})["']/g,(e,t)=>(n.push(...o(t)),e)),e.replace(/\b([A-Za-z][A-Za-z0-9_]{2,})\b/g,(e,t)=>(n.push(...a(t)),e)));return n.filter(e=>!i(e))}let p=F(``),m=F(``),h=F(1),g=F(``),_=F(!0),v=F(!1),y=F(L(s.map(e=>({value:e.value,label:`.`+e.value,checked:!!e.def}))));function b(){return H(y).filter(e=>e.checked).map(e=>e.value)}let x=P(()=>H(y).every(e=>e.checked)),S=F(null),C=F(null),w=F(0),T=F(null),E=F(L([])),D=F(L([])),ee=F(!1),O=F(``),k=F(0),A=F(L([]));function te(){localStorage.setItem(`wc-exts`,JSON.stringify(b()))}function ne(){let e=H(x);I(y,H(y).map(t=>({...t,checked:!e})),!0),te()}function re(){te()}function ie(){return new Set((H(m)||``).split(/[\n,]/).map(e=>e.trim()).filter(Boolean))}function ae(e){let t=ie();t.has(e)||(t.add(e),I(m,[...t].join(`, `),!0),localStorage.setItem(`wc-exclude`,H(m)),H(ue)&&_e(H(fe)),se())}function oe(){localStorage.setItem(`wc-exclude`,H(m)),H(ue)&&_e(H(fe)),se()}function se(){H(ee)&&H(O)&&je(H(O))}function ce(){H(S)&&Ae()}function le(){let e=localStorage.getItem(`wc-root`);e&&(I(p,e,!0),I(xe,e,!0));let t=localStorage.getItem(`wc-exclude`);t&&I(m,t,!0);let n=localStorage.getItem(`wc-exts`);if(n)try{let e=JSON.parse(n);I(y,H(y).map(t=>({...t,checked:e.includes(t.value)})),!0)}catch{}}let ue=F(!1),de=F(null),fe=F(``),pe=F(``),me=F(null),he=F(``);function ge(){I(ue,!H(ue)),H(ue)&&_e(H(fe)||H(p)||`/`)}async function _e(e){I(me,null),I(he,`Loading…`);try{let t=await fetch(`/api/browse?all=1&path=`+encodeURIComponent(e)).then(e=>e.json());I(fe,t.current,!0),I(de,t.parent,!0),I(pe,t.current,!0);let n=H(p).trim(),r=(e,t)=>n&&e.startsWith(n+`/`)?e.slice(n.length+1):t,i=ie(),a=(t.dirs||[]).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`dir`,name:e.name,path:e.path,entry:r(e.path,e.name)})),o=b(),s=(t.files||[]).filter(e=>o.some(t=>e.name.endsWith(`.`+t))).filter(e=>!i.has(r(e.path,e.name))).map(e=>({kind:`file`,name:e.name,entry:r(e.path,e.name)})),c=[...a,...s];I(me,c,!0),I(he,c.length?``:`Empty directory`,!0)}catch{I(me,[],!0),I(he,`Cannot read directory`)}}function ve(){H(de)&&_e(H(de))}let ye=F(!1),be=F(null),xe=F(``),Se=F(``),j=F(null),Ce=F(``);function M(){I(ye,!H(ye)),H(ye)&&we(H(xe)||H(p)||`/`)}async function we(e){I(j,null),I(Ce,`Loading…`);try{let t=await fetch(`/api/browse?path=`+encodeURIComponent(e)).then(e=>e.json());I(xe,t.current,!0),I(be,t.parent,!0),I(Se,t.current,!0),I(j,(t.dirs||[]).map(e=>({name:e.name,path:e.path})),!0),I(Ce,H(j).length?``:`No sub-folders`,!0)}catch{I(j,[],!0),I(Ce,`Cannot read directory`)}}function Te(){H(be)&&we(H(be))}function Ee(){I(p,H(xe),!0),localStorage.setItem(`wc-root`,H(xe)),I(ye,!1),I(m,``),localStorage.removeItem(`wc-exclude`),I(fe,H(xe),!0)}let De=F(null),Oe=F(null),ke=F(!1);function Ae(){if(!H(S)||!H(C))return;let e=Math.max(1,H(h)||1),t=[...H(S).entries()].sort((e,t)=>t[1]-e[1]),n=t.filter(([t])=>(H(C).get(t)||new Set).size>=e).slice(0,150);if(!n.length){let n=t.length;I(g,n?`${n} domain word(s) found but none appear in ${e}+ file(s). Lower the "Min files" threshold to 1.`:`No domain words extracted. Try adding more file extensions or a broader folder.`,!0),I(_,!0),I(ke,!1),I(v,!1);return}let r=[...H(S).keys()].filter(t=>(H(C).get(t)||new Set).size>=e).length;I(T,{scanned:H(w),unique:r,shown:n.length},!0);let i=n.slice(0,50),a=i[0][1];I(D,i.map(([e,t])=>({word:e,freq:t,pct:Math.round(t/a*100)})),!0),I(v,!0),I(_,!1);let o=document.documentElement.classList.contains(`dark`),s=o?[`#60a5fa`,`#34d399`,`#f9a8d4`,`#a78bfa`,`#fbbf24`,`#6ee7b7`,`#93c5fd`,`#fb923c`,`#4ade80`,`#f472b6`]:[`#1d4ed8`,`#047857`,`#7c3aed`,`#b45309`,`#be123c`,`#0369a1`,`#4338ca`,`#c2410c`,`#15803d`,`#9333ea`];requestAnimationFrame(()=>{if(!H(De)||!H(Oe))return;let e=H(De),t=H(Oe);e.width=Math.max(400,t.offsetWidth),e.height=Math.max(300,t.offsetHeight),e.style.width=e.width+`px`,e.style.height=e.height+`px`,I(ke,!0);let n=Math.sqrt(e.width*e.height/(800*500)),r=Math.min(220,Math.round(72*n)),c=i.map(([e,t])=>[e,Math.max(12,Math.round(r*t/a))]);window.WordCloud?.(e,{list:c,gridSize:Math.round(4*e.width/1024),fontFamily:`ui-sans-serif, system-ui, sans-serif`,color:()=>s[Math.floor(Math.random()*s.length)],backgroundColor:o?`#030712`:`#ffffff`,rotateRatio:.2,minSize:6,shrinkToFit:!0,click:e=>je(e[0])})})}function je(e){if(!H(C)||!H(S))return;let t=[...H(C).get(e)||[]].sort(),n=H(S).get(e)||0;I(O,e,!0),I(k,n,!0),I(A,t,!0),I(ee,!0)}function Me(){I(ee,!1)}async function Ne(){let e=H(p).trim();if(!e){I(g,`Please select a root folder first.`),I(_,!0);return}let t=b();if(!t.length){I(g,`Please select at least one extension.`),I(_,!0);return}I(ye,!1),I(v,!1),I(ee,!1),I(g,`Reading files…`),I(_,!0),I(ke,!1);try{let n=H(m).trim(),r=n?n.split(/[\n,]/).map(e=>e.trim()).filter(Boolean):[];localStorage.setItem(`wc-exclude`,n);let i=new URLSearchParams({path:e});t.forEach(e=>i.append(`ext`,e)),r.forEach(e=>i.append(`exclude`,e));let a=await fetch(`/api/wordcloud?`+i);if(!a.ok){I(g,`Error: `+((await a.json()).error||a.statusText));return}let{files:o,fileTexts:s}=await a.json();I(g,`Analyzing ${o} file(s)…`);let c=new Map,l=new Map,u=new Set;I(w,o,!0);for(let{path:e,text:t}of s){let n=(e.split(`.`).pop()||``).toLowerCase();n&&u.add(n);let r=f(t,n),i=new Set;for(let t of r)c.set(t,(c.get(t)||0)+1),i.has(t)||(i.add(t),l.has(t)||l.set(t,new Set),l.get(t).add(e))}I(S,c,!0),I(C,l,!0),I(E,[...u].sort().map(e=>`.`+e),!0),Ae()}catch(e){I(g,`Error: `+e.message)}}let Pe=!1;On(()=>{t.open&&!Pe?(Pe=!0,I(g,`Choose a root folder and click Launch.`),I(_,!0),I(ke,!1),I(v,!1),I(ee,!1),I(S,null),I(C,null),I(T,null),I(D,[],!0),I(ye,!1),I(ue,!1),I(h,1),le(),H(p)||fetch(`/api/config`).then(e=>e.json()).then(e=>{e.docsFolder&&(I(p,e.docsFolder,!0),I(xe,e.docsFolder,!0))}).catch(()=>{})):t.open||(Pe=!1)});var Fe=Ur(),Ie=z(Fe),Le=e=>{var n=L_(),r=R(n),i=R(r),a=R(i,!0);N(i);var o=B(i,2),s=R(o,!0);N(o),N(r);var c=B(r,2),l=R(c),u=R(l),d=R(u,!0);N(u);var f=B(u,2);Ei(f);var b=B(f,2),S=B(R(b)),C=R(S,!0);N(S),N(b);var w=B(b,2),te=R(w,!0);N(w),N(l);var ie=B(l,2),se=R(ie),le=R(se,!0);N(se);var fe=B(se,2);vn(fe);var xe=B(fe,2),Ae=B(R(xe)),Pe=R(Ae,!0);N(Ae),N(xe),N(ie);var Fe=B(ie,2),Ie=e=>{var t=w_(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=b_(),n=R(t,!0);N(t),V(()=>K(n,H(he))),G(e,t)},l=e=>{var t=x_(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(he)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(he))}),G(e,t)},u=e=>{var t=Ur();J(z(t),17,()=>H(me),Yr,(e,t)=>{var n=Ur(),r=z(n),i=e=>{var n=S_(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>_e(H(t).path)),U(`click`,o,()=>ae(H(t).entry)),G(e,n)},a=e=>{var n=C_(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,o,()=>ae(H(t).entry)),G(e,n)};q(r,e=>{H(t).kind===`dir`?e(i):e(a,-1)}),G(e,n)}),G(e,t)};q(s,e=>{H(me)===null?e(c):H(me).length===0?e(l,1):e(u,-1)}),N(o),N(t),V(()=>{r.disabled=!H(de),K(a,H(pe))}),U(`click`,r,ve),G(e,t)};q(Fe,e=>{H(ue)&&e(Ie)});var Le=B(Fe,2),Re=R(Le),ze=R(Re,!0);N(Re);var Be=B(Re,2),Ve=R(Be);Ei(Ve);var He=B(Ve);N(Be),J(B(Be,2),17,()=>H(y),e=>e.value,(e,t,n)=>{var r=T_(),i=R(r);Ei(i);var a=B(i);N(r),V(()=>K(a,` ${H(t).label??``}`)),U(`change`,i,re),Ni(i,()=>H(t).checked,e=>H(t).checked=e),G(e,r)}),N(Le);var Ue=B(Le,2),We=e=>{var t=w_(),n=R(t),r=R(n),i=B(r,2),a=R(i,!0);N(i),N(n);var o=B(n,2),s=R(o),c=e=>{var t=b_(),n=R(t,!0);N(t),V(()=>K(n,H(Ce))),G(e,t)},l=e=>{var t=O_(),n=z(t),r=e=>{var t=x_(),n=R(t,!0);N(t),V(()=>{hi(t,1,`px-3 py-3 text-xs ${H(Ce)===`Cannot read directory`?`text-red-400`:`text-gray-400`} text-center`),K(n,H(Ce))}),G(e,t)},i=e=>{var t=Ur();J(z(t),17,()=>H(j),Yr,(e,t)=>{var n=E_(),r=R(n),i=B(R(r),2),a=R(i,!0);N(i),N(r);var o=B(r,2);N(n),V(()=>K(a,H(t).name)),U(`click`,r,()=>we(H(t).path)),U(`click`,o,()=>ae(H(t).name)),G(e,n)}),G(e,t)};q(n,e=>{H(j).length===0?e(r):e(i,-1)});var a=B(n,2),o=e=>{var t=D_(),n=B(R(t)),r=R(n,!0);N(n),N(t),V(()=>K(r,H(Se))),U(`click`,t,Ee),G(e,t)};q(a,e=>{H(Ce)!==`Cannot read directory`&&e(o)}),G(e,t)};q(s,e=>{H(j)===null?e(c):e(l,-1)}),N(o),N(t),V(()=>{r.disabled=!H(be),K(a,H(Se))}),U(`click`,r,Te),G(e,t)};q(Ue,e=>{H(ye)&&e(We)}),N(c);var Ge=B(c,2),Ke=R(Ge),qe=e=>{var t=M_(),n=R(t),r=R(n),i=e=>{var t=A_(),n=z(t),r=R(n);N(n);var i=B(n,2),a=R(i);N(i);var o=B(i,2),s=R(o);N(o);var c=B(o,2),l=e=>{var t=k_(),n=R(t);N(t),V((e,r)=>{Y(t,`title`,e),K(n,`${H(E).length??``} extension${H(E).length>1?`s`:``} found (${r??``})`)},[()=>H(E).join(`, `),()=>H(E).join(`, `)]),G(e,t)};q(c,e=>{H(E).length&&e(l)}),V(()=>{K(r,`${H(T).scanned??``} file(s) scanned`),K(a,`${H(T).unique??``} unique domain words`),K(s,`${H(T).shown??``} shown`)}),G(e,t)};q(r,e=>{H(T)&&e(i)}),N(n);var a=B(n,2),o=R(a),s=R(o,!0);N(o);var c=B(o,2);Ei(c);var l=B(c,2),u=R(l,!0);N(l),N(a);var d=B(a,2),f=R(d,!0);N(d);var p=B(d,2);J(p,21,()=>H(D),Yr,(e,t,n)=>{var r=j_(),i=R(r);i.textContent=n+1;var a=B(i,2),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(o);var d=B(o,2),f=R(d);N(d),N(a),N(r),V(()=>{K(c,H(t).word),K(u,H(t).freq),_i(f,`width:${H(t).pct??``}%`)}),U(`click`,r,()=>je(H(t).word)),G(e,r)}),N(p),N(t),V((e,t,n,r,i,a)=>{Y(o,`title`,e),K(s,t),Y(c,`title`,n),Y(l,`title`,r),K(u,i),K(f,a)},[()=>X(`wc.min_files_hint`),()=>X(`wc.min_files_label`),()=>X(`wc.min_files_hint`),()=>X(`wc.apply_hint`),()=>X(`wc.apply_btn`),()=>X(`wc.top_words`)]),Mi(c,()=>H(h),e=>I(h,e)),U(`click`,l,ce),G(e,t)};q(Ke,e=>{H(v)&&e(qe)});var Je=B(Ke,2),Ye=R(Je),Xe=e=>{var t=N_(),n=R(t,!0);N(t),V(()=>K(n,H(g))),G(e,t)};q(Ye,e=>{H(_)&&e(Xe)});var Ze=B(Ye,2);let Qe;Li(Ze,e=>I(De,e),()=>H(De)),N(Je),Li(Je,e=>I(Oe,e),()=>H(Oe));var $e=B(Je,2),et=e=>{var t=I_(),n=R(t),r=R(n),i=R(r);N(r);var a=B(r,2);N(n);var o=B(n,2),s=R(o,!0);N(o);var c=B(o,2),l=R(c),u=e=>{var t=Ur();J(z(t),17,()=>H(A),Yr,(e,t)=>{var n=P_(),r=R(n),i=R(r,!0);N(r);var a=B(r,2);N(n),V(()=>K(i,H(t))),U(`click`,a,()=>ae(H(t))),G(e,n)}),G(e,t)},d=e=>{G(e,F_())};q(l,e=>{H(A).length?e(u):e(d,-1)}),N(c),N(t),V(e=>{K(i,`${H(O)??``} ×${H(k)??``}`),K(s,e)},[()=>X(`wc.found_in`)]),U(`click`,a,Me),G(e,t)};q($e,e=>{H(ee)&&e(et)}),N(Ge),N(n),V((e,t,n,r,i,o,c,l,u,f)=>{K(a,e),K(s,t),K(d,n),K(C,r),K(te,i),K(le,o),Y(fe,`placeholder`,c),K(Pe,l),K(ze,u),Oi(Ve,H(x)),K(He,` ${f??``}`),Qe=hi(Ze,1,``,null,Qe,{hidden:!H(ke)})},[()=>X(`wc.title`),()=>X(`wc.close_btn`),()=>X(`wc.search_root_label`),()=>X(`wc.browse_btn`),()=>X(`wc.launch_btn`),()=>X(`wc.exclude_label`),()=>X(`wc.exclude_placeholder`),()=>X(`wc.browse_btn`),()=>X(`wc.extensions_label`),()=>X(`wc.all_btn`)]),U(`click`,o,function(...e){t.onclose?.apply(this,e)}),Mi(f,()=>H(p),e=>I(p,e)),U(`click`,b,M),U(`click`,w,Ne),U(`input`,fe,oe),Mi(fe,()=>H(m),e=>I(m,e)),U(`click`,xe,ge),U(`change`,Ve,ne),G(e,n)};q(Ie,e=>{t.open&&e(Le)}),G(e,Fe),Ke()}Nr([`click`,`input`,`change`]);var z_=W(`<button class="ghost-button"><i class="fa-solid fa-cloud"></i></button> <button title="Toggle dark mode" class="ghost-button" aria-label="Toggle dark mode"> </button>`,1),B_=W(`<div class="relative hidden sm:block"><input type="search" class="w-56 pl-8 pr-3 py-1.5 text-sm rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-gray-100 placeholder:text-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500"/> <span class="absolute left-2.5 top-2 text-gray-400 text-sm pointer-events-none">🔍</span></div>`),V_=W(`<p class="p-8 text-red-500"> </p>`),H_=W(`<div class="h-full flex items-center justify-center p-8"><div class="max-w-md text-center"><div class="text-5xl mb-4 select-none" aria-hidden="true">📚</div> <h2 class="text-xl font-semibold text-gray-700 dark:text-gray-300 mb-2"> </h2> <p class="text-sm text-gray-500 dark:text-gray-500"> </p> <p class="mt-4 text-xs text-gray-400 dark:text-gray-600 font-mono bg-gray-100 dark:bg-gray-800 rounded-lg px-3 py-2 inline-block"> </p> <p class="mt-2 text-xs text-gray-400"> </p></div></div>`),U_=W(`<div class="app-shell bg-gray-50 text-gray-900 dark:bg-gray-900 dark:text-gray-100"><!> <div class="flex overflow-hidden"><!> <main id="home-content-area" class="flex-1 overflow-y-auto"><!></main></div></div> <!> <!> <!> <!>`,1);function W_(e,t){Ge(t,!0);let n=F(!1),r=F(!1),i=F(!1),a=F(!1),o=F(null),s=F(!1),c=F(``),l=F(!1),u=F(`Living AI Documentation`),d=F(`YYYY_MM_DD_HH_mm_[Category]_title.md`),f=null;function p(){try{let e=localStorage.getItem(`ld-dark`);if(e!==null)return e===`true`}catch{}return window.matchMedia(`(prefers-color-scheme: dark)`).matches}function m(e){I(l,e,!0),document.documentElement.classList.toggle(`dark`,e)}function h(){m(!H(l));try{localStorage.setItem(`ld-dark`,String(H(l)))}catch{}}On(()=>{let e=document.getElementById(`hljs-dark`),t=document.getElementById(`hljs-light`);if(!e||!t)return;let n=Z.codeBlockLightTheme&&!H(l);e.disabled=n,t.disabled=!n,document.body.classList.toggle(`ld-code-light`,n)});function g(e){let t=e.trim();if(f&&clearTimeout(f),!t){Z.searchQuery=``,Z.searchResults=null;return}Z.searchQuery=t,Z.searchResults=Z.allDocs.filter(e=>e.title.toLowerCase().includes(t.toLowerCase())||e.category.toLowerCase().includes(t.toLowerCase())),f=window.setTimeout(async()=>{try{let e=await Lm(t);t===Z.searchQuery&&(Z.searchResults=e)}catch{}},350)}let _=F(L([]));function v(e){let t=H(_)[e];t&&(I(_,H(_).slice(0,e),!0),y(t.id,!1,`restore`))}async function y(e,t=!1,n=!1,r=null){if(n===!0&&Z.currentDocId&&Z.currentDocId!==e){let t=H(_).findIndex(t=>t.id===e);if(t!==-1)I(_,H(_).slice(0,t),!0);else{let e=Z.allDocs.find(e=>e.id===Z.currentDocId);I(_,[...H(_),{id:Z.currentDocId,title:e?e.title:Z.currentDocId}],!0)}}else n||I(_,[],!0);Z.currentDocId=e;let i=Z.allDocs.find(t=>t.id===e);if(i&&Z.revealDoc(i),!t){let t=new URL(location.href);t.searchParams.set(`doc`,e),t.hash=r?`#${r}`:``,history.pushState({docId:e,anchor:r||null},``,t)}I(s,!0),I(c,``);try{let t=await Nm(e);t.id=e,I(o,t,!0),document.title=t.title,requestAnimationFrame(()=>{let e=document.getElementById(`home-content-area`);if(r){let t=document.getElementById(r);t&&e&&(e.scrollTop+=t.getBoundingClientRect().top-e.getBoundingClientRect().top-80)}else e&&(e.scrollTop=0)})}catch(e){I(c,X(`doc.failed_to_load`)+(e instanceof Error?e.message:String(e)))}finally{I(s,!1)}}async function b(e){if(!H(o))return;let t=H(o).id,n=await fetch(`/api/documents/`+t,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({content:e})});if(!n.ok)throw Error(await n.text());let r=await Nm(t);r.id=t,I(o,r,!0);let i=e.match(/\]\(\s*\.?\/files\/[^)\s]+/g),a={...Z.fileAttachmentCounts};i&&i.length?a[t]=i.length:delete a[t],Z.fileAttachmentCounts=a}function x(e){let t=Z.allDocs.find(t=>t.id===e);if(!t)return null;let n=(t.folder||[]).join(`/`),r=e=>(e.folder||[]).join(`/`)===n,i=Z.hideCategories?Z.allDocs.filter(r).slice().sort((e,t)=>(e.filename||``).localeCompare(t.filename||``)):Z.allDocs.filter(e=>r(e)&&e.category===t.category),a=i.findIndex(t=>t.id===e);if(a===-1)return null;let o=i[a+1]??i[a-1];return o?o.id:null}async function S(){if(!H(o))return;let e=H(o).id;if(!(await fetch(`/api/documents/`+encodeURIComponent(e),{method:`DELETE`})).ok)return;let t=x(e);Z.allDocs=Z.allDocs.filter(t=>t.id!==e),Array.isArray(Z.searchResults)&&(Z.searchResults=Z.searchResults.filter(t=>t.id!==e));let n={...Z.annotationCounts};delete n[e],Z.annotationCounts=n;let r={...Z.fileAttachmentCounts};delete r[e],Z.fileAttachmentCounts=r,t?await y(t):(Z.currentDocId=null,I(o,null),history.pushState({},``,location.pathname))}async function C(){let[e,t]=await Promise.all([jm(),Am()]);if(Z.allDocs=e,t.docsFolder)try{Z.allFolderPaths=await Mm(t.docsFolder)}catch{Z.allFolderPaths=[]}let[n,r,i]=await Promise.all([Pm(),Fm(),Im()]);Z.annotationCounts=n,Z.fileAttachmentCounts=r,Z.docStatuses=i}Vi(async()=>{m(p());let e=await Am();await la(e.language||`en`),e.title&&(document.title=e.title,I(u,e.title,!0)),e.filenamePattern&&I(d,e.filenamePattern+`.md`),Z.exclusiveFolderExpansion=!!e.exclusiveFolderExpansion,Z.exclusiveCategoryExpansion=!!e.exclusiveCategoryExpansion,Z.codeBlockMaxHeight=typeof e.codeBlockMaxHeight==`number`?e.codeBlockMaxHeight:400,Z.imageRoundedCorners=!!e.imageRoundedCorners,Z.imageCentered=!!e.imageCentered,Z.imageBorder=!!e.imageBorder,Z.codeBlockLightTheme=!!e.codeBlockLightTheme,Z.codeBlockMaxHeight>0&&document.documentElement.style.setProperty(`--ld-code-max-h`,Z.codeBlockMaxHeight+`px`),Z.expandedCategories.size===0&&(Z.expandedCategories=new Set([`General`])),await C();let t=new URLSearchParams(location.search).get(`doc`);if(t)y(t,!0,!1,location.hash?location.hash.slice(1):null);else{let e=Z.allDocs.find(e=>e.category===`General`)??Z.allDocs[0];e&&y(e.id,!0)}let n=e=>{let t=e.state?.docId||new URLSearchParams(location.search).get(`doc`),n=e.state?.anchor||(location.hash.length>1?location.hash.slice(1):null);t&&y(t,!0,!1,n)};window.addEventListener(`popstate`,n);let r=()=>{C()};return window.addEventListener(`ld:documents-changed`,r),()=>{window.removeEventListener(`popstate`,n),window.removeEventListener(`ld:documents-changed`,r)}});var w=U_(),T=z(w),E=R(T);Ja(E,{get title(){return H(u)},subtitle:``,actions:e=>{var t=z_(),n=z(t),r=B(n,2),i=R(r,!0);N(r),V((e,t)=>{Y(n,`title`,e),Y(n,`aria-label`,t),K(i,H(l)?`☀`:`☾`)},[()=>X(`nav.word_cloud`),()=>X(`nav.word_cloud`)]),U(`click`,n,()=>I(a,!0)),U(`click`,r,h),G(e,t)},children:(e,t)=>{var n=B_(),r=R(n);Ei(r),Pe(2),N(n),V(e=>{Y(r,`placeholder`,e),Di(r,Z.searchQuery)},[()=>X(`nav.search_placeholder`)]),U(`input`,r,e=>g(e.target.value)),G(e,n)},$$slots:{actions:!0,default:!0}});var D=B(E,2),ee=R(D);lh(ee,{onopen:e=>y(e),onsearch:g,onexport:()=>I(i,!0),onnewfolder:()=>I(n,!0),onnewdoc:()=>I(r,!0)});var O=B(ee,2),k=R(O),A=e=>{var t=Ur(),n=z(t),r=e=>{var t=V_(),n=R(t,!0);N(t),V(()=>K(n,H(c))),G(e,t)},i=e=>{Gg(e,{get doc(){return H(o)},get navHistory(){return H(_)},ongoback:v,onopen:(e,t)=>y(e,!1,!0,t),onsave:b,ondelete:S})};q(n,e=>{H(c)?e(r):e(i,-1)}),G(e,t)},te=e=>{var t=H_(),n=R(t),r=B(R(n),2),i=R(r,!0);N(r);var a=B(r,2),o=R(a,!0);N(a);var s=B(a,2),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(n),N(t),V((e,t,n)=>{K(i,e),K(o,t),K(c,H(d)),K(u,n)},[()=>X(`welcome.title`),()=>X(`welcome.hint`),()=>X(`welcome.pattern_hint`)]),G(e,t)};q(k,e=>{H(o)?e(A):e(te,-1)}),N(O),N(D),N(T);var ne=B(T,2);n_(ne,{get open(){return H(n)},onclose:()=>I(n,!1),onsuccess:C});var re=B(ne,2);d_(re,{get open(){return H(r)},onclose:()=>I(r,!1),onsuccess:async e=>{await C(),y(e)}});var ie=B(re,2);y_(ie,{get open(){return H(i)},onclose:()=>I(i,!1)}),R_(B(ie,2),{get open(){return H(a)},onclose:()=>I(a,!1)}),G(e,w),Ke()}Nr([`click`,`input`]);var G_=`modulepreload`,K_=function(e){return`/`+e},q_={},J_=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,new URL(`../../../src/node/plugins/importAnalysisBuild.ts`,import.meta.url)).href}r=o(t.map(t=>{if(t=K_(t,n),t=s(t),t in q_)return;q_[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:G_,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},Y_=W(`<div class="flex flex-col h-screen overflow-hidden bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100"><header class="flex items-center gap-1 px-2 h-12 shrink-0 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-sm z-10"><button class="tool-btn !w-auto px-2 text-xs font-medium text-gray-500 dark:text-gray-400"> </button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSidebar" class="tool-btn">☰</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnCopyDiagramId" class="tool-btn"><svg width="15" height="15" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="5" width="8" height="9" rx="1.5"></rect><path d="M3 11V3a1 1 0 0 1 1-1h7"></path></svg></button> <button id="toolSelect" class="tool-btn tool-active"><svg width="11" height="13" viewBox="0 0 11 13" fill="currentColor" stroke="none"><path d="M1 1 L1 12 L4 9 L6.5 13 L8 12.2 L5.5 8.2 L10 8.2 Z"></path></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolBox" class="tool-btn"><svg width="15" height="10" viewBox="0 0 15 10" fill="none" stroke="currentColor" stroke-width="1.5"><rect x="1" y="1" width="13" height="8" rx="1"></rect></svg></button> <button id="toolEllipse" class="tool-btn"><svg width="16" height="10" viewBox="0 0 16 10" fill="none" stroke="currentColor" stroke-width="1.5"><ellipse cx="8" cy="5" rx="7" ry="4"></ellipse></svg></button> <button id="toolDatabase" class="tool-btn"><svg width="12" height="16" viewBox="0 0 12 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><ellipse cx="6" cy="3" rx="5" ry="2"></ellipse><path d="M1 3v10c0 1.1 2.2 2 5 2s5-.9 5-2V3"></path><path d="M11 7.5c0 1.1-2.2 2-5 2s-5-.9-5-2"></path></svg></button> <button id="toolCircle" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.5"><circle cx="6.5" cy="6.5" r="5.5"></circle></svg></button> <button id="toolActor" class="tool-btn"><svg width="12" height="17" viewBox="0 0 12 17" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><circle cx="6" cy="3" r="2.2"></circle><line x1="6" y1="5.2" x2="6" y2="10"></line><line x1="1.5" y1="7.5" x2="10.5" y2="7.5"></line><line x1="6" y1="10" x2="2.5" y2="15"></line><line x1="6" y1="10" x2="9.5" y2="15"></line></svg></button> <button id="toolPostIt" class="tool-btn"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4"><path d="M1 1 H9 L12 4 V12 H1 Z"></path><path d="M9 1 V4 H12" stroke-opacity="0.5"></path></svg></button> <button id="toolTextFree" class="tool-btn" style="font-size:11px; font-weight:600;">T</button> <button id="toolImage" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" rx="1.5"></rect><circle cx="4.5" cy="4.5" r="1.2"></circle><path d="M1 9.5 L4 6.5 L6.5 9 L9 7 L13 10.5"></path></svg></button> <a href="/shape-editor" class="tool-btn">✦</a> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="toolArrow" class="tool-btn">→</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDelete" class="tool-btn"><svg width="11" height="11" viewBox="0 0 11 11" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"><line x1="1" y1="1" x2="10" y2="10"></line><line x1="10" y1="1" x2="1" y2="10"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDiagramDefaults" class="tool-btn"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button> <button id="btnAlign" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4"><line x1="0.5" y1="7.5" x2="13.5" y2="7.5"></line><line x1="3.5" y1="0.5" x2="3.5" y2="13.5" stroke-dasharray="1.5 1.5"></line><line x1="10.5" y1="0.5" x2="10.5" y2="13.5" stroke-dasharray="1.5 1.5"></line></svg></button> <button id="btnGrid" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.2"><line x1="5" y1="1" x2="5" y2="13"></line><line x1="9" y1="1" x2="9" y2="13"></line><line x1="1" y1="5" x2="13" y2="5"></line><line x1="1" y1="9" x2="13" y2="9"></line><rect x="1" y="1" width="12" height="12" rx="1"></rect></svg></button> <button id="btnEdgeStraight" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"><line x1="2" y1="12" x2="12" y2="2"></line><polyline points="8,2 12,2 12,6"></polyline></svg></button> <button id="btnEvidenceMode" class="tool-btn"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M4 1.5 H8.5 L11 4 V12.5 H4 Z"></path><path d="M8.5 1.5 V4 H11"></path><path d="M1.5 5.5 H6.5"></path><path d="M1.5 8 H6.5"></path><path d="M1.5 10.5 H5"></path></svg></button> <button id="btnResizeMode" class="tool-btn active-tool"><svg id="icon-resize-corner" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="7,10 10,10 10,7"></polyline></svg> <svg id="icon-resize-center" width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="hidden"><rect x="1" y="1" width="12" height="12" stroke-dasharray="2.5 2"></rect><line x1="4" y1="4" x2="10" y2="10"></line><polyline points="4,6.5 4,4 6.5,4"></polyline><polyline points="10,7.5 10,10 7.5,10"></polyline><line x1="10" y1="4" x2="4" y2="10"></line><polyline points="7.5,4 10,4 10,6.5"></polyline><polyline points="4,7.5 4,10 6.5,10"></polyline></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <input id="diagramTitle" type="text" class="flex-1 min-w-0 px-2 py-1 text-sm bg-transparent border-0 focus:outline-none focus:ring-1 focus:ring-blue-500 rounded text-gray-700 dark:text-gray-300 placeholder:text-gray-400"/> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnZoomOut" class="tool-btn">−</button> <span id="zoomLevel" class="text-xs text-gray-500 dark:text-gray-400 w-10 text-center tabular-nums select-none">100%</span> <button id="btnZoomIn" class="tool-btn">+</button> <button id="btnZoomReset" class="tool-btn">⊡</button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDark" class="tool-btn"><span id="darkIcon">☽</span></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnDebug" class="hidden tool-btn text-xs font-mono">dbg</button> <div id="sepDebug" class="hidden w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnExportDrawio" class="tool-btn"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg></button> <div class="w-px h-6 bg-gray-200 dark:bg-gray-700 mx-0.5"></div> <button id="btnSave" disabled="" class="px-3 py-1.5 text-xs font-semibold rounded-lg bg-blue-600 hover:bg-blue-700 text-white disabled:opacity-40 disabled:cursor-not-allowed shrink-0 transition-colors"><span> </span></button></header> <div class="flex flex-1 overflow-hidden"><div id="sidebar" class="w-56 shrink-0 border-r border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 flex flex-col overflow-hidden" style="transition: width 0.2s ease"><div class="flex items-center justify-between px-3 py-2 border-b border-gray-200 dark:border-gray-700 shrink-0"><span class="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider"> </span> <button id="btnNewDiagram" class="text-xs font-medium text-blue-600 dark:text-blue-400 hover:text-blue-700 dark:hover:text-blue-300 transition-colors"> </button></div> <div id="diagramList" class="flex-1 overflow-y-auto py-1"></div></div> <div role="separator" aria-orientation="vertical"></div> <div class="relative flex-1 overflow-hidden bg-gray-50 dark:bg-gray-950"><div id="vis-canvas" class="w-full h-full"></div> <div id="customShapeBar" class="hidden"><div id="customShapeBarBody"></div></div> <div id="debugLayer"></div> <div id="evidenceLayer" class="hidden"></div> <div id="stampOverlay" style="position:absolute;inset:0;display:none;z-index:11;cursor:crosshair;"></div> <div id="selectionOverlay"><div id="rh-tl" class="resize-handle" style="top: -5px; left: -5px; cursor: nw-resize"></div> <div id="rh-tr" class="resize-handle" style="top: -5px; right: -5px; cursor: ne-resize"></div> <div id="rh-bl" class="resize-handle" style="bottom: -5px; left: -5px; cursor: sw-resize"></div> <div id="rh-br" class="resize-handle" style="bottom: -5px; right: -5px; cursor: se-resize"></div> <div id="rh-rotate">↻</div> <div id="rh-label-rotate" style="left: 0; top: -28px;"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><g transform="rotate(25,5,5)"><line x1="2.5" y1="3" x2="7.5" y2="3"></line><line x1="5" y1="3" x2="5" y2="8"></line></g></svg></div></div> <aside id="evidencePanel" class="hidden absolute top-0 right-0 bottom-0 w-80 max-w-[85vw] z-30 bg-gray-50 dark:bg-gray-900 border-l border-gray-200 dark:border-gray-700 shadow-xl flex flex-col"><div class="flex items-center justify-between gap-2 px-4 py-3 border-b border-gray-200 dark:border-gray-700"><h2 id="evidencePanelTitle" class="text-sm font-semibold text-gray-800 dark:text-gray-100"> </h2> <button id="btnEvidenceClose" class="tool-btn !w-7 !h-7">×</button></div> <div id="evidencePanelBody" class="flex-1 overflow-y-auto p-3 space-y-3"></div></aside> <div id="nodePanel" class="float-panel hidden"><button id="btnNodeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="nodePanelControls" class="contents"><button id="nodeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#f5f5f4;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <input id="nodeBgOpacity" type="range" min="0" max="100" step="5" value="100" class="w-16 h-1 accent-orange-500 cursor-pointer"/> <div class="panel-sep"></div> <button id="btnNodeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnNodeLink" class="tool-btn !w-6 !h-6"><svg width="13" height="13" viewBox="0 0 13 13" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M5 7.5a3.5 3.5 0 0 0 5 0l1.5-1.5a3.5 3.5 0 0 0-5-5L5 2.5"></path><path d="M8 5.5a3.5 3.5 0 0 0-5 0L1.5 7a3.5 3.5 0 0 0 5 5L8 10.5"></path></svg></button> <div class="panel-sep"></div> <button id="btnNodeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="nodeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">13</span> <button id="btnNodeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnAlignLeft" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="1" y1="5" x2="7" y2="5"></line><line x1="1" y1="8" x2="9" y2="8"></line></svg></button> <button id="btnAlignCenter" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="2.5" y1="5" x2="9.5" y2="5"></line><line x1="1.5" y1="8" x2="10.5" y2="8"></line></svg></button> <button id="btnAlignRight" class="tool-btn !w-6 !h-6"><svg width="12" height="10" viewBox="0 0 12 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><line x1="1" y1="2" x2="11" y2="2"></line><line x1="5" y1="5" x2="11" y2="5"></line><line x1="3" y1="8" x2="11" y2="8"></line></svg></button> <div class="panel-sep"></div> <button id="btnValignTop" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="1.5" x2="9" y2="1.5" stroke-width="2"></line><line x1="1" y1="5" x2="8" y2="5" stroke-width="1.3"></line><line x1="1" y1="8.5" x2="6" y2="8.5" stroke-width="1.3"></line></svg></button> <button id="btnValignMiddle" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="2.5" x2="8" y2="2.5" stroke-width="1.3"></line><line x1="1" y1="6" x2="9" y2="6" stroke-width="2"></line><line x1="1" y1="9.5" x2="6" y2="9.5" stroke-width="1.3"></line></svg></button> <button id="btnValignBottom" class="tool-btn !w-6 !h-6"><svg width="10" height="12" viewBox="0 0 10 12" fill="none" stroke="currentColor" stroke-linecap="round"><line x1="1" y1="3.5" x2="8" y2="3.5" stroke-width="1.3"></line><line x1="1" y1="7" x2="6" y2="7" stroke-width="1.3"></line><line x1="1" y1="10.5" x2="9" y2="10.5" stroke-width="2"></line></svg></button> <div class="panel-sep"></div> <div id="customShapeLabelPlacementControls" class="hidden"><button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="above">T↑</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="below">T↓</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="left">←T</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="right">T→</button> <button class="tool-btn !w-7 !h-6 font-mono text-[10px]" data-label-placement="center">T□</button> <div class="panel-sep"></div></div> <button id="btnZOrderBack" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1"></rect><rect x="5" y="1" width="8" height="8" rx="1" stroke-opacity="0.35"></rect></svg></button> <button id="btnZOrderFront" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="5" width="8" height="8" rx="1" stroke-opacity="0.35"></rect><rect x="5" y="1" width="8" height="8" rx="1"></rect></svg></button> <div class="panel-sep"></div> <button id="btnStampColor" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><path d="M7 2 C7 2 3 6.5 3 9 a4 4 0 0 0 8 0 C11 6.5 7 2 7 2 Z" fill="currentColor" fill-opacity="0.25"></path></svg></button> <button id="btnStampFontSize" class="tool-btn !w-7 !h-6 font-mono text-xs font-bold">Aa</button> <button id="btnStampSize" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 14 14" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="6" height="6" rx="0.8" fill="currentColor" fill-opacity="0.25"></rect><path d="M10 2 L12 2 L12 4"></path><path d="M12 2 L9 5"></path><path d="M10 12 L12 12 L12 10"></path><path d="M12 12 L9 9"></path></svg></button> <div class="panel-sep"></div> <button id="btnRotateCCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↺</button> <button id="btnRotateCW" class="tool-btn !w-7 !h-6" style="font-size:15px; line-height:1;">↻</button> <div class="panel-sep"></div> <button id="btnCopyPng" class="tool-btn !h-6 px-1.5 font-mono text-xs font-semibold flex items-center gap-0.5"><svg width="10" height="10" viewBox="0 0 10 10" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"><line x1="5" y1="7" x2="5" y2="1"></line><polyline points="2,4 5,1 8,4"></polyline><line x1="1" y1="9" x2="9" y2="9"></line></svg> PNG</button> <div class="panel-sep"></div> <button id="btnGroup" class="tool-btn !w-8 !h-7"><svg width="22" height="14" viewBox="0 0 22 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="20.6" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="4" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="15" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <button id="btnUngroup" class="tool-btn !w-8 !h-7"><svg width="26" height="14" viewBox="0 0 26 14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"><rect x="0.7" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="3" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect><rect x="16.3" y="1" width="9" height="12" rx="2" stroke-dasharray="2.5,1.5"></rect><rect x="19" y="4.5" width="3" height="5" rx="1" fill="currentColor"></rect></svg></button> <div class="panel-sep"></div> <button id="btnSaveShapeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <div id="linkPanel" class="float-panel hidden" style="min-width:260px; flex-direction:column; align-items:stretch; gap:0.5rem; padding:0.75rem;"><div class="text-xs font-semibold text-gray-500 dark:text-gray-400 mb-1"> </div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeUrl" value="url" class="accent-orange-500"/> <span> </span></label> <div id="linkUrlRow"><input id="linkUrlInput" type="url" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeDiagram" value="diagram" class="accent-orange-500"/> <span> </span></label> <div id="linkDiagramRow" class="hidden"><select id="linkDiagramSelect" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"></select></div> <label class="flex items-center gap-2 text-xs cursor-pointer"><input type="radio" name="linkType" id="linkTypeNew" value="new" class="accent-orange-500"/> <span> </span></label> <div id="linkNewRow" class="hidden"><input id="linkNewName" type="text" class="w-full text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-1 focus:ring-orange-400"/></div> <div class="flex gap-1 mt-1"><button id="btnLinkSave" class="flex-1 text-xs bg-orange-500 hover:bg-orange-600 text-white rounded px-2 py-1"> </button> <button id="btnLinkRemove" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-red-50 dark:hover:bg-red-900/20 hover:text-red-600"> </button> <button id="btnLinkCancel" class="text-xs border border-gray-300 dark:border-gray-600 rounded px-2 py-1 hover:bg-gray-100 dark:hover:bg-gray-700">✕</button></div></div> <div id="edgePanel" class="float-panel hidden"><button id="btnEdgeLock" class="tool-btn !w-6 !h-6 text-sm">🔒</button> <div class="panel-sep"></div> <div id="edgePanelControls" class="contents"><button id="edgeBtnNone" class="tool-btn !w-7 !h-6 font-mono text-xs">—</button> <button id="edgeBtnFrom" class="tool-btn !w-7 !h-6 text-xs">←</button> <button id="edgeBtnTo" class="tool-btn !w-7 !h-6 text-xs">→</button> <button id="edgeBtnBoth" class="tool-btn !w-8 !h-6 text-xs">←→</button> <div class="panel-sep"></div> <button id="edgeBtnSolid" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round"></line></svg></button> <button id="edgeBtnDashed" class="tool-btn !w-8 !h-6"><svg width="22" height="4" viewBox="0 0 22 4"><line x1="1" y1="2" x2="21" y2="2" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-dasharray="4,3"></line></svg></button> <div class="panel-sep"></div> <button id="btnEdgeFontDecrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa−</button> <span id="edgeFontSizeValue" class="inline-flex items-center justify-center min-w-[2.25rem] h-6 px-1 text-[11px] font-mono text-gray-700 dark:text-gray-200 border border-gray-300 dark:border-gray-600 rounded bg-white/80 dark:bg-gray-800/80">11</span> <button id="btnEdgeFontIncrease" class="tool-btn !w-8 !h-6" style="font-size: 10px">Aa+</button> <div class="panel-sep"></div> <button id="btnEdgeLabelEdit" class="tool-btn !w-6 !h-6">✎</button> <button id="btnEdgeLabelWidthReset" class="tool-btn !w-6 !h-6 text-xs">↔</button> <div class="panel-sep"></div> <button id="btnEdgeLabelRotateCCW" class="tool-btn !w-7 !h-6 text-sm">↺</button> <button id="btnEdgeLabelRotateCW" class="tool-btn !w-7 !h-6 text-sm">↻</button> <div class="panel-sep"></div> <button id="btnEdgeLabelOffsetLeft" class="tool-btn !w-6 !h-6 text-sm">←</button> <button id="btnEdgeLabelOffsetRight" class="tool-btn !w-6 !h-6 text-sm">→</button> <button id="btnEdgeLabelOffsetUp" class="tool-btn !w-6 !h-6 text-sm">↑</button> <button id="btnEdgeLabelOffsetDown" class="tool-btn !w-6 !h-6 text-sm">↓</button> <button id="btnEdgeLabelOffsetReset" class="tool-btn !w-6 !h-6 text-xs">⊙</button> <div class="panel-sep"></div> <button id="btnEdgeWidthDecrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W−</button> <button id="btnEdgeWidthIncrease" class="tool-btn !w-7 !h-6" style="font-size:10px">W+</button> <div class="panel-sep"></div> <button id="edgeColorSwatch" style="width:1.5rem;height:1.5rem;border-radius:0.25rem;border:2px solid #a8a29e;background:#a8a29e;cursor:pointer;flex-shrink:0;"></button> <div class="panel-sep"></div> <button id="btnEdgeClearPorts" class="tool-btn !w-8 !h-6 text-xs">⊗</button> <div class="panel-sep"></div> <button id="btnSaveEdgeDefault" class="tool-btn !w-7 !h-6"><svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492M5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0"></path><path d="M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.474l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115z"></path></svg></button></div></div> <textarea id="labelInput" class="hidden" rows="1"></textarea> <div id="emptyState" class="absolute inset-0 flex flex-col items-center justify-center text-gray-400 dark:text-gray-600 pointer-events-none select-none"><svg width="52" height="44" viewBox="0 0 52 44" fill="none" stroke="currentColor" stroke-width="1.5" class="mb-3 opacity-50"><rect x="2" y="4" width="18" height="12" rx="2"></rect><rect x="32" y="28" width="18" height="12" rx="2"></rect><line x1="20" y1="10" x2="32" y2="34" stroke-dasharray="4,3"></line><rect x="17" y="16" width="18" height="12" rx="2"></rect><line x1="26" y1="16" x2="26" y2="10" stroke-dasharray="4,3"></line></svg> <p class="text-sm"> </p></div></div></div> <div id="toastContainer"></div> <div id="imageNameModal" style="display:none;position:fixed;inset:0;z-index:1000;background:rgba(0,0,0,0.5);" class="flex items-center justify-center"><div class="bg-white dark:bg-gray-800 rounded-xl shadow-2xl p-6 w-80 flex flex-col gap-3"><p class="text-sm font-semibold text-gray-700 dark:text-gray-200"> </p> <p class="text-xs text-gray-400 dark:text-gray-500">Lettres, chiffres, <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">_</code> et <code class="bg-gray-100 dark:bg-gray-700 px-0.5 rounded">-</code> uniquement.
|
|
151
151
|
Laisser vide pour un nom automatique.</p> <div class="flex items-center gap-1"><input id="imageNameInput" type="text" autocomplete="off" spellcheck="false" class="flex-1 rounded border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-700
|
|
152
152
|
text-gray-900 dark:text-gray-100 text-sm px-2 py-1 outline-none focus:ring-2 focus:ring-blue-400"/> <span class="text-xs text-gray-400 dark:text-gray-500 whitespace-nowrap">.png</span></div> <p id="imageNameError" class="text-xs text-red-500 hidden"> </p> <div class="flex gap-2 justify-end"><button id="imageNameCancel" class="px-3 py-1 text-xs rounded border border-gray-300 dark:border-gray-600
|
|
153
|
-
text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"> </button> <button id="imageNameConfirm" class="px-3 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600"> </button></div></div></div></div>`);function q_(e,t){Ge(t,!0),Vi(()=>{let e;return(async()=>{let t=`en`;try{t=(await fetch(`/api/config`).then(e=>e.json())).language||`en`}catch{}await la(t);let{initDiagram:r}=await G_(async()=>{let{initDiagram:e}=await import(`./main-OYlepKtL.js`);return{initDiagram:e}},[]);e=r();let i=document.getElementById(`sidebar`),a=parseInt(localStorage.getItem(n)||``,10);i&&Number.isFinite(a)&&(i.style.width=a+`px`)})(),()=>e?.()});let n=`ld-diagram-sidebar-w`,r=F(!1);function i(e){e.preventDefault();let t=document.getElementById(`sidebar`);if(!t)return;let i=e.clientX,a=t.getBoundingClientRect().width;I(r,!0),t.style.transition=`none`,document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`;let o=e=>{let n=Math.max(160,Math.min(480,a+e.clientX-i));t.style.width=n+`px`},s=()=>{document.removeEventListener(`mousemove`,o),document.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``,I(r,!1),t.style.transition=``;try{localStorage.setItem(n,String(parseInt(t.style.width,10)))}catch{}};document.addEventListener(`mousemove`,o),document.addEventListener(`mouseup`,s)}var a=K_(),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,4),u=B(l,4),d=B(u,2),f=B(d,4),p=B(f,2),m=B(p,2),h=B(m,2),g=B(h,2),_=B(g,2),v=B(_,2),y=B(v,2),b=B(y,2),x=B(b,4),S=B(x,4),C=B(S,4),w=B(C,2),T=B(w,2),E=B(T,2),D=B(E,2),ee=B(D,2),O=B(ee,4),k=B(O,4),A=B(k,4),te=B(A,2),ne=B(te,8),re=B(ne,4),ie=B(re,4),ae=R(ie),oe=R(ae,!0);N(ae),N(ie),N(o);var se=B(o,2),ce=R(se),le=R(ce),ue=R(le),de=R(ue,!0);N(ue);var fe=B(ue,2),pe=R(fe,!0);N(fe),N(le),Pe(2),N(ce);var me=B(ce,2),he=B(me,2),ge=B(R(he),10),_e=B(R(ge),8),ve=B(_e,2);N(ge);var ye=B(ge,2),be=R(ye),xe=R(be),Se=R(xe,!0);N(xe);var j=B(xe,2);N(be),Pe(2),N(ye);var Ce=B(ye,2),M=R(Ce),we=B(M,4),Te=R(we),Ee=B(Te,4),De=B(Ee,4),Oe=B(De,2),ke=B(Oe,4),Ae=B(ke,2),je=B(Ae,2),Me=B(je,4),Ne=B(Me,2),Fe=B(Ne,2),Ie=B(Fe,4),Le=B(Ie,2),Re=B(Le,2),ze=B(Re,4),Be=R(ze),Ve=B(Be,2),He=B(Ve,2),Ue=B(He,2),We=B(Ue,2);Pe(2),N(ze);var qe=B(ze,2),Je=B(qe,2),Ye=B(Je,4),Xe=B(Ye,2),Ze=B(Xe,2),Qe=B(Ze,4),$e=B(Qe,2),et=B($e,4),tt=B(et,4),nt=B(tt,2),rt=B(nt,4);N(we),N(Ce);var it=B(Ce,2),at=R(it),ot=R(at,!0);N(at);var st=B(at,2),ct=B(R(st),2),lt=R(ct,!0);N(ct),N(st);var ut=B(st,2),dt=R(ut);N(ut);var ft=B(ut,2),pt=B(R(ft),2),mt=R(pt,!0);N(pt),N(ft);var ht=B(ft,4),gt=B(R(ht),2),_t=R(gt,!0);N(gt),N(ht);var vt=B(ht,2),P=R(vt);N(vt);var yt=B(vt,2),bt=R(yt),xt=R(bt,!0);N(bt);var St=B(bt,2),Ct=R(St,!0);N(St),Pe(2),N(yt),N(it);var wt=B(it,2),Tt=R(wt),Et=B(Tt,4),Dt=R(Et),Ot=B(Dt,2),kt=B(Ot,2),At=B(kt,2),jt=B(At,4),Mt=B(jt,2),Nt=B(Mt,4),Pt=B(Nt,2),Ft=B(Pt,2),It=B(Ft,4),Lt=B(It,2),Rt=B(Lt,4),zt=B(Rt,2),Bt=B(zt,4),Vt=B(Bt,2),Ht=B(Vt,2),Ut=B(Ht,2),Wt=B(Ut,2),Gt=B(Wt,4),Kt=B(Gt,2),qt=B(Kt,4),Jt=B(qt,4),Yt=B(Jt,4);N(Et),N(wt);var Xt=B(wt,2),Zt=B(Xt,2),Qt=B(R(Zt),2),$t=R(Qt,!0);N(Qt),N(Zt),N(he),N(se);var en=B(se,4),tn=R(en),L=R(tn),nn=R(L,!0);N(L);var rn=B(L,4),an=R(rn);Pe(2),N(rn);var on=B(rn,2),sn=R(on,!0);N(on);var cn=B(on,2),ln=R(cn),un=R(ln,!0);N(ln);var dn=B(ln,2),fn=R(dn,!0);N(dn),N(cn),N(tn),N(en),N(a),V((e,t,n,i,a,o,s,ie,ae,se,ce,le,ue,fe,he,ge,ye,be,xe,Ce,we,N,Pe,ze,Ge,Ke,it,at,st,ct,ut,ft,pt,ht,gt,vt,yt,bt,St,wt,Et,F,Zt,I,Qt,en,tn,L,rn,on,cn,ln,dn,R,z,B,pn,mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn,On,kn,An,jn,Mn,Nn,Pn,V,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn,qn,Jn,Yn,Xn,Zn,Qn,$n,er,tr,nr,rr,ir)=>{K(c,e),Y(l,`title`,t),Y(u,`title`,n),Y(d,`title`,i),Y(f,`title`,a),Y(p,`title`,o),Y(m,`title`,s),Y(h,`title`,ie),Y(g,`title`,ae),Y(_,`title`,se),Y(v,`title`,ce),Y(y,`title`,le),Y(b,`title`,ue),Y(x,`title`,fe),Y(S,`title`,he),Y(C,`title`,ge),Y(w,`title`,ye),Y(T,`title`,be),Y(E,`title`,xe),Y(D,`title`,Ce),Y(ee,`title`,we),Y(O,`placeholder`,N),Y(k,`title`,Pe),Y(A,`title`,ze),Y(te,`title`,Ge),Y(ne,`title`,Ke),Y(re,`title`,it),K(oe,at),K(de,st),K(pe,ct),hi(me,1,`w-1 shrink-0 cursor-col-resize select-none transition-colors ${H(r)?`bg-blue-500/60`:`bg-transparent hover:bg-blue-500/40`}`),Y(_e,`title`,ut),Y(ve,`title`,ft),K(Se,pt),Y(j,`title`,ht),Y(M,`title`,gt),Y(Te,`title`,vt),Y(Ee,`title`,yt),Y(De,`title`,bt),Y(Oe,`title`,St),Y(ke,`title`,wt),Y(Ae,`title`,Et),Y(je,`title`,F),Y(Me,`title`,Zt),Y(Ne,`title`,I),Y(Fe,`title`,Qt),Y(Ie,`title`,en),Y(Le,`title`,tn),Y(Re,`title`,L),Y(Be,`title`,rn),Y(Ve,`title`,on),Y(He,`title`,cn),Y(Ue,`title`,ln),Y(We,`title`,dn),Y(qe,`title`,R),Y(Je,`title`,z),Y(Ye,`title`,B),Y(Xe,`title`,pn),Y(Ze,`title`,mn),Y(Qe,`title`,hn),Y($e,`title`,gn),Y(et,`title`,_n),Y(tt,`title`,vn),Y(nt,`title`,yn),Y(rt,`title`,bn),K(ot,xn),K(lt,Sn),Y(dt,`placeholder`,Cn),K(mt,wn),K(_t,Tn),Y(P,`placeholder`,En),K(xt,Dn),K(Ct,On),Y(Tt,`title`,kn),Y(Dt,`title`,An),Y(Ot,`title`,jn),Y(kt,`title`,Mn),Y(At,`title`,Nn),Y(jt,`title`,Pn),Y(Mt,`title`,V),Y(Nt,`title`,Fn),Y(Pt,`title`,In),Y(Ft,`title`,Ln),Y(It,`title`,Rn),Y(Lt,`title`,zn),Y(Rt,`title`,Bn),Y(zt,`title`,Vn),Y(Bt,`title`,Hn),Y(Vt,`title`,Un),Y(Ht,`title`,Wn),Y(Ut,`title`,Gn),Y(Wt,`title`,Kn),Y(Gt,`title`,qn),Y(Kt,`title`,Jn),Y(qt,`title`,Yn),Y(Jt,`title`,Xn),Y(Yt,`title`,Zn),Y(Xt,`placeholder`,Qn),K($t,$n),K(nn,er),Y(an,`placeholder`,tr),K(sn,nr),K(un,rr),K(fn,ir)},[()=>X(`diagram.back_btn`),()=>X(`diagram.diagrams_list_title`),()=>X(`diagram.toolbar.copy_mcp_id`),()=>X(`diagram.toolbar.select`),()=>X(`diagram.toolbar.box`),()=>X(`diagram.toolbar.ellipse`),()=>X(`diagram.toolbar.database`),()=>X(`diagram.toolbar.circle`),()=>X(`diagram.toolbar.actor`),()=>X(`diagram.toolbar.postit`),()=>X(`diagram.toolbar.text_free`),()=>X(`diagram.toolbar.image`),()=>X(`diagram.toolbar.shape_editor`),()=>X(`diagram.toolbar.arrow`),()=>X(`diagram.toolbar.delete`),()=>X(`diagram.toolbar.defaults`),()=>X(`diagram.toolbar.align_guides`),()=>X(`diagram.toolbar.grid`),()=>X(`diagram.toolbar.edge_style`),()=>X(`diagram.toolbar.evidence_mode`),()=>X(`diagram.toolbar.resize_corner`),()=>X(`diagram.toolbar.title_placeholder`),()=>X(`diagram.toolbar.zoom_out`),()=>X(`diagram.toolbar.zoom_in`),()=>X(`diagram.toolbar.fit`),()=>X(`diagram.toolbar.debug`),()=>X(`diagram.toolbar.export_drawio`),()=>X(`diagram.toolbar.save`),()=>X(`diagram.sidebar.title`),()=>X(`diagram.sidebar.new_btn`),()=>X(`diagram.selection.rotate_shape`),()=>X(`diagram.selection.rotate_text`),()=>X(`diagram.evidence.panel_title`),()=>X(`diagram.evidence.close`),()=>X(`diagram.node_panel.lock`),()=>X(`diagram.node_panel.color`),()=>X(`diagram.node_panel.bg_opacity`),()=>X(`diagram.node_panel.edit_label`),()=>X(`diagram.node_panel.edit_link`),()=>X(`diagram.node_panel.font_decrease`),()=>X(`diagram.node_panel.font_size_value`),()=>X(`diagram.node_panel.font_increase`),()=>X(`diagram.node_panel.align_left`),()=>X(`diagram.node_panel.align_center`),()=>X(`diagram.node_panel.align_right`),()=>X(`diagram.node_panel.align_top`),()=>X(`diagram.node_panel.align_middle`),()=>X(`diagram.node_panel.align_bottom`),()=>X(`diagram.node_panel.custom_label_above`),()=>X(`diagram.node_panel.custom_label_below`),()=>X(`diagram.node_panel.custom_label_left`),()=>X(`diagram.node_panel.custom_label_right`),()=>X(`diagram.node_panel.custom_label_center`),()=>X(`diagram.node_panel.send_back`),()=>X(`diagram.node_panel.bring_front`),()=>X(`diagram.node_panel.stamp_color`),()=>X(`diagram.node_panel.stamp_font`),()=>X(`diagram.node_panel.stamp_size`),()=>X(`diagram.node_panel.rotate_ccw`),()=>X(`diagram.node_panel.rotate_cw`),()=>X(`diagram.node_panel.copy_png`),()=>X(`diagram.node_panel.group`),()=>X(`diagram.node_panel.ungroup`),()=>X(`diagram.node_panel.save_as_default`),()=>X(`diagram.link_panel.title`),()=>X(`diagram.link_panel.external`),()=>X(`diagram.link_panel.url_placeholder`),()=>X(`diagram.link_panel.existing_diagram`),()=>X(`diagram.link_panel.new_diagram`),()=>X(`diagram.link_panel.diagram_name_placeholder`),()=>X(`diagram.link_panel.save_btn`),()=>X(`diagram.link_panel.remove_btn`),()=>X(`diagram.edge_panel.lock`),()=>X(`diagram.edge_panel.no_arrow`),()=>X(`diagram.edge_panel.arrow_from`),()=>X(`diagram.edge_panel.arrow_to`),()=>X(`diagram.edge_panel.arrow_both`),()=>X(`diagram.edge_panel.solid`),()=>X(`diagram.edge_panel.dashed`),()=>X(`diagram.edge_panel.font_decrease`),()=>X(`diagram.edge_panel.font_size_value`),()=>X(`diagram.edge_panel.font_increase`),()=>X(`diagram.edge_panel.edit_label`),()=>X(`diagram.edge_panel.reset_label_width`),()=>X(`diagram.edge_panel.rotate_label_ccw`),()=>X(`diagram.edge_panel.rotate_label_cw`),()=>X(`diagram.edge_panel.offset_label_left`),()=>X(`diagram.edge_panel.offset_label_right`),()=>X(`diagram.edge_panel.offset_label_up`),()=>X(`diagram.edge_panel.offset_label_down`),()=>X(`diagram.edge_panel.offset_label_reset`),()=>X(`diagram.edge_panel.width_decrease`),()=>X(`diagram.edge_panel.width_increase`),()=>X(`diagram.edge_panel.color`),()=>X(`diagram.edge_panel.clear_ports`),()=>X(`diagram.edge_panel.save_as_default`),()=>X(`diagram.label_input.placeholder`),()=>X(`diagram.empty_state`),()=>X(`diagram.image_modal.title`),()=>X(`diagram.image_modal.placeholder`),()=>X(`diagram.image_modal.error_chars`),()=>X(`diagram.image_modal.cancel_btn`),()=>X(`diagram.image_modal.paste_btn`)]),U(`click`,s,()=>history.back()),U(`mousedown`,me,i),G(e,a),Ke()}Nr([`click`,`mousedown`]),He();var J_={network:null,nodes:null,edges:null,diagrams:[],currentDiagramId:null,currentTool:`select`,pendingShape:`box`,selectedNodeIds:[],selectedEdgeIds:[],alignGuides:!0,gridEnabled:!0,debugMode:!1,isDirty:!1,sidebarOpen:!0,editingNodeId:null,editingEdgeId:null,resizeDrag:null,rotateDrag:null,labelRotateDrag:null,activeStamp:null,stampTargetIds:[],clipboard:null,canonicalOrder:[],edgesStraight:!1,resizeSymmetric:!1,nodeColorOverrides:{},customShapeLibraries:[],customShapeDefs:new Map,edgeLabelCanvasPos:{},edgeLabelBBox:{},freeArrowFirstPoint:null,exportingPng:!1,evidenceMode:!1};function Y_(){J_.isDirty=!0,document.getElementById(`btnSave`).disabled=!1}var X_=`custom-shape`,Z_=`custom-shape:`,Q_=[{id:`N`,x:.5,y:0},{id:`NE`,x:1,y:0},{id:`E`,x:1,y:.5},{id:`SE`,x:1,y:1},{id:`S`,x:.5,y:1},{id:`SW`,x:0,y:1},{id:`W`,x:0,y:.5},{id:`NW`,x:0,y:0}];function $_(e){return typeof e==`string`&&e.startsWith(`custom-shape:`)}function ev(e){return $_(e)?e.slice(13):null}function tv(e){return e&&J_.customShapeDefs&&J_.customShapeDefs.get(e)||null}function nv(e){let t=tv(e);return[t&&t.width||65,t&&t.height||65]}function rv(e){let t=tv(e);return t&&Array.isArray(t.anchors)&&t.anchors.length?t.anchors:Q_}function iv(e){let t=tv(e);return t&&[`center`,`below`,`above`,`right`,`left`].includes(t.labelPlacement)?t.labelPlacement:`below`}async function av(){try{let e=await fetch(`/api/shape-libraries`);if(!e.ok)throw Error(`shape libraries unavailable`);let t=await e.json(),n=Array.isArray(t.libraries)?t.libraries:[];J_.customShapeLibraries=n,J_.customShapeDefs=new Map,n.forEach(e=>{(e.shapes||[]).forEach(e=>J_.customShapeDefs.set(e.id,e))})}catch{J_.customShapeLibraries=[],J_.customShapeDefs=new Map}}function ov(){let e=document.getElementById(`customShapeBar`),t=document.getElementById(`customShapeBarBody`);if(!e||!t)return;t.innerHTML=``;let n=(J_.customShapeLibraries||[]).flatMap(e=>(e.shapes||[]).filter(e=>e.showInDiagram!==!1).map(t=>({...t,libraryName:e.name})));e.classList.toggle(`hidden`,n.length===0),n.forEach(e=>{let n=document.createElement(`button`);n.type=`button`,n.className=`custom-shape-btn`,n.title=`${e.libraryName||``}${e.libraryName?` · `:``}${e.name}`,n.dataset.customShapeId=e.id;let r=document.createElement(`img`);r.src=e.imageSrc,r.alt=``,r.draggable=!1,n.appendChild(r),n.addEventListener(`click`,()=>{window.dispatchEvent(new CustomEvent(`diagram:setTool`,{detail:{tool:`addNode`,shape:`${Z_}${e.id}`}}))}),t.appendChild(n)})}function sv(){let e={saveState:document.getElementById(`saveState`),librarySelect:document.getElementById(`librarySelect`),libraryName:document.getElementById(`libraryName`),shapeList:document.getElementById(`shapeList`),previewStage:document.getElementById(`previewStage`),previewImage:document.getElementById(`previewImage`),shapeName:document.getElementById(`shapeName`),imageFile:document.getElementById(`imageFile`),shapeWidth:document.getElementById(`shapeWidth`),shapeHeight:document.getElementById(`shapeHeight`),labelPlacement:document.getElementById(`labelPlacement`),shapeShowInDiagram:document.getElementById(`shapeShowInDiagram`),anchorList:document.getElementById(`anchorList`),anchorCount:document.getElementById(`anchorCount`)},t={libraries:[]},n=null,r=null,i=null,a=null,o=e=>`${e}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,s=()=>t.libraries.find(e=>e.id===n)||null,c=()=>s()?.shapes.find(e=>e.id===r)||null,l=e=>Math.max(0,Math.min(1,e)),u=e=>[`below`,`above`,`right`,`left`,`center`].includes(e)?e:`below`,d=e=>String(e??``).replace(/[&<>"']/g,e=>({"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`})[e]);function f(t){e.saveState.textContent=t,t&&setTimeout(()=>{e.saveState.textContent===t&&(e.saveState.textContent=``)},1800)}async function p(){t=await(await fetch(`/api/shape-libraries`)).json(),Array.isArray(t.libraries)||(t.libraries=[]),t.libraries.length||t.libraries.push({id:o(`lib`),name:`My shapes`,shapes:[]}),n=t.libraries[0].id,r=t.libraries[0].shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}async function m(){t=await(await fetch(`/api/shape-libraries`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)})).json(),f(`Saved`)}function h(){return{id:o(`shape`),name:`New shape`,imageSrc:``,width:65,height:65,labelPlacement:`below`,showInDiagram:!0,anchors:structuredClone(Q_)}}function g(){_(),v(),y()}function _(){e.librarySelect.innerHTML=``,t.libraries.forEach(t=>{let r=document.createElement(`option`);r.value=t.id,r.textContent=t.name,r.selected=t.id===n,e.librarySelect.appendChild(r)}),e.libraryName.value=s()?.name||``}function v(){let t=s();e.shapeList.innerHTML=``,(t?.shapes||[]).forEach(t=>{let n=document.createElement(`button`);n.type=`button`,n.className=`shape-item w-full flex items-center gap-2 px-2 py-1.5 rounded text-sm text-left hover:bg-gray-100 ${t.id===r?`active`:``}`;let a=document.createElement(`img`);a.src=t.imageSrc,a.alt=``,a.className=`w-6 h-6 object-contain shrink-0`;let o=document.createElement(`span`);o.className=`truncate`,o.textContent=t.name,n.append(a,o),n.addEventListener(`click`,()=>{r=t.id,i=structuredClone(t),g()}),e.shapeList.appendChild(n)}),t?.shapes?.length||(e.shapeList.innerHTML=`<p class="text-xs text-gray-400 px-2 py-2">No shape yet.</p>`)}function y(){i||=h(),e.previewStage.style.aspectRatio=`${Math.max(16,Number(i.width)||65)} / ${Math.max(16,Number(i.height)||65)}`,e.previewImage.src=i.imageSrc||``,e.previewImage.style.display=i.imageSrc?`block`:`none`,e.shapeName.value=i.name||``,e.shapeWidth.value=i.width||65,e.shapeHeight.value=i.height||65,e.labelPlacement.value=u(i.labelPlacement),e.shapeShowInDiagram.checked=i.showInDiagram!==!1,b()}function b(){e.previewStage.querySelectorAll(`.anchor-dot`).forEach(e=>e.remove()),e.anchorList.innerHTML=``;let t=i.anchors||[];e.anchorCount.textContent=`${t.length} anchor${t.length>1?`s`:``}`,t.forEach((t,n)=>{let r=document.createElement(`button`);r.type=`button`,r.className=`anchor-dot`,r.style.left=`${t.x*100}%`,r.style.top=`${t.y*100}%`,r.dataset.anchorId=t.id,r.innerHTML=`<span>${t.id}</span>`,r.addEventListener(`pointerdown`,e=>{e.preventDefault(),a=t.id,r.setPointerCapture(e.pointerId)}),e.previewStage.appendChild(r);let o=document.createElement(`div`);o.className=`grid grid-cols-[4.5rem_1fr_1fr_2rem] gap-2 items-center`,o.innerHTML=`
|
|
153
|
+
text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"> </button> <button id="imageNameConfirm" class="px-3 py-1 text-xs rounded bg-blue-500 text-white hover:bg-blue-600"> </button></div></div></div></div>`);function X_(e,t){Ge(t,!0),Vi(()=>{let e;return(async()=>{let t=`en`;try{t=(await fetch(`/api/config`).then(e=>e.json())).language||`en`}catch{}await la(t);let{initDiagram:r}=await J_(async()=>{let{initDiagram:e}=await import(`./main-C6KyG7XM.js`);return{initDiagram:e}},[]);e=r();let i=document.getElementById(`sidebar`),a=parseInt(localStorage.getItem(n)||``,10);i&&Number.isFinite(a)&&(i.style.width=a+`px`)})(),()=>e?.()});let n=`ld-diagram-sidebar-w`,r=F(!1);function i(e){e.preventDefault();let t=document.getElementById(`sidebar`);if(!t)return;let i=e.clientX,a=t.getBoundingClientRect().width;I(r,!0),t.style.transition=`none`,document.body.style.cursor=`col-resize`,document.body.style.userSelect=`none`;let o=e=>{let n=Math.max(160,Math.min(480,a+e.clientX-i));t.style.width=n+`px`},s=()=>{document.removeEventListener(`mousemove`,o),document.removeEventListener(`mouseup`,s),document.body.style.cursor=``,document.body.style.userSelect=``,I(r,!1),t.style.transition=``;try{localStorage.setItem(n,String(parseInt(t.style.width,10)))}catch{}};document.addEventListener(`mousemove`,o),document.addEventListener(`mouseup`,s)}var a=Y_(),o=R(a),s=R(o),c=R(s,!0);N(s);var l=B(s,4),u=B(l,4),d=B(u,2),f=B(d,4),p=B(f,2),m=B(p,2),h=B(m,2),g=B(h,2),_=B(g,2),v=B(_,2),y=B(v,2),b=B(y,2),x=B(b,4),S=B(x,4),C=B(S,4),w=B(C,2),T=B(w,2),E=B(T,2),D=B(E,2),ee=B(D,2),O=B(ee,4),k=B(O,4),A=B(k,4),te=B(A,2),ne=B(te,8),re=B(ne,4),ie=B(re,4),ae=R(ie),oe=R(ae,!0);N(ae),N(ie),N(o);var se=B(o,2),ce=R(se),le=R(ce),ue=R(le),de=R(ue,!0);N(ue);var fe=B(ue,2),pe=R(fe,!0);N(fe),N(le),Pe(2),N(ce);var me=B(ce,2),he=B(me,2),ge=B(R(he),10),_e=B(R(ge),8),ve=B(_e,2);N(ge);var ye=B(ge,2),be=R(ye),xe=R(be),Se=R(xe,!0);N(xe);var j=B(xe,2);N(be),Pe(2),N(ye);var Ce=B(ye,2),M=R(Ce),we=B(M,4),Te=R(we),Ee=B(Te,4),De=B(Ee,4),Oe=B(De,2),ke=B(Oe,4),Ae=B(ke,2),je=B(Ae,2),Me=B(je,4),Ne=B(Me,2),Fe=B(Ne,2),Ie=B(Fe,4),Le=B(Ie,2),Re=B(Le,2),ze=B(Re,4),Be=R(ze),Ve=B(Be,2),He=B(Ve,2),Ue=B(He,2),We=B(Ue,2);Pe(2),N(ze);var qe=B(ze,2),Je=B(qe,2),Ye=B(Je,4),Xe=B(Ye,2),Ze=B(Xe,2),Qe=B(Ze,4),$e=B(Qe,2),et=B($e,4),tt=B(et,4),nt=B(tt,2),rt=B(nt,4);N(we),N(Ce);var it=B(Ce,2),at=R(it),ot=R(at,!0);N(at);var st=B(at,2),ct=B(R(st),2),lt=R(ct,!0);N(ct),N(st);var ut=B(st,2),dt=R(ut);N(ut);var ft=B(ut,2),pt=B(R(ft),2),mt=R(pt,!0);N(pt),N(ft);var ht=B(ft,4),gt=B(R(ht),2),_t=R(gt,!0);N(gt),N(ht);var vt=B(ht,2),P=R(vt);N(vt);var yt=B(vt,2),bt=R(yt),xt=R(bt,!0);N(bt);var St=B(bt,2),Ct=R(St,!0);N(St),Pe(2),N(yt),N(it);var wt=B(it,2),Tt=R(wt),Et=B(Tt,4),Dt=R(Et),Ot=B(Dt,2),kt=B(Ot,2),At=B(kt,2),jt=B(At,4),Mt=B(jt,2),Nt=B(Mt,4),Pt=B(Nt,2),Ft=B(Pt,2),It=B(Ft,4),Lt=B(It,2),Rt=B(Lt,4),zt=B(Rt,2),Bt=B(zt,4),Vt=B(Bt,2),Ht=B(Vt,2),Ut=B(Ht,2),Wt=B(Ut,2),Gt=B(Wt,4),Kt=B(Gt,2),qt=B(Kt,4),Jt=B(qt,4),Yt=B(Jt,4);N(Et),N(wt);var Xt=B(wt,2),Zt=B(Xt,2),Qt=B(R(Zt),2),$t=R(Qt,!0);N(Qt),N(Zt),N(he),N(se);var en=B(se,4),tn=R(en),L=R(tn),nn=R(L,!0);N(L);var rn=B(L,4),an=R(rn);Pe(2),N(rn);var on=B(rn,2),sn=R(on,!0);N(on);var cn=B(on,2),ln=R(cn),un=R(ln,!0);N(ln);var dn=B(ln,2),fn=R(dn,!0);N(dn),N(cn),N(tn),N(en),N(a),V((e,t,n,i,a,o,s,ie,ae,se,ce,le,ue,fe,he,ge,ye,be,xe,Ce,we,N,Pe,ze,Ge,Ke,it,at,st,ct,ut,ft,pt,ht,gt,vt,yt,bt,St,wt,Et,F,Zt,I,Qt,en,tn,L,rn,on,cn,ln,dn,R,z,B,pn,mn,hn,gn,_n,vn,yn,bn,xn,Sn,Cn,wn,Tn,En,Dn,On,kn,An,jn,Mn,Nn,Pn,V,Fn,In,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Kn,qn,Jn,Yn,Xn,Zn,Qn,$n,er,tr,nr,rr,ir)=>{K(c,e),Y(l,`title`,t),Y(u,`title`,n),Y(d,`title`,i),Y(f,`title`,a),Y(p,`title`,o),Y(m,`title`,s),Y(h,`title`,ie),Y(g,`title`,ae),Y(_,`title`,se),Y(v,`title`,ce),Y(y,`title`,le),Y(b,`title`,ue),Y(x,`title`,fe),Y(S,`title`,he),Y(C,`title`,ge),Y(w,`title`,ye),Y(T,`title`,be),Y(E,`title`,xe),Y(D,`title`,Ce),Y(ee,`title`,we),Y(O,`placeholder`,N),Y(k,`title`,Pe),Y(A,`title`,ze),Y(te,`title`,Ge),Y(ne,`title`,Ke),Y(re,`title`,it),K(oe,at),K(de,st),K(pe,ct),hi(me,1,`w-1 shrink-0 cursor-col-resize select-none transition-colors ${H(r)?`bg-blue-500/60`:`bg-transparent hover:bg-blue-500/40`}`),Y(_e,`title`,ut),Y(ve,`title`,ft),K(Se,pt),Y(j,`title`,ht),Y(M,`title`,gt),Y(Te,`title`,vt),Y(Ee,`title`,yt),Y(De,`title`,bt),Y(Oe,`title`,St),Y(ke,`title`,wt),Y(Ae,`title`,Et),Y(je,`title`,F),Y(Me,`title`,Zt),Y(Ne,`title`,I),Y(Fe,`title`,Qt),Y(Ie,`title`,en),Y(Le,`title`,tn),Y(Re,`title`,L),Y(Be,`title`,rn),Y(Ve,`title`,on),Y(He,`title`,cn),Y(Ue,`title`,ln),Y(We,`title`,dn),Y(qe,`title`,R),Y(Je,`title`,z),Y(Ye,`title`,B),Y(Xe,`title`,pn),Y(Ze,`title`,mn),Y(Qe,`title`,hn),Y($e,`title`,gn),Y(et,`title`,_n),Y(tt,`title`,vn),Y(nt,`title`,yn),Y(rt,`title`,bn),K(ot,xn),K(lt,Sn),Y(dt,`placeholder`,Cn),K(mt,wn),K(_t,Tn),Y(P,`placeholder`,En),K(xt,Dn),K(Ct,On),Y(Tt,`title`,kn),Y(Dt,`title`,An),Y(Ot,`title`,jn),Y(kt,`title`,Mn),Y(At,`title`,Nn),Y(jt,`title`,Pn),Y(Mt,`title`,V),Y(Nt,`title`,Fn),Y(Pt,`title`,In),Y(Ft,`title`,Ln),Y(It,`title`,Rn),Y(Lt,`title`,zn),Y(Rt,`title`,Bn),Y(zt,`title`,Vn),Y(Bt,`title`,Hn),Y(Vt,`title`,Un),Y(Ht,`title`,Wn),Y(Ut,`title`,Gn),Y(Wt,`title`,Kn),Y(Gt,`title`,qn),Y(Kt,`title`,Jn),Y(qt,`title`,Yn),Y(Jt,`title`,Xn),Y(Yt,`title`,Zn),Y(Xt,`placeholder`,Qn),K($t,$n),K(nn,er),Y(an,`placeholder`,tr),K(sn,nr),K(un,rr),K(fn,ir)},[()=>X(`diagram.back_btn`),()=>X(`diagram.diagrams_list_title`),()=>X(`diagram.toolbar.copy_mcp_id`),()=>X(`diagram.toolbar.select`),()=>X(`diagram.toolbar.box`),()=>X(`diagram.toolbar.ellipse`),()=>X(`diagram.toolbar.database`),()=>X(`diagram.toolbar.circle`),()=>X(`diagram.toolbar.actor`),()=>X(`diagram.toolbar.postit`),()=>X(`diagram.toolbar.text_free`),()=>X(`diagram.toolbar.image`),()=>X(`diagram.toolbar.shape_editor`),()=>X(`diagram.toolbar.arrow`),()=>X(`diagram.toolbar.delete`),()=>X(`diagram.toolbar.defaults`),()=>X(`diagram.toolbar.align_guides`),()=>X(`diagram.toolbar.grid`),()=>X(`diagram.toolbar.edge_style`),()=>X(`diagram.toolbar.evidence_mode`),()=>X(`diagram.toolbar.resize_corner`),()=>X(`diagram.toolbar.title_placeholder`),()=>X(`diagram.toolbar.zoom_out`),()=>X(`diagram.toolbar.zoom_in`),()=>X(`diagram.toolbar.fit`),()=>X(`diagram.toolbar.debug`),()=>X(`diagram.toolbar.export_drawio`),()=>X(`diagram.toolbar.save`),()=>X(`diagram.sidebar.title`),()=>X(`diagram.sidebar.new_btn`),()=>X(`diagram.selection.rotate_shape`),()=>X(`diagram.selection.rotate_text`),()=>X(`diagram.evidence.panel_title`),()=>X(`diagram.evidence.close`),()=>X(`diagram.node_panel.lock`),()=>X(`diagram.node_panel.color`),()=>X(`diagram.node_panel.bg_opacity`),()=>X(`diagram.node_panel.edit_label`),()=>X(`diagram.node_panel.edit_link`),()=>X(`diagram.node_panel.font_decrease`),()=>X(`diagram.node_panel.font_size_value`),()=>X(`diagram.node_panel.font_increase`),()=>X(`diagram.node_panel.align_left`),()=>X(`diagram.node_panel.align_center`),()=>X(`diagram.node_panel.align_right`),()=>X(`diagram.node_panel.align_top`),()=>X(`diagram.node_panel.align_middle`),()=>X(`diagram.node_panel.align_bottom`),()=>X(`diagram.node_panel.custom_label_above`),()=>X(`diagram.node_panel.custom_label_below`),()=>X(`diagram.node_panel.custom_label_left`),()=>X(`diagram.node_panel.custom_label_right`),()=>X(`diagram.node_panel.custom_label_center`),()=>X(`diagram.node_panel.send_back`),()=>X(`diagram.node_panel.bring_front`),()=>X(`diagram.node_panel.stamp_color`),()=>X(`diagram.node_panel.stamp_font`),()=>X(`diagram.node_panel.stamp_size`),()=>X(`diagram.node_panel.rotate_ccw`),()=>X(`diagram.node_panel.rotate_cw`),()=>X(`diagram.node_panel.copy_png`),()=>X(`diagram.node_panel.group`),()=>X(`diagram.node_panel.ungroup`),()=>X(`diagram.node_panel.save_as_default`),()=>X(`diagram.link_panel.title`),()=>X(`diagram.link_panel.external`),()=>X(`diagram.link_panel.url_placeholder`),()=>X(`diagram.link_panel.existing_diagram`),()=>X(`diagram.link_panel.new_diagram`),()=>X(`diagram.link_panel.diagram_name_placeholder`),()=>X(`diagram.link_panel.save_btn`),()=>X(`diagram.link_panel.remove_btn`),()=>X(`diagram.edge_panel.lock`),()=>X(`diagram.edge_panel.no_arrow`),()=>X(`diagram.edge_panel.arrow_from`),()=>X(`diagram.edge_panel.arrow_to`),()=>X(`diagram.edge_panel.arrow_both`),()=>X(`diagram.edge_panel.solid`),()=>X(`diagram.edge_panel.dashed`),()=>X(`diagram.edge_panel.font_decrease`),()=>X(`diagram.edge_panel.font_size_value`),()=>X(`diagram.edge_panel.font_increase`),()=>X(`diagram.edge_panel.edit_label`),()=>X(`diagram.edge_panel.reset_label_width`),()=>X(`diagram.edge_panel.rotate_label_ccw`),()=>X(`diagram.edge_panel.rotate_label_cw`),()=>X(`diagram.edge_panel.offset_label_left`),()=>X(`diagram.edge_panel.offset_label_right`),()=>X(`diagram.edge_panel.offset_label_up`),()=>X(`diagram.edge_panel.offset_label_down`),()=>X(`diagram.edge_panel.offset_label_reset`),()=>X(`diagram.edge_panel.width_decrease`),()=>X(`diagram.edge_panel.width_increase`),()=>X(`diagram.edge_panel.color`),()=>X(`diagram.edge_panel.clear_ports`),()=>X(`diagram.edge_panel.save_as_default`),()=>X(`diagram.label_input.placeholder`),()=>X(`diagram.empty_state`),()=>X(`diagram.image_modal.title`),()=>X(`diagram.image_modal.placeholder`),()=>X(`diagram.image_modal.error_chars`),()=>X(`diagram.image_modal.cancel_btn`),()=>X(`diagram.image_modal.paste_btn`)]),U(`click`,s,()=>history.back()),U(`mousedown`,me,i),G(e,a),Ke()}Nr([`click`,`mousedown`]),He();var Z_={network:null,nodes:null,edges:null,diagrams:[],currentDiagramId:null,currentTool:`select`,pendingShape:`box`,selectedNodeIds:[],selectedEdgeIds:[],alignGuides:!0,gridEnabled:!0,debugMode:!1,isDirty:!1,sidebarOpen:!0,editingNodeId:null,editingEdgeId:null,resizeDrag:null,rotateDrag:null,labelRotateDrag:null,activeStamp:null,stampTargetIds:[],clipboard:null,canonicalOrder:[],edgesStraight:!1,resizeSymmetric:!1,nodeColorOverrides:{},customShapeLibraries:[],customShapeDefs:new Map,edgeLabelCanvasPos:{},edgeLabelBBox:{},freeArrowFirstPoint:null,exportingPng:!1,evidenceMode:!1};function Q_(){Z_.isDirty=!0,document.getElementById(`btnSave`).disabled=!1}var $_=`custom-shape`,ev=`custom-shape:`,tv=[{id:`N`,x:.5,y:0},{id:`NE`,x:1,y:0},{id:`E`,x:1,y:.5},{id:`SE`,x:1,y:1},{id:`S`,x:.5,y:1},{id:`SW`,x:0,y:1},{id:`W`,x:0,y:.5},{id:`NW`,x:0,y:0}];function nv(e){return typeof e==`string`&&e.startsWith(`custom-shape:`)}function rv(e){return nv(e)?e.slice(13):null}function iv(e){return e&&Z_.customShapeDefs&&Z_.customShapeDefs.get(e)||null}function av(e){let t=iv(e);return[t&&t.width||65,t&&t.height||65]}function ov(e){let t=iv(e);return t&&Array.isArray(t.anchors)&&t.anchors.length?t.anchors:tv}function sv(e){let t=iv(e);return t&&[`center`,`below`,`above`,`right`,`left`].includes(t.labelPlacement)?t.labelPlacement:`below`}async function cv(){try{let e=await fetch(`/api/shape-libraries`);if(!e.ok)throw Error(`shape libraries unavailable`);let t=await e.json(),n=Array.isArray(t.libraries)?t.libraries:[];Z_.customShapeLibraries=n,Z_.customShapeDefs=new Map,n.forEach(e=>{(e.shapes||[]).forEach(e=>Z_.customShapeDefs.set(e.id,e))})}catch{Z_.customShapeLibraries=[],Z_.customShapeDefs=new Map}}function lv(){let e=document.getElementById(`customShapeBar`),t=document.getElementById(`customShapeBarBody`);if(!e||!t)return;t.innerHTML=``;let n=(Z_.customShapeLibraries||[]).flatMap(e=>(e.shapes||[]).filter(e=>e.showInDiagram!==!1).map(t=>({...t,libraryName:e.name})));e.classList.toggle(`hidden`,n.length===0),n.forEach(e=>{let n=document.createElement(`button`);n.type=`button`,n.className=`custom-shape-btn`,n.title=`${e.libraryName||``}${e.libraryName?` · `:``}${e.name}`,n.dataset.customShapeId=e.id;let r=document.createElement(`img`);r.src=e.imageSrc,r.alt=``,r.draggable=!1,n.appendChild(r),n.addEventListener(`click`,()=>{window.dispatchEvent(new CustomEvent(`diagram:setTool`,{detail:{tool:`addNode`,shape:`${ev}${e.id}`}}))}),t.appendChild(n)})}function uv(){let e={saveState:document.getElementById(`saveState`),librarySelect:document.getElementById(`librarySelect`),libraryName:document.getElementById(`libraryName`),shapeList:document.getElementById(`shapeList`),previewStage:document.getElementById(`previewStage`),previewImage:document.getElementById(`previewImage`),shapeName:document.getElementById(`shapeName`),imageFile:document.getElementById(`imageFile`),shapeWidth:document.getElementById(`shapeWidth`),shapeHeight:document.getElementById(`shapeHeight`),labelPlacement:document.getElementById(`labelPlacement`),shapeShowInDiagram:document.getElementById(`shapeShowInDiagram`),anchorList:document.getElementById(`anchorList`),anchorCount:document.getElementById(`anchorCount`)},t={libraries:[]},n=null,r=null,i=null,a=null,o=e=>`${e}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,6)}`,s=()=>t.libraries.find(e=>e.id===n)||null,c=()=>s()?.shapes.find(e=>e.id===r)||null,l=e=>Math.max(0,Math.min(1,e)),u=e=>[`below`,`above`,`right`,`left`,`center`].includes(e)?e:`below`,d=e=>String(e??``).replace(/[&<>"']/g,e=>({"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`})[e]);function f(t){e.saveState.textContent=t,t&&setTimeout(()=>{e.saveState.textContent===t&&(e.saveState.textContent=``)},1800)}async function p(){t=await(await fetch(`/api/shape-libraries`)).json(),Array.isArray(t.libraries)||(t.libraries=[]),t.libraries.length||t.libraries.push({id:o(`lib`),name:`My shapes`,shapes:[]}),n=t.libraries[0].id,r=t.libraries[0].shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}async function m(){t=await(await fetch(`/api/shape-libraries`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)})).json(),f(`Saved`)}function h(){return{id:o(`shape`),name:`New shape`,imageSrc:``,width:65,height:65,labelPlacement:`below`,showInDiagram:!0,anchors:structuredClone(tv)}}function g(){_(),v(),y()}function _(){e.librarySelect.innerHTML=``,t.libraries.forEach(t=>{let r=document.createElement(`option`);r.value=t.id,r.textContent=t.name,r.selected=t.id===n,e.librarySelect.appendChild(r)}),e.libraryName.value=s()?.name||``}function v(){let t=s();e.shapeList.innerHTML=``,(t?.shapes||[]).forEach(t=>{let n=document.createElement(`button`);n.type=`button`,n.className=`shape-item w-full flex items-center gap-2 px-2 py-1.5 rounded text-sm text-left hover:bg-gray-100 ${t.id===r?`active`:``}`;let a=document.createElement(`img`);a.src=t.imageSrc,a.alt=``,a.className=`w-6 h-6 object-contain shrink-0`;let o=document.createElement(`span`);o.className=`truncate`,o.textContent=t.name,n.append(a,o),n.addEventListener(`click`,()=>{r=t.id,i=structuredClone(t),g()}),e.shapeList.appendChild(n)}),t?.shapes?.length||(e.shapeList.innerHTML=`<p class="text-xs text-gray-400 px-2 py-2">No shape yet.</p>`)}function y(){i||=h(),e.previewStage.style.aspectRatio=`${Math.max(16,Number(i.width)||65)} / ${Math.max(16,Number(i.height)||65)}`,e.previewImage.src=i.imageSrc||``,e.previewImage.style.display=i.imageSrc?`block`:`none`,e.shapeName.value=i.name||``,e.shapeWidth.value=i.width||65,e.shapeHeight.value=i.height||65,e.labelPlacement.value=u(i.labelPlacement),e.shapeShowInDiagram.checked=i.showInDiagram!==!1,b()}function b(){e.previewStage.querySelectorAll(`.anchor-dot`).forEach(e=>e.remove()),e.anchorList.innerHTML=``;let t=i.anchors||[];e.anchorCount.textContent=`${t.length} anchor${t.length>1?`s`:``}`,t.forEach((t,n)=>{let r=document.createElement(`button`);r.type=`button`,r.className=`anchor-dot`,r.style.left=`${t.x*100}%`,r.style.top=`${t.y*100}%`,r.dataset.anchorId=t.id,r.innerHTML=`<span>${t.id}</span>`,r.addEventListener(`pointerdown`,e=>{e.preventDefault(),a=t.id,r.setPointerCapture(e.pointerId)}),e.previewStage.appendChild(r);let o=document.createElement(`div`);o.className=`grid grid-cols-[4.5rem_1fr_1fr_2rem] gap-2 items-center`,o.innerHTML=`
|
|
154
154
|
<input class="field !h-7 text-xs" value="${d(t.id)}">
|
|
155
155
|
<input class="field !h-7 text-xs" type="number" min="0" max="100" step="1" value="${Math.round(t.x*100)}">
|
|
156
156
|
<input class="field !h-7 text-xs" type="number" min="0" max="100" step="1" value="${Math.round(t.y*100)}">
|
|
157
157
|
<button class="btn btn-danger !h-7 !px-0">×</button>
|
|
158
|
-
`;let[s,c,u]=o.querySelectorAll(`input`);s.addEventListener(`input`,()=>{t.id=s.value.trim()||`p${n+1}`,b()}),c.addEventListener(`input`,()=>{t.x=l(Number(c.value)/100),b()}),u.addEventListener(`input`,()=>{t.y=l(Number(u.value)/100),b()}),o.querySelector(`button`).addEventListener(`click`,()=>{i.anchors=i.anchors.filter(e=>e!==t),b()}),e.anchorList.appendChild(o)})}function x(t,n){let r=e.previewStage.getBoundingClientRect();t.x=l((n.clientX-r.left)/r.width),t.y=l((n.clientY-r.top)/r.height)}let S=[],C=(e,t,n,r)=>{e.addEventListener(t,n,r),S.push(()=>e.removeEventListener(t,n,r))};return C(e.previewStage,`pointermove`,e=>{if(!a||!i)return;let t=i.anchors.find(e=>e.id===a);t&&(x(t,e),b())}),C(window,`pointerup`,()=>{a=null}),C(e.previewStage,`click`,e=>{if(e.target.closest(`.anchor-dot`)||a||!i)return;let t={id:`p${(i.anchors||[]).length+1}`,x:.5,y:.5};x(t,e),i.anchors=[...i.anchors||[],t],b()}),C(document.getElementById(`btnAddLibrary`),`click`,async()=>{let e={id:o(`lib`),name:`New library`,shapes:[]};t.libraries.push(e),n=e.id,r=null,i=h(),g(),await m()}),C(e.librarySelect,`change`,()=>{n=e.librarySelect.value,r=s()?.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}),C(e.libraryName,`change`,async()=>{let t=s();t&&(t.name=e.libraryName.value.trim()||t.name,_(),await m())}),C(document.getElementById(`btnNewShape`),`click`,()=>{r=null,i=h(),g()}),C(document.getElementById(`btnDeleteShape`),`click`,async()=>{let e=s();!e||!r||(e.shapes=e.shapes.filter(e=>e.id!==r),r=e.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g(),await m())}),C(document.getElementById(`btnDefaultAnchors`),`click`,()=>{i.anchors=structuredClone(
|
|
159
|
-
position.</p></div> <div class="space-y-4"><div class="grid grid-cols-2 gap-3"><label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Shape name</span> <input id="shapeName" class="field w-full" placeholder="Shape name"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Image / SVG</span> <input id="imageFile" type="file" accept="image/*,.svg" class="block w-full text-sm"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Width</span> <input id="shapeWidth" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Height</span> <input id="shapeHeight" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1 col-span-2"><span class="block text-xs font-semibold text-gray-500">Text placement</span> <select id="labelPlacement" class="field w-full"><option> </option><option> </option><option> </option><option> </option><option> </option></select></label> <label class="col-span-2 flex items-start gap-2 rounded-md border border-gray-200 bg-white px-2 py-2 text-sm"><input id="shapeShowInDiagram" type="checkbox" class="mt-0.5 h-4 w-4 rounded border-gray-300 text-blue-600"/> <span class="space-y-0.5"><span class="block font-semibold text-gray-700"> </span> <span class="block text-xs text-gray-500"> </span></span></label></div> <div class="flex flex-wrap gap-2"><button id="btnDefaultAnchors" class="btn">Use 8 default anchors</button> <button id="btnClearAnchors" class="btn">Clear anchors</button> <button id="btnSaveShape" class="btn btn-primary">Save shape</button></div> <div><div class="flex items-center justify-between mb-2"><h2 class="text-xs font-semibold uppercase tracking-wide text-gray-500">Anchors</h2> <span id="anchorCount" class="text-xs text-gray-500"></span></div> <div id="anchorList" class="space-y-1"></div></div></div></div></section></main></div>`);function lv(e,t){Ge(t,!1),Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{await la(`en`)}return sv()}),Ri();var n=cv(),r=R(n),i=R(r);Pe(4),N(r);var a=B(r,2),o=B(R(a),2),s=R(o),c=B(R(s),2),l=R(c),u=B(R(l),8),d=B(R(u),2),f=R(d),p=R(f,!0);N(f),f.value=f.__value=`below`;var m=B(f),h=R(m,!0);N(m),m.value=m.__value=`above`;var g=B(m),_=R(g,!0);N(g),g.value=g.__value=`right`;var v=B(g),y=R(v,!0);N(v),v.value=v.__value=`left`;var b=B(v),x=R(b,!0);N(b),b.value=b.__value=`center`,N(d),N(u);var S=B(u,2),C=B(R(S),2),w=R(C),T=R(w,!0);N(w);var E=B(w,2),D=R(E,!0);N(E),N(C),N(S),N(l),Pe(4),N(c),N(s),N(o),N(a),N(n),V((e,t,n,r,i,a,o)=>{K(p,e),K(h,t),K(_,n),K(y,r),K(x,i),K(T,a),K(D,o)},[()=>X(`shape_editor.label_placement.below`),()=>X(`shape_editor.label_placement.above`),()=>X(`shape_editor.label_placement.right`),()=>X(`shape_editor.label_placement.left`),()=>X(`shape_editor.label_placement.center`),()=>X(`shape_editor.show_in_diagram_label`),()=>X(`shape_editor.show_in_diagram_hint`)]),U(`click`,i,()=>history.back()),G(e,n),Ke()}Nr([`click`]);var uv=L({tasks:[],notes:[],links:[]}),dv=!1,fv=null;async function pv(){try{let e=await fetch(`/api/survival-kit`);if(e.ok){let t=await e.json();uv.tasks=Array.isArray(t.tasks)?t.tasks:[],uv.notes=Array.isArray(t.notes)?t.notes:[],uv.links=Array.isArray(t.links)?t.links:[]}}catch{}finally{dv=!0}}async function mv(){try{await fetch(`/api/survival-kit`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tasks:uv.tasks,notes:uv.notes,links:uv.links})})}catch{}}function hv(){dv&&(fv&&clearTimeout(fv),fv=setTimeout(()=>{fv=null,mv()},400))}var gv=W(`<button type="button"> </button>`),_v=W(`<p class="sk-empty svelte-lo2xyl"> </p>`),vv=W(`<div><button type="button" aria-label="toggle"></button> <span class="sk-task-text svelte-lo2xyl"> </span> <span class="sk-task-tag svelte-lo2xyl"> </span> <button type="button" class="sk-task-del svelte-lo2xyl">✕</button></div>`),yv=W(`<div class="sk-panel-head"><h2 class="sk-panel-title"> <span class="sk-accent">.</span></h2> <p class="sk-panel-sub"> </p></div> <div class="sk-add-bar svelte-lo2xyl"><input type="text" class="svelte-lo2xyl"/> <select class="svelte-lo2xyl"><option> </option><option> </option><option> </option></select> <button type="button" class="sk-add-btn svelte-lo2xyl">+</button></div> <div class="sk-filters svelte-lo2xyl"></div> <div class="sk-tasks svelte-lo2xyl"><!></div>`,1);function bv(e,t){Ge(t,!0);let n=F(``),r=F(`normal`),i=F(`all`),a=[{key:`all`,label:()=>X(`survival.tasks_filter_all`)},{key:`todo`,label:()=>X(`survival.tasks_filter_todo`)},{key:`done`,label:()=>X(`survival.tasks_filter_done`)},{key:`urgent`,label:()=>X(`survival.tasks_filter_urgent`)},{key:`normal`,label:()=>X(`survival.tasks_filter_normal`)},{key:`later`,label:()=>X(`survival.tasks_filter_later`)}];function o(e){return X(`survival.tasks_priority_${e}`)}let s=P(()=>uv.tasks.filter(e=>H(i)===`todo`?!e.done:H(i)===`done`?e.done:H(i)===`urgent`||H(i)===`normal`||H(i)===`later`?e.priority===H(i):!0));function c(){let e=H(n).trim();e&&(uv.tasks.unshift({id:Date.now(),text:e,priority:H(r),done:!1}),I(n,``),hv())}function l(e){let t=uv.tasks.find(t=>t.id===e);t&&(t.done=!t.done),hv()}function u(e){uv.tasks=uv.tasks.filter(t=>t.id!==e),hv()}var d=yv(),f=z(d),p=R(f),m=R(p,!0);Pe(),N(p);var h=B(p,2),g=R(h,!0);N(h),N(f);var _=B(f,2),v=R(_);Ei(v);var y=B(v,2),b=R(y),x=R(b,!0);N(b),b.value=b.__value=`normal`;var S=B(b),C=R(S,!0);N(S),S.value=S.__value=`urgent`;var w=B(S),T=R(w,!0);N(w),w.value=w.__value=`later`,N(y);var E=B(y,2);N(_);var D=B(_,2);J(D,21,()=>a,Yr,(e,t)=>{var n=gv();let r;var a=R(n,!0);N(n),V(e=>{r=hi(n,1,`svelte-lo2xyl`,null,r,{active:H(i)===H(t).key}),K(a,e)},[()=>H(t).label()]),U(`click`,n,()=>I(i,H(t).key,!0)),G(e,n)}),N(D);var ee=B(D,2),O=R(ee),k=e=>{var t=_v(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`survival.tasks_empty`)]),G(e,t)},A=e=>{var t=Ur();J(z(t),17,()=>H(s),e=>e.id,(e,t)=>{var n=vv();let r;var i=R(n);let a;var s=B(i,2),c=R(s,!0);N(s);var d=B(s,2),f=R(d,!0);N(d);var p=B(d,2);N(n),V((e,o)=>{r=hi(n,1,`sk-task sk-task--${H(t).priority??``}`,`svelte-lo2xyl`,r,{done:H(t).done}),a=hi(i,1,`sk-check svelte-lo2xyl`,null,a,{checked:H(t).done}),K(c,H(t).text),K(f,e),Y(p,`title`,o)},[()=>o(H(t).priority),()=>X(`survival.tasks_delete_title`)]),U(`click`,i,()=>l(H(t).id)),U(`click`,p,()=>u(H(t).id)),G(e,n)}),G(e,t)};q(O,e=>{H(s).length===0?e(k):e(A,-1)}),N(ee),V((e,t,n,r,i,a)=>{K(m,e),K(g,t),Y(v,`placeholder`,n),K(x,r),K(C,i),K(T,a)},[()=>X(`survival.tasks_title`),()=>X(`survival.tasks_subtitle`),()=>X(`survival.tasks_input_placeholder`),()=>X(`survival.tasks_priority_normal`),()=>X(`survival.tasks_priority_urgent`),()=>X(`survival.tasks_priority_later`)]),U(`keydown`,v,e=>e.key===`Enter`&&c()),Mi(v,()=>H(n),e=>I(n,e)),bi(y,()=>H(r),e=>I(r,e)),U(`click`,E,c),G(e,d),Ke()}Nr([`keydown`,`click`]);var xv=[`t-green`,`t-violet`,`t-amber`,`t-sky`,`t-rose`,`t-teal`],Sv=W(`<div class="sk-modal-backdrop svelte-1rcj86" role="presentation"><div class="sk-modal svelte-1rcj86" role="dialog" aria-modal="true"><h3 class="sk-modal-title svelte-1rcj86"> </h3> <div class="sk-modal-body svelte-1rcj86"><!></div> <div class="sk-modal-actions svelte-1rcj86"><button type="button" class="sk-btn svelte-1rcj86"> </button> <button type="button"> </button></div></div></div>`);function Cv(e,t){Ge(t,!0);let n=Bi(t,`open`,3,!1),r=Bi(t,`title`,3,``),i=Bi(t,`confirmLabel`,19,()=>X(`common.save`)),a=Bi(t,`danger`,3,!1);function o(e){e.target===e.currentTarget&&t.onClose()}function s(e){e.key===`Escape`&&t.onClose()}var c=Ur(),l=z(c),u=e=>{var n=Sv(),c=R(n),l=R(c),u=R(l,!0);N(l);var d=B(l,2);ai(R(d),()=>t.children),N(d);var f=B(d,2),p=R(f),m=R(p,!0);N(p);var h=B(p,2);let g;var _=R(h,!0);N(h),N(f),N(c),N(n),V(e=>{K(u,r()),K(m,e),g=hi(h,1,`sk-btn sk-btn--primary svelte-1rcj86`,null,g,{"sk-btn--danger":a()}),K(_,i())},[()=>X(`common.cancel`)]),U(`click`,n,o),U(`keydown`,n,s),U(`click`,p,function(...e){t.onClose?.apply(this,e)}),U(`click`,h,function(...e){t.onConfirm?.apply(this,e)}),G(e,n)};q(l,e=>{n()&&e(u)}),G(e,c),Ke()}Nr([`click`,`keydown`]);var wv=W(`<p class="sk-empty svelte-hpbata"> </p>`),Tv=W(`<strong> </strong>`),Ev=W(`<p> </p>`),Dv=W(`<div class="sk-pre-wrap svelte-hpbata"><pre> </pre> <button type="button" class="sk-copy svelte-hpbata"> </button></div>`),Ov=W(`<li> </li>`),kv=W(`<ul></ul>`),Av=W(`<th> </th>`),jv=W(`<td> </td>`),Mv=W(`<tr></tr>`),Nv=W(`<div class="sk-table-wrap svelte-hpbata"><table><thead><tr></tr></thead><tbody></tbody></table></div>`),Pv=W(`<div class="sk-bloc svelte-hpbata"><div class="sk-bloc-content svelte-hpbata"><!></div> <div class="sk-bloc-actions svelte-hpbata"><button type="button" class="sk-mini svelte-hpbata">✎</button> <button type="button" class="sk-mini sk-mini--del svelte-hpbata">✕</button></div></div>`),Fv=W(`<div><div class="sk-note-head svelte-hpbata"><h3 class="svelte-hpbata"> </h3> <div class="sk-note-actions svelte-hpbata"><button type="button" class="sk-mini svelte-hpbata">✎</button> <button type="button" class="sk-mini sk-mini--del svelte-hpbata">✕</button></div> <button type="button" class="sk-toggle svelte-hpbata" aria-label="toggle"><svg viewBox="0 0 10 6" width="10" height="6"><path d="M1 1 L5 5 L9 1" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div> <div class="sk-note-body svelte-hpbata"><!> <div class="sk-note-foot svelte-hpbata"><button type="button" class="sk-add-bloc svelte-hpbata"> </button></div></div></div>`),Iv=W(`<option> </option>`),Lv=W(`<label for="sk-note-titre"> </label> <input id="sk-note-titre" type="text"/> <label for="sk-note-color"> </label> <select id="sk-note-color"></select>`,1),Rv=W(`<input id="sk-bloc-content" type="text"/>`),zv=W(`<textarea id="sk-bloc-content" rows="6"></textarea>`),Bv=W(`<label for="sk-bloc-type"> </label> <select id="sk-bloc-type"><option> </option><option> </option><option> </option><option> </option><option> </option></select> <label for="sk-bloc-content"> </label> <!>`,1),Vv=W(`<div class="sk-panel-head"><h2 class="sk-panel-title"> <span class="sk-accent">.</span></h2> <p class="sk-panel-sub"> </p></div> <div class="sk-toolbar svelte-hpbata"><button type="button" class="sk-tool svelte-hpbata"> </button> <button type="button" class="sk-tool svelte-hpbata"> </button> <button type="button" class="sk-tool sk-tool--add svelte-hpbata"> </button></div> <div><!> <!></div> <!> <!>`,1);function Hv(e,t){Ge(t,!0);let n=F(!1),r=F(L({})),i=F(null),a=F(!1),o=F(-1),s=F(``),c=F(`t-green`),l=F(!1),u=F(-1),d=F(-1),f=F(`p`),p=F(``),m={"t-green":`survival.color_green`,"t-violet":`survival.color_violet`,"t-amber":`survival.color_amber`,"t-sky":`survival.color_sky`,"t-rose":`survival.color_rose`,"t-teal":`survival.color_teal`},h=P(()=>uv.notes.length>0&&uv.notes.every(e=>H(r)[e.id]));function g(e){H(r)[e]=!H(r)[e]}function _(){if(H(h))I(r,{},!0);else{let e={};uv.notes.forEach(t=>e[t.id]=!0),I(r,e,!0)}}function v(){I(o,-1),I(s,``),I(c,`t-green`),I(a,!0)}function y(e){I(o,e,!0),I(s,uv.notes[e].titre,!0),I(c,uv.notes[e].theme,!0),I(a,!0)}function b(){let e=H(s).trim();if(e){if(H(o)===-1){let t=Date.now();uv.notes.push({id:t,theme:H(c),titre:e,blocs:[]}),H(r)[t]=!0}else uv.notes[H(o)].titre=e,uv.notes[H(o)].theme=H(c);hv(),I(a,!1)}}async function x(e){await t.confirmDelete(X(`survival.confirm_del_note_title`),X(`survival.confirm_del_note_msg`))&&(uv.notes.splice(e,1),hv())}function S(e){return e.type===`ul`?e.items.join(`
|
|
158
|
+
`;let[s,c,u]=o.querySelectorAll(`input`);s.addEventListener(`input`,()=>{t.id=s.value.trim()||`p${n+1}`,b()}),c.addEventListener(`input`,()=>{t.x=l(Number(c.value)/100),b()}),u.addEventListener(`input`,()=>{t.y=l(Number(u.value)/100),b()}),o.querySelector(`button`).addEventListener(`click`,()=>{i.anchors=i.anchors.filter(e=>e!==t),b()}),e.anchorList.appendChild(o)})}function x(t,n){let r=e.previewStage.getBoundingClientRect();t.x=l((n.clientX-r.left)/r.width),t.y=l((n.clientY-r.top)/r.height)}let S=[],C=(e,t,n,r)=>{e.addEventListener(t,n,r),S.push(()=>e.removeEventListener(t,n,r))};return C(e.previewStage,`pointermove`,e=>{if(!a||!i)return;let t=i.anchors.find(e=>e.id===a);t&&(x(t,e),b())}),C(window,`pointerup`,()=>{a=null}),C(e.previewStage,`click`,e=>{if(e.target.closest(`.anchor-dot`)||a||!i)return;let t={id:`p${(i.anchors||[]).length+1}`,x:.5,y:.5};x(t,e),i.anchors=[...i.anchors||[],t],b()}),C(document.getElementById(`btnAddLibrary`),`click`,async()=>{let e={id:o(`lib`),name:`New library`,shapes:[]};t.libraries.push(e),n=e.id,r=null,i=h(),g(),await m()}),C(e.librarySelect,`change`,()=>{n=e.librarySelect.value,r=s()?.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g()}),C(e.libraryName,`change`,async()=>{let t=s();t&&(t.name=e.libraryName.value.trim()||t.name,_(),await m())}),C(document.getElementById(`btnNewShape`),`click`,()=>{r=null,i=h(),g()}),C(document.getElementById(`btnDeleteShape`),`click`,async()=>{let e=s();!e||!r||(e.shapes=e.shapes.filter(e=>e.id!==r),r=e.shapes[0]?.id||null,i=c()?structuredClone(c()):h(),g(),await m())}),C(document.getElementById(`btnDefaultAnchors`),`click`,()=>{i.anchors=structuredClone(tv),b()}),C(document.getElementById(`btnClearAnchors`),`click`,()=>{i.anchors=[],b()}),C(document.getElementById(`btnSaveShape`),`click`,async()=>{let t=s();if(!t||!i||!i.imageSrc)return;i.name=e.shapeName.value.trim()||`Untitled shape`,i.width=Math.max(16,Math.min(1200,Math.round(Number(e.shapeWidth.value)||65))),i.height=Math.max(16,Math.min(1200,Math.round(Number(e.shapeHeight.value)||65))),i.labelPlacement=u(e.labelPlacement.value),i.showInDiagram=e.shapeShowInDiagram.checked;let n=t.shapes.findIndex(e=>e.id===i.id);n>=0?t.shapes[n]=structuredClone(i):t.shapes.push(structuredClone(i)),r=i.id,g(),await m()}),[`shapeName`,`shapeWidth`,`shapeHeight`,`labelPlacement`,`shapeShowInDiagram`].forEach(t=>{C(document.getElementById(t),`input`,()=>{i.name=e.shapeName.value,i.width=Number(e.shapeWidth.value)||65,i.height=Number(e.shapeHeight.value)||65,i.labelPlacement=u(e.labelPlacement.value),i.showInDiagram=e.shapeShowInDiagram.checked})}),C(e.imageFile,`change`,async()=>{let t=e.imageFile.files&&e.imageFile.files[0];if(!t||!i)return;let n=await new Promise((e,n)=>{let r=new FileReader;r.onload=()=>e(r.result),r.onerror=n,r.readAsDataURL(t)}),r=(t.name.split(`.`).pop()||`png`).toLowerCase().replace(/[^a-z0-9]/g,``)||`png`,a=t.name.replace(/\.[^.]+$/,``).slice(0,60),o=await(await fetch(`/api/images/upload`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({data:n,ext:r,name:a})})).json();i.imageSrc=`/images/${o.filename}`,(!e.shapeName.value||e.shapeName.value===`New shape`)&&(i.name=a||i.name),y()}),p(),()=>{S.forEach(e=>e()),S.length=0}}var dv=W(`<div class="ld-shape-editor h-screen overflow-hidden bg-gray-50 text-gray-900"><header class="h-12 border-b border-gray-200 bg-white flex items-center gap-2 px-3"><button class="btn">← Back</button> <h1 class="text-sm font-semibold">Shape editor</h1> <span id="saveState" class="ml-auto text-xs text-gray-500"></span></header> <main class="h-[calc(100vh-3rem)] grid grid-cols-[17rem_1fr] overflow-hidden"><aside class="border-r border-gray-200 bg-white flex flex-col min-h-0"><div class="p-3 border-b border-gray-200 space-y-2"><label class="block text-xs font-semibold text-gray-500">Library</label> <div class="flex gap-2"><select id="librarySelect" class="field flex-1"></select> <button id="btnAddLibrary" class="btn">+</button></div> <input id="libraryName" class="field w-full" placeholder="Library name"/></div> <div class="p-3 border-b border-gray-200 flex gap-2"><button id="btnNewShape" class="btn btn-primary flex-1">New shape</button> <button id="btnDeleteShape" class="btn btn-danger">Delete</button></div> <div id="shapeList" class="flex-1 overflow-y-auto p-2 space-y-1"></div></aside> <section class="min-w-0 min-h-0 overflow-y-auto p-5"><div class="grid grid-cols-[minmax(20rem,34rem)_minmax(20rem,1fr)] gap-5 items-start"><div class="space-y-3"><div id="previewStage"><img id="previewImage" alt=""/></div> <p class="text-xs text-gray-500">Click on the image to add an anchor. Drag anchors to refine their
|
|
159
|
+
position.</p></div> <div class="space-y-4"><div class="grid grid-cols-2 gap-3"><label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Shape name</span> <input id="shapeName" class="field w-full" placeholder="Shape name"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Image / SVG</span> <input id="imageFile" type="file" accept="image/*,.svg" class="block w-full text-sm"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Width</span> <input id="shapeWidth" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1"><span class="block text-xs font-semibold text-gray-500">Height</span> <input id="shapeHeight" type="number" min="16" max="1200" class="field w-full"/></label> <label class="space-y-1 col-span-2"><span class="block text-xs font-semibold text-gray-500">Text placement</span> <select id="labelPlacement" class="field w-full"><option> </option><option> </option><option> </option><option> </option><option> </option></select></label> <label class="col-span-2 flex items-start gap-2 rounded-md border border-gray-200 bg-white px-2 py-2 text-sm"><input id="shapeShowInDiagram" type="checkbox" class="mt-0.5 h-4 w-4 rounded border-gray-300 text-blue-600"/> <span class="space-y-0.5"><span class="block font-semibold text-gray-700"> </span> <span class="block text-xs text-gray-500"> </span></span></label></div> <div class="flex flex-wrap gap-2"><button id="btnDefaultAnchors" class="btn">Use 8 default anchors</button> <button id="btnClearAnchors" class="btn">Clear anchors</button> <button id="btnSaveShape" class="btn btn-primary">Save shape</button></div> <div><div class="flex items-center justify-between mb-2"><h2 class="text-xs font-semibold uppercase tracking-wide text-gray-500">Anchors</h2> <span id="anchorCount" class="text-xs text-gray-500"></span></div> <div id="anchorList" class="space-y-1"></div></div></div></div></section></main></div>`);function fv(e,t){Ge(t,!1),Vi(async()=>{try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{await la(`en`)}return uv()}),Ri();var n=dv(),r=R(n),i=R(r);Pe(4),N(r);var a=B(r,2),o=B(R(a),2),s=R(o),c=B(R(s),2),l=R(c),u=B(R(l),8),d=B(R(u),2),f=R(d),p=R(f,!0);N(f),f.value=f.__value=`below`;var m=B(f),h=R(m,!0);N(m),m.value=m.__value=`above`;var g=B(m),_=R(g,!0);N(g),g.value=g.__value=`right`;var v=B(g),y=R(v,!0);N(v),v.value=v.__value=`left`;var b=B(v),x=R(b,!0);N(b),b.value=b.__value=`center`,N(d),N(u);var S=B(u,2),C=B(R(S),2),w=R(C),T=R(w,!0);N(w);var E=B(w,2),D=R(E,!0);N(E),N(C),N(S),N(l),Pe(4),N(c),N(s),N(o),N(a),N(n),V((e,t,n,r,i,a,o)=>{K(p,e),K(h,t),K(_,n),K(y,r),K(x,i),K(T,a),K(D,o)},[()=>X(`shape_editor.label_placement.below`),()=>X(`shape_editor.label_placement.above`),()=>X(`shape_editor.label_placement.right`),()=>X(`shape_editor.label_placement.left`),()=>X(`shape_editor.label_placement.center`),()=>X(`shape_editor.show_in_diagram_label`),()=>X(`shape_editor.show_in_diagram_hint`)]),U(`click`,i,()=>history.back()),G(e,n),Ke()}Nr([`click`]);var pv=L({tasks:[],notes:[],links:[]}),mv=!1,hv=null;async function gv(){try{let e=await fetch(`/api/survival-kit`);if(e.ok){let t=await e.json();pv.tasks=Array.isArray(t.tasks)?t.tasks:[],pv.notes=Array.isArray(t.notes)?t.notes:[],pv.links=Array.isArray(t.links)?t.links:[]}}catch{}finally{mv=!0}}async function _v(){try{await fetch(`/api/survival-kit`,{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify({tasks:pv.tasks,notes:pv.notes,links:pv.links})})}catch{}}function vv(){mv&&(hv&&clearTimeout(hv),hv=setTimeout(()=>{hv=null,_v()},400))}var yv=W(`<button type="button"> </button>`),bv=W(`<p class="sk-empty svelte-lo2xyl"> </p>`),xv=W(`<div><button type="button" aria-label="toggle"></button> <span class="sk-task-text svelte-lo2xyl"> </span> <span class="sk-task-tag svelte-lo2xyl"> </span> <button type="button" class="sk-task-del svelte-lo2xyl">✕</button></div>`),Sv=W(`<div class="sk-panel-head"><h2 class="sk-panel-title"> <span class="sk-accent">.</span></h2> <p class="sk-panel-sub"> </p></div> <div class="sk-add-bar svelte-lo2xyl"><input type="text" class="svelte-lo2xyl"/> <select class="svelte-lo2xyl"><option> </option><option> </option><option> </option></select> <button type="button" class="sk-add-btn svelte-lo2xyl">+</button></div> <div class="sk-filters svelte-lo2xyl"></div> <div class="sk-tasks svelte-lo2xyl"><!></div>`,1);function Cv(e,t){Ge(t,!0);let n=F(``),r=F(`normal`),i=F(`all`),a=[{key:`all`,label:()=>X(`survival.tasks_filter_all`)},{key:`todo`,label:()=>X(`survival.tasks_filter_todo`)},{key:`done`,label:()=>X(`survival.tasks_filter_done`)},{key:`urgent`,label:()=>X(`survival.tasks_filter_urgent`)},{key:`normal`,label:()=>X(`survival.tasks_filter_normal`)},{key:`later`,label:()=>X(`survival.tasks_filter_later`)}];function o(e){return X(`survival.tasks_priority_${e}`)}let s=P(()=>pv.tasks.filter(e=>H(i)===`todo`?!e.done:H(i)===`done`?e.done:H(i)===`urgent`||H(i)===`normal`||H(i)===`later`?e.priority===H(i):!0));function c(){let e=H(n).trim();e&&(pv.tasks.unshift({id:Date.now(),text:e,priority:H(r),done:!1}),I(n,``),vv())}function l(e){let t=pv.tasks.find(t=>t.id===e);t&&(t.done=!t.done),vv()}function u(e){pv.tasks=pv.tasks.filter(t=>t.id!==e),vv()}var d=Sv(),f=z(d),p=R(f),m=R(p,!0);Pe(),N(p);var h=B(p,2),g=R(h,!0);N(h),N(f);var _=B(f,2),v=R(_);Ei(v);var y=B(v,2),b=R(y),x=R(b,!0);N(b),b.value=b.__value=`normal`;var S=B(b),C=R(S,!0);N(S),S.value=S.__value=`urgent`;var w=B(S),T=R(w,!0);N(w),w.value=w.__value=`later`,N(y);var E=B(y,2);N(_);var D=B(_,2);J(D,21,()=>a,Yr,(e,t)=>{var n=yv();let r;var a=R(n,!0);N(n),V(e=>{r=hi(n,1,`svelte-lo2xyl`,null,r,{active:H(i)===H(t).key}),K(a,e)},[()=>H(t).label()]),U(`click`,n,()=>I(i,H(t).key,!0)),G(e,n)}),N(D);var ee=B(D,2),O=R(ee),k=e=>{var t=bv(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`survival.tasks_empty`)]),G(e,t)},A=e=>{var t=Ur();J(z(t),17,()=>H(s),e=>e.id,(e,t)=>{var n=xv();let r;var i=R(n);let a;var s=B(i,2),c=R(s,!0);N(s);var d=B(s,2),f=R(d,!0);N(d);var p=B(d,2);N(n),V((e,o)=>{r=hi(n,1,`sk-task sk-task--${H(t).priority??``}`,`svelte-lo2xyl`,r,{done:H(t).done}),a=hi(i,1,`sk-check svelte-lo2xyl`,null,a,{checked:H(t).done}),K(c,H(t).text),K(f,e),Y(p,`title`,o)},[()=>o(H(t).priority),()=>X(`survival.tasks_delete_title`)]),U(`click`,i,()=>l(H(t).id)),U(`click`,p,()=>u(H(t).id)),G(e,n)}),G(e,t)};q(O,e=>{H(s).length===0?e(k):e(A,-1)}),N(ee),V((e,t,n,r,i,a)=>{K(m,e),K(g,t),Y(v,`placeholder`,n),K(x,r),K(C,i),K(T,a)},[()=>X(`survival.tasks_title`),()=>X(`survival.tasks_subtitle`),()=>X(`survival.tasks_input_placeholder`),()=>X(`survival.tasks_priority_normal`),()=>X(`survival.tasks_priority_urgent`),()=>X(`survival.tasks_priority_later`)]),U(`keydown`,v,e=>e.key===`Enter`&&c()),Mi(v,()=>H(n),e=>I(n,e)),bi(y,()=>H(r),e=>I(r,e)),U(`click`,E,c),G(e,d),Ke()}Nr([`keydown`,`click`]);var wv=[`t-green`,`t-violet`,`t-amber`,`t-sky`,`t-rose`,`t-teal`],Tv=W(`<div class="sk-modal-backdrop svelte-1rcj86" role="presentation"><div class="sk-modal svelte-1rcj86" role="dialog" aria-modal="true"><h3 class="sk-modal-title svelte-1rcj86"> </h3> <div class="sk-modal-body svelte-1rcj86"><!></div> <div class="sk-modal-actions svelte-1rcj86"><button type="button" class="sk-btn svelte-1rcj86"> </button> <button type="button"> </button></div></div></div>`);function Ev(e,t){Ge(t,!0);let n=Bi(t,`open`,3,!1),r=Bi(t,`title`,3,``),i=Bi(t,`confirmLabel`,19,()=>X(`common.save`)),a=Bi(t,`danger`,3,!1);function o(e){e.target===e.currentTarget&&t.onClose()}function s(e){e.key===`Escape`&&t.onClose()}var c=Ur(),l=z(c),u=e=>{var n=Tv(),c=R(n),l=R(c),u=R(l,!0);N(l);var d=B(l,2);ai(R(d),()=>t.children),N(d);var f=B(d,2),p=R(f),m=R(p,!0);N(p);var h=B(p,2);let g;var _=R(h,!0);N(h),N(f),N(c),N(n),V(e=>{K(u,r()),K(m,e),g=hi(h,1,`sk-btn sk-btn--primary svelte-1rcj86`,null,g,{"sk-btn--danger":a()}),K(_,i())},[()=>X(`common.cancel`)]),U(`click`,n,o),U(`keydown`,n,s),U(`click`,p,function(...e){t.onClose?.apply(this,e)}),U(`click`,h,function(...e){t.onConfirm?.apply(this,e)}),G(e,n)};q(l,e=>{n()&&e(u)}),G(e,c),Ke()}Nr([`click`,`keydown`]);var Dv=W(`<p class="sk-empty svelte-hpbata"> </p>`),Ov=W(`<strong> </strong>`),kv=W(`<p> </p>`),Av=W(`<div class="sk-pre-wrap svelte-hpbata"><pre> </pre> <button type="button" class="sk-copy svelte-hpbata"> </button></div>`),jv=W(`<li> </li>`),Mv=W(`<ul></ul>`),Nv=W(`<th> </th>`),Pv=W(`<td> </td>`),Fv=W(`<tr></tr>`),Iv=W(`<div class="sk-table-wrap svelte-hpbata"><table><thead><tr></tr></thead><tbody></tbody></table></div>`),Lv=W(`<div class="sk-bloc svelte-hpbata"><div class="sk-bloc-content svelte-hpbata"><!></div> <div class="sk-bloc-actions svelte-hpbata"><button type="button" class="sk-mini svelte-hpbata">✎</button> <button type="button" class="sk-mini sk-mini--del svelte-hpbata">✕</button></div></div>`),Rv=W(`<div><div class="sk-note-head svelte-hpbata"><h3 class="svelte-hpbata"> </h3> <div class="sk-note-actions svelte-hpbata"><button type="button" class="sk-mini svelte-hpbata">✎</button> <button type="button" class="sk-mini sk-mini--del svelte-hpbata">✕</button></div> <button type="button" class="sk-toggle svelte-hpbata" aria-label="toggle"><svg viewBox="0 0 10 6" width="10" height="6"><path d="M1 1 L5 5 L9 1" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div> <div class="sk-note-body svelte-hpbata"><!> <div class="sk-note-foot svelte-hpbata"><button type="button" class="sk-add-bloc svelte-hpbata"> </button></div></div></div>`),zv=W(`<option> </option>`),Bv=W(`<label for="sk-note-titre"> </label> <input id="sk-note-titre" type="text"/> <label for="sk-note-color"> </label> <select id="sk-note-color"></select>`,1),Vv=W(`<input id="sk-bloc-content" type="text"/>`),Hv=W(`<textarea id="sk-bloc-content" rows="6"></textarea>`),Uv=W(`<label for="sk-bloc-type"> </label> <select id="sk-bloc-type"><option> </option><option> </option><option> </option><option> </option><option> </option></select> <label for="sk-bloc-content"> </label> <!>`,1),Wv=W(`<div class="sk-panel-head"><h2 class="sk-panel-title"> <span class="sk-accent">.</span></h2> <p class="sk-panel-sub"> </p></div> <div class="sk-toolbar svelte-hpbata"><button type="button" class="sk-tool svelte-hpbata"> </button> <button type="button" class="sk-tool svelte-hpbata"> </button> <button type="button" class="sk-tool sk-tool--add svelte-hpbata"> </button></div> <div><!> <!></div> <!> <!>`,1);function Gv(e,t){Ge(t,!0);let n=F(!1),r=F(L({})),i=F(null),a=F(!1),o=F(-1),s=F(``),c=F(`t-green`),l=F(!1),u=F(-1),d=F(-1),f=F(`p`),p=F(``),m={"t-green":`survival.color_green`,"t-violet":`survival.color_violet`,"t-amber":`survival.color_amber`,"t-sky":`survival.color_sky`,"t-rose":`survival.color_rose`,"t-teal":`survival.color_teal`},h=P(()=>pv.notes.length>0&&pv.notes.every(e=>H(r)[e.id]));function g(e){H(r)[e]=!H(r)[e]}function _(){if(H(h))I(r,{},!0);else{let e={};pv.notes.forEach(t=>e[t.id]=!0),I(r,e,!0)}}function v(){I(o,-1),I(s,``),I(c,`t-green`),I(a,!0)}function y(e){I(o,e,!0),I(s,pv.notes[e].titre,!0),I(c,pv.notes[e].theme,!0),I(a,!0)}function b(){let e=H(s).trim();if(e){if(H(o)===-1){let t=Date.now();pv.notes.push({id:t,theme:H(c),titre:e,blocs:[]}),H(r)[t]=!0}else pv.notes[H(o)].titre=e,pv.notes[H(o)].theme=H(c);vv(),I(a,!1)}}async function x(e){await t.confirmDelete(X(`survival.confirm_del_note_title`),X(`survival.confirm_del_note_msg`))&&(pv.notes.splice(e,1),vv())}function S(e){return e.type===`ul`?e.items.join(`
|
|
160
160
|
`):e.type===`table`?[e.headers.join(` | `),...e.rows.map(e=>e.join(` | `))].join(`
|
|
161
|
-
`):e.content}function C(e){I(u,e,!0),I(d,-1),I(f,`p`),I(p,``),I(l,!0)}function w(e,t){I(u,e,!0),I(d,t,!0);let n=
|
|
161
|
+
`):e.content}function C(e){I(u,e,!0),I(d,-1),I(f,`p`),I(p,``),I(l,!0)}function w(e,t){I(u,e,!0),I(d,t,!0);let n=pv.notes[e].blocs[t];I(f,n.type,!0),I(p,S(n),!0),I(l,!0)}function T(){let e=H(p);if(!e.trim())return null;if(H(f)===`ul`){let t=e.split(`
|
|
162
162
|
`).map(e=>e.trim()).filter(Boolean);return t.length?{type:`ul`,items:t}:null}if(H(f)===`table`){let t=e.split(`
|
|
163
|
-
`).map(e=>e.trim()).filter(Boolean);return t.length?{type:`table`,headers:t[0].split(`|`).map(e=>e.trim()),rows:t.slice(1).map(e=>e.split(`|`).map(e=>e.trim()))}:null}return{type:H(f),content:e}}function E(){let e=T();e&&(H(d)===-1?uv.notes[H(u)].blocs.push(e):uv.notes[H(u)].blocs[H(d)]=e,hv(),I(l,!1))}async function D(e,n){await t.confirmDelete(X(`survival.confirm_del_bloc_title`),X(`survival.irreversible`))&&(uv.notes[e].blocs.splice(n,1),hv())}async function ee(e,t){try{await navigator.clipboard.writeText(e),I(i,t,!0),setTimeout(()=>I(i,H(i)===t?null:H(i),!0),1500)}catch{}}let O=P(()=>H(f)===`ul`?X(`survival.modal_bloc_placeholder_ul`):H(f)===`pre`?X(`survival.modal_bloc_placeholder_pre`):H(f)===`table`?X(`survival.modal_bloc_placeholder_table`):H(f)===`b`?X(`survival.modal_bloc_placeholder_b`):X(`survival.modal_bloc_placeholder_p`));var k=Vv(),A=z(k),te=R(A),ne=R(te,!0);Pe(),N(te);var re=B(te,2),ie=R(re,!0);N(re),N(A);var ae=B(A,2),oe=R(ae),se=R(oe,!0);N(oe);var ce=B(oe,2),le=R(ce,!0);N(ce);var ue=B(ce,2),de=R(ue,!0);N(ue),N(ae);var fe=B(ae,2);let pe;var me=R(fe),he=e=>{var t=wv(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`survival.notes_empty`)]),G(e,t)};q(me,e=>{uv.notes.length===0&&e(he)}),J(B(me,2),19,()=>uv.notes,e=>e.id,(e,t,n)=>{let a=P(()=>!H(r)[H(t).id]);var o=Fv();let s;var c=R(o),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d),p=B(f,2);N(d);var m=B(d,2);N(c);var h=B(c,2),_=R(h);J(_,17,()=>H(t).blocs,Yr,(e,r,a)=>{var o=Pv(),s=R(o),c=R(s),l=e=>{var t=Tv(),n=R(t,!0);N(t),V(()=>K(n,H(r).content)),G(e,t)},u=e=>{var t=Ev(),n=R(t,!0);N(t),V(()=>K(n,H(r).content)),G(e,t)},d=e=>{let n=P(()=>`${H(t).id}-${a}`);var o=Dv(),s=R(o),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(o),V(e=>{K(c,H(r).content),K(u,e)},[()=>H(i)===H(n)?X(`survival.notes_btn_copied`):X(`survival.notes_btn_copy`)]),U(`click`,l,()=>ee(H(r).content,H(n))),G(e,o)},f=e=>{var t=kv();J(t,21,()=>H(r).items,Yr,(e,t)=>{var n=Ov(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(t),G(e,t)},p=e=>{var t=Nv(),n=R(t),i=R(n),a=R(i);J(a,21,()=>H(r).headers,Yr,(e,t)=>{var n=Av(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(a),N(i);var o=B(i);J(o,21,()=>H(r).rows,Yr,(e,t)=>{var n=Mv();J(n,21,()=>H(t),Yr,(e,t)=>{var n=jv(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(n),G(e,n)}),N(o),N(n),N(t),G(e,t)};q(c,e=>{H(r).type===`b`?e(l):H(r).type===`p`?e(u,1):H(r).type===`pre`?e(d,2):H(r).type===`ul`?e(f,3):H(r).type===`table`&&e(p,4)}),N(s);var m=B(s,2),h=R(m),g=B(h,2);N(m),N(o),U(`click`,h,()=>w(H(n),a)),U(`click`,g,()=>D(H(n),a)),G(e,o)});var v=B(_,2),b=R(v),S=R(b,!0);N(b),N(v),N(h),N(o),V(e=>{s=hi(o,1,`sk-note ${H(t).theme??``}`,`svelte-hpbata`,s,{collapsed:H(a)}),K(u,H(t).titre),K(S,e)},[()=>X(`survival.notes_btn_add_bloc`)]),U(`click`,f,()=>y(H(n))),U(`click`,p,()=>x(H(n))),U(`click`,m,()=>g(H(t).id)),U(`click`,b,()=>C(H(n))),G(e,o)}),N(fe);var ge=B(fe,2);{let e=P(()=>H(o)===-1?X(`survival.modal_note_title`):X(`survival.modal_edit_note_title`)),t=P(()=>H(o)===-1?X(`common.create`):X(`common.save`));Cv(ge,{get open(){return H(a)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:b,onClose:()=>I(a,!1),children:(e,t)=>{var n=Lv(),r=z(n),i=R(r,!0);N(r);var a=B(r,2);Ei(a);var o=B(a,2),l=R(o,!0);N(o);var u=B(o,2);J(u,21,()=>xv,Yr,(e,t)=>{var n=Iv(),r=R(n,!0);N(n);var i={};V(e=>{K(r,e),i!==(i=H(t))&&(n.value=(n.__value=H(t))??``)},[()=>X(m[H(t)])]),G(e,n)}),N(u),V((e,t,n)=>{K(i,e),Y(a,`placeholder`,t),K(l,n)},[()=>X(`survival.modal_note_label_title`),()=>X(`survival.modal_note_placeholder`),()=>X(`survival.modal_label_color`)]),U(`keydown`,a,e=>e.key===`Enter`&&b()),Mi(a,()=>H(s),e=>I(s,e)),bi(u,()=>H(c),e=>I(c,e)),G(e,n)},$$slots:{default:!0}})}var _e=B(ge,2);{let e=P(()=>H(d)===-1?X(`survival.modal_bloc_new`):X(`survival.modal_bloc_edit`)),t=P(()=>X(`common.save`));Cv(_e,{get open(){return H(l)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:E,onClose:()=>I(l,!1),children:(e,t)=>{var n=Bv(),r=z(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o),o.value=o.__value=`b`;var c=B(o),l=R(c,!0);N(c),c.value=c.__value=`p`;var u=B(c),d=R(u,!0);N(u),u.value=u.__value=`pre`;var m=B(u),h=R(m,!0);N(m),m.value=m.__value=`ul`;var g=B(m),_=R(g,!0);N(g),g.value=g.__value=`table`,N(a);var v=B(a,2),y=R(v,!0);N(v);var b=B(v,2),x=e=>{var t=Rv();Ei(t),V(()=>Y(t,`placeholder`,H(O))),U(`keydown`,t,e=>e.key===`Enter`&&E()),Mi(t,()=>H(p),e=>I(p,e)),G(e,t)},S=e=>{var t=zv();vn(t),V(()=>Y(t,`placeholder`,H(O))),Mi(t,()=>H(p),e=>I(p,e)),G(e,t)};q(b,e=>{H(f)===`b`?e(x):e(S,-1)}),V((e,t,n,r,a,o,c)=>{K(i,e),K(s,t),K(l,n),K(d,r),K(h,a),K(_,o),K(y,c)},[()=>X(`survival.modal_bloc_label_type`),()=>X(`survival.modal_bloc_type_b`),()=>X(`survival.modal_bloc_type_p`),()=>X(`survival.modal_bloc_type_pre`),()=>X(`survival.modal_bloc_type_ul`),()=>X(`survival.modal_bloc_type_table`),()=>X(`survival.modal_bloc_label_content`)]),bi(a,()=>H(f),e=>I(f,e)),G(e,n)},$$slots:{default:!0}})}V((e,t,r,i,a)=>{K(ne,e),K(ie,t),K(se,r),K(le,i),K(de,a),pe=hi(fe,1,`sk-notes svelte-hpbata`,null,pe,{"edit-mode":H(n)})},[()=>X(`survival.notes_title`),()=>X(`survival.notes_subtitle`),()=>H(n)?X(`survival.btn_read_mode`):X(`survival.btn_edit_mode`),()=>H(h)?X(`survival.btn_collapse_all`):X(`survival.btn_expand_all`),()=>X(`survival.notes_btn_add`)]),U(`click`,oe,()=>I(n,!H(n))),U(`click`,ce,_),U(`click`,ue,v),G(e,k),Ke()}Nr([`click`,`keydown`]);var Uv=W(`<p class="sk-empty svelte-1j811iq"> </p>`),Wv=W(`<span class="sk-link-desc svelte-1j811iq"> </span>`),Gv=W(`<a target="_blank" rel="noopener" class="sk-link svelte-1j811iq"><span class="sk-link-text svelte-1j811iq"><span class="sk-link-name svelte-1j811iq"> </span><!></span> <span class="sk-arrow svelte-1j811iq">↗</span> <span class="sk-link-actions svelte-1j811iq"><button type="button" class="sk-mini svelte-1j811iq">✎</button> <button type="button" class="sk-mini sk-mini--del svelte-1j811iq">✕</button></span></a>`),Kv=W(`<section><div class="sk-cat-head svelte-1j811iq"><h3 class="svelte-1j811iq"> </h3> <div class="sk-cat-actions svelte-1j811iq"><button type="button" class="sk-mini svelte-1j811iq">+</button> <button type="button" class="sk-mini sk-mini--del svelte-1j811iq">✕</button></div> <button type="button" class="sk-toggle svelte-1j811iq" aria-label="toggle"><svg viewBox="0 0 10 6" width="10" height="6"><path d="M1 1 L5 5 L9 1" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div> <div class="sk-links svelte-1j811iq"></div></section>`),qv=W(`<option> </option>`),Jv=W(`<label for="sk-cat-name"> </label> <input id="sk-cat-name" type="text"/> <label for="sk-cat-color"> </label> <select id="sk-cat-color"></select>`,1),Yv=W(`<label for="sk-link-nom"> </label> <input id="sk-link-nom" type="text"/> <label for="sk-link-desc"> </label> <input id="sk-link-desc" type="text"/> <label for="sk-link-url"> </label> <input id="sk-link-url" type="text" placeholder="https://…"/>`,1),Xv=W(`<div class="sk-panel-head"><h2 class="sk-panel-title"> <span class="sk-accent">.</span></h2> <p class="sk-panel-sub"> </p></div> <div class="sk-toolbar svelte-1j811iq"><button type="button" class="sk-tool svelte-1j811iq"> </button> <button type="button" class="sk-tool svelte-1j811iq"> </button> <button type="button" class="sk-tool sk-tool--add svelte-1j811iq"> </button></div> <div><!> <!></div> <!> <!>`,1);function Zv(e,t){Ge(t,!0);let n=F(!1),r=F(L({})),i=F(!1),a=F(``),o=F(`t-green`),s=F(!1),c=F(-1),l=F(-1),u=F(``),d=F(``),f=F(``),p={"t-green":`survival.color_green`,"t-violet":`survival.color_violet`,"t-amber":`survival.color_amber`,"t-sky":`survival.color_sky`,"t-rose":`survival.color_rose`,"t-teal":`survival.color_teal`},m=P(()=>uv.links.length>0&&uv.links.every(e=>H(r)[e.titre]));function h(e){H(r)[e]=!H(r)[e]}function g(){if(H(m))I(r,{},!0);else{let e={};uv.links.forEach(t=>e[t.titre]=!0),I(r,e,!0)}}function _(){I(a,``),I(o,`t-green`),I(i,!0)}function v(){let e=H(a).trim();e&&(uv.links.push({theme:H(o),titre:e,liens:[]}),hv(),I(i,!1))}async function y(e){uv.links[e],await t.confirmDelete(X(`survival.confirm_del_cat_title`),X(`survival.confirm_del_cat_msg`))&&(uv.links.splice(e,1),hv())}function b(e){I(c,e,!0),I(l,-1),I(u,``),I(d,``),I(f,``),I(s,!0)}function x(e,t,n){e.preventDefault();let r=uv.links[t].liens[n];I(c,t,!0),I(l,n,!0),I(u,r.nom,!0),I(d,r.desc,!0),I(f,r.url,!0),I(s,!0)}function S(){let e=H(u).trim(),t=H(f).trim();if(!e||!t)return;let n={nom:e,desc:H(d).trim(),url:t};H(l)===-1?uv.links[H(c)].liens.push(n):uv.links[H(c)].liens[H(l)]=n,hv(),I(s,!1)}async function C(e,n,r){e.preventDefault(),await t.confirmDelete(X(`survival.confirm_del_link_title`),X(`survival.irreversible`))&&(uv.links[n].liens.splice(r,1),hv())}var w=Xv(),T=z(w),E=R(T),D=R(E,!0);Pe(),N(E);var ee=B(E,2),O=R(ee,!0);N(ee),N(T);var k=B(T,2),A=R(k),te=R(A,!0);N(A);var ne=B(A,2),re=R(ne,!0);N(ne);var ie=B(ne,2),ae=R(ie,!0);N(ie),N(k);var oe=B(k,2);let se;var ce=R(oe),le=e=>{var t=Uv(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`survival.links_empty`)]),G(e,t)};q(ce,e=>{uv.links.length===0&&e(le)}),J(B(ce,2),19,()=>uv.links,(e,t)=>e.titre+t,(e,t,n)=>{let i=P(()=>!H(r)[H(t).titre]);var a=Kv();let o;var s=R(a),c=R(s),l=R(c,!0);N(c);var u=B(c,2),d=R(u),f=B(d,2);N(u);var p=B(u,2);N(s);var m=B(s,2);J(m,21,()=>H(t).liens,Yr,(e,t,r)=>{var i=Gv(),a=R(i),o=R(a),s=R(o,!0);N(o);var c=B(o),l=e=>{var n=Wv(),r=R(n);N(n),V(()=>K(r,`— ${H(t).desc??``}`)),G(e,n)};q(c,e=>{H(t).desc&&e(l)}),N(a);var u=B(a,4),d=R(u),f=B(d,2);N(u),N(i),V((e,n)=>{Y(i,`href`,H(t).url),K(s,H(t).nom),Y(d,`title`,e),Y(f,`title`,n)},[()=>X(`survival.links_edit_link_title`),()=>X(`survival.links_del_link_title`)]),U(`click`,d,e=>x(e,H(n),r)),U(`click`,f,e=>C(e,H(n),r)),G(e,i)}),N(m),N(a),V((e,n)=>{o=hi(a,1,`sk-cat ${H(t).theme??``}`,`svelte-1j811iq`,o,{collapsed:H(i)}),K(l,H(t).titre),Y(d,`title`,e),Y(f,`title`,n)},[()=>X(`survival.links_add_link_title`),()=>X(`survival.links_del_cat_title`)]),U(`click`,d,()=>b(H(n))),U(`click`,f,()=>y(H(n))),U(`click`,p,()=>h(H(t).titre)),G(e,a)}),N(oe);var ue=B(oe,2);{let e=P(()=>X(`survival.modal_cat_title`)),t=P(()=>X(`common.add`));Cv(ue,{get open(){return H(i)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:v,onClose:()=>I(i,!1),children:(e,t)=>{var n=Jv(),r=z(n),i=R(r,!0);N(r);var s=B(r,2);Ei(s);var c=B(s,2),l=R(c,!0);N(c);var u=B(c,2);J(u,21,()=>xv,Yr,(e,t)=>{var n=qv(),r=R(n,!0);N(n);var i={};V(e=>{K(r,e),i!==(i=H(t))&&(n.value=(n.__value=H(t))??``)},[()=>X(p[H(t)])]),G(e,n)}),N(u),V((e,t,n)=>{K(i,e),Y(s,`placeholder`,t),K(l,n)},[()=>X(`survival.modal_cat_label_name`),()=>X(`survival.modal_cat_placeholder_name`),()=>X(`survival.modal_label_color`)]),U(`keydown`,s,e=>e.key===`Enter`&&v()),Mi(s,()=>H(a),e=>I(a,e)),bi(u,()=>H(o),e=>I(o,e)),G(e,n)},$$slots:{default:!0}})}var de=B(ue,2);{let e=P(()=>H(l)===-1?X(`survival.modal_link_title`):X(`survival.modal_edit_link_title`)),t=P(()=>H(l)===-1?X(`common.add`):X(`common.save`));Cv(de,{get open(){return H(s)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:S,onClose:()=>I(s,!1),children:(e,t)=>{var n=Yv(),r=z(n),i=R(r,!0);N(r);var a=B(r,2);Ei(a);var o=B(a,2),s=R(o,!0);N(o);var c=B(o,2);Ei(c);var l=B(c,2),p=R(l,!0);N(l);var m=B(l,2);Ei(m),V((e,t,n,r,o)=>{K(i,e),Y(a,`placeholder`,t),K(s,n),Y(c,`placeholder`,r),K(p,o)},[()=>X(`survival.modal_link_label_name`),()=>X(`survival.modal_link_placeholder_name`),()=>X(`survival.modal_link_label_desc`),()=>X(`survival.modal_link_placeholder_desc`),()=>X(`survival.modal_link_label_url`)]),Mi(a,()=>H(u),e=>I(u,e)),Mi(c,()=>H(d),e=>I(d,e)),U(`keydown`,m,e=>e.key===`Enter`&&S()),Mi(m,()=>H(f),e=>I(f,e)),G(e,n)},$$slots:{default:!0}})}V((e,t,r,i,a)=>{K(D,e),K(O,t),K(te,r),K(re,i),K(ae,a),se=hi(oe,1,`sk-cats svelte-1j811iq`,null,se,{"edit-mode":H(n)})},[()=>X(`survival.links_title`),()=>X(`survival.links_subtitle`),()=>H(n)?X(`survival.btn_read_mode`):X(`survival.btn_edit_mode`),()=>H(m)?X(`survival.btn_collapse_all`):X(`survival.btn_expand_all`),()=>X(`survival.links_btn_add_cat`)]),U(`click`,A,()=>I(n,!H(n))),U(`click`,ne,g),U(`click`,ie,_),G(e,w),Ke()}Nr([`click`,`keydown`]);var Qv=W(`<button class="ghost-button"><i class="fa-solid fa-cloud"></i></button> <button title="Toggle dark mode" class="ghost-button" aria-label="Toggle dark mode"> </button>`,1),$v=W(`<p class="sk-loading svelte-ha6eja"> </p>`),ey=W(`<div class="sk-grid svelte-ha6eja"><section class="sk-col svelte-ha6eja"><div class="sk-inner svelte-ha6eja"><!></div></section> <section class="sk-col svelte-ha6eja"><div class="sk-inner svelte-ha6eja"><!></div></section> <section class="sk-col svelte-ha6eja"><div class="sk-inner svelte-ha6eja"><!></div></section></div>`),ty=W(`<!> <div class="app-shell sk-root svelte-ha6eja"><div class="sk-menu-trigger svelte-ha6eja" role="presentation"></div> <div><!></div> <!></div> <!>`,1);function ny(e,t){Ge(t,!0);let n=F(null),r=F(!1),i=F(!1),a=F(!1),o=F(!1);function s(e){I(o,e<=(H(o)?84:10))}On(()=>{let e=e=>s(e.clientY);return window.addEventListener(`mousemove`,e),()=>window.removeEventListener(`mousemove`,e)});async function c(e,t){return H(n).show({title:e,message:t,confirmLabel:X(`survival.irreversible_delete`),cancelLabel:X(`common.cancel`),danger:!0})}function l(e){I(i,e,!0),document.documentElement.classList.toggle(`dark`,e)}function u(){let e=!1;try{let t=localStorage.getItem(`ld-dark`);e=t===null?window.matchMedia(`(prefers-color-scheme: dark)`).matches:t===`true`}catch{}l(e)}function d(){l(!H(i));try{localStorage.setItem(`ld-dark`,String(H(i)))}catch{}}Vi(async()=>{u();try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}await pv(),I(r,!0)});var f=ty(),p=z(f);Li(wl(p,{}),e=>I(n,e,!0),()=>H(n));var m=B(p,2),h=R(m),g=B(h,2);let _;var v=R(g);{let e=e=>{var t=Qv(),n=z(t),r=B(n,2),o=R(r,!0);N(r),V((e,t)=>{Y(n,`title`,e),Y(n,`aria-label`,t),K(o,H(i)?`☀`:`☾`)},[()=>X(`nav.word_cloud`),()=>X(`nav.word_cloud`)]),U(`click`,n,()=>I(a,!0)),U(`click`,r,d),G(e,t)},t=P(()=>X(`survival.title`)),n=P(()=>X(`survival.subtitle`));Ja(v,{get title(){return H(t)},get subtitle(){return H(n)},actions:e,$$slots:{actions:!0}})}N(g);var y=B(g,2),b=e=>{var t=$v(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},x=e=>{var t=ey(),n=R(t),r=R(n);bv(R(r),{}),N(r),N(n);var i=B(n,2),a=R(i);Hv(R(a),{confirmDelete:c}),N(a),N(i);var o=B(i,2),s=R(o);Zv(R(s),{confirmDelete:c}),N(s),N(o),N(t),G(e,t)};q(y,e=>{H(r)?e(x,-1):e(b)}),N(m),F_(B(m,2),{get open(){return H(a)},onclose:()=>I(a,!1)}),V(()=>_=hi(g,1,`sk-menu-drawer svelte-ha6eja`,null,_,{revealed:H(o)})),Mr(`mouseenter`,h,()=>I(o,!0)),G(e,f),Ke()}Nr([`click`]);var ry=W(`<p style="padding:2rem"> </p>`);function iy(e,t){Ge(t,!0);function n(e){return e.length>1?e.replace(/\/+$/,``):e}let r=new Set([`/`,`/admin`,`/workspace`,`/blueprint`,`/diagram`,`/shape-editor`,`/context`,`/files`,`/survival-kit`]),i=F(L(n(window.location.pathname)));function a(e){let t=new URL(e,window.location.href),r=n(t.pathname),a=`${r}${t.search}${t.hash}`;if(a===`${window.location.pathname}${window.location.search}${window.location.hash}`){Da();return}history.pushState(null,``,a),I(i,r,!0),Da(),window.dispatchEvent(new PopStateEvent(`popstate`))}function o(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let t=e.target instanceof Element?e.target.closest(`a[href]`):null;if(!(t instanceof HTMLAnchorElement)||t.target||t.hasAttribute(`download`))return;let i=new URL(t.href,window.location.href);if(i.origin!==window.location.origin)return;let o=n(i.pathname);r.has(o)&&(e.preventDefault(),a(`${o}${i.search}${i.hash}`))}Vi(()=>(Da(),document.addEventListener(`click`,o,!0),()=>{document.removeEventListener(`click`,o,!0)})),window.addEventListener(`popstate`,()=>{I(i,n(window.location.pathname),!0),Da()}),On(()=>{H(i)===`/blueprint`?document.documentElement.setAttribute(`data-blueprint`,``):document.documentElement.removeAttribute(`data-blueprint`)});function s(e){a(e)}var c=Ur(),l=z(c),u=e=>{so(e,{navigate:s})},d=e=>{Su(e,{})},f=e=>{Lp(e,{})},p=e=>{Yp(e,{})},m=e=>{km(e,{navigate:s})},h=e=>{q_(e,{})},g=e=>{lv(e,{})},_=e=>{ny(e,{})},v=e=>{V_(e,{})},y=e=>{var t=ry(),n=R(t);N(t),V(()=>K(n,`Route "${H(i)??``}" — not yet migrated.`)),G(e,t)};q(l,e=>{H(i)===`/admin`?e(u):H(i)===`/blueprint`?e(d,1):H(i)===`/workspace`?e(f,2):H(i)===`/files`?e(p,3):H(i)===`/context`?e(m,4):H(i)===`/diagram`?e(h,5):H(i)===`/shape-editor`?e(g,6):H(i)===`/survival-kit`?e(_,7):H(i)===`/`?e(v,8):e(y,-1)}),G(e,c),Ke()}Da(),Wr(iy,{target:document.getElementById(`app`)});export{tv as a,av as c,J_ as d,la as f,nv as i,ov as l,ev as n,iv as o,X as p,rv as r,$_ as s,X_ as t,Y_ as u};
|
|
163
|
+
`).map(e=>e.trim()).filter(Boolean);return t.length?{type:`table`,headers:t[0].split(`|`).map(e=>e.trim()),rows:t.slice(1).map(e=>e.split(`|`).map(e=>e.trim()))}:null}return{type:H(f),content:e}}function E(){let e=T();e&&(H(d)===-1?pv.notes[H(u)].blocs.push(e):pv.notes[H(u)].blocs[H(d)]=e,vv(),I(l,!1))}async function D(e,n){await t.confirmDelete(X(`survival.confirm_del_bloc_title`),X(`survival.irreversible`))&&(pv.notes[e].blocs.splice(n,1),vv())}async function ee(e,t){try{await navigator.clipboard.writeText(e),I(i,t,!0),setTimeout(()=>I(i,H(i)===t?null:H(i),!0),1500)}catch{}}let O=P(()=>H(f)===`ul`?X(`survival.modal_bloc_placeholder_ul`):H(f)===`pre`?X(`survival.modal_bloc_placeholder_pre`):H(f)===`table`?X(`survival.modal_bloc_placeholder_table`):H(f)===`b`?X(`survival.modal_bloc_placeholder_b`):X(`survival.modal_bloc_placeholder_p`));var k=Wv(),A=z(k),te=R(A),ne=R(te,!0);Pe(),N(te);var re=B(te,2),ie=R(re,!0);N(re),N(A);var ae=B(A,2),oe=R(ae),se=R(oe,!0);N(oe);var ce=B(oe,2),le=R(ce,!0);N(ce);var ue=B(ce,2),de=R(ue,!0);N(ue),N(ae);var fe=B(ae,2);let pe;var me=R(fe),he=e=>{var t=Dv(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`survival.notes_empty`)]),G(e,t)};q(me,e=>{pv.notes.length===0&&e(he)}),J(B(me,2),19,()=>pv.notes,e=>e.id,(e,t,n)=>{let a=P(()=>!H(r)[H(t).id]);var o=Rv();let s;var c=R(o),l=R(c),u=R(l,!0);N(l);var d=B(l,2),f=R(d),p=B(f,2);N(d);var m=B(d,2);N(c);var h=B(c,2),_=R(h);J(_,17,()=>H(t).blocs,Yr,(e,r,a)=>{var o=Lv(),s=R(o),c=R(s),l=e=>{var t=Ov(),n=R(t,!0);N(t),V(()=>K(n,H(r).content)),G(e,t)},u=e=>{var t=kv(),n=R(t,!0);N(t),V(()=>K(n,H(r).content)),G(e,t)},d=e=>{let n=P(()=>`${H(t).id}-${a}`);var o=Av(),s=R(o),c=R(s,!0);N(s);var l=B(s,2),u=R(l,!0);N(l),N(o),V(e=>{K(c,H(r).content),K(u,e)},[()=>H(i)===H(n)?X(`survival.notes_btn_copied`):X(`survival.notes_btn_copy`)]),U(`click`,l,()=>ee(H(r).content,H(n))),G(e,o)},f=e=>{var t=Mv();J(t,21,()=>H(r).items,Yr,(e,t)=>{var n=jv(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(t),G(e,t)},p=e=>{var t=Iv(),n=R(t),i=R(n),a=R(i);J(a,21,()=>H(r).headers,Yr,(e,t)=>{var n=Nv(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(a),N(i);var o=B(i);J(o,21,()=>H(r).rows,Yr,(e,t)=>{var n=Fv();J(n,21,()=>H(t),Yr,(e,t)=>{var n=Pv(),r=R(n,!0);N(n),V(()=>K(r,H(t))),G(e,n)}),N(n),G(e,n)}),N(o),N(n),N(t),G(e,t)};q(c,e=>{H(r).type===`b`?e(l):H(r).type===`p`?e(u,1):H(r).type===`pre`?e(d,2):H(r).type===`ul`?e(f,3):H(r).type===`table`&&e(p,4)}),N(s);var m=B(s,2),h=R(m),g=B(h,2);N(m),N(o),U(`click`,h,()=>w(H(n),a)),U(`click`,g,()=>D(H(n),a)),G(e,o)});var v=B(_,2),b=R(v),S=R(b,!0);N(b),N(v),N(h),N(o),V(e=>{s=hi(o,1,`sk-note ${H(t).theme??``}`,`svelte-hpbata`,s,{collapsed:H(a)}),K(u,H(t).titre),K(S,e)},[()=>X(`survival.notes_btn_add_bloc`)]),U(`click`,f,()=>y(H(n))),U(`click`,p,()=>x(H(n))),U(`click`,m,()=>g(H(t).id)),U(`click`,b,()=>C(H(n))),G(e,o)}),N(fe);var ge=B(fe,2);{let e=P(()=>H(o)===-1?X(`survival.modal_note_title`):X(`survival.modal_edit_note_title`)),t=P(()=>H(o)===-1?X(`common.create`):X(`common.save`));Ev(ge,{get open(){return H(a)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:b,onClose:()=>I(a,!1),children:(e,t)=>{var n=Bv(),r=z(n),i=R(r,!0);N(r);var a=B(r,2);Ei(a);var o=B(a,2),l=R(o,!0);N(o);var u=B(o,2);J(u,21,()=>wv,Yr,(e,t)=>{var n=zv(),r=R(n,!0);N(n);var i={};V(e=>{K(r,e),i!==(i=H(t))&&(n.value=(n.__value=H(t))??``)},[()=>X(m[H(t)])]),G(e,n)}),N(u),V((e,t,n)=>{K(i,e),Y(a,`placeholder`,t),K(l,n)},[()=>X(`survival.modal_note_label_title`),()=>X(`survival.modal_note_placeholder`),()=>X(`survival.modal_label_color`)]),U(`keydown`,a,e=>e.key===`Enter`&&b()),Mi(a,()=>H(s),e=>I(s,e)),bi(u,()=>H(c),e=>I(c,e)),G(e,n)},$$slots:{default:!0}})}var _e=B(ge,2);{let e=P(()=>H(d)===-1?X(`survival.modal_bloc_new`):X(`survival.modal_bloc_edit`)),t=P(()=>X(`common.save`));Ev(_e,{get open(){return H(l)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:E,onClose:()=>I(l,!1),children:(e,t)=>{var n=Uv(),r=z(n),i=R(r,!0);N(r);var a=B(r,2),o=R(a),s=R(o,!0);N(o),o.value=o.__value=`b`;var c=B(o),l=R(c,!0);N(c),c.value=c.__value=`p`;var u=B(c),d=R(u,!0);N(u),u.value=u.__value=`pre`;var m=B(u),h=R(m,!0);N(m),m.value=m.__value=`ul`;var g=B(m),_=R(g,!0);N(g),g.value=g.__value=`table`,N(a);var v=B(a,2),y=R(v,!0);N(v);var b=B(v,2),x=e=>{var t=Vv();Ei(t),V(()=>Y(t,`placeholder`,H(O))),U(`keydown`,t,e=>e.key===`Enter`&&E()),Mi(t,()=>H(p),e=>I(p,e)),G(e,t)},S=e=>{var t=Hv();vn(t),V(()=>Y(t,`placeholder`,H(O))),Mi(t,()=>H(p),e=>I(p,e)),G(e,t)};q(b,e=>{H(f)===`b`?e(x):e(S,-1)}),V((e,t,n,r,a,o,c)=>{K(i,e),K(s,t),K(l,n),K(d,r),K(h,a),K(_,o),K(y,c)},[()=>X(`survival.modal_bloc_label_type`),()=>X(`survival.modal_bloc_type_b`),()=>X(`survival.modal_bloc_type_p`),()=>X(`survival.modal_bloc_type_pre`),()=>X(`survival.modal_bloc_type_ul`),()=>X(`survival.modal_bloc_type_table`),()=>X(`survival.modal_bloc_label_content`)]),bi(a,()=>H(f),e=>I(f,e)),G(e,n)},$$slots:{default:!0}})}V((e,t,r,i,a)=>{K(ne,e),K(ie,t),K(se,r),K(le,i),K(de,a),pe=hi(fe,1,`sk-notes svelte-hpbata`,null,pe,{"edit-mode":H(n)})},[()=>X(`survival.notes_title`),()=>X(`survival.notes_subtitle`),()=>H(n)?X(`survival.btn_read_mode`):X(`survival.btn_edit_mode`),()=>H(h)?X(`survival.btn_collapse_all`):X(`survival.btn_expand_all`),()=>X(`survival.notes_btn_add`)]),U(`click`,oe,()=>I(n,!H(n))),U(`click`,ce,_),U(`click`,ue,v),G(e,k),Ke()}Nr([`click`,`keydown`]);var Kv=W(`<p class="sk-empty svelte-1j811iq"> </p>`),qv=W(`<span class="sk-link-desc svelte-1j811iq"> </span>`),Jv=W(`<a target="_blank" rel="noopener" class="sk-link svelte-1j811iq"><span class="sk-link-text svelte-1j811iq"><span class="sk-link-name svelte-1j811iq"> </span><!></span> <span class="sk-arrow svelte-1j811iq">↗</span> <span class="sk-link-actions svelte-1j811iq"><button type="button" class="sk-mini svelte-1j811iq">✎</button> <button type="button" class="sk-mini sk-mini--del svelte-1j811iq">✕</button></span></a>`),Yv=W(`<section><div class="sk-cat-head svelte-1j811iq"><h3 class="svelte-1j811iq"> </h3> <div class="sk-cat-actions svelte-1j811iq"><button type="button" class="sk-mini svelte-1j811iq">+</button> <button type="button" class="sk-mini sk-mini--del svelte-1j811iq">✕</button></div> <button type="button" class="sk-toggle svelte-1j811iq" aria-label="toggle"><svg viewBox="0 0 10 6" width="10" height="6"><path d="M1 1 L5 5 L9 1" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg></button></div> <div class="sk-links svelte-1j811iq"></div></section>`),Xv=W(`<option> </option>`),Zv=W(`<label for="sk-cat-name"> </label> <input id="sk-cat-name" type="text"/> <label for="sk-cat-color"> </label> <select id="sk-cat-color"></select>`,1),Qv=W(`<label for="sk-link-nom"> </label> <input id="sk-link-nom" type="text"/> <label for="sk-link-desc"> </label> <input id="sk-link-desc" type="text"/> <label for="sk-link-url"> </label> <input id="sk-link-url" type="text" placeholder="https://…"/>`,1),$v=W(`<div class="sk-panel-head"><h2 class="sk-panel-title"> <span class="sk-accent">.</span></h2> <p class="sk-panel-sub"> </p></div> <div class="sk-toolbar svelte-1j811iq"><button type="button" class="sk-tool svelte-1j811iq"> </button> <button type="button" class="sk-tool svelte-1j811iq"> </button> <button type="button" class="sk-tool sk-tool--add svelte-1j811iq"> </button></div> <div><!> <!></div> <!> <!>`,1);function ey(e,t){Ge(t,!0);let n=F(!1),r=F(L({})),i=F(!1),a=F(``),o=F(`t-green`),s=F(!1),c=F(-1),l=F(-1),u=F(``),d=F(``),f=F(``),p={"t-green":`survival.color_green`,"t-violet":`survival.color_violet`,"t-amber":`survival.color_amber`,"t-sky":`survival.color_sky`,"t-rose":`survival.color_rose`,"t-teal":`survival.color_teal`},m=P(()=>pv.links.length>0&&pv.links.every(e=>H(r)[e.titre]));function h(e){H(r)[e]=!H(r)[e]}function g(){if(H(m))I(r,{},!0);else{let e={};pv.links.forEach(t=>e[t.titre]=!0),I(r,e,!0)}}function _(){I(a,``),I(o,`t-green`),I(i,!0)}function v(){let e=H(a).trim();e&&(pv.links.push({theme:H(o),titre:e,liens:[]}),vv(),I(i,!1))}async function y(e){pv.links[e],await t.confirmDelete(X(`survival.confirm_del_cat_title`),X(`survival.confirm_del_cat_msg`))&&(pv.links.splice(e,1),vv())}function b(e){I(c,e,!0),I(l,-1),I(u,``),I(d,``),I(f,``),I(s,!0)}function x(e,t,n){e.preventDefault();let r=pv.links[t].liens[n];I(c,t,!0),I(l,n,!0),I(u,r.nom,!0),I(d,r.desc,!0),I(f,r.url,!0),I(s,!0)}function S(){let e=H(u).trim(),t=H(f).trim();if(!e||!t)return;let n={nom:e,desc:H(d).trim(),url:t};H(l)===-1?pv.links[H(c)].liens.push(n):pv.links[H(c)].liens[H(l)]=n,vv(),I(s,!1)}async function C(e,n,r){e.preventDefault(),await t.confirmDelete(X(`survival.confirm_del_link_title`),X(`survival.irreversible`))&&(pv.links[n].liens.splice(r,1),vv())}var w=$v(),T=z(w),E=R(T),D=R(E,!0);Pe(),N(E);var ee=B(E,2),O=R(ee,!0);N(ee),N(T);var k=B(T,2),A=R(k),te=R(A,!0);N(A);var ne=B(A,2),re=R(ne,!0);N(ne);var ie=B(ne,2),ae=R(ie,!0);N(ie),N(k);var oe=B(k,2);let se;var ce=R(oe),le=e=>{var t=Kv(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`survival.links_empty`)]),G(e,t)};q(ce,e=>{pv.links.length===0&&e(le)}),J(B(ce,2),19,()=>pv.links,(e,t)=>e.titre+t,(e,t,n)=>{let i=P(()=>!H(r)[H(t).titre]);var a=Yv();let o;var s=R(a),c=R(s),l=R(c,!0);N(c);var u=B(c,2),d=R(u),f=B(d,2);N(u);var p=B(u,2);N(s);var m=B(s,2);J(m,21,()=>H(t).liens,Yr,(e,t,r)=>{var i=Jv(),a=R(i),o=R(a),s=R(o,!0);N(o);var c=B(o),l=e=>{var n=qv(),r=R(n);N(n),V(()=>K(r,`— ${H(t).desc??``}`)),G(e,n)};q(c,e=>{H(t).desc&&e(l)}),N(a);var u=B(a,4),d=R(u),f=B(d,2);N(u),N(i),V((e,n)=>{Y(i,`href`,H(t).url),K(s,H(t).nom),Y(d,`title`,e),Y(f,`title`,n)},[()=>X(`survival.links_edit_link_title`),()=>X(`survival.links_del_link_title`)]),U(`click`,d,e=>x(e,H(n),r)),U(`click`,f,e=>C(e,H(n),r)),G(e,i)}),N(m),N(a),V((e,n)=>{o=hi(a,1,`sk-cat ${H(t).theme??``}`,`svelte-1j811iq`,o,{collapsed:H(i)}),K(l,H(t).titre),Y(d,`title`,e),Y(f,`title`,n)},[()=>X(`survival.links_add_link_title`),()=>X(`survival.links_del_cat_title`)]),U(`click`,d,()=>b(H(n))),U(`click`,f,()=>y(H(n))),U(`click`,p,()=>h(H(t).titre)),G(e,a)}),N(oe);var ue=B(oe,2);{let e=P(()=>X(`survival.modal_cat_title`)),t=P(()=>X(`common.add`));Ev(ue,{get open(){return H(i)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:v,onClose:()=>I(i,!1),children:(e,t)=>{var n=Zv(),r=z(n),i=R(r,!0);N(r);var s=B(r,2);Ei(s);var c=B(s,2),l=R(c,!0);N(c);var u=B(c,2);J(u,21,()=>wv,Yr,(e,t)=>{var n=Xv(),r=R(n,!0);N(n);var i={};V(e=>{K(r,e),i!==(i=H(t))&&(n.value=(n.__value=H(t))??``)},[()=>X(p[H(t)])]),G(e,n)}),N(u),V((e,t,n)=>{K(i,e),Y(s,`placeholder`,t),K(l,n)},[()=>X(`survival.modal_cat_label_name`),()=>X(`survival.modal_cat_placeholder_name`),()=>X(`survival.modal_label_color`)]),U(`keydown`,s,e=>e.key===`Enter`&&v()),Mi(s,()=>H(a),e=>I(a,e)),bi(u,()=>H(o),e=>I(o,e)),G(e,n)},$$slots:{default:!0}})}var de=B(ue,2);{let e=P(()=>H(l)===-1?X(`survival.modal_link_title`):X(`survival.modal_edit_link_title`)),t=P(()=>H(l)===-1?X(`common.add`):X(`common.save`));Ev(de,{get open(){return H(s)},get title(){return H(e)},get confirmLabel(){return H(t)},onConfirm:S,onClose:()=>I(s,!1),children:(e,t)=>{var n=Qv(),r=z(n),i=R(r,!0);N(r);var a=B(r,2);Ei(a);var o=B(a,2),s=R(o,!0);N(o);var c=B(o,2);Ei(c);var l=B(c,2),p=R(l,!0);N(l);var m=B(l,2);Ei(m),V((e,t,n,r,o)=>{K(i,e),Y(a,`placeholder`,t),K(s,n),Y(c,`placeholder`,r),K(p,o)},[()=>X(`survival.modal_link_label_name`),()=>X(`survival.modal_link_placeholder_name`),()=>X(`survival.modal_link_label_desc`),()=>X(`survival.modal_link_placeholder_desc`),()=>X(`survival.modal_link_label_url`)]),Mi(a,()=>H(u),e=>I(u,e)),Mi(c,()=>H(d),e=>I(d,e)),U(`keydown`,m,e=>e.key===`Enter`&&S()),Mi(m,()=>H(f),e=>I(f,e)),G(e,n)},$$slots:{default:!0}})}V((e,t,r,i,a)=>{K(D,e),K(O,t),K(te,r),K(re,i),K(ae,a),se=hi(oe,1,`sk-cats svelte-1j811iq`,null,se,{"edit-mode":H(n)})},[()=>X(`survival.links_title`),()=>X(`survival.links_subtitle`),()=>H(n)?X(`survival.btn_read_mode`):X(`survival.btn_edit_mode`),()=>H(m)?X(`survival.btn_collapse_all`):X(`survival.btn_expand_all`),()=>X(`survival.links_btn_add_cat`)]),U(`click`,A,()=>I(n,!H(n))),U(`click`,ne,g),U(`click`,ie,_),G(e,w),Ke()}Nr([`click`,`keydown`]);var ty=W(`<button class="ghost-button"><i class="fa-solid fa-cloud"></i></button> <button title="Toggle dark mode" class="ghost-button" aria-label="Toggle dark mode"> </button>`,1),ny=W(`<p class="sk-loading svelte-ha6eja"> </p>`),ry=W(`<div class="sk-grid svelte-ha6eja"><section class="sk-col svelte-ha6eja"><div class="sk-inner svelte-ha6eja"><!></div></section> <section class="sk-col svelte-ha6eja"><div class="sk-inner svelte-ha6eja"><!></div></section> <section class="sk-col svelte-ha6eja"><div class="sk-inner svelte-ha6eja"><!></div></section></div>`),iy=W(`<!> <div class="app-shell sk-root svelte-ha6eja"><div class="sk-menu-trigger svelte-ha6eja" role="presentation"></div> <div><!></div> <!></div> <!>`,1);function ay(e,t){Ge(t,!0);let n=F(null),r=F(!1),i=F(!1),a=F(!1),o=F(!1);function s(e){I(o,e<=(H(o)?84:10))}On(()=>{let e=e=>s(e.clientY);return window.addEventListener(`mousemove`,e),()=>window.removeEventListener(`mousemove`,e)});async function c(e,t){return H(n).show({title:e,message:t,confirmLabel:X(`survival.irreversible_delete`),cancelLabel:X(`common.cancel`),danger:!0})}function l(e){I(i,e,!0),document.documentElement.classList.toggle(`dark`,e)}function u(){let e=!1;try{let t=localStorage.getItem(`ld-dark`);e=t===null?window.matchMedia(`(prefers-color-scheme: dark)`).matches:t===`true`}catch{}l(e)}function d(){l(!H(i));try{localStorage.setItem(`ld-dark`,String(H(i)))}catch{}}Vi(async()=>{u();try{await la((await fetch(`/api/config`).then(e=>e.json())).language||`en`)}catch{}await gv(),I(r,!0)});var f=iy(),p=z(f);Li(wl(p,{}),e=>I(n,e,!0),()=>H(n));var m=B(p,2),h=R(m),g=B(h,2);let _;var v=R(g);{let e=e=>{var t=ty(),n=z(t),r=B(n,2),o=R(r,!0);N(r),V((e,t)=>{Y(n,`title`,e),Y(n,`aria-label`,t),K(o,H(i)?`☀`:`☾`)},[()=>X(`nav.word_cloud`),()=>X(`nav.word_cloud`)]),U(`click`,n,()=>I(a,!0)),U(`click`,r,d),G(e,t)},t=P(()=>X(`survival.title`)),n=P(()=>X(`survival.subtitle`));Ja(v,{get title(){return H(t)},get subtitle(){return H(n)},actions:e,$$slots:{actions:!0}})}N(g);var y=B(g,2),b=e=>{var t=ny(),n=R(t,!0);N(t),V(e=>K(n,e),[()=>X(`common.loading`)]),G(e,t)},x=e=>{var t=ry(),n=R(t),r=R(n);Cv(R(r),{}),N(r),N(n);var i=B(n,2),a=R(i);Gv(R(a),{confirmDelete:c}),N(a),N(i);var o=B(i,2),s=R(o);ey(R(s),{confirmDelete:c}),N(s),N(o),N(t),G(e,t)};q(y,e=>{H(r)?e(x,-1):e(b)}),N(m),R_(B(m,2),{get open(){return H(a)},onclose:()=>I(a,!1)}),V(()=>_=hi(g,1,`sk-menu-drawer svelte-ha6eja`,null,_,{revealed:H(o)})),Mr(`mouseenter`,h,()=>I(o,!0)),G(e,f),Ke()}Nr([`click`]);var oy=W(`<p style="padding:2rem"> </p>`);function sy(e,t){Ge(t,!0);function n(e){return e.length>1?e.replace(/\/+$/,``):e}let r=new Set([`/`,`/admin`,`/workspace`,`/blueprint`,`/diagram`,`/shape-editor`,`/context`,`/files`,`/survival-kit`]),i=F(L(n(window.location.pathname)));function a(e){let t=new URL(e,window.location.href),r=n(t.pathname),a=`${r}${t.search}${t.hash}`;if(a===`${window.location.pathname}${window.location.search}${window.location.hash}`){Da();return}history.pushState(null,``,a),I(i,r,!0),Da(),window.dispatchEvent(new PopStateEvent(`popstate`))}function o(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let t=e.target instanceof Element?e.target.closest(`a[href]`):null;if(!(t instanceof HTMLAnchorElement)||t.target||t.hasAttribute(`download`))return;let i=new URL(t.href,window.location.href);if(i.origin!==window.location.origin)return;let o=n(i.pathname);r.has(o)&&(e.preventDefault(),a(`${o}${i.search}${i.hash}`))}Vi(()=>(Da(),document.addEventListener(`click`,o,!0),()=>{document.removeEventListener(`click`,o,!0)})),window.addEventListener(`popstate`,()=>{I(i,n(window.location.pathname),!0),Da()}),On(()=>{H(i)===`/blueprint`?document.documentElement.setAttribute(`data-blueprint`,``):document.documentElement.removeAttribute(`data-blueprint`)});function s(e){a(e)}var c=Ur(),l=z(c),u=e=>{so(e,{navigate:s})},d=e=>{Su(e,{})},f=e=>{Lp(e,{})},p=e=>{Yp(e,{})},m=e=>{km(e,{navigate:s})},h=e=>{X_(e,{})},g=e=>{fv(e,{})},_=e=>{ay(e,{})},v=e=>{W_(e,{})},y=e=>{var t=oy(),n=R(t);N(t),V(()=>K(n,`Route "${H(i)??``}" — not yet migrated.`)),G(e,t)};q(l,e=>{H(i)===`/admin`?e(u):H(i)===`/blueprint`?e(d,1):H(i)===`/workspace`?e(f,2):H(i)===`/files`?e(p,3):H(i)===`/context`?e(m,4):H(i)===`/diagram`?e(h,5):H(i)===`/shape-editor`?e(g,6):H(i)===`/survival-kit`?e(_,7):H(i)===`/`?e(v,8):e(y,-1)}),G(e,c),Ke()}Da(),Wr(sy,{target:document.getElementById(`app`)});export{iv as a,cv as c,Z_ as d,la as f,av as i,lv as l,rv as n,sv as o,X as p,ov as r,nv as s,$_ as t,Q_ as u};
|