@publier/shell 3.2.0 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,4 @@
1
1
  import { AstroIntegration } from "astro";
2
-
3
2
  //#region src/build-integration.d.ts
4
3
  /** Astro integration that writes the Publier build manifest after `astro build`. */
5
4
  declare function publierBuild(): AstroIntegration;
package/dist/index.d.mts CHANGED
@@ -1,4 +1,5 @@
1
- import { i as DocsShellOptions, p as docsShell } from "./integration-0Am2m0GS.mjs";
1
+ import { i as DocsShellOptions, p as docsShell } from "./integration-De40K0ol.mjs";
2
+ import "astro/zod";
2
3
  //#region src/build/headers.d.ts
3
4
  /**
4
5
  * Cache-control + security headers emitted by `docsShell()` during
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{a as e,i as t,t as n}from"./integration-BXGMwq1-.mjs";export{t as HASHED_ASSET_RE,n as docsShell,e as publierCacheControl};
1
+ import{a as e,i as t,t as n}from"./integration-B0X8DWmx.mjs";export{t as HASHED_ASSET_RE,n as docsShell,e as publierCacheControl};
@@ -0,0 +1,103 @@
1
+ import{remarkAsides as e,remarkDirectivesRestoration as t}from"./plugins/remark-asides.mjs";import n from"./plugins/remark-snippets.mjs";import r from"./plugins/remark-vars.mjs";import{CODE_GROUP_SYNC_SCRIPT as i}from"./runtime/code-group-sync.mjs";import{TABS_SYNC_SCRIPT as a}from"./runtime/tabs-sync.mjs";import{publierCssPlugin as o,publierThemeCssPlugin as s}from"./tailwind/css-plugin.mjs";import{createRequire as c}from"node:module";import{configResolveShellConfig as l,generateAnalyticsScripts as u,shellAnnouncementBannerScript as d,shellBuildHeaders as f,shellBuildLicenseErrorMessage as ee,shellCacheControl as p,shellCollectTailwindClassTokens as m,shellComposeTailwindEntry as h,shellLazyUpgradeScript as g,shellOpenInAiScript as _,shellPlanDefaultRoutes as te,shellPlanRehypePlugins as ne,shellPlanRemarkPlugins as re,shellResolvePrefetch as ie,shellResolveSnippetsConfig as ae,shellRewriteHead as v,shellRewriteModulepreload as y,shellSearchButtonScript as b,shellSearchDialogScript as x,shellTableOfContentsScript as S,verifyLicense as oe}from"@publier/native";import{existsSync as C,mkdirSync as w,readFileSync as T,readdirSync as E,writeFileSync as D}from"node:fs";import{writeFile as O}from"node:fs/promises";import k from"node:path";import{fileURLToPath as A}from"node:url";import{fontProviders as j}from"astro/config";import M from"rehype-autolink-headings";import N from"rehype-external-links";import P from"remark-directive";const F=/^\/(?:_astro|assets|build)\//;function I(){return f()}function L(e){return p(e)}function R(e,t){let n=t.map(e=>e.pathname),r=v(e,n);return{stylesheetsCount:r.stylesheetsCount,modulesCount:r.modulesCount,pagesRewritten:r.pagesRewritten,stylesheets:r.stylesheets,modules:r.modules}}function z(e,t){let n=t.map(e=>e.pathname),r=y(e,n);return{jsCount:r.jsCount,fontsCount:r.fontsCount,pagesRewritten:r.pagesRewritten}}function se(e){let t=l(e),{config:n,errors:r}=JSON.parse(t);if(r.length>0){let e=r.map(e=>` - [${e.code}] ${e.path}: ${e.message}`);throw Error(`Invalid publier.config.yaml:\n${e.join(`
2
+ `)}`)}return{...n,announcement:n.announcement??null}}function ce(e){let t=k.join(e,`publier.config.yaml`);if(!C(t))return null;try{return T(t,`utf-8`)}catch{return null}}function le(e,t){let n=c(import.meta.url);for(let t of[e,n])try{let e=t(`remark-math`),n=t(`rehype-katex`);return{remarkMath:e.default??e,rehypeKatex:n.default??n}}catch{}return t.warn("[@publier/shell] remark-math / rehype-katex unavailable in both project and shell. Reinstall node_modules, or set `docsShell({ math: false })` to opt out."),null}function ue(e,t){let n=c(import.meta.url);for(let t of[e,n])try{let e=t(`@astrojs/markdown-remark`);if(typeof e.unified==`function`)return e.unified}catch{}return t.warn("[@publier/shell] @astrojs/markdown-remark is not resolvable. On Astro 7 (Sätteri is the default Markdown processor) this means callouts, {{vars}}, <Snippet>, and math will NOT render — add `@astrojs/markdown-remark` to your dependencies."),null}function de(i,a,o){let s=JSON.parse(i),c=[];for(let i of s)switch(i.id){case`remark-vars`:a&&c.push([r,a]);break;case`remark-directive`:c.push(P);break;case`remark-asides`:c.push(e);break;case`remark-directives-restoration`:c.push(t);break;case`remark-snippets`:c.push([n,i.options]);break;case`remark-math`:o&&c.push(o.remarkMath)}return c}function B(e,t){let n=JSON.parse(e),r=[];for(let e of n)switch(e.id){case`rehype-autolink-headings`:r.push([M,e.options]);break;case`rehype-external-links`:r.push([N,e.options]);break;case`rehype-katex`:t&&r.push(t.rehypeKatex)}return r}async function V(e,t,n,r){if(e.mermaid===!1||t.some(e=>e.name===`astro-mermaid`))return;let i=c(import.meta.url),a=i(`node:fs`),o=i(`node:path`),{pathToFileURL:s}=i(`node:url`),l=o.join(n,`node_modules/astro-mermaid`),u;try{let e=JSON.parse(a.readFileSync(o.join(l,`package.json`),`utf8`)),t=e.exports?.[`.`]?.import??e.main;if(!t)return;u=o.join(l,t)}catch{return}let d=Function(`url`,`return import(url)`),f;try{f=await d(s(u).href)}catch{return}r({integrations:[(f.default??f)({autoTheme:!0})]})}const H=g();function fe({root:e,mathEnabled:t}){let n=c(import.meta.url),r=t=>{try{return k.dirname(n.resolve(`${t}/package.json`,{paths:[e]}))}catch{return null}},i=(e,t)=>{let n=r(e);return n?{abs_path:k.join(n,t).split(k.sep).join(`/`)}:null},a=[i(`@publier/shell`,`src/components`),i(`@publier/shell`,`src/components/ui`),i(`@publier/shell`,`src/routes`),i(`@publier/primitives`,`src/components`)].filter(e=>e!==null),o=null;if(t)try{o=n.resolve(`katex/dist/katex.min.css`).split(k.sep).join(`/`)}catch{o=null}let s=h(JSON.stringify(a),o??void 0),l=m(),u=k.join(e,`.astro`);if(l.length>0){C(u)||w(u,{recursive:!0});let e=k.join(u,`publier-class-safelist.html`),t=l.split(/\s+/).filter(Boolean),n=[];for(let e=0;e<t.length;e+=200)n.push(t.slice(e,e+200).join(` `));let r=n.map(e=>`<div class="${e}"></div>`).join(`
3
+ `);D(e,r,`utf8`);let i=e.split(k.sep).join(`/`);s+=`@source "${i}";\n`}let d=k.join(u,`publier-tailwind-entry.css`);return(C(d)?T(d,`utf8`):``)!==s&&(w(u,{recursive:!0}),D(d,s)),d}function pe(e,t,n){if(U(n))return[];try{let n=e(`@tailwindcss/vite`),r=typeof n==`function`?n:n.default;if(!r)return t.warn(`[@publier/shell] @tailwindcss/vite resolved but has no callable default export. Tailwind v4 + daisyUI utilities WILL NOT be emitted.`),[];let i=r();return Array.isArray(i)?i:[i]}catch{return t.warn('[@publier/shell] @tailwindcss/vite is not installed in this project. Tailwind v4 + daisyUI utilities WILL NOT be emitted — the site will render unstyled. Add `"@tailwindcss/vite": "^4"` to your package.json alongside `tailwindcss`.'),[]}}function U(e){for(let t of e){if(!t)continue;if(Array.isArray(t)){if(U(t))return!0;continue}let e=t.name;if(typeof e==`string`&&e.startsWith(`@tailwindcss/vite`))return!0}return!1}function me(e){return{name:`publier-tailwind-entry-hmr-shim`,apply:`serve`,configureServer(t){let n=t.config.root,r=e.entryPath.startsWith(n)?e.entryPath.slice(n.length).split(k.sep).join(`/`):null;r&&t.middlewares.use(r,(e,t,n)=>{if((e.url??``).includes(`?`)||e.method!==`GET`&&e.method!==`HEAD`)return n();t.setHeader(`Content-Type`,`application/javascript`),t.setHeader(`Cache-Control`,`no-cache`),t.statusCode=200,t.end(`
4
+ if (import.meta.hot) {
5
+ import.meta.hot.accept();
6
+ }
7
+ `)})}}}const W=`import 'astro:scripts/page-ssr.js';
8
+ `;function he(){return{name:`publier-dev-page-ssr-propagation`,apply:`serve`,enforce:`post`,transform(e,t){let n=t.split(`?`)[0];return!n.endsWith(`.astro`)||!n.includes(`/src/pages/`)||e.includes(W)?null:{code:W+e,map:null}}}}function G(e,t){let n=e[t];if(n===`\\`&&t+1<e.length)return t+2;if(n===`"`||n===`'`){let r=n,i=t+1;for(;i<e.length&&e[i]!==r;)e[i]===`\\`&&i+1<e.length?i+=2:i++;return i+1}if(n===`/`&&e[t+1]===`*`){let n=e.indexOf(`*/`,t+2);return n===-1?e.length:n+2}return t}function K(e,t){let n=1,r=t+1;for(;r<e.length&&n>0;){let t=G(e,r);if(t!==r){r=t;continue}let i=e[r];i===`{`?n++:i===`}`&&n--,r++}return r}function q(e){let t=[],n=(r,i)=>{let a=r,o=``,s=r;for(;a<i;){let r=G(e,a);if(r!==a){a=r;continue}let c=e[a];if(c===`@`&&e.startsWith(`@media`,a)&&/[\s(]/.test(e[a+6]??``)){let n=e.indexOf(`{`,a);if(n===-1||n>=i){a++;continue}let r=K(e,n);o+=e.slice(s,a),t.push(e.slice(a,r)),a=r,s=a;continue}if(c===`{`){let t=K(e,a);if(t>i)break;let r=n(a+1,t-1);o+=e.slice(s,a+1)+r+`}`,a=t,s=a;continue}a++}return o+=e.slice(s,i),o},r=0,i=``;for(;r<e.length;){let t=G(e,r);if(t!==r){r=t;continue}let a=e.indexOf(`@layer utilities`,r);if(a===-1){i+=e.slice(r);break}let o=e[a+16];if(o!==` `&&o!==` `&&o!==`
9
+ `&&o!==`\r`&&o!==`{`){r=a+16;continue}let s=r,c=!1;for(;s<a;){let t=G(e,s);if(t!==s){if(t>a){c=!0,r=t;break}s=t}else s++}if(c)continue;let l=e.indexOf(`{`,a);if(l===-1){i+=e.slice(r);break}i+=e.slice(r,l+1);let u=K(e,l);i+=n(l+1,u-1),i+=`}`,r=u}return t.length>0&&(i.endsWith(`
10
+ `)||(i+=`
11
+ `),i+=t.join(`
12
+ `),i.endsWith(`
13
+ `)||(i+=`
14
+ `)),i}function J(){return{name:`publier-cascade-hoist`,enforce:`post`,transform(e,t){if(!t.endsWith(`.css`)&&!t.includes(`.css?`))return null;let n=q(e);return n===e?null:{code:n,map:null}},generateBundle(e,t){for(let e of Object.keys(t)){if(!e.endsWith(`.css`))continue;let n=t[e];if(!n||n.type!==`asset`)continue;let r=typeof n.source==`string`?n.source:new TextDecoder().decode(n.source),i=q(r);i!==r&&(n.source=i)}}}}function Y(e,t,n){let r=`\0${e}`,i=`export const ${t} = ${JSON.stringify(n)};`;return{name:`publier-${e.replace(/^virtual:publier-/,``)}`,resolveId(t){if(t===e)return r},load(e){if(e===r)return i}}}function X(e,t=6){return e.length===0?`[]`:e.length<=t?`[${e.join(`, `)}]`:`[${e.slice(0,t).join(`, `)}, +${e.length-t} more]`}function Z(e){let t=[H,a,i,d(),_(),S()];return e.searchEnabled&&t.push(x(),b()),t.join(`
15
+ `)}function ge(e,t){let n=[],r=[],i=[];for(let a of[`heading`,`body`,`mono`]){let o=e[a];if(!o?.family)continue;let s=`--publier-font-${a}`,c=a===`mono`?[`monospace`]:[`system-ui`,`sans-serif`],l=[o.weight??`400`],u=[o.style??`normal`];if(o.googleFontsUrl)n.push({name:o.family,cssVariable:s,provider:j.google(),fallbacks:c,weights:l,styles:u,subsets:[`latin`]}),r.push(a);else if(o.src){let e=k.isAbsolute(o.src)&&C(o.src)?o.src:k.join(t,`public`,o.src.replace(/^\/+/,``));n.push({name:o.family,cssVariable:s,provider:j.local(),fallbacks:c,weights:l,styles:u,subsets:[`latin`],options:{variants:[{weight:l[0],style:u[0],src:[e]}]}}),r.push(a)}else i.push(`${s}:"${o.family}",${c.join(`,`)};`)}return{entries:n,familyOnlyCss:i.length?`:root{${i.join(``)}}`:``,slots:r}}const _e=[{pkg:`astro-expressive-code`,aliases:[`astro-expressive-code`]},{pkg:`@astrojs/mdx`,aliases:[`@astrojs/mdx`]},{pkg:`@astrojs/sitemap`,aliases:[`@astrojs/sitemap`]},{pkg:`astro-pagefind`,aliases:[`astro-pagefind`,`pagefind`]},{pkg:`@qwik.dev/astro`,aliases:[`@qwik.dev/astro`]}];function Q(e,t){let n=k.join(e,`src`,`content`,t);if(!C(n))return!1;try{return E(n,{recursive:!0}).some(e=>typeof e==`string`&&/\.mdx?$/.test(e))}catch{return!1}}function $(e={}){return{name:`@publier/shell`,hooks:{"astro:config:setup":async({config:t,updateConfig:n,injectScript:r,injectRoute:i,logger:a})=>{let l=t.root?A(t.root):process.cwd();try{oe()}catch(e){let t=e instanceof Error?e.message:String(e),n=ee(t);throw n?Error(n):e}let d=c(k.join(l,`package.json`)),f=JSON.stringify(e),p=se(ce(l)??``),m=p.site,h=p.vars,g=p.fonts,_=p.nav,v=p.announcement,y=p.docs,b=typeof m.url==`string`&&m.url.length>0;b&&!t.site&&n({site:m.url});let x=new Set(t.integrations.map(e=>e.name)),S=_e.filter(({aliases:e})=>!e.some(e=>x.has(e)));S.length>0&&a.warn(`[@publier/shell] Required framework integrations are not registered in
16
+ astro.config.ts. As of @publier/shell@2.0.0, docsShell() no longer
17
+ auto-wires these. Add the following to your integrations[] array
18
+ (import statements + entries shown). Order matters: docsShell() must
19
+ come FIRST (astro-expressive-code >=0.43 registers into the Markdown
20
+ processor it finds at its own setup — docsShell's pinned unified()
21
+ processor must already be in place), and expressive-code must precede
22
+ mdx.
23
+
24
+ import expressiveCode from 'astro-expressive-code';
25
+ import mdx from '@astrojs/mdx';
26
+ import sitemap from '@astrojs/sitemap';
27
+ import pagefind from 'astro-pagefind';
28
+ import qwik from '@qwik.dev/astro';
29
+
30
+ integrations: [
31
+ docsShell({ /* options */ }),
32
+ expressiveCode(),
33
+ mdx(),
34
+ sitemap(),
35
+ pagefind(),
36
+ qwik({ clientRouter: true }),
37
+ ]
38
+
39
+ Missing:\n ${S.map(e=>e.pkg).join(`
40
+ `)}\n`);let w=t.prefetch;ie(w===void 0?void 0:JSON.stringify(w),f)&&n({prefetch:{prefetchAll:!0,defaultStrategy:`viewport`}});let{entries:T,familyOnlyCss:E,slots:D}=g?ge(g,l):{entries:[],familyOnlyCss:``,slots:[]},O=p.snippets??null,M=O==null?null:O===!1?`false`:JSON.stringify(O),N=ae(f,M??void 0,C(k.join(l,`content/snippets`))),P=JSON.parse(N),F={...e,snippets:P===null?void 0:P},I=JSON.stringify(F),L=e.math!==!1,R=L?le(d,a):null,z=re(I,!!(h&&Object.keys(h).length>0),P!==null&&P!==!1,L&&R!==null),H=ne(f,L&&R!==null),U=de(z,h,R),W=B(H,R),G=ue(d,a);await V(e,t.integrations,l,n);let K=fe({root:l,mathEnabled:L}),q=Z({searchEnabled:e.search!==!1}),X=JSON.stringify({docs:Q(l,`docs`),blog:Q(l,`blog`),changelog:Q(l,`changelog`)}),$=JSON.parse(te(f,b,X)),ve=$.filter(e=>e.pattern.endsWith(`/rss.xml`)).map(e=>({title:e.pattern===`/blog/rss.xml`?`Blog feed`:e.pattern===`/changelog/rss.xml`?`Changelog feed`:e.pattern,href:e.pattern}));if(G){let e=t.markdown?.processor,n=e?.options?.hastPlugins;e?.name!==`unified`&&Array.isArray(n)&&n.length>0&&a.warn(`[@publier/shell] docsShell() is replacing the configured "${e?.name}" Markdown processor, discarding ${n.length} HAST plugin(s) another integration already registered on it — typically astro-expressive-code >=0.43, which registers into the processor it finds at its own setup. Code fences will silently lose ALL processing (plain <pre><code>, no syntax highlighting). Fix: move docsShell() BEFORE expressiveCode() (and any other Markdown-processor-touching integration) in astro.config.ts integrations[] so they register into docsShell's unified() processor instead.`)}n({markdown:G?{processor:G({remarkPlugins:U,rehypePlugins:W})}:{remarkPlugins:[...U],rehypePlugins:[...W]},vite:{ssr:{noExternal:[`@publier/shell`,`@qwik.dev/core`,`@qwik.dev/astro`],external:[`@publier/native`]},build:{rollupOptions:{external:[`@publier/native`]}},optimizeDeps:{exclude:[`@publier/shell`,`@publier/native`]},plugins:[...pe(d,a,t.vite?.plugins??[]),s({root:l}),o({root:l}),Y(`virtual:publier-nav-config`,`navConfig`,_),me({entryPath:K}),he(),Y(`virtual:publier-announcement`,`announcement`,v),Y(`virtual:publier-site`,`site`,m),Y(`virtual:publier-docs-config`,`docsConfig`,y),Y(`virtual:publier-feeds`,`feeds`,ve),Y(`virtual:publier-fonts`,`fonts`,{slots:D}),J()]}}),n({fonts:[{name:`Inter Variable`,cssVariable:`--publier-font-builtin-sans`,provider:j.npm({remote:!1}),fallbacks:[`system-ui`,`sans-serif`],weights:[`100 900`],styles:[`normal`],subsets:[`latin`],options:{package:`@fontsource-variable/inter`}},{name:`JetBrains Mono Variable`,cssVariable:`--publier-font-builtin-mono`,provider:j.npm({remote:!1}),fallbacks:[`monospace`],weights:[`100 800`],styles:[`normal`],subsets:[`latin`],options:{package:`@fontsource-variable/jetbrains-mono`}},...T]}),r(`page-ssr`,[`import ${JSON.stringify(K)};`,`import 'virtual:publier-theme-css';`,`import 'virtual:publier-custom-css';`,`import '@publier/shell/styles/base.css';`].join(`
41
+ `)),r(`page`,q),r(`head-inline`,`(function(){
42
+ if (typeof window === 'undefined' || !window.sessionStorage || !window.fetch) return;
43
+ var store = window.sessionStorage;
44
+ var ResponseCtor = window.Response;
45
+ var origFetch = window.fetch.bind(window);
46
+ var NS = 'publier:bg:';
47
+ var PATTERN = /^\\/(?:_astro|assets|build)\\/(?:[^\\/]*bundle-graph[^\\/]*\\.json|q-manifest[^\\/]*\\.json)(?:\\?.*)?$/;
48
+
49
+
50
+
51
+
52
+ var inflight = Object.create(null);
53
+ function serve(body){
54
+ return new ResponseCtor(body, {
55
+ status: 200,
56
+ headers: { 'content-type': 'application/json' }
57
+ });
58
+ }
59
+ window.fetch = function(input, init){
60
+ var url = typeof input === 'string' ? input : (input && input.url) || '';
61
+ var method = (init && init.method) || (input && input.method) || 'GET';
62
+ if (!url || method !== 'GET' || !PATTERN.test(url)) {
63
+ return origFetch(input, init);
64
+ }
65
+ var key = NS + url;
66
+
67
+ try {
68
+ var hit = store.getItem(key);
69
+ if (hit !== null) return Promise.resolve(serve(hit));
70
+ } catch (_) {}
71
+
72
+
73
+ if (inflight[url]) return inflight[url].then(serve);
74
+
75
+
76
+ var pending = origFetch(input, init).then(function(res){
77
+ if (res && res.ok) {
78
+ return res.clone().text().then(function(body){
79
+ try { store.setItem(key, body); } catch (_) {}
80
+ delete inflight[url];
81
+ return res;
82
+ });
83
+ }
84
+ delete inflight[url];
85
+ return res;
86
+ }, function(err){
87
+ delete inflight[url];
88
+ throw err;
89
+ });
90
+
91
+ inflight[url] = pending.then(function(res){
92
+ return res && res.ok ? res.clone().text() : '';
93
+ });
94
+ return pending;
95
+ };
96
+ })();`),E&&r(`head-inline`,`
97
+ const _pFonts = document.createElement('style');
98
+ _pFonts.textContent = ${JSON.stringify(E)};
99
+ document.head.appendChild(_pFonts);
100
+ `);{let e=p.analytics;if(e){let t=u(e);t&&r(`head-inline`,`
101
+ const _pAnalytics = document.createRange().createContextualFragment(${JSON.stringify(t)});
102
+ document.head.appendChild(_pAnalytics);
103
+ `)}}for(let e of $)i({pattern:e.pattern,entrypoint:e.entrypoint,prerender:e.prerender});$.length>0&&a.info(`[@publier/shell] Injected default routes: ${$.map(e=>e.pattern).join(`, `)}.`),a.info(`[@publier/shell] Plugin pipeline wired.`)},"astro:build:done":async({dir:e,pages:t,logger:n})=>{let r=A(e),i=k.join(r,`_headers`);await O(i,I(),`utf-8`),n.info(`[@publier/shell] Wrote 5 header rules to dist/_headers.`);let a=R(r,t);a.pagesRewritten>0&&n.info(`[@publier/shell] Backfilled head tags on ${a.pagesRewritten} HTML file(s) (stylesheets=${X(a.stylesheets)}, modules=${X(a.modules)}).`);let o=z(r,t);o.pagesRewritten>0&&n.info(`[@publier/shell] Injected preload tags into ${o.pagesRewritten} HTML file(s) (js=${o.jsCount}, fonts=${o.fontsCount}).`)}}}}export{L as a,F as i,q as n,J as r,$ as t};
@@ -1,6 +1,5 @@
1
1
  import { AstroIntegration } from "astro";
2
2
  import { Plugin } from "vite";
3
-
4
3
  //#region src/vite/css-chain.d.ts
5
4
  /**
6
5
  * Move every `@media` block found anywhere inside an outer `@layer utilities`
@@ -1,2 +1,2 @@
1
- import { a as DocsSidebarMetaOverride, c as NavLink, d as SidebarAnchorConfig, f as SiteConfig, h as publierCascadeHoistPlugin, i as DocsShellOptions, l as NavPathRule, m as hoistMediaOutOfUtilitiesLayer, n as DocVersionConfig, o as NavConfig, p as docsShell, r as DocsConfig, s as NavCta, t as AnnouncementConfig, u as NavVariant } from "./integration-0Am2m0GS.mjs";
1
+ import { a as DocsSidebarMetaOverride, c as NavLink, d as SidebarAnchorConfig, f as SiteConfig, h as publierCascadeHoistPlugin, i as DocsShellOptions, l as NavPathRule, m as hoistMediaOutOfUtilitiesLayer, n as DocVersionConfig, o as NavConfig, p as docsShell, r as DocsConfig, s as NavCta, t as AnnouncementConfig, u as NavVariant } from "./integration-De40K0ol.mjs";
2
2
  export { AnnouncementConfig, DocVersionConfig, DocsConfig, DocsShellOptions, DocsSidebarMetaOverride, NavConfig, NavCta, NavLink, NavPathRule, NavVariant, SidebarAnchorConfig, SiteConfig, docsShell, hoistMediaOutOfUtilitiesLayer, publierCascadeHoistPlugin };
@@ -1 +1 @@
1
- import{n as e,r as t,t as n}from"./integration-BXGMwq1-.mjs";export{n as docsShell,e as hoistMediaOutOfUtilitiesLayer,t as publierCascadeHoistPlugin};
1
+ import{n as e,r as t,t as n}from"./integration-B0X8DWmx.mjs";export{n as docsShell,e as hoistMediaOutOfUtilitiesLayer,t as publierCascadeHoistPlugin};
@@ -1,5 +1,3 @@
1
- import * as _$astro_loaders0 from "astro/loaders";
2
-
3
1
  //#region src/loaders/index.d.ts
4
2
  /**
5
3
  * Astro content-collection loaders for Publier.
@@ -27,21 +25,21 @@ import * as _$astro_loaders0 from "astro/loaders";
27
25
  declare function docsLoader(options?: {
28
26
  base?: string;
29
27
  pattern?: string;
30
- }): _$astro_loaders0.Loader;
28
+ }): import("astro/loaders").Loader;
31
29
  /**
32
30
  * Content loader for the `blog` collection.
33
31
  */
34
32
  declare function blogLoader(options?: {
35
33
  base?: string;
36
34
  pattern?: string;
37
- }): _$astro_loaders0.Loader;
35
+ }): import("astro/loaders").Loader;
38
36
  /**
39
37
  * Content loader for the `pages` collection.
40
38
  */
41
39
  declare function pagesLoader(options?: {
42
40
  base?: string;
43
41
  pattern?: string;
44
- }): _$astro_loaders0.Loader;
42
+ }): import("astro/loaders").Loader;
45
43
  /**
46
44
  * Generic content loader for any MDX collection (changelog, recipes, press,
47
45
  * careers, etc.).
@@ -49,6 +47,6 @@ declare function pagesLoader(options?: {
49
47
  declare function contentLoader(options: {
50
48
  base: string;
51
49
  pattern?: string;
52
- }): _$astro_loaders0.Loader;
50
+ }): import("astro/loaders").Loader;
53
51
  //#endregion
54
52
  export { blogLoader, contentLoader, docsLoader, pagesLoader };
@@ -1,6 +1,5 @@
1
- import { t as Root } from "../index-Bc-beOEe.mjs";
1
+ import { t as Root } from "../index-CbxBu1jA.mjs";
2
2
  import { Plugin } from "unified";
3
-
4
3
  //#region src/plugins/remark-asides.d.ts
5
4
  declare const remarkAsides: Plugin<[], Root>;
6
5
  declare const remarkDirectivesRestoration: Plugin<[], Root>;
@@ -1,6 +1,5 @@
1
- import { t as Root } from "../index-Bc-beOEe.mjs";
1
+ import { t as Root } from "../index-CbxBu1jA.mjs";
2
2
  import { Plugin } from "unified";
3
-
4
3
  //#region src/plugins/remark-snippets.d.ts
5
4
  interface SnippetOptions {
6
5
  directory?: string;
@@ -1 +1 @@
1
- import e from"@publier/native";import{resolve as t}from"node:path";import{fromMarkdown as n}from"mdast-util-from-markdown";function r(e){return typeof e==`object`&&!!e&&e.type===`mdxJsxFlowElement`}const i=i=>a=>{let o=t(i?.contentRoot??`.`,i?.directory??`content/snippets`),s=a.children;for(let t=0;t<s.length;t++){let i=s[t];if(!r(i)||i.name!==`Snippet`)continue;let a=i,c={};for(let e of a.attributes??[])e.type===`mdxJsxAttribute`&&typeof e.value==`string`&&(c[e.name]=e.value);let l=c.file;if(!l)continue;let u;try{u=e.remarkResolveSnippet(o,l,JSON.stringify(c))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`[remark-snippets] Failed to resolve "${l}" from "${o}": ${t}`)}if(u==null)continue;let d=n(u);s.splice(t,1,...d.children),t+=d.children.length-1}};export{i as default};
1
+ import e from"@publier/native";import{resolve as t}from"node:path";import{fromMarkdown as n}from"mdast-util-from-markdown";function r(e){return typeof e==`object`&&!!e&&e.type===`mdxJsxFlowElement`}const i=i=>a=>{let o=i?.contentRoot??`.`,s=t(o,i?.directory??`content/snippets`),c=a.children;for(let t=0;t<c.length;t++){let i=c[t];if(!r(i)||i.name!==`Snippet`)continue;let a=i,o={};for(let e of a.attributes??[])e.type===`mdxJsxAttribute`&&typeof e.value==`string`&&(o[e.name]=e.value);let l=o.file;if(!l)continue;let u;try{u=e.remarkResolveSnippet(s,l,JSON.stringify(o))}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`[remark-snippets] Failed to resolve "${l}" from "${s}": ${t}`)}if(u==null)continue;let d=n(u);c.splice(t,1,...d.children),t+=d.children.length-1}};export{i as default};
@@ -1,7 +1,6 @@
1
- import { t as Root } from "../index-Bc-beOEe.mjs";
1
+ import { t as Root } from "../index-CbxBu1jA.mjs";
2
2
  import { StructuredSection } from "@publier/native";
3
3
  import { Plugin } from "unified";
4
-
5
4
  //#region src/plugins/remark-structure.d.ts
6
5
  declare module 'vfile' {
7
6
  interface DataMap {
@@ -1,6 +1,5 @@
1
- import { t as Root } from "../index-Bc-beOEe.mjs";
1
+ import { t as Root } from "../index-CbxBu1jA.mjs";
2
2
  import { Plugin } from "unified";
3
-
4
3
  //#region src/plugins/remark-vars.d.ts
5
4
  declare const remarkVars: Plugin<[Record<string, string>?], Root>;
6
5
  //#endregion
@@ -6,7 +6,7 @@
6
6
  * Node-side introspection (reading CSS files, computing contrast) lives in
7
7
  * `./loader.ts` to keep `node:fs` out of the browser bundle path.
8
8
  */
9
- declare const AVAILABLE_THEMES: readonly ["almond", "aspen", "catppuccin", "dark", "dusk", "emerald", "light", "maple", "neutral", "ocean", "purple", "ruby", "solar", "vitepress"];
9
+ declare const AVAILABLE_THEMES: readonly ['almond', 'aspen', 'catppuccin', 'dark', 'dusk', 'emerald', 'light', 'maple', 'neutral', 'ocean', 'purple', 'ruby', 'solar', 'vitepress'];
10
10
  type ThemePreset = (typeof AVAILABLE_THEMES)[number];
11
11
  /** Return a read-only copy of the built-in preset list. */
12
12
  declare function listPresets(): readonly ThemePreset[];
@@ -25,6 +25,6 @@
25
25
  * toggle a `tab-active` class (would leave a stale highlight once
26
26
  * `<tab-container>` upgrades and starts managing aria-selected alone).
27
27
  */
28
- declare const CODE_GROUP_SYNC_SCRIPT = "\n(() => {\n\tconst SYNC_PREFIX = 'publier-code-group-sync:';\n\n\tconst activateByLabel = (root, label) => {\n\t\tconst tabs = Array.from(root.querySelectorAll('[role=\"tab\"]'));\n\t\tconst index = tabs.findIndex((t) => t.dataset.tabLabel === label);\n\t\tif (index < 0) return;\n\t\tconst target = tabs[index];\n\t\t// Idempotence guard: tab-container fires 'tab-container-changed'\n\t\t// unconditionally when selectTab runs, even when the index doesn't\n\t\t// change. Without this check, peer sync loops: root 0 syncs peer 1\n\t\t// \u2192 peer 1 fires changed \u2192 peer 1 syncs peers including root 0 \u2192\n\t\t// stack-overflow. Skip if already on the requested label.\n\t\tif (target.getAttribute('aria-selected') === 'true') return;\n\t\t// tab-container-element's selectTab(index) expects a NUMBER, not an\n\t\t// element. Passing the tab button directly silently no-ops (coerces\n\t\t// to NaN). Pass the resolved index instead.\n\t\tif (typeof root.selectTab === 'function') {\n\t\t\troot.selectTab(index);\n\t\t\treturn;\n\t\t}\n\t\t// Pre-upgrade fallback: toggle ARIA + panel visibility manually so\n\t\t// SSR state stays coherent while the custom element is still loading.\n\t\t// aria-selected is the SINGLE source of truth here \u2014 daisyUI v5\n\t\t// styles `[aria-selected=true]` directly, so we deliberately do NOT\n\t\t// touch a `tab-active` class.\n\t\tconst panels = Array.from(root.querySelectorAll('[role=\"tabpanel\"]'));\n\t\tfor (const tab of tabs) {\n\t\t\tconst isActive = tab === target;\n\t\t\ttab.setAttribute('aria-selected', isActive ? 'true' : 'false');\n\t\t\ttab.setAttribute('tabindex', isActive ? '0' : '-1');\n\t\t}\n\t\tconst activeId = target.getAttribute('aria-controls');\n\t\tfor (const panel of panels) {\n\t\t\tpanel.hidden = panel.id !== activeId;\n\t\t}\n\t};\n\n\tconst wire = () => {\n\t\tfor (const root of document.querySelectorAll('[data-publier-cg]')) {\n\t\t\tif (root.dataset.wired === '1') continue;\n\t\t\troot.dataset.wired = '1';\n\n\t\t\tconst syncKey = root.dataset.syncKey || null;\n\t\t\tconst storageKey = syncKey ? SYNC_PREFIX + syncKey : null;\n\n\t\t\tif (storageKey) {\n\t\t\t\ttry {\n\t\t\t\t\tconst saved = localStorage.getItem(storageKey);\n\t\t\t\t\tif (saved) activateByLabel(root, saved);\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Listen for 'tab-container-changed' (past tense), NOT\n\t\t\t// 'tab-container-change'. The former fires AFTER the state is\n\t\t\t// applied; the latter fires BEFORE (it's the cancelable phase),\n\t\t\t// so the idempotence guard in activateByLabel reads stale\n\t\t\t// aria-selected and ends up looping infinitely.\n\t\t\troot.addEventListener('tab-container-changed', (ev) => {\n\t\t\t\t// tab-container-element exposes a typed 'tab' getter on the event;\n\t\t\t\t// 'ev.detail' is deprecated upstream and returns the PANEL (not\n\t\t\t\t// the tab button) behind a console.warn. Read '.tab' directly.\n\t\t\t\tconst tab = ev.tab;\n\t\t\t\tconst label = tab && tab.dataset ? tab.dataset.tabLabel : null;\n\t\t\t\tif (!label) return;\n\t\t\t\tif (storageKey) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlocalStorage.setItem(storageKey, label);\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t\tif (syncKey) {\n\t\t\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t\t\t'[data-publier-cg][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t\t\t);\n\t\t\t\t\tfor (const peer of peers) {\n\t\t\t\t\t\tif (peer === root) continue;\n\t\t\t\t\t\tactivateByLabel(peer, label);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\tif (!window.__publierCgStorageWired) {\n\t\twindow.__publierCgStorageWired = true;\n\t\twindow.addEventListener('storage', (ev) => {\n\t\t\tif (!ev.key || ev.key.indexOf(SYNC_PREFIX) !== 0 || ev.newValue == null) return;\n\t\t\tconst syncKey = ev.key.slice(SYNC_PREFIX.length);\n\t\t\tconst label = ev.newValue;\n\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t'[data-publier-cg][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t);\n\t\t\tfor (const root of peers) {\n\t\t\t\tactivateByLabel(root, label);\n\t\t\t}\n\t\t});\n\t}\n\n\twire();\n\tdocument.addEventListener('astro:page-load', wire);\n})();\n";
28
+ declare const CODE_GROUP_SYNC_SCRIPT = "\n(() => {\n\tconst SYNC_PREFIX = 'publier-code-group-sync:';\n\n\tconst activateByLabel = (root, label) => {\n\t\tconst tabs = Array.from(root.querySelectorAll('[role=\"tab\"]'));\n\t\tconst index = tabs.findIndex((t) => t.dataset.tabLabel === label);\n\t\tif (index < 0) return;\n\t\tconst target = tabs[index];\n\t\t// Idempotence guard: tab-container fires 'tab-container-changed'\n\t\t// unconditionally when selectTab runs, even when the index doesn't\n\t\t// change. Without this check, peer sync loops: root 0 syncs peer 1\n\t\t// peer 1 fires changed peer 1 syncs peers including root 0 →\n\t\t// stack-overflow. Skip if already on the requested label.\n\t\tif (target.getAttribute('aria-selected') === 'true') return;\n\t\t// tab-container-element's selectTab(index) expects a NUMBER, not an\n\t\t// element. Passing the tab button directly silently no-ops (coerces\n\t\t// to NaN). Pass the resolved index instead.\n\t\tif (typeof root.selectTab === 'function') {\n\t\t\troot.selectTab(index);\n\t\t\treturn;\n\t\t}\n\t\t// Pre-upgrade fallback: toggle ARIA + panel visibility manually so\n\t\t// SSR state stays coherent while the custom element is still loading.\n\t\t// aria-selected is the SINGLE source of truth here daisyUI v5\n\t\t// styles `[aria-selected=true]` directly, so we deliberately do NOT\n\t\t// touch a `tab-active` class.\n\t\tconst panels = Array.from(root.querySelectorAll('[role=\"tabpanel\"]'));\n\t\tfor (const tab of tabs) {\n\t\t\tconst isActive = tab === target;\n\t\t\ttab.setAttribute('aria-selected', isActive ? 'true' : 'false');\n\t\t\ttab.setAttribute('tabindex', isActive ? '0' : '-1');\n\t\t}\n\t\tconst activeId = target.getAttribute('aria-controls');\n\t\tfor (const panel of panels) {\n\t\t\tpanel.hidden = panel.id !== activeId;\n\t\t}\n\t};\n\n\tconst wire = () => {\n\t\tfor (const root of document.querySelectorAll('[data-publier-cg]')) {\n\t\t\tif (root.dataset.wired === '1') continue;\n\t\t\troot.dataset.wired = '1';\n\n\t\t\tconst syncKey = root.dataset.syncKey || null;\n\t\t\tconst storageKey = syncKey ? SYNC_PREFIX + syncKey : null;\n\n\t\t\tif (storageKey) {\n\t\t\t\ttry {\n\t\t\t\t\tconst saved = localStorage.getItem(storageKey);\n\t\t\t\t\tif (saved) activateByLabel(root, saved);\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Listen for 'tab-container-changed' (past tense), NOT\n\t\t\t// 'tab-container-change'. The former fires AFTER the state is\n\t\t\t// applied; the latter fires BEFORE (it's the cancelable phase),\n\t\t\t// so the idempotence guard in activateByLabel reads stale\n\t\t\t// aria-selected and ends up looping infinitely.\n\t\t\troot.addEventListener('tab-container-changed', (ev) => {\n\t\t\t\t// tab-container-element exposes a typed 'tab' getter on the event;\n\t\t\t\t// 'ev.detail' is deprecated upstream and returns the PANEL (not\n\t\t\t\t// the tab button) behind a console.warn. Read '.tab' directly.\n\t\t\t\tconst tab = ev.tab;\n\t\t\t\tconst label = tab && tab.dataset ? tab.dataset.tabLabel : null;\n\t\t\t\tif (!label) return;\n\t\t\t\tif (storageKey) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlocalStorage.setItem(storageKey, label);\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t\tif (syncKey) {\n\t\t\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t\t\t'[data-publier-cg][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t\t\t);\n\t\t\t\t\tfor (const peer of peers) {\n\t\t\t\t\t\tif (peer === root) continue;\n\t\t\t\t\t\tactivateByLabel(peer, label);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\tif (!window.__publierCgStorageWired) {\n\t\twindow.__publierCgStorageWired = true;\n\t\twindow.addEventListener('storage', (ev) => {\n\t\t\tif (!ev.key || ev.key.indexOf(SYNC_PREFIX) !== 0 || ev.newValue == null) return;\n\t\t\tconst syncKey = ev.key.slice(SYNC_PREFIX.length);\n\t\t\tconst label = ev.newValue;\n\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t'[data-publier-cg][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t);\n\t\t\tfor (const root of peers) {\n\t\t\t\tactivateByLabel(root, label);\n\t\t\t}\n\t\t});\n\t}\n\n\twire();\n\tdocument.addEventListener('astro:page-load', wire);\n})();\n";
29
29
  //#endregion
30
30
  export { CODE_GROUP_SYNC_SCRIPT };
@@ -1 +1 @@
1
- const e=()=>import(`@github/clipboard-copy-element`),t=()=>import(`@github/tab-container-element`),n=()=>import(`@github/relative-time-element`),r=()=>import(`../theme-toggle-element-BQrmGB8E.mjs`),i=()=>import(`../image-zoom-runtime-Cr8vBrXH.mjs`);export{e as upgradeClipboardCopy,i as upgradeImageZoom,n as upgradeRelativeTime,t as upgradeTabContainer,r as upgradeThemeToggle};
1
+ const e=()=>import(`@github/clipboard-copy-element`),t=()=>import(`@github/tab-container-element`),n=()=>import(`@github/relative-time-element`),r=()=>import(`../theme-toggle-element-DJTP9Mbw.mjs`),i=()=>import(`../image-zoom-runtime-CnJeWrYp.mjs`);export{e as upgradeClipboardCopy,i as upgradeImageZoom,n as upgradeRelativeTime,t as upgradeTabContainer,r as upgradeThemeToggle};
@@ -20,6 +20,6 @@
20
20
  * the lazy-upgrade bootstrap (`runtime/lazy-upgrade-init.ts`) defines it.
21
21
  * This script only layers peer / storage sync on top.
22
22
  */
23
- declare const TABS_SYNC_SCRIPT = "\n(() => {\n\tconst SYNC_PREFIX = 'publier-tabs-sync:';\n\n\tconst activateByLabel = (root, label) => {\n\t\tconst tabs = Array.from(root.querySelectorAll('[role=\"tab\"]'));\n\t\tconst index = tabs.findIndex((t) => t.dataset.tabLabel === label);\n\t\tif (index < 0) return;\n\t\tconst target = tabs[index];\n\t\t// Idempotence guard: tab-container fires 'tab-container-change'\n\t\t// unconditionally when selectTab runs, even when the index doesn't\n\t\t// change. Without this check, peer sync loops: root 0 syncs peer 1\n\t\t// \u2192 peer 1 fires change \u2192 peer 1 syncs peers including root 0 \u2192\n\t\t// stack-overflow. Skip if already on the requested label.\n\t\tif (target.getAttribute('aria-selected') === 'true') return;\n\t\t// tab-container-element's selectTab(index) expects a NUMBER, not an\n\t\t// element. Passing the tab button directly silently no-ops (coerces\n\t\t// to NaN). Pass the resolved index instead.\n\t\tif (typeof root.selectTab === 'function') {\n\t\t\troot.selectTab(index);\n\t\t\treturn;\n\t\t}\n\t\t// Pre-upgrade fallback: toggle ARIA + panel visibility manually so\n\t\t// SSR state stays coherent while the custom element is still loading.\n\t\t// aria-selected is the SINGLE source of truth here \u2014 daisyUI v5\n\t\t// styles `[aria-selected=true]` directly, so we deliberately do NOT\n\t\t// touch a `tab-active` class. (Toggling both would let a stale\n\t\t// `tab-active` linger on the previously-active tab once\n\t\t// `<tab-container>` upgrades and starts managing aria-selected\n\t\t// alone, which is what produced the double-highlight bug.)\n\t\tconst panels = Array.from(root.querySelectorAll('[role=\"tabpanel\"]'));\n\t\tfor (const tab of tabs) {\n\t\t\tconst isActive = tab === target;\n\t\t\ttab.setAttribute('aria-selected', isActive ? 'true' : 'false');\n\t\t\ttab.setAttribute('tabindex', isActive ? '0' : '-1');\n\t\t}\n\t\tconst activeId = target.getAttribute('aria-controls');\n\t\tfor (const panel of panels) {\n\t\t\tpanel.hidden = panel.id !== activeId;\n\t\t}\n\t};\n\n\tconst wire = () => {\n\t\tfor (const root of document.querySelectorAll('[data-publier-tabs]')) {\n\t\t\tif (root.dataset.wired === '1') continue;\n\t\t\troot.dataset.wired = '1';\n\n\t\t\tconst syncKey = root.dataset.syncKey || null;\n\t\t\tconst storageKey = syncKey ? SYNC_PREFIX + syncKey : null;\n\n\t\t\tif (storageKey) {\n\t\t\t\ttry {\n\t\t\t\t\tconst saved = localStorage.getItem(storageKey);\n\t\t\t\t\tif (saved) activateByLabel(root, saved);\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Listen for 'tab-container-changed' (past tense), NOT\n\t\t\t// 'tab-container-change'. The former fires AFTER the state is\n\t\t\t// applied; the latter fires BEFORE (it's the cancelable phase),\n\t\t\t// so the idempotence guard in activateByLabel reads stale\n\t\t\t// aria-selected and ends up looping infinitely.\n\t\t\troot.addEventListener('tab-container-changed', (ev) => {\n\t\t\t\t// tab-container-element exposes a typed 'tab' getter on the event;\n\t\t\t\t// 'ev.detail' is deprecated upstream and returns the PANEL (not\n\t\t\t\t// the tab button) behind a console.warn. Read '.tab' directly.\n\t\t\t\tconst tab = ev.tab;\n\t\t\t\tconst label = tab && tab.dataset ? tab.dataset.tabLabel : null;\n\t\t\t\tif (!label) return;\n\t\t\t\tif (storageKey) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlocalStorage.setItem(storageKey, label);\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t\tif (syncKey) {\n\t\t\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t\t\t'[data-publier-tabs][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t\t\t);\n\t\t\t\t\tfor (const peer of peers) {\n\t\t\t\t\t\tif (peer === root) continue;\n\t\t\t\t\t\tactivateByLabel(peer, label);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\tif (!window.__publierTabsStorageWired) {\n\t\twindow.__publierTabsStorageWired = true;\n\t\twindow.addEventListener('storage', (ev) => {\n\t\t\tif (!ev.key || ev.key.indexOf(SYNC_PREFIX) !== 0 || ev.newValue == null) return;\n\t\t\tconst syncKey = ev.key.slice(SYNC_PREFIX.length);\n\t\t\tconst label = ev.newValue;\n\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t'[data-publier-tabs][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t);\n\t\t\tfor (const root of peers) {\n\t\t\t\tactivateByLabel(root, label);\n\t\t\t}\n\t\t});\n\t}\n\n\twire();\n\tdocument.addEventListener('astro:page-load', wire);\n})();\n";
23
+ declare const TABS_SYNC_SCRIPT = "\n(() => {\n\tconst SYNC_PREFIX = 'publier-tabs-sync:';\n\n\tconst activateByLabel = (root, label) => {\n\t\tconst tabs = Array.from(root.querySelectorAll('[role=\"tab\"]'));\n\t\tconst index = tabs.findIndex((t) => t.dataset.tabLabel === label);\n\t\tif (index < 0) return;\n\t\tconst target = tabs[index];\n\t\t// Idempotence guard: tab-container fires 'tab-container-change'\n\t\t// unconditionally when selectTab runs, even when the index doesn't\n\t\t// change. Without this check, peer sync loops: root 0 syncs peer 1\n\t\t// peer 1 fires change peer 1 syncs peers including root 0 →\n\t\t// stack-overflow. Skip if already on the requested label.\n\t\tif (target.getAttribute('aria-selected') === 'true') return;\n\t\t// tab-container-element's selectTab(index) expects a NUMBER, not an\n\t\t// element. Passing the tab button directly silently no-ops (coerces\n\t\t// to NaN). Pass the resolved index instead.\n\t\tif (typeof root.selectTab === 'function') {\n\t\t\troot.selectTab(index);\n\t\t\treturn;\n\t\t}\n\t\t// Pre-upgrade fallback: toggle ARIA + panel visibility manually so\n\t\t// SSR state stays coherent while the custom element is still loading.\n\t\t// aria-selected is the SINGLE source of truth here daisyUI v5\n\t\t// styles `[aria-selected=true]` directly, so we deliberately do NOT\n\t\t// touch a `tab-active` class. (Toggling both would let a stale\n\t\t// `tab-active` linger on the previously-active tab once\n\t\t// `<tab-container>` upgrades and starts managing aria-selected\n\t\t// alone, which is what produced the double-highlight bug.)\n\t\tconst panels = Array.from(root.querySelectorAll('[role=\"tabpanel\"]'));\n\t\tfor (const tab of tabs) {\n\t\t\tconst isActive = tab === target;\n\t\t\ttab.setAttribute('aria-selected', isActive ? 'true' : 'false');\n\t\t\ttab.setAttribute('tabindex', isActive ? '0' : '-1');\n\t\t}\n\t\tconst activeId = target.getAttribute('aria-controls');\n\t\tfor (const panel of panels) {\n\t\t\tpanel.hidden = panel.id !== activeId;\n\t\t}\n\t};\n\n\tconst wire = () => {\n\t\tfor (const root of document.querySelectorAll('[data-publier-tabs]')) {\n\t\t\tif (root.dataset.wired === '1') continue;\n\t\t\troot.dataset.wired = '1';\n\n\t\t\tconst syncKey = root.dataset.syncKey || null;\n\t\t\tconst storageKey = syncKey ? SYNC_PREFIX + syncKey : null;\n\n\t\t\tif (storageKey) {\n\t\t\t\ttry {\n\t\t\t\t\tconst saved = localStorage.getItem(storageKey);\n\t\t\t\t\tif (saved) activateByLabel(root, saved);\n\t\t\t\t} catch {}\n\t\t\t}\n\n\t\t\t// Listen for 'tab-container-changed' (past tense), NOT\n\t\t\t// 'tab-container-change'. The former fires AFTER the state is\n\t\t\t// applied; the latter fires BEFORE (it's the cancelable phase),\n\t\t\t// so the idempotence guard in activateByLabel reads stale\n\t\t\t// aria-selected and ends up looping infinitely.\n\t\t\troot.addEventListener('tab-container-changed', (ev) => {\n\t\t\t\t// tab-container-element exposes a typed 'tab' getter on the event;\n\t\t\t\t// 'ev.detail' is deprecated upstream and returns the PANEL (not\n\t\t\t\t// the tab button) behind a console.warn. Read '.tab' directly.\n\t\t\t\tconst tab = ev.tab;\n\t\t\t\tconst label = tab && tab.dataset ? tab.dataset.tabLabel : null;\n\t\t\t\tif (!label) return;\n\t\t\t\tif (storageKey) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlocalStorage.setItem(storageKey, label);\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t\tif (syncKey) {\n\t\t\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t\t\t'[data-publier-tabs][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t\t\t);\n\t\t\t\t\tfor (const peer of peers) {\n\t\t\t\t\t\tif (peer === root) continue;\n\t\t\t\t\t\tactivateByLabel(peer, label);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n\n\tif (!window.__publierTabsStorageWired) {\n\t\twindow.__publierTabsStorageWired = true;\n\t\twindow.addEventListener('storage', (ev) => {\n\t\t\tif (!ev.key || ev.key.indexOf(SYNC_PREFIX) !== 0 || ev.newValue == null) return;\n\t\t\tconst syncKey = ev.key.slice(SYNC_PREFIX.length);\n\t\t\tconst label = ev.newValue;\n\t\t\tconst peers = document.querySelectorAll(\n\t\t\t\t'[data-publier-tabs][data-sync-key=\"' + syncKey + '\"]',\n\t\t\t);\n\t\t\tfor (const root of peers) {\n\t\t\t\tactivateByLabel(root, label);\n\t\t\t}\n\t\t});\n\t}\n\n\twire();\n\tdocument.addEventListener('astro:page-load', wire);\n})();\n";
24
24
  //#endregion
25
25
  export { TABS_SYNC_SCRIPT };
@@ -1,5 +1,4 @@
1
1
  import { Page, Page as Page$1, StructuredSection, StructuredSection as StructuredSection$1, TocEntry } from "@publier/native";
2
-
3
2
  //#region src/components/types.d.ts
4
3
  interface SidebarLink {
5
4
  type: 'link';
@@ -1,5 +1,4 @@
1
1
  import { Plugin } from "vite";
2
-
3
2
  //#region src/tailwind/css-plugin.d.ts
4
3
  /**
5
4
  * Virtual module IDs consumed by shell and Qwik prefetch helpers.
@@ -1,6 +1,5 @@
1
- import { i as listPresets, n as ThemePreset, r as isValidPreset, t as AVAILABLE_THEMES } from "../presets-RGpZ_X1B.mjs";
2
-
1
+ import { i as listPresets, n as ThemePreset, r as isValidPreset, t as AVAILABLE_THEMES } from "../presets-BpOSAh0T.mjs";
3
2
  //#region src/tailwind/index.d.ts
4
- declare const PRESET_CSS_PATH: "@publier/shell/tailwind/preset.css";
3
+ declare const PRESET_CSS_PATH: '@publier/shell/tailwind/preset.css';
5
4
  //#endregion
6
5
  export { AVAILABLE_THEMES, PRESET_CSS_PATH, type ThemePreset, isValidPreset, listPresets };
@@ -1 +1 @@
1
- import{n as e,r as t,t as n}from"../presets-DL0qjtya.mjs";const r=`@publier/shell/tailwind/preset.css`;export{n as AVAILABLE_THEMES,r as PRESET_CSS_PATH,e as isValidPreset,t as listPresets};
1
+ import{n as e,r as t,t as n}from"../presets-BSnEdPYj.mjs";const r=`@publier/shell/tailwind/preset.css`;export{n as AVAILABLE_THEMES,r as PRESET_CSS_PATH,e as isValidPreset,t as listPresets};
@@ -1,5 +1,4 @@
1
- import { i as listPresets, n as ThemePreset, r as isValidPreset, t as AVAILABLE_THEMES } from "../presets-RGpZ_X1B.mjs";
2
-
1
+ import { i as listPresets, n as ThemePreset, r as isValidPreset, t as AVAILABLE_THEMES } from "../presets-BpOSAh0T.mjs";
3
2
  //#region src/tailwind/override.d.ts
4
3
  /** Shape of a parsed `theme.yaml`. Fields match `content-spec/theme.schema.json`. */
5
4
  interface ThemeYaml {
@@ -22,7 +21,7 @@ interface ThemeYaml {
22
21
  favicon?: string;
23
22
  }
24
23
  /** Allow-listed override sections — parallel to the JSON Schema. */
25
- declare const THEME_SECTIONS: readonly ["colors", "typography", "layout", "prose", "code"];
24
+ declare const THEME_SECTIONS: readonly ['colors', 'typography', 'layout', 'prose', 'code'];
26
25
  type ThemeSection = (typeof THEME_SECTIONS)[number];
27
26
  /**
28
27
  * Keys accepted under each section. Mirrors content-spec/theme.schema.json.
@@ -68,7 +67,9 @@ declare function renderOverrideCss(overrides: Record<string, string>): string;
68
67
  * inside the returned ResolvedTheme (doctor-friendly — never throws).
69
68
  */
70
69
  declare function resolveThemeWithPreset(input: ThemeYaml | null | undefined, options: {
71
- /** Fallback preset when `theme.yaml` doesn't specify one. */defaultPreset: ThemePreset; /** Tester for whether a preset name is allowed. */
70
+ /** Fallback preset when `theme.yaml` doesn't specify one. */
71
+ defaultPreset: ThemePreset;
72
+ /** Tester for whether a preset name is allowed. */
72
73
  isValidPreset: (name: string) => boolean;
73
74
  }): ResolvedTheme & {
74
75
  preset: ThemePreset;
@@ -1,2 +1,2 @@
1
- import{n as e,r as t,t as n}from"../presets-DL0qjtya.mjs";import{tailwindComposeThemeCss as r,tailwindReadPresetCss as i,tailwindResolveTheme as a}from"@publier/native";import{fileURLToPath as o}from"node:url";const s=[`colors`,`typography`,`layout`,`prose`,`code`],c={colors:[`primary`,`primary-content`,`secondary`,`secondary-content`,`accent`,`accent-content`,`neutral`,`neutral-content`,`base-100`,`base-200`,`base-300`,`base-content`,`info`,`info-content`,`success`,`success-content`,`warning`,`warning-content`,`error`,`error-content`],typography:[`heading`,`body`,`mono`],layout:[`nav-height`,`sidebar-width`,`toc-width`,`page-max-width`],prose:[`content-gap-y`,`line-height`,`heading-line-height`],code:[`block-radius`,`inline-radius`,`inline-padding-y`,`inline-padding-x`]};function l(e){if(!e||typeof e!=`object`||Array.isArray(e))return{preset:void 0,overrides:{},overrideCss:``,errors:[]};let t=a(JSON.stringify(e));return{preset:t.preset??void 0,overrides:t.overrides,overrideCss:t.overrideCss,errors:t.errors.map(e=>({code:e.code,message:e.message,path:e.path}))}}function u(e){let t=Object.keys(e).sort();return t.length===0?``:`:root[data-theme="light"], :root[data-theme="dark"] {\n${t.map(t=>`\t${t}: ${e[t]};`).join(`
1
+ import{n as e,r as t,t as n}from"../presets-BSnEdPYj.mjs";import{tailwindComposeThemeCss as r,tailwindReadPresetCss as i,tailwindResolveTheme as a}from"@publier/native";import{fileURLToPath as o}from"node:url";const s=[`colors`,`typography`,`layout`,`prose`,`code`],c={colors:[`primary`,`primary-content`,`secondary`,`secondary-content`,`accent`,`accent-content`,`neutral`,`neutral-content`,`base-100`,`base-200`,`base-300`,`base-content`,`info`,`info-content`,`success`,`success-content`,`warning`,`warning-content`,`error`,`error-content`],typography:[`heading`,`body`,`mono`],layout:[`nav-height`,`sidebar-width`,`toc-width`,`page-max-width`],prose:[`content-gap-y`,`line-height`,`heading-line-height`],code:[`block-radius`,`inline-radius`,`inline-padding-y`,`inline-padding-x`]};function l(e){if(!e||typeof e!=`object`||Array.isArray(e))return{preset:void 0,overrides:{},overrideCss:``,errors:[]};let t=a(JSON.stringify(e));return{preset:t.preset??void 0,overrides:t.overrides,overrideCss:t.overrideCss,errors:t.errors.map(e=>({code:e.code,message:e.message,path:e.path}))}}function u(e){let t=Object.keys(e).sort();return t.length===0?``:`:root[data-theme="light"], :root[data-theme="dark"] {\n${t.map(t=>`\t${t}: ${e[t]};`).join(`
2
2
  `)}\n}\n`}function d(e,t){let n=l(e),r=t.defaultPreset;return n.preset!==void 0&&(t.isValidPreset(n.preset)?r=n.preset:n.errors.push({code:`unknown-preset`,message:`Unknown preset "${n.preset}". Theme will fall back to "${t.defaultPreset}".`,path:`preset`})),{...n,preset:r}}function f(e,t){return r(e,t)}const p=o(new URL(`./themes/`,import.meta.url));function m(e){return`${p}${e}.css`}async function h(e){return i(p,e)}export{n as AVAILABLE_THEMES,c as THEME_KEYS,s as THEME_SECTIONS,f as composeThemeCss,e as isValidPreset,t as listPresets,h as loadPresetCss,m as presetPath,u as renderOverrideCss,l as resolveTheme,d as resolveThemeWithPreset};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@publier/shell",
3
- "version": "3.2.0",
3
+ "version": "3.3.1",
4
4
  "license": "UNLICENSED",
5
5
  "description": "Qwik + Astro docs layout for Publier sites.",
6
6
  "_filesRationale": "mixed: dist for build-time TS + source globs for shipped .astro components",
@@ -108,18 +108,19 @@
108
108
  "access": "public"
109
109
  },
110
110
  "dependencies": {
111
- "@astrojs/rss": "^4.0.18",
112
- "@astrojs/sitemap": "^3.7.2",
111
+ "@astrojs/rss": "^4.0.19",
112
+ "@astrojs/sitemap": "^3.7.3",
113
113
  "@fontsource-variable/inter": "^5.2.8",
114
114
  "@fontsource-variable/jetbrains-mono": "^5.2.8",
115
- "@github/clipboard-copy-element": "^1.3.0",
116
- "@github/relative-time-element": "^5.0.0",
117
- "@github/tab-container-element": "^4.8.2",
118
- "@tailwindcss/typography": "^0.5.19",
119
- "astro-pagefind": "^1.8.6",
120
- "daisyui": "^5.5.19",
115
+ "@github/clipboard-copy-element": "^1.3.2",
116
+ "@github/relative-time-element": "^5.3.1",
117
+ "@github/tab-container-element": "^4.9.0",
118
+ "@publier/native": "2.0.0",
119
+ "@tailwindcss/typography": "^0.5.20",
120
+ "astro-pagefind": "^2.0.1",
121
+ "daisyui": "^5.7.22",
121
122
  "hastscript": "^9.0.1",
122
- "katex": "^0.16.45",
123
+ "katex": "^0.18.4",
123
124
  "mdast-util-directive": "^3.1.0",
124
125
  "mdast-util-from-markdown": "^2.0.3",
125
126
  "mdast-util-to-markdown": "^2.1.2",
@@ -132,8 +133,7 @@
132
133
  "remark-gfm": "^4.0.1",
133
134
  "remark-math": "^6.0.0",
134
135
  "unist-util-visit": "^5.1.0",
135
- "yaml": "^2.9.0",
136
- "@publier/native": "2.0.0"
136
+ "yaml": "^2.9.0"
137
137
  },
138
138
  "peerDependencies": {
139
139
  "@astrojs/markdown-remark": ">=7.0.0",
@@ -151,18 +151,21 @@
151
151
  }
152
152
  },
153
153
  "devDependencies": {
154
- "@astrojs/mdx": "^7.0.0",
155
- "@qwik.dev/core": "2.0.0-beta.40",
154
+ "@astrojs/markdown-remark": "7.2.4",
155
+ "@astrojs/mdx": "^7.0.8",
156
+ "@qwik.dev/astro": "^1.1.0",
157
+ "@qwik.dev/core": "2.0.0-beta.42",
156
158
  "@types/mdast": "^4.0.4",
157
- "astro": "7.0.0",
159
+ "astro": "7.2.6",
160
+ "astro-expressive-code": "^0.44.0",
158
161
  "rehype-stringify": "^10.0.1",
159
162
  "remark-parse": "^11.0.0",
160
163
  "remark-rehype": "^11.1.2",
161
- "tsdown": "^0.22.0",
162
- "typescript": "^6.0.3",
164
+ "tsdown": "^0.22.14",
165
+ "typescript": "^7.0.2",
163
166
  "unified": "^11.0.5",
164
167
  "vfile": "^6.0.3",
165
- "vite": "~8.0.16"
168
+ "vite": "~8.2.2"
166
169
  },
167
170
  "repository": {
168
171
  "type": "git",
@@ -1,103 +0,0 @@
1
- import{remarkAsides as e,remarkDirectivesRestoration as t}from"./plugins/remark-asides.mjs";import n from"./plugins/remark-snippets.mjs";import r from"./plugins/remark-vars.mjs";import{CODE_GROUP_SYNC_SCRIPT as i}from"./runtime/code-group-sync.mjs";import{TABS_SYNC_SCRIPT as a}from"./runtime/tabs-sync.mjs";import{publierCssPlugin as o,publierThemeCssPlugin as s}from"./tailwind/css-plugin.mjs";import{createRequire as c}from"node:module";import{configResolveShellConfig as l,generateAnalyticsScripts as u,shellAnnouncementBannerScript as d,shellBuildHeaders as f,shellBuildLicenseErrorMessage as ee,shellCacheControl as p,shellCollectTailwindClassTokens as m,shellComposeTailwindEntry as h,shellLazyUpgradeScript as g,shellOpenInAiScript as _,shellPlanDefaultRoutes as te,shellPlanRehypePlugins as ne,shellPlanRemarkPlugins as re,shellResolvePrefetch as ie,shellResolveSnippetsConfig as ae,shellRewriteHead as v,shellRewriteModulepreload as y,shellSearchButtonScript as b,shellSearchDialogScript as x,shellTableOfContentsScript as S,verifyLicense as oe}from"@publier/native";import{existsSync as C,mkdirSync as w,readFileSync as T,readdirSync as E,writeFileSync as D}from"node:fs";import{writeFile as O}from"node:fs/promises";import k from"node:path";import{fileURLToPath as A}from"node:url";import{fontProviders as j}from"astro/config";import M from"rehype-autolink-headings";import N from"rehype-external-links";import P from"remark-directive";const F=/^\/(?:_astro|assets|build)\//;function I(){return f()}function L(e){return p(e)}function R(e,t){let n=v(e,t.map(e=>e.pathname));return{stylesheetsCount:n.stylesheetsCount,modulesCount:n.modulesCount,pagesRewritten:n.pagesRewritten,stylesheets:n.stylesheets,modules:n.modules}}function z(e,t){let n=y(e,t.map(e=>e.pathname));return{jsCount:n.jsCount,fontsCount:n.fontsCount,pagesRewritten:n.pagesRewritten}}function se(e){let t=l(e),{config:n,errors:r}=JSON.parse(t);if(r.length>0){let e=r.map(e=>` - [${e.code}] ${e.path}: ${e.message}`);throw Error(`Invalid publier.config.yaml:\n${e.join(`
2
- `)}`)}return{...n,announcement:n.announcement??null}}function ce(e){let t=k.join(e,`publier.config.yaml`);if(!C(t))return null;try{return T(t,`utf-8`)}catch{return null}}function le(e,t){let n=c(import.meta.url);for(let t of[e,n])try{let e=t(`remark-math`),n=t(`rehype-katex`);return{remarkMath:e.default??e,rehypeKatex:n.default??n}}catch{}return t.warn("[@publier/shell] remark-math / rehype-katex unavailable in both project and shell. Reinstall node_modules, or set `docsShell({ math: false })` to opt out."),null}function ue(e,t){let n=c(import.meta.url);for(let t of[e,n])try{let e=t(`@astrojs/markdown-remark`);if(typeof e.unified==`function`)return e.unified}catch{}return t.warn("[@publier/shell] @astrojs/markdown-remark is not resolvable. On Astro 7 (Sätteri is the default Markdown processor) this means callouts, {{vars}}, <Snippet>, and math will NOT render — add `@astrojs/markdown-remark` to your dependencies."),null}function de(i,a,o){let s=JSON.parse(i),c=[];for(let i of s)switch(i.id){case`remark-vars`:a&&c.push([r,a]);break;case`remark-directive`:c.push(P);break;case`remark-asides`:c.push(e);break;case`remark-directives-restoration`:c.push(t);break;case`remark-snippets`:c.push([n,i.options]);break;case`remark-math`:o&&c.push(o.remarkMath);break}return c}function B(e,t){let n=JSON.parse(e),r=[];for(let e of n)switch(e.id){case`rehype-autolink-headings`:r.push([M,e.options]);break;case`rehype-external-links`:r.push([N,e.options]);break;case`rehype-katex`:t&&r.push(t.rehypeKatex);break}return r}async function V(e,t,n,r){if(e.mermaid===!1||t.some(e=>e.name===`astro-mermaid`))return;let i=c(import.meta.url),a=i(`node:fs`),o=i(`node:path`),{pathToFileURL:s}=i(`node:url`),l=o.join(n,`node_modules/astro-mermaid`),u;try{let e=JSON.parse(a.readFileSync(o.join(l,`package.json`),`utf8`)),t=e.exports?.[`.`]?.import??e.main;if(!t)return;u=o.join(l,t)}catch{return}let d=Function(`url`,`return import(url)`),f;try{f=await d(s(u).href)}catch{return}r({integrations:[(f.default??f)({autoTheme:!0})]})}const H=g();function fe({root:e,mathEnabled:t}){let n=c(import.meta.url),r=t=>{try{return k.dirname(n.resolve(`${t}/package.json`,{paths:[e]}))}catch{return null}},i=(e,t)=>{let n=r(e);return n?{abs_path:k.join(n,t).split(k.sep).join(`/`)}:null},a=[i(`@publier/shell`,`src/components`),i(`@publier/shell`,`src/components/ui`),i(`@publier/shell`,`src/routes`),i(`@publier/primitives`,`src/components`)].filter(e=>e!==null),o=null;if(t)try{o=n.resolve(`katex/dist/katex.min.css`).split(k.sep).join(`/`)}catch{o=null}let s=h(JSON.stringify(a),o??void 0),l=m(),u=k.join(e,`.astro`);if(l.length>0){C(u)||w(u,{recursive:!0});let e=k.join(u,`publier-class-safelist.html`),t=l.split(/\s+/).filter(Boolean),n=[];for(let e=0;e<t.length;e+=200)n.push(t.slice(e,e+200).join(` `));D(e,n.map(e=>`<div class="${e}"></div>`).join(`
3
- `),`utf8`);let r=e.split(k.sep).join(`/`);s+=`@source "${r}";\n`}let d=k.join(u,`publier-tailwind-entry.css`);return(C(d)?T(d,`utf8`):``)!==s&&(w(u,{recursive:!0}),D(d,s)),d}function pe(e,t,n){if(U(n))return[];try{let n=e(`@tailwindcss/vite`),r=typeof n==`function`?n:n.default;if(!r)return t.warn(`[@publier/shell] @tailwindcss/vite resolved but has no callable default export. Tailwind v4 + daisyUI utilities WILL NOT be emitted.`),[];let i=r();return Array.isArray(i)?i:[i]}catch{return t.warn('[@publier/shell] @tailwindcss/vite is not installed in this project. Tailwind v4 + daisyUI utilities WILL NOT be emitted — the site will render unstyled. Add `"@tailwindcss/vite": "^4"` to your package.json alongside `tailwindcss`.'),[]}}function U(e){for(let t of e){if(!t)continue;if(Array.isArray(t)){if(U(t))return!0;continue}let e=t.name;if(typeof e==`string`&&e.startsWith(`@tailwindcss/vite`))return!0}return!1}function me(e){return{name:`publier-tailwind-entry-hmr-shim`,apply:`serve`,configureServer(t){let n=t.config.root,r=e.entryPath.startsWith(n)?e.entryPath.slice(n.length).split(k.sep).join(`/`):null;r&&t.middlewares.use(r,(e,t,n)=>{if((e.url??``).includes(`?`)||e.method!==`GET`&&e.method!==`HEAD`)return n();t.setHeader(`Content-Type`,`application/javascript`),t.setHeader(`Cache-Control`,`no-cache`),t.statusCode=200,t.end(`
4
- if (import.meta.hot) {
5
- import.meta.hot.accept();
6
- }
7
- `)})}}}const W=`import 'astro:scripts/page-ssr.js';
8
- `;function G(){return{name:`publier-dev-page-ssr-propagation`,apply:`serve`,enforce:`post`,transform(e,t){let n=t.split(`?`)[0];return!n.endsWith(`.astro`)||!n.includes(`/src/pages/`)||e.includes(W)?null:{code:W+e,map:null}}}}function K(e,t){let n=e[t];if(n===`\\`&&t+1<e.length)return t+2;if(n===`"`||n===`'`){let r=n,i=t+1;for(;i<e.length&&e[i]!==r;)e[i]===`\\`&&i+1<e.length?i+=2:i++;return i+1}if(n===`/`&&e[t+1]===`*`){let n=e.indexOf(`*/`,t+2);return n===-1?e.length:n+2}return t}function q(e,t){let n=1,r=t+1;for(;r<e.length&&n>0;){let t=K(e,r);if(t!==r){r=t;continue}let i=e[r];i===`{`?n++:i===`}`&&n--,r++}return r}function J(e){let t=[],n=(r,i)=>{let a=r,o=``,s=r;for(;a<i;){let r=K(e,a);if(r!==a){a=r;continue}let c=e[a];if(c===`@`&&e.startsWith(`@media`,a)&&/[\s(]/.test(e[a+6]??``)){let n=e.indexOf(`{`,a);if(n===-1||n>=i){a++;continue}let r=q(e,n);o+=e.slice(s,a),t.push(e.slice(a,r)),a=r,s=a;continue}if(c===`{`){let t=q(e,a);if(t>i)break;let r=n(a+1,t-1);o+=e.slice(s,a+1)+r+`}`,a=t,s=a;continue}a++}return o+=e.slice(s,i),o},r=0,i=``;for(;r<e.length;){let t=K(e,r);if(t!==r){r=t;continue}let a=e.indexOf(`@layer utilities`,r);if(a===-1){i+=e.slice(r);break}let o=e[a+16];if(o!==` `&&o!==` `&&o!==`
9
- `&&o!==`\r`&&o!==`{`){r=a+16;continue}let s=r,c=!1;for(;s<a;){let t=K(e,s);if(t!==s){if(t>a){c=!0,r=t;break}s=t}else s++}if(c)continue;let l=e.indexOf(`{`,a);if(l===-1){i+=e.slice(r);break}i+=e.slice(r,l+1);let u=q(e,l);i+=n(l+1,u-1),i+=`}`,r=u}return t.length>0&&(i.endsWith(`
10
- `)||(i+=`
11
- `),i+=t.join(`
12
- `),i.endsWith(`
13
- `)||(i+=`
14
- `)),i}function Y(){return{name:`publier-cascade-hoist`,enforce:`post`,transform(e,t){if(!t.endsWith(`.css`)&&!t.includes(`.css?`))return null;let n=J(e);return n===e?null:{code:n,map:null}},generateBundle(e,t){for(let e of Object.keys(t)){if(!e.endsWith(`.css`))continue;let n=t[e];if(!n||n.type!==`asset`)continue;let r=typeof n.source==`string`?n.source:new TextDecoder().decode(n.source),i=J(r);i!==r&&(n.source=i)}}}}function X(e,t,n){let r=`\0${e}`,i=`export const ${t} = ${JSON.stringify(n)};`;return{name:`publier-${e.replace(/^virtual:publier-/,``)}`,resolveId(t){if(t===e)return r},load(e){if(e===r)return i}}}function Z(e,t=6){return e.length===0?`[]`:e.length<=t?`[${e.join(`, `)}]`:`[${e.slice(0,t).join(`, `)}, +${e.length-t} more]`}function he(e){let t=[H,a,i,d(),_(),S()];return e.searchEnabled&&t.push(x(),b()),t.join(`
15
- `)}function ge(e,t){let n=[],r=[],i=[];for(let a of[`heading`,`body`,`mono`]){let o=e[a];if(!o?.family)continue;let s=`--publier-font-${a}`,c=a===`mono`?[`monospace`]:[`system-ui`,`sans-serif`],l=[o.weight??`400`],u=[o.style??`normal`];if(o.googleFontsUrl)n.push({name:o.family,cssVariable:s,provider:j.google(),fallbacks:c,weights:l,styles:u,subsets:[`latin`]}),r.push(a);else if(o.src){let e=k.isAbsolute(o.src)&&C(o.src)?o.src:k.join(t,`public`,o.src.replace(/^\/+/,``));n.push({name:o.family,cssVariable:s,provider:j.local(),fallbacks:c,weights:l,styles:u,subsets:[`latin`],options:{variants:[{weight:l[0],style:u[0],src:[e]}]}}),r.push(a)}else i.push(`${s}:"${o.family}",${c.join(`,`)};`)}return{entries:n,familyOnlyCss:i.length?`:root{${i.join(``)}}`:``,slots:r}}const _e=[{pkg:`astro-expressive-code`,aliases:[`astro-expressive-code`]},{pkg:`@astrojs/mdx`,aliases:[`@astrojs/mdx`]},{pkg:`@astrojs/sitemap`,aliases:[`@astrojs/sitemap`]},{pkg:`astro-pagefind`,aliases:[`astro-pagefind`,`pagefind`]},{pkg:`@qwik.dev/astro`,aliases:[`@qwik.dev/astro`]}];function Q(e,t){let n=k.join(e,`src`,`content`,t);if(!C(n))return!1;try{return E(n,{recursive:!0}).some(e=>typeof e==`string`&&/\.mdx?$/.test(e))}catch{return!1}}function $(e={}){return{name:`@publier/shell`,hooks:{"astro:config:setup":async({config:t,updateConfig:n,injectScript:r,injectRoute:i,logger:a})=>{let l=t.root?A(t.root):process.cwd();try{oe()}catch(e){let t=ee(e instanceof Error?e.message:String(e));throw t?Error(t):e}let d=c(k.join(l,`package.json`)),f=JSON.stringify(e),p=se(ce(l)??``),m=p.site,h=p.vars,g=p.fonts,_=p.nav,v=p.announcement,y=p.docs,b=typeof m.url==`string`&&m.url.length>0;b&&!t.site&&n({site:m.url});let x=new Set(t.integrations.map(e=>e.name)),S=_e.filter(({aliases:e})=>!e.some(e=>x.has(e)));S.length>0&&a.warn(`[@publier/shell] Required framework integrations are not registered in
16
- astro.config.ts. As of @publier/shell@2.0.0, docsShell() no longer
17
- auto-wires these. Add the following to your integrations[] array
18
- (import statements + entries shown). Order matters: docsShell() must
19
- come FIRST (astro-expressive-code >=0.43 registers into the Markdown
20
- processor it finds at its own setup — docsShell's pinned unified()
21
- processor must already be in place), and expressive-code must precede
22
- mdx.
23
-
24
- import expressiveCode from 'astro-expressive-code';
25
- import mdx from '@astrojs/mdx';
26
- import sitemap from '@astrojs/sitemap';
27
- import pagefind from 'astro-pagefind';
28
- import qwik from '@qwik.dev/astro';
29
-
30
- integrations: [
31
- docsShell({ /* options */ }),
32
- expressiveCode(),
33
- mdx(),
34
- sitemap(),
35
- pagefind(),
36
- qwik({ clientRouter: true }),
37
- ]
38
-
39
- Missing:\n ${S.map(e=>e.pkg).join(`
40
- `)}\n`);let w=t.prefetch;ie(w===void 0?void 0:JSON.stringify(w),f)&&n({prefetch:{prefetchAll:!0,defaultStrategy:`viewport`}});let{entries:T,familyOnlyCss:E,slots:D}=g?ge(g,l):{entries:[],familyOnlyCss:``,slots:[]},O=p.snippets??null,M=ae(f,(O==null?null:O===!1?`false`:JSON.stringify(O))??void 0,C(k.join(l,`content/snippets`))),N=JSON.parse(M),P={...e,snippets:N===null?void 0:N},F=JSON.stringify(P),I=e.math!==!1,L=I?le(d,a):null,R=re(F,!!(h&&Object.keys(h).length>0),N!==null&&N!==!1,I&&L!==null),z=ne(f,I&&L!==null),H=de(R,h,L),U=B(z,L),W=ue(d,a);await V(e,t.integrations,l,n);let K=fe({root:l,mathEnabled:I}),q=he({searchEnabled:e.search!==!1}),J=JSON.stringify({docs:Q(l,`docs`),blog:Q(l,`blog`),changelog:Q(l,`changelog`)}),Z=JSON.parse(te(f,b,J)),$=Z.filter(e=>e.pattern.endsWith(`/rss.xml`)).map(e=>({title:e.pattern===`/blog/rss.xml`?`Blog feed`:e.pattern===`/changelog/rss.xml`?`Changelog feed`:e.pattern,href:e.pattern}));if(W){let e=t.markdown?.processor,n=e?.options?.hastPlugins;e?.name!==`unified`&&Array.isArray(n)&&n.length>0&&a.warn(`[@publier/shell] docsShell() is replacing the configured "${e?.name}" Markdown processor, discarding ${n.length} HAST plugin(s) another integration already registered on it — typically astro-expressive-code >=0.43, which registers into the processor it finds at its own setup. Code fences will silently lose ALL processing (plain <pre><code>, no syntax highlighting). Fix: move docsShell() BEFORE expressiveCode() (and any other Markdown-processor-touching integration) in astro.config.ts integrations[] so they register into docsShell's unified() processor instead.`)}n({markdown:W?{processor:W({remarkPlugins:H,rehypePlugins:U})}:{remarkPlugins:[...H],rehypePlugins:[...U]},vite:{ssr:{noExternal:[`@publier/shell`,`@qwik.dev/core`,`@qwik.dev/astro`],external:[`@publier/native`]},build:{rollupOptions:{external:[`@publier/native`]}},optimizeDeps:{exclude:[`@publier/shell`,`@publier/native`]},plugins:[...pe(d,a,t.vite?.plugins??[]),s({root:l}),o({root:l}),X(`virtual:publier-nav-config`,`navConfig`,_),me({entryPath:K}),G(),X(`virtual:publier-announcement`,`announcement`,v),X(`virtual:publier-site`,`site`,m),X(`virtual:publier-docs-config`,`docsConfig`,y),X(`virtual:publier-feeds`,`feeds`,$),X(`virtual:publier-fonts`,`fonts`,{slots:D}),Y()]}}),n({fonts:[{name:`Inter Variable`,cssVariable:`--publier-font-builtin-sans`,provider:j.npm({remote:!1}),fallbacks:[`system-ui`,`sans-serif`],weights:[`100 900`],styles:[`normal`],subsets:[`latin`],options:{package:`@fontsource-variable/inter`}},{name:`JetBrains Mono Variable`,cssVariable:`--publier-font-builtin-mono`,provider:j.npm({remote:!1}),fallbacks:[`monospace`],weights:[`100 800`],styles:[`normal`],subsets:[`latin`],options:{package:`@fontsource-variable/jetbrains-mono`}},...T]}),r(`page-ssr`,[`import ${JSON.stringify(K)};`,`import 'virtual:publier-theme-css';`,`import 'virtual:publier-custom-css';`,`import '@publier/shell/styles/base.css';`].join(`
41
- `)),r(`page`,q),r(`head-inline`,`(function(){
42
- if (typeof window === 'undefined' || !window.sessionStorage || !window.fetch) return;
43
- var store = window.sessionStorage;
44
- var ResponseCtor = window.Response;
45
- var origFetch = window.fetch.bind(window);
46
- var NS = 'publier:bg:';
47
- var PATTERN = /^\\/(?:_astro|assets|build)\\/(?:[^\\/]*bundle-graph[^\\/]*\\.json|q-manifest[^\\/]*\\.json)(?:\\?.*)?$/;
48
-
49
-
50
-
51
-
52
- var inflight = Object.create(null);
53
- function serve(body){
54
- return new ResponseCtor(body, {
55
- status: 200,
56
- headers: { 'content-type': 'application/json' }
57
- });
58
- }
59
- window.fetch = function(input, init){
60
- var url = typeof input === 'string' ? input : (input && input.url) || '';
61
- var method = (init && init.method) || (input && input.method) || 'GET';
62
- if (!url || method !== 'GET' || !PATTERN.test(url)) {
63
- return origFetch(input, init);
64
- }
65
- var key = NS + url;
66
-
67
- try {
68
- var hit = store.getItem(key);
69
- if (hit !== null) return Promise.resolve(serve(hit));
70
- } catch (_) {}
71
-
72
-
73
- if (inflight[url]) return inflight[url].then(serve);
74
-
75
-
76
- var pending = origFetch(input, init).then(function(res){
77
- if (res && res.ok) {
78
- return res.clone().text().then(function(body){
79
- try { store.setItem(key, body); } catch (_) {}
80
- delete inflight[url];
81
- return res;
82
- });
83
- }
84
- delete inflight[url];
85
- return res;
86
- }, function(err){
87
- delete inflight[url];
88
- throw err;
89
- });
90
-
91
- inflight[url] = pending.then(function(res){
92
- return res && res.ok ? res.clone().text() : '';
93
- });
94
- return pending;
95
- };
96
- })();`),E&&r(`head-inline`,`
97
- const _pFonts = document.createElement('style');
98
- _pFonts.textContent = ${JSON.stringify(E)};
99
- document.head.appendChild(_pFonts);
100
- `);{let e=p.analytics;if(e){let t=u(e);t&&r(`head-inline`,`
101
- const _pAnalytics = document.createRange().createContextualFragment(${JSON.stringify(t)});
102
- document.head.appendChild(_pAnalytics);
103
- `)}}for(let e of Z)i({pattern:e.pattern,entrypoint:e.entrypoint,prerender:e.prerender});Z.length>0&&a.info(`[@publier/shell] Injected default routes: ${Z.map(e=>e.pattern).join(`, `)}.`),a.info(`[@publier/shell] Plugin pipeline wired.`)},"astro:build:done":async({dir:e,pages:t,logger:n})=>{let r=A(e);await O(k.join(r,`_headers`),I(),`utf-8`),n.info(`[@publier/shell] Wrote 5 header rules to dist/_headers.`);let i=R(r,t);i.pagesRewritten>0&&n.info(`[@publier/shell] Backfilled head tags on ${i.pagesRewritten} HTML file(s) (stylesheets=${Z(i.stylesheets)}, modules=${Z(i.modules)}).`);let a=z(r,t);a.pagesRewritten>0&&n.info(`[@publier/shell] Injected preload tags into ${a.pagesRewritten} HTML file(s) (js=${a.jsCount}, fonts=${a.fontsCount}).`)}}}}export{L as a,F as i,J as n,Y as r,$ as t};