canofold 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,671 @@
1
+ import{a as Nt,b as At,c as Lt,d as Rt,e as Tt,f as Et}from"./chunk-EQOADO2H.js";import{a as G,b as B,c as vt,e as O,f as Pt,g as H,h as St,i as Mt,j as Dt,l as $t,m as be}from"./chunk-KJ7FG6AY.js";import{a as J,b as h,d as xt,e as Ct}from"./chunk-ENPRUF6E.js";import{a as wt,c as z,h as we,i as bt,l as kt}from"./chunk-ACUMTEQL.js";import{a as oe}from"./chunk-M6T5RSNJ.js";import{a as j}from"./chunk-2XMX5JW6.js";import{b as W}from"./chunk-EAYVCA3Z.js";import{a as Z,b as F,c as re,d as V,e as $,f as yt,h as R}from"./chunk-JK7ZNBUA.js";import{a as n}from"./chunk-AYDF3IFZ.js";import{randomUUID as Qn}from"crypto";import{mkdir as Zn,rename as Te,rm as ge,writeFile as es}from"fs/promises";import{basename as hr,dirname as ut,join as mt,relative as ts,resolve as os}from"path";import{mkdir as Oe,open as vr,rm as Pr,writeFile as $e}from"fs/promises";import{dirname as Sr,join as I,posix as Ft}from"path";import{analyzeMarkdown as Ot}from"@canofold/markdown/server/analyze";function It({description:e,body:t}){if(e.trim())return e.trim();let o=t.split(/\n\n+/).find(r=>{let a=r.trim();if(!a)return!1;let s=Ot(a);return s.text&&s.headings.length===0});return o?Ot(o.trim()).text:""}n(It,"createDeterministicSummary");var xr=1;function _t(e){return e.replace(/\r?\n/g," ").replace(/([\\[\]])/g,"\\$1")}n(_t,"markdownLinkLabel");function Bt(e,t){let o=`${t.routePath}index.md`;return{title:t.title,description:t.description,routePath:h(e,t.routePath),markdownPath:h(e,o),version:t.version,locale:t.locale,status:t.status,tags:Array.isArray(t.frontmatter.tags)?t.frontmatter.tags.filter(r=>typeof r=="string"):[],owner:typeof t.frontmatter.owner=="string"?t.frontmatter.owner:void 0,headings:t.headings,lastUpdated:t.lastUpdated,frontmatter:vt(t.frontmatter)}}n(Bt,"pageMetadata");async function ke(e,t){await Oe(Sr(e),{recursive:!0});let o=await vr(e,"w");try{for await(let r of t)await o.write(r)}finally{await o.close()}}n(ke,"writePieces");async function Ee(e,t,o){async function*r(){yield`{"${t}":[`;let a=!0;for(let s of o)yield`${a?"":","}
2
+ ${JSON.stringify(s,null,2)}`,a=!1;yield`${a?"":`
3
+ `}]}
4
+ `}n(r,"pieces"),await ke(e,r())}n(Ee,"writeJsonArray");function Cr(e,t){return t.pages.filter(o=>o.ai&&(e.ai.versions==="all"||o.version===t.currentVersion))}n(Cr,"selectedPages");function Mr(e){if(e==='"'||e==="\\")return 2;let t=e.codePointAt(0)??0;return t===8||t===9||t===10||t===12||t===13?2:t<32?6:Buffer.byteLength(e)}n(Mr,"jsonEscapedCharacterBytes");function Dr(e,t,o){let r=Buffer.byteLength(JSON.stringify({...e,part:999999999,parts:999999999,content:""})+`
5
+ `),a=o-r;if(a<1)throw new Error(`AI chunkSizeBytes ${o} is too small for page metadata`);let s=[],l=0,i=0,d=0;for(let p of t){let f=Mr(p);i>l&&d+f>a&&(s.push(t.slice(l,i)),l=i,d=0),i+=p.length,d+=f}s.push(t.slice(l,i));let c=s.map((p,f)=>({...e,part:f+1,parts:s.length,content:p}));for(let p of c)if(Buffer.byteLength(JSON.stringify(p)+`
6
+ `)>o)throw new Error(`Unable to keep AI content record within ${o} bytes: ${e.routePath}`);return c}n(Dr,"splitContentRecord");async function Nr(e,t,o,r,a){let s=Ft.join("ai","content",o,r),l=[],i="",d=0;async function c(){if(!i)return;let p=`${String(l.length+1).padStart(4,"0")}.jsonl`,f=Ft.join(s,p),u=Buffer.byteLength(i);await $e(I(e,f),i),l.push({path:h(t,`/${f}`),bytes:u,records:d,fingerprint:B(Buffer.from(i))}),i="",d=0}n(c,"flush"),await Oe(I(e,s),{recursive:!0});for(let p of a){let f=Bt(t,p),u={routePath:f.routePath,markdownPath:f.markdownPath,title:p.title,description:p.description,version:p.version,locale:p.locale};for(let b of Dr(u,p.body,t.ai.chunkSizeBytes)){let w=JSON.stringify(b)+`
7
+ `;i&&Buffer.byteLength(i)+Buffer.byteLength(w)>t.ai.chunkSizeBytes&&await c(),i+=w,d+=1}}return await c(),l}n(Nr,"writePartition");function Ar(e){let t=Buffer.byteLength(`
8
+
9
+ ---
10
+
11
+ `);return e.reduce((o,r,a)=>o+Buffer.byteLength(r.body)+(a?t:0),0)}n(Ar,"llmsFullBytes");async function Ut(e,t,o){let r=$(e,t.outputDir),a=I(r,"ai"),s=I(a,"content");await Oe(a,{recursive:!0}),await Pr(s,{recursive:!0,force:!0});let l=Cr(t,o),i=l.map(u=>Bt(t,u)),d=new Map;for(let u of l){let b=`${u.version}\0${u.locale}`,w=d.get(b)??[];w.push(u),d.set(b,w)}let c=[];for(let[u,b]of d){let[w="",P=""]=u.split("\0"),y=await Nr(r,t,w,P,b);c.push({version:w,locale:P,pages:b.length,sourceBytes:b.reduce((C,m)=>C+Buffer.byteLength(m.body),0),shards:y})}if(await Ee(I(a,"pages.json"),"pages",i),t.ai.pageSummaries&&await Ee(I(a,"summaries.json"),"summaries",l.map(u=>({routePath:h(t,u.routePath),summary:It({description:u.description,body:u.body})}))),t.ai.codeExamples){function*u(){for(let b of l)for(let w of b.codeExamples)yield{routePath:h(t,b.routePath),...w}}n(u,"examples"),await Ee(I(a,"code-examples.json"),"examples",u())}t.ai.markdownIndex&&await ke(I(a,"index.md"),i.map(u=>`- [${_t(u.title||u.routePath)}](${u.markdownPath})
12
+ `)),t.ai.llmsTxt&&await ke(I(r,"llms.txt"),i.map(u=>`- [${_t(u.title||u.routePath)}](${u.routePath})
13
+ `));let p=Ar(l),f="disabled";if(t.ai.llmsFullTxt)if(p<=t.ai.llmsFullMaxBytes){async function*u(){for(let[b,w]of l.entries())b&&(yield`
14
+
15
+ ---
16
+
17
+ `),yield w.body}n(u,"bodies"),await ke(I(r,"llms-full.txt"),u()),f="full"}else{if(t.ai.llmsFullOverflow==="error")throw new Error(`llms-full.txt requires ${p} bytes, exceeding ai.llmsFullMaxBytes ${t.ai.llmsFullMaxBytes}`);await $e(I(r,"llms-full.txt"),["# Canofold AI content manifest","",`The full Markdown corpus requires ${p} bytes and exceeds the configured single-file budget of ${t.ai.llmsFullMaxBytes} bytes.`,"",`Use ${h(t,"/ai/manifest.json")} to load the complete versioned and locale-partitioned content shards.`,""].join(`
18
+ `)),f="manifest",oe(`llms-full.txt exceeded ${t.ai.llmsFullMaxBytes} bytes; wrote a bounded manifest pointer instead`)}await $e(I(a,"manifest.json"),JSON.stringify({schemaVersion:xr,currentVersion:o.currentVersion,includedVersions:t.ai.versions,totals:{pages:l.length,sourceBytes:l.reduce((u,b)=>u+Buffer.byteLength(b.body),0)},budgets:{chunkSizeBytes:t.ai.chunkSizeBytes,llmsFullMaxBytes:t.ai.llmsFullMaxBytes},llmsFull:{enabled:t.ai.llmsFullTxt,mode:f,sourceBytes:p,path:t.ai.llmsFullTxt?h(t,"/llms-full.txt"):null},partitions:c},null,2))}n(Ut,"writeAiOutputs");import{cp as xn,mkdir as at,rm as nt,writeFile as Ae}from"fs/promises";import{dirname as Qo,join as X}from"path";import{renderToStaticMarkup as Cn}from"react-dom/server";import{createMarkdownRenderer as Mn}from"@canofold/markdown/server";import{detectMarkdownAssets as Zo}from"@canofold/markdown/server/analyze";import{createRequire as Lr}from"module";import{readFile as Ht}from"fs/promises";import{dirname as jt,join as zt}from"path";var Gt=Lr(import.meta.url);function Kt(e){return Gt.resolve(e)}n(Kt,"resolveFromModule");function Wt(e){try{return Gt.resolve(e,{paths:[process.cwd()]})}catch(t){throw new Error(`Cannot resolve ${e} from ${process.cwd()}. Install @canofold/plugins to include math styles.`,{cause:t})}}n(Wt,"resolveFromProject");async function Rr(){return Ht(new URL("./styles.input.css",import.meta.url),"utf8")}n(Rr,"readInputCss");function Vt(){return zt(jt(Wt("@canofold/plugins/math.css")),"fonts")}n(Vt,"mathFontsDir");function Jt(){return zt(jt(Kt("@canofold/markdown/base.css")),"file-icons")}n(Jt,"markdownFileIconsDir");async function Ie(e,t=!1){return Ht(t?Wt(e):Kt(e),"utf8")}n(Ie,"readPublishedCss");async function Tr({math:e=!1}={}){let[t,o,r,a]=await Promise.all([Rr(),Ie("@canofold/markdown/base.css"),Ie("@canofold/markdown/theme.css"),e?Ie("@canofold/plugins/math.css",!0):void 0]);return`/* Markdown base */
19
+ ${o}
20
+ /* Default theme */
21
+ ${r}
22
+ ${a?`/* Math */
23
+ ${a}
24
+ `:""}/* Canofold shell */
25
+ ${t}
26
+ `}n(Tr,"compileCss");var qt=new Map;function Xt(e={}){let t=e.math===!0,o=qt.get(t);return o||(o=Tr({math:t}),qt.set(t,o)),o}n(Xt,"buildCssCached");import{Bot as Er,Box as $r,Code2 as Or,FileCode2 as Ir,FileText as Fr,Gauge as _r,Globe2 as Br,Layers3 as Ur,Rocket as qr,Search as Hr,Sparkles as jr,SquareTerminal as zr}from"lucide-react";import{Fragment as Kr,jsx as L,jsxs as ae}from"react/jsx-runtime";var Gr={ai:Er,box:$r,code:Or,file:Fr,"file-code":Ir,gauge:_r,globe:Br,layers:Ur,rocket:qr,search:Hr,sparkles:jr,terminal:zr};function Yt({name:e,className:t}){if(!e)return null;let o=Gr[e];return L(o,{"aria-hidden":"true",className:t,strokeWidth:1.8})}n(Yt,"HomeIcon");function Qt({page:e,config:t}){let o=e.frontmatter.hero??{},r=e.frontmatter.features??[],a=o.actions??[];return ae(Kr,{children:[ae("section",{className:`cf-hero${o.image?" cf-hero-with-visual":""}`,children:[ae("div",{className:"cf-hero-copy",children:[L("h1",{className:"cf-hero-title",children:e.title}),o.accent?L("p",{className:"cf-hero-accent",children:o.accent}):null,o.tagline?L("p",{className:"cf-hero-tagline",children:o.tagline}):null,a.length>0?L("div",{className:"cf-hero-actions",children:a.map(s=>ae("a",{className:`cf-btn ${s.primary?"cf-btn-primary":"cf-btn-secondary"}`,href:h(t,s.link),children:[L(Yt,{name:s.icon}),s.text]},s.link))}):null]}),o.image?L("div",{className:"cf-hero-visual",children:L("img",{src:h(t,o.image),alt:o.imageAlt??"",decoding:"async",fetchPriority:"high"})}):null]}),r.length>0?L("section",{className:"cf-feature-section",children:L("div",{className:"cf-features",children:r.map((s,l)=>ae("article",{className:"cf-feature",children:[s.image||s.icon?L("div",{className:"cf-feature-icon",children:s.image?L("img",{src:h(t,s.image),alt:"",width:"32",height:"32",decoding:"async"}):L(Yt,{name:s.icon})}):null,L("h3",{children:s.title}),L("p",{children:s.details})]},`${s.title}-${l}`))})}):null]})}n(Qt,"HomeHero");import{ChevronDown as ra,Code2 as aa,Eye as na}from"lucide-react";var Wr={labels:{skipToContent:"\u8DF3\u5230\u6B63\u6587",search:"\u641C\u7D22\u6587\u6863",searchEmpty:"\u6CA1\u6709\u627E\u5230\u5339\u914D\u6587\u6863",searchUnavailable:"\u641C\u7D22\u7D22\u5F15\u6682\u65F6\u4E0D\u53EF\u7528",language:"\u8BED\u8A00",primaryNavigation:"\u4E3B\u5BFC\u822A",theme:"\u5207\u6362\u4E3B\u9898",openSidebar:"\u6253\u5F00\u4FA7\u8FB9\u680F",onThisPage:"\u672C\u9875\u76EE\u5F55",edit:"\u7F16\u8F91\u6B64\u9875",updated:"\u6700\u540E\u66F4\u65B0",previous:"\u4E0A\u4E00\u9875",next:"\u4E0B\u4E00\u9875",close:"\u5173\u95ED",source:"\u6E90\u6587\u6863",preview:"\u9884\u89C8\u6548\u679C",copySource:"\u590D\u5236\u6E90\u6587\u6863",sourceCopied:"\u6E90\u6587\u6863\u5DF2\u590D\u5236",quickActions:"\u5FEB\u6377\u5165\u53E3",github:"GitHub \u4ED3\u5E93",docsNavigation:"\u6587\u6863\u5BFC\u822A",pageNavigation:"\u9875\u9762\u5BFC\u822A",advertisement:"\u63A8\u5E7F",version:"\u6587\u6863\u7248\u672C"},brandTagline:"\u9762\u5411 AI \u7684 React/MDX \u6587\u6863",markdownElementGroups:[{id:"headings",label:"\u6807\u9898\u4E0E\u6B63\u6587",detail:"H1-H6 \xB7 p \xB7 hr",hash:"\u6807\u9898\u4E0E\u6B63\u6587"},{id:"inline",label:"\u884C\u5185\u8BED\u4E49",detail:"a \xB7 strong \xB7 code",hash:"\u884C\u5185\u8BED\u4E49"},{id:"lists",label:"\u5217\u8868\u4E0E\u4EFB\u52A1",detail:"ul \xB7 ol \xB7 task",hash:"\u5217\u8868\u4E0E\u4EFB\u52A1"},{id:"callouts",label:"\u5F15\u7528\u4E0E\u63D0\u793A",detail:"quote \xB7 callout",hash:"\u5F15\u7528\u4E0E\u63D0\u793A"},{id:"code",label:"\u4EE3\u7801\u4E0E\u7EC8\u7AEF",detail:"Shiki \xB7 pre \xB7 diff",hash:"\u4EE3\u7801\u4E0E\u7EC8\u7AEF"},{id:"tables",label:"\u8868\u683C\u4E0E\u6570\u636E",detail:"table \xB7 CSV \xB7 sort",hash:"\u8868\u683C\u4E0E\u6570\u636E"},{id:"media",label:"\u5A92\u4F53\u4E0E\u5D4C\u5165",detail:"img \xB7 video \xB7 iframe",hash:"\u5A92\u4F53\u4E0E\u5D4C\u5165"},{id:"diagrams",label:"\u56FE\u8868\u4E0E\u6570\u5B66",detail:"Mermaid \xB7 PlantUML \xB7 KaTeX",hash:"\u56FE\u8868\u4E0E\u6570\u5B66"},{id:"disclosure",label:"\u6298\u53E0\u4E0E\u811A\u6CE8",detail:"details \xB7 footnotes",hash:"\u6298\u53E0\u4E0E\u811A\u6CE8"},{id:"extensions",label:"\u6269\u5C55\u5185\u5BB9\u7EC4\u4EF6",detail:"tabs \xB7 steps \xB7 cards \xB7 tree",hash:"\u6269\u5C55\u5185\u5BB9\u7EC4\u4EF6"},{id:"api",label:"API \u4E0E\u4FA7\u6CE8",detail:"API \xB7 aside",hash:"api-\u4E0E\u4FA7\u6CE8"},{id:"metadata",label:"\u6587\u6863\u5143\u4FE1\u606F",detail:"meta \xB7 breadcrumb \xB7 pagination",hash:"\u6587\u6863\u5143\u4FE1\u606F"}],quickActions:{headingsTitle:"\u6807\u9898 H1-H6",headingsDescription:"\u67E5\u770B\u5B8C\u6574\u6807\u9898\u5C42\u7EA7\u4E0E\u6B63\u6587\u8282\u594F",codeTitle:"\u4EE3\u7801\u4E0E\u8BED\u6CD5\u9AD8\u4EAE",codeDescription:"Shiki \u9AD8\u4EAE\u3001diff \u884C\u72B6\u6001\u4E0E\u590D\u5236",tableTitle:"\u8868\u683C\u4E0E\u6570\u636E\u64CD\u4F5C",tableDescription:"\u6392\u5E8F\u3001\u590D\u5236 CSV \u4E0E\u653E\u5927\u9884\u89C8",diagramTitle:"Mermaid\u3001PlantUML \u4E0E\u6570\u5B66\u516C\u5F0F",diagramDescription:"\u56FE\u8868\u9884\u89C8\u3001\u6E90\u7801\u4E0E\u7F29\u653E",sourceDescription:"\u6253\u5F00\u5F53\u524D\u9875\u9762\u7684 Markdown \u539F\u6587",themeDescription:"\u5728\u6D45\u8272\u4E0E\u6DF1\u8272\u9605\u8BFB\u6A21\u5F0F\u95F4\u5207\u6362"}},Vr={labels:{skipToContent:"Skip to content",search:"Search docs",searchEmpty:"No matching documents",searchUnavailable:"Search index is unavailable",language:"Language",primaryNavigation:"Primary navigation",theme:"Toggle theme",openSidebar:"Open sidebar",onThisPage:"On this page",edit:"Edit this page",updated:"Last updated",previous:"Previous",next:"Next",close:"Close",source:"Source",preview:"Preview",copySource:"Copy source",sourceCopied:"Markdown source copied",quickActions:"Quick actions",github:"GitHub repository",docsNavigation:"Docs navigation",pageNavigation:"Page navigation",advertisement:"Advertisement",version:"Documentation version"},brandTagline:"AI-friendly React/MDX documentation",markdownElementGroups:[{id:"headings",label:"Headings & prose",detail:"H1-H6 \xB7 p \xB7 hr",hash:"headings-and-prose"},{id:"inline",label:"Inline semantics",detail:"a \xB7 strong \xB7 code",hash:"inline-semantics"},{id:"lists",label:"Lists & tasks",detail:"ul \xB7 ol \xB7 task",hash:"lists-and-tasks"},{id:"callouts",label:"Quotes & callouts",detail:"quote \xB7 callout",hash:"quotes-and-callouts"},{id:"code",label:"Code & terminal",detail:"Shiki \xB7 pre \xB7 diff",hash:"code-and-terminal"},{id:"tables",label:"Tables & data",detail:"table \xB7 CSV \xB7 sort",hash:"tables-and-data"},{id:"media",label:"Media & embeds",detail:"img \xB7 video \xB7 iframe",hash:"media-and-embeds"},{id:"diagrams",label:"Diagrams & math",detail:"Mermaid \xB7 PlantUML \xB7 KaTeX",hash:"diagrams-and-math"},{id:"disclosure",label:"Disclosure & notes",detail:"details \xB7 footnotes",hash:"disclosure-and-notes"},{id:"extensions",label:"Extended components",detail:"tabs \xB7 steps \xB7 cards \xB7 tree",hash:"extended-content-components"},{id:"api",label:"API & sidenote",detail:"API \xB7 aside",hash:"api-and-sidenote"},{id:"metadata",label:"Document metadata",detail:"meta \xB7 breadcrumb \xB7 pagination",hash:"document-metadata"}],quickActions:{headingsTitle:"Headings H1-H6",headingsDescription:"Inspect the complete heading scale and prose rhythm",codeTitle:"Code and syntax highlighting",codeDescription:"Shiki highlighting, diff line states, and copy",tableTitle:"Tables and data actions",tableDescription:"Sort, copy CSV, and zoom",diagramTitle:"Mermaid, PlantUML, and math",diagramDescription:"Diagram preview, source, and scale",sourceDescription:"Open the current page Markdown source",themeDescription:"Switch between light and dark reading modes"}},Jr={copyCode:"\u590D\u5236\u4EE3\u7801",copyFailed:"\u590D\u5236\u5931\u8D25",copySnippet:"\u590D\u5236\u7247\u6BB5",copyTerminal:"\u590D\u5236\u7EC8\u7AEF\u8F93\u51FA",terminalTitle:"\u7EC8\u7AEF",tabsTitle:"\u9009\u9879\u5361",tabItem:"\u9009\u9879 {index}",codeGroupTitle:"\u4EE3\u7801\u7EC4",codeGroupItem:"\u4EE3\u7801 {index}",taskCompleted:"\u5DF2\u5B8C\u6210\u4EFB\u52A1",taskIncomplete:"\u672A\u5B8C\u6210\u4EFB\u52A1",copySectionLink:"\u590D\u5236\u7AE0\u8282\u94FE\u63A5",tableTitle:"\u8868\u683C",copyTableCsv:"\u590D\u5236\u4E3A CSV",downloadTableCsv:"\u4E0B\u8F7D CSV",zoomTable:"\u653E\u5927\u8868\u683C",closeTablePreview:"\u5173\u95ED\u8868\u683C\u9884\u89C8",sortTableColumn:"\u6309\u7B2C {column} \u5217\u6392\u5E8F",zoomImage:"\u653E\u5927\u56FE\u7247",closeImagePreview:"\u5173\u95ED\u56FE\u7247\u9884\u89C8",imageGallery:"\u56FE\u7247\u753B\u5ECA",closeImageGallery:"\u5173\u95ED\u56FE\u7247\u753B\u5ECA",previousGalleryImage:"\u4E0A\u4E00\u5F20\u56FE\u7247",nextGalleryImage:"\u4E0B\u4E00\u5F20\u56FE\u7247",galleryThumbnails:"\u56FE\u7247\u753B\u5ECA\u7F29\u7565\u56FE",galleryImage:"\u56FE\u7247"},Zt={zh:{title:"\u9875\u9762\u672A\u627E\u5230",description:"\u8BE5\u9875\u9762\u4E0D\u5B58\u5728\u3001\u5DF2\u88AB\u79FB\u52A8\u6216\u5730\u5740\u6709\u8BEF\u3002",home:"\u8FD4\u56DE\u9996\u9875 \u2192"},en:{title:"Page not found",description:"The page you're looking for doesn't exist or has been moved.",home:"Go back home \u2192"}};function ve(e){return e.toLowerCase().split("-")[0]??e.toLowerCase()}n(ve,"languageCode");function eo(e,t){if(!e)return;let o=t.toLowerCase();return Object.entries(e).find(([r])=>r.toLowerCase()===o)?.[1]}n(eo,"localizedValue");function Fe(e,t){return eo(t,e)}n(Fe,"localeMessagesFor");function to(e,t){let o=ve(e)==="zh"?Wr:Vr,r=Fe(e,t);return{labels:{...o.labels,...r?.labels},brandTagline:r?.brandTagline??o.brandTagline,markdownElementGroups:o.markdownElementGroups.map(a=>({...a,...r?.markdownElementGroups?.[a.id]})),quickActions:{...o.quickActions,...r?.quickActions}}}n(to,"layoutContentFor");function Pe(e,t){let o=Fe(e,t)?.markdown,r=ve(e)==="zh"?Jr:void 0;if(!(!r&&!o))return{...r,...o}}n(Pe,"markdownLabelsFor");function _e(e,t){return{...ve(e)==="zh"?Zt.zh:Zt.en,...Fe(e,t)?.notFound}}n(_e,"notFoundContentFor");function oo(e,t){let o=eo(t,e);if(o)return o;let r=ve(e);if(r==="zh")return"\u7B80\u4F53\u4E2D\u6587";if(r==="en")return"English";try{return new Intl.DisplayNames([e],{type:"language"}).of(e)??e}catch{return e}}n(oo,"localeNameFor");import{ChevronDown as ro,Languages as Xr,Moon as Yr,PanelLeft as Qr,Search as Zr,Sun as ea}from"lucide-react";import{Fragment as no,jsx as g,jsxs as D}from"react/jsx-runtime";function ta(){return D("svg",{className:"cf-brand-mark",width:"32",height:"32",viewBox:"0 0 512 512","aria-hidden":"true",children:[D("defs",{children:[D("linearGradient",{id:"cf-brand-top",x1:"90",y1:"60",x2:"400",y2:"260",gradientUnits:"userSpaceOnUse",children:[g("stop",{offset:"0",stopColor:"#1768FF"}),g("stop",{offset:"0.5",stopColor:"#119BFA"}),g("stop",{offset:"1",stopColor:"#18D8D3"})]}),D("linearGradient",{id:"cf-brand-fold",x1:"70",y1:"220",x2:"210",y2:"300",gradientUnits:"userSpaceOnUse",children:[g("stop",{offset:"0",stopColor:"#2C7BFF"}),g("stop",{offset:"1",stopColor:"#554FF5"})]}),D("linearGradient",{id:"cf-brand-bottom",x1:"200",y1:"270",x2:"90",y2:"460",gradientUnits:"userSpaceOnUse",children:[g("stop",{offset:"0",stopColor:"#554FF5"}),g("stop",{offset:"0.62",stopColor:"#7845FA"}),g("stop",{offset:"1",stopColor:"#8637F5"})]}),D("mask",{id:"cf-brand-spark-cut",maskUnits:"userSpaceOnUse",x:"0",y:"0",width:"512",height:"512",children:[g("rect",{width:"512",height:"512",fill:"#fff"}),g("path",{d:"M112 201C117 229 139 251 167 256C139 261 117 283 112 311C107 283 85 261 57 256C85 251 107 229 112 201Z",fill:"#000"})]})]}),D("g",{mask:"url(#cf-brand-spark-cut)",fill:"none",strokeLinejoin:"round",children:[g("path",{d:"M348 138A150 150 0 0 0 107 243",stroke:"url(#cf-brand-top)",strokeWidth:"86",strokeLinecap:"round"}),g("path",{d:"M78 256C118 228 158 228 208 256",stroke:"url(#cf-brand-fold)",strokeWidth:"70",strokeLinecap:"round"}),g("path",{d:"M107 269A150 150 0 0 0 348 374",stroke:"url(#cf-brand-bottom)",strokeWidth:"86",strokeLinecap:"round"})]})]})}n(ta,"BrandMark");function Be({size:e=16}){return g(Zr,{size:e,strokeWidth:2,"aria-hidden":"true"})}n(Be,"SearchIcon");function oa(){return D(no,{children:[g(ea,{className:"cf-icon-sun",size:18,strokeWidth:2,"aria-hidden":"true"}),g(Yr,{className:"cf-icon-moon",size:18,strokeWidth:2,"aria-hidden":"true"})]})}n(oa,"ThemeIcon");function Ue(e,t){let o=t.split("/").filter(Boolean);return t.startsWith("/")&&(e.page.routePath===t||e.page.routePath.startsWith(t)||e.page.group!==""&&o.includes(e.page.group))}n(Ue,"navItemIsActive");function ao({model:e}){let{config:t,page:o,home:r,labels:a,localeRoot:s,navItems:l,versionLabel:i,versionOptions:d,languageOptions:c,hasSidebarItems:p}=e;return D("header",{className:r?"cf-header cf-header-home":"cf-header",children:[D("div",{className:"cf-header-inner",children:[!r&&p?g("button",{className:"cf-sidebar-toggle",type:"button","data-canofold-sidebar-open":"","data-canofold-sidebar-open-label":a.openSidebar,"data-canofold-sidebar-close-label":a.close,"aria-label":a.openSidebar,"aria-expanded":"false",children:g(Qr,{size:18,strokeWidth:2,"aria-hidden":"true"})}):null,g("a",{className:"cf-brand",href:s,"aria-label":t.title,children:t.theme.logo?D(no,{children:[g("img",{className:t.theme.logoDark?"cf-brand-logo cf-brand-logo-light":"cf-brand-logo",src:h(t,t.theme.logo),alt:t.title}),t.theme.logoDark?g("img",{className:"cf-brand-logo cf-brand-logo-dark",src:h(t,t.theme.logoDark),alt:t.title}):null]}):g(ta,{})}),t.search.enabled?D("button",{className:"cf-search-trigger",type:"button","data-canofold-search-open":"","aria-haspopup":"dialog","aria-label":a.search,children:[g(Be,{size:15}),g("span",{children:a.search}),g("kbd",{className:"cf-kbd",children:"\u2318K"})]}):null,D("div",{className:"cf-header-right",children:[l.length>0?g("nav",{className:"cf-header-nav","aria-label":a.primaryNavigation,children:l.map(f=>{let u=Ue(e,f.routePath),b=/^https?:\/\//.test(f.routePath);return g("a",{className:u?"cf-header-link cf-header-link-active":"cf-header-link",href:h(t,f.routePath),"aria-current":u?"page":void 0,...b?{target:"_blank",rel:"noreferrer"}:{},children:f.title},f.routePath)})}):null,d.length>1?D("details",{className:"cf-menu cf-version-menu","data-canofold-menu":"",children:[D("summary",{className:"cf-version-badge","aria-label":a.version,children:[g("span",{children:i}),g(ro,{size:13,strokeWidth:2,"aria-hidden":"true"})]}),g("div",{className:"cf-menu-list",children:d.map(f=>g("a",{className:f.id===o.version?"cf-menu-item cf-menu-item-active":"cf-menu-item",href:h(t,f.routePath),children:g("span",{children:f.label})},f.id))})]}):g("span",{className:"cf-version-badge",children:i}),c.length>1?D("details",{className:"cf-menu cf-lang","data-canofold-menu":"",children:[D("summary",{className:"cf-icon-button cf-lang-trigger","aria-label":a.language,children:[g(Xr,{size:19,strokeWidth:1.9,"aria-hidden":"true"}),g(ro,{size:13,strokeWidth:2,"aria-hidden":"true"})]}),g("div",{className:"cf-menu-list cf-language-menu-list",children:c.map(f=>g("a",{className:f.locale===o.locale?"cf-menu-item cf-language-menu-item cf-menu-item-active":"cf-menu-item cf-language-menu-item",href:h(t,f.routePath),lang:f.locale,"aria-current":f.locale===o.locale?"page":void 0,children:oo(f.locale,t.i18n.localeNames)},f.locale))})]}):null,t.theme.darkMode?g("button",{className:"cf-icon-button",type:"button","data-canofold-theme-toggle":"","aria-label":a.theme,children:g(oa,{})}):null,t.github?g("a",{className:"cf-icon-button cf-github-link",href:t.github,target:"_blank",rel:"noreferrer","aria-label":a.github,children:g("svg",{width:"18",height:"18",viewBox:"0 0 24 24",fill:"currentColor","aria-hidden":"true",children:g("path",{d:"M12 2C6.48 2 2 6.58 2 12.25c0 4.53 2.87 8.37 6.84 9.73.5.1.68-.22.68-.49 0-.24-.01-.87-.01-1.71-2.78.62-3.37-1.37-3.37-1.37-.45-1.18-1.11-1.5-1.11-1.5-.91-.64.07-.62.07-.62 1 .07 1.53 1.06 1.53 1.06.89 1.56 2.34 1.11 2.91.85.09-.66.35-1.11.63-1.37-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.3.1-2.71 0 0 .84-.27 2.75 1.05a9.36 9.36 0 0 1 5 0c1.91-1.32 2.75-1.05 2.75-1.05.55 1.41.2 2.45.1 2.71.64.72 1.03 1.63 1.03 2.75 0 3.94-2.34 4.81-4.57 5.06.36.32.68.94.68 1.9 0 1.37-.01 2.47-.01 2.81 0 .27.18.6.69.49A10.26 10.26 0 0 0 22 12.25C22 6.58 17.52 2 12 2z"})})}):null]})]}),r?null:g("div",{className:"cf-route-progress","aria-hidden":"true",children:g("span",{"data-canofold-progress":""})})]})}n(ao,"LayoutHeader");import{jsx as k,jsxs as N}from"react/jsx-runtime";function io(e,t){return e.type==="link"?e.routePath===t:e.items.some(o=>io(o,t))}n(io,"sidebarContainsRoute");function so(e){return{"--cf-sidebar-indent":`${Math.min(e,4)*10}px`}}n(so,"sidebarDepthStyle");function lo({item:e,model:t,depth:o=0}){let r={"data-depth":o,style:so(o)};if(e.type==="link"){let s=e.routePath===t.page.routePath;return k("a",{...r,className:s?"cf-sidebar-link cf-sidebar-link-active":"cf-sidebar-link",href:h(t.config,e.routePath),"aria-current":s?"page":void 0,"data-canofold-sidebar-link":"",children:e.title})}let a=io(e,t.page.routePath);return N("details",{className:"cf-sidebar-subgroup",open:a||!e.collapsed,"data-depth":o,children:[N("summary",{className:"cf-sidebar-subgroup-title",style:so(o),children:[e.title,k(ra,{className:"cf-chevron",size:12,strokeWidth:2.5,"aria-hidden":"true"})]}),k("div",{className:"cf-sidebar-subgroup-items",children:e.items.map((s,l)=>k(lo,{item:s,model:t,depth:o+1},s.type==="link"?s.routePath:s.segment||l))})]})}n(lo,"SidebarEntry");function co({model:e}){let{config:t,labels:o,navItems:r,sidebarGroups:a}=e,s=[e.page.version,e.page.locale,e.page.group].join(":");return N("aside",{className:"cf-sidebar","data-canofold-sidebar":"","data-canofold-sidebar-key":s,children:[r.length>0?k("nav",{className:"cf-sidebar-primary-nav","aria-label":o.primaryNavigation,children:r.map(l=>{let i=Ue(e,l.routePath),d=/^https?:\/\//.test(l.routePath);return k("a",{className:i?"cf-sidebar-primary-link cf-sidebar-primary-link-active":"cf-sidebar-primary-link",href:h(t,l.routePath),"aria-current":i?"page":void 0,"data-canofold-sidebar-link":"",...d?{target:"_blank",rel:"noreferrer"}:{},children:l.title},l.routePath)})}):null,k("nav",{className:"cf-sidebar-nav","aria-label":o.docsNavigation,children:a.map((l,i)=>k("div",{className:"cf-sidebar-items cf-sidebar-root",children:l.items.map((d,c)=>k(lo,{item:d,model:e,depth:0},d.type==="link"?d.routePath:d.segment||c))},l.segment||i))})]})}n(co,"Sidebar");function sa({model:e}){let{editHref:t,labels:o,page:r}=e,a=new Intl.DateTimeFormat(r.locale,{dateStyle:"medium"}).format(new Date(r.lastUpdated));return N("footer",{className:"cf-page-footer",children:[N("div",{className:"cf-page-meta",children:[N("div",{className:"cf-page-meta-actions",children:[t?k("a",{href:t,children:o.edit}):null,k("button",{className:"cf-page-source",type:"button","data-canofold-source-open":"","aria-haspopup":"dialog",children:o.source})]}),N("span",{children:[o.updated," ",a]})]}),N("nav",{className:"cf-doc-pagination","aria-label":o.pageNavigation,children:[r.previous?N("a",{className:"cf-doc-pagination-link",href:h(e.config,r.previous.routePath),children:[k("span",{className:"cf-doc-pagination-label",children:o.previous}),k("strong",{className:"cf-doc-pagination-title",children:r.previous.title})]}):k("span",{}),r.next?N("a",{className:"cf-doc-pagination-link cf-doc-pagination-link-next",href:h(e.config,r.next.routePath),children:[k("span",{className:"cf-doc-pagination-label",children:o.next}),k("strong",{className:"cf-doc-pagination-title",children:r.next.title})]}):null]})]})}n(sa,"PageFooter");function ia({model:e}){let{config:t,labels:o,outlineHeadings:r}=e,a=t.advertising;return N("aside",{className:"cf-outline","data-canofold-outline":"","aria-label":o.onThisPage,children:[r.length>0?k("nav",{className:"cf-outline-nav",children:r.map(s=>k("a",{className:`cf-outline-link cf-outline-link-${s.level}`,"data-canofold-outline-link":"",href:`#${s.slug}`,children:s.text},s.slug))}):null,a?N("a",{className:"cf-outline-ad",href:h(t,a.href),target:"_blank",rel:"sponsored noopener noreferrer","aria-label":a.alt,children:[k("span",{children:a.label??o.advertisement}),k("img",{src:h(t,a.image),alt:a.alt,loading:"lazy"})]}):null]})}n(ia,"Outline");function la({model:e,children:t}){let{config:o,labels:r,page:a}=e,s=a.body.trim(),l={...Pe(a.locale,o.i18n.messages),...o.markdown.labels};return N("div",{className:"cf-shell cf-shell-playground",children:[k("div",{className:"cf-sidebar-backdrop","data-canofold-sidebar-backdrop":"","aria-hidden":"true",hidden:!0}),k(co,{model:e}),k("main",{id:"canofold-main",className:"cf-main cf-playground-main",tabIndex:-1,"data-pagefind-body":a.search?"":void 0,children:N("div",{className:"cf-playground","data-canofold-playground":"","data-canofold-playground-labels":JSON.stringify(l),"data-canofold-playground-preview-label":r.preview,"data-view":"preview",children:[N("button",{className:"cf-playground-toggle",type:"button","data-canofold-playground-toggle":"","data-source-label":r.source,"data-preview-label":r.preview,"aria-label":r.source,title:r.source,children:[k(aa,{className:"cf-playground-toggle-source",size:18,strokeWidth:2,"aria-hidden":"true"}),k(na,{className:"cf-playground-toggle-preview",size:18,strokeWidth:2,"aria-hidden":"true"})]}),k("section",{className:"cf-playground-pane cf-playground-source","aria-label":r.source,"data-pagefind-ignore":"",children:k("textarea",{defaultValue:s,"aria-label":r.source,autoCapitalize:"off",autoComplete:"off",autoCorrect:"off",spellCheck:!1,"data-canofold-playground-source":""})}),k("div",{className:"cf-playground-resizer",role:"separator","aria-label":`${r.source} / ${r.preview}`,"aria-orientation":"vertical","aria-valuemin":25,"aria-valuemax":75,"aria-valuenow":45,tabIndex:0,"data-canofold-playground-resizer":""}),k("section",{className:"cf-playground-pane cf-playground-preview","aria-label":r.preview,children:k("div",{className:"cf-playground-preview-scroll","data-canofold-playground-preview":"",children:t})})]})})]})}n(la,"Playground");function uo({model:e,children:t}){return e.page.frontmatter.layout==="playground"?k(la,{model:e,children:t}):N("div",{className:"cf-shell",children:[k("div",{className:"cf-sidebar-backdrop","data-canofold-sidebar-backdrop":"","aria-hidden":"true",hidden:!0}),k(co,{model:e}),N("main",{id:"canofold-main",className:"cf-main",tabIndex:-1,"data-pagefind-body":e.page.search?"":void 0,children:[t,k(sa,{model:e})]}),k(ia,{model:e})]})}n(uo,"LayoutDocument");function Se(e){return wt(e.relativePath,e.locale)}n(Se,"subPath");function ne(e,t){let o=e.find(r=>r.id===t);if(!o)throw new Error(`Missing Markdown element group: ${t}`);return o.hash}n(ne,"markdownGroupHash");function mo({config:e,graph:t,page:o,home:r,assets:a,rawSource:s}){let l=t.pages.filter(m=>m.version===o.version&&Se(m)===Se(o)),i=t.locales.map(m=>{let x=l.find(M=>M.locale===m);return{locale:m,routePath:x?.routePath??z(m,t.defaultLocale,o.versionBase)}}),d=t.versions.map(m=>{let x=t.pages.find(M=>M.version===m.id&&M.locale===o.locale&&Se(M)===Se(o));return{id:m.id,label:m.label,routePath:x?.routePath??z(o.locale,t.defaultLocale,m.base)}}),c=t.sidebar[o.version]?.[o.locale]??[],p=to(o.locale,e.i18n.messages),f=z(o.locale,t.defaultLocale,o.versionBase),u=`${f}markdown/playground/`,b=t.pages.some(m=>m.locale===o.locale&&m.routePath===u),w=n(m=>m.type==="link"?m.routePath===o.routePath:m.items.some(w),"isActiveItem"),P=n(m=>m.items.some(w),"isActiveGroup"),y=c.filter(m=>m.title===""||m.segment===o.group||P(m)),C=typeof o.frontmatter.seoTitle=="string"?o.frontmatter.seoTitle.trim():"";return{config:e,page:o,home:r,assets:a,title:C||(o.title&&o.title!==e.title?`${o.title} | ${e.title}`:e.title),description:o.description||e.description,...e.editUrl&&o.version===t.currentVersion?{editHref:`${e.editUrl.replace(/\/$/,"")}/${o.relativePath}`}:{},alternatePages:l,languageOptions:i,versionOptions:d,navItems:t.nav[o.version]?.[o.locale]??[],content:p,labels:p.labels,brandTagline:e.i18n.messages?.[o.locale]?.brandTagline||e.description||p.brandTagline,versionLabel:t.versions.length===1&&o.version==="current"?`v${j}`:t.versions.find(m=>m.id===o.version)?.label??o.version,localeRoot:h(e,f),markdownShowcaseHref:h(e,u),hasMarkdownShowcase:b,sidebarGroups:y,hasSidebarItems:y.some(m=>m.items.length>0),outlineHeadings:o.headings.filter(m=>m.level>=1&&m.level<=6),searchProvider:xt(e.search.provider),searchIndexUrl:o.version===t.currentVersion?h(e,`/search/${o.locale}.json`):h(e,`/search/${o.version}/${o.locale}.json`),searchBundleUrl:h(e,"/pagefind/pagefind.js"),markdownClientScript:`window.__canofoldEnhanceMarkdown = async (target) => {
27
+ const pageRoot = document.querySelector('[data-canofold-page-root]')
28
+ if (!pageRoot) return () => {}
29
+ const root = target || pageRoot
30
+ const behaviors = JSON.parse(pageRoot.getAttribute('data-markdown-behaviors') || '[]')
31
+ const pluginClients = JSON.parse(pageRoot.getAttribute('data-markdown-plugin-clients') || '[]')
32
+ const disposers = []
33
+ try {
34
+ if (behaviors.length) {
35
+ const clientUrl = pageRoot.getAttribute('data-markdown-client-url')
36
+ if (clientUrl) {
37
+ const { enhanceMarkdown } = await import(clientUrl)
38
+ const enhancement = enhanceMarkdown(root, { behaviors })
39
+ disposers.push(() => enhancement.dispose())
40
+ await enhancement.ready
41
+ }
42
+ }
43
+ for (const pluginUrl of pluginClients) {
44
+ const plugin = await import(pluginUrl)
45
+ const enhancement = await plugin.enhance?.(root)
46
+ if (typeof enhancement === 'function') disposers.push(enhancement)
47
+ else if (enhancement?.dispose) disposers.push(() => enhancement.dispose())
48
+ await enhancement?.ready
49
+ }
50
+ return () => disposers.reverse().forEach((dispose) => dispose())
51
+ } catch (error) {
52
+ disposers.reverse().forEach((dispose) => dispose())
53
+ throw error
54
+ }
55
+ }
56
+ const bootstrapMarkdown = async () => {
57
+ window.__canofoldMarkdownDispose?.()
58
+ const generation = (window.__canofoldMarkdownGeneration || 0) + 1
59
+ window.__canofoldMarkdownGeneration = generation
60
+ const root = document.querySelector('[data-canofold-page-root]')
61
+ if (!root) return
62
+ const dispose = await window.__canofoldEnhanceMarkdown(root)
63
+ if (window.__canofoldMarkdownGeneration !== generation || !root.isConnected) {
64
+ dispose()
65
+ return
66
+ }
67
+ window.__canofoldMarkdownDispose = () => {
68
+ window.__canofoldMarkdownGeneration += 1
69
+ dispose()
70
+ }
71
+ }
72
+ window.__canofoldBootstrapMarkdown = () => {
73
+ const ready = bootstrapMarkdown()
74
+ window.__canofoldMarkdownReady = ready
75
+ return ready
76
+ }
77
+ window.__canofoldBootstrapMarkdown()`,rawSource:s}}n(mo,"createLayoutModel");import{Braces as ca,Clipboard as da,ExternalLink as ua,Heading2 as ma,SunMoon as pa,Table2 as fa,Workflow as ha,X as ga}from"lucide-react";import{Fragment as qe,jsx as v,jsxs as T}from"react/jsx-runtime";function ee({href:e,action:t,icon:o,title:r,description:a}){let s=T(qe,{children:[v("span",{className:"cf-command-glyph","aria-hidden":"true",children:o}),T("span",{children:[v("strong",{children:r}),v("small",{children:a})]})]});return e?v("a",{className:"cf-command-item",href:e,children:s}):v("button",{className:"cf-command-item",type:"button","data-canofold-search-action":t,children:s})}n(ee,"QuickAction");function ya({model:e}){let{config:t,page:o,home:r,labels:a,content:s,markdownShowcaseHref:l,hasMarkdownShowcase:i}=e,d=s.markdownElementGroups,c=s.quickActions;return t.search.enabled?T("div",{className:"cf-search-modal","data-canofold-search":"","data-locale":o.locale,"data-version":o.version,"data-search-provider":e.searchProvider,"data-search-index-url":e.searchIndexUrl,"data-search-bundle-url":e.searchBundleUrl,"data-empty-label":a.searchEmpty,"data-error-label":a.searchUnavailable,hidden:!0,children:[v("div",{className:"cf-search-backdrop","data-canofold-search-close":"","aria-hidden":"true"}),T("div",{className:"cf-search-panel",role:"dialog","aria-modal":"true","aria-label":a.search,tabIndex:-1,children:[T("div",{className:"cf-search-field",children:[v(Be,{}),v("input",{className:"cf-search-input",type:"search",placeholder:`${a.search}...`,"aria-label":a.search}),v("button",{className:"cf-search-close",type:"button","data-canofold-search-close":"","aria-label":a.close,children:"Esc"})]}),T("div",{className:"cf-search-body",children:[T("div",{className:"cf-search-default","data-canofold-search-default":"",children:[v("p",{className:"cf-search-section-label",children:a.quickActions}),i?T(qe,{children:[v(ee,{href:`${l}#${ne(d,"headings")}`,icon:v(ma,{size:17,strokeWidth:2}),title:c.headingsTitle,description:c.headingsDescription}),v(ee,{href:`${l}#${ne(d,"code")}`,icon:v(ca,{size:17,strokeWidth:2}),title:c.codeTitle,description:c.codeDescription}),v(ee,{href:`${l}#${ne(d,"tables")}`,icon:v(fa,{size:17,strokeWidth:2}),title:c.tableTitle,description:c.tableDescription}),v(ee,{href:`${l}#${ne(d,"diagrams")}`,icon:v(ha,{size:17,strokeWidth:2}),title:c.diagramTitle,description:c.diagramDescription})]}):null,r?null:v(ee,{action:"source",icon:v(ua,{size:17,strokeWidth:2}),title:a.source,description:c.sourceDescription}),t.theme.darkMode?v(ee,{action:"theme",icon:v(pa,{size:17,strokeWidth:2}),title:a.theme,description:c.themeDescription}):null]}),v("div",{className:"cf-search-results","data-canofold-search-results":"","aria-live":"polite",hidden:!0})]})]})]}):null}n(ya,"SearchModal");function wa({model:e}){let{home:t,labels:o,page:r}=e;return t?null:T("div",{className:"cf-source-sheet","data-canofold-source-sheet":"",hidden:!0,children:[v("div",{className:"cf-source-backdrop","data-canofold-source-close":"","aria-hidden":"true"}),T("aside",{className:"cf-source-panel",role:"dialog","aria-modal":"true","aria-label":o.source,tabIndex:-1,children:[T("div",{className:"cf-source-head",children:[T("div",{children:[v("p",{children:o.source}),v("span",{children:r.sourceRelativePath})]}),T("div",{className:"cf-source-actions",children:[v("button",{className:"cf-icon-button",type:"button","data-canofold-source-copy":"","data-canofold-action-success":o.sourceCopied,"aria-label":o.copySource,children:v(da,{size:16,strokeWidth:2,"aria-hidden":"true"})}),v("button",{className:"cf-icon-button",type:"button","data-canofold-source-close":"","aria-label":o.close,children:v(ga,{size:16,strokeWidth:2,"aria-hidden":"true"})})]})]}),v("textarea",{"data-canofold-source-text":"","aria-label":o.source,spellCheck:!1,readOnly:!0,defaultValue:e.rawSource})]})]})}n(wa,"SourceSheet");function po({model:e}){return T(qe,{children:[v(ya,{model:e}),v(wa,{model:e})]})}n(po,"LayoutOverlays");var xe="try{var t=localStorage.getItem('canofold-theme');if(t==='dark'||(!t&&window.matchMedia('(prefers-color-scheme:dark)').matches)){document.documentElement.classList.add('dark')}}catch(e){}";var fo=`window.__canofoldBootstrapShell = () => {
78
+ window.__canofoldShellDispose?.()
79
+ const controller = new AbortController()
80
+ const signal = controller.signal
81
+ const on = (target, event, listener, options = {}) => target.addEventListener(event, listener, { ...options, signal })
82
+ const d = document
83
+ const root = d.documentElement
84
+ const q = (selector, parent = d) => parent.querySelector(selector)
85
+ const qa = (selector, parent = d) => Array.from(parent.querySelectorAll(selector))
86
+ let navigationController
87
+
88
+ const homeHeader = q('.cf-header-home')
89
+ function syncHomeHeader() {
90
+ const progress = Math.min(1, Math.max(0, window.scrollY / 96))
91
+ homeHeader?.style.setProperty('--cf-header-surface-mix', progress * 68 + '%')
92
+ homeHeader?.style.setProperty('--cf-header-backdrop-blur', progress * 22 + 'px')
93
+ homeHeader?.style.setProperty('--cf-header-backdrop-saturation', 100 + progress * 60 + '%')
94
+ }
95
+ syncHomeHeader()
96
+ on(window, 'scroll', syncHomeHeader, { passive: true })
97
+
98
+ function disposePage() {
99
+ window.__canofoldSearchDispose?.()
100
+ window.__canofoldMarkdownDispose?.()
101
+ window.__canofoldOutlineDispose?.()
102
+ window.__canofoldDemoDispose?.()
103
+ window.__canofoldShellDispose?.()
104
+ }
105
+
106
+ async function bootstrapPage() {
107
+ window.__canofoldBootstrapShell?.()
108
+ window.__canofoldBootstrapOutline?.()
109
+ window.__canofoldBootstrapSearch?.()
110
+ await window.__canofoldBootstrapMarkdown?.()
111
+ const pageRoot = q('[data-canofold-page-root]')
112
+ const pageModule = pageRoot?.getAttribute('data-canofold-playground-client-url')
113
+ if (pageModule) {
114
+ const loadModule = window.__canofoldLoadPageModule || ((url) => import(url))
115
+ await loadModule(pageModule)
116
+ window.__canofoldBootstrapPlayground?.()
117
+ }
118
+ const demoModule = pageRoot?.getAttribute('data-canofold-demo-client-url')
119
+ if (demoModule) {
120
+ const loadModule = window.__canofoldLoadPageModule || ((url) => import(url))
121
+ await loadModule(demoModule)
122
+ await window.__canofoldBootstrapDemos?.()
123
+ }
124
+ }
125
+
126
+ function captureUpdateState(pageRoot) {
127
+ const readingLine = 64
128
+ const headings = qa('[id]', pageRoot)
129
+ let anchor
130
+ for (const heading of headings) {
131
+ if (heading.getBoundingClientRect().top <= readingLine) anchor = heading
132
+ else break
133
+ }
134
+ const maximum = Math.max(1, root.scrollHeight - window.innerHeight)
135
+ return {
136
+ anchorId: anchor?.id || null,
137
+ anchorTop: anchor?.getBoundingClientRect().top || 0,
138
+ ratio: window.scrollY / maximum,
139
+ details: qa('details', pageRoot).map((item) => item.open),
140
+ tabs: qa('[data-cf-behavior="tabs"]', pageRoot).map((item) => ({
141
+ id: item.getAttribute('data-cf-tabs-id'),
142
+ value: q('[role="tab"][data-cf-tab][aria-selected="true"]', item)?.getAttribute('data-cf-tab') || null
143
+ }))
144
+ }
145
+ }
146
+
147
+ function restoreUpdateStructure(pageRoot, state) {
148
+ qa('details', pageRoot).forEach((item, index) => {
149
+ if (state.details[index] !== undefined) item.open = state.details[index]
150
+ })
151
+ }
152
+
153
+ function restoreUpdateTabs(pageRoot, state) {
154
+ state.tabs.forEach((saved) => {
155
+ if (!saved.id || !saved.value) return
156
+ const tabs = qa('[data-cf-behavior="tabs"]', pageRoot).find(
157
+ (item) => item.getAttribute('data-cf-tabs-id') === saved.id
158
+ )
159
+ const trigger = tabs && qa('[role="tab"][data-cf-tab]', tabs).find(
160
+ (item) => item.getAttribute('data-cf-tab') === saved.value
161
+ )
162
+ trigger?.click()
163
+ })
164
+ }
165
+
166
+ function restoreReadingPosition(state) {
167
+ requestAnimationFrame(() => {
168
+ const anchor = state.anchorId && d.getElementById(state.anchorId)
169
+ if (anchor) {
170
+ window.scrollBy(0, anchor.getBoundingClientRect().top - state.anchorTop)
171
+ return
172
+ }
173
+ const maximum = Math.max(0, root.scrollHeight - window.innerHeight)
174
+ window.scrollTo(0, state.ratio * maximum)
175
+ })
176
+ }
177
+
178
+ function syncPageHead(nextDocument) {
179
+ d.title = nextDocument.title
180
+ const currentNodes = qa('[data-canofold-page-head]', d.head)
181
+ const nextNodes = qa('[data-canofold-page-head]', nextDocument.head)
182
+ const available = new Map()
183
+ currentNodes.forEach((node) => {
184
+ const nodes = available.get(node.outerHTML) || []
185
+ nodes.push(node)
186
+ available.set(node.outerHTML, nodes)
187
+ })
188
+ const retained = new Set()
189
+ nextNodes.forEach((node) => {
190
+ const matches = available.get(node.outerHTML)
191
+ const current = matches?.shift()
192
+ if (current) retained.add(current)
193
+ else d.head.appendChild(d.importNode(node, true))
194
+ })
195
+ currentNodes.forEach((node) => {
196
+ if (!retained.has(node)) node.remove()
197
+ })
198
+ }
199
+
200
+ function syncDocumentElement(nextDocument) {
201
+ const dark = root.classList.contains('dark')
202
+ root.className = nextDocument.documentElement.className
203
+ if (dark) root.classList.add('dark')
204
+ root.lang = nextDocument.documentElement.lang
205
+ const direction = nextDocument.documentElement.getAttribute('dir')
206
+ if (direction) root.setAttribute('dir', direction)
207
+ else root.removeAttribute('dir')
208
+ d.body.className = nextDocument.body.className
209
+ }
210
+
211
+ function syncSidebarState(currentSidebar, nextSidebar) {
212
+ const currentLinks = qa('[data-canofold-sidebar-link]', currentSidebar)
213
+ const nextLinks = qa('[data-canofold-sidebar-link]', nextSidebar)
214
+ const currentDetails = qa('details', currentSidebar)
215
+ const nextDetails = qa('details', nextSidebar)
216
+ if (
217
+ currentLinks.length !== nextLinks.length ||
218
+ currentDetails.length !== nextDetails.length ||
219
+ currentLinks.some((link, index) => link.getAttribute('href') !== nextLinks[index]?.getAttribute('href'))
220
+ ) return false
221
+ currentLinks.forEach((link, index) => {
222
+ const nextLink = nextLinks[index]
223
+ link.className = nextLink.className
224
+ const current = nextLink.getAttribute('aria-current')
225
+ if (current) link.setAttribute('aria-current', current)
226
+ else link.removeAttribute('aria-current')
227
+ })
228
+ currentDetails.forEach((details, index) => {
229
+ if (nextDetails[index]?.open) details.open = true
230
+ })
231
+ return true
232
+ }
233
+
234
+ async function applyPageDocument(nextDocument, options = {}) {
235
+ const currentRoot = q('[data-canofold-page-root]')
236
+ const nextRoot = q('[data-canofold-page-root]', nextDocument)
237
+ if (!currentRoot || !nextRoot) return false
238
+ const updateState = options.mode === 'update' ? captureUpdateState(currentRoot) : null
239
+ const sidebarScrollTop = options.sidebarScrollTop ?? q('[data-canofold-sidebar]', currentRoot)?.scrollTop ?? 0
240
+ disposePage()
241
+ const imported = d.importNode(nextRoot, true)
242
+ if (options.mode === 'navigation') {
243
+ const currentSidebar = q('[data-canofold-sidebar]', currentRoot)
244
+ const nextSidebar = q('[data-canofold-sidebar]', imported)
245
+ if (
246
+ currentSidebar &&
247
+ nextSidebar &&
248
+ currentSidebar.getAttribute('data-canofold-sidebar-key') &&
249
+ currentSidebar.getAttribute('data-canofold-sidebar-key') ===
250
+ nextSidebar.getAttribute('data-canofold-sidebar-key') &&
251
+ syncSidebarState(currentSidebar, nextSidebar)
252
+ ) {
253
+ nextSidebar.replaceWith(currentSidebar)
254
+ }
255
+ }
256
+ currentRoot.replaceWith(imported)
257
+ syncPageHead(nextDocument)
258
+ syncDocumentElement(nextDocument)
259
+ if (updateState) restoreUpdateStructure(imported, updateState)
260
+ const nextSidebar = q('[data-canofold-sidebar]', imported)
261
+ if (!updateState && nextSidebar) nextSidebar.scrollTop = sidebarScrollTop
262
+ await bootstrapPage()
263
+ if (updateState) {
264
+ restoreUpdateTabs(imported, updateState)
265
+ restoreReadingPosition(updateState)
266
+ } else {
267
+ if (nextSidebar) nextSidebar.scrollTop = sidebarScrollTop
268
+ if (options.focus) q('#canofold-main', imported)?.focus({ preventScroll: true })
269
+ if (options.hash) {
270
+ let id = options.hash.slice(1)
271
+ try { id = decodeURIComponent(id) } catch {}
272
+ d.getElementById(id)?.scrollIntoView()
273
+ } else {
274
+ window.scrollTo(0, options.scrollY ?? 0)
275
+ }
276
+ }
277
+ return true
278
+ }
279
+ window.__canofoldApplyPageDocument = applyPageDocument
280
+
281
+ function currentNavigationState() {
282
+ return {
283
+ scrollY: window.scrollY,
284
+ sidebarScrollTop: q('[data-canofold-sidebar]')?.scrollTop || 0
285
+ }
286
+ }
287
+
288
+ function historyStateWithNavigation(state) {
289
+ const current = history.state && typeof history.state === 'object' ? history.state : {}
290
+ return { ...current, __canofold: state }
291
+ }
292
+
293
+ function saveCurrentHistoryState() {
294
+ try { history.replaceState(historyStateWithNavigation(currentNavigationState()), '', location.href) } catch {}
295
+ }
296
+
297
+ async function navigatePage(url, { push = true, state } = {}) {
298
+ navigationController?.abort()
299
+ navigationController = new AbortController()
300
+ const response = await fetch(url, {
301
+ cache: 'no-store',
302
+ headers: { accept: 'text/html' },
303
+ signal: navigationController.signal
304
+ })
305
+ if (!response.ok || !(response.headers.get('content-type') || '').includes('text/html')) return false
306
+ const nextDocument = new DOMParser().parseFromString(await response.text(), 'text/html')
307
+ if (!q('[data-canofold-page-root]', nextDocument)) return false
308
+ const navigationState = state || {
309
+ scrollY: 0,
310
+ sidebarScrollTop: q('[data-canofold-sidebar]')?.scrollTop || 0
311
+ }
312
+ if (push) {
313
+ saveCurrentHistoryState()
314
+ history.pushState(historyStateWithNavigation(navigationState), '', url)
315
+ }
316
+ return applyPageDocument(nextDocument, {
317
+ mode: 'navigation',
318
+ hash: url.hash,
319
+ scrollY: navigationState.scrollY,
320
+ sidebarScrollTop: navigationState.sidebarScrollTop,
321
+ focus: push
322
+ })
323
+ }
324
+
325
+ function markAction(button, text) {
326
+ if (!button) return
327
+ const label = button.getAttribute('aria-label') || ''
328
+ button.dataset.actionState = 'success'
329
+ button.setAttribute('aria-label', text)
330
+ clearTimeout(button._dfActionTimer)
331
+ button._dfActionTimer = setTimeout(() => {
332
+ delete button.dataset.actionState
333
+ if (label) button.setAttribute('aria-label', label)
334
+ }, 1500)
335
+ }
336
+
337
+ function copyFallback(text) {
338
+ const area = d.createElement('textarea')
339
+ area.value = text
340
+ area.style.position = 'fixed'
341
+ area.style.opacity = '0'
342
+ d.body.appendChild(area)
343
+ area.focus()
344
+ area.select()
345
+ let copied = false
346
+ try {
347
+ copied = d.execCommand('copy')
348
+ } finally {
349
+ area.remove()
350
+ }
351
+ return copied ? Promise.resolve() : Promise.reject(new Error('Copy command failed'))
352
+ }
353
+
354
+ function copyText(text) {
355
+ if (navigator.clipboard && window.isSecureContext) {
356
+ return navigator.clipboard.writeText(text).catch(() => copyFallback(text))
357
+ }
358
+ return copyFallback(text)
359
+ }
360
+
361
+ qa('[data-canofold-theme-toggle]').forEach((button) => {
362
+ button.setAttribute('aria-pressed', String(root.classList.contains('dark')))
363
+ on(button, 'click', () => {
364
+ const on = root.classList.toggle('dark')
365
+ button.setAttribute('aria-pressed', String(on))
366
+ try { localStorage.setItem('canofold-theme', on ? 'dark' : 'light') } catch {}
367
+ })
368
+ })
369
+
370
+ const sourceSheet = q('[data-canofold-source-sheet]')
371
+ let sourceLastFocus
372
+ function focusable(container) {
373
+ return qa('a[href],button:not([disabled]),input:not([disabled]),textarea:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])', container)
374
+ .filter((element) => element.tabIndex >= 0 && !element.hidden && element.getAttribute('aria-hidden') !== 'true')
375
+ }
376
+ function setSource(value, invoker) {
377
+ if (!sourceSheet) return
378
+ if (value) {
379
+ sourceLastFocus = invoker || d.activeElement
380
+ sourceSheet.hidden = false
381
+ root.classList.add('cf-source-open')
382
+ requestAnimationFrame(() => (focusable(sourceSheet)[0] || q('.cf-source-panel', sourceSheet))?.focus())
383
+ } else {
384
+ const wasOpen = !sourceSheet.hidden
385
+ sourceSheet.hidden = true
386
+ root.classList.remove('cf-source-open')
387
+ if (wasOpen && sourceLastFocus && typeof sourceLastFocus.focus === 'function') sourceLastFocus.focus()
388
+ sourceLastFocus = undefined
389
+ }
390
+ }
391
+ qa('[data-canofold-source-open]').forEach((button) => on(button, 'click', () => {
392
+ setSource(true, button)
393
+ }))
394
+ qa('[data-canofold-source-close]').forEach((button) => on(button, 'click', () => {
395
+ setSource(false)
396
+ }))
397
+ qa('[data-canofold-source-copy]').forEach((button) => on(button, 'click', () => {
398
+ const source = q('[data-canofold-source-text]')
399
+ const success = button.getAttribute('data-canofold-action-success') || 'Markdown source copied'
400
+ if (source) copyText(source.value).then(() => markAction(button, success)).catch(() => {})
401
+ }))
402
+
403
+ qa('[data-canofold-playground-toggle]').forEach((button) => on(button, 'click', () => {
404
+ const playground = button.closest('[data-canofold-playground]')
405
+ if (!playground) return
406
+ const nextView = playground.dataset.view === 'source' ? 'preview' : 'source'
407
+ playground.dataset.view = nextView
408
+ const nextLabel = nextView === 'source'
409
+ ? button.getAttribute('data-preview-label')
410
+ : button.getAttribute('data-source-label')
411
+ if (nextLabel) {
412
+ button.setAttribute('aria-label', nextLabel)
413
+ button.setAttribute('title', nextLabel)
414
+ }
415
+ }))
416
+
417
+ qa('[data-canofold-playground-resizer]').forEach((resizer) => {
418
+ const playground = resizer.closest('[data-canofold-playground]')
419
+ if (!playground) return
420
+ const min = Number(resizer.getAttribute('aria-valuemin')) || 25
421
+ const max = Number(resizer.getAttribute('aria-valuemax')) || 75
422
+ const clamp = (value) => Math.min(max, Math.max(min, value))
423
+ const setSplit = (value) => {
424
+ const next = clamp(value)
425
+ playground.style.setProperty('--cf-playground-source-width', next + '%')
426
+ resizer.setAttribute('aria-valuenow', String(Math.round(next)))
427
+ }
428
+ const splitFromPointer = (event) => {
429
+ const rect = playground.getBoundingClientRect()
430
+ if (!rect.width) return
431
+ const fromStart = (event.clientX - rect.left) / rect.width * 100
432
+ setSplit(getComputedStyle(playground).direction === 'rtl' ? 100 - fromStart : fromStart)
433
+ }
434
+ let dragging = false
435
+ on(resizer, 'pointerdown', (event) => {
436
+ if (event.button !== 0) return
437
+ dragging = true
438
+ playground.dataset.resizing = ''
439
+ resizer.setPointerCapture?.(event.pointerId)
440
+ splitFromPointer(event)
441
+ event.preventDefault()
442
+ })
443
+ on(resizer, 'pointermove', (event) => {
444
+ if (dragging) splitFromPointer(event)
445
+ })
446
+ const stopDragging = (event) => {
447
+ if (!dragging) return
448
+ dragging = false
449
+ delete playground.dataset.resizing
450
+ if (resizer.hasPointerCapture?.(event.pointerId)) resizer.releasePointerCapture(event.pointerId)
451
+ }
452
+ on(resizer, 'pointerup', stopDragging)
453
+ on(resizer, 'pointercancel', stopDragging)
454
+ on(resizer, 'keydown', (event) => {
455
+ const current = Number(resizer.getAttribute('aria-valuenow')) || 45
456
+ const rtl = getComputedStyle(playground).direction === 'rtl'
457
+ let next
458
+ if (event.key === 'Home') next = min
459
+ if (event.key === 'End') next = max
460
+ if (event.key === 'ArrowLeft') next = current + (rtl ? 2 : -2)
461
+ if (event.key === 'ArrowRight') next = current + (rtl ? -2 : 2)
462
+ if (next === undefined) return
463
+ setSplit(next)
464
+ event.preventDefault()
465
+ })
466
+ on(resizer, 'dblclick', () => setSplit(45))
467
+ })
468
+
469
+ const bar = q('[data-canofold-progress]')
470
+ function progress() {
471
+ if (!bar) return
472
+ const max = root.scrollHeight - window.innerHeight
473
+ const scrollTop = window.scrollY || root.scrollTop || 0
474
+ const ratio = max > 0 ? Math.min(1, Math.max(0, scrollTop / max)) : 0
475
+ bar.style.transform = 'scaleX(' + ratio + ')'
476
+ }
477
+ progress()
478
+ on(window, 'scroll', progress, { passive: true })
479
+ on(window, 'resize', progress)
480
+
481
+ const sidebar = q('[data-canofold-sidebar]')
482
+ const backdrop = q('[data-canofold-sidebar-backdrop]')
483
+ const open = q('[data-canofold-sidebar-open]')
484
+ function setSidebar(value) {
485
+ if (!sidebar) return
486
+ sidebar.dataset.open = String(value)
487
+ if (backdrop) backdrop.hidden = !value
488
+ if (open) {
489
+ open.setAttribute('aria-expanded', String(value))
490
+ open.setAttribute(
491
+ 'aria-label',
492
+ value ? open.dataset.canofoldSidebarCloseLabel : open.dataset.canofoldSidebarOpenLabel
493
+ )
494
+ }
495
+ }
496
+ if (open) {
497
+ on(open, 'click', () => setSidebar(open.getAttribute('aria-expanded') !== 'true'))
498
+ }
499
+ if (backdrop) on(backdrop, 'click', () => setSidebar(false))
500
+ qa('[data-canofold-sidebar-link]').forEach((link) => on(link, 'click', () => setSidebar(false)))
501
+
502
+ on(d, 'click', (event) => {
503
+ qa('[data-canofold-menu][open]').forEach((menu) => {
504
+ if (!menu.contains(event.target)) menu.removeAttribute('open')
505
+ })
506
+ if (
507
+ event.defaultPrevented ||
508
+ event.button !== 0 ||
509
+ event.metaKey ||
510
+ event.ctrlKey ||
511
+ event.shiftKey ||
512
+ event.altKey ||
513
+ !(event.target instanceof Element)
514
+ ) return
515
+ const anchor = event.target.closest('a[href]')
516
+ if (!anchor || anchor.hasAttribute('download') || anchor.hasAttribute('data-canofold-no-navigation')) return
517
+ if (anchor.target && anchor.target !== '_self') return
518
+ const url = new URL(anchor.href, location.href)
519
+ if (url.origin !== location.origin || !['http:', 'https:'].includes(url.protocol)) return
520
+ if (url.pathname === location.pathname && url.search === location.search) {
521
+ if (url.hash) return
522
+ event.preventDefault()
523
+ window.scrollTo(0, 0)
524
+ return
525
+ }
526
+ event.preventDefault()
527
+ void navigatePage(url).then((applied) => {
528
+ if (!applied) location.assign(url.href)
529
+ }).catch((error) => {
530
+ if (error?.name !== 'AbortError') location.assign(url.href)
531
+ })
532
+ })
533
+ on(window, 'popstate', (event) => {
534
+ const state = event.state?.__canofold || { scrollY: 0, sidebarScrollTop: 0 }
535
+ const url = new URL(location.href)
536
+ void navigatePage(url, { push: false, state }).then((applied) => {
537
+ if (!applied) location.reload()
538
+ }).catch((error) => {
539
+ if (error?.name !== 'AbortError') location.reload()
540
+ })
541
+ })
542
+ on(d, 'keydown', (event) => {
543
+ if (event.key === 'Tab' && sourceSheet && !sourceSheet.hidden) {
544
+ const items = focusable(sourceSheet)
545
+ if (!items.length) return
546
+ const first = items[0]
547
+ const last = items[items.length - 1]
548
+ if (event.shiftKey && d.activeElement === first) {
549
+ event.preventDefault()
550
+ last.focus()
551
+ } else if (!event.shiftKey && d.activeElement === last) {
552
+ event.preventDefault()
553
+ first.focus()
554
+ }
555
+ return
556
+ }
557
+ if (event.key !== 'Escape') return
558
+ setSidebar(false)
559
+ qa('[data-canofold-menu][open]').forEach((menu) => menu.removeAttribute('open'))
560
+ setSource(false)
561
+ })
562
+ window.__canofoldShellDispose = () => {
563
+ controller.abort()
564
+ qa('[data-action-state]').forEach((button) => clearTimeout(button._dfActionTimer))
565
+ root.classList.remove('cf-source-open')
566
+ }
567
+ }
568
+ window.__canofoldBootstrapShell()`,ho=`window.__canofoldBootstrapOutline = () => {
569
+ window.__canofoldOutlineDispose?.()
570
+ const controller = new AbortController()
571
+ const signal = controller.signal
572
+ const links = Array.from(document.querySelectorAll('[data-canofold-outline-link]'))
573
+ const map = Object.create(null)
574
+ links.forEach((link) => {
575
+ const href = link.getAttribute('href') || ''
576
+ try { map[decodeURIComponent(href.slice(1))] = link } catch {}
577
+ })
578
+ const headings = Object.keys(map).map((id) => document.getElementById(id)).filter(Boolean)
579
+ let current
580
+ let queued = false
581
+ let frame
582
+ let hashTimer
583
+ function setActive(link) {
584
+ if (current === link) return
585
+ if (current) delete current.dataset.active
586
+ current = link
587
+ if (!link) return
588
+ link.dataset.active = 'true'
589
+ const panel = link.closest('[data-canofold-outline]')
590
+ if (!panel) return
591
+ const linkRect = link.getBoundingClientRect()
592
+ const panelRect = panel.getBoundingClientRect()
593
+ if (linkRect.top < panelRect.top + 48) {
594
+ panel.scrollTop -= panelRect.top + 48 - linkRect.top
595
+ } else if (linkRect.bottom > panelRect.bottom - 24) {
596
+ panel.scrollTop += linkRect.bottom - panelRect.bottom + 24
597
+ }
598
+ }
599
+ function update() {
600
+ queued = false
601
+ if (!headings.length) return
602
+ const header = document.querySelector('.cf-header')?.getBoundingClientRect().height || 58
603
+ const readingLine = header + 48
604
+ let active = headings[0]
605
+ for (const heading of headings) {
606
+ if (heading.getBoundingClientRect().top <= readingLine) active = heading
607
+ else break
608
+ }
609
+ if (window.innerHeight + window.scrollY >= document.documentElement.scrollHeight - 2) {
610
+ active = headings[headings.length - 1]
611
+ }
612
+ if (active) setActive(map[active.id])
613
+ }
614
+ function schedule() {
615
+ if (queued) return
616
+ queued = true
617
+ frame = requestAnimationFrame(update)
618
+ }
619
+ window.addEventListener('scroll', schedule, { passive: true, signal })
620
+ window.addEventListener('resize', schedule, { signal })
621
+ window.addEventListener('hashchange', () => { hashTimer = setTimeout(update, 0) }, { signal })
622
+ update()
623
+ window.__canofoldOutlineDispose = () => {
624
+ controller.abort()
625
+ if (frame) cancelAnimationFrame(frame)
626
+ if (hashTimer) clearTimeout(hashTimer)
627
+ }
628
+ }
629
+ window.__canofoldBootstrapOutline()`;import{Fragment as ba,jsx as S,jsxs as se}from"react/jsx-runtime";function go({config:e,graph:t,page:o,home:r=!1,markdownAssets:a,rawSource:s,demoClientUrl:l,demoStyleUrls:i=[],children:d}){let c=mo({config:e,graph:t,page:o,home:r,assets:a,rawSource:s}),p=c.assets.behaviors.length>0,f=c.assets.pluginClients.map(y=>h(e,`/assets/canofold-plugins/${y.id}.js`)),u=J(e,o.routePath),b=h(e,e.theme.favicon??we.favicon),w=[e.layout.header?void 0:"cf-header-hidden",o.frontmatter.layout==="playground"?"cf-playground-page":void 0].filter(Boolean).join(" "),P=o.frontmatter.layout==="playground";return se("html",{lang:o.locale,className:w||void 0,children:[se("head",{children:[S("meta",{charSet:"utf-8"}),S("meta",{name:"viewport",content:"width=device-width, initial-scale=1"}),S("title",{children:c.title}),S("meta",{name:"description",content:c.description,"data-canofold-page-head":""}),S("meta",{property:"og:title",content:c.title,"data-canofold-page-head":""}),S("meta",{property:"og:description",content:c.description,"data-canofold-page-head":""}),e.search.enabled&&o.search?se(ba,{children:[S("meta",{"data-pagefind-meta":"title[content]",content:o.title,"data-canofold-page-head":""}),S("meta",{"data-pagefind-meta":"description[content]",content:o.description,"data-canofold-page-head":""}),S("meta",{"data-pagefind-filter":`version:${o.version}`,"data-canofold-page-head":""}),S("meta",{"data-pagefind-filter":`locale:${o.locale}`,"data-canofold-page-head":""}),S("meta",{"data-pagefind-filter":`status:${o.status}`,"data-canofold-page-head":""}),(Array.isArray(o.frontmatter.tags)?o.frontmatter.tags:[]).filter(y=>typeof y=="string").map(y=>S("meta",{"data-pagefind-filter":`tag:${y}`,"data-canofold-page-head":""},y))]}):null,u?S("meta",{property:"og:url",content:u,"data-canofold-page-head":""}):null,S("meta",{name:"twitter:card",content:"summary"}),S("link",{rel:"icon",href:b}),u?S("link",{rel:"canonical",href:u,"data-canofold-page-head":""}):null,e.siteUrl?c.alternatePages.map(y=>S("link",{rel:"alternate",hrefLang:y.locale,href:J(e,y.routePath),"data-canofold-page-head":""},y.locale)):null,S("link",{rel:"stylesheet",href:h(e,"/assets/canofold.css")}),c.assets.pluginStyles.map(y=>S("link",{rel:"stylesheet",href:h(e,`/assets/canofold-plugins/${y.id}.css`),"data-canofold-page-head":""},y.id)),i.map(y=>S("link",{rel:"stylesheet",href:y},y)),e.theme.darkMode?S("script",{dangerouslySetInnerHTML:{__html:xe}}):null]}),se("body",{children:[se("div",{className:"cf-page-root",style:{"--cf-canofold-config-icon":`url(${JSON.stringify(b)})`},"data-canofold-page-root":"","data-markdown-behaviors":p?JSON.stringify(c.assets.behaviors):void 0,"data-markdown-client-url":p?h(e,"/assets/canofold-markdown/index.js"):void 0,"data-markdown-plugin-clients":f.length>0?JSON.stringify(f):void 0,"data-canofold-playground-client-url":P?h(e,"/assets/canofold-playground/index.js"):void 0,"data-canofold-demo-client-url":l,children:[S("a",{className:"cf-skip-link",href:"#canofold-main",children:c.labels.skipToContent}),e.layout.header?S(ao,{model:c}):null,r?S("main",{id:"canofold-main",className:"cf-home",tabIndex:-1,"data-pagefind-body":o.search?"":void 0,children:d}):S(uo,{model:c,children:d}),S(po,{model:c})]}),S("script",{type:"module",dangerouslySetInnerHTML:{__html:c.markdownClientScript}}),P?S("script",{type:"module",src:h(e,"/assets/canofold-playground/index.js")}):null,l?S("script",{type:"module",src:l}):null,S("script",{dangerouslySetInnerHTML:{__html:fo}}),S("script",{dangerouslySetInnerHTML:{__html:ho}}),e.search.enabled?S("script",{type:"module",src:h(e,"/assets/canofold-search.js")}):null]})]})}n(go,"Layout");import{access as ka,copyFile as va,mkdir as Pa}from"fs/promises";import{dirname as Sa,join as wo}from"path";import{fileURLToPath as yo}from"url";async function xa(){let e=[yo(new URL("../assets/brand/",import.meta.url)),yo(new URL("./brand/",import.meta.url))];for(let t of e)try{return await ka(wo(t,"logo-light.webp")),t}catch{}throw new Error("Canofold built-in brand assets are missing")}n(xa,"brandSourceRoot");async function bo(e){let t=await xa();await Promise.all(bt.map(async o=>{let r=R(e,o,`built-in brand asset ${o}`);await Pa(Sa(r),{recursive:!0}),await va(wo(t,o.split("/").at(-1)),r)}))}n(bo,"copyBuiltInBrandAssets");import{createMarkdownRenderer as ja}from"@canofold/markdown/server";import*as za from"react";import*as Ga from"react/jsx-runtime";import{analyzeMdxModuleBoundary as Ca}from"@canofold/markdown/server/analyze";var Ma=["react","react/jsx-runtime"],Da=new Set(Ma);function He(e){return Da.has(e)}n(He,"isDocsImportSpecifier");function je(e){return e.startsWith(".")||He(e)}n(je,"isAllowedDocsImport");function Ce(e){let t=Ca(e);for(let o of t.unsupportedReferences){let r=o.kind==="dynamic-import"?"Dynamic import":"Re-export";throw new Error(`${r} is not allowed in MDX${o.specifier?`: ${o.specifier}`:""}`)}for(let{specifier:o}of t.imports)if(!je(o))throw new Error(`External import is not allowed: ${o}`);return{source:t.sourceWithoutImports,imports:t.imports}}n(Ce,"prepareMdxSource");import{access as Na,readFile as Aa,realpath as De}from"fs/promises";import{dirname as La,extname as Po,isAbsolute as Ve,relative as So,resolve as ko,sep as xo}from"path";import{build as Ra}from"esbuild";import*as Ta from"react";import*as Ea from"react/jsx-runtime";import{detectMarkdownAssets as $a}from"@canofold/markdown/server/analyze";var ze=[".tsx",".ts",".jsx",".js"],vo={react:Ta,"react/jsx-runtime":Ea};function Oa(e){if(Object.hasOwn(vo,e))return vo[e];throw new Error(`External import is not allowed in local docs components: ${e}`)}n(Oa,"requireLocalComponentRuntime");function Me(e,t){let o=So(e,t);return o===""||!o.startsWith(`..${xo}`)&&o!==".."&&!Ve(o)}n(Me,"isInsideRoot");async function Ge(e){try{return await Na(e),!0}catch{return!1}}n(Ge,"fileExists");async function Ke(e,t){let o=await De(e);if(!t)return o;let r=await De(t),a=So(r,o);if(a===".."||a.startsWith(`..${xo}`)||Ve(a))throw new Error(`Local component import escapes the project root: ${e}`);return o}n(Ke,"assertInsideProjectRoot");async function We(e,t,o){let r=ko(La(e),t),a=Po(r);if(a&&!ze.includes(a))throw new Error(`Unsupported local component import: ${t}`);if(a&&await Ge(r))return Ke(r,o);for(let s of ze){let l=`${r}${s}`;if(await Ge(l))return Ke(l,o)}for(let s of ze){let l=ko(r,`index${s}`);if(await Ge(l))return Ke(l,o)}throw new Error(`Local component import not found: ${t}`)}n(We,"resolveLocalModule");async function Ia(e,t){let o=t?await De(t):void 0,r=new Set([e]),s=(await Ra({entryPoints:[e],bundle:!0,outfile:"local-component.js",write:!1,platform:"node",format:"cjs",target:"node22",jsx:"automatic",plugins:[{name:"canofold-components-alias",setup(l){l.onResolve({filter:/^(?:react|react\/jsx-runtime)$/},i=>({path:i.path,external:!0})),l.onResolve({filter:/.*/},async i=>{if(!Ve(i.path)||!i.importer||!(o?Me(o,i.importer):r.has(i.importer)))return;let c=await We(i.importer,i.path,t);return r.add(c),{path:c}}),l.onResolve({filter:/^\./},async i=>{if(i.importer&&!(o?Me(o,i.importer):r.has(i.importer)))return;let d=await We(i.importer,i.path,t);return r.add(d),{path:d}}),l.onLoad({filter:/\.(?:[jt]sx?)$/},async i=>{let d=await De(i.path);(o?Me(o,d):r.has(d))&&r.add(d)}),l.onResolve({filter:/^react-dom$/},i=>(i.importer?o?Me(o,i.importer):r.has(i.importer):!1)?{errors:[{text:"External import is not allowed in local docs components: react-dom"}]}:void 0),l.onResolve({filter:/^[^./].*/},i=>{if(!je(i.path))return{errors:[{text:`External import is not allowed in local docs components: ${i.path}`}]}})}}]})).outputFiles.find(l=>Po(l.path)===".js");if(!s)throw new Error(`Failed to bundle local component: ${e}`);return{code:s.text,sourcePaths:[...r]}}n(Ia,"bundleLocalModule");async function Fa(e){let t={exports:{}};return new Function("module","exports","require",e.code)(t,t.exports,Oa),t.exports}n(Fa,"importBundle");function _a(e){return e.filter(t=>t.specifier.startsWith("."))}n(_a,"localImports");async function Co(e,t,o){let r=_a(e);if(!r.length)return[];if(!t)throw new Error("Local MDX component imports require the Markdown source file path");let a=new Map;return Promise.all(r.map(async s=>{let l=await We(t,s.specifier,o),i=a.get(l);return i||(i=Ia(l,o),a.set(l,i)),{localImport:s,bundle:await i}}))}n(Co,"bundleLocalImports");async function Mo(e,t,o){let r=await Co(e,t,o);return[...new Set(r.flatMap(({bundle:a})=>a.sourcePaths))].sort()}n(Mo,"localComponentDependencyPaths");async function Ba(e){let t={},o=new Map;for(let{localImport:r,bundle:a}of e){let s=o.get(a);s||(s=Fa(a),o.set(a,s));let l=await s;for(let i of r.bindings)if(i.namespace)t[i.local]=l;else{if(!Object.hasOwn(l,i.imported))throw new Error(`Local module ${JSON.stringify(r.specifier)} does not export ${JSON.stringify(i.imported)}`);t[i.local]=l[i.imported]}}return t}n(Ba,"componentsFromBundles");function Ua(e,t){e.behaviors=[...new Set([...e.behaviors,...t.behaviors])],e.math||=t.math,e.pluginClients=[...new Map([...e.pluginClients,...t.pluginClients].map(o=>[o.id,o])).values()],e.pluginStyles=[...new Map([...e.pluginStyles,...t.pluginStyles].map(o=>[o.id,o])).values()]}n(Ua,"mergeAssets");function qa(){return{behaviors:[],math:!1,pluginClients:[],pluginStyles:[]}}n(qa,"emptyAssets");async function Ha(e,t=[]){let o=qa(),r=new Set;for(let{bundle:a}of e)for(let s of a.sourcePaths)r.has(s)||(r.add(s),Ua(o,$a(await Aa(s,"utf8"),t,"mdx")));return o}n(Ha,"assetsFromBundles");async function Do(e,t,o,r=[]){let a=await Co(e,t,o),[s,l]=await Promise.all([Ba(a),Ha(a,r)]);return{components:s,assets:l}}n(Do,"loadLocalComponentBundle");function Ka(...e){return{behaviors:[...new Set(e.flatMap(t=>t.behaviors))],math:e.some(t=>t.math),pluginClients:[...new Map(e.flatMap(t=>t.pluginClients).map(t=>[t.id,t])).values()],pluginStyles:[...new Map(e.flatMap(t=>t.pluginStyles).map(t=>[t.id,t])).values()]}}n(Ka,"mergeAssets");function Wa(e,t){let o={react:za,"react/jsx-runtime":Ga},r={...t};for(let a of e){if(!He(a.specifier))continue;let s=o[a.specifier];for(let l of a.bindings){if(l.namespace){r[l.local]=s;continue}if(l.imported==="default"&&a.specifier==="react"){r[l.local]=s.default??s;continue}if(!Object.hasOwn(s,l.imported))throw new Error(`Module ${JSON.stringify(a.specifier)} does not export ${JSON.stringify(l.imported)}`);r[l.local]=s[l.imported]}}return r}n(Wa,"bindImports");async function No(e,t,o,r,a,s,l=ja()){let i=Ce(e),{components:d,assets:c}=await Do(i.imports,t,o,r?.plugins),p=await l.renderMdx(i.source,{markdown:r,classNames:a,urlTransform:s,as:"article",components:{...Wa(i.imports,d)}});return{content:p.content,assets:Ka(p.assets,c)}}n(No,"renderMdxResult");import{mkdir as Va}from"fs/promises";import{dirname as Ja,join as Xa}from"path";import{fileURLToPath as Ya}from"url";function Qa(){let e=import.meta.url.endsWith(".js")?"./search-client.js":"./searchClientRuntime.ts";return Ya(new URL(e,import.meta.url))}n(Qa,"searchRuntimeEntry");async function Ao(e){let{build:t}=await import("esbuild"),o=Xa(e,"assets/canofold-search.js");await Va(Ja(o),{recursive:!0}),await t({entryPoints:[Qa()],bundle:!0,format:"iife",platform:"browser",target:"es2022",outfile:o,minify:!0,sourcemap:!1,legalComments:"none",logLevel:"silent"})}n(Ao,"buildSearchBundle");import{DEFAULT_SEMANTIC_COLORS as A,DEFAULT_MARKDOWN_THEME as Xe,markdownThemeDeclarations as Za,resolveMarkdownTheme as en}from"@canofold/markdown/theme";var tn={canofold:{light:A.light.blue,dark:A.dark.blue},cyan:{light:A.light.cyan,dark:A.dark.cyan},emerald:{light:A.light.green,dark:A.dark.green},blue:{light:A.light.blue,dark:A.dark.blue},green:{light:A.light.green,dark:A.dark.green},red:{light:A.light.red,dark:A.dark.red},orange:{light:A.light.orange,dark:A.dark.orange},violet:{light:A.light.indigo,dark:A.dark.indigo},neutral:{light:"oklch(0.3 0 0)",dark:"oklch(0.85 0 0)"}};function Lo(e){let t=Xe.colors[e];return{background:t.canvas,foreground:t.foreground,text:t.text,muted:t.muted,muted2:t.mutedSubtle,card:t.surface,card2:t.surfaceSecondary,soft:t.surfaceSoft,popover:t.surfaceElevated,border:t.border,borderStrong:t.borderStrong,hairline:t.hairline,primarySoft:t.primarySoft,primaryForeground:t.primaryForeground,primaryDeep:t.primaryDeep,accent:t.accent,info:t.info,infoDeep:t.infoDeep,success:t.success,successDeep:t.successDeep,warning:t.warning,warningDeep:t.warningDeep,danger:t.danger,dangerDeep:t.dangerDeep,codeBackground:t.codeBackground,codeForeground:t.codeForeground,overlay:t.overlay,shadow:t.shadow,shadowSmall:t.shadowSmall}}n(Lo,"paletteFromMarkdown");var on={paper:{light:Lo("light"),dark:Lo("dark")},neutral:{light:{background:"oklch(0.994 0.003 95)",foreground:"oklch(0.205 0.008 80)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.505 0.01 80)",muted2:"oklch(0.62 0.01 80)",card:"oklch(0.985 0.004 95)",card2:"oklch(0.96 0.004 95)",soft:"oklch(0.955 0.006 95)",popover:"oklch(0.997 0.002 95)",border:"transparent",borderStrong:"transparent",hairline:"oklch(0.93 0.004 90)"},dark:{background:"oklch(0.17 0.006 85)",foreground:"oklch(0.92 0.005 90)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.66 0.01 88)",muted2:"oklch(0.54 0.01 88)",card:"oklch(0.205 0.006 85)",card2:"oklch(0.235 0.006 85)",soft:"oklch(0.255 0.007 85)",popover:"oklch(0.21 0.006 85)",border:"transparent",borderStrong:"transparent",hairline:"oklch(1 0 0 / 6%)"}},slate:{light:{background:"oklch(0.99 0.004 250)",foreground:"oklch(0.22 0.018 255)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.49 0.02 255)",muted2:"oklch(0.61 0.018 255)",card:"oklch(0.982 0.005 250)",card2:"oklch(0.955 0.007 250)",soft:"oklch(0.95 0.01 250)",popover:"oklch(0.996 0.003 250)",border:"transparent",borderStrong:"transparent",hairline:"oklch(0.93 0.008 250)"},dark:{background:"oklch(0.17 0.014 255)",foreground:"oklch(0.92 0.006 250)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.68 0.018 250)",muted2:"oklch(0.54 0.018 250)",card:"oklch(0.21 0.014 255)",card2:"oklch(0.25 0.014 255)",soft:"oklch(0.27 0.014 255)",popover:"oklch(0.215 0.014 255)",border:"transparent",borderStrong:"transparent",hairline:"oklch(1 0 0 / 6%)"}},zinc:{light:{background:"oklch(0.992 0 0)",foreground:"oklch(0.21 0.005 285)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.5 0.01 285)",muted2:"oklch(0.62 0.008 285)",card:"oklch(0.982 0.002 285)",card2:"oklch(0.955 0.003 285)",soft:"oklch(0.95 0.003 285)",popover:"oklch(0.996 0 0)",border:"transparent",borderStrong:"transparent",hairline:"oklch(0.93 0.003 285)"},dark:{background:"oklch(0.17 0.004 285)",foreground:"oklch(0.92 0.003 285)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.67 0.006 285)",muted2:"oklch(0.54 0.006 285)",card:"oklch(0.21 0.004 285)",card2:"oklch(0.245 0.004 285)",soft:"oklch(0.265 0.004 285)",popover:"oklch(0.215 0.004 285)",border:"transparent",borderStrong:"transparent",hairline:"oklch(1 0 0 / 6%)"}},stone:{light:{background:"oklch(0.992 0.004 70)",foreground:"oklch(0.22 0.01 70)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.5 0.012 70)",muted2:"oklch(0.62 0.012 70)",card:"oklch(0.982 0.005 70)",card2:"oklch(0.955 0.006 70)",soft:"oklch(0.95 0.007 70)",popover:"oklch(0.996 0.003 70)",border:"transparent",borderStrong:"transparent",hairline:"oklch(0.93 0.006 70)"},dark:{background:"oklch(0.17 0.008 70)",foreground:"oklch(0.92 0.005 70)",text:"color-mix(in oklab, var(--cf-ink) 88%, var(--cf-ink-secondary))",muted:"oklch(0.67 0.01 70)",muted2:"oklch(0.54 0.01 70)",card:"oklch(0.21 0.008 70)",card2:"oklch(0.245 0.008 70)",soft:"oklch(0.265 0.008 70)",popover:"oklch(0.215 0.008 70)",border:"transparent",borderStrong:"transparent",hairline:"oklch(1 0 0 / 6%)"}}};function Je(e){return typeof e=="number"?`${e}px`:e}n(Je,"cssLength");function rn(e,t){return tn[t]?.[e]??t}n(rn,"accentFor");function Ro(e,t){let o=rn(t,e.theme.accentColor),r=on[e.theme.baseColor][t],a=e.theme.accentColor==="canofold",s=Xe.colors[t];return{...r,primary:o,primarySoft:a&&r.primarySoft?r.primarySoft:`color-mix(in oklab, ${o} 12%, var(--cf-surface))`,primaryForeground:a&&r.primaryForeground?r.primaryForeground:`color-mix(in oklab, ${o} 76%, var(--cf-ink))`,primaryDeep:a&&r.primaryDeep?r.primaryDeep:`color-mix(in oklab, ${o} 84%, var(--cf-ink))`,accent:r.accent??o,info:r.info??s.info,infoDeep:r.infoDeep??s.infoDeep,success:r.success??s.success,successDeep:r.successDeep??s.successDeep,warning:r.warning??s.warning,warningDeep:r.warningDeep??s.warningDeep,danger:r.danger??s.danger,dangerDeep:r.dangerDeep??s.dangerDeep,codeBackground:r.codeBackground??r.card2??r.card,codeForeground:r.codeForeground??r.foreground,overlay:r.overlay??s.overlay,shadow:r.shadow??s.shadow,shadowSmall:r.shadowSmall??s.shadowSmall}}n(Ro,"resolveTokens");function To(e,t){let o=Xe.colors[t];return{canvas:e.background??o.canvas,foreground:e.foreground??o.foreground,text:e.text??o.text,muted:e.muted??o.muted,mutedSubtle:e.muted2??o.mutedSubtle,surface:e.card??o.surface,surfaceSecondary:e.card2??o.surfaceSecondary,surfaceSoft:e.soft??o.surfaceSoft,surfaceElevated:e.popover??o.surfaceElevated,border:e.border??o.border,borderStrong:e.borderStrong??o.borderStrong,hairline:e.hairline??o.hairline,primary:e.primary??o.primary,primarySoft:e.primarySoft??o.primarySoft,primaryForeground:e.primaryForeground??o.primaryForeground,primaryDeep:e.primaryDeep??o.primaryDeep,accent:e.accent??o.accent,info:e.info??o.info,infoDeep:e.infoDeep??o.infoDeep,success:e.success??o.success,successDeep:e.successDeep??o.successDeep,warning:e.warning??o.warning,warningDeep:e.warningDeep??o.warningDeep,danger:e.danger??o.danger,dangerDeep:e.dangerDeep??o.dangerDeep,codeBackground:e.codeBackground??o.codeBackground,codeForeground:e.codeForeground??o.codeForeground,overlay:e.overlay??o.overlay,shadow:e.shadow??o.shadow,shadowSmall:e.shadowSmall??o.shadowSmall}}n(To,"themeColors");function an(e){let t=Je(e.theme.radius);return en({colors:{light:{...To(Ro(e,"light"),"light"),...e.theme.tokens.colors?.light},dark:{...To(Ro(e,"dark"),"dark"),...e.theme.tokens.colors?.dark}},typography:e.theme.tokens.typography,layout:e.theme.tokens.layout,geometry:{radiusSmall:t,radiusMedium:t,radiusLarge:t,...e.theme.tokens.geometry},motion:e.theme.tokens.motion})}n(an,"resolveCanofoldTheme");function Eo(e,t){let o=t.colors[e].primary;return`${Za(t,e)}
630
+ --cf-accent-50: color-mix(in oklab, ${o} 8%, var(--cf-surface));
631
+ --cf-accent-100: color-mix(in oklab, ${o} 16%, var(--cf-surface));
632
+ --cf-accent-200: color-mix(in oklab, ${o} 28%, var(--cf-surface));
633
+ --cf-accent-300: color-mix(in oklab, ${o} 48%, var(--cf-surface));
634
+ --cf-accent-400: color-mix(in oklab, ${o} 78%, var(--cf-surface));
635
+ --cf-accent-600: color-mix(in oklab, ${o} 88%, var(--cf-ink));
636
+ --cf-accent-700: color-mix(in oklab, ${o} 76%, var(--cf-ink));
637
+ --cf-accent-800: color-mix(in oklab, ${o} 62%, var(--cf-ink));
638
+ --cf-accent-900: color-mix(in oklab, ${o} 48%, var(--cf-ink));`}n(Eo,"paletteCss");function $o(e){let t=an(e),o=Je(e.theme.sidebarWidth),r=Je(e.theme.outlineWidth),a=`:root {
639
+ ${Eo("light",t)}
640
+ --cf-sidebar-width: ${o};
641
+ --cf-outline-width: ${r};
642
+ }`;return e.theme.darkMode?`${a}
643
+ .dark {
644
+ ${Eo("dark",t)}
645
+ }`:a}n($o,"buildThemeVariables");function nn(e,t){if(t==="/")return e;let o=t.replace(/\/$/,"");return e===o||e.startsWith(`${o}/`)||!e.startsWith("/")||e.startsWith("//")?e:`${o}${e}`}n(nn,"withBasePath");function Oo(e){return t=>nn(t,e)}n(Oo,"createBasePathUrlTransform");import{rm as sn}from"fs/promises";import{fileURLToPath as ln}from"url";import{join as cn}from"path";import{build as dn}from"esbuild";function ie(e){return JSON.stringify(e).replace(/</g,"\\u003c").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}n(ie,"jsonForJavaScript");function un(){let e=import.meta.url.endsWith(".js")?"./playground-client.js":"./playgroundClient.tsx";return ln(new URL(e,import.meta.url))}n(un,"playgroundRuntimeEntry");async function Io(e,t,o){let r=cn(t,"assets/canofold-playground");await sn(r,{recursive:!0,force:!0});let a=o.markdown.plugins.map(c=>{if(!c.browserCompiler)throw new Error(`Markdown plugin "${c.name}" must declare browserCompiler to support Playground realtime preview`);return c.browserCompiler}),s=a.map((c,p)=>`import { ${c.exportName} as canofoldPlugin${p} } from ${ie(c.module)}`).join(`
646
+ `),l=a.map((c,p)=>c.options===void 0?`canofoldPlugin${p}()`:`canofoldPlugin${p}(${ie(c.options)})`).join(`,
647
+ `),i={html:o.markdown.html,code:o.markdown.code,features:o.markdown.features},d=`import { mountPlaygrounds } from ${ie(un())}
648
+ ${s}
649
+
650
+ const options = {
651
+ basePath: ${ie(o.basePath)},
652
+ markdown: { ...${ie(i)}, plugins: [
653
+ ${l}
654
+ ] }
655
+ }
656
+ window.__canofoldBootstrapPlayground = () => mountPlaygrounds(options)
657
+ window.__canofoldBootstrapPlayground()`;await dn({absWorkingDir:e,stdin:{contents:d,loader:"js",resolveDir:e,sourcefile:"canofold-playground-entry.js"},bundle:!0,format:"esm",platform:"browser",target:"es2022",outdir:r,entryNames:"index",chunkNames:"chunks/[name]-[hash]",assetNames:"assets/[name]-[hash]",splitting:!0,minify:!0,sourcemap:!1,define:{"process.env.NODE_ENV":JSON.stringify("production")},logLevel:"silent"})}n(Io,"buildPlaygroundBundle");import{createHash as mn}from"crypto";function _(e,t){return{hName:e,hProperties:t}}n(_,"properties");function pn(e,t){let o=`cf-demo-source-${e.id}`,r=`cf-demo-title-${e.id}`,a=[];e.title&&a.push({type:"textDirective",name:"canofold-demo-title",children:[{type:"text",value:e.title}],data:_("strong",{id:r,className:["cf-demo-title"]})}),e.description&&a.push({type:"textDirective",name:"canofold-demo-description",children:[{type:"text",value:e.description}],data:_("p",{className:["cf-demo-description"]})});let s=n((d,c)=>({type:"textDirective",name:d,children:[],data:_("span",{className:["cf-demo-action-icon",c],ariaHidden:!0})}),"actionIcon"),l=n((d,c)=>({type:"textDirective",name:d,children:[{type:"text",value:c}],data:_("span",{className:["cf-demo-tooltip"],ariaHidden:!0,dataCfDemoTooltip:""})}),"tooltip"),i=[{type:"textDirective",name:"canofold-demo-open",children:[s("canofold-demo-open-icon","cf-demo-open-icon"),l("canofold-demo-open-tooltip",t.openPreview)],data:_("a",{className:["cf-demo-action","cf-demo-open"],href:`?canofold-demo=${e.id}`,target:"_blank",rel:"noopener noreferrer",ariaLabel:t.openPreview})},{type:"textDirective",name:"canofold-demo-source-toggle",children:[s("canofold-demo-source-icon","cf-demo-source-icon"),l("canofold-demo-source-tooltip",t.showSource)],data:_("button",{className:["cf-demo-action","cf-demo-source-toggle"],type:"button",ariaLabel:t.showSource,ariaControls:o,ariaExpanded:!1,dataCfDemoSourceToggle:"",dataCfDemoShowLabel:t.showSource,dataCfDemoHideLabel:t.hideSource})}];return{type:"containerDirective",name:"canofold-demo-card",data:_("figure",{className:["cf-demo"],dataCfComponent:"demo",dataCfDemoId:e.id,dataCfDemoSandbox:e.sandbox,...e.title?{ariaLabelledBy:r}:{},...!e.title&&e.description?{ariaLabel:e.description}:{}}),children:[{type:"paragraph",data:_("div",{className:["cf-demo-preview"],dataCfDemoPreview:"",dataCfDemoId:e.id,dataCfDemoLoadingLabel:t.loading,dataCfDemoFailedLabel:t.failed}),children:[]},...a.length>0?[{type:"paragraph",data:_("div",{className:["cf-demo-details"]}),children:a}]:[],{type:"paragraph",data:_("div",{className:["cf-demo-toolbar"]}),children:i},{type:"containerDirective",name:"canofold-demo-source",data:_("div",{id:o,className:["cf-demo-source"],hidden:!0,dataCfDemoSource:""}),children:[{type:"code",lang:e.language,meta:`filename=${JSON.stringify(e.specifier)}`,value:e.source}]}]}}n(pn,"demoNode");function fn(e,t,o,r){let a=o.attributes?.src?.trim(),s=o.position?.start?.line,l=o.position?.start?.column,i=e.demos.find(c=>!r.has(c.id)&&c.specifier===a&&(s===void 0||c.line===s)&&(l===void 0||c.column===l));if(!i)return;let d=t.demos[i.id];if(!d)throw new Error(`Demo engine did not prepare ${i.specifier} for ${e.sourceRelativePath}`);return r.add(i.id),d}n(fn,"matchingDemo");function hn(e,t,o,r){let a=new Set,s=n(l=>{l.children&&l.children.forEach((i,d)=>{if(i.type==="leafDirective"&&i.name==="demo"){let c=fn(t,o,i,a);if(!c)throw new Error(`Could not match demo directive in ${t.sourceRelativePath}`);l.children[d]=pn(c,r);return}s(i)})},"walk");s(e)}n(hn,"transformDemoNodes");function Fo({page:e,manifest:t,labels:o}){let r=e.demos.flatMap(a=>{let s=t.demos[a.id];return s?[s]:[]});return{name:"canofold-demo-renderer",version:"2",cacheKey:{page:e.sourceRelativePath,demos:r.map(a=>[a.id,mn("sha256").update(a.source).digest("hex")])},directiveNames:["demo"],highlightLanguages:[...new Set(r.map(a=>a.language))],remarkPlugins:[()=>a=>hn(a,e,t,o)]}}n(Fo,"createDemoMarkdownPlugin");var gn={openPreview:"Open in new window",showSource:"Show source",hideSource:"Hide source",loading:"Loading example\u2026",failed:"This example could not be loaded."};function _o(e){return e.toLowerCase().startsWith("zh")?{openPreview:"\u5728\u65B0\u7A97\u53E3\u6253\u5F00",showSource:"\u67E5\u770B\u4EE3\u7801",hideSource:"\u6536\u8D77\u4EE3\u7801",loading:"\u6B63\u5728\u52A0\u8F7D\u793A\u4F8B\u2026",failed:"\u793A\u4F8B\u52A0\u8F7D\u5931\u8D25\u3002"}:gn}n(_o,"demoLabelsFor");import{copyFile as ce,cp as qo,lstat as yn,mkdir as Ne,readFile as Qe,readdir as Ho,realpath as Bo,rm as jo,stat as wn}from"fs/promises";import{createRequire as zo}from"module";import{dirname as de,join as U,posix as K,relative as bn,resolve as le}from"path";import{analyzeMarkdown as kn}from"@canofold/markdown/server/analyze";var Ze=zo(import.meta.url);async function vn(e,t){await qo(e,t,{recursive:!0,filter:n(async o=>(await wn(o)).isDirectory()||o.endsWith(".js"),"filter")})}n(vn,"copyJavaScriptDirectory");async function Go(e){let t=Ze.resolve("@canofold/markdown/client"),o=U(e,"assets/canofold-markdown");await vn(de(t),o)}n(Go,"copyMarkdownClient");var Pn=/^[a-z0-9]+(?:-[a-z0-9]+)*$/;function Uo(e,t,o){if(!Pn.test(t.id))throw new Error(`Invalid Markdown plugin ${o} id: ${t.id}`);let r=e.get(t.id);if(r&&JSON.stringify(r)!==JSON.stringify(t))throw new Error(`Markdown plugin ${o} id "${t.id}" is declared by both "${r.module}" and "${t.module}"`);e.set(t.id,t)}n(Uo,"registerPluginAsset");function Ye(e,t){if(!e||e.startsWith("/")||e.includes("\\")||e.split("/").some(o=>o===""||o==="."||o===".."))throw new Error(`Invalid Markdown plugin ${t} path: ${e}`)}n(Ye,"assertSafePluginResourcePath");async function Ko(e,t,o){await Ne(t,{recursive:!0});for(let r of await Ho(e,{withFileTypes:!0})){if(r.isSymbolicLink())throw new Error(`Markdown plugin resources must not use symbolic links: ${U(e,r.name)}`);let a=U(e,r.name),s=U(t,r.name);r.isDirectory()?await Ko(a,s,o):r.isFile()&&(!o.extensions||o.extensions.some(l=>r.name.endsWith(l)))&&await ce(a,s)}}n(Ko,"copyPluginResourceDirectory");async function Sn(e,t){let o=Ze.resolve(t.module);if(await ce(o,U(e,`${t.id}.js`)),!t.resources?.length)return;let r=U(e,t.id),a=zo(o);for(let s of t.resources){Ye(s.output,"resource output");let l=a.resolve(s.module),i=le(r,s.output);if(!re(r,i))throw new Error(`Markdown plugin resource output escapes its client directory: ${s.output}`);await Ne(de(i),{recursive:!0}),await ce(l,i);for(let d of s.directories??[]){Ye(d.source,"resource source"),Ye(d.output,"resource directory output");let c=de(l),p=le(c,d.source),f=le(r,d.output);if(!re(c,p)||!re(r,f))throw new Error(`Markdown plugin resource directory escapes its declared root: ${d.source}`);await Ko(p,f,d)}}}n(Sn,"copyMarkdownPluginClient");function me(e,t,o){e.pluginClients.forEach(r=>Uo(t,r,"client")),e.pluginStyles.forEach(r=>Uo(o,r,"style"))}n(me,"registerPluginAssets");async function Wo(e,t,o){let r=U(e,"assets/canofold-plugins");await jo(r,{recursive:!0,force:!0}),!(t.size===0&&o.size===0)&&(await Ne(r,{recursive:!0}),await Promise.all([...[...t.values()].map(a=>Sn(r,a)),...[...o.values()].map(a=>ce(Ze.resolve(a.module),U(r,`${a.id}.css`)))]))}n(Wo,"copyMarkdownPluginAssets");async function et(e,t){try{await qo(e,t,{recursive:!0,force:!0})}catch(o){throw new Error(`Failed to copy required KaTeX fonts from ${e}`,{cause:o})}}n(et,"copyRequiredMathFonts");async function tt(e,t){let o=[];async function r(s,l){for(let i of await Ho(s,{withFileTypes:!0})){if(i.isSymbolicLink())throw new Error(`Public assets must not be symbolic links: ${K.join(l,i.name)}`);let d=U(s,i.name),c=K.join(l,i.name);i.isDirectory()?await r(d,c):i.isFile()&&o.push({source:d,outputPath:c})}}n(r,"walk");let a=new Set(t.versions.items.map(s=>s.docsDir));for(let s of a){let l=U(V(e,s,`public directory for ${s}`),"public");try{await r(l,"")}catch(i){if(i.code!=="ENOENT")throw i}}return o}n(tt,"collectPublicAssets");function Vo(e){let t=kn(e);return[...new Set([...t.images,...t.links])].map(o=>(o.split("#")[0]??"").split("?")[0]??"").filter(o=>o&&!o.startsWith("/")&&!/^(?:[a-z][a-z\d+.-]*:|\/\/|#)/i.test(o)&&!/\.mdx?$/i.test(o))}n(Vo,"relativeAssetTargets");function Jo(e){return e.split("/").map(t=>{let o=decodeURIComponent(t);if(o.includes("/")||o.includes("\\"))throw new Error(`Invalid relative asset path: ${e}`);return o}).join("/")}n(Jo,"decodeRelativeUrlPath");async function ot(e,t){let o=[];for(let r of t){let a=V(e,r.docsDir,"docsDir"),s=await Bo(a);for(let l of Vo(r.body)){let i=Jo(l),d=le(de(r.sourcePath),i),c;try{c=await yn(d)}catch(u){if(u.code==="ENOENT")continue;throw u}if(c.isSymbolicLink())throw new Error(`Relative assets must not use symbolic links: ${l}`);if(!c.isFile())continue;let p=await Bo(d),f=le(s,bn(a,d));if(F(p)!==F(f))throw new Error(`Relative assets must not use symbolic links: ${l}`);if(!re(s,p))throw new Error(`Relative asset must stay inside docsDir: ${l}`);o.push({source:p,outputPath:K.resolve("/",K.dirname(r.outputPath),i).slice(1)})}}return o}n(ot,"collectPageAssets");function ue(e){let t=new Set;for(let o of e){if("assetOutputPaths"in o&&o.assetOutputPaths){o.assetOutputPaths.forEach(r=>t.add(r));continue}if("body"in o)for(let r of Vo(o.body)){let a=Jo(r);t.add(K.resolve("/",K.dirname(o.outputPath),a).slice(1))}}return t}n(ue,"pageAssetOutputPathsFor");async function Xo(e,t,o,r){if(!t.length)return;let a=new Set([...ue(o),...r].map(F)),s=[...ue(t)].filter(l=>!a.has(F(l)));await Promise.all(s.map(l=>jo(R(e,l,`stale page asset ${l}`),{force:!0})))}n(Xo,"removeStalePageAssets");async function rt(e,t,o){let r=new Set([...o].map(F)),a=n(c=>{let p=[],f=K.dirname(c);for(;f!==".";)p.push(f),f=K.dirname(f);return p},"ancestorsOf"),s=new Set([...r].flatMap(c=>a(c))),l=Mt.map(F),i=new Map,d=new Set;for(let c of t){let p=F(c.outputPath),f=a(p);if(r.has(p)||s.has(p)||f.some(w=>r.has(w))||l.some(w=>p===w||p.startsWith(`${w}/`)))throw new Error(`Static asset conflicts with generated output: ${c.outputPath}`);let u=i.get(p);if(u&&u!==c.source){let[w,P]=await Promise.all([Qe(u),Qe(c.source)]);if(!w.equals(P))throw new Error(`Multiple static assets target the same output path: ${c.outputPath}`)}if(u)continue;if(d.has(p)||f.some(w=>i.has(w)))throw new Error(`Multiple static assets target overlapping output paths: ${c.outputPath}`);i.set(p,c.source);for(let w of f)d.add(w);let b=R(e,c.outputPath,`static asset ${c.outputPath}`);await Ne(de(b),{recursive:!0}),await ce(c.source,b)}}n(rt,"copyStaticAssets");async function Yo(e,t){return t.length?(await Promise.all(t.map(async r=>{let a=await Qe(V(e,r,"styles entry"),"utf8");return`/* User style: ${r} */
658
+ ${a}`}))).join(`
659
+ `):""}n(Yo,"readCustomStyles");import{Fragment as Rn,jsx as st,jsxs as Tn}from"react/jsx-runtime";var Dn={behaviors:[],math:!1,pluginClients:[],pluginStyles:[]};function Nn(e,t){let o=new Map,r=new Map;me(e,o,r);for(let a of t)me({behaviors:[],math:a.assets?.math===!0,pluginClients:[...a.assets?.clients??[]],pluginStyles:[...a.assets?.styles??[]]},o,r);return{behaviors:e.behaviors,math:e.math||t.some(a=>a.assets?.math===!0),pluginClients:[...o.values()],pluginStyles:[...r.values()]}}n(Nn,"playgroundMarkdownAssets");function An(e){return JSON.stringify(e).replace(/</g,"\\u003c").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}n(An,"jsonForInlineScript");function Ln(e,t){let o=t.defaultLocale,r=_e(o,e.i18n.messages),a=H(e.title),s=H(h(e,e.theme.favicon??we.favicon)),l=H(h(e,"/assets/canofold.css")),i=t.versions.find(P=>P.id===t.currentVersion),d=h(e,z(o,t.defaultLocale,i?.base??"/")),c=H(d),p=H(r.title),f=H(r.description),u=H(r.home),b=t.versions.flatMap(P=>t.locales.map(y=>{let C=_e(y,e.i18n.messages),m=h(e,z(y,t.defaultLocale,P.base));return{locale:y,prefix:m,home:m,title:C.title,description:C.description,homeLabel:C.home,documentTitle:`404 - ${C.title} | ${e.title}`}})).sort((P,y)=>y.prefix.length-P.prefix.length),w=`(function(){var p=${An(b)},n=location.pathname,m=p.find(function(x){var r=x.prefix.replace(//$/,'');return n===r||n.indexOf(x.prefix)===0});if(!m)return;document.documentElement.lang=m.locale;document.title=m.documentTitle;var t=document.getElementById('canofold-404-title'),d=document.getElementById('canofold-404-description'),h=document.getElementById('canofold-404-home');if(t)t.textContent=m.title;if(d)d.textContent=m.description;if(h){h.textContent=m.homeLabel;h.setAttribute('href',m.home)}})()`;return`<!doctype html><html lang="${H(o)}"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>404 - ${p} | ${a}</title><meta name="robots" content="noindex"><link rel="icon" href="${s}"><link rel="stylesheet" href="${l}"><script>${xe}</script></head><body><div class="cf-not-found"><span class="cf-not-found-code">404</span><h1 id="canofold-404-title" class="cf-not-found-title">${p}</h1><p id="canofold-404-description" class="cf-not-found-desc">${f}</p><a id="canofold-404-home" href="${c}" class="cf-not-found-link">${u}</a></div><script>${w}</script></body></html>`}n(Ln,"render404Page");async function er({cwd:e,config:t,graph:o,pages:r=o.pages,previousPages:a=[],renderer:s=Mn(),writeSharedAssets:l=!0,demoManifest:i}){let d=$(e,t.outputDir),c=Dt(t,o),p=o.pages.some(m=>m.frontmatter.layout==="playground"),f=[];if(await at(X(d,"assets"),{recursive:!0}),l){let m=p&&t.markdown.plugins.some(q=>q.assets?.math===!0)||o.pages.some(q=>Zo(q.body,t.markdown.plugins,W(q.relativePath)?"mdx":"markdown").math),[x,M]=await Promise.all([Xt({math:m}),Yo(e,t.styles)]);await bo(d),await Ae(X(d,"assets/canofold.css"),`${x}
660
+ ${$o(t)}
661
+ ${M}
662
+ `),await xn(Jt(),X(d,"assets/file-icons"),{recursive:!0,force:!0});let E=X(d,"assets/fonts");if(m){let q=Vt();await et(q,E)}else await nt(E,{recursive:!0,force:!0});t.search.enabled&&await Ao(d),p?await Io(e,d,t):await nt(X(d,"assets/canofold-playground"),{recursive:!0,force:!0});let[Y,ye]=await Promise.all([tt(e,t),ot(e,o.pages)]);f=Y,await rt(d,[...f,...ye],c),await Ae(X(d,"404.html"),Ln(t,o))}else{let[m,x]=await Promise.all([tt(e,t),ot(e,r)]);f=m,await rt(d,x,c)}let u=l?r:o.pages,b=new Map,w=new Map,P=new Set;u.forEach(m=>{let x=Zo(m.body,t.markdown.plugins,W(m.relativePath)?"mdx":"markdown");me(x,b,w),x.behaviors.forEach(M=>P.add(M))});let y=8,C=Oo(t.basePath);await O(r,y,async m=>{let x=m.routePath===z(m.locale,o.defaultLocale,m.versionBase),M,E=Dn,Y=_o(m.locale),ye=m.demos.length>0&&i?Fo({page:m,manifest:i,labels:Y}):void 0;if(m.demos.length>0&&!i)throw new Error(`No prepared demo manifest is available for ${m.sourceRelativePath}`);let q={...t.markdown,plugins:ye?[...t.markdown.plugins,ye]:t.markdown.plugins,locale:m.locale,labels:{...Pe(m.locale,t.i18n.messages),...t.markdown.labels}};if(W(m.relativePath)){let Q={...q,html:"trusted"},gt=await No(m.body,m.sourcePath,e,Q,void 0,C,s);M=gt.content,E=gt.assets}else{let Q=await s.render(m.body,{markdown:q,as:"article",urlTransform:C});M=Q.content,E=Q.assets}m.frontmatter.layout==="playground"&&(E=Nn(E,t.markdown.plugins)),me(E,b,w),E.behaviors.forEach(Q=>P.add(Q));let yr=!!(m.frontmatter.hero||m.frontmatter.features?.length),wr=m.body.trim().length>0,br=x?Tn(Rn,{children:[yr?st(Qt,{page:m,config:t}):null,wr?M:null]}):M??st("article",{className:"cf-content"}),pt=R(d,m.markdownOutputPath,`page ${m.sourceRelativePath}`),ft=m.transformedSource,kr="<!doctype html>"+Cn(st(go,{config:t,graph:o,page:m,home:x,markdownAssets:E,rawSource:ft,demoClientUrl:m.demos.length>0?i?.clientUrl:void 0,demoStyleUrls:m.demos.length>0?i?.styleUrls:void 0,children:br})),ht=R(d,m.outputPath,`page ${m.sourceRelativePath}`);await at(Qo(ht),{recursive:!0}),await Ae(ht,kr),await at(Qo(pt),{recursive:!0}),await Ae(pt,ft)}),P.size>0?await Go(d):await nt(X(d,"assets/canofold-markdown"),{recursive:!0,force:!0}),await Wo(d,b,w),await Xo(d,a,o.pages,[...c,...f.map(m=>m.outputPath)])}n(er,"renderSite");import{writeFile as En}from"fs/promises";import{join as $n}from"path";async function tr(e,t){let o=J(t,"/sitemap.xml");await En($n($(e,t.outputDir),"robots.txt"),`User-agent: *
663
+ Allow: /
664
+ ${o?`Sitemap: ${o}
665
+ `:""}`)}n(tr,"writeRobots");import{writeFile as On}from"fs/promises";import{join as In}from"path";async function or(e,t,o){if(!t.siteUrl)return;let r=n(s=>s.replace(/[&<>"']/g,l=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&apos;"})[l]??l),"escapeXml"),a=o.pages.map(s=>` <url><loc>${r(J(t,s.routePath))}</loc></url>`).join(`
666
+ `);await On(In($(e,t.outputDir),"sitemap.xml"),`<?xml version="1.0" encoding="UTF-8"?>
667
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
668
+ ${a}
669
+ </urlset>
670
+ `)}n(or,"writeSitemap");import{createMarkdownRenderer as rs}from"@canofold/markdown/server";import{satisfies as as,valid as ns,validRange as ss}from"semver";function rr({current:e,previous:t,outputExists:o,outputValid:r=o,forceClean:a=!1}){if(a)return{mode:"clean",changedPageKeys:Object.keys(e.pages),removedPageKeys:[],reason:"forced"};if(!t)return{mode:"clean",changedPageKeys:Object.keys(e.pages),removedPageKeys:[],reason:"missing-manifest"};if(!o)return{mode:"clean",changedPageKeys:Object.keys(e.pages),removedPageKeys:Object.keys(t.pages).filter(i=>!e.pages[i]),reason:"missing-output"};if(!r)return{mode:"clean",changedPageKeys:Object.keys(e.pages),removedPageKeys:Object.keys(t.pages).filter(i=>!e.pages[i]),reason:"invalid-output"};if(e.buildFingerprint===t.buildFingerprint)return{mode:"cached",changedPageKeys:[],removedPageKeys:[],reason:"unchanged-inputs"};if(e.sharedFingerprint!==t.sharedFingerprint)return{mode:"clean",changedPageKeys:Object.keys(e.pages),removedPageKeys:Object.keys(t.pages).filter(i=>!e.pages[i]),reason:"shared-inputs-changed"};let s=Object.entries(e.pages).filter(([i,d])=>t.pages[i]?.fingerprint!==d.fingerprint).map(([i])=>i),l=Object.keys(t.pages).filter(i=>!e.pages[i]);return s.length===0&&l.length===0?{mode:"clean",changedPageKeys:Object.keys(e.pages),removedPageKeys:[],reason:"unclassified-inputs-changed"}:{mode:"incremental",changedPageKeys:s,removedPageKeys:l,reason:"page-inputs-changed"}}n(rr,"planBuild");import{copyFile as Fn,mkdir as _n,readFile as ar,readdir as Bn,stat as Un}from"fs/promises";import{dirname as qn,relative as Hn,resolve as it}from"path";var lt=16;function nr(e,t){return Hn(it(e),it(t)).replace(/\\/g,"/")}n(nr,"portablePath");async function sr(e){async function t(o){let r=await Bn(o,{withFileTypes:!0});return(await Promise.all(r.map(async a=>{let s=it(o,a.name);if(a.isSymbolicLink())throw new Error(`Generated output must not be a symbolic link: ${s}`);return a.isDirectory()?t(s):a.isFile()?[s]:[]}))).flat()}return n(t,"walk"),t(e)}n(sr,"outputFilesUnder");async function ir(e){let t=(await sr(e)).sort(),o=await O(t,lt,async r=>{let a=await ar(r);return[nr(e,r),{fingerprint:B(a),size:a.byteLength}]});return Object.fromEntries(o)}n(ir,"captureBuildOutputs");async function lr(e,t){try{let o=Object.keys(t).sort(),r=(await sr(e)).map(s=>nr(e,s)).sort();return r.length!==o.length||r.some((s,l)=>s!==o[l])?!1:(await O(Object.entries(t),lt,async([s,l])=>{let i=R(e,s,`cached output ${s}`),d=await Un(i);return!d.isFile()||d.size!==l.size?!1:B(await ar(i))===l.fingerprint})).every(Boolean)}catch(o){if(o.code==="ENOENT")return!1;throw o}}n(lr,"verifyBuildOutputs");async function cr(e,t,o){await O(Object.keys(o),lt,async r=>{let a=R(e,r,`cached output ${r}`),s=R(t,r,`staged output ${r}`);await _n(qn(s),{recursive:!0}),await Fn(a,s)})}n(cr,"copyBuildOutputs");import{readFile as Le,readdir as zn}from"fs/promises";import{dirname as dr,join as te,relative as Gn,resolve as he}from"path";import{fileURLToPath as ct}from"url";import{detectMarkdownAssets as Kn}from"@canofold/markdown/server/analyze";var pe=16;function Re(e,t){return Gn(he(e),he(t)).replace(/\\/g,"/")}n(Re,"portablePath");function fe(e){return JSON.stringify([e.version,e.sourceRelativePath])}n(fe,"buildPageKey");async function ur(e){async function t(o){let r=await zn(o,{withFileTypes:!0});return(await Promise.all(r.map(async a=>{let s=te(o,a.name);if(a.isDirectory())return t(s);if(a.isSymbolicLink())throw new Error(`Documentation support files must not use symbolic links: ${Re(e,s)}`);return!a.isFile()||/\.mdx?$/i.test(a.name)?[]:[s]}))).flat()}return n(t,"walk"),t(e)}n(ur,"supportFilesUnder");async function mr(e){let t=[...new Set(e.map(r=>he(r)))].sort(),o=(await O(t,pe,async r=>{try{return{path:r,fingerprint:B(await Le(r))}}catch(a){if(!a||typeof a!="object"||!("code"in a)||a.code!=="ENOENT")throw a;return null}})).filter(r=>r!==null);return G(o)}n(mr,"fingerprintExistingFiles");async function dt(e){try{return await ur(e)}catch(t){if(t&&typeof t=="object"&&"code"in t&&t.code==="ENOENT")return[];throw t}}n(dt,"filesUnderIfPresent");async function Wn(){let e=dr(ct(import.meta.url)),t=[];try{let o=ct(import.meta.resolve("@canofold/markdown/theme")),r=dr(o);t.push(te(r,"tokens.css"),te(r,"styles.css"),te(r,"theme.css"),te(r,"base.css"),o)}catch{}return mr([...await dt(e),...await dt(te(e,"render")),...await dt(ct(new URL("../render",import.meta.url))),...t])}n(Wn,"runtimeFingerprint");async function Vn(e,t,o){let r=[...new Set(t.versions.items.map(i=>i.docsDir))].map(i=>V(e,i,"docsDir")),a=(await Promise.all(r.map(i=>ur(i)))).flat();for(let i of t.styles)a.push(V(e,i,"styles"));let s=[...new Set(a.map(i=>he(i)))].filter(i=>!o.has(i)).sort(),l=await O(s,pe,async i=>({path:Re(e,i),fingerprint:B(await Le(i))}));return G(l)}n(Vn,"supportFingerprint");function Jn(e){return{sourceRelativePath:e.sourceRelativePath,relativePath:e.relativePath,version:e.version,versionBase:e.versionBase,docsDir:e.docsDir,locale:e.locale,routePath:e.routePath,outputPath:e.outputPath,markdownOutputPath:e.markdownOutputPath,title:e.title,description:e.description,order:e.order,group:e.group,status:e.status,search:e.search,ai:e.ai,body:e.body,transformedSource:e.transformedSource,headings:e.headings,searchText:e.searchText,codeExamples:e.codeExamples,demos:e.demos,lastUpdated:e.lastUpdated,...e.previous?{previous:e.previous}:{},...e.next?{next:e.next}:{},frontmatter:e.frontmatter}}n(Jn,"serializablePage");function Xn(e,t){return{sidebar:e.sidebar[t.version]?.[t.locale]??[],nav:e.nav[t.version]?.[t.locale]??[],locales:e.locales,defaultLocale:e.defaultLocale,versions:e.versions,currentVersion:e.currentVersion}}n(Xn,"pageLayoutContext");function Yn(e){let t=e.search.provider;return{...e,demos:{setup:e.demos.setup??null,engine:e.demos.engine?{id:e.demos.engine.id,version:e.demos.engine.version??"",cacheKey:e.demos.engine.cacheKey??null}:null},markdown:{...e.markdown,plugins:e.markdown.plugins.map(o=>({name:o.name,version:o.version??"",cacheKey:o.cacheKey??null}))},search:{...e.search,provider:typeof t=="string"?t:{id:t.id,client:t.client,version:t.version??"",cacheKey:t.cacheKey??null}}}}n(Yn,"serializableConfig");async function pr(e,t,o,r=G({extensions:[]}),a,s="build"){let l=new Map;await O(o.pages,pe,async u=>{let b=W(u.relativePath)?await Mo(Ce(u.body).imports,u.sourcePath,e):[],w=await O(b,pe,async P=>({path:Re(e,P),fingerprint:B(await Le(P))}));for(let P of u.demos){let y=a?.demos[P.id];if(!y)continue;let C=y.dependencyPaths?.length?y.dependencyPaths:[y.modulePath];w.push(...await O(C,pe,async m=>({path:Re(e,m),fingerprint:B(await Le(m))})))}w.length!==0&&l.set(fe(u),[...new Map(w.map(P=>[P.path,P])).values()].sort((P,y)=>P.path.localeCompare(y.path)))});let i=new Set([...l.values()].flat().map(u=>he(e,u.path))),d=G(Yn(t)),c=G({canofoldVersion:j,runtimeFingerprint:await Wn(),configFingerprint:d,benchmarkReport:process.env.CANOFOLD_BENCHMARK_REPORT==="1",extensionFingerprint:r,math:o.pages.some(u=>Kn(u.body,t.markdown.plugins,W(u.relativePath)?"mdx":"markdown").math),playground:o.pages.some(u=>u.frontmatter.layout==="playground"),support:await Vn(e,t,i),demoDelivery:a?s:null,demoRuntime:a?{clientUrl:a.clientUrl,styleUrls:a.styleUrls??[],outputPaths:a.outputPaths??[]}:null,demoEngineDependencies:await mr(a?.dependencyPaths??[])}),p=Object.fromEntries(o.pages.map(u=>[fe(u),{fingerprint:G({page:Jn(u),localComponents:l.get(fe(u))??[],layout:Xn(o,u)}),outputPath:u.outputPath,markdownOutputPath:u.markdownOutputPath,assetOutputPaths:[...ue([u])].sort()}])),f=G({sharedFingerprint:c,pages:p});return{schemaVersion:3,canofoldVersion:j,buildFingerprint:f,sharedFingerprint:c,pages:p,outputs:{}}}n(pr,"createBuildManifest");function is(e,t){if(!ns(e))throw new Error(`Invalid Canofold version: ${e}`);if(!ss(t))throw new Error(`Invalid requiredVersion range: ${t}`);return as(e,t)}n(is,"versionSatisfies");function ls(e){if(e.requiredVersion&&!is(j,e.requiredVersion))throw new Error(`Canofold ${j} does not satisfy requiredVersion ${e.requiredVersion}`)}n(ls,"assertRequiredVersion");async function fr({cwd:e,config:t,graph:o,pages:r,previousPages:a,renderer:s,writeSharedAssets:l,extensions:i,demoManifest:d}){await er({cwd:e,config:t,graph:o,pages:r,previousPages:a,renderer:s,writeSharedAssets:l,demoManifest:d}),await Ct(e,t,o),await or(e,t,o),await tr(e,t),await Ut(e,t,o),await St(e,t,o),await i.generate($(e,t.outputDir),o.pages),process.env.CANOFOLD_BENCHMARK_REPORT==="1"&&await es(mt($(e,t.outputDir),".benchmark.json"),JSON.stringify({maxRssBytes:process.resourceUsage().maxRSS*1024}))}n(fr,"writeBuildOutputs");function gr(e){return mt(ut(e),`.${hr(e)}.backup`)}n(gr,"outputBackupRoot");async function cs(e){let t=gr(e);await Z(t)&&(await Z(e)?await ge(t,{recursive:!0,force:!0}):await Te(t,e))}n(cs,"recoverInterruptedOutputReplacement");async function ds(e,t){let o=gr(e),r=await Z(e);try{r&&await Te(e,o),await Te(t,e)}catch(a){throw r&&await Z(o)&&(await ge(e,{recursive:!0,force:!0}),await Te(o,e)),a}await ge(o,{recursive:!0,force:!0})}n(ds,"replaceOutputDirectory");async function us(e,t,o,r){let a=$(e,t.outputDir),s=new Set(r.flatMap(l=>[l.outputPath,l.markdownOutputPath]).map(F));await Promise.all(o.flatMap(l=>[l.outputPath,l.markdownOutputPath].filter(i=>!s.has(F(i))).map(i=>ge(R(a,i,`removed page output ${i}`),{force:!0}))))}n(us,"removeDeletedPageOutputs");async function ms(e,t,o,r,a){await cs(r);let s=await $t(e.cwd,At(e.cwd),o.extensions),l=await Pt(e.cwd,o,s),i=await be({cwd:e.cwd,config:o,graph:l,mode:e.demoMode==="dev"?"dev":"analyze"}),d=await pr(e.cwd,o,l,s.fingerprint,i,e.demoMode==="dev"?"dev":"build"),c=e.noCache?void 0:await Lt(t),p=await Z(r),f=p&&c?await lr(r,c.outputs):p,u=rr({current:d,previous:c,outputExists:p,outputValid:f,forceClean:e.forceClean||e.noCache}),b=e.renderer??rs();if(u.mode==="cached")return oe(`Built ${o.outputDir} (cache hit)`),{config:o,graph:l,incremental:!1,cached:!0,mode:u.mode,changedPages:[],partialReload:!1,reason:u.reason,...i?{demoManifest:i}:{}};let w=new Map(l.pages.map(x=>[fe(x),x])),P=u.changedPageKeys.flatMap(x=>{let M=w.get(x);return M?[M]:[]}),y=mt(ut(r),`.${hr(r)}.tmp-${Qn()}`),C={...o,outputDir:ts(os(e.cwd),y)};await Zn(ut(y),{recursive:!0});try{let x;if(u.mode==="incremental"){await cr(r,y,c?.outputs??{}),x=e.demoMode==="dev"?i:await be({cwd:e.cwd,config:C,graph:l,mode:"build"}),await fr({cwd:e.cwd,config:C,graph:l,pages:P,previousPages:c?Object.values(c.pages):[],renderer:b,writeSharedAssets:!1,extensions:s,demoManifest:x});let M=u.removedPageKeys.flatMap(E=>{let Y=c?.pages[E];return Y?[Y]:[]});await us(e.cwd,C,M,Object.values(d.pages))}else x=e.demoMode==="dev"?i:await be({cwd:e.cwd,config:C,graph:l,mode:"build"}),b.clear(),await fr({cwd:e.cwd,config:C,graph:l,pages:l.pages,renderer:b,writeSharedAssets:!0,extensions:s,demoManifest:x});await a(),await ds(r,y)}finally{await ge(y,{recursive:!0,force:!0})}let m={...d,outputs:await ir(r)};return await a(),await Rt(t,m),oe(`Built ${o.outputDir} (${u.mode}: ${u.reason})`),{config:o,graph:l,incremental:u.mode==="incremental",cached:!1,mode:u.mode,changedPages:[...new Set(P.map(x=>x.sourceRelativePath))],partialReload:u.mode==="incremental"&&u.changedPageKeys.length===1&&u.removedPageKeys.length===0&&c?.pages[u.changedPageKeys[0]??""]?.outputPath===d.pages[u.changedPageKeys[0]??""]?.outputPath,reason:u.reason,...i?{demoManifest:i}:{}}}n(ms,"runBuildLocked");async function od(e){let t=Nt(e.cwd);await yt(e.cwd,t,"build cache");let o=await kt(e.cwd);ls(o);let r=await Et(e.cwd,o,t);return Tt(t,a=>ms(e,t,o,r,a))}n(od,"runBuild");export{is as a,od as b};
671
+ //# sourceMappingURL=chunk-OKX7SQKX.js.map