@justyork/repo-mind 0.4.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/ab-demo/compute-pass.d.ts +24 -0
- package/dist/ab-demo/compute-pass.js +80 -0
- package/dist/ab-demo/live-answer.d.ts +6 -0
- package/dist/ab-demo/live-answer.js +89 -0
- package/dist/ab-demo/live-eval.d.ts +19 -0
- package/dist/ab-demo/live-eval.js +192 -0
- package/dist/ab-demo/paths.d.ts +1 -0
- package/dist/ab-demo/paths.js +3 -0
- package/dist/ab-demo/record-transcript.d.ts +9 -0
- package/dist/ab-demo/record-transcript.js +97 -0
- package/dist/ab-demo/types.d.ts +57 -0
- package/dist/ab-demo/validate-questions.d.ts +5 -0
- package/dist/ab-demo/validate-questions.js +32 -0
- package/dist/agent-write-gate.d.ts +7 -0
- package/dist/agent-write-gate.js +33 -0
- package/dist/cli.js +102 -0
- package/dist/commands/ab-eval.d.ts +11 -0
- package/dist/commands/ab-eval.js +103 -0
- package/dist/commands/publish.d.ts +11 -0
- package/dist/commands/publish.js +91 -0
- package/dist/git/git-exec.d.ts +19 -0
- package/dist/git/git-exec.js +89 -0
- package/dist/git/publish-pr.d.ts +33 -0
- package/dist/git/publish-pr.js +121 -0
- package/dist/index/slug.d.ts +2 -0
- package/dist/index/slug.js +15 -0
- package/dist/mcp/server.js +40 -0
- package/dist/publish/batch-publish.d.ts +29 -0
- package/dist/publish/batch-publish.js +106 -0
- package/dist/tools/create-draft.d.ts +32 -0
- package/dist/tools/create-draft.js +163 -0
- package/dist/ui/draft-api.js +33 -1
- package/dist/ui/fs-operations.d.ts +13 -0
- package/dist/ui/fs-operations.js +139 -0
- package/dist/ui/fs-tree.d.ts +6 -1
- package/dist/ui/fs-tree.js +62 -36
- package/package.json +9 -1
- package/ui/dist/assets/{arc-C6B0IXf5.js → arc-B9D1Pvqi.js} +1 -1
- package/ui/dist/assets/{architectureDiagram-3BPJPVTR-BwcC0zwn.js → architectureDiagram-3BPJPVTR-Bvug0Ca5.js} +1 -1
- package/ui/dist/assets/{blockDiagram-GPEHLZMM-DIhdWMA6.js → blockDiagram-GPEHLZMM-Ckmilsu4.js} +1 -1
- package/ui/dist/assets/{c4Diagram-AAUBKEIU-DAe6bsUB.js → c4Diagram-AAUBKEIU-BT9pbmn0.js} +1 -1
- package/ui/dist/assets/channel-TAOLyHdK.js +1 -0
- package/ui/dist/assets/{chunk-2J33WTMH-Cy3md3pb.js → chunk-2J33WTMH-dgxq-Xfu.js} +1 -1
- package/ui/dist/assets/{chunk-4BX2VUAB-CzL8eUDD.js → chunk-4BX2VUAB-DmM9cIh_.js} +1 -1
- package/ui/dist/assets/{chunk-55IACEB6-CbthXzDA.js → chunk-55IACEB6-DsB88bPS.js} +1 -1
- package/ui/dist/assets/{chunk-727SXJPM-B7ZW-l9j.js → chunk-727SXJPM-BYuDClxC.js} +1 -1
- package/ui/dist/assets/{chunk-AQP2D5EJ-Vaux-7Ld.js → chunk-AQP2D5EJ-RO0Jvaof.js} +1 -1
- package/ui/dist/assets/{chunk-FMBD7UC4-C6P2YSWU.js → chunk-FMBD7UC4-DqY1unJF.js} +1 -1
- package/ui/dist/assets/{chunk-ND2GUHAM-gSNqdDAn.js → chunk-ND2GUHAM-BAURH6-3.js} +1 -1
- package/ui/dist/assets/{chunk-QZHKN3VN-DPPMoZqF.js → chunk-QZHKN3VN-BiCWufLo.js} +1 -1
- package/ui/dist/assets/classDiagram-4FO5ZUOK-0RJZpoIN.js +1 -0
- package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-0RJZpoIN.js +1 -0
- package/ui/dist/assets/{cose-bilkent-S5V4N54A-Ca4nXCOA.js → cose-bilkent-S5V4N54A-Bol8tJZ0.js} +1 -1
- package/ui/dist/assets/{dagre-BM42HDAG-C-4Y4Jyn.js → dagre-BM42HDAG-ziNCIqra.js} +1 -1
- package/ui/dist/assets/{diagram-2AECGRRQ-CNv_WVZk.js → diagram-2AECGRRQ-Dh2G8IOg.js} +1 -1
- package/ui/dist/assets/{diagram-5GNKFQAL-CNwYGvCw.js → diagram-5GNKFQAL-C_26Fq9O.js} +1 -1
- package/ui/dist/assets/{diagram-KO2AKTUF-CEULTL49.js → diagram-KO2AKTUF-CPS1B4bk.js} +1 -1
- package/ui/dist/assets/{diagram-LMA3HP47-sGQpPW5i.js → diagram-LMA3HP47-DoL5Nx28.js} +1 -1
- package/ui/dist/assets/{diagram-OG6HWLK6-BBEtEBkh.js → diagram-OG6HWLK6-DOy-TY5D.js} +1 -1
- package/ui/dist/assets/editor-CTtDusro.js +211 -0
- package/ui/dist/assets/{erDiagram-TEJ5UH35-B4mEdVPJ.js → erDiagram-TEJ5UH35-C2whsoWw.js} +1 -1
- package/ui/dist/assets/{flowDiagram-I6XJVG4X-7-OngwLn.js → flowDiagram-I6XJVG4X-D7-1XdVh.js} +1 -1
- package/ui/dist/assets/{ganttDiagram-6RSMTGT7-Bq3z_Nvr.js → ganttDiagram-6RSMTGT7-Dduumk4v.js} +1 -1
- package/ui/dist/assets/{gitGraphDiagram-PVQCEYII-BjMdjnGR.js → gitGraphDiagram-PVQCEYII-CJfZihUe.js} +1 -1
- package/ui/dist/assets/{graph-CwHQTpjf.js → graph-CFkZObJQ.js} +1 -1
- package/ui/dist/assets/{infoDiagram-5YYISTIA-ByORmROU.js → infoDiagram-5YYISTIA-B8IsGW31.js} +1 -1
- package/ui/dist/assets/{ishikawaDiagram-YF4QCWOH-B7yRHlcY.js → ishikawaDiagram-YF4QCWOH-CwaI1VjO.js} +1 -1
- package/ui/dist/assets/{journeyDiagram-JHISSGLW-J5mLr9YH.js → journeyDiagram-JHISSGLW-jo8e3Vri.js} +1 -1
- package/ui/dist/assets/{kanban-definition-UN3LZRKU-B3GyGD8X.js → kanban-definition-UN3LZRKU-DsFcvv5g.js} +1 -1
- package/ui/dist/assets/main-DEdNYNxf.js +274 -0
- package/ui/dist/assets/{mermaid.core-C57NVZG0.js → mermaid.core-CIyMeT5H.js} +4 -4
- package/ui/dist/assets/{mindmap-definition-RKZ34NQL-CkcXt9tU.js → mindmap-definition-RKZ34NQL-Bl3ML0fg.js} +1 -1
- package/ui/dist/assets/{pieDiagram-4H26LBE5-Y7B3kCyQ.js → pieDiagram-4H26LBE5-rCj5-rCc.js} +1 -1
- package/ui/dist/assets/{quadrantDiagram-W4KKPZXB-CXKUOw1G.js → quadrantDiagram-W4KKPZXB-tF5l8Pj1.js} +1 -1
- package/ui/dist/assets/{requirementDiagram-4Y6WPE33-DBmmmiXs.js → requirementDiagram-4Y6WPE33-CtAsbYzh.js} +1 -1
- package/ui/dist/assets/{sankeyDiagram-5OEKKPKP-BNADiaE4.js → sankeyDiagram-5OEKKPKP-CYgylTyv.js} +1 -1
- package/ui/dist/assets/{sequenceDiagram-3UESZ5HK-CctElOC5.js → sequenceDiagram-3UESZ5HK-D2FeAk8O.js} +1 -1
- package/ui/dist/assets/{stateDiagram-AJRCARHV-D40_7g7Y.js → stateDiagram-AJRCARHV-BhNt372S.js} +1 -1
- package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-hesflu-P.js +1 -0
- package/ui/dist/assets/theme-CgUWrIXo.css +1 -0
- package/ui/dist/assets/theme-DBoBdw62.js +1 -0
- package/ui/dist/assets/{timeline-definition-PNZ67QCA-DMVhUcek.js → timeline-definition-PNZ67QCA-DYrj-JqE.js} +1 -1
- package/ui/dist/assets/{vennDiagram-CIIHVFJN-Ci0RqPuV.js → vennDiagram-CIIHVFJN-DAdImqHv.js} +1 -1
- package/ui/dist/assets/visual-editor-BHZk1CI4.js +220 -0
- package/ui/dist/assets/{wardley-L42UT6IY-Chn0BKir.js → wardley-L42UT6IY-BfiflBRy.js} +1 -1
- package/ui/dist/assets/{wardleyDiagram-YWT4CUSO-BLdXlrC5.js → wardleyDiagram-YWT4CUSO-5HZM-go9.js} +1 -1
- package/ui/dist/assets/{xychartDiagram-2RQKCTM6-C4gOVVe1.js → xychartDiagram-2RQKCTM6-ozNCw5n2.js} +1 -1
- package/ui/dist/graph.html +3 -3
- package/ui/dist/index.html +4 -4
- package/ui/dist/assets/channel-C8Q7-wTd.js +0 -1
- package/ui/dist/assets/classDiagram-4FO5ZUOK-pYCdSDhT.js +0 -1
- package/ui/dist/assets/classDiagram-v2-Q7XG4LA2-pYCdSDhT.js +0 -1
- package/ui/dist/assets/editor-BcAuZsp8.js +0 -211
- package/ui/dist/assets/main-Du7fLv5Y.js +0 -244
- package/ui/dist/assets/stateDiagram-v2-BHNVJYJU-DSc6L6rE.js +0 -1
- package/ui/dist/assets/theme-BJgORXba.css +0 -1
- package/ui/dist/assets/theme-DxqwV6dp.js +0 -1
- package/ui/dist/assets/visual-editor-UWcMGp6p.js +0 -39
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-C57NVZG0.js","assets/transform-BwXaE9hv.js","assets/editor-BcAuZsp8.js","assets/visual-editor-UWcMGp6p.js","assets/theme-DxqwV6dp.js","assets/theme-BJgORXba.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{p as Fe,s as je,e as Ie,g as Oe,a as Be,l as O,b as Ke,c as Ge,d as V,f as ze,h as Je,i as Ve,j as Xe,k as Ye,m as Qe,n as Ze,r as et,o as tt,q as fe,t as nt,v as st,w as rt,x as it,y as F,z as ge,A as at,B as ot,C as lt}from"./theme-DxqwV6dp.js";import{m as Le}from"./editor-BcAuZsp8.js";const dt={"wiki-page":"Wiki",adr:"ADR","feature-spec":"Feature specs","glossary-term":"Glossary","open-question":"Open questions","agent-instruction":"Agent instructions"},ut={"wiki-page":"W",adr:"A","feature-spec":"S","glossary-term":"G","open-question":"?","agent-instruction":"◎"},K="folder:";function ct(e){return e.startsWith(K)?e.slice(K.length).slice(0,1).toUpperCase():ut[e]??e.slice(0,1).toUpperCase()}function G(e){if(e.startsWith(K)){const n=e.slice(K.length);return n==="__root__"?"General":n.split(/[-_/]/).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" ")}return dt[e]??e}function pt(e,n){var P,S,q,L;e.className="workspace-main workspace-dashboard",e.innerHTML=`
|
|
3
|
-
<div class="dashboard-header">
|
|
4
|
-
<h1 class="doc-title">Health & publish</h1>
|
|
5
|
-
<div class="workspace-actions">
|
|
6
|
-
<button type="button" id="dash-export" class="btn-ghost">Export agents.md</button>
|
|
7
|
-
<button type="button" id="dash-refresh" class="btn-ghost">Refresh</button>
|
|
8
|
-
</div>
|
|
9
|
-
</div>
|
|
10
|
-
<div id="dash-check" class="dashboard-section"></div>
|
|
11
|
-
<div id="dash-links" class="dashboard-section"></div>
|
|
12
|
-
<div class="dashboard-section">
|
|
13
|
-
<h2>Prepare docs</h2>
|
|
14
|
-
<p class="dashboard-hint">Markdown files without RepoMind frontmatter. Add frontmatter to index them for MCP and the catalog.</p>
|
|
15
|
-
<div class="dashboard-actions">
|
|
16
|
-
<button type="button" id="dash-prepare-all" class="btn-primary btn-sm">Prepare all</button>
|
|
17
|
-
<button type="button" id="dash-sync-links" class="btn-ghost btn-sm">Sync all links</button>
|
|
18
|
-
</div>
|
|
19
|
-
<ul id="dash-unprepared" class="queue-list"></ul>
|
|
20
|
-
</div>
|
|
21
|
-
<div class="dashboard-section">
|
|
22
|
-
<h2>Publish queue</h2>
|
|
23
|
-
<ul id="dash-queue" class="queue-list"></ul>
|
|
24
|
-
</div>
|
|
25
|
-
`;const t=e.querySelector("#dash-check"),r=e.querySelector("#dash-links"),p=e.querySelector("#dash-unprepared"),u=e.querySelector("#dash-queue");function i(m){const o=m.ok?"check-ok":"check-fail",h=m.ok?"All checks passed":`${m.violations.length} issue(s)`;let f=`
|
|
26
|
-
<h2>Schema check</h2>
|
|
27
|
-
<p class="check-status ${o}">${h}</p>
|
|
28
|
-
`;if(m.violations.length>0){f+='<ul class="violation-list">';for(const w of m.violations)f+=`<li><code>${A(w.path)}</code> — ${A(w.message)}</li>`;f+="</ul>"}if(m.warnings.length>0){f+='<h3 class="warnings-title">Warnings</h3><ul class="warning-list">';for(const w of m.warnings)f+=`<li>${A(w)}</li>`;f+="</ul>"}t.innerHTML=f}function v(m){let o=`
|
|
29
|
-
<h2>Link health</h2>
|
|
30
|
-
<div class="link-health-stats">
|
|
31
|
-
<div class="link-health-stat"><span class="link-health-value">${m.orphanCount}</span> orphans</div>
|
|
32
|
-
<div class="link-health-stat"><span class="link-health-value">${m.brokenCount}</span> broken</div>
|
|
33
|
-
<div class="link-health-stat"><span class="link-health-value">${m.oneWayCount}</span> one-way</div>
|
|
34
|
-
</div>
|
|
35
|
-
`;if(m.brokenTargets.length>0){o+='<h3 class="warnings-title">Broken targets</h3><ul class="warning-list">';for(const h of m.brokenTargets)o+=`<li><code>${A(h)}</code></li>`;o+="</ul>"}if(m.orphanSlugs.length>0){o+='<h3 class="warnings-title">Orphan pages</h3><ul class="warning-list">';for(const h of m.orphanSlugs)o+=`<li><code>${A(h)}</code></li>`;o+="</ul>"}r.innerHTML=o}function $(m){var o;if(p.innerHTML="",m.length===0){p.innerHTML='<li class="placeholder">All docs have frontmatter</li>';return}for(const h of m){const f=document.createElement("li");f.className="queue-item",f.innerHTML=`
|
|
36
|
-
<div class="queue-main">
|
|
37
|
-
<div class="queue-title">${A(h.relativePath)}</div>
|
|
38
|
-
<div class="meta">${A(h.suggestedType)} · slug: ${A(h.suggestedSlug)}</div>
|
|
39
|
-
</div>
|
|
40
|
-
<div class="queue-actions">
|
|
41
|
-
<button type="button" class="btn-primary btn-sm" data-action="prepare">Add frontmatter</button>
|
|
42
|
-
</div>
|
|
43
|
-
`,(o=f.querySelector('[data-action="prepare"]'))==null||o.addEventListener("click",()=>{Ge(h.relativePath,h.suggestedType).then(({result:w})=>{n.onNotify(`Prepared: ${w.slug}`),y()}).catch(w=>{n.onNotify(w instanceof Error?w.message:"Prepare failed",!0)})}),p.appendChild(f)}}function E(m){var o,h;if(u.innerHTML="",m.length===0){u.innerHTML='<li class="placeholder">No drafts in queue</li>';return}for(const f of m){const w=document.createElement("li");w.className="queue-item",w.innerHTML=`
|
|
44
|
-
<div class="queue-main">
|
|
45
|
-
<div class="queue-title">${A(f.title||f.slug)}</div>
|
|
46
|
-
<div class="meta">${A(f.slug)} · ${A(f.type)}</div>
|
|
47
|
-
</div>
|
|
48
|
-
<div class="queue-actions">
|
|
49
|
-
<button type="button" class="btn-ghost btn-sm" data-action="edit">Edit</button>
|
|
50
|
-
<button type="button" class="btn-primary btn-sm" data-action="publish">Publish</button>
|
|
51
|
-
</div>
|
|
52
|
-
`,(o=w.querySelector('[data-action="edit"]'))==null||o.addEventListener("click",()=>{n.onOpenDraft(f)}),(h=w.querySelector('[data-action="publish"]'))==null||h.addEventListener("click",()=>{V(f.id).then(({result:s})=>{n.onPublished(s.path),y()}).catch(s=>{n.onNotify(s instanceof Error?s.message:"Publish failed",!0)})}),u.appendChild(w)}}async function y(){try{const[m,o,{drafts:h},{files:f}]=await Promise.all([Oe(),Be(),O(),Ke()]);i(m),v(o),$(f),E(h)}catch(m){t.innerHTML=`<p class="check-status check-fail">${A(m instanceof Error?m.message:"Failed to load")}</p>`}}return(P=e.querySelector("#dash-refresh"))==null||P.addEventListener("click",()=>{y()}),(S=e.querySelector("#dash-prepare-all"))==null||S.addEventListener("click",()=>{Fe().then(({result:m})=>{n.onNotify(`Prepared ${m.prepared.length} file(s)`),y()}).catch(m=>{n.onNotify(m instanceof Error?m.message:"Prepare all failed",!0)})}),(q=e.querySelector("#dash-sync-links"))==null||q.addEventListener("click",()=>{je().then(({result:m})=>{const o=m.files.filter(h=>h.changed).length;n.onNotify(`Synced links in ${o} file(s)`),y()}).catch(m=>{n.onNotify(m instanceof Error?m.message:"Sync links failed",!0)})}),(L=e.querySelector("#dash-export"))==null||L.addEventListener("click",()=>{Ie().then(({path:m})=>{n.onNotify(`Exported ${m}`)}).catch(m=>{n.onNotify(m instanceof Error?m.message:"Export failed",!0)})}),y(),{refresh:y}}function A(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}const ft="modulepreload",gt=function(e){return"/"+e},he={},$e=function(n,t,r){let p=Promise.resolve();if(t&&t.length>0){let i=function(E){return Promise.all(E.map(y=>Promise.resolve(y).then(P=>({status:"fulfilled",value:P}),P=>({status:"rejected",reason:P}))))};document.getElementsByTagName("link");const v=document.querySelector("meta[property=csp-nonce]"),$=(v==null?void 0:v.nonce)||(v==null?void 0:v.getAttribute("nonce"));p=i(t.map(E=>{if(E=gt(E),E in he)return;he[E]=!0;const y=E.endsWith(".css"),P=y?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${E}"]${P}`))return;const S=document.createElement("link");if(S.rel=y?"stylesheet":ft,y||(S.as="script"),S.crossOrigin="",S.href=E,$&&S.setAttribute("nonce",$),document.head.appendChild(S),y)return new Promise((q,L)=>{S.addEventListener("load",q),S.addEventListener("error",()=>L(new Error(`Unable to preload CSS for ${E}`)))})}))}function u(i){const v=new Event("vite:preloadError",{cancelable:!0});if(v.payload=i,window.dispatchEvent(v),!v.defaultPrevented)throw i}return p.then(i=>{for(const v of i||[])v.status==="rejected"&&u(v.reason);return n().catch(u)})};function ht(e){if(!e)return null;if(e.startsWith("?slug=")||e.startsWith("/?slug=")){const n=e.includes("?")?e.slice(e.indexOf("?")):e,t=new URLSearchParams(n).get("slug");return(t==null?void 0:t.trim())||null}try{const t=new URL(e,"http://local").searchParams.get("slug");return(t==null?void 0:t.trim())||null}catch{return null}}function X(e){var n,t;return((t=(n=e.split("#")[0])==null?void 0:n.split("?")[0])==null?void 0:t.trim())??""}function qe(e){const n=e.replace(/\\/g,"/").replace(/^\/+/,"");return n?n.toLowerCase().endsWith(".md")?n:`${n}.md`:""}function mt(e,n){const t=X(n);if(!t||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("mailto:")||t.startsWith("#"))return null;const r=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",p=t.replace(/\\/g,"/").split("/"),u=r?r.split("/"):[];for(const i of p)if(!(!i||i===".")){if(i===".."){if(u.length===0)return null;u.pop();continue}u.push(i)}return qe(u.join("/"))}function vt(e){let n=X(e).replace(/\\/g,"/");return!n||n.startsWith("http://")||n.startsWith("https://")||n.startsWith("mailto:")||n.startsWith("#")||(n.startsWith("/")&&(n=n.slice(1)),n.startsWith("docs/")&&(n=n.slice(5)),!n)?null:qe(n)}function yt(e,n){const t=n.get(e);if(t)return t;const r=e.toLowerCase();for(const[p,u]of n.entries())if(p.toLowerCase()===r)return u;return null}function wt(e,n,t){const r=ht(n);if(r){for(const u of t.values())if(u===r)return r;return null}const p=[mt(e,n),vt(n)].filter(u=>!!u);for(const u of p){const i=yt(u,t);if(i)return i}return null}const St=[".png",".jpg",".jpeg",".gif",".webp",".svg"];function me(e){const n=e.toLowerCase();return St.some(t=>n.endsWith(t))}function bt(e,n){const t=X(n);if(!t||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("mailto:")||t.startsWith("#")||t.startsWith("data:"))return null;let r=t.replace(/\\/g,"/");if(r.startsWith("/")&&(r=r.slice(1)),r.startsWith("docs/")?r=r.slice(5):r="",r&&!r.split("/").includes("..")&&me(r))return r;const p=e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",u=t.replace(/\\/g,"/").split("/"),i=p?p.split("/"):[];for(const $ of u)if(!(!$||$===".")){if($===".."){if(i.length===0)return null;i.pop();continue}i.push($)}const v=i.join("/");return v&&me(v)?v:null}function Et(e,n){const t=bt(e,n);return t?`/api/assets/${t.split("/").map(encodeURIComponent).join("/")}`:null}const Pe=/\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g;function Ce(e,n){const t=e.trim(),r=((n==null?void 0:n.trim())||t).trim();return{display:t,slug:r}}function rn(e,n){const t=e.trim(),r=(n??t).trim();return r===t?`[[${t}]]`:`[[${t}|${r}]]`}function Lt(e){const n=[];for(const t of e.matchAll(Pe)){const{slug:r}=Ce(t[1]??"",t[2]);r&&n.push(r)}return n}let ve=!1,N=null;function H(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function $t(e){return e.replace(Pe,(n,t,r)=>{const{display:p,slug:u}=Ce(t,r),i=encodeURIComponent(u);return`[${p}](#wikilink:${i})`})}function qt(){ve||(Le.use({gfm:!0,renderer:{code({text:e,lang:n}){return n==="mermaid"?`<div class="mermaid-wrapper"><pre class="mermaid">${H(e.trim())}</pre></div>
|
|
53
|
-
`:!1},list(e){if(!e.items.some(u=>u.task))return!1;const t=e.ordered?"ol":"ul",r=e.ordered&&e.start!==1&&e.start!=null?` start="${e.start}"`:"";let p="";for(const u of e.items)p+=this.listitem(u);return`<${t} class="contains-task-list"${r}>
|
|
54
|
-
${p}</${t}>
|
|
55
|
-
`},listitem(e){if(!e.task)return!1;const n=`<input type="checkbox" class="task-list-item-checkbox"${e.checked?" checked":""} disabled>`,t=this.parser.parse(e.tokens,!!e.loose).trim();return`<li class="task-list-item"><label class="task-list-item-label">${n}<span class="task-list-item-content">${t}</span></label></li>
|
|
56
|
-
`},image({href:e,text:n,title:t}){if(!e||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("data:"))return!1;if(N){const r=Et(N.docRelativePath,e);if(r){const p=H(n||t||"");return`<img src="${H(r)}" alt="${p}" loading="lazy" class="markdown-image">`}}return!1},link({href:e,text:n}){if(e!=null&&e.startsWith("#wikilink:")){const t=decodeURIComponent(e.slice(10));return`<a href="#" class="wikilink" data-slug="${H(t)}">${n}</a>`}if(N&&e){const t=wt(N.docRelativePath,e,N.slugByRelative);if(t)return`<a href="#" class="wikilink" data-slug="${H(t)}">${n}</a>`}return e!=null&&e.startsWith("http://")||e!=null&&e.startsWith("https://")?`<a href="${H(e)}" target="_blank" rel="noopener noreferrer">${n}</a>`:e!=null&&e.startsWith("mailto:")||e!=null&&e.startsWith("#")?!1:e?`<a href="#" class="md-link-unresolved" title="Link not in docs index">${n}</a>`:!1}}}),ve=!0)}function Pt(e,n){qt(),N=n??null;try{return Le.parse($t(e),{async:!1})}finally{N=null}}let ye=null;async function Ct(e){const n=e.querySelectorAll("pre.mermaid");if(n.length===0)return;const t=document.documentElement.dataset.theme==="dark"?"dark":"default",r=await $e(()=>import("./mermaid.core-C57NVZG0.js").then(p=>p.ba),__vite__mapDeps([0,1,2]));ye!==t&&(r.default.initialize({startOnLoad:!1,theme:t,securityLevel:"loose"}),ye=t);try{await r.default.run({nodes:[...n]})}catch{for(const p of n)if(!p.closest(".mermaid-error")){const u=p.parentElement;u==null||u.classList.add("mermaid-error")}}}const Y="slug",Te="path";function Q(){const e=new URLSearchParams(window.location.search).get(Y);return e!=null&&e.trim()?e.trim():null}function Tt(){const e=new URLSearchParams(window.location.search).get(Te);return e!=null&&e.trim()?e.trim().replace(/\\/g,"/"):null}function kt(){const e=new URL(window.location.href),n=e.pathname;if(n==="/"||n==="/index.html")return;const t=Q();e.pathname="/",history.replaceState(t?{slug:t}:{},"",e)}function ke(){const e=new URL(window.location.href);return e.pathname="/",e}function At(e){const n=ke();return n.search="",n.searchParams.set(Y,e),n.toString()}function Mt(e,n="push"){const t=ke();t.searchParams.delete(Te),t.searchParams.set(Y,e);const r={slug:e};n==="replace"?history.replaceState(r,"",t):history.pushState(r,"",t)}function xt(e){const n=()=>{e(Q())};return window.addEventListener("popstate",n),()=>window.removeEventListener("popstate",n)}function Dt(e,n){if(n==="json")try{const t=JSON.parse(e);return JSON.stringify(t,null,2)}catch{return e}return e}function Rt(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Nt(e,n){const t=Dt(e,n);return`<pre class="structured-preview ${n==="json"?"structured-preview--json":"structured-preview--yaml"}"><code>${Rt(t)}</code></pre>`}const Ae="repomind-page-info-hidden";function Wt(){try{const e=localStorage.getItem(Ae);return e===null?!0:e==="true"}catch{return!0}}function _t(e){try{localStorage.setItem(Ae,e?"true":"false")}catch{}}function D(e,n,t={}){var f,w,s,l;if(e.className="workspace-main",!n||!n.found){e.innerHTML=`
|
|
57
|
-
<div class="workspace-empty">
|
|
58
|
-
<h1>Knowledge</h1>
|
|
59
|
-
<p class="placeholder">Select a page from the tree or use the ⋯ menu to create one.</p>
|
|
60
|
-
</div>
|
|
61
|
-
`;return}const r=n.frontmatter??{},p=typeof r.title=="string"?r.title:n.slug??"",u=typeof r.status=="string"?r.status:"",i=typeof r.type=="string"?r.type:"",v=typeof r.domain=="string"?r.domain:"",$=Array.isArray(r.tags)?r.tags.filter(a=>typeof a=="string"):[],E=Array.isArray(r.related)?r.related.filter(a=>typeof a=="string"):[],y=G(i),P=Wt(),S=n.contentKind??"markdown",q=S==="json"||S==="yaml",L=q?"":'<button type="button" id="edit-page" class="btn-primary">Edit</button>';e.innerHTML=`
|
|
62
|
-
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
63
|
-
<button type="button" class="crumb" data-crumb="root">Knowledge</button>
|
|
64
|
-
<span class="crumb-sep">›</span>
|
|
65
|
-
<button type="button" class="crumb" data-crumb="catalog">${T(y)}</button>
|
|
66
|
-
<span class="crumb-sep">›</span>
|
|
67
|
-
<span class="crumb current">${T(p)}</span>
|
|
68
|
-
</nav>
|
|
69
|
-
<div class="page-layout${P?" page-layout--focus":""}">
|
|
70
|
-
<article class="page-content">
|
|
71
|
-
<header class="page-header">
|
|
72
|
-
<h1 class="doc-title">${T(p)}</h1>
|
|
73
|
-
<div class="workspace-actions">
|
|
74
|
-
<button type="button" id="toggle-focus" class="btn-ghost" aria-pressed="${P}">
|
|
75
|
-
${P?"Show info":"Hide info"}
|
|
76
|
-
</button>
|
|
77
|
-
${L}
|
|
78
|
-
<button type="button" id="copy-link" class="btn-ghost">Copy link</button>
|
|
79
|
-
<button type="button" id="copy-path" class="btn-ghost">Copy path</button>
|
|
80
|
-
</div>
|
|
81
|
-
</header>
|
|
82
|
-
<div id="tab-preview" class="markdown-preview reader-preview"></div>
|
|
83
|
-
<section id="reader-backlinks" class="reader-backlinks hidden" aria-label="Backlinks"></section>
|
|
84
|
-
</article>
|
|
85
|
-
<aside class="page-info">
|
|
86
|
-
<h2 class="page-info-title">Page info</h2>
|
|
87
|
-
<dl class="info-list">
|
|
88
|
-
<dt>Status</dt><dd><span class="status-chip status-${T(u)}">${T(u)}</span></dd>
|
|
89
|
-
<dt>Type</dt><dd>${T(i)}</dd>
|
|
90
|
-
${v?`<dt>Domain</dt><dd>${T(v)}</dd>`:""}
|
|
91
|
-
<dt>Format</dt><dd>${T(S)}</dd>
|
|
92
|
-
${$.length>0?`<dt>Tags</dt><dd>${$.map(a=>`<span class="tag-chip">${T(a)}</span>`).join(" ")}</dd>`:""}
|
|
93
|
-
</dl>
|
|
94
|
-
${E.length>0?`<div class="info-block"><div class="info-block-label">Related</div>${E.map(a=>`<button type="button" class="related-chip" data-slug="${T(a)}">${T(a)}</button>`).join("")}</div>`:""}
|
|
95
|
-
<div class="info-tabs tabs">
|
|
96
|
-
<button class="tab active" data-tab="frontmatter">Frontmatter</button>
|
|
97
|
-
<button class="tab" data-tab="agent">Agent JSON</button>
|
|
98
|
-
</div>
|
|
99
|
-
<div id="tab-frontmatter" class="tab-panel active"></div>
|
|
100
|
-
<div id="tab-agent" class="tab-panel"></div>
|
|
101
|
-
<footer class="page-info-footer">
|
|
102
|
-
<code id="doc-path">${T(n.path??"")}</code>
|
|
103
|
-
</footer>
|
|
104
|
-
</aside>
|
|
105
|
-
</div>
|
|
106
|
-
`;const m=e.querySelector("#tab-preview");if(q)m.innerHTML=Nt(n.body??"",S);else{const a=t.docRelativePath&&t.slugByRelative?{docRelativePath:t.docRelativePath,slugByRelative:t.slugByRelative}:void 0;m.innerHTML=Pt(n.body??"",a),Ct(m),m.querySelectorAll("a.wikilink").forEach(g=>{g.addEventListener("click",d=>{d.preventDefault();const b=g.dataset.slug;b&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:b}}))})}),m.querySelectorAll("a.md-link-unresolved").forEach(g=>{g.addEventListener("click",d=>{d.preventDefault()})})}const o=e.querySelector("#tab-frontmatter");o.innerHTML='<pre class="frontmatter-yaml"></pre>',o.querySelector("pre").textContent=JSON.stringify(r,null,2);const h=e.querySelector("#tab-agent");h.innerHTML='<pre class="agent-json"></pre>',h.querySelector("pre").textContent=JSON.stringify(n.agentShape,null,2),e.querySelectorAll(".info-tabs .tab").forEach(a=>{a.addEventListener("click",()=>{var d;const g=a.dataset.tab;e.querySelectorAll(".info-tabs .tab").forEach(b=>b.classList.remove("active")),e.querySelectorAll(".page-info .tab-panel").forEach(b=>b.classList.remove("active")),a.classList.add("active"),(d=e.querySelector(`#tab-${g}`))==null||d.classList.add("active")})}),(f=e.querySelector("#toggle-focus"))==null||f.addEventListener("click",()=>{const a=e.querySelector(".page-layout"),g=e.querySelector("#toggle-focus"),d=!(a!=null&&a.classList.contains("page-layout--focus"));a==null||a.classList.toggle("page-layout--focus",d),_t(d),g&&(g.setAttribute("aria-pressed",String(d)),g.textContent=d?"Show info":"Hide info")}),(w=e.querySelector("#copy-path"))==null||w.addEventListener("click",()=>{n.path&&navigator.clipboard.writeText(n.path)}),(s=e.querySelector("#copy-link"))==null||s.addEventListener("click",()=>{var a;n.slug&&(navigator.clipboard.writeText(At(n.slug)),(a=t.onCopyLink)==null||a.call(t))}),(l=e.querySelector("#edit-page"))==null||l.addEventListener("click",()=>{n.slug&&t.onEdit&&t.onEdit(n.slug)}),e.querySelectorAll(".related-chip").forEach(a=>{a.addEventListener("click",()=>{const g=a.dataset.slug;g&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:g}}))})}),n.slug&&!q&&ze(n.slug).then(({backlinks:a})=>{const g=e.querySelector("#reader-backlinks");!g||a.length===0||(g.classList.remove("hidden"),g.innerHTML=`
|
|
107
|
-
<h2 class="reader-backlinks-title">Backlinks</h2>
|
|
108
|
-
<div class="reader-backlinks-list">
|
|
109
|
-
${a.map(d=>`<button type="button" class="related-chip" data-slug="${T(d.slug)}">${T(d.title)} <span class="backlink-kind">${T(d.kind)}</span></button>`).join("")}
|
|
110
|
-
</div>
|
|
111
|
-
`,g.querySelectorAll(".related-chip").forEach(d=>{d.addEventListener("click",()=>{const b=d.dataset.slug;b&&e.dispatchEvent(new CustomEvent("navigate-slug",{detail:{slug:b}}))})}))}).catch(()=>{})}function T(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Ht(e){return Lt(e)}function Ut(e,n){const t=n.find(u=>u.slug===e);if(t)return t.slug;const r=e.toLowerCase(),p=n.find(u=>u.title.toLowerCase()===r);return(p==null?void 0:p.slug)??null}function Ft(e,n,t){const r=new Set(n),p=[];for(const u of Ht(e)){const i=Ut(u,t);!i||r.has(i)||p.includes(i)||p.push(i)}return p}function jt(e,n,t){const r=e.toLowerCase();if(!r)return 1;const p=n.toLowerCase(),u=t.toLowerCase();return p.startsWith(r)||u.startsWith(r)?3:p.includes(r)||u.includes(r)?2:0}function an(e,n,t=12){return n.map(r=>({doc:r,score:jt(e,r.slug,r.title)})).filter(r=>r.score>0).sort((r,p)=>p.score-r.score||r.doc.slug.localeCompare(p.doc.slug)).slice(0,t).map(r=>r.doc)}let R=null,j=null;function It(e,n,t,r=[]){var ee,te,ne,se,re,ie,ae,oe,le,de,ue,ce;const p=r.map(c=>({slug:c.slug,title:c.title})),u=p.map(c=>c.slug);let i=null,v=n.body;e.className="workspace-main workspace-editor";const $=G(n.type);e.innerHTML=`
|
|
112
|
-
<nav class="breadcrumb" aria-label="Breadcrumb">
|
|
113
|
-
<span class="crumb">Knowledge</span>
|
|
114
|
-
<span class="crumb-sep">›</span>
|
|
115
|
-
<span class="crumb">Drafts</span>
|
|
116
|
-
<span class="crumb-sep">›</span>
|
|
117
|
-
<span class="crumb current">${I(n.title||n.slug)}</span>
|
|
118
|
-
</nav>
|
|
119
|
-
<div class="page-layout">
|
|
120
|
-
<div class="page-content">
|
|
121
|
-
<header class="page-header">
|
|
122
|
-
<input id="ed-title" class="title-input doc-title" type="text" placeholder="Document title" />
|
|
123
|
-
<div class="workspace-actions">
|
|
124
|
-
<div class="publish-split">
|
|
125
|
-
<button type="button" id="ed-publish" class="btn-primary publish-main">Publish</button>
|
|
126
|
-
<button type="button" id="ed-publish-menu-btn" class="btn-primary publish-menu-trigger" aria-haspopup="true" aria-expanded="false">▾</button>
|
|
127
|
-
<div id="ed-publish-menu" class="publish-menu hidden" role="menu">
|
|
128
|
-
<button type="button" id="ed-publish-review" role="menuitem">Review changes</button>
|
|
129
|
-
</div>
|
|
130
|
-
</div>
|
|
131
|
-
<button type="button" id="ed-view-md" class="btn-ghost">View markdown</button>
|
|
132
|
-
<button type="button" id="ed-close" class="btn-ghost">Close</button>
|
|
133
|
-
<button type="button" id="ed-discard" class="btn-ghost">Discard draft</button>
|
|
134
|
-
</div>
|
|
135
|
-
</header>
|
|
136
|
-
<div id="ed-visual-canvas"></div>
|
|
137
|
-
</div>
|
|
138
|
-
<aside class="page-info">
|
|
139
|
-
<h2 class="page-info-title">Page properties</h2>
|
|
140
|
-
<div class="workspace-badges editor-badges">
|
|
141
|
-
<span class="badge badge-draft">draft</span>
|
|
142
|
-
${n.forked_from?`<span class="badge">fork: ${I(n.forked_from)}</span>`:""}
|
|
143
|
-
</div>
|
|
144
|
-
<div class="meta-grid editor-meta">
|
|
145
|
-
<div class="field"><label>Slug</label><input id="ed-slug" /></div>
|
|
146
|
-
<div class="field"><label>Catalog</label><input id="ed-catalog" readonly value="${I($)}" /></div>
|
|
147
|
-
<div class="field"><label>Type</label>
|
|
148
|
-
<select id="ed-type">
|
|
149
|
-
<option value="adr">adr</option>
|
|
150
|
-
<option value="feature-spec">feature-spec</option>
|
|
151
|
-
<option value="glossary-term">glossary-term</option>
|
|
152
|
-
<option value="open-question">open-question</option>
|
|
153
|
-
<option value="agent-instruction">agent-instruction</option>
|
|
154
|
-
<option value="wiki-page">wiki-page</option>
|
|
155
|
-
</select>
|
|
156
|
-
</div>
|
|
157
|
-
<div class="field"><label>Status</label>
|
|
158
|
-
<select id="ed-status">
|
|
159
|
-
<option value="draft">draft</option>
|
|
160
|
-
<option value="proposed">proposed</option>
|
|
161
|
-
<option value="accepted">accepted</option>
|
|
162
|
-
<option value="superseded">superseded</option>
|
|
163
|
-
</select>
|
|
164
|
-
</div>
|
|
165
|
-
<div class="field field-wide"><label>Tags</label><input id="ed-tags" placeholder="comma-separated" /></div>
|
|
166
|
-
<div class="field field-wide"><label>Related</label><input id="ed-related" list="ed-related-suggestions" placeholder="slug-one, slug-two" /></div>
|
|
167
|
-
</div>
|
|
168
|
-
<datalist id="ed-related-suggestions">
|
|
169
|
-
${u.map(c=>`<option value="${c}"></option>`).join("")}
|
|
170
|
-
</datalist>
|
|
171
|
-
</aside>
|
|
172
|
-
</div>
|
|
173
|
-
<div id="publish-modal" class="modal hidden">
|
|
174
|
-
<div class="modal-card modal-card-wide">
|
|
175
|
-
<p>Publish to git as markdown?</p>
|
|
176
|
-
<code id="publish-target"></code>
|
|
177
|
-
<pre id="publish-diff" class="diff-preview"></pre>
|
|
178
|
-
<div id="publish-related" class="publish-related hidden">
|
|
179
|
-
<p id="publish-related-prompt"></p>
|
|
180
|
-
<ul id="publish-related-list" class="publish-related-list"></ul>
|
|
181
|
-
<div class="editor-actions">
|
|
182
|
-
<button type="button" id="publish-related-apply" class="btn-primary">Add to related</button>
|
|
183
|
-
<button type="button" id="publish-related-skip" class="btn-ghost">Skip</button>
|
|
184
|
-
</div>
|
|
185
|
-
</div>
|
|
186
|
-
<div class="editor-actions">
|
|
187
|
-
<button type="button" id="publish-confirm" class="btn-primary">Confirm</button>
|
|
188
|
-
<button type="button" id="publish-cancel" class="btn-ghost">Cancel</button>
|
|
189
|
-
</div>
|
|
190
|
-
</div>
|
|
191
|
-
</div>
|
|
192
|
-
<div id="view-md-modal" class="modal hidden">
|
|
193
|
-
<div class="modal-card modal-card-wide">
|
|
194
|
-
<h3 class="modal-title">Markdown source</h3>
|
|
195
|
-
<pre id="view-md-content" class="md-source"></pre>
|
|
196
|
-
<div class="editor-actions">
|
|
197
|
-
<button type="button" id="view-md-copy" class="btn-primary">Copy</button>
|
|
198
|
-
<button type="button" id="view-md-close" class="btn-ghost">Close</button>
|
|
199
|
-
</div>
|
|
200
|
-
</div>
|
|
201
|
-
</div>
|
|
202
|
-
`;const E=e.querySelector("#ed-title"),y=e.querySelector("#ed-slug"),P=e.querySelector("#ed-type"),S=e.querySelector("#ed-status"),q=e.querySelector("#ed-tags"),L=e.querySelector("#ed-related"),m=e.querySelector("#ed-visual-canvas"),o=e.querySelector("#publish-modal"),h=e.querySelector("#view-md-modal"),f=e.querySelector("#ed-publish-menu");E.value=n.title,y.value=n.slug,P.value=n.type,S.value=n.status,q.value=n.tags.join(", "),L.value=n.related.join(", "),$e(async()=>{const{mountVisualEditor:c}=await import("./visual-editor-UWcMGp6p.js");return{mountVisualEditor:c}},__vite__mapDeps([3,2,4,5])).then(({mountVisualEditor:c})=>{i=c(m,{initialMarkdown:n.body,docCandidates:p,onBodyChange:()=>d(),onError:t.onError})});let w=[];function s(c){return c.split(",").map(C=>C.trim()).filter(Boolean)}function l(){return(i==null?void 0:i.getMarkdownBody())??v}function a(){return{title:E.value,slug:y.value,type:P.value,status:S.value,tags:s(q.value),related:s(L.value),body:l()}}async function g(){const c=a();v=c.body,await Ve(n.id,c)}function d(){R&&clearTimeout(R),R=setTimeout(()=>{R=null,j=g().catch(c=>{t.onError(c instanceof Error?c.message:"Autosave failed")})},800)}async function b(){R&&(clearTimeout(R),R=null,j=g().catch(c=>{throw t.onError(c instanceof Error?c.message:"Autosave failed"),c})),j&&(await j,j=null)}const x=()=>{const c=e.querySelector("#ed-catalog");c&&(c.value=G(P.value)),d()};for(const c of[E,y,P,S,q,L])c.addEventListener("input",x),c.addEventListener("change",x);function z(){const c=e.querySelector("#publish-related"),C=e.querySelector("#publish-related-prompt"),M=e.querySelector("#publish-related-list");if(w=Ft(l(),s(L.value),p),w.length===0){c.classList.add("hidden");return}C.textContent=`Add ${w.length} body link(s) to related?`,M.innerHTML=w.map(_=>{var pe;const He=((pe=p.find(Ue=>Ue.slug===_))==null?void 0:pe.title)??_;return`<li><code>${I(_)}</code> — ${I(He)}</li>`}).join(""),c.classList.remove("hidden")}function De(){var C;if(w.length===0)return;const c=[...new Set([...s(L.value),...w])];L.value=c.join(", "),w=[],(C=e.querySelector("#publish-related"))==null||C.classList.add("hidden"),d()}(ee=e.querySelector("#publish-related-apply"))==null||ee.addEventListener("click",()=>{De()}),(te=e.querySelector("#publish-related-skip"))==null||te.addEventListener("click",()=>{var c;w=[],(c=e.querySelector("#publish-related"))==null||c.classList.add("hidden")});let W=null;function B(){o.classList.add("hidden"),W&&(document.removeEventListener("keydown",W),W=null)}function Re(){o.classList.remove("hidden"),W||(W=c=>{c.key==="Escape"&&B()},document.addEventListener("keydown",W))}function Z(){h.classList.add("hidden")}function Ne(){const c=e.querySelector("#view-md-content");c.textContent=l(),h.classList.remove("hidden")}async function We(){await b(),Re(),z();const c=e.querySelector("#publish-target"),C=e.querySelector("#publish-diff");c.textContent=`docs/.../${y.value}.md`,C.textContent="Loading diff…";try{const M=await Xe(n.id);M.targetPath&&(c.textContent=M.targetPath),C.textContent=M.diff}catch(M){C.textContent=M instanceof Error?M.message:"Diff unavailable"}}async function _e(){const c=e.querySelector("#ed-publish");c.setAttribute("aria-busy","true"),c.disabled=!0;try{await b();const{result:C}=await V(n.id);t.onPublished(C.path)}finally{c.removeAttribute("aria-busy"),c.disabled=!1}}(ne=e.querySelector("#ed-publish"))==null||ne.addEventListener("click",()=>{_e().catch(c=>{t.onError(c instanceof Error?c.message:"Publish failed")})}),(se=e.querySelector("#ed-publish-review"))==null||se.addEventListener("click",()=>{f.classList.add("hidden"),We().catch(c=>{t.onError(c instanceof Error?c.message:"Failed to prepare publish")})}),(re=e.querySelector("#ed-publish-menu-btn"))==null||re.addEventListener("click",()=>{var C;const c=f.classList.toggle("hidden");(C=e.querySelector("#ed-publish-menu-btn"))==null||C.setAttribute("aria-expanded",c?"false":"true")}),document.addEventListener("click",c=>{var M,_;const C=c.target;!f.contains(C)&&!((M=e.querySelector("#ed-publish-menu-btn"))!=null&&M.contains(C))&&(f.classList.add("hidden"),(_=e.querySelector("#ed-publish-menu-btn"))==null||_.setAttribute("aria-expanded","false"))}),(ie=e.querySelector("#ed-view-md"))==null||ie.addEventListener("click",()=>{Ne()}),(ae=e.querySelector("#view-md-close"))==null||ae.addEventListener("click",()=>{Z()}),h.addEventListener("click",c=>{c.target===h&&Z()}),(oe=e.querySelector("#view-md-copy"))==null||oe.addEventListener("click",()=>{navigator.clipboard.writeText(l()).catch(c=>{t.onError(c instanceof Error?c.message:"Copy failed")})}),(le=e.querySelector("#publish-cancel"))==null||le.addEventListener("click",()=>{B()}),o.addEventListener("click",c=>{c.target===o&&B()}),(de=e.querySelector("#publish-confirm"))==null||de.addEventListener("click",()=>{(async()=>{await b();const{result:c}=await V(n.id);B(),t.onPublished(c.path)})().catch(c=>{t.onError(c instanceof Error?c.message:"Publish failed")})}),(ue=e.querySelector("#ed-close"))==null||ue.addEventListener("click",()=>{i==null||i.destroy(),t.onClosed()}),(ce=e.querySelector("#ed-discard"))==null||ce.addEventListener("click",()=>{confirm("Discard this draft?")&&(i==null||i.destroy(),Je(n.id).then(()=>t.onDeleted()).catch(c=>{t.onError(c instanceof Error?c.message:"Delete failed")}))})}function I(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function we(e){const n=[];function t(r){r.indexPageSlug&&n.push(r.indexPageSlug);for(const p of r.children)p.kind==="page"?n.push(p.slug):t(p)}return t(e),n}function Ot(e){if(!(e instanceof HTMLElement))return!1;const n=e.tagName;return n==="INPUT"||n==="TEXTAREA"||n==="SELECT"?!0:e.isContentEditable}function Bt(e){const n=t=>{if(t.metaKey||t.ctrlKey||t.altKey)return;const r=Ot(t.target);if(t.key==="/"&&!r){t.preventDefault(),e.onFocusSearch();return}if(!r)switch(t.key){case"j":t.preventDefault(),e.onNext();break;case"k":t.preventDefault(),e.onPrev();break;case"e":e.onEdit();break}};return document.addEventListener("keydown",n),()=>document.removeEventListener("keydown",n)}const Me="repomind-tree-expanded";function Kt(){try{const e=localStorage.getItem(Me);return e?new Set(JSON.parse(e)):new Set([""])}catch{return new Set([""])}}function J(e){localStorage.setItem(Me,JSON.stringify([...e]))}function Gt(e){return e.emoji?e.emoji:"📁"}function zt(e,n){if(n==="json")return"{ }";if(n==="yaml")return"Y";const t=ct(e);return t.length===1?t:"📄"}function Jt(){document.querySelectorAll(".tree-context-menu").forEach(e=>e.remove())}function xe(e){const n=[e.relativePath];for(const t of e.children??[])t.kind==="folder"&&n.push(...xe(t));return n}function Se(){const e=window.prompt("Page name (without .md):");return e!=null&&e.trim()?e.trim():null}function be(e,n,t,r){nt(e,n,void 0,t).then(({draft:p})=>{var u,i;(u=r.onTreeChanged)==null||u.call(r),(i=r.onSelectDraft)==null||i.call(r,p)}).catch(p=>{var u;(u=r.onError)==null||u.call(r,p instanceof Error?p.message:"Create page failed")})}function Vt(e,n,t){var L,m,o,h,f,w;Jt();const{kind:r,parentPath:p,folderPath:u,page:i,tree:v,templates:$}=n,E=r==="page"&&i?xe(v).filter(s=>{const l=i.relativePath.includes("/")?i.relativePath.slice(0,i.relativePath.lastIndexOf("/")):"";return s!==l}):[],y=document.createElement("div");y.className="tree-create-menu tree-context-menu",y.innerHTML=`
|
|
203
|
-
<div class="tree-menu-label">Create</div>
|
|
204
|
-
<button type="button" data-action="page">New page</button>
|
|
205
|
-
${$.map(s=>`<button type="button" data-action="template" data-template="${Ee(s.id)}">From template: ${U(s.label)}</button>`).join("")}
|
|
206
|
-
<button type="button" data-action="folder">New folder</button>
|
|
207
|
-
${r==="folder"&&u?'<button type="button" data-action="emoji">Set emoji</button>':""}
|
|
208
|
-
${r==="page"&&i?`
|
|
209
|
-
<div class="tree-menu-label">Page</div>
|
|
210
|
-
<button type="button" data-action="rename">Rename…</button>
|
|
211
|
-
${E.length>0?'<div class="tree-menu-label">Move to</div>':""}
|
|
212
|
-
${E.map(s=>`<button type="button" data-action="move" data-folder="${Ee(s)}">${U(s||"(root)")}</button>`).join("")}
|
|
213
|
-
<button type="button" data-action="delete-page" class="tree-menu-danger">Delete page</button>
|
|
214
|
-
`:""}
|
|
215
|
-
${r==="folder"&&u?'<button type="button" data-action="delete-folder" class="tree-menu-danger">Delete folder</button>':""}
|
|
216
|
-
`;const P=e.getBoundingClientRect();y.style.top=`${P.bottom+4}px`,y.style.left=`${Math.max(8,P.left-160)}px`,document.body.appendChild(y);const S=()=>y.remove(),q=s=>{y.contains(s.target)||(S(),document.removeEventListener("click",q))};setTimeout(()=>document.addEventListener("click",q),0),(L=y.querySelector('[data-action="page"]'))==null||L.addEventListener("click",()=>{S();const s=Se();s&&be(p,s,void 0,t)}),y.querySelectorAll('[data-action="template"]').forEach(s=>{s.addEventListener("click",()=>{S();const l=Se();l&&be(p,l,s.dataset.template,t)})}),(m=y.querySelector('[data-action="folder"]'))==null||m.addEventListener("click",()=>{S();const s=window.prompt("Folder name:");s!=null&&s.trim()&&Qe(p,s.trim()).then(()=>{var l;return(l=t.onTreeChanged)==null?void 0:l.call(t)}).catch(l=>{var a;(a=t.onError)==null||a.call(t,l instanceof Error?l.message:"Create folder failed")})}),(o=y.querySelector('[data-action="emoji"]'))==null||o.addEventListener("click",()=>{S();const s=window.prompt("Emoji for this folder:");s!==null&&Ze(u,s).then(()=>{var l;return(l=t.onTreeChanged)==null?void 0:l.call(t)}).catch(l=>{var a;(a=t.onError)==null||a.call(t,l instanceof Error?l.message:"Set emoji failed")})}),(h=y.querySelector('[data-action="rename"]'))==null||h.addEventListener("click",()=>{var a;if(S(),!i)return;const s=((a=i.relativePath.split("/").pop())==null?void 0:a.replace(/\.md$/,""))??i.name,l=window.prompt("New page name (without .md):",s);!(l!=null&&l.trim())||l.trim()===s||et(i.relativePath,l.trim()).then(({result:g})=>{var d,b,x;(d=t.onTreeChanged)==null||d.call(t),g.cascadeUpdated.length>0?(b=t.onNotify)==null||b.call(t,`Renamed to ${g.slug}; updated links in ${g.cascadeUpdated.length} file(s).`):g.slugChanged&&g.inboundWarnings.length>0&&((x=t.onError)==null||x.call(t,`Renamed to ${g.slug}; ${g.inboundWarnings.length} page(s) may still reference the old slug.`)),t.onSelectSlug(g.slug)}).catch(g=>{var d;(d=t.onError)==null||d.call(t,g instanceof Error?g.message:"Rename failed")})}),y.querySelectorAll('[data-action="move"]').forEach(s=>{s.addEventListener("click",()=>{if(S(),!i)return;const l=s.dataset.folder??"";tt(i.relativePath,l).then(({result:a})=>{var g,d,b;(g=t.onTreeChanged)==null||g.call(t),a.cascadeUpdated.length>0?(d=t.onNotify)==null||d.call(t,`Moved to ${a.relativePath}; updated links in ${a.cascadeUpdated.length} file(s).`):a.slugChanged&&a.inboundWarnings.length>0&&((b=t.onError)==null||b.call(t,`Moved; slug is now ${a.slug}. ${a.inboundWarnings.length} page(s) still reference the old slug.`)),t.onSelectSlug(a.slug)}).catch(a=>{var g;(g=t.onError)==null||g.call(t,a instanceof Error?a.message:"Move failed")})})}),(f=y.querySelector('[data-action="delete-page"]'))==null||f.addEventListener("click",()=>{S(),i&&window.confirm(`Delete page "${i.title}"?`)&&fe(i.relativePath,"page").then(({result:s})=>{var l,a,g,d;(l=t.onFsDeleted)==null||l.call(t,[s.slug]),(a=t.onTreeChanged)==null||a.call(t),s.cascadeUpdated.length>0?(g=t.onNotify)==null||g.call(t,`Deleted ${s.slug}; cleaned links in ${s.cascadeUpdated.length} file(s).`):s.inboundWarnings.length>0&&((d=t.onError)==null||d.call(t,`${s.inboundWarnings.length} page(s) still reference deleted slug "${s.slug}".`))}).catch(s=>{var l;(l=t.onError)==null||l.call(t,s instanceof Error?s.message:"Delete failed")})}),(w=y.querySelector('[data-action="delete-folder"]'))==null||w.addEventListener("click",()=>{S(),u&&window.confirm(`Delete folder "${u}" and all pages inside?`)&&fe(u,"folder").then(({result:s})=>{var l,a,g,d;(l=t.onFsDeleted)==null||l.call(t,s.deletedSlugs),(a=t.onTreeChanged)==null||a.call(t),s.cascadeUpdated.length>0?(g=t.onNotify)==null||g.call(t,`Deleted folder; cleaned links in ${s.cascadeUpdated.length} file(s).`):s.inboundWarnings.length>0&&((d=t.onError)==null||d.call(t,`${s.inboundWarnings.length} page(s) still reference deleted page(s).`))}).catch(s=>{var l;(l=t.onError)==null||l.call(t,s instanceof Error?s.message:"Delete folder failed")})})}function Xt(e,n,t,r){var m;e.innerHTML=`
|
|
217
|
-
<nav id="docs-tree" class="docs-tree" aria-label="Documentation tree"></nav>
|
|
218
|
-
<section class="catalog-section catalog-drafts">
|
|
219
|
-
<button type="button" class="catalog-header" data-catalog="__drafts__" aria-expanded="true">
|
|
220
|
-
<span class="catalog-chevron" aria-hidden="true">▾</span>
|
|
221
|
-
<span class="catalog-icon catalog-icon--draft" aria-hidden="true">✎</span>
|
|
222
|
-
<span class="catalog-label">Drafts</span>
|
|
223
|
-
<span class="catalog-count">${t.length}</span>
|
|
224
|
-
</button>
|
|
225
|
-
<ul id="draft-list" class="catalog-pages"></ul>
|
|
226
|
-
</section>
|
|
227
|
-
`;const p=e.querySelector("#docs-tree"),u=e.querySelector("#draft-list"),i=Kt();let v=null,$=null,E=null;async function y(o,h){var f;try{v||(v=(await Ye()).templates),Vt(o,{...h,templates:v},r)}catch(w){(f=r.onError)==null||f.call(r,w instanceof Error?w.message:"Failed to open menu")}}function P(o,h){var s,l;const f=document.createElement("div");f.className="tree-row",f.style.paddingLeft=`${h*12+8}px`,o.slug===$&&f.classList.add("active"),f.innerHTML=`
|
|
228
|
-
<span class="tree-spacer" aria-hidden="true"></span>
|
|
229
|
-
<button type="button" class="tree-label">
|
|
230
|
-
<span class="tree-icon tree-icon--page">${zt(o.type,o.contentKind)}</span>
|
|
231
|
-
<span class="tree-title">${U(o.title)}</span>
|
|
232
|
-
</button>
|
|
233
|
-
<button type="button" class="tree-menu" title="Actions">⋯</button>
|
|
234
|
-
`;const w=o.relativePath.includes("/")?o.relativePath.slice(0,o.relativePath.lastIndexOf("/")):"";return(s=f.querySelector(".tree-menu"))==null||s.addEventListener("click",a=>{a.stopPropagation(),y(a.currentTarget,{kind:"page",parentPath:w,folderPath:w,page:o,tree:n})}),(l=f.querySelector(".tree-label"))==null||l.addEventListener("click",()=>{$=o.slug,E=null,q(),L(),r.onSelectSlug(o.slug)}),f}function S(o,h){var l,a,g;const f=document.createElement("div");f.className="tree-folder";const w=i.has(o.relativePath),s=document.createElement("div");if(s.className="tree-row",s.style.paddingLeft=`${h*12+8}px`,s.innerHTML=`
|
|
235
|
-
<button type="button" class="tree-toggle" aria-expanded="${w}">${w?"▾":"▸"}</button>
|
|
236
|
-
<button type="button" class="tree-label">
|
|
237
|
-
<span class="tree-icon tree-icon--folder">${Gt(o)}</span>
|
|
238
|
-
<span class="tree-title">${U(o.name)}</span>
|
|
239
|
-
</button>
|
|
240
|
-
<button type="button" class="tree-menu" title="Actions">⋯</button>
|
|
241
|
-
`,(l=s.querySelector(".tree-toggle"))==null||l.addEventListener("click",d=>{d.stopPropagation(),i.has(o.relativePath)?i.delete(o.relativePath):i.add(o.relativePath),J(i),q()}),(a=s.querySelector(".tree-label"))==null||a.addEventListener("click",()=>{if(o.indexPageSlug){$=o.indexPageSlug,E=null,q(),L(),r.onSelectSlug(o.indexPageSlug);return}i.has(o.relativePath)?i.delete(o.relativePath):i.add(o.relativePath),J(i),q()}),(g=s.querySelector(".tree-menu"))==null||g.addEventListener("click",d=>{d.stopPropagation(),y(d.currentTarget,{kind:"folder",parentPath:o.relativePath,folderPath:o.relativePath,tree:n})}),f.appendChild(s),w){const d=document.createElement("div");d.className="tree-children";for(const b of o.children??[])b.kind==="folder"?d.appendChild(S(b,h+1)):d.appendChild(P(b,h+1));f.appendChild(d)}return f}function q(){p.innerHTML="",p.appendChild(S(n,0))}function L(){if(u.innerHTML="",t.length===0){u.innerHTML='<li class="placeholder page-item">No drafts</li>';return}for(const o of t){const h=document.createElement("li");h.className="page-item",o.id===E&&h.classList.add("active"),h.innerHTML=`<span class="page-title">${U(o.title||o.slug)}</span><span class="status-chip status-draft">draft</span>`,h.addEventListener("click",()=>{var f;E=o.id,$=null,q(),L(),(f=r.onSelectDraft)==null||f.call(r,o)}),u.appendChild(h)}}q(),L(),(m=e.querySelector('[data-catalog="__drafts__"]'))==null||m.addEventListener("click",()=>{const o=e.querySelector("#draft-list"),h=e.querySelector('[data-catalog="__drafts__"]'),f=(o==null?void 0:o.classList.toggle("hidden"))===!1;h==null||h.setAttribute("aria-expanded",String(f));const w=h==null?void 0:h.querySelector(".catalog-chevron");w&&(w.textContent=f?"▾":"▸")}),e.setActiveSlug=o=>{$=o,E=null,i.add(""),J(i),q(),L()},e.setActiveDraft=o=>{E=o,$=null,q(),L()},e.refreshDrafts=o=>{t.length=0,t.push(...o),L();const h=e.querySelector(".catalog-drafts .catalog-count");h&&(h.textContent=String(t.length))},e.refreshTree=(o,h)=>{n.children=o.children??[],n.emoji=o.emoji,n.indexPageSlug=o.indexPageSlug,n.name=o.name,t.length=0,t.push(...h??[]),q(),L()}}function U(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function Ee(e){return U(e)}function Yt(e){const n=new EventSource("/api/events");return n.onmessage=()=>{e()},()=>{n.close()}}kt();st();function Qt(e){return new Map(e.map(n=>[n.relativePath,n.slug]))}function Zt(e,n){var t;return(t=e.find(r=>r.slug===n))==null?void 0:t.relativePath}function k(e,n=!1){const t=document.querySelector("#banner");t&&(t.textContent=e,t.classList.toggle("error",n),t.classList.remove("hidden"),setTimeout(()=>t.classList.add("hidden"),5e3))}async function en(e){var t;const{drafts:n}=await O();return(t=e.refreshDrafts)==null||t.call(e,n),n}async function tn(){var w;rt(document.querySelector("#theme-toggle"));const e=document.querySelector("#sidebar"),n=document.querySelector("#workspace"),t=document.querySelector("#health-toggle"),r=document.querySelector("#stats"),p=document.querySelector("#global-search"),u=document.querySelector("#search-dropdown");let i=[],v=null,$=[],E="workspace",y=null,P=null;async function S(s){var g;const[{tree:l},{drafts:a}]=await Promise.all([ge(),O()]);return(g=s.refreshTree)==null||g.call(s,l,a),$=we(l),l}function q(s){if(E=s,t.setAttribute("aria-pressed",String(s==="dashboard")),s==="dashboard"){y=pt(n,{onOpenDraft:a=>{q("workspace"),o(a)},onPublished:a=>{(async()=>(await S(e),await L(),k(`Published: ${a}`)))()},onNotify:(a,g)=>k(a,g)}).refresh;return}y=null,D(n,null)}t.addEventListener("click",()=>{q(E==="dashboard"?"workspace":"dashboard")}),Bt({onNext:()=>{if(E!=="workspace"||!v)return;const s=$.indexOf(v);s>=0&&s<$.length-1&&f($[s+1])},onPrev:()=>{if(E!=="workspace"||!v)return;const s=$.indexOf(v);s>0&&f($[s-1])},onFocusSearch:()=>{p.focus(),p.select()},onEdit:()=>{E==="workspace"&&v&&h(v)}});async function L(){const s=await ot(),a=await(await fetch("/api/stats")).json(),{drafts:g}=await O(),d=a.brokenRelatedCount>0?` · ${a.brokenRelatedCount} broken links`:"";r.textContent=`v${s.version} · ${s.docCount} pages · ${g.length} drafts${d}`}function m(s){if(s.length===0){u.innerHTML='<p class="search-empty">No matches</p>',u.classList.remove("hidden");return}const l=document.createElement("ul");l.className="search-results";for(const a of s){const g=i.find(b=>b.slug===a.slug),d=document.createElement("li");d.innerHTML=`
|
|
242
|
-
<div class="search-result-title">${a.title}</div>
|
|
243
|
-
<div class="search-result-meta">${G((g==null?void 0:g.type)??"")} · ${a.snippet}</div>
|
|
244
|
-
`,d.addEventListener("click",()=>{u.classList.add("hidden"),p.value="",f(a.slug)}),l.appendChild(d)}u.innerHTML="",u.appendChild(l),u.classList.remove("hidden")}p.addEventListener("input",()=>{const s=p.value.trim();if(P&&clearTimeout(P),!s){u.classList.add("hidden"),u.innerHTML="";return}P=setTimeout(()=>{it(s).then(({results:l})=>m(l)).catch(l=>k(l instanceof Error?l.message:"Search failed",!0))},300)}),document.addEventListener("click",s=>{!u.contains(s.target)&&s.target!==p&&u.classList.add("hidden")});function o(s){var l;q("workspace"),(l=e.setActiveDraft)==null||l.call(e,s.id),It(n,s,{onPublished:a=>{(async()=>(i=(await F()).docs,await S(e),await L(),y==null||y(),k(`Published: ${a}`),await f(s.slug)))()},onClosed:()=>{f(s.forked_from??s.slug).catch(()=>{D(n,null)})},onDeleted:()=>{(async()=>(await S(e),D(n,null)))()},onError:a=>k(a,!0)},i)}async function h(s){try{const{draft:l}=await lt(s);await en(e),o(l)}catch(l){k(l instanceof Error?l.message:"Edit failed",!0)}}async function f(s,l={}){var d;const a=l.updateUrl??!0,g=l.urlMode??"push";E==="dashboard"&&q("workspace"),v=s,(d=e.setActiveSlug)==null||d.call(e,s);try{const b=await at(s),x=Zt(i,s);D(n,b,{onEdit:z=>{h(z)},docRelativePath:x,slugByRelative:Qt(i),onCopyLink:()=>k("Link copied")}),a&&Mt(s,g)}catch(b){k(b instanceof Error?b.message:"Failed to load doc",!0)}}n.addEventListener("navigate-slug",(s=>{f(s.detail.slug)}));try{await L();const[s,{tree:l},{drafts:a}]=await Promise.all([F(),ge(),O()]);i=s.docs,$=we(l),Xt(e,l,a,{onSelectSlug:d=>{f(d)},onSelectDraft:d=>o(d),onTreeChanged:()=>{(async()=>(i=(await F()).docs,await S(e),await L()))()},onFsDeleted:d=>{(async()=>(i=(await F()).docs,v&&d.includes(v)&&(v=null,D(n,null)),await S(e),await L()))()},onError:d=>k(d,!0),onNotify:d=>k(d)}),Yt(()=>{(async()=>{try{i=(await F()).docs,await S(e),await L(),v&&!i.some(b=>b.slug===v)&&(v=null,D(n,null))}catch{}})()}),xt(d=>{if(!d){v=null,D(n,null);return}i.some(b=>b.slug===d)&&f(d,{updateUrl:!1})}),D(n,null);const g=Q();if(g)i.some(d=>d.slug===g)?await f(g,{updateUrl:!1}):k(`Unknown page: ${g}`,!0);else{const d=Tt(),b=d?(w=i.find(x=>x.relativePath===d))==null?void 0:w.slug:void 0;d&&b?await f(b,{updateUrl:!1}):d?k(`Unknown path: ${d}`,!0):l.indexPageSlug?await f(l.indexPageSlug,{urlMode:"replace"}):i.length>0&&i[0]&&await f(i[0].slug,{urlMode:"replace"})}}catch(s){k(s instanceof Error?s.message:"Failed to load workspace",!0)}}tn();export{$e as _,an as a,rn as f,Ce as p};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as r,b as e,a,S as s}from"./chunk-AQP2D5EJ-Vaux-7Ld.js";import{_ as i}from"./mermaid.core-C57NVZG0.js";import"./transform-BwXaE9hv.js";import"./chunk-55IACEB6-CbthXzDA.js";import"./chunk-2J33WTMH-Cy3md3pb.js";import"./main-Du7fLv5Y.js";import"./theme-DxqwV6dp.js";import"./editor-BcAuZsp8.js";var b={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{b as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root,[data-theme=light]{--bg: #ffffff;--panel: #f4f5f7;--border: #dfe1e6;--text: #172b4d;--muted: #626f86;--accent: #0c66e4;--accent-subtle: #e9f2ff;--link: #0c66e4;--link-hover: #0055cc;--table-stripe: #fafbfc;--table-header: #f4f5f7;--shadow: rgba(9, 30, 66, .15);--folder-icon-bg: #dfe1e6;--folder-icon-fg: #42526e}[data-theme=dark]{--bg: #0f1419;--panel: #1a2332;--border: #2d3a4f;--text: #e8edf4;--muted: #8b9cb3;--accent: #5b9fd4;--accent-subtle: rgba(91, 159, 212, .15);--link: #9ec5f0;--link-hover: #c2dbf7;--table-stripe: rgba(255, 255, 255, .03);--table-header: #1a2332;--shadow: rgba(0, 0, 0, .45);--folder-icon-bg: #3d4f6f;--folder-icon-fg: #f4f5f7}*{box-sizing:border-box}body{margin:0;font-family:system-ui,-apple-system,sans-serif;background:var(--bg);color:var(--text);min-height:100vh}#app{display:flex;flex-direction:column;height:100vh}.topbar{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.5rem 1rem;border-bottom:1px solid var(--border);background:var(--bg);flex-shrink:0}.topbar-left{display:flex;align-items:center;gap:1rem;flex:1;min-width:0}.topbar-right{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.topbar-search-wrap{position:relative;flex:1;max-width:420px}.topbar-search-wrap input{width:100%;padding:.45rem .75rem;border:1px solid var(--border);border-radius:var(--rm-radius, 4px);background:var(--panel);font-size:.875rem}.topbar-search-wrap input:focus{outline:2px solid var(--accent-subtle);border-color:var(--accent)}.search-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--bg);border:1px solid var(--border);border-radius:6px;box-shadow:0 8px 24px var(--shadow);max-height:320px;overflow:auto;z-index:50}.search-empty{margin:0;padding:.75rem 1rem;color:var(--muted);font-size:.85rem}.search-result-title{font-weight:600;font-size:.875rem}.search-result-meta{font-size:.75rem;color:var(--muted);margin-top:.15rem}.brand{font-weight:700;letter-spacing:.02em}.stats{font-size:.85rem;color:var(--muted)}.layout{display:grid;grid-template-columns:280px 1fr;flex:1;min-height:0}.sidebar{background:var(--bg);border-right:1px solid var(--border);overflow:auto;padding:.75rem .5rem}.workspace{display:flex;flex-direction:column;min-height:0;min-width:0;background:var(--bg)}.workspace-main{flex:1;min-height:0;overflow:auto;padding:1.5rem 2rem;display:flex;flex-direction:column}.graph-panel{position:relative;height:100%;width:100%;background:var(--panel)}.graph-panel svg{display:block;width:100%;height:100%}.graph-page{display:flex;flex-direction:column;height:100vh}.graph-fullscreen{flex:1;min-height:0;position:relative;background:var(--panel)}.graph-fullscreen svg{display:block;width:100%;height:100%}.graph-back{text-decoration:none;display:inline-flex;align-items:center}.graph-empty{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:.85rem}.workspace-toolbar{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem;flex-shrink:0}.workspace-title-row{flex:1;min-width:0}.doc-title{font-size:1.75rem;font-weight:600;margin:0;line-height:1.25}.title-input{width:100%;font-size:1.35rem;font-weight:600;padding:.35rem .5rem;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--text)}.title-input:hover,.title-input:focus{border-color:var(--border);background:var(--panel);outline:none}.workspace-badges{display:flex;flex-wrap:wrap;gap:.35rem}.workspace-actions{display:flex;gap:.5rem;flex-shrink:0}.workspace-empty{margin:auto;text-align:center;max-width:360px}.workspace-empty h1{font-size:1.25rem;margin:0 0 .5rem}.workspace-footer{margin-top:auto;padding-top:1rem;border-top:1px solid var(--border);flex-shrink:0}.workspace-footer code{font-size:.75rem;color:var(--muted);word-break:break-all}.meta-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:.75rem;margin-bottom:1rem;flex-shrink:0}.field-wide{grid-column:span 2}.split-editor{display:grid;grid-template-columns:1fr 1fr;gap:0;flex:1;min-height:320px;border:1px solid var(--border);border-radius:6px;overflow:hidden}.split-pane{display:flex;flex-direction:column;min-height:0;min-width:0}.split-pane+.split-pane{border-left:1px solid var(--border)}.pane-label{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);padding:.35rem .75rem;background:var(--panel);border-bottom:1px solid var(--border);flex-shrink:0}.split-pane textarea{flex:1;min-height:280px;border:none;border-radius:0;resize:none;padding:.75rem;line-height:1.55}.pane-preview{flex:1;overflow:auto;padding:.75rem 1rem;min-height:280px}.workspace-main:has(.workspace-editor){padding-bottom:.75rem}.workspace-editor{display:flex;flex-direction:column;flex:1;min-height:0}.visual-canvas{flex:1;min-height:320px;border:1px solid var(--border);border-radius:6px;overflow:hidden;display:flex;flex-direction:column;background:var(--bg)}.visual-canvas .visual-editor-mount{flex:1;min-height:0;overflow:auto}.visual-canvas .ProseMirror{min-height:280px;padding:.75rem 1rem;max-width:72ch;line-height:1.6;outline:none}.visual-canvas .ProseMirror h1{font-size:1.75rem;margin:.5rem 0}.visual-canvas .ProseMirror h2{font-size:1.35rem;margin:.5rem 0}.visual-canvas .ProseMirror h3{font-size:1.1rem;margin:.5rem 0}.visual-canvas .ProseMirror p{margin:.35rem 0}.visual-canvas .ProseMirror ul,.visual-canvas .ProseMirror ol{margin:.35rem 0;padding-left:1.5rem}.visual-canvas .ProseMirror blockquote{border-left:3px solid var(--border);margin:.5rem 0;padding-left:.75rem;color:var(--muted)}.visual-canvas .ProseMirror pre{background:var(--panel);border-radius:4px;padding:.75rem;overflow-x:auto;font-size:.85rem}.visual-canvas .ProseMirror img{max-width:100%;height:auto;border-radius:4px}.visual-canvas .ProseMirror p.is-editor-empty:first-child:before{color:var(--muted);content:attr(data-placeholder);float:left;height:0;pointer-events:none}.wikilink-chip{color:var(--link);background:var(--accent-subtle);padding:.1rem .35rem;border-radius:4px;font-size:.9em}.publish-split{display:inline-flex;align-items:stretch;position:relative}.publish-split .publish-main{border-top-right-radius:0;border-bottom-right-radius:0}.publish-menu-trigger{border-top-left-radius:0;border-bottom-left-radius:0;border-left:1px solid rgba(255,255,255,.25);padding:0 .45rem;min-width:2rem}.publish-menu{position:absolute;top:calc(100% + 4px);right:0;z-index:200;background:var(--panel);border:1px solid var(--border);border-radius:6px;box-shadow:0 8px 24px var(--shadow);min-width:10rem;display:flex;flex-direction:column}.publish-menu.hidden{display:none}.publish-menu button{border:none;background:transparent;color:var(--text);text-align:left;padding:.5rem .75rem;cursor:pointer;font-size:.85rem}.publish-menu button:hover{background:var(--accent-subtle)}.md-source{max-height:50vh;overflow:auto;background:var(--panel);border:1px solid var(--border);border-radius:4px;padding:.75rem;font-size:.8rem;white-space:pre-wrap;word-break:break-word}.modal-title{margin:0 0 .75rem;font-size:1rem}.workspace-editor #ed-visual-canvas{flex:1;min-height:0}.reader-body{flex:1;min-height:0;overflow:auto}.reader-preview{max-width:72ch;line-height:1.6}.related-row{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem;margin-bottom:.75rem;font-size:.85rem}.related-label{color:var(--muted)}.related-chip{padding:.2rem .5rem;border:1px solid var(--border);border-radius:999px;background:var(--panel);color:var(--link);cursor:pointer;font-size:.8rem}.related-chip:hover{border-color:var(--link);color:var(--link-hover)}h2{font-size:.75rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:0 0 .5rem}.field{margin-bottom:0}.field label{display:block;font-size:.7rem;color:var(--muted);margin-bottom:.2rem}input,select{width:100%;padding:.4rem .5rem;border:1px solid var(--border);border-radius:4px;background:var(--bg);color:var(--text);font-size:.85rem}.doc-list,.search-results{list-style:none;padding:0;margin:0}.doc-list li,.search-results li{padding:.4rem .5rem;border-radius:4px;cursor:pointer;font-size:.9rem}.doc-list li:hover,.search-results li:hover,.doc-list li.active{background:var(--accent-subtle)}.doc-list .meta,.search-results .snippet{font-size:.75rem;color:var(--muted)}.tabs{display:flex;gap:.25rem;margin-bottom:.75rem}.tab{padding:.35rem .6rem;border:1px solid var(--border);background:transparent;color:var(--muted);border-radius:4px;cursor:pointer;font-size:.8rem}.tab.active{color:var(--text);border-color:var(--accent);background:var(--accent-subtle)}.tab-panel{display:none}.tab-panel.active{display:block}.markdown-preview{line-height:1.6;overflow-x:auto}.markdown-preview ul,.markdown-preview ol{margin:.75rem 0;padding-left:1.5rem}.markdown-preview li{margin:.25rem 0}.markdown-preview ul.contains-task-list{list-style:none;padding-left:0}.markdown-preview li.task-list-item{list-style:none;margin:.35rem 0;padding:0}.markdown-preview .task-list-item-label{display:flex;align-items:flex-start;gap:.55rem;cursor:default;line-height:1.5}.markdown-preview .task-list-item-checkbox{margin:.2rem 0 0;width:1rem;height:1rem;flex-shrink:0;accent-color:var(--accent)}.markdown-preview .task-list-item-content{flex:1;min-width:0}.markdown-preview .task-list-item-content>p{margin:0}.markdown-preview blockquote{margin:1rem 0;padding:.5rem 1rem;border-left:3px solid var(--accent);color:var(--muted);background:var(--accent-subtle);border-radius:0 4px 4px 0}.markdown-preview :not(pre)>code{font-family:ui-monospace,monospace;font-size:.88em;background:var(--panel);padding:.1rem .35rem;border-radius:3px;border:1px solid var(--border)}.markdown-preview .mermaid-wrapper{margin:1rem 0;padding:.75rem;background:var(--panel);border:1px solid var(--border);border-radius:6px;overflow-x:auto}.markdown-preview .mermaid-wrapper pre.mermaid{margin:0;padding:0;background:transparent;border:none}.markdown-preview .mermaid-error{border-color:#c0392b}.markdown-preview h1,.markdown-preview h2,.markdown-preview h3{margin-top:1rem}.markdown-preview table{width:100%;border-collapse:collapse;margin:1rem 0;font-size:.9rem;border:1px solid var(--border);table-layout:auto}.markdown-preview thead th{background:var(--table-header);font-weight:600}.markdown-preview th,.markdown-preview td{border:1px solid var(--border);padding:.5rem .75rem;text-align:left;vertical-align:top;min-width:4rem}.markdown-preview tbody tr:nth-child(2n) td{background:var(--table-stripe)}.markdown-preview tbody tr:hover td{background:var(--accent-subtle)}.markdown-preview pre{overflow:auto;background:var(--panel);padding:.5rem;border-radius:4px}.agent-json,.frontmatter-yaml,.structured-preview{font-family:ui-monospace,monospace;font-size:.8rem;white-space:pre-wrap;word-break:break-word;background:var(--panel);padding:.75rem;border-radius:4px;border:1px solid var(--border);margin:0;overflow:auto}.structured-preview--json code,.structured-preview--yaml code{color:var(--text)}.badge{display:inline-block;font-size:.7rem;padding:.15rem .45rem;border-radius:3px;background:var(--border)}.badge-draft{background:#e0c04a40;color:#e0c04a}.banner{position:fixed;bottom:1rem;left:50%;transform:translate(-50%);background:#2d5a3d;color:#fff;padding:.5rem 1rem;border-radius:6px;font-size:.85rem;z-index:200}.banner.error{background:#8b2e2e}.banner.hidden,.hidden{display:none}.node circle{stroke:var(--border);stroke-width:1.5px;cursor:pointer}.node.selected circle{stroke:var(--accent);stroke-width:3px}.node text{font-size:9px;fill:var(--text);pointer-events:none}.link{stroke:var(--border);stroke-opacity:.6}.placeholder{color:var(--muted);font-size:.9rem}.sidebar-actions{padding:0 .25rem .75rem}.catalog-tree{display:flex;flex-direction:column;gap:.25rem}.catalog-section{margin-bottom:.25rem}.catalog-header{width:100%;display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border:none;background:transparent;color:var(--text);font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;cursor:pointer;border-radius:4px}.catalog-icon{width:18px;height:18px;border-radius:3px;display:inline-flex;align-items:center;justify-content:center;font-size:.65rem;font-weight:700;color:#fff;flex-shrink:0;text-transform:none;letter-spacing:0}.catalog-icon--sm{width:16px;height:16px;font-size:.6rem}.catalog-icon--adr{background:#c97b4a}.catalog-icon--feature-spec{background:#6abf69}.catalog-icon--glossary-term{background:#b07cc6}.catalog-icon--open-question{background:#e0c04a;color:#172b4d}.catalog-icon--agent-instruction{background:#5b9fd4}.catalog-icon--draft{background:var(--muted)}.catalog-header:hover{background:var(--panel)}.catalog-chevron{width:1rem;color:var(--muted);flex-shrink:0}.catalog-label{flex:1;text-align:left}.catalog-count{color:var(--muted);font-weight:500}.catalog-pages{list-style:none;margin:0;padding:0 0 .25rem 1.25rem}.page-item{display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border-radius:4px;cursor:pointer;font-size:.875rem}.editor-meta{grid-template-columns:1fr;margin-top:.75rem}.editor-meta .field-wide{grid-column:span 1}.editor-badges{margin-bottom:.5rem}.workspace-editor .split-editor{min-height:360px}.page-item:hover{background:var(--accent-subtle)}.page-item.active{background:var(--accent-subtle);color:var(--accent)}.page-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page-item-text{display:flex;flex-direction:column;flex:1;min-width:0;gap:.1rem}.page-path{font-size:.7rem;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.catalog-subfolder{list-style:none;margin:.15rem 0 .25rem}.catalog-subheader{display:flex;align-items:center;gap:.35rem;width:100%;padding:.25rem .35rem;border:none;border-radius:4px;background:transparent;color:var(--text);font-size:.8rem;cursor:pointer}.catalog-subheader:hover{background:var(--accent-subtle)}.catalog-pages--nested{padding-left:.75rem}.catalog-icon--folder{background:var(--folder-icon-bg, #dfe1e6);color:var(--folder-icon-fg, #42526e)}.docs-tree{display:flex;flex-direction:column;gap:.1rem;margin-bottom:.75rem}.tree-row{display:flex;align-items:center;gap:.25rem;min-height:28px;border-radius:4px;padding-right:.25rem}.tree-row:hover .tree-add,.tree-row:focus-within .tree-add{opacity:1}.tree-row.active{background:var(--accent-subtle)}.tree-toggle,.tree-spacer{width:18px;flex-shrink:0;border:none;background:transparent;color:var(--muted);cursor:pointer;padding:0;font-size:.7rem}.tree-label{flex:1;min-width:0;display:flex;align-items:center;gap:.4rem;border:none;background:transparent;color:var(--text);cursor:pointer;text-align:left;padding:.2rem 0}.tree-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.875rem}.tree-icon{width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;font-size:.85rem}.tree-icon--page{width:16px;height:16px;border-radius:3px;background:var(--panel);border:1px solid var(--border);color:var(--accent);font-size:.6rem;font-weight:700}.tree-add{opacity:0;width:22px;height:22px;border:1px solid var(--border);border-radius:4px;background:var(--panel);color:var(--text);cursor:pointer;font-size:.95rem;line-height:1;flex-shrink:0}.tree-add:hover{border-color:var(--accent);color:var(--accent)}.tree-create-menu{position:fixed;z-index:300;min-width:140px;background:var(--panel);border:1px solid var(--border);border-radius:6px;box-shadow:0 8px 24px #00000026;padding:.25rem;display:flex;flex-direction:column}.tree-create-menu button{border:none;background:transparent;color:var(--text);text-align:left;padding:.45rem .6rem;border-radius:4px;cursor:pointer;font-size:.85rem}.tree-create-menu button:hover{background:var(--accent-subtle)}.tree-create-menu button.tree-menu-danger{color:#c0392b}.tree-create-menu button.tree-menu-danger:hover{background:#c0392b1f}.link-health-stats{display:flex;flex-wrap:wrap;gap:1rem;margin-bottom:.75rem}.link-health-stat{font-size:.9rem;color:var(--muted)}.link-health-value{display:block;font-size:1.35rem;font-weight:600;color:var(--text)}.tree-menu{width:1.5rem;height:1.5rem;border:1px solid transparent;border-radius:4px;background:transparent;color:var(--muted);cursor:pointer;font-size:.95rem;line-height:1;flex-shrink:0}.tree-menu:hover{border-color:var(--border);color:var(--text)}.tree-menu-label{font-size:.7rem;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);padding:.35rem .6rem .15rem}.editor-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;margin-bottom:.35rem}.editor-toolbar button{border:1px solid var(--border);background:var(--panel);color:var(--text);border-radius:4px;padding:.2rem .45rem;font-size:.75rem;cursor:pointer}.editor-toolbar button:hover{border-color:var(--accent);color:var(--accent)}.editor-toolbar-sep{width:1px;height:1rem;background:var(--border);margin:0 .15rem}.wikilink-menu{position:fixed;z-index:400;max-height:240px;overflow-y:auto;background:var(--panel);border:1px solid var(--border);border-radius:6px;box-shadow:0 8px 24px #00000026;display:flex;flex-direction:column}.wikilink-menu.hidden{display:none}.wikilink-option{display:flex;flex-direction:column;align-items:flex-start;gap:.1rem;border:none;background:transparent;color:var(--text);text-align:left;padding:.45rem .6rem;cursor:pointer}.wikilink-option:hover{background:var(--accent-subtle)}.wikilink-option-slug{font-family:var(--mono, monospace);font-size:.8rem}.wikilink-option-title{font-size:.75rem;color:var(--muted)}.publish-related{margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--border)}.publish-related-list{margin:.5rem 0 0;padding-left:1.25rem;font-size:.85rem}.status-chip{font-size:.65rem;padding:.1rem .35rem;border-radius:3px;background:var(--panel);color:var(--muted);text-transform:uppercase;flex-shrink:0}.status-accepted{display:none}.status-draft{background:#fff7d6;color:#974f0c}[data-theme=dark] .status-draft{background:#e0c04a33;color:#e0c04a}.breadcrumb{display:flex;align-items:center;flex-wrap:wrap;gap:.35rem;margin-bottom:1rem;font-size:.85rem}.crumb{border:none;background:transparent;color:var(--muted);cursor:pointer;padding:0;font:inherit}.crumb:hover{color:var(--link);text-decoration:underline}.crumb.current{color:var(--text);font-weight:600;cursor:default;text-decoration:none}.crumb-sep{color:var(--muted)}.page-layout{display:grid;grid-template-columns:minmax(0,1fr) 260px;gap:1.5rem;align-items:start}.page-layout--focus{grid-template-columns:minmax(0,1fr)}.page-layout--focus .page-info{display:none}.reader-backlinks{margin-top:2rem;padding-top:1.25rem;border-top:1px solid var(--border)}.reader-backlinks.hidden{display:none}.reader-backlinks-title{font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 .75rem}.reader-backlinks-list{display:flex;flex-wrap:wrap;gap:.35rem}.backlink-kind{font-size:.65rem;color:var(--muted);text-transform:uppercase;margin-left:.25rem}.markdown-preview a{color:var(--link);text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--link) 45%,transparent);text-underline-offset:2px}.markdown-preview a:hover{color:var(--link-hover);text-decoration-color:var(--link-hover)}.markdown-preview a.wikilink{color:var(--link);text-decoration:none;border-bottom:1px dashed color-mix(in srgb,var(--link) 65%,transparent)}.markdown-preview a.wikilink:hover{color:var(--link-hover);border-bottom-color:var(--link-hover);text-decoration:none}.markdown-preview a.md-link-unresolved{color:var(--muted);text-decoration:line-through;cursor:not-allowed}.markdown-preview img.markdown-image{display:block;max-width:100%;height:auto;margin:1rem 0;border-radius:6px;border:1px solid var(--border);background:var(--panel)}.page-content{min-width:0}.page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.25rem}.page-info{background:var(--panel);border:1px solid var(--border);border-radius:6px;padding:1rem;position:sticky;top:0}.page-info-title{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 .75rem}.info-list{margin:0 0 1rem;display:grid;grid-template-columns:auto 1fr;gap:.35rem .75rem;font-size:.85rem}.info-list dt{color:var(--muted);margin:0}.info-list dd{margin:0}.info-block{margin-bottom:1rem}.info-block-label{font-size:.7rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin-bottom:.35rem}.tag-chip{display:inline-block;font-size:.75rem;padding:.1rem .4rem;border-radius:3px;background:var(--bg);border:1px solid var(--border);margin-right:.25rem}.page-info-footer{margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--border)}.page-info-footer code{font-size:.7rem;color:var(--muted);word-break:break-all}.btn-primary{background:var(--accent);color:#fff;border:none;border-radius:4px;padding:.45rem .75rem;font-weight:600;cursor:pointer;font-size:.85rem}.btn-primary:hover{background:#05c}.btn-ghost{background:transparent;color:var(--muted);border:1px solid var(--border);border-radius:4px;padding:.4rem .65rem;cursor:pointer;font-size:.85rem}.btn-ghost:hover,#health-toggle[aria-pressed=true]{color:var(--text);border-color:var(--accent)}.btn-block{width:100%}.editor-actions{display:flex;gap:.5rem;margin-top:.75rem}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100}.modal.hidden{display:none}.modal-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:1rem;max-width:420px;width:90%}.modal-card-wide{max-width:640px}.modal-title{margin:0 0 .75rem;font-size:1.1rem}.field-hint{font-size:.75rem;color:#e07a7a;margin:.25rem 0 0}.workspace-dashboard{display:flex;flex-direction:column;gap:1rem;max-width:900px}.dashboard-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem}.dashboard-section h2{margin-top:0}.dashboard-hint{margin:0 0 .75rem;font-size:.875rem;color:var(--text-muted)}.dashboard-actions{display:flex;flex-wrap:wrap;gap:.5rem;margin-bottom:.75rem}.check-status{font-size:.95rem;margin:0 0 .75rem}.check-ok{color:#6abf69}.check-fail{color:#e07a7a}.violation-list,.warning-list,.queue-list{list-style:none;padding:0;margin:0}.violation-list li,.warning-list li{font-size:.85rem;padding:.35rem 0;border-bottom:1px solid var(--border)}.warning-list li{color:var(--muted)}.warnings-title{font-size:.75rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:1rem 0 .5rem}.queue-item{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem 0;border-bottom:1px solid var(--border)}.queue-main{min-width:0}.queue-actions{display:flex;gap:.35rem;flex-shrink:0}.btn-sm{padding:.3rem .55rem;font-size:.75rem}.diff-preview{margin:.75rem 0 0;max-height:240px;overflow:auto;font-family:ui-monospace,monospace;font-size:.75rem;white-space:pre-wrap;word-break:break-word;background:var(--bg);border:1px solid var(--border);border-radius:4px;padding:.5rem}@media(max-width:900px){.layout{grid-template-columns:1fr}.sidebar{max-height:240px;border-right:none;border-bottom:1px solid var(--border)}.page-layout{grid-template-columns:1fr}.page-info{position:static}.split-editor{grid-template-columns:1fr}.split-pane+.split-pane{border-left:none;border-top:1px solid var(--border)}.meta-grid{grid-template-columns:1fr 1fr}.field-wide{grid-column:span 2}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))a(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&a(s)}).observe(document,{childList:!0,subtree:!0});function o(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function a(r){if(r.ep)return;r.ep=!0;const i=o(r);fetch(r.href,i)}})();async function n(e,t){const o=await fetch(e,t);if(!o.ok){const a=await o.json().catch(()=>({}));throw new Error(a.error??`HTTP ${o.status}`)}return o.json()}function h(){return n("/api/health")}function m(e={}){const t=new URLSearchParams(e).toString();return n(`/api/docs${t?`?${t}`:""}`)}function g(e,t){const o=new URLSearchParams({q:e});return n(`/api/search?${o}`)}function y(e,t){return n(`/api/graph/${encodeURIComponent(e)}`)}function T(e){return n(`/api/docs/${encodeURIComponent(e)}`)}function S(){return n("/api/tree")}function O(e){return n(`/api/backlinks/${encodeURIComponent(e)}`)}function P(){return n("/api/link-health")}function b(e){return n("/api/drafts/open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({slug:e})})}function C(e,t){return n("/api/fs/folder",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({parentPath:e,name:t})})}function D(e,t,o,a){return n("/api/fs/page",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({parentPath:e,name:t,title:o,templateId:a})})}function j(e,t){return n("/api/fs/move",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fromPath:e,toDir:t})})}function k(e,t){return n("/api/fs/rename",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e,newName:t})})}function w(e,t){return n("/api/fs/delete",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e,kind:t})})}function N(){return n("/api/templates")}function A(e,t){return n("/api/catalog-meta",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e,emoji:t})})}function L(){return n("/api/drafts")}function $(e,t){return n(`/api/drafts/${encodeURIComponent(e)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}function J(e){return n(`/api/drafts/${encodeURIComponent(e)}/publish`,{method:"POST"})}function U(e){return n(`/api/drafts/${encodeURIComponent(e)}`,{method:"DELETE"})}function E(){return n("/api/check")}function R(e){return n(`/api/drafts/${encodeURIComponent(e)}/diff`)}function I(){return n("/api/export",{method:"POST"})}function F(){return n("/api/unprepared")}function v(e,t){return n("/api/prepare",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e,type:t})})}function x(e=!1){return n("/api/prepare-all",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dryRun:e})})}function q(e={}){return n("/api/sync-links",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}async function H(e,t="assets"){const o=new FormData;o.append("file",e),o.append("relativeDir",t);const a=await fetch("/api/assets/upload",{method:"POST",body:o});if(!a.ok){const r=await a.json().catch(()=>({}));throw new Error(r.error??`HTTP ${a.status}`)}return a.json()}const p="repomind-theme";function c(){try{const e=localStorage.getItem(p);if(e==="light"||e==="dark")return e}catch{}return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function u(e){document.documentElement.setAttribute("data-theme",e);try{localStorage.setItem(p,e)}catch{}d(e)}function M(){const e=c();return u(e),e}function f(){const e=c()==="light"?"dark":"light";return u(e),e}function l(e){return e==="light"?"Dark mode":"Light mode"}function d(e){for(const t of document.querySelectorAll("[data-theme-toggle]"))t.textContent=l(e),t.setAttribute("aria-pressed",String(e==="dark"))}function B(e){e&&(e.setAttribute("data-theme-toggle","true"),d(c()),e.addEventListener("click",()=>{f()}))}export{T as A,h as B,b as C,y as D,P as a,F as b,v as c,J as d,I as e,O as f,E as g,U as h,$ as i,R as j,N as k,L as l,C as m,A as n,j as o,x as p,w as q,k as r,q as s,D as t,H as u,M as v,B as w,g as x,m as y,S as z};
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import{m as v,N as L,a as T,E as M,I,T as S,S as E,L as B,P as H,b as j}from"./editor-BcAuZsp8.js";import{u as A}from"./theme-DxqwV6dp.js";import{f as N,p as C,a as W}from"./main-Du7fLv5Y.js";const _=/(\*\*[^*]+\*\*|_[^_]+_|`[^`]+`|\[[^\]]+\]\([^)]+\)|!\[[^\]]*\]\([^)]+\)|\[\[[^\]]+\]\])/g;function m(t){if(!t)return[];const e=/^\[\[([^\]|]+)(?:\|([^\]]+))?\]\]$/.exec(t);if(e){const{display:k,slug:c}=C(e[1]??"",e[2]);return[{type:"wikilink",attrs:{slug:c,label:k}}]}const a=/^\*\*([^*]+)\*\*$/.exec(t);if(a)return[{type:"text",text:a[1]??"",marks:[{type:"bold"}]}];const r=/^_([^_]+)_$/.exec(t);if(r)return[{type:"text",text:r[1]??"",marks:[{type:"italic"}]}];const n=/^`([^`]+)`$/.exec(t);if(n)return[{type:"text",text:n[1]??"",marks:[{type:"code"}]}];const s=/^!\[([^\]]*)\]\(([^)]+)\)$/.exec(t);if(s)return[{type:"image",attrs:{src:s[2]??"",alt:s[1]??""}}];const l=/^\[([^\]]+)\]\(([^)]+)\)$/.exec(t);return l?[{type:"text",text:l[1]??"",marks:[{type:"link",attrs:{href:l[2]??""}}]}]:[{type:"text",text:t}]}function w(t){var r;const e=[];let a=0;for(const n of t.matchAll(_)){const s=n.index??0;s>a&&e.push(...m(t.slice(a,s))),e.push(...m(n[0]??"")),a=s+(((r=n[0])==null?void 0:r.length)??0)}return a<t.length&&e.push(...m(t.slice(a))),e.length===0?[{type:"text",text:""}]:e}function q(t){const e=t.trimEnd();return e?{type:"paragraph",content:w(e)}:{type:"paragraph"}}function f(t){const e=[];for(const a of t)switch(a.type){case"text":e.push(...w(a.text));break;case"strong":{const r=f(a.tokens);for(const n of r)n.type==="text"?e.push({type:"text",text:n.text??"",marks:[...n.marks??[],{type:"bold"}]}):e.push(n);break}case"em":{const r=f(a.tokens);for(const n of r)n.type==="text"?e.push({type:"text",text:n.text??"",marks:[...n.marks??[],{type:"italic"}]}):e.push(n);break}case"codespan":e.push({type:"text",text:a.text,marks:[{type:"code"}]});break;case"link":{const r=a,n=f(r.tokens);for(const s of n)s.type==="text"?e.push({type:"text",text:s.text??"",marks:[...s.marks??[],{type:"link",attrs:{href:r.href}}]}):e.push(s);break}case"image":e.push({type:"image",attrs:{src:a.href,alt:a.text??""}});break}return e}function z(t){if(t.task)return{type:"taskItem",attrs:{checked:t.checked??!1},content:[{type:"paragraph",content:f(t.tokens)}]};const e=[];let a=[];const r=()=>{a.length!==0&&(e.push({type:"paragraph",content:f(a)}),a=[])};for(const n of t.tokens){if(n.type==="text"||n.type==="strong"||n.type==="em"||n.type==="codespan"||n.type==="link"||n.type==="image"){a.push(n);continue}r(),e.push(...y(n))}return r(),e.length===0?{type:"listItem",content:[{type:"paragraph"}]}:{type:"listItem",content:e}}function y(t){switch(t.type){case"heading":{const e=t;return[{type:"heading",attrs:{level:e.depth},content:f(e.tokens)}]}case"paragraph":{const e=t;return e.tokens.length>0?[{type:"paragraph",content:f(e.tokens)}]:[q(e.text)]}case"code":{const e=t;return[{type:"codeBlock",attrs:e.lang?{language:e.lang}:void 0,content:e.text?[{type:"text",text:e.text}]:void 0}]}case"blockquote":{const e=t,a=[];for(const r of e.tokens)a.push(...y(r));return[{type:"blockquote",content:a.length>0?a:[{type:"paragraph"}]}]}case"hr":return[{type:"horizontalRule"}];case"list":{const e=t;return[{type:e.items.some(r=>r.task)?"taskList":e.ordered?"orderedList":"bulletList",content:e.items.map(r=>z(r))}]}case"space":return[];default:return[]}}function R(t){const e=v.lexer(t,{gfm:!0}),a=[];for(const r of e)a.push(...y(r));return a.length===0?{type:"doc",content:[{type:"paragraph"}]}:{type:"doc",content:a}}function D(t){var r,n,s,l,k;if(t.type==="wikilink"){const c=String(((r=t.attrs)==null?void 0:r.slug)??""),d=String(((n=t.attrs)==null?void 0:n.label)??c);return N(d,c)}if(t.type==="image"){const c=String(((s=t.attrs)==null?void 0:s.src)??"");return``}if(t.type==="hardBreak")return`
|
|
2
|
-
`;if(t.type!=="text")return"";let e=t.text??"";const a=t.marks??[];for(const c of a)switch(c.type){case"bold":e=`**${e}**`;break;case"italic":e=`_${e}_`;break;case"code":e=`\`${e}\``;break;case"link":e=`[${e}](${String(((k=c.attrs)==null?void 0:k.href)??"")})`;break}return e}function x(t){return!t||t.length===0?"":t.map(e=>D(e)).join("")}function h(t){var e,a,r;switch(t.type){case"paragraph":return x(t.content);case"heading":{const n=Number(((e=t.attrs)==null?void 0:e.level)??1);return`${"#".repeat(Math.min(3,Math.max(1,n)))} ${x(t.content)}`}case"codeBlock":{const n=String(((a=t.attrs)==null?void 0:a.language)??""),s=((r=t.content)==null?void 0:r.map(l=>l.text??"").join(""))??"";return`\`\`\`${n}
|
|
3
|
-
${s}
|
|
4
|
-
\`\`\``}case"blockquote":return(t.content??[]).map(s=>h(s)).join(`
|
|
5
|
-
`).split(`
|
|
6
|
-
`).map(s=>`> ${s}`).join(`
|
|
7
|
-
`);case"horizontalRule":return"---";case"bulletList":return(t.content??[]).map(n=>$(n,"- ")).join(`
|
|
8
|
-
`);case"orderedList":return(t.content??[]).map((n,s)=>$(n,`${s+1}. `)).join(`
|
|
9
|
-
`);case"taskList":return(t.content??[]).map(n=>O(n)).join(`
|
|
10
|
-
`);case"listItem":return(t.content??[]).map(n=>h(n)).join(`
|
|
11
|
-
`);default:return""}}function $(t,e){const r=(t.content??[]).map(l=>h(l)).join(`
|
|
12
|
-
`).split(`
|
|
13
|
-
`),n=r[0]??"",s=r.slice(1).map(l=>` ${l}`).join(`
|
|
14
|
-
`);return s?`${e}${n}
|
|
15
|
-
${s}`:`${e}${n}`}function O(t){var n;const a=!!((n=t.attrs)!=null&&n.checked)?"- [x]":"- [ ]",r=(t.content??[]).map(s=>h(s)).join(`
|
|
16
|
-
`);return`${a} ${r}`}function P(t){return(t.content??[]).map(a=>h(a)).filter(a=>a.length>0).join(`
|
|
17
|
-
|
|
18
|
-
`)}const U=L.create({name:"wikilink",group:"inline",inline:!0,atom:!0,selectable:!0,addOptions(){return{HTMLAttributes:{}}},addAttributes(){return{slug:{default:""},label:{default:""}}},parseHTML(){return[{tag:"span[data-wikilink-slug]"}]},renderHTML({node:t,HTMLAttributes:e}){const a=String(t.attrs.label||t.attrs.slug);return["span",T(this.options.HTMLAttributes,e,{"data-wikilink-slug":t.attrs.slug,class:"wikilink-chip"}),a]},renderText({node:t}){const e=String(t.attrs.slug??""),a=String(t.attrs.label??e);return a===e?`[[${e}]]`:`[[${a}|${e}]]`},addCommands(){return{insertWikilink:t=>({commands:e})=>e.insertContent({type:this.name,attrs:t})}}});function b(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function F(t){return b(t).replace(/"/g,""")}function J(t,e){const a=document.createElement("div");a.className="wikilink-menu hidden",document.body.appendChild(a);let r=-1;function n(){a.classList.add("hidden"),a.innerHTML="",r=-1}function s(){const o=t.view.coordsAtPos(t.state.selection.from);a.style.top=`${o.bottom+4}px`,a.style.left=`${o.left}px`,a.style.minWidth="220px"}function l(i){if(r<0)return;const o=t.state.selection.from;t.chain().focus().deleteRange({from:r,to:o}).insertWikilink({slug:i,label:i}).run(),n()}function k(i){const o=W(i,e);if(o.length===0){n();return}a.innerHTML=o.map(u=>`<button type="button" class="wikilink-option" data-slug="${F(u.slug)}">
|
|
19
|
-
<span class="wikilink-option-slug">${b(u.slug)}</span>
|
|
20
|
-
<span class="wikilink-option-title">${b(u.title)}</span>
|
|
21
|
-
</button>`).join(""),s(),a.classList.remove("hidden"),a.querySelectorAll(".wikilink-option").forEach(u=>{u.addEventListener("mousedown",g=>{g.preventDefault(),l(u.dataset.slug??"")})})}function c(){const{from:i}=t.state.selection,o=t.state.doc.textBetween(Math.max(0,i-80),i,`
|
|
22
|
-
`,"\0"),u=/\[\[([^\]]*)$/.exec(o);if(!u){n();return}r=i-u[0].length,k(u[1]??"")}t.on("update",c),t.on("selectionUpdate",c);const d=()=>{setTimeout(n,120)};return t.view.dom.addEventListener("blur",d),()=>{t.off("update",c),t.off("selectionUpdate",c),t.view.dom.removeEventListener("blur",d),a.remove()}}function p(t,e,a){const r=a?` title="${a}"`:"";return`<button type="button" class="toolbar-btn" data-action="${e}"${r}>${t}</button>`}function K(){return`
|
|
23
|
-
<div class="editor-toolbar visual-toolbar" role="toolbar" aria-label="Formatting">
|
|
24
|
-
${p("H1","h1")}
|
|
25
|
-
${p("H2","h2")}
|
|
26
|
-
${p("H3","h3")}
|
|
27
|
-
<span class="editor-toolbar-sep"></span>
|
|
28
|
-
${p("B","bold","Bold")}
|
|
29
|
-
${p("I","italic","Italic")}
|
|
30
|
-
${p("Link","link")}
|
|
31
|
-
<span class="editor-toolbar-sep"></span>
|
|
32
|
-
${p("• List","bullet")}
|
|
33
|
-
${p("1. List","ordered")}
|
|
34
|
-
${p("☐ Task","task")}
|
|
35
|
-
<span class="editor-toolbar-sep"></span>
|
|
36
|
-
${p("[[","wikilink","Insert wikilink")}
|
|
37
|
-
${p("Image","image")}
|
|
38
|
-
</div>
|
|
39
|
-
`}function X(t,e){t.className="visual-canvas",t.innerHTML=`${K()}<div class="visual-editor-mount"></div>`;const a=t.querySelector(".visual-editor-mount"),r=R(e.initialMarkdown),n=new M({element:a,extensions:[E.configure({heading:{levels:[1,2,3]}}),B.configure({openOnClick:!1,autolink:!0}),I,H.configure({placeholder:"Start writing…"}),S,j.configure({nested:!0}),U],content:r,onUpdate:()=>{e.onBodyChange()}}),s=J(n,e.docCandidates);return t.querySelector(".visual-toolbar").addEventListener("click",k=>{const c=k.target.closest("[data-action]");if(!c)return;switch(c.dataset.action){case"h1":n.chain().focus().toggleHeading({level:1}).run();break;case"h2":n.chain().focus().toggleHeading({level:2}).run();break;case"h3":n.chain().focus().toggleHeading({level:3}).run();break;case"bold":n.chain().focus().toggleBold().run();break;case"italic":n.chain().focus().toggleItalic().run();break;case"link":{const i=n.getAttributes("link").href,o=window.prompt("URL",i??"https://");if(o===null)break;if(o===""){n.chain().focus().extendMarkRange("link").unsetLink().run();break}n.chain().focus().extendMarkRange("link").setLink({href:o}).run();break}case"bullet":n.chain().focus().toggleBulletList().run();break;case"ordered":n.chain().focus().toggleOrderedList().run();break;case"task":n.chain().focus().toggleTaskList().run();break;case"wikilink":{const i=window.prompt("Wikilink slug");if(!(i!=null&&i.trim()))break;const o=i.trim();n.chain().focus().insertWikilink({slug:o,label:o}).run();break}case"image":{const i=document.createElement("input");i.type="file",i.accept="image/png,image/jpeg,image/gif,image/webp,image/svg+xml",i.addEventListener("change",()=>{var u;const o=(u=i.files)==null?void 0:u[0];o&&A(o,"assets").then(({relativePath:g})=>{n.chain().focus().setImage({src:g}).run()}).catch(g=>{e.onError(g instanceof Error?g.message:"Image upload failed")})}),i.click();break}}}),{getMarkdownBody:()=>P(n.getJSON()),destroy:()=>{s(),n.destroy()}}}export{X as mountVisualEditor};
|