diff --git a/dist/components/index.js b/dist/components/index.js index b4f9d42..1b8ff0b 100644 --- a/dist/components/index.js +++ b/dist/components/index.js @@ -65,7 +65,7 @@ function i18n(locale) { var explorer_default = "@media all and (max-width: 800px) {\n .page > #quartz-body > :not(.sidebar.left:has(.explorer)) {\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body.lock-scroll > :not(.sidebar.left:has(.explorer)) {\n transform: translateX(100dvw);\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body .sidebar.left:has(.explorer) {\n box-sizing: border-box;\n position: sticky;\n background-color: var(--light);\n padding: 1rem 0 1rem 0;\n margin: 0;\n }\n .page > #quartz-body .hide-until-loaded ~ .explorer-content {\n display: none;\n }\n}\n.explorer {\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n min-height: 1.2rem;\n flex: 0 1 auto;\n}\n\n.explorer.collapsed {\n flex: 0 1 1.2rem;\n}\n\n.explorer.collapsed .fold {\n transform: rotateZ(-90deg);\n}\n\n.explorer .fold {\n margin-left: 0.5rem;\n transition: transform 0.3s ease;\n opacity: 0.8;\n}\n\n@media all and (max-width: 800px) {\n .explorer {\n order: -1;\n height: initial;\n overflow: hidden;\n flex-shrink: 0;\n align-self: flex-start;\n margin-top: auto;\n margin-bottom: auto;\n }\n}\n.explorer button.mobile-explorer {\n display: none;\n}\n\n.explorer button.desktop-explorer {\n display: flex;\n}\n\n@media all and (max-width: 800px) {\n .explorer button.mobile-explorer {\n display: flex;\n }\n .explorer button.desktop-explorer {\n display: none;\n }\n}\n.explorer svg {\n pointer-events: all;\n transition: transform 0.35s ease;\n}\n\n.explorer svg > polyline {\n pointer-events: none;\n}\n\nbutton.mobile-explorer,\nbutton.desktop-explorer {\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding: 0;\n color: var(--dark);\n display: flex;\n align-items: center;\n}\n\nbutton.mobile-explorer h2,\nbutton.desktop-explorer h2 {\n font-size: 1rem;\n display: inline-block;\n margin: 0;\n}\n\n.explorer-content {\n list-style: none;\n overflow: hidden;\n overflow-y: auto;\n margin-top: 0.5rem;\n}\n\n.explorer-content ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.explorer-content ul.explorer-ul {\n overscroll-behavior: contain;\n}\n\n.explorer-content ul li > a {\n color: var(--dark);\n opacity: 0.75;\n pointer-events: all;\n}\n\n.explorer-content ul li > a.active {\n opacity: 1;\n color: var(--tertiary);\n}\n\n.explorer-content .folder-outer {\n visibility: collapse;\n display: grid;\n grid-template-rows: 0fr;\n transition-property: grid-template-rows, visibility;\n transition-duration: 0.3s;\n transition-timing-function: ease-in-out;\n}\n\n.explorer-content .folder-outer.open {\n visibility: visible;\n grid-template-rows: 1fr;\n}\n\n.explorer-content .folder-outer > ul {\n overflow: hidden;\n margin-left: 6px;\n padding-left: 0.8rem;\n border-left: 1px solid var(--lightgray);\n}\n\n.folder-container {\n flex-direction: row;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.folder-container div > a {\n color: var(--secondary);\n font-family: var(--headerFont);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.5rem;\n display: inline-block;\n}\n\n.folder-container div > a:hover {\n color: var(--tertiary);\n}\n\n.folder-container div > button {\n color: var(--dark);\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding-left: 0;\n padding-right: 0;\n display: flex;\n align-items: center;\n font-family: var(--headerFont);\n}\n\n.folder-container div > button span {\n font-size: 0.95rem;\n display: inline-block;\n color: var(--secondary);\n font-weight: 600;\n margin: 0;\n line-height: 1.5rem;\n pointer-events: none;\n}\n\n.folder-icon {\n margin-right: 5px;\n color: var(--secondary);\n cursor: pointer;\n transition: transform 0.3s ease;\n backface-visibility: visible;\n flex-shrink: 0;\n}\n\nli:has(> .folder-outer:not(.open)) > .folder-container > svg {\n transform: rotate(-90deg);\n}\n\n.folder-icon:hover {\n color: var(--tertiary);\n}\n\n@media all and (max-width: 800px) {\n .explorer.collapsed {\n flex: 0 0 34px;\n }\n .explorer.collapsed > .explorer-content {\n transform: translateX(-100vw);\n visibility: hidden;\n }\n .explorer:not(.collapsed) {\n flex: 0 0 34px;\n }\n .explorer:not(.collapsed) > .explorer-content {\n transform: translateX(0);\n visibility: visible;\n }\n .explorer .explorer-content {\n box-sizing: border-box;\n z-index: 100;\n position: absolute;\n top: 0;\n left: 0;\n margin-top: 0;\n background-color: var(--light);\n max-width: 100vw;\n width: 100vw;\n transform: translateX(-100vw);\n transition: transform 200ms ease, visibility 200ms ease;\n overflow: hidden;\n padding: 4rem 0 2rem 0;\n height: 100dvh;\n max-height: 100dvh;\n visibility: hidden;\n }\n .explorer .mobile-explorer {\n margin: 0;\n padding: 5px;\n z-index: 101;\n }\n .explorer .mobile-explorer.hide-until-loaded {\n display: none;\n }\n .explorer .mobile-explorer .lucide-menu {\n stroke: var(--darkgray);\n }\n}\n@media all and (max-width: 800px) {\n .mobile-no-scroll .explorer-content > .explorer-ul {\n overscroll-behavior: contain;\n }\n}"; // src/components/scripts/explorer.inline.ts -var explorer_inline_default = `var U=Object.hasOwnProperty;function S(u){let e=k(W(u,"index"),!0);return e.length===0?"/":e}function T(){return typeof document>"u"?"":document.body?.dataset?.basepath??""}function v(u,e){let D=e??T(),n=u.startsWith("/")?u:"/"+u;return D+n}function I(u,e){return u===e||u.endsWith("/"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith("/")&&(u=u.substring(1)),!e&&u.endsWith("/")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title==="index"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||""}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join("/");return this.isFolder?e+"/index":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||""}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n==="index"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||"").split("/");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split("/"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:"base"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!=="tags";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log("[Explorer] Fetching content index...");let e=await fetchData;if(console.log("[Explorer] Fetched data keys:",Object.keys(e).slice(0,5)),!e)return console.error("[Explorer] No data received"),null;let D=e.content||e,n=Object.entries(D);if(console.log("[Explorer] Entry count:",n.length),n.length===0)return console.warn("[Explorer] No content entries found"),null;let r=y.fromEntries(n);console.log("[Explorer] Trie root children:",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function("a","b","return ("+E.sortFn+")(a, b)")),E.filterFn&&(F=new Function("node","return ("+E.filterFn+")(node)")),E.mapFn&&(d=new Function("node","("+E.mapFn+")(node)"))}catch(E){console.error("Error parsing data functions:",E)}return j(r,t,F,d)}catch(e){return console.error("Error building file trie:",e),null}}var b=0;function N(u,e,D,n,r,t=""){let F=document.getElementById("template-folder"),d=document.getElementById("template-file");if(!F||!d)return;let E=t?t+"/"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(".folder-container"),p=s.querySelector(".folder-button"),m=s.querySelector(".folder-title"),l=s.querySelector(".folder-outer"),o=s.querySelector(".content");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n==="link"&&p){let i=document.createElement("a");i.className=p.className;let B=S(u.slug);i.href=v(B||""),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add("open"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector("a");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add("active")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log("[Explorer] Nav event received, generation:",e);let D=(u.detail?.url||"").replace(/^\\/+/,""),n=document.querySelectorAll("div.explorer");console.log("[Explorer] Found",n.length,"explorers");let r={};try{JSON.parse(localStorage.getItem("fileTree")||"[]").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error("[Explorer] Error loading saved state:",t)}for(let t of n){let F=t.querySelector(".explorer-ul");if(!F){console.warn("[Explorer] No explorer-ul found");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||"collapse";console.log("[Explorer] Starting tree build...");let A=await R(d);if(e===b){if(console.log("[Explorer] Render generation is current, rendering tree"),console.log("[Explorer] Trie result:",A?"success":"null"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log("[Explorer] Rendering",A.children.length,"children");for(let o of A.children)N(o,F,D,E,r,"");console.log("[Explorer] Render complete, final list length:",F.children.length)}else console.warn("[Explorer] No trie or empty children");let l=sessionStorage.getItem("explorerScrollTop");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(".active");o&&o.scrollIntoView({behavior:"smooth"})}}else console.log("[Explorer] Stale render generation, skipping tree render");let s=[],a=t.getElementsByClassName("explorer-toggle");for(let l of a){let o=function(){let C=this.closest(".explorer");if(!C)return;let c=C.classList.toggle("collapsed");C.setAttribute("aria-expanded",c?"false":"true"),c?document.documentElement.classList.remove("mobile-no-scroll"):document.documentElement.classList.add("mobile-no-scroll")};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let p=t.getElementsByClassName("folder-icon");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle("open");let i=!f.classList.contains("open"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem("fileTree")||"[]"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem("fileTree",JSON.stringify(h))};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let m=t.getElementsByClassName("folder-button");for(let l of m){let o=function(C){let c=this.closest(".folder-container");if(!c)return;let f=t.dataset.behavior||"collapse",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!=="link"){if(C.stopPropagation(),!i)return;i.classList.toggle("open");let h=!i.classList.contains("open"),g=JSON.parse(localStorage.getItem("fileTree")||"[]"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem("fileTree",JSON.stringify(g))}};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}typeof window<"u"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName("explorer")){let F=t.querySelector(".mobile-explorer");F&&(F.classList.remove("hide-until-loaded"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add("collapsed"),t.setAttribute("aria-expanded","false"),document.documentElement.classList.remove("mobile-no-scroll")))}}catch(D){console.error("[Explorer] Fatal error in nav handler:",D)}}document.addEventListener("nav",L);document.addEventListener("render",L);document.addEventListener("prenav",()=>{let u=document.querySelector(".explorer-ul");u&&sessionStorage.setItem("explorerScrollTop",u.scrollTop.toString())}); +var explorer_inline_default = `var U=Object.hasOwnProperty;function S(u){let e=k(W(u,"index"),!0);return e.length===0?"/":e}function T(){return typeof document>"u"?"":document.body?.dataset?.basepath??""}function v(u,e){let D=e??T(),n=u.startsWith("/")?u:"/"+u;return D+n}function I(u,e){return u===e||u.endsWith("/"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith("/")&&(u=u.substring(1)),!e&&u.endsWith("/")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title==="index"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||""}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join("/");return this.isFolder?e+"/index":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||""}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n==="index"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||"").split("/");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split("/"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:"base"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!=="tags";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log("[Explorer] Fetching content index...");let e=await fetchData;if(console.log("[Explorer] Fetched data keys:",Object.keys(e).slice(0,5)),!e)return console.error("[Explorer] No data received"),null;let D=e.content||e,n=Object.entries(D);if(console.log("[Explorer] Entry count:",n.length),n.length===0)return console.warn("[Explorer] No content entries found"),null;let r=y.fromEntries(n);console.log("[Explorer] Trie root children:",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function("a","b","return ("+E.sortFn+")(a, b)")),E.filterFn&&(F=new Function("node","return ("+E.filterFn+")(node)")),E.mapFn&&(d=new Function("node","("+E.mapFn+")(node)"))}catch(E){console.error("Error parsing data functions:",E)}return j(r,t,F,d)}catch(e){return console.error("Error building file trie:",e),null}}var b=0;function N(u,e,D,n,r,t=""){let F=document.getElementById("template-folder"),d=document.getElementById("template-file");if(!F||!d)return;let E=t?t+"/"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(".folder-container"),p=s.querySelector(".folder-button"),m=s.querySelector(".folder-title"),l=s.querySelector(".folder-outer"),o=s.querySelector(".content");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n==="link"&&p){let i=document.createElement("a");i.className=p.className;let B=S(u.slug);i.href=v(B||""),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add("open"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector("a");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add("active","is-active")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log("[Explorer] Nav event received, generation:",e);let D=(u.detail?.url||"").replace(/^\\/+/,""),n=document.querySelectorAll("div.explorer");console.log("[Explorer] Found",n.length,"explorers");let r={};try{JSON.parse(localStorage.getItem("fileTree")||"[]").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error("[Explorer] Error loading saved state:",t)}for(let t of n){let F=t.querySelector(".explorer-ul");if(!F){console.warn("[Explorer] No explorer-ul found");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||"collapse";console.log("[Explorer] Starting tree build...");let A=await R(d);if(e===b){if(console.log("[Explorer] Render generation is current, rendering tree"),console.log("[Explorer] Trie result:",A?"success":"null"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log("[Explorer] Rendering",A.children.length,"children");for(let o of A.children)N(o,F,D,E,r,"");console.log("[Explorer] Render complete, final list length:",F.children.length)}else console.warn("[Explorer] No trie or empty children");let l=sessionStorage.getItem("explorerScrollTop");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(".active");o&&o.scrollIntoView({behavior:"smooth"})}}else console.log("[Explorer] Stale render generation, skipping tree render");let s=[],a=t.getElementsByClassName("explorer-toggle");for(let l of a){let o=function(){let C=this.closest(".explorer");if(!C)return;let c=C.classList.toggle("collapsed");C.setAttribute("aria-expanded",c?"false":"true"),c?document.documentElement.classList.remove("mobile-no-scroll"):document.documentElement.classList.add("mobile-no-scroll")};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let p=t.getElementsByClassName("folder-icon");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle("open");let i=!f.classList.contains("open"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem("fileTree")||"[]"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem("fileTree",JSON.stringify(h))};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let m=t.getElementsByClassName("folder-button");for(let l of m){let o=function(C){let c=this.closest(".folder-container");if(!c)return;let f=t.dataset.behavior||"collapse",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!=="link"){if(C.stopPropagation(),!i)return;i.classList.toggle("open");let h=!i.classList.contains("open"),g=JSON.parse(localStorage.getItem("fileTree")||"[]"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem("fileTree",JSON.stringify(g))}};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}typeof window<"u"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName("explorer")){let F=t.querySelector(".mobile-explorer");F&&(F.classList.remove("hide-until-loaded"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add("collapsed"),t.setAttribute("aria-expanded","false"),document.documentElement.classList.remove("mobile-no-scroll")))}}catch(D){console.error("[Explorer] Fatal error in nav handler:",D)}}document.addEventListener("nav",L);document.addEventListener("render",L);document.addEventListener("prenav",()=>{let u=document.querySelector(".explorer-ul");u&&sessionStorage.setItem("explorerScrollTop",u.scrollTop.toString())}); `; var defaultOptions = { folderDefaultState: "collapsed", @@ -105,7 +105,7 @@ var Explorer_default = ((userOpts) => { return /* @__PURE__ */ jsxs( "div", { - class: classNames(displayClass, "explorer"), + class: classNames(displayClass, "explorer", "nav-files-container"), "data-behavior": opts.folderClickBehavior, "data-collapsed": opts.folderDefaultState, "data-savestate": opts.useSavedState, @@ -172,9 +172,9 @@ var Explorer_default = ((userOpts) => { } ), /* @__PURE__ */ jsx("div", { id, class: "explorer-content", "aria-expanded": false, role: "group", children: /* @__PURE__ */ jsx(OverflowList2, { class: "explorer-ul" }) }), - /* @__PURE__ */ jsx("template", { id: "template-file", children: /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: "#" }) }) }), + /* @__PURE__ */ jsx("template", { id: "template-file", children: /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: "#", class: "nav-file-title tree-item-self" }) }) }), /* @__PURE__ */ jsx("template", { id: "template-folder", children: /* @__PURE__ */ jsxs("li", { children: [ - /* @__PURE__ */ jsxs("div", { class: "folder-container", children: [ + /* @__PURE__ */ jsxs("div", { class: "folder-container nav-folder-title tree-item-self", children: [ /* @__PURE__ */ jsx( "svg", { @@ -187,13 +187,13 @@ var Explorer_default = ((userOpts) => { "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", - class: "folder-icon", + class: "folder-icon nav-folder-collapse-indicator collapse-icon", children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" }) } ), /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("button", { class: "folder-button", children: /* @__PURE__ */ jsx("span", { class: "folder-title" }) }) }) ] }), - /* @__PURE__ */ jsx("div", { class: "folder-outer", children: /* @__PURE__ */ jsx("ul", { class: "content" }) }) + /* @__PURE__ */ jsx("div", { class: "folder-outer", children: /* @__PURE__ */ jsx("ul", { class: "content tree-item-children" }) }) ] }) }) ] } diff --git a/dist/components/index.js.map b/dist/components/index.js.map index d197e4f..4cfa18e 100644 --- a/dist/components/index.js.map +++ b/dist/components/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/components/OverflowList.tsx","../../src/i18n/locales/en-US.ts","../../src/i18n/index.ts","../../src/components/styles/explorer.scss","../../src/components/scripts/explorer.inline.ts","../../src/components/Explorer.tsx"],"names":["OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import type { VNode, JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n \n );\n};\n\nlet numLists = 0;\n\nexport interface OverflowListFactory {\n OverflowList: (props: JSX.HTMLAttributes) => VNode;\n overflowListAfterDOMLoaded: string;\n}\n\nexport default (): OverflowListFactory => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n const scrollContainer = ul.parentElement\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n }, scrollContainer ? { root: scrollContainer } : undefined)\n\n observer.observe(end)\n window.addCleanup(() => observer.disconnect())\n})\n`,\n };\n};\n","export default {\n components: {\n explorer: {\n title: \"Explorer\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","@media all and (max-width: 800px) {\n .page > #quartz-body > :not(.sidebar.left:has(.explorer)) {\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body.lock-scroll > :not(.sidebar.left:has(.explorer)) {\n transform: translateX(100dvw);\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body .sidebar.left:has(.explorer) {\n box-sizing: border-box;\n position: sticky;\n background-color: var(--light);\n padding: 1rem 0 1rem 0;\n margin: 0;\n }\n .page > #quartz-body .hide-until-loaded ~ .explorer-content {\n display: none;\n }\n}\n.explorer {\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n min-height: 1.2rem;\n flex: 0 1 auto;\n}\n\n.explorer.collapsed {\n flex: 0 1 1.2rem;\n}\n\n.explorer.collapsed .fold {\n transform: rotateZ(-90deg);\n}\n\n.explorer .fold {\n margin-left: 0.5rem;\n transition: transform 0.3s ease;\n opacity: 0.8;\n}\n\n@media all and (max-width: 800px) {\n .explorer {\n order: -1;\n height: initial;\n overflow: hidden;\n flex-shrink: 0;\n align-self: flex-start;\n margin-top: auto;\n margin-bottom: auto;\n }\n}\n.explorer button.mobile-explorer {\n display: none;\n}\n\n.explorer button.desktop-explorer {\n display: flex;\n}\n\n@media all and (max-width: 800px) {\n .explorer button.mobile-explorer {\n display: flex;\n }\n .explorer button.desktop-explorer {\n display: none;\n }\n}\n.explorer svg {\n pointer-events: all;\n transition: transform 0.35s ease;\n}\n\n.explorer svg > polyline {\n pointer-events: none;\n}\n\nbutton.mobile-explorer,\nbutton.desktop-explorer {\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding: 0;\n color: var(--dark);\n display: flex;\n align-items: center;\n}\n\nbutton.mobile-explorer h2,\nbutton.desktop-explorer h2 {\n font-size: 1rem;\n display: inline-block;\n margin: 0;\n}\n\n.explorer-content {\n list-style: none;\n overflow: hidden;\n overflow-y: auto;\n margin-top: 0.5rem;\n}\n\n.explorer-content ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.explorer-content ul.explorer-ul {\n overscroll-behavior: contain;\n}\n\n.explorer-content ul li > a {\n color: var(--dark);\n opacity: 0.75;\n pointer-events: all;\n}\n\n.explorer-content ul li > a.active {\n opacity: 1;\n color: var(--tertiary);\n}\n\n.explorer-content .folder-outer {\n visibility: collapse;\n display: grid;\n grid-template-rows: 0fr;\n transition-property: grid-template-rows, visibility;\n transition-duration: 0.3s;\n transition-timing-function: ease-in-out;\n}\n\n.explorer-content .folder-outer.open {\n visibility: visible;\n grid-template-rows: 1fr;\n}\n\n.explorer-content .folder-outer > ul {\n overflow: hidden;\n margin-left: 6px;\n padding-left: 0.8rem;\n border-left: 1px solid var(--lightgray);\n}\n\n.folder-container {\n flex-direction: row;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.folder-container div > a {\n color: var(--secondary);\n font-family: var(--headerFont);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.5rem;\n display: inline-block;\n}\n\n.folder-container div > a:hover {\n color: var(--tertiary);\n}\n\n.folder-container div > button {\n color: var(--dark);\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding-left: 0;\n padding-right: 0;\n display: flex;\n align-items: center;\n font-family: var(--headerFont);\n}\n\n.folder-container div > button span {\n font-size: 0.95rem;\n display: inline-block;\n color: var(--secondary);\n font-weight: 600;\n margin: 0;\n line-height: 1.5rem;\n pointer-events: none;\n}\n\n.folder-icon {\n margin-right: 5px;\n color: var(--secondary);\n cursor: pointer;\n transition: transform 0.3s ease;\n backface-visibility: visible;\n flex-shrink: 0;\n}\n\nli:has(> .folder-outer:not(.open)) > .folder-container > svg {\n transform: rotate(-90deg);\n}\n\n.folder-icon:hover {\n color: var(--tertiary);\n}\n\n@media all and (max-width: 800px) {\n .explorer.collapsed {\n flex: 0 0 34px;\n }\n .explorer.collapsed > .explorer-content {\n transform: translateX(-100vw);\n visibility: hidden;\n }\n .explorer:not(.collapsed) {\n flex: 0 0 34px;\n }\n .explorer:not(.collapsed) > .explorer-content {\n transform: translateX(0);\n visibility: visible;\n }\n .explorer .explorer-content {\n box-sizing: border-box;\n z-index: 100;\n position: absolute;\n top: 0;\n left: 0;\n margin-top: 0;\n background-color: var(--light);\n max-width: 100vw;\n width: 100vw;\n transform: translateX(-100vw);\n transition: transform 200ms ease, visibility 200ms ease;\n overflow: hidden;\n padding: 4rem 0 2rem 0;\n height: 100dvh;\n max-height: 100dvh;\n visibility: hidden;\n }\n .explorer .mobile-explorer {\n margin: 0;\n padding: 5px;\n z-index: 101;\n }\n .explorer .mobile-explorer.hide-until-loaded {\n display: none;\n }\n .explorer .mobile-explorer .lucide-menu {\n stroke: var(--darkgray);\n }\n}\n@media all and (max-width: 800px) {\n .mobile-no-scroll .explorer-content > .explorer-ul {\n overscroll-behavior: contain;\n }\n}","var U=Object.hasOwnProperty;function S(u){let e=k(W(u,\"index\"),!0);return e.length===0?\"/\":e}function T(){return typeof document>\"u\"?\"\":document.body?.dataset?.basepath??\"\"}function v(u,e){let D=e??T(),n=u.startsWith(\"/\")?u:\"/\"+u;return D+n}function I(u,e){return u===e||u.endsWith(\"/\"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith(\"/\")&&(u=u.substring(1)),!e&&u.endsWith(\"/\")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title===\"index\"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||\"\"}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join(\"/\");return this.isFolder?e+\"/index\":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||\"\"}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n===\"index\"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||\"\").split(\"/\");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split(\"/\"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:\"base\"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!==\"tags\";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log(\"[Explorer] Fetching content index...\");let e=await fetchData;if(console.log(\"[Explorer] Fetched data keys:\",Object.keys(e).slice(0,5)),!e)return console.error(\"[Explorer] No data received\"),null;let D=e.content||e,n=Object.entries(D);if(console.log(\"[Explorer] Entry count:\",n.length),n.length===0)return console.warn(\"[Explorer] No content entries found\"),null;let r=y.fromEntries(n);console.log(\"[Explorer] Trie root children:\",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function(\"a\",\"b\",\"return (\"+E.sortFn+\")(a, b)\")),E.filterFn&&(F=new Function(\"node\",\"return (\"+E.filterFn+\")(node)\")),E.mapFn&&(d=new Function(\"node\",\"(\"+E.mapFn+\")(node)\"))}catch(E){console.error(\"Error parsing data functions:\",E)}return j(r,t,F,d)}catch(e){return console.error(\"Error building file trie:\",e),null}}var b=0;function N(u,e,D,n,r,t=\"\"){let F=document.getElementById(\"template-folder\"),d=document.getElementById(\"template-file\");if(!F||!d)return;let E=t?t+\"/\"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(\".folder-container\"),p=s.querySelector(\".folder-button\"),m=s.querySelector(\".folder-title\"),l=s.querySelector(\".folder-outer\"),o=s.querySelector(\".content\");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n===\"link\"&&p){let i=document.createElement(\"a\");i.className=p.className;let B=S(u.slug);i.href=v(B||\"\"),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add(\"open\"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector(\"a\");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add(\"active\")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log(\"[Explorer] Nav event received, generation:\",e);let D=(u.detail?.url||\"\").replace(/^\\/+/,\"\"),n=document.querySelectorAll(\"div.explorer\");console.log(\"[Explorer] Found\",n.length,\"explorers\");let r={};try{JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error(\"[Explorer] Error loading saved state:\",t)}for(let t of n){let F=t.querySelector(\".explorer-ul\");if(!F){console.warn(\"[Explorer] No explorer-ul found\");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||\"collapse\";console.log(\"[Explorer] Starting tree build...\");let A=await R(d);if(e===b){if(console.log(\"[Explorer] Render generation is current, rendering tree\"),console.log(\"[Explorer] Trie result:\",A?\"success\":\"null\"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log(\"[Explorer] Rendering\",A.children.length,\"children\");for(let o of A.children)N(o,F,D,E,r,\"\");console.log(\"[Explorer] Render complete, final list length:\",F.children.length)}else console.warn(\"[Explorer] No trie or empty children\");let l=sessionStorage.getItem(\"explorerScrollTop\");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(\".active\");o&&o.scrollIntoView({behavior:\"smooth\"})}}else console.log(\"[Explorer] Stale render generation, skipping tree render\");let s=[],a=t.getElementsByClassName(\"explorer-toggle\");for(let l of a){let o=function(){let C=this.closest(\".explorer\");if(!C)return;let c=C.classList.toggle(\"collapsed\");C.setAttribute(\"aria-expanded\",c?\"false\":\"true\"),c?document.documentElement.classList.remove(\"mobile-no-scroll\"):document.documentElement.classList.add(\"mobile-no-scroll\")};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let p=t.getElementsByClassName(\"folder-icon\");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle(\"open\");let i=!f.classList.contains(\"open\"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem(\"fileTree\",JSON.stringify(h))};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let m=t.getElementsByClassName(\"folder-button\");for(let l of m){let o=function(C){let c=this.closest(\".folder-container\");if(!c)return;let f=t.dataset.behavior||\"collapse\",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!==\"link\"){if(C.stopPropagation(),!i)return;i.classList.toggle(\"open\");let h=!i.classList.contains(\"open\"),g=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem(\"fileTree\",JSON.stringify(g))}};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}typeof window<\"u\"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName(\"explorer\")){let F=t.querySelector(\".mobile-explorer\");F&&(F.classList.remove(\"hide-until-loaded\"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add(\"collapsed\"),t.setAttribute(\"aria-expanded\",\"false\"),document.documentElement.classList.remove(\"mobile-no-scroll\")))}}catch(D){console.error(\"[Explorer] Fatal error in nav handler:\",D)}}document.addEventListener(\"nav\",L);document.addEventListener(\"render\",L);document.addEventListener(\"prenav\",()=>{let u=document.querySelector(\".explorer-ul\");u&&sessionStorage.setItem(\"explorerScrollTop\",u.scrollTop.toString())});\n","import type {\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n} from \"@quartz-community/types\";\nimport OverflowListFactory from \"./OverflowList\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/explorer.scss\";\n// @ts-expect-error - Inline script loaded as text by esbuild plugin\nimport script from \"./scripts/explorer.inline.ts\";\n\ninterface FileTrieNode {\n slugSegment?: string;\n slugSegments?: string[];\n displayName?: string;\n isFolder: boolean;\n data: Record | null;\n children: FileTrieNode[];\n}\n\nexport interface ExplorerOptions {\n title?: string;\n folderDefaultState: \"collapsed\" | \"open\";\n folderClickBehavior: \"collapse\" | \"link\";\n useSavedState: boolean;\n sortFn?: (a: FileTrieNode, b: FileTrieNode) => number;\n filterFn?: (node: FileTrieNode) => boolean;\n mapFn?: (node: FileTrieNode) => FileTrieNode;\n order?: Array<\"filter\" | \"map\" | \"sort\">;\n}\n\nconst defaultOptions: ExplorerOptions = {\n folderDefaultState: \"collapsed\",\n folderClickBehavior: \"link\",\n useSavedState: true,\n mapFn: (node: FileTrieNode) => {\n return node;\n },\n sortFn: (a: FileTrieNode, b: FileTrieNode) => {\n if ((!a.isFolder && !b.isFolder) || (a.isFolder && b.isFolder)) {\n return (a.displayName || \"\").localeCompare(b.displayName || \"\", undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n }\n\n if (!a.isFolder && b.isFolder) {\n return 1;\n }\n return -1;\n },\n filterFn: (node: FileTrieNode) => node.slugSegment !== \"tags\",\n order: [\"filter\", \"map\", \"sort\"],\n};\n\nlet numExplorers = 0;\n\nfunction concatenateResources(...resources: (string | undefined)[]): string {\n return resources.filter((r): r is string => !!r).join(\"\\n\");\n}\n\nexport default ((userOpts?: Partial) => {\n const opts: ExplorerOptions = { ...defaultOptions, ...userOpts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const ExplorerComponent: QuartzComponent = (props: QuartzComponentProps) => {\n const { cfg } = props;\n const displayClass = (props as { displayClass?: \"mobile-only\" | \"desktop-only\" }).displayClass;\n const id = `explorer-${numExplorers++}`;\n const locale = cfg?.locale ?? \"en-US\";\n\n const title = opts.title ?? i18n(locale).components.explorer.title;\n\n return (\n \n \n \n \n \n \n \n \n \n

    {title}

    \n \n \n \n \n
    \n \n
    \n \n \n \n );\n };\n\n ExplorerComponent.css = style;\n ExplorerComponent.afterDOMLoaded = concatenateResources(script, overflowListAfterDOMLoaded);\n return ExplorerComponent;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/components/OverflowList.tsx","../../src/i18n/locales/en-US.ts","../../src/i18n/index.ts","../../src/components/styles/explorer.scss","../../src/components/scripts/explorer.inline.ts","../../src/components/Explorer.tsx"],"names":["OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import type { VNode, JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
      \n {children}\n
    • \n
    \n );\n};\n\nlet numLists = 0;\n\nexport interface OverflowListFactory {\n OverflowList: (props: JSX.HTMLAttributes) => VNode;\n overflowListAfterDOMLoaded: string;\n}\n\nexport default (): OverflowListFactory => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n const scrollContainer = ul.parentElement\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n }, scrollContainer ? { root: scrollContainer } : undefined)\n\n observer.observe(end)\n window.addCleanup(() => observer.disconnect())\n})\n`,\n };\n};\n","export default {\n components: {\n explorer: {\n title: \"Explorer\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","@media all and (max-width: 800px) {\n .page > #quartz-body > :not(.sidebar.left:has(.explorer)) {\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body.lock-scroll > :not(.sidebar.left:has(.explorer)) {\n transform: translateX(100dvw);\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body .sidebar.left:has(.explorer) {\n box-sizing: border-box;\n position: sticky;\n background-color: var(--light);\n padding: 1rem 0 1rem 0;\n margin: 0;\n }\n .page > #quartz-body .hide-until-loaded ~ .explorer-content {\n display: none;\n }\n}\n.explorer {\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n min-height: 1.2rem;\n flex: 0 1 auto;\n}\n\n.explorer.collapsed {\n flex: 0 1 1.2rem;\n}\n\n.explorer.collapsed .fold {\n transform: rotateZ(-90deg);\n}\n\n.explorer .fold {\n margin-left: 0.5rem;\n transition: transform 0.3s ease;\n opacity: 0.8;\n}\n\n@media all and (max-width: 800px) {\n .explorer {\n order: -1;\n height: initial;\n overflow: hidden;\n flex-shrink: 0;\n align-self: flex-start;\n margin-top: auto;\n margin-bottom: auto;\n }\n}\n.explorer button.mobile-explorer {\n display: none;\n}\n\n.explorer button.desktop-explorer {\n display: flex;\n}\n\n@media all and (max-width: 800px) {\n .explorer button.mobile-explorer {\n display: flex;\n }\n .explorer button.desktop-explorer {\n display: none;\n }\n}\n.explorer svg {\n pointer-events: all;\n transition: transform 0.35s ease;\n}\n\n.explorer svg > polyline {\n pointer-events: none;\n}\n\nbutton.mobile-explorer,\nbutton.desktop-explorer {\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding: 0;\n color: var(--dark);\n display: flex;\n align-items: center;\n}\n\nbutton.mobile-explorer h2,\nbutton.desktop-explorer h2 {\n font-size: 1rem;\n display: inline-block;\n margin: 0;\n}\n\n.explorer-content {\n list-style: none;\n overflow: hidden;\n overflow-y: auto;\n margin-top: 0.5rem;\n}\n\n.explorer-content ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.explorer-content ul.explorer-ul {\n overscroll-behavior: contain;\n}\n\n.explorer-content ul li > a {\n color: var(--dark);\n opacity: 0.75;\n pointer-events: all;\n}\n\n.explorer-content ul li > a.active {\n opacity: 1;\n color: var(--tertiary);\n}\n\n.explorer-content .folder-outer {\n visibility: collapse;\n display: grid;\n grid-template-rows: 0fr;\n transition-property: grid-template-rows, visibility;\n transition-duration: 0.3s;\n transition-timing-function: ease-in-out;\n}\n\n.explorer-content .folder-outer.open {\n visibility: visible;\n grid-template-rows: 1fr;\n}\n\n.explorer-content .folder-outer > ul {\n overflow: hidden;\n margin-left: 6px;\n padding-left: 0.8rem;\n border-left: 1px solid var(--lightgray);\n}\n\n.folder-container {\n flex-direction: row;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.folder-container div > a {\n color: var(--secondary);\n font-family: var(--headerFont);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.5rem;\n display: inline-block;\n}\n\n.folder-container div > a:hover {\n color: var(--tertiary);\n}\n\n.folder-container div > button {\n color: var(--dark);\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding-left: 0;\n padding-right: 0;\n display: flex;\n align-items: center;\n font-family: var(--headerFont);\n}\n\n.folder-container div > button span {\n font-size: 0.95rem;\n display: inline-block;\n color: var(--secondary);\n font-weight: 600;\n margin: 0;\n line-height: 1.5rem;\n pointer-events: none;\n}\n\n.folder-icon {\n margin-right: 5px;\n color: var(--secondary);\n cursor: pointer;\n transition: transform 0.3s ease;\n backface-visibility: visible;\n flex-shrink: 0;\n}\n\nli:has(> .folder-outer:not(.open)) > .folder-container > svg {\n transform: rotate(-90deg);\n}\n\n.folder-icon:hover {\n color: var(--tertiary);\n}\n\n@media all and (max-width: 800px) {\n .explorer.collapsed {\n flex: 0 0 34px;\n }\n .explorer.collapsed > .explorer-content {\n transform: translateX(-100vw);\n visibility: hidden;\n }\n .explorer:not(.collapsed) {\n flex: 0 0 34px;\n }\n .explorer:not(.collapsed) > .explorer-content {\n transform: translateX(0);\n visibility: visible;\n }\n .explorer .explorer-content {\n box-sizing: border-box;\n z-index: 100;\n position: absolute;\n top: 0;\n left: 0;\n margin-top: 0;\n background-color: var(--light);\n max-width: 100vw;\n width: 100vw;\n transform: translateX(-100vw);\n transition: transform 200ms ease, visibility 200ms ease;\n overflow: hidden;\n padding: 4rem 0 2rem 0;\n height: 100dvh;\n max-height: 100dvh;\n visibility: hidden;\n }\n .explorer .mobile-explorer {\n margin: 0;\n padding: 5px;\n z-index: 101;\n }\n .explorer .mobile-explorer.hide-until-loaded {\n display: none;\n }\n .explorer .mobile-explorer .lucide-menu {\n stroke: var(--darkgray);\n }\n}\n@media all and (max-width: 800px) {\n .mobile-no-scroll .explorer-content > .explorer-ul {\n overscroll-behavior: contain;\n }\n}","var U=Object.hasOwnProperty;function S(u){let e=k(W(u,\"index\"),!0);return e.length===0?\"/\":e}function T(){return typeof document>\"u\"?\"\":document.body?.dataset?.basepath??\"\"}function v(u,e){let D=e??T(),n=u.startsWith(\"/\")?u:\"/\"+u;return D+n}function I(u,e){return u===e||u.endsWith(\"/\"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith(\"/\")&&(u=u.substring(1)),!e&&u.endsWith(\"/\")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title===\"index\"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||\"\"}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join(\"/\");return this.isFolder?e+\"/index\":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||\"\"}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n===\"index\"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||\"\").split(\"/\");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split(\"/\"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:\"base\"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!==\"tags\";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log(\"[Explorer] Fetching content index...\");let e=await fetchData;if(console.log(\"[Explorer] Fetched data keys:\",Object.keys(e).slice(0,5)),!e)return console.error(\"[Explorer] No data received\"),null;let D=e.content||e,n=Object.entries(D);if(console.log(\"[Explorer] Entry count:\",n.length),n.length===0)return console.warn(\"[Explorer] No content entries found\"),null;let r=y.fromEntries(n);console.log(\"[Explorer] Trie root children:\",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function(\"a\",\"b\",\"return (\"+E.sortFn+\")(a, b)\")),E.filterFn&&(F=new Function(\"node\",\"return (\"+E.filterFn+\")(node)\")),E.mapFn&&(d=new Function(\"node\",\"(\"+E.mapFn+\")(node)\"))}catch(E){console.error(\"Error parsing data functions:\",E)}return j(r,t,F,d)}catch(e){return console.error(\"Error building file trie:\",e),null}}var b=0;function N(u,e,D,n,r,t=\"\"){let F=document.getElementById(\"template-folder\"),d=document.getElementById(\"template-file\");if(!F||!d)return;let E=t?t+\"/\"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(\".folder-container\"),p=s.querySelector(\".folder-button\"),m=s.querySelector(\".folder-title\"),l=s.querySelector(\".folder-outer\"),o=s.querySelector(\".content\");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n===\"link\"&&p){let i=document.createElement(\"a\");i.className=p.className;let B=S(u.slug);i.href=v(B||\"\"),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add(\"open\"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector(\"a\");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add(\"active\",\"is-active\")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log(\"[Explorer] Nav event received, generation:\",e);let D=(u.detail?.url||\"\").replace(/^\\/+/,\"\"),n=document.querySelectorAll(\"div.explorer\");console.log(\"[Explorer] Found\",n.length,\"explorers\");let r={};try{JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error(\"[Explorer] Error loading saved state:\",t)}for(let t of n){let F=t.querySelector(\".explorer-ul\");if(!F){console.warn(\"[Explorer] No explorer-ul found\");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||\"collapse\";console.log(\"[Explorer] Starting tree build...\");let A=await R(d);if(e===b){if(console.log(\"[Explorer] Render generation is current, rendering tree\"),console.log(\"[Explorer] Trie result:\",A?\"success\":\"null\"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log(\"[Explorer] Rendering\",A.children.length,\"children\");for(let o of A.children)N(o,F,D,E,r,\"\");console.log(\"[Explorer] Render complete, final list length:\",F.children.length)}else console.warn(\"[Explorer] No trie or empty children\");let l=sessionStorage.getItem(\"explorerScrollTop\");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(\".active\");o&&o.scrollIntoView({behavior:\"smooth\"})}}else console.log(\"[Explorer] Stale render generation, skipping tree render\");let s=[],a=t.getElementsByClassName(\"explorer-toggle\");for(let l of a){let o=function(){let C=this.closest(\".explorer\");if(!C)return;let c=C.classList.toggle(\"collapsed\");C.setAttribute(\"aria-expanded\",c?\"false\":\"true\"),c?document.documentElement.classList.remove(\"mobile-no-scroll\"):document.documentElement.classList.add(\"mobile-no-scroll\")};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let p=t.getElementsByClassName(\"folder-icon\");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle(\"open\");let i=!f.classList.contains(\"open\"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem(\"fileTree\",JSON.stringify(h))};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let m=t.getElementsByClassName(\"folder-button\");for(let l of m){let o=function(C){let c=this.closest(\".folder-container\");if(!c)return;let f=t.dataset.behavior||\"collapse\",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!==\"link\"){if(C.stopPropagation(),!i)return;i.classList.toggle(\"open\");let h=!i.classList.contains(\"open\"),g=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem(\"fileTree\",JSON.stringify(g))}};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}typeof window<\"u\"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName(\"explorer\")){let F=t.querySelector(\".mobile-explorer\");F&&(F.classList.remove(\"hide-until-loaded\"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add(\"collapsed\"),t.setAttribute(\"aria-expanded\",\"false\"),document.documentElement.classList.remove(\"mobile-no-scroll\")))}}catch(D){console.error(\"[Explorer] Fatal error in nav handler:\",D)}}document.addEventListener(\"nav\",L);document.addEventListener(\"render\",L);document.addEventListener(\"prenav\",()=>{let u=document.querySelector(\".explorer-ul\");u&&sessionStorage.setItem(\"explorerScrollTop\",u.scrollTop.toString())});\n","import type {\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n} from \"@quartz-community/types\";\nimport OverflowListFactory from \"./OverflowList\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/explorer.scss\";\n// @ts-expect-error - Inline script loaded as text by esbuild plugin\nimport script from \"./scripts/explorer.inline.ts\";\n\ninterface FileTrieNode {\n slugSegment?: string;\n slugSegments?: string[];\n displayName?: string;\n isFolder: boolean;\n data: Record | null;\n children: FileTrieNode[];\n}\n\nexport interface ExplorerOptions {\n title?: string;\n folderDefaultState: \"collapsed\" | \"open\";\n folderClickBehavior: \"collapse\" | \"link\";\n useSavedState: boolean;\n sortFn?: (a: FileTrieNode, b: FileTrieNode) => number;\n filterFn?: (node: FileTrieNode) => boolean;\n mapFn?: (node: FileTrieNode) => FileTrieNode;\n order?: Array<\"filter\" | \"map\" | \"sort\">;\n}\n\nconst defaultOptions: ExplorerOptions = {\n folderDefaultState: \"collapsed\",\n folderClickBehavior: \"link\",\n useSavedState: true,\n mapFn: (node: FileTrieNode) => {\n return node;\n },\n sortFn: (a: FileTrieNode, b: FileTrieNode) => {\n if ((!a.isFolder && !b.isFolder) || (a.isFolder && b.isFolder)) {\n return (a.displayName || \"\").localeCompare(b.displayName || \"\", undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n }\n\n if (!a.isFolder && b.isFolder) {\n return 1;\n }\n return -1;\n },\n filterFn: (node: FileTrieNode) => node.slugSegment !== \"tags\",\n order: [\"filter\", \"map\", \"sort\"],\n};\n\nlet numExplorers = 0;\n\nfunction concatenateResources(...resources: (string | undefined)[]): string {\n return resources.filter((r): r is string => !!r).join(\"\\n\");\n}\n\nexport default ((userOpts?: Partial) => {\n const opts: ExplorerOptions = { ...defaultOptions, ...userOpts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const ExplorerComponent: QuartzComponent = (props: QuartzComponentProps) => {\n const { cfg } = props;\n const displayClass = (props as { displayClass?: \"mobile-only\" | \"desktop-only\" }).displayClass;\n const id = `explorer-${numExplorers++}`;\n const locale = cfg?.locale ?? \"en-US\";\n\n const title = opts.title ?? i18n(locale).components.explorer.title;\n\n return (\n \n \n \n \n \n \n \n \n \n

    {title}

    \n \n \n \n \n
    \n \n
    \n \n \n \n );\n };\n\n ExplorerComponent.css = style;\n ExplorerComponent.afterDOMLoaded = concatenateResources(script, overflowListAfterDOMLoaded);\n return ExplorerComponent;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index b4f9d42..1b8ff0b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -65,7 +65,7 @@ function i18n(locale) { var explorer_default = "@media all and (max-width: 800px) {\n .page > #quartz-body > :not(.sidebar.left:has(.explorer)) {\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body.lock-scroll > :not(.sidebar.left:has(.explorer)) {\n transform: translateX(100dvw);\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body .sidebar.left:has(.explorer) {\n box-sizing: border-box;\n position: sticky;\n background-color: var(--light);\n padding: 1rem 0 1rem 0;\n margin: 0;\n }\n .page > #quartz-body .hide-until-loaded ~ .explorer-content {\n display: none;\n }\n}\n.explorer {\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n min-height: 1.2rem;\n flex: 0 1 auto;\n}\n\n.explorer.collapsed {\n flex: 0 1 1.2rem;\n}\n\n.explorer.collapsed .fold {\n transform: rotateZ(-90deg);\n}\n\n.explorer .fold {\n margin-left: 0.5rem;\n transition: transform 0.3s ease;\n opacity: 0.8;\n}\n\n@media all and (max-width: 800px) {\n .explorer {\n order: -1;\n height: initial;\n overflow: hidden;\n flex-shrink: 0;\n align-self: flex-start;\n margin-top: auto;\n margin-bottom: auto;\n }\n}\n.explorer button.mobile-explorer {\n display: none;\n}\n\n.explorer button.desktop-explorer {\n display: flex;\n}\n\n@media all and (max-width: 800px) {\n .explorer button.mobile-explorer {\n display: flex;\n }\n .explorer button.desktop-explorer {\n display: none;\n }\n}\n.explorer svg {\n pointer-events: all;\n transition: transform 0.35s ease;\n}\n\n.explorer svg > polyline {\n pointer-events: none;\n}\n\nbutton.mobile-explorer,\nbutton.desktop-explorer {\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding: 0;\n color: var(--dark);\n display: flex;\n align-items: center;\n}\n\nbutton.mobile-explorer h2,\nbutton.desktop-explorer h2 {\n font-size: 1rem;\n display: inline-block;\n margin: 0;\n}\n\n.explorer-content {\n list-style: none;\n overflow: hidden;\n overflow-y: auto;\n margin-top: 0.5rem;\n}\n\n.explorer-content ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.explorer-content ul.explorer-ul {\n overscroll-behavior: contain;\n}\n\n.explorer-content ul li > a {\n color: var(--dark);\n opacity: 0.75;\n pointer-events: all;\n}\n\n.explorer-content ul li > a.active {\n opacity: 1;\n color: var(--tertiary);\n}\n\n.explorer-content .folder-outer {\n visibility: collapse;\n display: grid;\n grid-template-rows: 0fr;\n transition-property: grid-template-rows, visibility;\n transition-duration: 0.3s;\n transition-timing-function: ease-in-out;\n}\n\n.explorer-content .folder-outer.open {\n visibility: visible;\n grid-template-rows: 1fr;\n}\n\n.explorer-content .folder-outer > ul {\n overflow: hidden;\n margin-left: 6px;\n padding-left: 0.8rem;\n border-left: 1px solid var(--lightgray);\n}\n\n.folder-container {\n flex-direction: row;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.folder-container div > a {\n color: var(--secondary);\n font-family: var(--headerFont);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.5rem;\n display: inline-block;\n}\n\n.folder-container div > a:hover {\n color: var(--tertiary);\n}\n\n.folder-container div > button {\n color: var(--dark);\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding-left: 0;\n padding-right: 0;\n display: flex;\n align-items: center;\n font-family: var(--headerFont);\n}\n\n.folder-container div > button span {\n font-size: 0.95rem;\n display: inline-block;\n color: var(--secondary);\n font-weight: 600;\n margin: 0;\n line-height: 1.5rem;\n pointer-events: none;\n}\n\n.folder-icon {\n margin-right: 5px;\n color: var(--secondary);\n cursor: pointer;\n transition: transform 0.3s ease;\n backface-visibility: visible;\n flex-shrink: 0;\n}\n\nli:has(> .folder-outer:not(.open)) > .folder-container > svg {\n transform: rotate(-90deg);\n}\n\n.folder-icon:hover {\n color: var(--tertiary);\n}\n\n@media all and (max-width: 800px) {\n .explorer.collapsed {\n flex: 0 0 34px;\n }\n .explorer.collapsed > .explorer-content {\n transform: translateX(-100vw);\n visibility: hidden;\n }\n .explorer:not(.collapsed) {\n flex: 0 0 34px;\n }\n .explorer:not(.collapsed) > .explorer-content {\n transform: translateX(0);\n visibility: visible;\n }\n .explorer .explorer-content {\n box-sizing: border-box;\n z-index: 100;\n position: absolute;\n top: 0;\n left: 0;\n margin-top: 0;\n background-color: var(--light);\n max-width: 100vw;\n width: 100vw;\n transform: translateX(-100vw);\n transition: transform 200ms ease, visibility 200ms ease;\n overflow: hidden;\n padding: 4rem 0 2rem 0;\n height: 100dvh;\n max-height: 100dvh;\n visibility: hidden;\n }\n .explorer .mobile-explorer {\n margin: 0;\n padding: 5px;\n z-index: 101;\n }\n .explorer .mobile-explorer.hide-until-loaded {\n display: none;\n }\n .explorer .mobile-explorer .lucide-menu {\n stroke: var(--darkgray);\n }\n}\n@media all and (max-width: 800px) {\n .mobile-no-scroll .explorer-content > .explorer-ul {\n overscroll-behavior: contain;\n }\n}"; // src/components/scripts/explorer.inline.ts -var explorer_inline_default = `var U=Object.hasOwnProperty;function S(u){let e=k(W(u,"index"),!0);return e.length===0?"/":e}function T(){return typeof document>"u"?"":document.body?.dataset?.basepath??""}function v(u,e){let D=e??T(),n=u.startsWith("/")?u:"/"+u;return D+n}function I(u,e){return u===e||u.endsWith("/"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith("/")&&(u=u.substring(1)),!e&&u.endsWith("/")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title==="index"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||""}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join("/");return this.isFolder?e+"/index":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||""}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n==="index"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||"").split("/");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split("/"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:"base"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!=="tags";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log("[Explorer] Fetching content index...");let e=await fetchData;if(console.log("[Explorer] Fetched data keys:",Object.keys(e).slice(0,5)),!e)return console.error("[Explorer] No data received"),null;let D=e.content||e,n=Object.entries(D);if(console.log("[Explorer] Entry count:",n.length),n.length===0)return console.warn("[Explorer] No content entries found"),null;let r=y.fromEntries(n);console.log("[Explorer] Trie root children:",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function("a","b","return ("+E.sortFn+")(a, b)")),E.filterFn&&(F=new Function("node","return ("+E.filterFn+")(node)")),E.mapFn&&(d=new Function("node","("+E.mapFn+")(node)"))}catch(E){console.error("Error parsing data functions:",E)}return j(r,t,F,d)}catch(e){return console.error("Error building file trie:",e),null}}var b=0;function N(u,e,D,n,r,t=""){let F=document.getElementById("template-folder"),d=document.getElementById("template-file");if(!F||!d)return;let E=t?t+"/"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(".folder-container"),p=s.querySelector(".folder-button"),m=s.querySelector(".folder-title"),l=s.querySelector(".folder-outer"),o=s.querySelector(".content");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n==="link"&&p){let i=document.createElement("a");i.className=p.className;let B=S(u.slug);i.href=v(B||""),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add("open"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector("a");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add("active")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log("[Explorer] Nav event received, generation:",e);let D=(u.detail?.url||"").replace(/^\\/+/,""),n=document.querySelectorAll("div.explorer");console.log("[Explorer] Found",n.length,"explorers");let r={};try{JSON.parse(localStorage.getItem("fileTree")||"[]").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error("[Explorer] Error loading saved state:",t)}for(let t of n){let F=t.querySelector(".explorer-ul");if(!F){console.warn("[Explorer] No explorer-ul found");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||"collapse";console.log("[Explorer] Starting tree build...");let A=await R(d);if(e===b){if(console.log("[Explorer] Render generation is current, rendering tree"),console.log("[Explorer] Trie result:",A?"success":"null"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log("[Explorer] Rendering",A.children.length,"children");for(let o of A.children)N(o,F,D,E,r,"");console.log("[Explorer] Render complete, final list length:",F.children.length)}else console.warn("[Explorer] No trie or empty children");let l=sessionStorage.getItem("explorerScrollTop");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(".active");o&&o.scrollIntoView({behavior:"smooth"})}}else console.log("[Explorer] Stale render generation, skipping tree render");let s=[],a=t.getElementsByClassName("explorer-toggle");for(let l of a){let o=function(){let C=this.closest(".explorer");if(!C)return;let c=C.classList.toggle("collapsed");C.setAttribute("aria-expanded",c?"false":"true"),c?document.documentElement.classList.remove("mobile-no-scroll"):document.documentElement.classList.add("mobile-no-scroll")};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let p=t.getElementsByClassName("folder-icon");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle("open");let i=!f.classList.contains("open"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem("fileTree")||"[]"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem("fileTree",JSON.stringify(h))};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let m=t.getElementsByClassName("folder-button");for(let l of m){let o=function(C){let c=this.closest(".folder-container");if(!c)return;let f=t.dataset.behavior||"collapse",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!=="link"){if(C.stopPropagation(),!i)return;i.classList.toggle("open");let h=!i.classList.contains("open"),g=JSON.parse(localStorage.getItem("fileTree")||"[]"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem("fileTree",JSON.stringify(g))}};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}typeof window<"u"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName("explorer")){let F=t.querySelector(".mobile-explorer");F&&(F.classList.remove("hide-until-loaded"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add("collapsed"),t.setAttribute("aria-expanded","false"),document.documentElement.classList.remove("mobile-no-scroll")))}}catch(D){console.error("[Explorer] Fatal error in nav handler:",D)}}document.addEventListener("nav",L);document.addEventListener("render",L);document.addEventListener("prenav",()=>{let u=document.querySelector(".explorer-ul");u&&sessionStorage.setItem("explorerScrollTop",u.scrollTop.toString())}); +var explorer_inline_default = `var U=Object.hasOwnProperty;function S(u){let e=k(W(u,"index"),!0);return e.length===0?"/":e}function T(){return typeof document>"u"?"":document.body?.dataset?.basepath??""}function v(u,e){let D=e??T(),n=u.startsWith("/")?u:"/"+u;return D+n}function I(u,e){return u===e||u.endsWith("/"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith("/")&&(u=u.substring(1)),!e&&u.endsWith("/")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title==="index"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||""}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join("/");return this.isFolder?e+"/index":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||""}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n==="index"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||"").split("/");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split("/"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:"base"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!=="tags";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log("[Explorer] Fetching content index...");let e=await fetchData;if(console.log("[Explorer] Fetched data keys:",Object.keys(e).slice(0,5)),!e)return console.error("[Explorer] No data received"),null;let D=e.content||e,n=Object.entries(D);if(console.log("[Explorer] Entry count:",n.length),n.length===0)return console.warn("[Explorer] No content entries found"),null;let r=y.fromEntries(n);console.log("[Explorer] Trie root children:",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function("a","b","return ("+E.sortFn+")(a, b)")),E.filterFn&&(F=new Function("node","return ("+E.filterFn+")(node)")),E.mapFn&&(d=new Function("node","("+E.mapFn+")(node)"))}catch(E){console.error("Error parsing data functions:",E)}return j(r,t,F,d)}catch(e){return console.error("Error building file trie:",e),null}}var b=0;function N(u,e,D,n,r,t=""){let F=document.getElementById("template-folder"),d=document.getElementById("template-file");if(!F||!d)return;let E=t?t+"/"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(".folder-container"),p=s.querySelector(".folder-button"),m=s.querySelector(".folder-title"),l=s.querySelector(".folder-outer"),o=s.querySelector(".content");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n==="link"&&p){let i=document.createElement("a");i.className=p.className;let B=S(u.slug);i.href=v(B||""),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add("open"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector("a");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add("active","is-active")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log("[Explorer] Nav event received, generation:",e);let D=(u.detail?.url||"").replace(/^\\/+/,""),n=document.querySelectorAll("div.explorer");console.log("[Explorer] Found",n.length,"explorers");let r={};try{JSON.parse(localStorage.getItem("fileTree")||"[]").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error("[Explorer] Error loading saved state:",t)}for(let t of n){let F=t.querySelector(".explorer-ul");if(!F){console.warn("[Explorer] No explorer-ul found");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||"collapse";console.log("[Explorer] Starting tree build...");let A=await R(d);if(e===b){if(console.log("[Explorer] Render generation is current, rendering tree"),console.log("[Explorer] Trie result:",A?"success":"null"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log("[Explorer] Rendering",A.children.length,"children");for(let o of A.children)N(o,F,D,E,r,"");console.log("[Explorer] Render complete, final list length:",F.children.length)}else console.warn("[Explorer] No trie or empty children");let l=sessionStorage.getItem("explorerScrollTop");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(".active");o&&o.scrollIntoView({behavior:"smooth"})}}else console.log("[Explorer] Stale render generation, skipping tree render");let s=[],a=t.getElementsByClassName("explorer-toggle");for(let l of a){let o=function(){let C=this.closest(".explorer");if(!C)return;let c=C.classList.toggle("collapsed");C.setAttribute("aria-expanded",c?"false":"true"),c?document.documentElement.classList.remove("mobile-no-scroll"):document.documentElement.classList.add("mobile-no-scroll")};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let p=t.getElementsByClassName("folder-icon");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle("open");let i=!f.classList.contains("open"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem("fileTree")||"[]"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem("fileTree",JSON.stringify(h))};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}let m=t.getElementsByClassName("folder-button");for(let l of m){let o=function(C){let c=this.closest(".folder-container");if(!c)return;let f=t.dataset.behavior||"collapse",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!=="link"){if(C.stopPropagation(),!i)return;i.classList.toggle("open");let h=!i.classList.contains("open"),g=JSON.parse(localStorage.getItem("fileTree")||"[]"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem("fileTree",JSON.stringify(g))}};l.addEventListener("click",o),s.push(()=>l.removeEventListener("click",o))}typeof window<"u"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName("explorer")){let F=t.querySelector(".mobile-explorer");F&&(F.classList.remove("hide-until-loaded"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add("collapsed"),t.setAttribute("aria-expanded","false"),document.documentElement.classList.remove("mobile-no-scroll")))}}catch(D){console.error("[Explorer] Fatal error in nav handler:",D)}}document.addEventListener("nav",L);document.addEventListener("render",L);document.addEventListener("prenav",()=>{let u=document.querySelector(".explorer-ul");u&&sessionStorage.setItem("explorerScrollTop",u.scrollTop.toString())}); `; var defaultOptions = { folderDefaultState: "collapsed", @@ -105,7 +105,7 @@ var Explorer_default = ((userOpts) => { return /* @__PURE__ */ jsxs( "div", { - class: classNames(displayClass, "explorer"), + class: classNames(displayClass, "explorer", "nav-files-container"), "data-behavior": opts.folderClickBehavior, "data-collapsed": opts.folderDefaultState, "data-savestate": opts.useSavedState, @@ -172,9 +172,9 @@ var Explorer_default = ((userOpts) => { } ), /* @__PURE__ */ jsx("div", { id, class: "explorer-content", "aria-expanded": false, role: "group", children: /* @__PURE__ */ jsx(OverflowList2, { class: "explorer-ul" }) }), - /* @__PURE__ */ jsx("template", { id: "template-file", children: /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: "#" }) }) }), + /* @__PURE__ */ jsx("template", { id: "template-file", children: /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("a", { href: "#", class: "nav-file-title tree-item-self" }) }) }), /* @__PURE__ */ jsx("template", { id: "template-folder", children: /* @__PURE__ */ jsxs("li", { children: [ - /* @__PURE__ */ jsxs("div", { class: "folder-container", children: [ + /* @__PURE__ */ jsxs("div", { class: "folder-container nav-folder-title tree-item-self", children: [ /* @__PURE__ */ jsx( "svg", { @@ -187,13 +187,13 @@ var Explorer_default = ((userOpts) => { "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", - class: "folder-icon", + class: "folder-icon nav-folder-collapse-indicator collapse-icon", children: /* @__PURE__ */ jsx("polyline", { points: "6 9 12 15 18 9" }) } ), /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("button", { class: "folder-button", children: /* @__PURE__ */ jsx("span", { class: "folder-title" }) }) }) ] }), - /* @__PURE__ */ jsx("div", { class: "folder-outer", children: /* @__PURE__ */ jsx("ul", { class: "content" }) }) + /* @__PURE__ */ jsx("div", { class: "folder-outer", children: /* @__PURE__ */ jsx("ul", { class: "content tree-item-children" }) }) ] }) }) ] } diff --git a/dist/index.js.map b/dist/index.js.map index f4647de..ba9c095 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/components/OverflowList.tsx","../src/i18n/locales/en-US.ts","../src/i18n/index.ts","../src/components/styles/explorer.scss","../src/components/scripts/explorer.inline.ts","../src/components/Explorer.tsx"],"names":["OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import type { VNode, JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
      \n {children}\n
    • \n
    \n );\n};\n\nlet numLists = 0;\n\nexport interface OverflowListFactory {\n OverflowList: (props: JSX.HTMLAttributes) => VNode;\n overflowListAfterDOMLoaded: string;\n}\n\nexport default (): OverflowListFactory => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n const scrollContainer = ul.parentElement\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n }, scrollContainer ? { root: scrollContainer } : undefined)\n\n observer.observe(end)\n window.addCleanup(() => observer.disconnect())\n})\n`,\n };\n};\n","export default {\n components: {\n explorer: {\n title: \"Explorer\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","@media all and (max-width: 800px) {\n .page > #quartz-body > :not(.sidebar.left:has(.explorer)) {\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body.lock-scroll > :not(.sidebar.left:has(.explorer)) {\n transform: translateX(100dvw);\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body .sidebar.left:has(.explorer) {\n box-sizing: border-box;\n position: sticky;\n background-color: var(--light);\n padding: 1rem 0 1rem 0;\n margin: 0;\n }\n .page > #quartz-body .hide-until-loaded ~ .explorer-content {\n display: none;\n }\n}\n.explorer {\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n min-height: 1.2rem;\n flex: 0 1 auto;\n}\n\n.explorer.collapsed {\n flex: 0 1 1.2rem;\n}\n\n.explorer.collapsed .fold {\n transform: rotateZ(-90deg);\n}\n\n.explorer .fold {\n margin-left: 0.5rem;\n transition: transform 0.3s ease;\n opacity: 0.8;\n}\n\n@media all and (max-width: 800px) {\n .explorer {\n order: -1;\n height: initial;\n overflow: hidden;\n flex-shrink: 0;\n align-self: flex-start;\n margin-top: auto;\n margin-bottom: auto;\n }\n}\n.explorer button.mobile-explorer {\n display: none;\n}\n\n.explorer button.desktop-explorer {\n display: flex;\n}\n\n@media all and (max-width: 800px) {\n .explorer button.mobile-explorer {\n display: flex;\n }\n .explorer button.desktop-explorer {\n display: none;\n }\n}\n.explorer svg {\n pointer-events: all;\n transition: transform 0.35s ease;\n}\n\n.explorer svg > polyline {\n pointer-events: none;\n}\n\nbutton.mobile-explorer,\nbutton.desktop-explorer {\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding: 0;\n color: var(--dark);\n display: flex;\n align-items: center;\n}\n\nbutton.mobile-explorer h2,\nbutton.desktop-explorer h2 {\n font-size: 1rem;\n display: inline-block;\n margin: 0;\n}\n\n.explorer-content {\n list-style: none;\n overflow: hidden;\n overflow-y: auto;\n margin-top: 0.5rem;\n}\n\n.explorer-content ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.explorer-content ul.explorer-ul {\n overscroll-behavior: contain;\n}\n\n.explorer-content ul li > a {\n color: var(--dark);\n opacity: 0.75;\n pointer-events: all;\n}\n\n.explorer-content ul li > a.active {\n opacity: 1;\n color: var(--tertiary);\n}\n\n.explorer-content .folder-outer {\n visibility: collapse;\n display: grid;\n grid-template-rows: 0fr;\n transition-property: grid-template-rows, visibility;\n transition-duration: 0.3s;\n transition-timing-function: ease-in-out;\n}\n\n.explorer-content .folder-outer.open {\n visibility: visible;\n grid-template-rows: 1fr;\n}\n\n.explorer-content .folder-outer > ul {\n overflow: hidden;\n margin-left: 6px;\n padding-left: 0.8rem;\n border-left: 1px solid var(--lightgray);\n}\n\n.folder-container {\n flex-direction: row;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.folder-container div > a {\n color: var(--secondary);\n font-family: var(--headerFont);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.5rem;\n display: inline-block;\n}\n\n.folder-container div > a:hover {\n color: var(--tertiary);\n}\n\n.folder-container div > button {\n color: var(--dark);\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding-left: 0;\n padding-right: 0;\n display: flex;\n align-items: center;\n font-family: var(--headerFont);\n}\n\n.folder-container div > button span {\n font-size: 0.95rem;\n display: inline-block;\n color: var(--secondary);\n font-weight: 600;\n margin: 0;\n line-height: 1.5rem;\n pointer-events: none;\n}\n\n.folder-icon {\n margin-right: 5px;\n color: var(--secondary);\n cursor: pointer;\n transition: transform 0.3s ease;\n backface-visibility: visible;\n flex-shrink: 0;\n}\n\nli:has(> .folder-outer:not(.open)) > .folder-container > svg {\n transform: rotate(-90deg);\n}\n\n.folder-icon:hover {\n color: var(--tertiary);\n}\n\n@media all and (max-width: 800px) {\n .explorer.collapsed {\n flex: 0 0 34px;\n }\n .explorer.collapsed > .explorer-content {\n transform: translateX(-100vw);\n visibility: hidden;\n }\n .explorer:not(.collapsed) {\n flex: 0 0 34px;\n }\n .explorer:not(.collapsed) > .explorer-content {\n transform: translateX(0);\n visibility: visible;\n }\n .explorer .explorer-content {\n box-sizing: border-box;\n z-index: 100;\n position: absolute;\n top: 0;\n left: 0;\n margin-top: 0;\n background-color: var(--light);\n max-width: 100vw;\n width: 100vw;\n transform: translateX(-100vw);\n transition: transform 200ms ease, visibility 200ms ease;\n overflow: hidden;\n padding: 4rem 0 2rem 0;\n height: 100dvh;\n max-height: 100dvh;\n visibility: hidden;\n }\n .explorer .mobile-explorer {\n margin: 0;\n padding: 5px;\n z-index: 101;\n }\n .explorer .mobile-explorer.hide-until-loaded {\n display: none;\n }\n .explorer .mobile-explorer .lucide-menu {\n stroke: var(--darkgray);\n }\n}\n@media all and (max-width: 800px) {\n .mobile-no-scroll .explorer-content > .explorer-ul {\n overscroll-behavior: contain;\n }\n}","var U=Object.hasOwnProperty;function S(u){let e=k(W(u,\"index\"),!0);return e.length===0?\"/\":e}function T(){return typeof document>\"u\"?\"\":document.body?.dataset?.basepath??\"\"}function v(u,e){let D=e??T(),n=u.startsWith(\"/\")?u:\"/\"+u;return D+n}function I(u,e){return u===e||u.endsWith(\"/\"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith(\"/\")&&(u=u.substring(1)),!e&&u.endsWith(\"/\")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title===\"index\"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||\"\"}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join(\"/\");return this.isFolder?e+\"/index\":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||\"\"}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n===\"index\"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||\"\").split(\"/\");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split(\"/\"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:\"base\"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!==\"tags\";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log(\"[Explorer] Fetching content index...\");let e=await fetchData;if(console.log(\"[Explorer] Fetched data keys:\",Object.keys(e).slice(0,5)),!e)return console.error(\"[Explorer] No data received\"),null;let D=e.content||e,n=Object.entries(D);if(console.log(\"[Explorer] Entry count:\",n.length),n.length===0)return console.warn(\"[Explorer] No content entries found\"),null;let r=y.fromEntries(n);console.log(\"[Explorer] Trie root children:\",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function(\"a\",\"b\",\"return (\"+E.sortFn+\")(a, b)\")),E.filterFn&&(F=new Function(\"node\",\"return (\"+E.filterFn+\")(node)\")),E.mapFn&&(d=new Function(\"node\",\"(\"+E.mapFn+\")(node)\"))}catch(E){console.error(\"Error parsing data functions:\",E)}return j(r,t,F,d)}catch(e){return console.error(\"Error building file trie:\",e),null}}var b=0;function N(u,e,D,n,r,t=\"\"){let F=document.getElementById(\"template-folder\"),d=document.getElementById(\"template-file\");if(!F||!d)return;let E=t?t+\"/\"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(\".folder-container\"),p=s.querySelector(\".folder-button\"),m=s.querySelector(\".folder-title\"),l=s.querySelector(\".folder-outer\"),o=s.querySelector(\".content\");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n===\"link\"&&p){let i=document.createElement(\"a\");i.className=p.className;let B=S(u.slug);i.href=v(B||\"\"),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add(\"open\"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector(\"a\");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add(\"active\")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log(\"[Explorer] Nav event received, generation:\",e);let D=(u.detail?.url||\"\").replace(/^\\/+/,\"\"),n=document.querySelectorAll(\"div.explorer\");console.log(\"[Explorer] Found\",n.length,\"explorers\");let r={};try{JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error(\"[Explorer] Error loading saved state:\",t)}for(let t of n){let F=t.querySelector(\".explorer-ul\");if(!F){console.warn(\"[Explorer] No explorer-ul found\");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||\"collapse\";console.log(\"[Explorer] Starting tree build...\");let A=await R(d);if(e===b){if(console.log(\"[Explorer] Render generation is current, rendering tree\"),console.log(\"[Explorer] Trie result:\",A?\"success\":\"null\"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log(\"[Explorer] Rendering\",A.children.length,\"children\");for(let o of A.children)N(o,F,D,E,r,\"\");console.log(\"[Explorer] Render complete, final list length:\",F.children.length)}else console.warn(\"[Explorer] No trie or empty children\");let l=sessionStorage.getItem(\"explorerScrollTop\");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(\".active\");o&&o.scrollIntoView({behavior:\"smooth\"})}}else console.log(\"[Explorer] Stale render generation, skipping tree render\");let s=[],a=t.getElementsByClassName(\"explorer-toggle\");for(let l of a){let o=function(){let C=this.closest(\".explorer\");if(!C)return;let c=C.classList.toggle(\"collapsed\");C.setAttribute(\"aria-expanded\",c?\"false\":\"true\"),c?document.documentElement.classList.remove(\"mobile-no-scroll\"):document.documentElement.classList.add(\"mobile-no-scroll\")};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let p=t.getElementsByClassName(\"folder-icon\");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle(\"open\");let i=!f.classList.contains(\"open\"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem(\"fileTree\",JSON.stringify(h))};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let m=t.getElementsByClassName(\"folder-button\");for(let l of m){let o=function(C){let c=this.closest(\".folder-container\");if(!c)return;let f=t.dataset.behavior||\"collapse\",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!==\"link\"){if(C.stopPropagation(),!i)return;i.classList.toggle(\"open\");let h=!i.classList.contains(\"open\"),g=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem(\"fileTree\",JSON.stringify(g))}};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}typeof window<\"u\"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName(\"explorer\")){let F=t.querySelector(\".mobile-explorer\");F&&(F.classList.remove(\"hide-until-loaded\"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add(\"collapsed\"),t.setAttribute(\"aria-expanded\",\"false\"),document.documentElement.classList.remove(\"mobile-no-scroll\")))}}catch(D){console.error(\"[Explorer] Fatal error in nav handler:\",D)}}document.addEventListener(\"nav\",L);document.addEventListener(\"render\",L);document.addEventListener(\"prenav\",()=>{let u=document.querySelector(\".explorer-ul\");u&&sessionStorage.setItem(\"explorerScrollTop\",u.scrollTop.toString())});\n","import type {\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n} from \"@quartz-community/types\";\nimport OverflowListFactory from \"./OverflowList\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/explorer.scss\";\n// @ts-expect-error - Inline script loaded as text by esbuild plugin\nimport script from \"./scripts/explorer.inline.ts\";\n\ninterface FileTrieNode {\n slugSegment?: string;\n slugSegments?: string[];\n displayName?: string;\n isFolder: boolean;\n data: Record | null;\n children: FileTrieNode[];\n}\n\nexport interface ExplorerOptions {\n title?: string;\n folderDefaultState: \"collapsed\" | \"open\";\n folderClickBehavior: \"collapse\" | \"link\";\n useSavedState: boolean;\n sortFn?: (a: FileTrieNode, b: FileTrieNode) => number;\n filterFn?: (node: FileTrieNode) => boolean;\n mapFn?: (node: FileTrieNode) => FileTrieNode;\n order?: Array<\"filter\" | \"map\" | \"sort\">;\n}\n\nconst defaultOptions: ExplorerOptions = {\n folderDefaultState: \"collapsed\",\n folderClickBehavior: \"link\",\n useSavedState: true,\n mapFn: (node: FileTrieNode) => {\n return node;\n },\n sortFn: (a: FileTrieNode, b: FileTrieNode) => {\n if ((!a.isFolder && !b.isFolder) || (a.isFolder && b.isFolder)) {\n return (a.displayName || \"\").localeCompare(b.displayName || \"\", undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n }\n\n if (!a.isFolder && b.isFolder) {\n return 1;\n }\n return -1;\n },\n filterFn: (node: FileTrieNode) => node.slugSegment !== \"tags\",\n order: [\"filter\", \"map\", \"sort\"],\n};\n\nlet numExplorers = 0;\n\nfunction concatenateResources(...resources: (string | undefined)[]): string {\n return resources.filter((r): r is string => !!r).join(\"\\n\");\n}\n\nexport default ((userOpts?: Partial) => {\n const opts: ExplorerOptions = { ...defaultOptions, ...userOpts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const ExplorerComponent: QuartzComponent = (props: QuartzComponentProps) => {\n const { cfg } = props;\n const displayClass = (props as { displayClass?: \"mobile-only\" | \"desktop-only\" }).displayClass;\n const id = `explorer-${numExplorers++}`;\n const locale = cfg?.locale ?? \"en-US\";\n\n const title = opts.title ?? i18n(locale).components.explorer.title;\n\n return (\n \n \n \n \n \n \n \n \n \n

    {title}

    \n \n \n \n \n
    \n \n
    \n \n \n \n );\n };\n\n ExplorerComponent.css = style;\n ExplorerComponent.afterDOMLoaded = concatenateResources(script, overflowListAfterDOMLoaded);\n return ExplorerComponent;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file +{"version":3,"sources":["../src/components/OverflowList.tsx","../src/i18n/locales/en-US.ts","../src/i18n/index.ts","../src/components/styles/explorer.scss","../src/components/scripts/explorer.inline.ts","../src/components/Explorer.tsx"],"names":["OverflowList","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import type { VNode, JSX } from \"preact\";\n\nconst OverflowList = ({\n children,\n ...props\n}: JSX.HTMLAttributes & { id: string }) => {\n return (\n
      \n {children}\n
    • \n
    \n );\n};\n\nlet numLists = 0;\n\nexport interface OverflowListFactory {\n OverflowList: (props: JSX.HTMLAttributes) => VNode;\n overflowListAfterDOMLoaded: string;\n}\n\nexport default (): OverflowListFactory => {\n const id = `list-${numLists++}`;\n\n return {\n OverflowList: (props: JSX.HTMLAttributes) => (\n \n ),\n overflowListAfterDOMLoaded: `\ndocument.addEventListener(\"nav\", (e) => {\n const ul = document.getElementById(\"${id}\")\n if (!ul) return\n\n const end = ul.querySelector(\".overflow-end\")\n if (!end) return\n\n const scrollContainer = ul.parentElement\n const observer = new IntersectionObserver((entries) => {\n for (const entry of entries) {\n const parentUl = entry.target.parentElement\n if (!parentUl) return\n if (entry.isIntersecting) {\n parentUl.classList.remove(\"gradient-active\")\n } else {\n parentUl.classList.add(\"gradient-active\")\n }\n }\n }, scrollContainer ? { root: scrollContainer } : undefined)\n\n observer.observe(end)\n window.addCleanup(() => observer.disconnect())\n})\n`,\n };\n};\n","export default {\n components: {\n explorer: {\n title: \"Explorer\",\n },\n },\n};\n","import enUS from \"./locales/en-US\";\n\nconst locales: Record = {\n \"en-US\": enUS,\n};\n\nexport function i18n(locale: string) {\n return locales[locale] || enUS;\n}\n","@media all and (max-width: 800px) {\n .page > #quartz-body > :not(.sidebar.left:has(.explorer)) {\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body.lock-scroll > :not(.sidebar.left:has(.explorer)) {\n transform: translateX(100dvw);\n transition: transform 300ms ease-in-out;\n }\n .page > #quartz-body .sidebar.left:has(.explorer) {\n box-sizing: border-box;\n position: sticky;\n background-color: var(--light);\n padding: 1rem 0 1rem 0;\n margin: 0;\n }\n .page > #quartz-body .hide-until-loaded ~ .explorer-content {\n display: none;\n }\n}\n.explorer {\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n min-height: 1.2rem;\n flex: 0 1 auto;\n}\n\n.explorer.collapsed {\n flex: 0 1 1.2rem;\n}\n\n.explorer.collapsed .fold {\n transform: rotateZ(-90deg);\n}\n\n.explorer .fold {\n margin-left: 0.5rem;\n transition: transform 0.3s ease;\n opacity: 0.8;\n}\n\n@media all and (max-width: 800px) {\n .explorer {\n order: -1;\n height: initial;\n overflow: hidden;\n flex-shrink: 0;\n align-self: flex-start;\n margin-top: auto;\n margin-bottom: auto;\n }\n}\n.explorer button.mobile-explorer {\n display: none;\n}\n\n.explorer button.desktop-explorer {\n display: flex;\n}\n\n@media all and (max-width: 800px) {\n .explorer button.mobile-explorer {\n display: flex;\n }\n .explorer button.desktop-explorer {\n display: none;\n }\n}\n.explorer svg {\n pointer-events: all;\n transition: transform 0.35s ease;\n}\n\n.explorer svg > polyline {\n pointer-events: none;\n}\n\nbutton.mobile-explorer,\nbutton.desktop-explorer {\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding: 0;\n color: var(--dark);\n display: flex;\n align-items: center;\n}\n\nbutton.mobile-explorer h2,\nbutton.desktop-explorer h2 {\n font-size: 1rem;\n display: inline-block;\n margin: 0;\n}\n\n.explorer-content {\n list-style: none;\n overflow: hidden;\n overflow-y: auto;\n margin-top: 0.5rem;\n}\n\n.explorer-content ul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.explorer-content ul.explorer-ul {\n overscroll-behavior: contain;\n}\n\n.explorer-content ul li > a {\n color: var(--dark);\n opacity: 0.75;\n pointer-events: all;\n}\n\n.explorer-content ul li > a.active {\n opacity: 1;\n color: var(--tertiary);\n}\n\n.explorer-content .folder-outer {\n visibility: collapse;\n display: grid;\n grid-template-rows: 0fr;\n transition-property: grid-template-rows, visibility;\n transition-duration: 0.3s;\n transition-timing-function: ease-in-out;\n}\n\n.explorer-content .folder-outer.open {\n visibility: visible;\n grid-template-rows: 1fr;\n}\n\n.explorer-content .folder-outer > ul {\n overflow: hidden;\n margin-left: 6px;\n padding-left: 0.8rem;\n border-left: 1px solid var(--lightgray);\n}\n\n.folder-container {\n flex-direction: row;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.folder-container div > a {\n color: var(--secondary);\n font-family: var(--headerFont);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.5rem;\n display: inline-block;\n}\n\n.folder-container div > a:hover {\n color: var(--tertiary);\n}\n\n.folder-container div > button {\n color: var(--dark);\n background-color: transparent;\n border: none;\n text-align: left;\n cursor: pointer;\n padding-left: 0;\n padding-right: 0;\n display: flex;\n align-items: center;\n font-family: var(--headerFont);\n}\n\n.folder-container div > button span {\n font-size: 0.95rem;\n display: inline-block;\n color: var(--secondary);\n font-weight: 600;\n margin: 0;\n line-height: 1.5rem;\n pointer-events: none;\n}\n\n.folder-icon {\n margin-right: 5px;\n color: var(--secondary);\n cursor: pointer;\n transition: transform 0.3s ease;\n backface-visibility: visible;\n flex-shrink: 0;\n}\n\nli:has(> .folder-outer:not(.open)) > .folder-container > svg {\n transform: rotate(-90deg);\n}\n\n.folder-icon:hover {\n color: var(--tertiary);\n}\n\n@media all and (max-width: 800px) {\n .explorer.collapsed {\n flex: 0 0 34px;\n }\n .explorer.collapsed > .explorer-content {\n transform: translateX(-100vw);\n visibility: hidden;\n }\n .explorer:not(.collapsed) {\n flex: 0 0 34px;\n }\n .explorer:not(.collapsed) > .explorer-content {\n transform: translateX(0);\n visibility: visible;\n }\n .explorer .explorer-content {\n box-sizing: border-box;\n z-index: 100;\n position: absolute;\n top: 0;\n left: 0;\n margin-top: 0;\n background-color: var(--light);\n max-width: 100vw;\n width: 100vw;\n transform: translateX(-100vw);\n transition: transform 200ms ease, visibility 200ms ease;\n overflow: hidden;\n padding: 4rem 0 2rem 0;\n height: 100dvh;\n max-height: 100dvh;\n visibility: hidden;\n }\n .explorer .mobile-explorer {\n margin: 0;\n padding: 5px;\n z-index: 101;\n }\n .explorer .mobile-explorer.hide-until-loaded {\n display: none;\n }\n .explorer .mobile-explorer .lucide-menu {\n stroke: var(--darkgray);\n }\n}\n@media all and (max-width: 800px) {\n .mobile-no-scroll .explorer-content > .explorer-ul {\n overscroll-behavior: contain;\n }\n}","var U=Object.hasOwnProperty;function S(u){let e=k(W(u,\"index\"),!0);return e.length===0?\"/\":e}function T(){return typeof document>\"u\"?\"\":document.body?.dataset?.basepath??\"\"}function v(u,e){let D=e??T(),n=u.startsWith(\"/\")?u:\"/\"+u;return D+n}function I(u,e){return u===e||u.endsWith(\"/\"+e)}function W(u,e){return I(u,e)&&(u=u.slice(0,-e.length)),u}function k(u,e){return u.startsWith(\"/\")&&(u=u.substring(1)),!e&&u.endsWith(\"/\")&&(u=u.slice(0,-1)),u}var y=class u{constructor(e,D){this.children=[],this.slugSegments=e,this.data=D||null,this.isFolder=!1,this.fileSegmentHint=null,this.displayNameOverride=void 0}get displayName(){return this.displayNameOverride!==void 0?this.displayNameOverride:(this.data?.title===\"index\"?void 0:this.data?.title)||this.fileSegmentHint||this.slugSegment||\"\"}set displayName(e){this.displayNameOverride=e}get slug(){let e=this.slugSegments.join(\"/\");return this.isFolder?e+\"/index\":e}get slugSegment(){return this.slugSegments[this.slugSegments.length-1]||\"\"}makeChild(e,D){let n=[...this.slugSegments,e[0]],r=new u(n,D);return this.children.push(r),r}insert(e,D){if(e.length===0)return;this.isFolder=!0;let n=e[0];if(e.length===1)n===\"index\"?this.data||(this.data=D):this.makeChild(e,D);else{let r=this.children.find(F=>F.slugSegment===n);r||(r=this.makeChild(e,void 0));let t=(D.filePath||D.slug||\"\").split(\"/\");r.fileSegmentHint=t[t.length-e.length],r.insert(e.slice(1),D)}}add(e){this.insert(e.slug.split(\"/\"),e)}sort(e){this.children.sort(e),this.children.forEach(D=>D.sort(e))}filter(e){this.children=this.children.filter(e),this.children.forEach(D=>D.filter(e))}map(e){e(this),this.children.forEach(D=>D.map(e))}static fromEntries(e){let D=new u([],null);return e.forEach(([,n])=>D.add(n)),D}},P=(u,e)=>!u.isFolder&&!e.isFolder||u.isFolder&&e.isFolder?u.displayName.localeCompare(e.displayName,void 0,{numeric:!0,sensitivity:\"base\"}):!u.isFolder&&e.isFolder?1:-1,O=u=>u.slugSegment!==\"tags\";function j(u,e,D,n){return D&&u.filter(D),n&&u.map(n),e&&u.sort(e),u}async function R(u){try{console.log(\"[Explorer] Fetching content index...\");let e=await fetchData;if(console.log(\"[Explorer] Fetched data keys:\",Object.keys(e).slice(0,5)),!e)return console.error(\"[Explorer] No data received\"),null;let D=e.content||e,n=Object.entries(D);if(console.log(\"[Explorer] Entry count:\",n.length),n.length===0)return console.warn(\"[Explorer] No content entries found\"),null;let r=y.fromEntries(n);console.log(\"[Explorer] Trie root children:\",r.children.length);let t=P,F=O,d=null;if(u)try{let E=JSON.parse(u);E.sortFn&&(t=new Function(\"a\",\"b\",\"return (\"+E.sortFn+\")(a, b)\")),E.filterFn&&(F=new Function(\"node\",\"return (\"+E.filterFn+\")(node)\")),E.mapFn&&(d=new Function(\"node\",\"(\"+E.mapFn+\")(node)\"))}catch(E){console.error(\"Error parsing data functions:\",E)}return j(r,t,F,d)}catch(e){return console.error(\"Error building file trie:\",e),null}}var b=0;function N(u,e,D,n,r,t=\"\"){let F=document.getElementById(\"template-folder\"),d=document.getElementById(\"template-file\");if(!F||!d)return;let E=t?t+\"/\"+u.slugSegment:u.slugSegment,A=S(D);if(u.isFolder){let s=F.content.cloneNode(!0),a=s.querySelector(\".folder-container\"),p=s.querySelector(\".folder-button\"),m=s.querySelector(\".folder-title\"),l=s.querySelector(\".folder-outer\"),o=s.querySelector(\".content\");if(m&&(m.textContent=u.displayName||u.slugSegment),a&&(a.dataset.folderpath=u.slug),n===\"link\"&&p){let i=document.createElement(\"a\");i.className=p.className;let B=S(u.slug);i.href=v(B||\"\"),m?i.appendChild(m):i.textContent=u.displayName||u.slugSegment,p.replaceWith(i),p=i}let C=r[u.slug]!==void 0?r[u.slug]:!0,c=S(u.slug),f=c&&c===A.slice(0,c.length);if((!C||f)&&l&&l.classList.add(\"open\"),u.children&&u.children.length>0&&o)for(let i of u.children)N(i,o,D,n,r,E);e.appendChild(s)}else if(u.data){let s=d.content.cloneNode(!0),a=s.querySelector(\"a\");a&&(a.href=v(u.data.slug),a.textContent=u.displayName||u.slugSegment,u.data.slug===D&&a.classList.add(\"active\",\"is-active\")),e.appendChild(s)}}async function L(u){let e=++b;try{console.log(\"[Explorer] Nav event received, generation:\",e);let D=(u.detail?.url||\"\").replace(/^\\/+/,\"\"),n=document.querySelectorAll(\"div.explorer\");console.log(\"[Explorer] Found\",n.length,\"explorers\");let r={};try{JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\").forEach(F=>{r[F.path]=F.collapsed})}catch(t){console.error(\"[Explorer] Error loading saved state:\",t)}for(let t of n){let F=t.querySelector(\".explorer-ul\");if(!F){console.warn(\"[Explorer] No explorer-ul found\");continue}F.innerHTML='
  • ';let d=t.dataset.dataFns,E=t.dataset.behavior||\"collapse\";console.log(\"[Explorer] Starting tree build...\");let A=await R(d);if(e===b){if(console.log(\"[Explorer] Render generation is current, rendering tree\"),console.log(\"[Explorer] Trie result:\",A?\"success\":\"null\"),A&&A.children&&A.children.length>0){F.innerHTML='
  • ',console.log(\"[Explorer] Rendering\",A.children.length,\"children\");for(let o of A.children)N(o,F,D,E,r,\"\");console.log(\"[Explorer] Render complete, final list length:\",F.children.length)}else console.warn(\"[Explorer] No trie or empty children\");let l=sessionStorage.getItem(\"explorerScrollTop\");if(l)F.scrollTop=parseInt(l,10);else{let o=F.querySelector(\".active\");o&&o.scrollIntoView({behavior:\"smooth\"})}}else console.log(\"[Explorer] Stale render generation, skipping tree render\");let s=[],a=t.getElementsByClassName(\"explorer-toggle\");for(let l of a){let o=function(){let C=this.closest(\".explorer\");if(!C)return;let c=C.classList.toggle(\"collapsed\");C.setAttribute(\"aria-expanded\",c?\"false\":\"true\"),c?document.documentElement.classList.remove(\"mobile-no-scroll\"):document.documentElement.classList.add(\"mobile-no-scroll\")};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let p=t.getElementsByClassName(\"folder-icon\");for(let l of p){let o=function(C){C.stopPropagation();let c=this.parentElement;if(!c)return;let f=c.nextElementSibling;if(!f)return;f.classList.toggle(\"open\");let i=!f.classList.contains(\"open\"),B=c.dataset.folderpath,h=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),g=h.findIndex(x=>x.path===B);g>=0?h[g].collapsed=i:h.push({path:B,collapsed:i}),localStorage.setItem(\"fileTree\",JSON.stringify(h))};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}let m=t.getElementsByClassName(\"folder-button\");for(let l of m){let o=function(C){let c=this.closest(\".folder-container\");if(!c)return;let f=t.dataset.behavior||\"collapse\",i=c.nextElementSibling,B=c.dataset.folderpath;if(f!==\"link\"){if(C.stopPropagation(),!i)return;i.classList.toggle(\"open\");let h=!i.classList.contains(\"open\"),g=JSON.parse(localStorage.getItem(\"fileTree\")||\"[]\"),x=g.findIndex(w=>w.path===B);x>=0?g[x].collapsed=h:g.push({path:B,collapsed:h}),localStorage.setItem(\"fileTree\",JSON.stringify(g))}};l.addEventListener(\"click\",o),s.push(()=>l.removeEventListener(\"click\",o))}typeof window<\"u\"&&window.addCleanup&&window.addCleanup(()=>s.forEach(l=>l()))}for(let t of document.getElementsByClassName(\"explorer\")){let F=t.querySelector(\".mobile-explorer\");F&&(F.classList.remove(\"hide-until-loaded\"),F.checkVisibility&&F.checkVisibility()&&(t.classList.add(\"collapsed\"),t.setAttribute(\"aria-expanded\",\"false\"),document.documentElement.classList.remove(\"mobile-no-scroll\")))}}catch(D){console.error(\"[Explorer] Fatal error in nav handler:\",D)}}document.addEventListener(\"nav\",L);document.addEventListener(\"render\",L);document.addEventListener(\"prenav\",()=>{let u=document.querySelector(\".explorer-ul\");u&&sessionStorage.setItem(\"explorerScrollTop\",u.scrollTop.toString())});\n","import type {\n QuartzComponent,\n QuartzComponentConstructor,\n QuartzComponentProps,\n} from \"@quartz-community/types\";\nimport OverflowListFactory from \"./OverflowList\";\nimport { classNames } from \"../util/lang\";\nimport { i18n } from \"../i18n\";\nimport style from \"./styles/explorer.scss\";\n// @ts-expect-error - Inline script loaded as text by esbuild plugin\nimport script from \"./scripts/explorer.inline.ts\";\n\ninterface FileTrieNode {\n slugSegment?: string;\n slugSegments?: string[];\n displayName?: string;\n isFolder: boolean;\n data: Record | null;\n children: FileTrieNode[];\n}\n\nexport interface ExplorerOptions {\n title?: string;\n folderDefaultState: \"collapsed\" | \"open\";\n folderClickBehavior: \"collapse\" | \"link\";\n useSavedState: boolean;\n sortFn?: (a: FileTrieNode, b: FileTrieNode) => number;\n filterFn?: (node: FileTrieNode) => boolean;\n mapFn?: (node: FileTrieNode) => FileTrieNode;\n order?: Array<\"filter\" | \"map\" | \"sort\">;\n}\n\nconst defaultOptions: ExplorerOptions = {\n folderDefaultState: \"collapsed\",\n folderClickBehavior: \"link\",\n useSavedState: true,\n mapFn: (node: FileTrieNode) => {\n return node;\n },\n sortFn: (a: FileTrieNode, b: FileTrieNode) => {\n if ((!a.isFolder && !b.isFolder) || (a.isFolder && b.isFolder)) {\n return (a.displayName || \"\").localeCompare(b.displayName || \"\", undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n }\n\n if (!a.isFolder && b.isFolder) {\n return 1;\n }\n return -1;\n },\n filterFn: (node: FileTrieNode) => node.slugSegment !== \"tags\",\n order: [\"filter\", \"map\", \"sort\"],\n};\n\nlet numExplorers = 0;\n\nfunction concatenateResources(...resources: (string | undefined)[]): string {\n return resources.filter((r): r is string => !!r).join(\"\\n\");\n}\n\nexport default ((userOpts?: Partial) => {\n const opts: ExplorerOptions = { ...defaultOptions, ...userOpts };\n const { OverflowList, overflowListAfterDOMLoaded } = OverflowListFactory();\n\n const ExplorerComponent: QuartzComponent = (props: QuartzComponentProps) => {\n const { cfg } = props;\n const displayClass = (props as { displayClass?: \"mobile-only\" | \"desktop-only\" }).displayClass;\n const id = `explorer-${numExplorers++}`;\n const locale = cfg?.locale ?? \"en-US\";\n\n const title = opts.title ?? i18n(locale).components.explorer.title;\n\n return (\n \n \n \n \n \n \n \n \n \n

    {title}

    \n \n \n \n \n
    \n \n
    \n \n \n \n );\n };\n\n ExplorerComponent.css = style;\n ExplorerComponent.afterDOMLoaded = concatenateResources(script, overflowListAfterDOMLoaded);\n return ExplorerComponent;\n}) satisfies QuartzComponentConstructor;\n"]} \ No newline at end of file diff --git a/src/components/Explorer.tsx b/src/components/Explorer.tsx index 9f41a55..512e3fa 100644 --- a/src/components/Explorer.tsx +++ b/src/components/Explorer.tsx @@ -74,7 +74,7 @@ export default ((userOpts?: Partial) => { return (
    ) => {
    diff --git a/src/components/scripts/explorer.inline.ts b/src/components/scripts/explorer.inline.ts index fc9b03f..2e2c2a1 100644 --- a/src/components/scripts/explorer.inline.ts +++ b/src/components/scripts/explorer.inline.ts @@ -227,7 +227,7 @@ function renderTree(node, container, currentSlug, folderBehavior, savedState, pa link.href = resolveBasePath(node.data.slug); link.textContent = node.displayName || node.slugSegment; if (node.data.slug === currentSlug) { - link.classList.add("active"); + link.classList.add("active", "is-active"); } } container.appendChild(clone);