@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.
- package/dist/cjs/docs/run.js +3 -3
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-ecosystem.js +9 -1
- package/dist/cjs/docs/templates/fading-citrus/layouts/landing-showcase.js +9 -1
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/documentation.css +12 -2
- package/dist/cjs/docs/templates/fading-citrus/stylesheets/landing.css +20 -0
- package/dist/esm/docs/run.js +2 -2
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-ecosystem.js +9 -1
- package/dist/esm/docs/templates/fading-citrus/layouts/landing-showcase.js +9 -1
- package/dist/esm/docs/templates/fading-citrus/stylesheets/documentation.css +12 -2
- package/dist/esm/docs/templates/fading-citrus/stylesheets/landing.css +20 -0
- package/package.json +1 -1
package/dist/cjs/docs/run.js
CHANGED
|
@@ -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"),
|
|
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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),"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)=>
|
|
10
|
+
`):""},"renderThemeStylesheet"),Te=m((e="")=>String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"),"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="([^"]+)".*?>([
|
|
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, '
|
|
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,
|
|
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:
|
|
232
|
+
padding: 0 4px;
|
|
233
233
|
border-radius: 4px;
|
|
234
234
|
font-family: var(--font-mono);
|
|
235
|
-
font-size: 0.
|
|
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/dist/esm/docs/run.js
CHANGED
|
@@ -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
|
|
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:
|
|
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, '
|
|
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,
|
|
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:
|
|
232
|
+
padding: 0 4px;
|
|
233
233
|
border-radius: 4px;
|
|
234
234
|
font-family: var(--font-mono);
|
|
235
|
-
font-size: 0.
|
|
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
|
}
|