@beforesemicolon/builder 1.8.18 → 1.8.20

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.
@@ -1,4 +1,4 @@
1
- "use strict";var he=Object.create;var j=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var m=(e,t)=>j(e,"name",{value:t,configurable:!0});var Se=(e,t)=>{for(var r in t)j(e,r,{get:t[r],enumerable:!0})},Q=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ye(t))!ve.call(e,n)&&n!==r&&j(e,n,{get:()=>t[n],enumerable:!(a=ge(t,n))||a.enumerable});return e};var w=(e,t,r)=>(r=e!=null?he(we(e)):{},Q(t||!e||!e.__esModule?j(r,"default",{value:e,enumerable:!0}):r,e)),De=e=>Q(j({},"__esModule",{value:!0}),e);var Ue={};Se(Ue,{buildDocs:()=>Ne});module.exports=De(Ue);const ze={};var se=require("marked"),c=require("fs/promises"),o=w(require("path"),1),re=w(require("front-matter"),1),oe=w(require("isomorphic-dompurify"),1),ae=require("marked-highlight"),_=w(require("highlight.js"),1),ne=w(require("./templates/default.template.js"),1),ie=w(require("./renderer/index.js"),1),le=require("./markdown-layout/index.js"),ce=w(require("clean-css"),1),me=w(require("html-minifier"),1),X=w(require("@putout/minify"),1),$=require("url"),f=w(require("fs"),1);let V,A="";const Y=new ce.default({inline:["none"]}),R=new Map;R.set("default",ne.default);let W;const Z=m((e,t)=>t===!1?!1:t===void 0?e:e===!1||e===void 0?t:{...e,...t},"mergeThemeMode"),be=m((e,t)=>{if(!(!e&&!t))return{light:Z(e?.light,t?.light),dark:Z(e?.dark,t?.dark)}},"mergeTheme"),xe=m((e,t)=>({...e,...t,markdownLayouts:{...e.markdownLayouts,...t.markdownLayouts},scripts:{...e.scripts,...t.scripts},theme:be(e.theme,t.theme)}),"mergeTemplateConfig"),$e=m((e,t)=>{if(typeof e=="function")return!0;const{match:r}=e;return r?typeof r=="string"?t.includes(r):Array.isArray(r)?r.some(a=>t.includes(a)):r instanceof RegExp?r.test(t):r(t):!0},"scriptMatches"),Pe=m((e,t)=>e?Object.values(e).filter(r=>r!==!1).filter(r=>$e(r,t)).map(r=>typeof r=="function"?r():r.render()):[],"renderPageScripts"),G=m((e,t)=>{const r=Object.entries(t).filter(([a])=>a.startsWith("--")).map(([a,n])=>` ${a}: ${n};`).join(`
1
+ "use strict";var he=Object.create;var j=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,ve=Object.prototype.hasOwnProperty;var m=(e,t)=>j(e,"name",{value:t,configurable:!0});var Se=(e,t)=>{for(var r in t)j(e,r,{get:t[r],enumerable:!0})},Q=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ye(t))!ve.call(e,n)&&n!==r&&j(e,n,{get:()=>t[n],enumerable:!(a=ge(t,n))||a.enumerable});return e};var w=(e,t,r)=>(r=e!=null?he(we(e)):{},Q(t||!e||!e.__esModule?j(r,"default",{value:e,enumerable:!0}):r,e)),De=e=>Q(j({},"__esModule",{value:!0}),e);var Ue={};Se(Ue,{buildDocs:()=>Ne});module.exports=De(Ue);const ze={};var se=require("marked"),c=require("fs/promises"),o=w(require("path"),1),re=w(require("front-matter"),1),oe=w(require("isomorphic-dompurify"),1),ae=require("marked-highlight"),_=w(require("highlight.js"),1),ne=w(require("./templates/default.template.js"),1),ie=w(require("./renderer/index.js"),1),le=require("./markdown-layout/index.js"),ce=w(require("clean-css"),1),me=w(require("html-minifier"),1),X=w(require("@putout/minify"),1),$=require("url"),p=w(require("fs"),1);let V,A="";const Y=new ce.default({inline:["none"]}),R=new Map;R.set("default",ne.default);let W;const Z=m((e,t)=>t===!1?!1:t===void 0?e:e===!1||e===void 0?t:{...e,...t},"mergeThemeMode"),be=m((e,t)=>{if(!(!e&&!t))return{light:Z(e?.light,t?.light),dark:Z(e?.dark,t?.dark)}},"mergeTheme"),xe=m((e,t)=>({...e,...t,markdownLayouts:{...e.markdownLayouts,...t.markdownLayouts},scripts:{...e.scripts,...t.scripts},theme:be(e.theme,t.theme)}),"mergeTemplateConfig"),$e=m((e,t)=>{if(typeof e=="function")return!0;const{match:r}=e;return r?typeof r=="string"?t.includes(r):Array.isArray(r)?r.some(a=>t.includes(a)):r instanceof RegExp?r.test(t):r(t):!0},"scriptMatches"),Pe=m((e,t)=>e?Object.values(e).filter(r=>r!==!1).filter(r=>$e(r,t)).map(r=>typeof r=="function"?r():r.render()):[],"renderPageScripts"),G=m((e,t)=>{const r=Object.entries(t).filter(([a])=>a.startsWith("--")).map(([a,n])=>` ${a}: ${n};`).join(`
2
2
  `);return r?`${e} {
3
3
  ${r}
4
4
  }`:""},"renderThemeBlock"),ke=m(e=>{if(!e)return"";const t=e.light===!1,r=e.dark===!1,a=e.light===!1?void 0:e.light,n=r?void 0:e.dark,u=a||n;return u?[G(":root",u),n&&!t?`@media (prefers-color-scheme: dark) {
@@ -7,7 +7,7 @@ ${G(" :root",n)}
7
7
  .site-logo-dark { display: block; }`:"",r&&a?`.site-logo-light { display: block; }
8
8
  .site-logo-dark { display: none; }`:""].filter(Boolean).join(`
9
9
 
10
- `):""},"renderThemeStylesheet"),Te=m((e="")=>String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),"escapeXML"),Me=m((e="")=>e.replace(/```[\s\S]*?```/g," ").replace(/`([^`]+)`/g,"$1").replace(/!\[[^\]]*]\([^)]*\)/g," ").replace(/\[([^\]]+)]\([^)]*\)/g,"$1").replace(/^#{1,6}\s+/gm,"").replace(/^---+$/gm," ").replace(/[>*_~]/g,"").replace(/\s+/g," ").trim(),"stripMarkdown"),Ce=m(e=>e==="/index.html"?"/":e.replace(/\/index\.html$/,"/").replace(/\.html$/,"").replace(/\/+/g,"/"),"pagePathToUrlPath"),ee=m((e,t)=>e?`${e.replace(/\/$/,"")}${t==="/"?"/":t}`:t,"canonicalUrl"),je=m(async(e,t)=>f.default.existsSync(e)?(await(0,c.mkdir)(o.default.dirname(t),{recursive:!0}),await(0,c.cp)(e,t),!0):!1,"copyIfExists"),Fe=m(async e=>{const t=o.default.resolve(e,"logo.svg");f.default.existsSync(t)&&await Promise.all(["logo.light.svg","logo.dark.svg"].map(async r=>{const a=o.default.resolve(e,r);f.default.existsSync(a)||await(0,c.cp)(t,a)}))},"ensureLogoModeAssets"),Ge=m(e=>{const t={sitemap:!0,robots:!0,llms:!0,llmsFull:!0,netlify:!1};return e===!1?{sitemap:!1,robots:!1,llms:!1,llmsFull:!1,netlify:!1}:e===!0||e===void 0?t:{...t,...e}},"normalizeGeneratedFilesConfig"),Le=m((e,t)=>{if(!t)return"";const r=new Date().toISOString().slice(0,10);return`<?xml version="1.0" encoding="UTF-8"?>
10
+ `):""},"renderThemeStylesheet"),Te=m((e="")=>String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),"escapeXML"),Me=m((e="")=>e.replace(/```[\s\S]*?```/g," ").replace(/`([^`]+)`/g,"$1").replace(/!\[[^\]]*]\([^)]*\)/g," ").replace(/\[([^\]]+)]\([^)]*\)/g,"$1").replace(/^#{1,6}\s+/gm,"").replace(/^---+$/gm," ").replace(/[>*_~]/g,"").replace(/\s+/g," ").trim(),"stripMarkdown"),Ce=m(e=>e==="/index.html"?"/":e.replace(/\/index\.html$/,"/").replace(/\.html$/,"").replace(/\/+/g,"/"),"pagePathToUrlPath"),ee=m((e,t)=>e?`${e.replace(/\/$/,"")}${t==="/"?"/":t}`:t,"canonicalUrl"),je=m(async(e,t)=>p.default.existsSync(e)?(await(0,c.mkdir)(o.default.dirname(t),{recursive:!0}),await(0,c.cp)(e,t),!0):!1,"copyIfExists"),Fe=m(async e=>{const t=o.default.resolve(e,"logo.svg");p.default.existsSync(t)&&await Promise.all(["logo.light.svg","logo.dark.svg"].map(async r=>{const a=o.default.resolve(e,r);p.default.existsSync(a)||await(0,c.cp)(t,a)}))},"ensureLogoModeAssets"),Ge=m(e=>{const t={sitemap:!0,robots:!0,llms:!0,llmsFull:!0,netlify:!1};return e===!1?{sitemap:!1,robots:!1,llms:!1,llmsFull:!1,netlify:!1}:e===!0||e===void 0?t:{...t,...e}},"normalizeGeneratedFilesConfig"),Le=m((e,t)=>{if(!t)return"";const r=new Date().toISOString().slice(0,10);return`<?xml version="1.0" encoding="UTF-8"?>
11
11
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
12
12
  ${e.map(n=>{const u=n.urlPath==="/"?"1.0":"0.8";return` <url>
13
13
  <loc>${Te(ee(t,n.urlPath))}</loc>
@@ -75,4 +75,4 @@ for = "/robots.txt"
75
75
  [headers.values]
76
76
  Content-Type = "text/plain; charset=utf-8"
77
77
  Cache-Control = "public, max-age=0, must-revalidate"
78
- `,"generateNetlifyToml"),x=m(async(e,t,r,a)=>{if(await je(e,t))return;const n=r();if(!n){a&&console.warn(a);return}await(0,c.mkdir)(o.default.dirname(t),{recursive:!0}),await(0,c.writeFile)(t,n)},"writeGeneratedFile"),_e=m(async({docsDir:e,docsSiteDir:t,pages:r,siteUrl:a,publicDir:n,generatedFiles:u})=>{u.sitemap&&await x(o.default.resolve(e,"sitemap.xml"),o.default.resolve(t,"sitemap.xml"),()=>Le(r,a),"Skipping generated sitemap.xml because buildDocs({ siteUrl }) is not set."),u.robots&&await x(o.default.resolve(e,"robots.txt"),o.default.resolve(t,"robots.txt"),()=>Ee(a)),u.llms&&await x(o.default.resolve(e,"llms.txt"),o.default.resolve(t,"llms.txt"),()=>Oe(r)),u.llmsFull&&await x(o.default.resolve(e,"llms-full.txt"),o.default.resolve(t,"llms-full.txt"),()=>Ae(r,a)),u.netlify&&(await x(o.default.resolve(e,"_redirects"),o.default.resolve(t,"_redirects"),()=>Re(r,u)),await x(o.default.resolve(e,"netlify.toml"),o.default.resolve(t,"netlify.toml"),()=>We(n&&o.default.basename(n))))},"writeGeneratedDocsFiles"),te=m((e={},t,r)=>{const a=new se.Marked((0,ae.markedHighlight)({langPrefix:"hljs language-",highlight(n,u){const P=_.default.getLanguage(u)?u:"plaintext";return _.default.highlight(n,{language:P}).value}}));return a.use({renderer:ie.default}),a.use((0,le.createMarkdownLayoutExtension)({marked:a,handlers:e.markdownLayouts,renderMarkdown:r})),e.markedOptions&&a.use(e.markedOptions),t&&a.use(t),a},"createBaseMarked"),Be=m((e={},t)=>{const r=te(e,t),a=m(u=>r.parse(u),"renderMarkdown"),n=te(e,t,a);return n.use({hooks:{postprocess(u){const{layout:P="default",...y}=W.attributes,k=Pe(e.scripts,u);u=oe.default.sanitize(u);const T=[...u.matchAll(/<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([^<]+)<\/a>/gm)].map(D=>({path:D[2],label:D[3],level:D[1]}));return R.get(P)?.({...y,content:u,siteMap:W.siteMap,tableOfContent:T,projectMeta:V,renderMarkdown:a,scripts:k,themeStylesheet:e.theme?`/stylesheets/theme.css?v=${A}`:void 0,cacheKey:A})||u}}}),n},"createMarked"),v=m(async e=>{const t=await(0,c.readdir)(e),r=[];for(const a of t){const n=o.default.extname(a);/^[._]/.test(a)||(n?r.push(o.default.join(e,a)):/(stylesheets|assets|scripts)/.test(a)||r.push(...await v(o.default.join(e,a))))}return r},"traverseDirectory"),Ne=m(async({srcDir:e,publicDir:t,markedOptions:r,template:a,siteUrl:n,generatedFiles:u}={})=>{A=Date.now().toString(36);try{const s=o.default.resolve(process.cwd(),"package.json");f.default.existsSync(s)&&(V=JSON.parse(await(0,c.readFile)(s,"utf-8")))}catch(s){console.warn("Failed to load project package.json metadata",s)}const P=m(()=>{try{return __dirname}catch{return o.default.dirname((0,$.fileURLToPath)(ze.url))}},"getDirname"),y=a?o.default.resolve(P(),"templates",a):null,k=y?o.default.resolve(y,"assets"):null,T=y?o.default.resolve(y,"stylesheets"):null,D=y?o.default.resolve(y,"layouts"):null;let M={};if(y)try{let s=o.default.resolve(y,"template.config.js");if(f.default.existsSync(s)||(s=s.replace(/\.js$/,".ts")),f.default.existsSync(s)){const i=await import((0,$.pathToFileURL)(s).href);M=i.default||i}}catch(s){console.error(`Failed to load template config for ${a}`,s)}const d=e??o.default.resolve(process.cwd(),"docs"),p=t??o.default.resolve(process.cwd(),"website"),ue=Ge(u),S=o.default.resolve(d,"_template"),B=o.default.resolve(S,"assets"),N=o.default.resolve(S,"stylesheets"),U=o.default.resolve(S,"scripts"),z=o.default.resolve(S,"layouts"),q=o.default.resolve(d,"_layouts"),F=o.default.resolve(d,"assets"),H=o.default.resolve(d,"stylesheets"),L=o.default.resolve(d,"scripts");try{let s=o.default.resolve(S,"template.config.js");if(f.default.existsSync(s)||(s=s.replace(/\.js$/,".ts")),f.default.existsSync(s)){const i=await import((0,$.pathToFileURL)(s).href),l=i.default||i;M=xe(M,l)}}catch(s){console.error("Failed to load docs _template config",s)}const fe=Be(M,r);if(await(0,c.mkdir)(p,{recursive:!0}),k&&f.default.existsSync(k))try{await(0,c.cp)(k,F.replace(d,p),{recursive:!0})}catch(s){console.warn(s)}if(f.default.existsSync(F))try{await(0,c.cp)(F,F.replace(d,p),{recursive:!0})}catch(s){console.warn(s)}if(f.default.existsSync(B))try{await(0,c.cp)(B,o.default.resolve(p,"assets"),{recursive:!0})}catch(s){console.warn(s)}await Fe(o.default.resolve(p,"assets"));try{const s=new Set;if(T&&f.default.existsSync(T)&&(await v(T)).forEach(l=>s.add(l)),f.default.existsSync(H)&&(await v(H)).forEach(l=>s.add(l)),f.default.existsSync(N)&&(await v(N)).forEach(l=>s.add(l)),s.size){await(0,c.mkdir)(o.default.join(p,"stylesheets"),{recursive:!0});for(const l of s){const h=await(0,c.readFile)(l,"utf-8"),g=Y.minify(h);g.errors.length&&g.errors.forEach(console.error);const C=l.startsWith(S)?l.replace(S,p):l.startsWith(d)?l.replace(d,p):o.default.join(p,"stylesheets",o.default.basename(l));await(0,c.writeFile)(C,g.styles??h)}}const i=ke(M.theme);if(i){const l=Y.minify(i);l.errors.length&&l.errors.forEach(console.error),await(0,c.mkdir)(o.default.join(p,"stylesheets"),{recursive:!0}),await(0,c.writeFile)(o.default.join(p,"stylesheets","theme.css"),l.styles??i)}}catch(s){console.error(s)}if(f.default.existsSync(L))try{const s=await v(L);s.length&&await(0,c.mkdir)(L.replace(d,p),{recursive:!0});for(const i of s)try{const l=await(0,c.readFile)(i,"utf-8");await(0,c.writeFile)(i.replace(d,p),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}if(f.default.existsSync(U))try{const s=await v(U);s.length&&await(0,c.mkdir)(o.default.join(p,"scripts"),{recursive:!0});for(const i of s)try{const l=await(0,c.readFile)(i,"utf-8");await(0,c.writeFile)(i.replace(S,p),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}try{const s=new Map;D&&f.default.existsSync(D)&&(await v(D)).forEach(i=>{/\.(j|t)s$/.test(i)&&s.set(o.default.basename(i).replace(/\.(j|t)s$/,""),i)}),f.default.existsSync(q)&&(await v(q)).forEach(i=>{/\.(j|t)s$/.test(i)&&s.set(o.default.basename(i).replace(/\.(j|t)s$/,""),i)}),f.default.existsSync(z)&&(await v(z)).forEach(i=>{/\.(j|t)s$/.test(i)&&s.set(o.default.basename(i).replace(/\.(j|t)s$/,""),i)});for(const[i,l]of s.entries()){const h=await import((0,$.pathToFileURL)(l).href);R.set(i,h.default)}}catch(s){console.error("Template import failed",s)}const pe=await v(d),I=new Map,J=(await Promise.all(pe.filter(s=>s.endsWith(".md")).map(async s=>{const i=await(0,c.readFile)(s,"utf-8");return{filePath:s,...(0,re.default)(i)}}))).sort((s,i)=>(s.attributes.order??0)-(i.attributes.order??0)).map(({attributes:s,body:i,filePath:l})=>{const h=l.replace(d,"").replace(/\.md/,".html"),g=l.replace(d,p).replace(".md",".html"),C=g.replace(o.default.basename(g),""),E=o.default.basename(h)||"/",de=h.replace(E,"").replace(/\/$/,"");let b=I;de.split("/").filter(Boolean).forEach(O=>{b.has(O)||b.set(O,new Map),b=b.get(O)});const K={...s,path:h};return b.has(E)||b.set(E,K),{attributes:K,fileWebsitePath:g,fileDirWebsitePath:C,body:i,sourcePath:o.default.relative(d,l),siteMap:I}});for(const{attributes:s,body:i,fileDirWebsitePath:l,fileWebsitePath:h,siteMap:g}of J){W={attributes:s,siteMap:g};const C=await fe.parse(i);await(0,c.mkdir)(l,{recursive:!0}),await(0,c.writeFile)(h,me.default.minify(C,{includeAutoGeneratedTags:!0,removeAttributeQuotes:!0,removeComments:!0,removeRedundantAttributes:!0,removeScriptTypeAttributes:!0,removeStyleLinkTypeAttributes:!0,sortClassName:!0,useShortDoctype:!0,collapseWhitespace:!0,minifyJS:!0,minifyCSS:!0}))}await _e({docsDir:d,docsSiteDir:p,pages:J.map(({attributes:s,body:i,sourcePath:l})=>{const h=Ce(String(s.path)),g=Me(i);return{sourcePath:l,urlPath:h,title:String(s.title||s.name||"").trim()||"Documentation",name:String(s.name||s.title||"").trim()||"Documentation",description:String(s.description||"").trim()||g.slice(0,156)||"Documentation page.",order:Number(s.order??999),summary:g.slice(0,320)}}),siteUrl:n,publicDir:p,generatedFiles:ue})},"buildDocs");0&&(module.exports={buildDocs});
78
+ `,"generateNetlifyToml"),x=m(async(e,t,r,a)=>{if(await je(e,t))return;const n=r();if(!n){a&&console.warn(a);return}await(0,c.mkdir)(o.default.dirname(t),{recursive:!0}),await(0,c.writeFile)(t,n)},"writeGeneratedFile"),_e=m(async({docsDir:e,docsSiteDir:t,pages:r,siteUrl:a,publicDir:n,generatedFiles:u})=>{u.sitemap&&await x(o.default.resolve(e,"sitemap.xml"),o.default.resolve(t,"sitemap.xml"),()=>Le(r,a),"Skipping generated sitemap.xml because buildDocs({ siteUrl }) is not set."),u.robots&&await x(o.default.resolve(e,"robots.txt"),o.default.resolve(t,"robots.txt"),()=>Ee(a)),u.llms&&await x(o.default.resolve(e,"llms.txt"),o.default.resolve(t,"llms.txt"),()=>Oe(r)),u.llmsFull&&await x(o.default.resolve(e,"llms-full.txt"),o.default.resolve(t,"llms-full.txt"),()=>Ae(r,a)),u.netlify&&(await x(o.default.resolve(e,"_redirects"),o.default.resolve(t,"_redirects"),()=>Re(r,u)),await x(o.default.resolve(e,"netlify.toml"),o.default.resolve(t,"netlify.toml"),()=>We(n&&o.default.basename(n))))},"writeGeneratedDocsFiles"),te=m((e={},t,r)=>{const a=new se.Marked((0,ae.markedHighlight)({langPrefix:"hljs language-",highlight(n,u){const P=_.default.getLanguage(u)?u:"plaintext";return _.default.highlight(n,{language:P}).value}}));return a.use({renderer:ie.default}),a.use((0,le.createMarkdownLayoutExtension)({marked:a,handlers:e.markdownLayouts,renderMarkdown:r})),e.markedOptions&&a.use(e.markedOptions),t&&a.use(t),a},"createBaseMarked"),Be=m((e={},t)=>{const r=te(e,t),a=m(u=>r.parse(u),"renderMarkdown"),n=te(e,t,a);return n.use({hooks:{postprocess(u){const{layout:P="default",...y}=W.attributes,k=Pe(e.scripts,u);u=oe.default.sanitize(u);const T=[...u.matchAll(/<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([\s\S]*?)<\/a><\/h\1>/gm)].map(D=>({path:D[2],label:D[3].replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim(),level:D[1]}));return R.get(P)?.({...y,content:u,siteMap:W.siteMap,tableOfContent:T,projectMeta:V,renderMarkdown:a,scripts:k,themeStylesheet:e.theme?`/stylesheets/theme.css?v=${A}`:void 0,cacheKey:A})||u}}}),n},"createMarked"),v=m(async e=>{const t=await(0,c.readdir)(e),r=[];for(const a of t){const n=o.default.extname(a);/^[._]/.test(a)||(n?r.push(o.default.join(e,a)):/(stylesheets|assets|scripts)/.test(a)||r.push(...await v(o.default.join(e,a))))}return r},"traverseDirectory"),Ne=m(async({srcDir:e,publicDir:t,markedOptions:r,template:a,siteUrl:n,generatedFiles:u}={})=>{A=Date.now().toString(36);try{const s=o.default.resolve(process.cwd(),"package.json");p.default.existsSync(s)&&(V=JSON.parse(await(0,c.readFile)(s,"utf-8")))}catch(s){console.warn("Failed to load project package.json metadata",s)}const P=m(()=>{try{return __dirname}catch{return o.default.dirname((0,$.fileURLToPath)(ze.url))}},"getDirname"),y=a?o.default.resolve(P(),"templates",a):null,k=y?o.default.resolve(y,"assets"):null,T=y?o.default.resolve(y,"stylesheets"):null,D=y?o.default.resolve(y,"layouts"):null;let M={};if(y)try{let s=o.default.resolve(y,"template.config.js");if(p.default.existsSync(s)||(s=s.replace(/\.js$/,".ts")),p.default.existsSync(s)){const i=await import((0,$.pathToFileURL)(s).href);M=i.default||i}}catch(s){console.error(`Failed to load template config for ${a}`,s)}const d=e??o.default.resolve(process.cwd(),"docs"),f=t??o.default.resolve(process.cwd(),"website"),ue=Ge(u),S=o.default.resolve(d,"_template"),B=o.default.resolve(S,"assets"),N=o.default.resolve(S,"stylesheets"),U=o.default.resolve(S,"scripts"),z=o.default.resolve(S,"layouts"),q=o.default.resolve(d,"_layouts"),F=o.default.resolve(d,"assets"),H=o.default.resolve(d,"stylesheets"),L=o.default.resolve(d,"scripts");try{let s=o.default.resolve(S,"template.config.js");if(p.default.existsSync(s)||(s=s.replace(/\.js$/,".ts")),p.default.existsSync(s)){const i=await import((0,$.pathToFileURL)(s).href),l=i.default||i;M=xe(M,l)}}catch(s){console.error("Failed to load docs _template config",s)}const pe=Be(M,r);if(await(0,c.mkdir)(f,{recursive:!0}),k&&p.default.existsSync(k))try{await(0,c.cp)(k,F.replace(d,f),{recursive:!0})}catch(s){console.warn(s)}if(p.default.existsSync(F))try{await(0,c.cp)(F,F.replace(d,f),{recursive:!0})}catch(s){console.warn(s)}if(p.default.existsSync(B))try{await(0,c.cp)(B,o.default.resolve(f,"assets"),{recursive:!0})}catch(s){console.warn(s)}await Fe(o.default.resolve(f,"assets"));try{const s=new Set;if(T&&p.default.existsSync(T)&&(await v(T)).forEach(l=>s.add(l)),p.default.existsSync(H)&&(await v(H)).forEach(l=>s.add(l)),p.default.existsSync(N)&&(await v(N)).forEach(l=>s.add(l)),s.size){await(0,c.mkdir)(o.default.join(f,"stylesheets"),{recursive:!0});for(const l of s){const h=await(0,c.readFile)(l,"utf-8"),g=Y.minify(h);g.errors.length&&g.errors.forEach(console.error);const C=l.startsWith(S)?l.replace(S,f):l.startsWith(d)?l.replace(d,f):o.default.join(f,"stylesheets",o.default.basename(l));await(0,c.writeFile)(C,g.styles??h)}}const i=ke(M.theme);if(i){const l=Y.minify(i);l.errors.length&&l.errors.forEach(console.error),await(0,c.mkdir)(o.default.join(f,"stylesheets"),{recursive:!0}),await(0,c.writeFile)(o.default.join(f,"stylesheets","theme.css"),l.styles??i)}}catch(s){console.error(s)}if(p.default.existsSync(L))try{const s=await v(L);s.length&&await(0,c.mkdir)(L.replace(d,f),{recursive:!0});for(const i of s)try{const l=await(0,c.readFile)(i,"utf-8");await(0,c.writeFile)(i.replace(d,f),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}if(p.default.existsSync(U))try{const s=await v(U);s.length&&await(0,c.mkdir)(o.default.join(f,"scripts"),{recursive:!0});for(const i of s)try{const l=await(0,c.readFile)(i,"utf-8");await(0,c.writeFile)(i.replace(S,f),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}try{const s=new Map;D&&p.default.existsSync(D)&&(await v(D)).forEach(i=>{/\.(j|t)s$/.test(i)&&s.set(o.default.basename(i).replace(/\.(j|t)s$/,""),i)}),p.default.existsSync(q)&&(await v(q)).forEach(i=>{/\.(j|t)s$/.test(i)&&s.set(o.default.basename(i).replace(/\.(j|t)s$/,""),i)}),p.default.existsSync(z)&&(await v(z)).forEach(i=>{/\.(j|t)s$/.test(i)&&s.set(o.default.basename(i).replace(/\.(j|t)s$/,""),i)});for(const[i,l]of s.entries()){const h=await import((0,$.pathToFileURL)(l).href);R.set(i,h.default)}}catch(s){console.error("Template import failed",s)}const fe=await v(d),I=new Map,J=(await Promise.all(fe.filter(s=>s.endsWith(".md")).map(async s=>{const i=await(0,c.readFile)(s,"utf-8");return{filePath:s,...(0,re.default)(i)}}))).sort((s,i)=>(s.attributes.order??0)-(i.attributes.order??0)).map(({attributes:s,body:i,filePath:l})=>{const h=l.replace(d,"").replace(/\.md/,".html"),g=l.replace(d,f).replace(".md",".html"),C=g.replace(o.default.basename(g),""),E=o.default.basename(h)||"/",de=h.replace(E,"").replace(/\/$/,"");let b=I;de.split("/").filter(Boolean).forEach(O=>{b.has(O)||b.set(O,new Map),b=b.get(O)});const K={...s,path:h};return b.has(E)||b.set(E,K),{attributes:K,fileWebsitePath:g,fileDirWebsitePath:C,body:i,sourcePath:o.default.relative(d,l),siteMap:I}});for(const{attributes:s,body:i,fileDirWebsitePath:l,fileWebsitePath:h,siteMap:g}of J){W={attributes:s,siteMap:g};const C=await pe.parse(i);await(0,c.mkdir)(l,{recursive:!0}),await(0,c.writeFile)(h,me.default.minify(C,{includeAutoGeneratedTags:!0,removeAttributeQuotes:!0,removeComments:!0,removeRedundantAttributes:!0,removeScriptTypeAttributes:!0,removeStyleLinkTypeAttributes:!0,sortClassName:!0,useShortDoctype:!0,collapseWhitespace:!0,minifyJS:!0,minifyCSS:!0}))}await _e({docsDir:d,docsSiteDir:f,pages:J.map(({attributes:s,body:i,sourcePath:l})=>{const h=Ce(String(s.path)),g=Me(i);return{sourcePath:l,urlPath:h,title:String(s.title||s.name||"").trim()||"Documentation",name:String(s.name||s.title||"").trim()||"Documentation",description:String(s.description||"").trim()||g.slice(0,156)||"Documentation page.",order:Number(s.order??999),summary:g.slice(0,320)}}),siteUrl:n,publicDir:f,generatedFiles:ue})},"buildDocs");0&&(module.exports={buildDocs});
@@ -5,6 +5,14 @@ import {
5
5
  partByName,
6
6
  } from './_layout-utils.js'
7
7
 
8
+ const tone = (value) =>
9
+ ({
10
+ orange: 'primary',
11
+ cyan: 'accent',
12
+ })[value] ||
13
+ value ||
14
+ 'primary'
15
+
8
16
  export default ({ parts }) => {
9
17
  const header = partByName(parts, 'header') || parts[0]
10
18
  const cards = parts.filter((part) => part.name === 'product')
@@ -16,7 +24,7 @@ export default ({ parts }) => {
16
24
  ${cards
17
25
  .map(
18
26
  (card) => `
19
- <div class="product-card card-${option(card.options.color, 'orange')}">
27
+ <div class="product-card card-${tone(option(card.options.color, 'primary'))}">
20
28
  <div class="product-glow"></div>
21
29
  <a href="${option(card.options.href, '#')}" target="_blank" rel="noreferrer" class="product-head">
22
30
  <div class="product-title-row">
@@ -10,6 +10,14 @@ import {
10
10
  const previousIcon =
11
11
  '<svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>'
12
12
 
13
+ const tone = (value) =>
14
+ ({
15
+ orange: 'primary',
16
+ cyan: 'accent',
17
+ })[value] ||
18
+ value ||
19
+ 'accent'
20
+
13
21
  export const renderShowcaseScript = () => `
14
22
  <script type="application/javascript">
15
23
  (() => {
@@ -102,7 +110,7 @@ export default ({ parts }) => {
102
110
  <div class="slide-meta">
103
111
  <span class="slide-num font-mono">EXAMPLE ${String(index + 1).padStart(2, '0')}</span>
104
112
  <div class="slide-line"></div>
105
- <span class="slide-label font-mono color-${option(example.options.color, index % 2 ? 'cyan' : 'orange')}">${option(example.options.label, '')}</span>
113
+ <span class="slide-label font-mono color-${tone(option(example.options.color, 'accent'))}">${option(example.options.label, '')}</span>
106
114
  </div>
107
115
  ${renderCodeBlock(option(example.options.filename, ''), codeFromPart(example), option(example.options.lang, 'javascript'))}
108
116
  </div>
@@ -229,10 +229,10 @@ body {
229
229
  background: var(--inline-code-bg);
230
230
  color: var(--primary);
231
231
  display: inline-block;
232
- padding: 2px 6px;
232
+ padding: 0 4px;
233
233
  border-radius: 4px;
234
234
  font-family: var(--font-mono);
235
- font-size: 0.85em;
235
+ font-size: 0.75em;
236
236
  border: 1px solid var(--border);
237
237
  }
238
238
 
@@ -342,6 +342,16 @@ body {
342
342
  transition: all 0.2s ease;
343
343
  }
344
344
 
345
+ #next-doc span {
346
+ margin-left: 8px;
347
+ display: inline-block;
348
+ }
349
+
350
+ #prev-doc span {
351
+ margin-right: 8px;
352
+ display: inline-block;
353
+ }
354
+
345
355
  #prev-doc:hover,
346
356
  #next-doc:hover {
347
357
  border-color: var(--primary);
@@ -91,6 +91,18 @@
91
91
  font-weight: 500;
92
92
  }
93
93
 
94
+ .hero-subtitle a {
95
+ color: var(--primary);
96
+ font-weight: 500;
97
+ border-bottom: 1px dashed var(--primary-border);
98
+ }
99
+
100
+ .hero-subtitle a:hover {
101
+ color: var(--primary-glow);
102
+ border-bottom-style: solid;
103
+ border-bottom-color: var(--primary-glow);
104
+ }
105
+
94
106
  .hero-actions {
95
107
  display: flex;
96
108
  gap: 14px;
@@ -307,6 +319,7 @@
307
319
  filter: blur(48px);
308
320
  }
309
321
 
322
+ .product-card.card-primary .product-glow,
310
323
  .product-card.card-orange .product-glow {
311
324
  background: radial-gradient(
312
325
  circle,
@@ -315,6 +328,7 @@
315
328
  );
316
329
  }
317
330
 
331
+ .product-card.card-accent .product-glow,
318
332
  .product-card.card-cyan .product-glow {
319
333
  background: radial-gradient(circle, var(--accent-soft) 0%, transparent 70%);
320
334
  }
@@ -335,6 +349,7 @@
335
349
  transition: transform 0.3s ease;
336
350
  }
337
351
 
352
+ .product-card.card-primary .icon-container,
338
353
  .product-card.card-orange .icon-container {
339
354
  background: radial-gradient(
340
355
  circle at top left,
@@ -345,6 +360,7 @@
345
360
  color: var(--primary);
346
361
  }
347
362
 
363
+ .product-card.card-accent .icon-container,
348
364
  .product-card.card-cyan .icon-container {
349
365
  background: radial-gradient(
350
366
  circle at top left,
@@ -389,10 +405,12 @@
389
405
  font-weight: 600;
390
406
  }
391
407
 
408
+ .product-card.card-primary .product-link,
392
409
  .product-card.card-orange .product-link {
393
410
  color: var(--primary);
394
411
  }
395
412
 
413
+ .product-card.card-accent .product-link,
396
414
  .product-card.card-cyan .product-link {
397
415
  color: var(--accent);
398
416
  }
@@ -615,10 +633,12 @@
615
633
  font-weight: 500;
616
634
  }
617
635
 
636
+ .color-primary,
618
637
  .color-orange {
619
638
  color: var(--primary);
620
639
  }
621
640
 
641
+ .color-accent,
622
642
  .color-cyan {
623
643
  color: var(--accent);
624
644
  }
@@ -1,4 +1,4 @@
1
- var ne=Object.defineProperty;var c=(e,t)=>ne(e,"name",{value:t,configurable:!0});import{Marked as ie}from"marked";import{cp as C,mkdir as v,readdir as le,readFile as j,writeFile as b}from"fs/promises";import o from"path";import ce from"front-matter";import me from"isomorphic-dompurify";import{markedHighlight as ue}from"marked-highlight";import Q from"highlight.js";import fe from"./templates/default.template.js";import pe from"./renderer/index.js";import{createMarkdownLayoutExtension as de}from"./markdown-layout/index.js";import he from"clean-css";import ge from"html-minifier";import*as X from"@putout/minify";import{fileURLToPath as ye,pathToFileURL as A}from"url";import u from"fs";let V,R="";const Y=new he({inline:["none"]}),W=new Map;W.set("default",fe);let _;const Z=c((e,t)=>t===!1?!1:t===void 0?e:e===!1||e===void 0?t:{...e,...t},"mergeThemeMode"),we=c((e,t)=>{if(!(!e&&!t))return{light:Z(e?.light,t?.light),dark:Z(e?.dark,t?.dark)}},"mergeTheme"),ve=c((e,t)=>({...e,...t,markdownLayouts:{...e.markdownLayouts,...t.markdownLayouts},scripts:{...e.scripts,...t.scripts},theme:we(e.theme,t.theme)}),"mergeTemplateConfig"),Se=c((e,t)=>{if(typeof e=="function")return!0;const{match:r}=e;return r?typeof r=="string"?t.includes(r):Array.isArray(r)?r.some(a=>t.includes(a)):r instanceof RegExp?r.test(t):r(t):!0},"scriptMatches"),De=c((e,t)=>e?Object.values(e).filter(r=>r!==!1).filter(r=>Se(r,t)).map(r=>typeof r=="function"?r():r.render()):[],"renderPageScripts"),G=c((e,t)=>{const r=Object.entries(t).filter(([a])=>a.startsWith("--")).map(([a,i])=>` ${a}: ${i};`).join(`
1
+ var ne=Object.defineProperty;var c=(e,t)=>ne(e,"name",{value:t,configurable:!0});import{Marked as ie}from"marked";import{cp as C,mkdir as v,readdir as le,readFile as j,writeFile as b}from"fs/promises";import o from"path";import ce from"front-matter";import me from"isomorphic-dompurify";import{markedHighlight as ue}from"marked-highlight";import Q from"highlight.js";import pe from"./templates/default.template.js";import fe from"./renderer/index.js";import{createMarkdownLayoutExtension as de}from"./markdown-layout/index.js";import he from"clean-css";import ge from"html-minifier";import*as X from"@putout/minify";import{fileURLToPath as ye,pathToFileURL as A}from"url";import u from"fs";let V,R="";const Y=new he({inline:["none"]}),W=new Map;W.set("default",pe);let _;const Z=c((e,t)=>t===!1?!1:t===void 0?e:e===!1||e===void 0?t:{...e,...t},"mergeThemeMode"),we=c((e,t)=>{if(!(!e&&!t))return{light:Z(e?.light,t?.light),dark:Z(e?.dark,t?.dark)}},"mergeTheme"),ve=c((e,t)=>({...e,...t,markdownLayouts:{...e.markdownLayouts,...t.markdownLayouts},scripts:{...e.scripts,...t.scripts},theme:we(e.theme,t.theme)}),"mergeTemplateConfig"),Se=c((e,t)=>{if(typeof e=="function")return!0;const{match:r}=e;return r?typeof r=="string"?t.includes(r):Array.isArray(r)?r.some(a=>t.includes(a)):r instanceof RegExp?r.test(t):r(t):!0},"scriptMatches"),De=c((e,t)=>e?Object.values(e).filter(r=>r!==!1).filter(r=>Se(r,t)).map(r=>typeof r=="function"?r():r.render()):[],"renderPageScripts"),G=c((e,t)=>{const r=Object.entries(t).filter(([a])=>a.startsWith("--")).map(([a,i])=>` ${a}: ${i};`).join(`
2
2
  `);return r?`${e} {
3
3
  ${r}
4
4
  }`:""},"renderThemeBlock"),be=c(e=>{if(!e)return"";const t=e.light===!1,r=e.dark===!1,a=e.light===!1?void 0:e.light,i=r?void 0:e.dark,m=a||i;return m?[G(":root",m),i&&!t?`@media (prefers-color-scheme: dark) {
@@ -75,4 +75,4 @@ for = "/robots.txt"
75
75
  [headers.values]
76
76
  Content-Type = "text/plain; charset=utf-8"
77
77
  Cache-Control = "public, max-age=0, must-revalidate"
78
- `,"generateNetlifyToml"),x=c(async(e,t,r,a)=>{if(await ke(e,t))return;const i=r();if(!i){a&&console.warn(a);return}await v(o.dirname(t),{recursive:!0}),await b(t,i)},"writeGeneratedFile"),Oe=c(async({docsDir:e,docsSiteDir:t,pages:r,siteUrl:a,publicDir:i,generatedFiles:m})=>{m.sitemap&&await x(o.resolve(e,"sitemap.xml"),o.resolve(t,"sitemap.xml"),()=>Ce(r,a),"Skipping generated sitemap.xml because buildDocs({ siteUrl }) is not set."),m.robots&&await x(o.resolve(e,"robots.txt"),o.resolve(t,"robots.txt"),()=>je(a)),m.llms&&await x(o.resolve(e,"llms.txt"),o.resolve(t,"llms.txt"),()=>Fe(r)),m.llmsFull&&await x(o.resolve(e,"llms-full.txt"),o.resolve(t,"llms-full.txt"),()=>Ge(r,a)),m.netlify&&(await x(o.resolve(e,"_redirects"),o.resolve(t,"_redirects"),()=>Le(r,m)),await x(o.resolve(e,"netlify.toml"),o.resolve(t,"netlify.toml"),()=>Ee(i&&o.basename(i))))},"writeGeneratedDocsFiles"),te=c((e={},t,r)=>{const a=new ie(ue({langPrefix:"hljs language-",highlight(i,m){const $=Q.getLanguage(m)?m:"plaintext";return Q.highlight(i,{language:$}).value}}));return a.use({renderer:pe}),a.use(de({marked:a,handlers:e.markdownLayouts,renderMarkdown:r})),e.markedOptions&&a.use(e.markedOptions),t&&a.use(t),a},"createBaseMarked"),Ae=c((e={},t)=>{const r=te(e,t),a=c(m=>r.parse(m),"renderMarkdown"),i=te(e,t,a);return i.use({hooks:{postprocess(m){const{layout:$="default",...g}=_.attributes,P=De(e.scripts,m);m=me.sanitize(m);const k=[...m.matchAll(/<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([^<]+)<\/a>/gm)].map(S=>({path:S[2],label:S[3],level:S[1]}));return W.get($)?.({...g,content:m,siteMap:_.siteMap,tableOfContent:k,projectMeta:V,renderMarkdown:a,scripts:P,themeStylesheet:e.theme?`/stylesheets/theme.css?v=${R}`:void 0,cacheKey:R})||m}}}),i},"createMarked"),y=c(async e=>{const t=await le(e),r=[];for(const a of t){const i=o.extname(a);/^[._]/.test(a)||(i?r.push(o.join(e,a)):/(stylesheets|assets|scripts)/.test(a)||r.push(...await y(o.join(e,a))))}return r},"traverseDirectory"),lt=c(async({srcDir:e,publicDir:t,markedOptions:r,template:a,siteUrl:i,generatedFiles:m}={})=>{R=Date.now().toString(36);try{const s=o.resolve(process.cwd(),"package.json");u.existsSync(s)&&(V=JSON.parse(await j(s,"utf-8")))}catch(s){console.warn("Failed to load project package.json metadata",s)}const $=c(()=>{try{return __dirname}catch{return o.dirname(ye(import.meta.url))}},"getDirname"),g=a?o.resolve($(),"templates",a):null,P=g?o.resolve(g,"assets"):null,k=g?o.resolve(g,"stylesheets"):null,S=g?o.resolve(g,"layouts"):null;let T={};if(g)try{let s=o.resolve(g,"template.config.js");if(u.existsSync(s)||(s=s.replace(/\.js$/,".ts")),u.existsSync(s)){const n=await import(A(s).href);T=n.default||n}}catch(s){console.error(`Failed to load template config for ${a}`,s)}const p=e??o.resolve(process.cwd(),"docs"),f=t??o.resolve(process.cwd(),"website"),se=Me(m),w=o.resolve(p,"_template"),B=o.resolve(w,"assets"),N=o.resolve(w,"stylesheets"),U=o.resolve(w,"scripts"),z=o.resolve(w,"layouts"),q=o.resolve(p,"_layouts"),F=o.resolve(p,"assets"),H=o.resolve(p,"stylesheets"),L=o.resolve(p,"scripts");try{let s=o.resolve(w,"template.config.js");if(u.existsSync(s)||(s=s.replace(/\.js$/,".ts")),u.existsSync(s)){const n=await import(A(s).href),l=n.default||n;T=ve(T,l)}}catch(s){console.error("Failed to load docs _template config",s)}const re=Ae(T,r);if(await v(f,{recursive:!0}),P&&u.existsSync(P))try{await C(P,F.replace(p,f),{recursive:!0})}catch(s){console.warn(s)}if(u.existsSync(F))try{await C(F,F.replace(p,f),{recursive:!0})}catch(s){console.warn(s)}if(u.existsSync(B))try{await C(B,o.resolve(f,"assets"),{recursive:!0})}catch(s){console.warn(s)}await Te(o.resolve(f,"assets"));try{const s=new Set;if(k&&u.existsSync(k)&&(await y(k)).forEach(l=>s.add(l)),u.existsSync(H)&&(await y(H)).forEach(l=>s.add(l)),u.existsSync(N)&&(await y(N)).forEach(l=>s.add(l)),s.size){await v(o.join(f,"stylesheets"),{recursive:!0});for(const l of s){const d=await j(l,"utf-8"),h=Y.minify(d);h.errors.length&&h.errors.forEach(console.error);const M=l.startsWith(w)?l.replace(w,f):l.startsWith(p)?l.replace(p,f):o.join(f,"stylesheets",o.basename(l));await b(M,h.styles??d)}}const n=be(T.theme);if(n){const l=Y.minify(n);l.errors.length&&l.errors.forEach(console.error),await v(o.join(f,"stylesheets"),{recursive:!0}),await b(o.join(f,"stylesheets","theme.css"),l.styles??n)}}catch(s){console.error(s)}if(u.existsSync(L))try{const s=await y(L);s.length&&await v(L.replace(p,f),{recursive:!0});for(const n of s)try{const l=await j(n,"utf-8");await b(n.replace(p,f),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}if(u.existsSync(U))try{const s=await y(U);s.length&&await v(o.join(f,"scripts"),{recursive:!0});for(const n of s)try{const l=await j(n,"utf-8");await b(n.replace(w,f),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}try{const s=new Map;S&&u.existsSync(S)&&(await y(S)).forEach(n=>{/\.(j|t)s$/.test(n)&&s.set(o.basename(n).replace(/\.(j|t)s$/,""),n)}),u.existsSync(q)&&(await y(q)).forEach(n=>{/\.(j|t)s$/.test(n)&&s.set(o.basename(n).replace(/\.(j|t)s$/,""),n)}),u.existsSync(z)&&(await y(z)).forEach(n=>{/\.(j|t)s$/.test(n)&&s.set(o.basename(n).replace(/\.(j|t)s$/,""),n)});for(const[n,l]of s.entries()){const d=await import(A(l).href);W.set(n,d.default)}}catch(s){console.error("Template import failed",s)}const oe=await y(p),I=new Map,J=(await Promise.all(oe.filter(s=>s.endsWith(".md")).map(async s=>{const n=await j(s,"utf-8");return{filePath:s,...ce(n)}}))).sort((s,n)=>(s.attributes.order??0)-(n.attributes.order??0)).map(({attributes:s,body:n,filePath:l})=>{const d=l.replace(p,"").replace(/\.md/,".html"),h=l.replace(p,f).replace(".md",".html"),M=h.replace(o.basename(h),""),E=o.basename(d)||"/",ae=d.replace(E,"").replace(/\/$/,"");let D=I;ae.split("/").filter(Boolean).forEach(O=>{D.has(O)||D.set(O,new Map),D=D.get(O)});const K={...s,path:d};return D.has(E)||D.set(E,K),{attributes:K,fileWebsitePath:h,fileDirWebsitePath:M,body:n,sourcePath:o.relative(p,l),siteMap:I}});for(const{attributes:s,body:n,fileDirWebsitePath:l,fileWebsitePath:d,siteMap:h}of J){_={attributes:s,siteMap:h};const M=await re.parse(n);await v(l,{recursive:!0}),await b(d,ge.minify(M,{includeAutoGeneratedTags:!0,removeAttributeQuotes:!0,removeComments:!0,removeRedundantAttributes:!0,removeScriptTypeAttributes:!0,removeStyleLinkTypeAttributes:!0,sortClassName:!0,useShortDoctype:!0,collapseWhitespace:!0,minifyJS:!0,minifyCSS:!0}))}await Oe({docsDir:p,docsSiteDir:f,pages:J.map(({attributes:s,body:n,sourcePath:l})=>{const d=Pe(String(s.path)),h=$e(n);return{sourcePath:l,urlPath:d,title:String(s.title||s.name||"").trim()||"Documentation",name:String(s.name||s.title||"").trim()||"Documentation",description:String(s.description||"").trim()||h.slice(0,156)||"Documentation page.",order:Number(s.order??999),summary:h.slice(0,320)}}),siteUrl:i,publicDir:f,generatedFiles:se})},"buildDocs");export{lt as buildDocs};
78
+ `,"generateNetlifyToml"),x=c(async(e,t,r,a)=>{if(await ke(e,t))return;const i=r();if(!i){a&&console.warn(a);return}await v(o.dirname(t),{recursive:!0}),await b(t,i)},"writeGeneratedFile"),Oe=c(async({docsDir:e,docsSiteDir:t,pages:r,siteUrl:a,publicDir:i,generatedFiles:m})=>{m.sitemap&&await x(o.resolve(e,"sitemap.xml"),o.resolve(t,"sitemap.xml"),()=>Ce(r,a),"Skipping generated sitemap.xml because buildDocs({ siteUrl }) is not set."),m.robots&&await x(o.resolve(e,"robots.txt"),o.resolve(t,"robots.txt"),()=>je(a)),m.llms&&await x(o.resolve(e,"llms.txt"),o.resolve(t,"llms.txt"),()=>Fe(r)),m.llmsFull&&await x(o.resolve(e,"llms-full.txt"),o.resolve(t,"llms-full.txt"),()=>Ge(r,a)),m.netlify&&(await x(o.resolve(e,"_redirects"),o.resolve(t,"_redirects"),()=>Le(r,m)),await x(o.resolve(e,"netlify.toml"),o.resolve(t,"netlify.toml"),()=>Ee(i&&o.basename(i))))},"writeGeneratedDocsFiles"),te=c((e={},t,r)=>{const a=new ie(ue({langPrefix:"hljs language-",highlight(i,m){const $=Q.getLanguage(m)?m:"plaintext";return Q.highlight(i,{language:$}).value}}));return a.use({renderer:fe}),a.use(de({marked:a,handlers:e.markdownLayouts,renderMarkdown:r})),e.markedOptions&&a.use(e.markedOptions),t&&a.use(t),a},"createBaseMarked"),Ae=c((e={},t)=>{const r=te(e,t),a=c(m=>r.parse(m),"renderMarkdown"),i=te(e,t,a);return i.use({hooks:{postprocess(m){const{layout:$="default",...g}=_.attributes,P=De(e.scripts,m);m=me.sanitize(m);const k=[...m.matchAll(/<h([0-6])\sid="[^"]+".*?>.*?<a\s+href="([^"]+)".*?>([\s\S]*?)<\/a><\/h\1>/gm)].map(S=>({path:S[2],label:S[3].replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim(),level:S[1]}));return W.get($)?.({...g,content:m,siteMap:_.siteMap,tableOfContent:k,projectMeta:V,renderMarkdown:a,scripts:P,themeStylesheet:e.theme?`/stylesheets/theme.css?v=${R}`:void 0,cacheKey:R})||m}}}),i},"createMarked"),y=c(async e=>{const t=await le(e),r=[];for(const a of t){const i=o.extname(a);/^[._]/.test(a)||(i?r.push(o.join(e,a)):/(stylesheets|assets|scripts)/.test(a)||r.push(...await y(o.join(e,a))))}return r},"traverseDirectory"),lt=c(async({srcDir:e,publicDir:t,markedOptions:r,template:a,siteUrl:i,generatedFiles:m}={})=>{R=Date.now().toString(36);try{const s=o.resolve(process.cwd(),"package.json");u.existsSync(s)&&(V=JSON.parse(await j(s,"utf-8")))}catch(s){console.warn("Failed to load project package.json metadata",s)}const $=c(()=>{try{return __dirname}catch{return o.dirname(ye(import.meta.url))}},"getDirname"),g=a?o.resolve($(),"templates",a):null,P=g?o.resolve(g,"assets"):null,k=g?o.resolve(g,"stylesheets"):null,S=g?o.resolve(g,"layouts"):null;let T={};if(g)try{let s=o.resolve(g,"template.config.js");if(u.existsSync(s)||(s=s.replace(/\.js$/,".ts")),u.existsSync(s)){const n=await import(A(s).href);T=n.default||n}}catch(s){console.error(`Failed to load template config for ${a}`,s)}const f=e??o.resolve(process.cwd(),"docs"),p=t??o.resolve(process.cwd(),"website"),se=Me(m),w=o.resolve(f,"_template"),B=o.resolve(w,"assets"),N=o.resolve(w,"stylesheets"),U=o.resolve(w,"scripts"),z=o.resolve(w,"layouts"),q=o.resolve(f,"_layouts"),F=o.resolve(f,"assets"),H=o.resolve(f,"stylesheets"),L=o.resolve(f,"scripts");try{let s=o.resolve(w,"template.config.js");if(u.existsSync(s)||(s=s.replace(/\.js$/,".ts")),u.existsSync(s)){const n=await import(A(s).href),l=n.default||n;T=ve(T,l)}}catch(s){console.error("Failed to load docs _template config",s)}const re=Ae(T,r);if(await v(p,{recursive:!0}),P&&u.existsSync(P))try{await C(P,F.replace(f,p),{recursive:!0})}catch(s){console.warn(s)}if(u.existsSync(F))try{await C(F,F.replace(f,p),{recursive:!0})}catch(s){console.warn(s)}if(u.existsSync(B))try{await C(B,o.resolve(p,"assets"),{recursive:!0})}catch(s){console.warn(s)}await Te(o.resolve(p,"assets"));try{const s=new Set;if(k&&u.existsSync(k)&&(await y(k)).forEach(l=>s.add(l)),u.existsSync(H)&&(await y(H)).forEach(l=>s.add(l)),u.existsSync(N)&&(await y(N)).forEach(l=>s.add(l)),s.size){await v(o.join(p,"stylesheets"),{recursive:!0});for(const l of s){const d=await j(l,"utf-8"),h=Y.minify(d);h.errors.length&&h.errors.forEach(console.error);const M=l.startsWith(w)?l.replace(w,p):l.startsWith(f)?l.replace(f,p):o.join(p,"stylesheets",o.basename(l));await b(M,h.styles??d)}}const n=be(T.theme);if(n){const l=Y.minify(n);l.errors.length&&l.errors.forEach(console.error),await v(o.join(p,"stylesheets"),{recursive:!0}),await b(o.join(p,"stylesheets","theme.css"),l.styles??n)}}catch(s){console.error(s)}if(u.existsSync(L))try{const s=await y(L);s.length&&await v(L.replace(f,p),{recursive:!0});for(const n of s)try{const l=await j(n,"utf-8");await b(n.replace(f,p),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}if(u.existsSync(U))try{const s=await y(U);s.length&&await v(o.join(p,"scripts"),{recursive:!0});for(const n of s)try{const l=await j(n,"utf-8");await b(n.replace(w,p),X.minify(l))}catch(l){console.error(l)}}catch(s){console.warn(s)}try{const s=new Map;S&&u.existsSync(S)&&(await y(S)).forEach(n=>{/\.(j|t)s$/.test(n)&&s.set(o.basename(n).replace(/\.(j|t)s$/,""),n)}),u.existsSync(q)&&(await y(q)).forEach(n=>{/\.(j|t)s$/.test(n)&&s.set(o.basename(n).replace(/\.(j|t)s$/,""),n)}),u.existsSync(z)&&(await y(z)).forEach(n=>{/\.(j|t)s$/.test(n)&&s.set(o.basename(n).replace(/\.(j|t)s$/,""),n)});for(const[n,l]of s.entries()){const d=await import(A(l).href);W.set(n,d.default)}}catch(s){console.error("Template import failed",s)}const oe=await y(f),I=new Map,J=(await Promise.all(oe.filter(s=>s.endsWith(".md")).map(async s=>{const n=await j(s,"utf-8");return{filePath:s,...ce(n)}}))).sort((s,n)=>(s.attributes.order??0)-(n.attributes.order??0)).map(({attributes:s,body:n,filePath:l})=>{const d=l.replace(f,"").replace(/\.md/,".html"),h=l.replace(f,p).replace(".md",".html"),M=h.replace(o.basename(h),""),E=o.basename(d)||"/",ae=d.replace(E,"").replace(/\/$/,"");let D=I;ae.split("/").filter(Boolean).forEach(O=>{D.has(O)||D.set(O,new Map),D=D.get(O)});const K={...s,path:d};return D.has(E)||D.set(E,K),{attributes:K,fileWebsitePath:h,fileDirWebsitePath:M,body:n,sourcePath:o.relative(f,l),siteMap:I}});for(const{attributes:s,body:n,fileDirWebsitePath:l,fileWebsitePath:d,siteMap:h}of J){_={attributes:s,siteMap:h};const M=await re.parse(n);await v(l,{recursive:!0}),await b(d,ge.minify(M,{includeAutoGeneratedTags:!0,removeAttributeQuotes:!0,removeComments:!0,removeRedundantAttributes:!0,removeScriptTypeAttributes:!0,removeStyleLinkTypeAttributes:!0,sortClassName:!0,useShortDoctype:!0,collapseWhitespace:!0,minifyJS:!0,minifyCSS:!0}))}await Oe({docsDir:f,docsSiteDir:p,pages:J.map(({attributes:s,body:n,sourcePath:l})=>{const d=Pe(String(s.path)),h=$e(n);return{sourcePath:l,urlPath:d,title:String(s.title||s.name||"").trim()||"Documentation",name:String(s.name||s.title||"").trim()||"Documentation",description:String(s.description||"").trim()||h.slice(0,156)||"Documentation page.",order:Number(s.order??999),summary:h.slice(0,320)}}),siteUrl:i,publicDir:p,generatedFiles:se})},"buildDocs");export{lt as buildDocs};
@@ -5,6 +5,14 @@ import {
5
5
  partByName,
6
6
  } from './_layout-utils.js'
7
7
 
8
+ const tone = (value) =>
9
+ ({
10
+ orange: 'primary',
11
+ cyan: 'accent',
12
+ })[value] ||
13
+ value ||
14
+ 'primary'
15
+
8
16
  export default ({ parts }) => {
9
17
  const header = partByName(parts, 'header') || parts[0]
10
18
  const cards = parts.filter((part) => part.name === 'product')
@@ -16,7 +24,7 @@ export default ({ parts }) => {
16
24
  ${cards
17
25
  .map(
18
26
  (card) => `
19
- <div class="product-card card-${option(card.options.color, 'orange')}">
27
+ <div class="product-card card-${tone(option(card.options.color, 'primary'))}">
20
28
  <div class="product-glow"></div>
21
29
  <a href="${option(card.options.href, '#')}" target="_blank" rel="noreferrer" class="product-head">
22
30
  <div class="product-title-row">
@@ -10,6 +10,14 @@ import {
10
10
  const previousIcon =
11
11
  '<svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>'
12
12
 
13
+ const tone = (value) =>
14
+ ({
15
+ orange: 'primary',
16
+ cyan: 'accent',
17
+ })[value] ||
18
+ value ||
19
+ 'accent'
20
+
13
21
  export const renderShowcaseScript = () => `
14
22
  <script type="application/javascript">
15
23
  (() => {
@@ -102,7 +110,7 @@ export default ({ parts }) => {
102
110
  <div class="slide-meta">
103
111
  <span class="slide-num font-mono">EXAMPLE ${String(index + 1).padStart(2, '0')}</span>
104
112
  <div class="slide-line"></div>
105
- <span class="slide-label font-mono color-${option(example.options.color, index % 2 ? 'cyan' : 'orange')}">${option(example.options.label, '')}</span>
113
+ <span class="slide-label font-mono color-${tone(option(example.options.color, 'accent'))}">${option(example.options.label, '')}</span>
106
114
  </div>
107
115
  ${renderCodeBlock(option(example.options.filename, ''), codeFromPart(example), option(example.options.lang, 'javascript'))}
108
116
  </div>
@@ -229,10 +229,10 @@ body {
229
229
  background: var(--inline-code-bg);
230
230
  color: var(--primary);
231
231
  display: inline-block;
232
- padding: 2px 6px;
232
+ padding: 0 4px;
233
233
  border-radius: 4px;
234
234
  font-family: var(--font-mono);
235
- font-size: 0.85em;
235
+ font-size: 0.75em;
236
236
  border: 1px solid var(--border);
237
237
  }
238
238
 
@@ -342,6 +342,16 @@ body {
342
342
  transition: all 0.2s ease;
343
343
  }
344
344
 
345
+ #next-doc span {
346
+ margin-left: 8px;
347
+ display: inline-block;
348
+ }
349
+
350
+ #prev-doc span {
351
+ margin-right: 8px;
352
+ display: inline-block;
353
+ }
354
+
345
355
  #prev-doc:hover,
346
356
  #next-doc:hover {
347
357
  border-color: var(--primary);
@@ -91,6 +91,18 @@
91
91
  font-weight: 500;
92
92
  }
93
93
 
94
+ .hero-subtitle a {
95
+ color: var(--primary);
96
+ font-weight: 500;
97
+ border-bottom: 1px dashed var(--primary-border);
98
+ }
99
+
100
+ .hero-subtitle a:hover {
101
+ color: var(--primary-glow);
102
+ border-bottom-style: solid;
103
+ border-bottom-color: var(--primary-glow);
104
+ }
105
+
94
106
  .hero-actions {
95
107
  display: flex;
96
108
  gap: 14px;
@@ -307,6 +319,7 @@
307
319
  filter: blur(48px);
308
320
  }
309
321
 
322
+ .product-card.card-primary .product-glow,
310
323
  .product-card.card-orange .product-glow {
311
324
  background: radial-gradient(
312
325
  circle,
@@ -315,6 +328,7 @@
315
328
  );
316
329
  }
317
330
 
331
+ .product-card.card-accent .product-glow,
318
332
  .product-card.card-cyan .product-glow {
319
333
  background: radial-gradient(circle, var(--accent-soft) 0%, transparent 70%);
320
334
  }
@@ -335,6 +349,7 @@
335
349
  transition: transform 0.3s ease;
336
350
  }
337
351
 
352
+ .product-card.card-primary .icon-container,
338
353
  .product-card.card-orange .icon-container {
339
354
  background: radial-gradient(
340
355
  circle at top left,
@@ -345,6 +360,7 @@
345
360
  color: var(--primary);
346
361
  }
347
362
 
363
+ .product-card.card-accent .icon-container,
348
364
  .product-card.card-cyan .icon-container {
349
365
  background: radial-gradient(
350
366
  circle at top left,
@@ -389,10 +405,12 @@
389
405
  font-weight: 600;
390
406
  }
391
407
 
408
+ .product-card.card-primary .product-link,
392
409
  .product-card.card-orange .product-link {
393
410
  color: var(--primary);
394
411
  }
395
412
 
413
+ .product-card.card-accent .product-link,
396
414
  .product-card.card-cyan .product-link {
397
415
  color: var(--accent);
398
416
  }
@@ -615,10 +633,12 @@
615
633
  font-weight: 500;
616
634
  }
617
635
 
636
+ .color-primary,
618
637
  .color-orange {
619
638
  color: var(--primary);
620
639
  }
621
640
 
641
+ .color-accent,
622
642
  .color-cyan {
623
643
  color: var(--accent);
624
644
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beforesemicolon/builder",
3
- "version": "1.8.18",
3
+ "version": "1.8.20",
4
4
  "description": "Utilities to build npm packages and documentation website",
5
5
  "engines": {
6
6
  "node": ">=18.16.0"