@publier/shell 3.1.5

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.
Files changed (140) hide show
  1. package/README.md +1 -0
  2. package/dist/build-integration.d.mts +7 -0
  3. package/dist/build-integration.mjs +1 -0
  4. package/dist/image-zoom-runtime-Cr8vBrXH.mjs +1 -0
  5. package/dist/index-Bc-beOEe.d.mts +1033 -0
  6. package/dist/index.d.mts +33 -0
  7. package/dist/index.mjs +1 -0
  8. package/dist/integration-6L__3wwu.mjs +102 -0
  9. package/dist/integration-DKTmdCWN.d.mts +203 -0
  10. package/dist/integration.d.mts +2 -0
  11. package/dist/integration.mjs +1 -0
  12. package/dist/loaders/index.d.mts +54 -0
  13. package/dist/loaders/index.mjs +1 -0
  14. package/dist/plugins/remark-asides.d.mts +8 -0
  15. package/dist/plugins/remark-asides.mjs +2 -0
  16. package/dist/plugins/remark-snippets.d.mts +11 -0
  17. package/dist/plugins/remark-snippets.mjs +1 -0
  18. package/dist/plugins/remark-structure.d.mts +13 -0
  19. package/dist/plugins/remark-structure.mjs +1 -0
  20. package/dist/plugins/remark-vars.d.mts +7 -0
  21. package/dist/plugins/remark-vars.mjs +1 -0
  22. package/dist/presets-DL0qjtya.mjs +1 -0
  23. package/dist/presets-RGpZ_X1B.d.mts +16 -0
  24. package/dist/runtime/code-group-sync.d.mts +30 -0
  25. package/dist/runtime/code-group-sync.mjs +103 -0
  26. package/dist/runtime/lazy-upgrade-registry.d.mts +41 -0
  27. package/dist/runtime/lazy-upgrade-registry.mjs +1 -0
  28. package/dist/runtime/tabs-sync.d.mts +25 -0
  29. package/dist/runtime/tabs-sync.mjs +106 -0
  30. package/dist/search/index.d.mts +92 -0
  31. package/dist/search/index.mjs +1 -0
  32. package/dist/tailwind/css-plugin.d.mts +16 -0
  33. package/dist/tailwind/css-plugin.mjs +1 -0
  34. package/dist/tailwind/index.d.mts +6 -0
  35. package/dist/tailwind/index.mjs +1 -0
  36. package/dist/tailwind/loader.d.mts +94 -0
  37. package/dist/tailwind/loader.mjs +2 -0
  38. package/dist/theme-toggle-element-DzFjxwpS.mjs +1 -0
  39. package/dist/themes/almond.css +115 -0
  40. package/dist/themes/aspen.css +95 -0
  41. package/dist/themes/catppuccin.css +98 -0
  42. package/dist/themes/dark.css +98 -0
  43. package/dist/themes/dusk.css +98 -0
  44. package/dist/themes/emerald.css +95 -0
  45. package/dist/themes/light.css +95 -0
  46. package/dist/themes/maple.css +119 -0
  47. package/dist/themes/neutral.css +73 -0
  48. package/dist/themes/ocean.css +98 -0
  49. package/dist/themes/purple.css +95 -0
  50. package/dist/themes/ruby.css +95 -0
  51. package/dist/themes/solar.css +98 -0
  52. package/dist/themes/vitepress.css +95 -0
  53. package/package.json +178 -0
  54. package/src/astro-modules.d.ts +20 -0
  55. package/src/components/LastModified.astro +25 -0
  56. package/src/components/announcement-banner.astro +25 -0
  57. package/src/components/aside.astro +17 -0
  58. package/src/components/ask-ai.tsx +146 -0
  59. package/src/components/badge.astro +18 -0
  60. package/src/components/breadcrumbs.astro +23 -0
  61. package/src/components/callouts/caution.astro +13 -0
  62. package/src/components/callouts/check.astro +13 -0
  63. package/src/components/callouts/danger.astro +13 -0
  64. package/src/components/callouts/info.astro +13 -0
  65. package/src/components/callouts/note.astro +13 -0
  66. package/src/components/callouts/tip.astro +13 -0
  67. package/src/components/callouts/warning.astro +13 -0
  68. package/src/components/card-grid.astro +14 -0
  69. package/src/components/card.astro +18 -0
  70. package/src/components/code-group.astro +55 -0
  71. package/src/components/columns.astro +18 -0
  72. package/src/components/docs-layout.astro +25 -0
  73. package/src/components/file-tree-node.astro +13 -0
  74. package/src/components/file-tree.astro +9 -0
  75. package/src/components/icon.astro +18 -0
  76. package/src/components/index.ts +154 -0
  77. package/src/components/link-button.astro +21 -0
  78. package/src/components/link-card.astro +21 -0
  79. package/src/components/open-in-ai.astro +13 -0
  80. package/src/components/package-install.astro +17 -0
  81. package/src/components/panels.astro +16 -0
  82. package/src/components/search-button.astro +21 -0
  83. package/src/components/sidebar.astro +12 -0
  84. package/src/components/skip-link.astro +12 -0
  85. package/src/components/steps.astro +13 -0
  86. package/src/components/table-of-contents.astro +22 -0
  87. package/src/components/tabs.astro +17 -0
  88. package/src/components/theme-storage.ts +5 -0
  89. package/src/components/theme-toggle-element.ts +85 -0
  90. package/src/components/theme-toggle.astro +25 -0
  91. package/src/components/tile-grid.astro +13 -0
  92. package/src/components/tile.astro +17 -0
  93. package/src/components/top-nav-mobile.astro +11 -0
  94. package/src/components/top-nav.astro +20 -0
  95. package/src/components/types.ts +522 -0
  96. package/src/components/ui/blur-image.astro +60 -0
  97. package/src/components/ui/changelog-entry.astro +56 -0
  98. package/src/components/ui/cta-band.astro +30 -0
  99. package/src/components/ui/feature-grid.astro +38 -0
  100. package/src/components/ui/feature-section.astro +85 -0
  101. package/src/components/ui/frame.astro +52 -0
  102. package/src/components/ui/hero.astro +47 -0
  103. package/src/components/ui/jobs-list.astro +53 -0
  104. package/src/components/ui/logo-cloud.astro +68 -0
  105. package/src/components/ui/press-gallery.astro +52 -0
  106. package/src/components/ui/pricing-comparison-table.astro +73 -0
  107. package/src/components/ui/pricing-section.astro +113 -0
  108. package/src/components/ui/pricing-table.astro +54 -0
  109. package/src/components/ui/status-indicator.astro +38 -0
  110. package/src/components/ui/team-grid.astro +63 -0
  111. package/src/components/ui/testimonial-card.astro +42 -0
  112. package/src/components/ui/types.ts +323 -0
  113. package/src/components/update-badge.astro +15 -0
  114. package/src/components/version-switcher.astro +20 -0
  115. package/src/icons/index.tsx +195 -0
  116. package/src/layouts/base-layout.astro +65 -0
  117. package/src/qwik.ts +3 -0
  118. package/src/routes/blog-index.astro +20 -0
  119. package/src/routes/blog-rss.xml.ts +40 -0
  120. package/src/routes/blog-slug.astro +32 -0
  121. package/src/routes/changelog-index.astro +25 -0
  122. package/src/routes/changelog-rss.xml.ts +47 -0
  123. package/src/routes/docs-slug.astro +31 -0
  124. package/src/routes/not-found.astro +14 -0
  125. package/src/runtime/banner-init.ts +9 -0
  126. package/src/runtime/lazy-upgrade-init.ts +5 -0
  127. package/src/runtime/sidebar-scroll-init.ts +3 -0
  128. package/src/runtime/theme-init.ts +16 -0
  129. package/src/schemas/blog.ts +38 -0
  130. package/src/schemas/changelog.ts +29 -0
  131. package/src/schemas/common.ts +88 -0
  132. package/src/schemas/docs.ts +104 -0
  133. package/src/schemas/index.ts +14 -0
  134. package/src/schemas/pages.ts +23 -0
  135. package/src/styles/base.css +627 -0
  136. package/src/styles/expressive-code.css +41 -0
  137. package/src/styles/rules.css +66 -0
  138. package/src/styles/tailwind-sources.css +17 -0
  139. package/src/tailwind/preset.css +193 -0
  140. package/src/virtual-modules.d.ts +164 -0
@@ -0,0 +1,33 @@
1
+ import { i as DocsShellOptions, p as docsShell } from "./integration-DKTmdCWN.mjs";
2
+ //#region src/build/headers.d.ts
3
+ /**
4
+ * Cache-control + security headers emitted by `docsShell()` during
5
+ * `astro:build:done`. Writes `dist/_headers` in the Netlify / Cloudflare
6
+ * Pages native format; both platforms interpret it identically (longest
7
+ * path match wins, same-named headers override less-specific rules,
8
+ * different-named headers merge).
9
+ *
10
+ * The same rule table is also exposed via `publierCacheControl(path)` for
11
+ * customers self-hosting with a Node / Bun / Deno server who want to
12
+ * apply identical response-header policy at the runtime layer. The regex
13
+ * is the authoritative definition; the `_headers` globs mirror it.
14
+ */
15
+ /**
16
+ * Hashed-asset path prefixes. Files under these dirs are content-addressed
17
+ * (filename changes on rebuild), so they are safe to mark immutable for a
18
+ * year. Keep in sync with the Rust `HASHED_PREFIXES` constant in
19
+ * `native/src/build_hooks/headers.rs`.
20
+ */
21
+ declare const HASHED_ASSET_RE: RegExp;
22
+ /**
23
+ * Runtime helper for customers self-hosting with a Node/Bun/Deno server:
24
+ *
25
+ * import { publierCacheControl } from '@publier/shell';
26
+ * response.headers.set('Cache-Control', publierCacheControl(url.pathname));
27
+ *
28
+ * Returns the same policy the `_headers` file encodes, so CDN-hosted and
29
+ * self-hosted Publier sites behave identically.
30
+ */
31
+ declare function publierCacheControl(path: string): string;
32
+ //#endregion
33
+ export { type DocsShellOptions, HASHED_ASSET_RE, docsShell, publierCacheControl };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ import{d as e,f as t,t as n}from"./integration-6L__3wwu.mjs";export{e as HASHED_ASSET_RE,n as docsShell,t as publierCacheControl};
@@ -0,0 +1,102 @@
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{generateAnalyticsScripts as l,shellAnnouncementBannerScript as u,shellBuildHeaders as d,shellBuildLicenseErrorMessage as f,shellCacheControl as p,shellCollectTailwindClassTokens as m,shellComposeTailwindEntry as h,shellExtractAnalyticsFromYaml as g,shellExtractAnnouncementFromYaml as _,shellExtractDocsConfigFromYaml as v,shellExtractFontsFromYaml as y,shellExtractNavFromYaml as b,shellExtractSiteFromYaml as x,shellExtractSnippetsFromYaml as S,shellExtractVarsFromYaml as C,shellLazyUpgradeScript as w,shellOpenInAiScript as T,shellPlanDefaultRoutes as ee,shellPlanRehypePlugins as te,shellPlanRemarkPlugins as ne,shellResolvePrefetch as re,shellResolveSnippetsConfig as ie,shellRewriteHead as ae,shellRewriteModulepreload as E,shellSearchButtonScript as D,shellSearchDialogScript as O,shellTableOfContentsScript as k,verifyLicense as oe}from"@publier/native";import{existsSync as A,mkdirSync as j,readFileSync as M,readdirSync as N,writeFileSync as P}from"node:fs";import{writeFile as se}from"node:fs/promises";import F from"node:path";import{fileURLToPath as I}from"node:url";import{fontProviders as L}from"astro/config";import R from"rehype-autolink-headings";import z from"rehype-external-links";import B from"remark-directive";const V=/^\/(?:_astro|assets|build)\//;function H(){return d()}function U(e){return p(e)}function W(e,t){let n=ae(e,t.map(e=>e.pathname));return{stylesheetsCount:n.stylesheetsCount,modulesCount:n.modulesCount,pagesRewritten:n.pagesRewritten,stylesheets:n.stylesheets,modules:n.modules}}function G(e,t){let n=E(e,t.map(e=>e.pathname));return{jsCount:n.jsCount,fontsCount:n.fontsCount,pagesRewritten:n.pagesRewritten}}function K(e){let t=C(e);return t?JSON.parse(t):void 0}function q(e){let t=y(e);return t?JSON.parse(t):void 0}function ce(e){let t=g(e);return t?JSON.parse(t):void 0}function J(e){let t=_(e);return t?JSON.parse(t):null}function le(e){let t=S(e);if(t)return t===`false`?!1:JSON.parse(t)}function ue(e){return JSON.parse(x(e))}function de(e){return JSON.parse(v(e))}function fe(e){return JSON.parse(b(e))}function pe(e){let t=F.join(e,`publier.config.yaml`);if(!A(t))return null;try{return M(t,`utf-8`)}catch{return null}}function me(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 he(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 ge(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(B);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 _e(e,t){let n=JSON.parse(e),r=[];for(let e of n)switch(e.id){case`rehype-autolink-headings`:r.push([R,e.options]);break;case`rehype-external-links`:r.push([z,e.options]);break;case`rehype-katex`:t&&r.push(t.rehypeKatex);break}return r}async function ve(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 ye=w();function be({root:e,mathEnabled:t}){let n=c(import.meta.url),r=t=>{try{return F.dirname(n.resolve(`${t}/package.json`,{paths:[e]}))}catch{return null}},i=(e,t)=>{let n=r(e);return n?{abs_path:F.join(n,t).split(F.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(F.sep).join(`/`)}catch{o=null}let s=h(JSON.stringify(a),o??void 0),l=m(),u=F.join(e,`.astro`);if(l.length>0){A(u)||j(u,{recursive:!0});let e=F.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(` `));P(e,n.map(e=>`<div class="${e}"></div>`).join(`
2
+ `),`utf8`);let r=e.split(F.sep).join(`/`);s+=`@source "${r}";\n`}let d=F.join(u,`publier-tailwind-entry.css`);return(A(d)?M(d,`utf8`):``)!==s&&(j(u,{recursive:!0}),P(d,s)),d}function xe(e,t,n){if(Se(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 Se(e){for(let t of e){if(!t)continue;if(Array.isArray(t)){if(Se(t))return!0;continue}let e=t.name;if(typeof e==`string`&&e.startsWith(`@tailwindcss/vite`))return!0}return!1}function Ce(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(F.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(`
3
+ if (import.meta.hot) {
4
+ import.meta.hot.accept();
5
+ }
6
+ `)})}}}const we=`import 'astro:scripts/page-ssr.js';
7
+ `;function Te(){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(we)?null:{code:we+e,map:null}}}}function Y(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 X(e,t){let n=1,r=t+1;for(;r<e.length&&n>0;){let t=Y(e,r);if(t!==r){r=t;continue}let i=e[r];i===`{`?n++:i===`}`&&n--,r++}return r}function Z(e){let t=[],n=(r,i)=>{let a=r,o=``,s=r;for(;a<i;){let r=Y(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=X(e,n);o+=e.slice(s,a),t.push(e.slice(a,r)),a=r,s=a;continue}if(c===`{`){let t=X(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=Y(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!==`
8
+ `&&o!==`\r`&&o!==`{`){r=a+16;continue}let s=r,c=!1;for(;s<a;){let t=Y(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=X(e,l);i+=n(l+1,u-1),i+=`}`,r=u}return t.length>0&&(i.endsWith(`
9
+ `)||(i+=`
10
+ `),i+=t.join(`
11
+ `),i.endsWith(`
12
+ `)||(i+=`
13
+ `)),i}function Ee(){return{name:`publier-cascade-hoist`,enforce:`post`,transform(e,t){if(!t.endsWith(`.css`)&&!t.includes(`.css?`))return null;let n=Z(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=Z(r);i!==r&&(n.source=i)}}}}function Q(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 De(e,t=6){return e.length===0?`[]`:e.length<=t?`[${e.join(`, `)}]`:`[${e.slice(0,t).join(`, `)}, +${e.length-t} more]`}function Oe(e){let t=[ye,a,i,u(),T(),k()];return e.searchEnabled&&t.push(O(),D()),t.join(`
14
+ `)}function ke(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:L.google(),fallbacks:c,weights:l,styles:u,subsets:[`latin`]}),r.push(a);else if(o.src){let e=F.isAbsolute(o.src)&&A(o.src)?o.src:F.join(t,`public`,o.src.replace(/^\/+/,``));n.push({name:o.family,cssVariable:s,provider:L.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 Ae=[{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 $(e,t){let n=F.join(e,`src`,`content`,t);if(!A(n))return!1;try{return N(n,{recursive:!0}).some(e=>typeof e==`string`&&/\.mdx?$/.test(e))}catch{return!1}}function je(e={}){return{name:`@publier/shell`,hooks:{"astro:config:setup":async({config:t,updateConfig:n,injectScript:r,injectRoute:i,logger:a})=>{let u=t.root?I(t.root):process.cwd();try{oe()}catch(e){let t=f(e instanceof Error?e.message:String(e));throw t?Error(t):e}let d=c(F.join(u,`package.json`)),p=JSON.stringify(e),m=pe(u),h=m?ue(m):{name:``,url:null,description:null,logo:null,favicon:null,footer:null,serviceWorker:!1},g=typeof h.url==`string`&&h.url.length>0;g&&!t.site&&n({site:h.url});let _=new Set(t.integrations.map(e=>e.name)),v=Ae.filter(({aliases:e})=>!e.some(e=>_.has(e)));v.length>0&&a.warn(`[@publier/shell] Required framework integrations are not registered in
15
+ astro.config.ts. As of @publier/shell@2.0.0, docsShell() no longer
16
+ auto-wires these. Add the following to your integrations[] array
17
+ (import statements + entries shown). Order matters: docsShell() must
18
+ come FIRST (astro-expressive-code >=0.43 registers into the Markdown
19
+ processor it finds at its own setup — docsShell's pinned unified()
20
+ processor must already be in place), and expressive-code must precede
21
+ mdx.
22
+
23
+ import expressiveCode from 'astro-expressive-code';
24
+ import mdx from '@astrojs/mdx';
25
+ import sitemap from '@astrojs/sitemap';
26
+ import pagefind from 'astro-pagefind';
27
+ import qwik from '@qwik.dev/astro';
28
+
29
+ integrations: [
30
+ docsShell({ /* options */ }),
31
+ expressiveCode(),
32
+ mdx(),
33
+ sitemap(),
34
+ pagefind(),
35
+ qwik({ clientRouter: true }),
36
+ ]
37
+
38
+ Missing:\n ${v.map(e=>e.pkg).join(`
39
+ `)}\n`);let y=t.prefetch;re(y===void 0?void 0:JSON.stringify(y),p)&&n({prefetch:{prefetchAll:!0,defaultStrategy:`viewport`}});let b=m?K(m):void 0,x=m?q(m):void 0,{entries:S,familyOnlyCss:C,slots:w}=x?ke(x,u):{entries:[],familyOnlyCss:``,slots:[]},T=m?fe(m):{variants:{},pathRules:[],defaultVariant:`default`,searchEnabled:!0},ae=m?J(m):null,E=m?de(m):{tabSections:[],sidebarMeta:{},versions:[],anchors:[]},D=m?le(m):null,O=ie(p,(D==null?null:D===!1?`false`:JSON.stringify(D))??void 0,A(F.join(u,`content/snippets`))),k=JSON.parse(O),j={...e,snippets:k===null?void 0:k},M=JSON.stringify(j),N=e.math!==!1,P=N?me(d,a):null,se=ne(M,!!(b&&Object.keys(b).length>0),k!==null&&k!==!1,N&&P!==null),R=te(p,N&&P!==null),z=ge(se,b,P),B=_e(R,P),V=he(d,a);await ve(e,t.integrations,u,n);let H=be({root:u,mathEnabled:N}),U=Oe({searchEnabled:e.search!==!1}),W=JSON.stringify({docs:$(u,`docs`),blog:$(u,`blog`),changelog:$(u,`changelog`)}),G=JSON.parse(ee(p,g,W)),ye=G.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(V){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.`)}if(n({markdown:V?{processor:V({remarkPlugins:z,rehypePlugins:B})}:{remarkPlugins:[...z],rehypePlugins:[...B]},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:[...xe(d,a,t.vite?.plugins??[]),s({root:u}),o({root:u}),Q(`virtual:publier-nav-config`,`navConfig`,T),Ce({entryPath:H}),Te(),Q(`virtual:publier-announcement`,`announcement`,ae),Q(`virtual:publier-site`,`site`,h),Q(`virtual:publier-docs-config`,`docsConfig`,E),Q(`virtual:publier-feeds`,`feeds`,ye),Q(`virtual:publier-fonts`,`fonts`,{slots:w}),Ee()]}}),n({fonts:[{name:`Inter Variable`,cssVariable:`--publier-font-builtin-sans`,provider:L.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:L.npm({remote:!1}),fallbacks:[`monospace`],weights:[`100 800`],styles:[`normal`],subsets:[`latin`],options:{package:`@fontsource-variable/jetbrains-mono`}},...S]}),r(`page-ssr`,[`import ${JSON.stringify(H)};`,`import 'virtual:publier-theme-css';`,`import 'virtual:publier-custom-css';`,`import '@publier/shell/styles/base.css';`].join(`
40
+ `)),r(`page`,U),r(`head-inline`,`(function(){
41
+ if (typeof window === 'undefined' || !window.sessionStorage || !window.fetch) return;
42
+ var store = window.sessionStorage;
43
+ var ResponseCtor = window.Response;
44
+ var origFetch = window.fetch.bind(window);
45
+ var NS = 'publier:bg:';
46
+ var PATTERN = /^\\/(?:_astro|assets|build)\\/(?:[^\\/]*bundle-graph[^\\/]*\\.json|q-manifest[^\\/]*\\.json)(?:\\?.*)?$/;
47
+
48
+
49
+
50
+
51
+ var inflight = Object.create(null);
52
+ function serve(body){
53
+ return new ResponseCtor(body, {
54
+ status: 200,
55
+ headers: { 'content-type': 'application/json' }
56
+ });
57
+ }
58
+ window.fetch = function(input, init){
59
+ var url = typeof input === 'string' ? input : (input && input.url) || '';
60
+ var method = (init && init.method) || (input && input.method) || 'GET';
61
+ if (!url || method !== 'GET' || !PATTERN.test(url)) {
62
+ return origFetch(input, init);
63
+ }
64
+ var key = NS + url;
65
+
66
+ try {
67
+ var hit = store.getItem(key);
68
+ if (hit !== null) return Promise.resolve(serve(hit));
69
+ } catch (_) {}
70
+
71
+
72
+ if (inflight[url]) return inflight[url].then(serve);
73
+
74
+
75
+ var pending = origFetch(input, init).then(function(res){
76
+ if (res && res.ok) {
77
+ return res.clone().text().then(function(body){
78
+ try { store.setItem(key, body); } catch (_) {}
79
+ delete inflight[url];
80
+ return res;
81
+ });
82
+ }
83
+ delete inflight[url];
84
+ return res;
85
+ }, function(err){
86
+ delete inflight[url];
87
+ throw err;
88
+ });
89
+
90
+ inflight[url] = pending.then(function(res){
91
+ return res && res.ok ? res.clone().text() : '';
92
+ });
93
+ return pending;
94
+ };
95
+ })();`),C&&r(`head-inline`,`
96
+ const _pFonts = document.createElement('style');
97
+ _pFonts.textContent = ${JSON.stringify(C)};
98
+ document.head.appendChild(_pFonts);
99
+ `),m){let e=ce(m);if(e){let t=l(e);t&&r(`head-inline`,`
100
+ const _pAnalytics = document.createRange().createContextualFragment(${JSON.stringify(t)});
101
+ document.head.appendChild(_pAnalytics);
102
+ `)}}for(let e of G)i({pattern:e.pattern,entrypoint:e.entrypoint,prerender:e.prerender});G.length>0&&a.info(`[@publier/shell] Injected default routes: ${G.map(e=>e.pattern).join(`, `)}.`),a.info(`[@publier/shell] Plugin pipeline wired.`)},"astro:build:done":async({dir:e,pages:t,logger:n})=>{let r=I(e);await se(F.join(r,`_headers`),H(),`utf-8`),n.info(`[@publier/shell] Wrote 5 header rules to dist/_headers.`);let i=W(r,t);i.pagesRewritten>0&&n.info(`[@publier/shell] Backfilled head tags on ${i.pagesRewritten} HTML file(s) (stylesheets=${De(i.stylesheets)}, modules=${De(i.modules)}).`);let a=G(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{de as a,ue as c,V as d,U as f,J as i,le as l,Z as n,q as o,Ee as r,fe as s,je as t,K as u};
@@ -0,0 +1,203 @@
1
+ import { FontsConfig } from "@publier/native";
2
+ import { AstroIntegration } from "astro";
3
+ import { Plugin } from "vite";
4
+
5
+ //#region src/config/yaml-extract.d.ts
6
+ declare function extractVarsFromYaml(yaml: string): Record<string, string> | undefined;
7
+ declare function extractFontsFromYaml(yaml: string): FontsConfig | undefined;
8
+ declare function extractAnnouncementFromYaml(yaml: string): AnnouncementConfig | null;
9
+ declare function extractSnippetsFromYaml(yaml: string): false | {
10
+ directory?: string;
11
+ } | undefined;
12
+ declare function extractSiteFromYaml(yaml: string): SiteConfig;
13
+ declare function extractDocsConfigFromYaml(yaml: string): DocsConfig;
14
+ declare function extractNavFromYaml(yaml: string): NavConfig;
15
+ //#endregion
16
+ //#region src/vite/css-chain.d.ts
17
+ /**
18
+ * Move every `@media` block found anywhere inside an outer `@layer utilities`
19
+ * (including arbitrarily nested `@layer x.y.z`, `@supports`, etc.) into
20
+ * unlayered position at the end of the stylesheet. Pure string transform;
21
+ * brace-balanced and string-/comment-safe.
22
+ *
23
+ * Why: Vite 8 (Rolldown) + @tailwindcss/vite emits unprefixed utilities after
24
+ * their responsive variants inside the same `@layer utilities` block, which
25
+ * drops same-specificity variants in source order. Re-verified STILL PRESENT
26
+ * on vite@8.0.16 (2026-06-23) by an instrumented fixture build — the
27
+ * `generateBundle` sweep below rewrote the final 160 kB CSS bundle (36 of 39
28
+ * `@media` blocks were nested inside `@layer utilities`, mostly under daisyUI's
29
+ * `@layer utilities { @layer daisyui.lN { … } }` sub-layers).
30
+ *
31
+ * Why the upstream "fixes" do NOT apply (checked 2026-06-23, do NOT delete on
32
+ * their basis): vitejs/vite#21826 (closed 2026-03-12) was closed as no-repro
33
+ * and commenters report it still broken. #21826/#21903 redirect to #22597,
34
+ * whose maintainer verdict is "This isn't a bug in Vite" — that reporter's
35
+ * stylesheet was in `<body>` instead of `<head>`; Publier already head-injects
36
+ * its CSS chain (see integration-ts §6), so that resolution is N/A here. The
37
+ * community workaround on #21903 — declaring `@layer base, components,
38
+ * utilities;` up front — is browser-verified INSUFFICIENT for this case: a
39
+ * layer-order declaration only orders *different* layers, but our conflict is
40
+ * intra-`@layer utilities` (the unprefixed utility and its responsive variant
41
+ * are both in `utilities`), so same-layer source order still decides and the
42
+ * variant is still dropped. Only hoisting the `@media` OUT of the layer fixes
43
+ * it: hoisting makes the responsive query unlayered — and per CSS Cascade
44
+ * Layers, unlayered beats layered unconditionally.
45
+ *
46
+ * **Why recursive**: daisyUI v5 nests rules under sub-layers like
47
+ * `@layer utilities { @layer daisyui.l1.l2.l3 { @media (...) { ... } } }`.
48
+ * A non-recursive scan that only sees direct children of `@layer utilities`
49
+ * would miss the nested `@media` and the layer-ordering bug stays live.
50
+ * The recursive walk extracts every `@media` regardless of depth.
51
+ *
52
+ * Exported for unit tests; used by `publierCascadeHoistPlugin` on every CSS
53
+ * module that flows through Vite's `transform` pipeline AND every CSS asset
54
+ * in the final bundle.
55
+ */
56
+ declare function hoistMediaOutOfUtilitiesLayer(css: string): string;
57
+ /**
58
+ * Vite plugin that runs `hoistMediaOutOfUtilitiesLayer` against every CSS
59
+ * stream Vite handles. Registered via `docsShell()`'s
60
+ * `updateConfig({ vite: ... })` so it runs in BOTH `astro dev` (HMR — where
61
+ * the `astro:build:done` hook never fires) and `astro build`.
62
+ *
63
+ * The plugin hooks two stages:
64
+ *
65
+ * 1. `transform(code, id)` (`enforce: 'post'`) — runs after
66
+ * `@tailwindcss/vite` for any CSS module that flows through Vite's
67
+ * transform pipeline. Primary path in `astro dev` HMR (where
68
+ * `generateBundle` never runs).
69
+ *
70
+ * 2. `generateBundle(_, bundle)` — sweeps the final bundled assets and
71
+ * rewrites any `.css` chunk that still contains `@media` inside
72
+ * `@layer utilities`. On `astro build` under vite@8.0.16 this is the
73
+ * LOAD-BEARING catch, not merely defensive: the broken
74
+ * `@media`-in-`@layer utilities` ordering only emerges in the final
75
+ * Rolldown-concatenated asset, so the per-module `transform` sees
76
+ * nothing to hoist and stage 2 is the one that fires (empirically
77
+ * confirmed 2026-06-23 — it rewrote the 160 kB site bundle while
78
+ * stage 1 logged zero rewrites). It also covers the case where a
79
+ * consumer registers `@tailwindcss/vite` before docsShell so the
80
+ * post-transform ordering puts us BEFORE Tailwind's emitter for the
81
+ * final concatenated chunk — the bundle sweep is hoisted regardless.
82
+ *
83
+ * Zero runtime cost in either stage: when the marker is absent the pure
84
+ * function returns its input unchanged and the hook short-circuits.
85
+ */
86
+ declare function publierCascadeHoistPlugin(): Plugin;
87
+ //#endregion
88
+ //#region src/integration.d.ts
89
+ interface DocsShellOptions {
90
+ /** Enable `<Snippet file="..." />` resolution. */
91
+ snippets?: false | {
92
+ directory?: string;
93
+ };
94
+ /** Enable math via remark-math + rehype-katex + katex.min.css. Default: true. */
95
+ math?: boolean;
96
+ /** Enable astro-mermaid. Default: auto-detected. */
97
+ mermaid?: boolean;
98
+ /** Apply Publier's prefetch defaults. Default: true. */
99
+ prefetch?: boolean;
100
+ /** Wire rehype-autolink-headings. Default: true. */
101
+ autolinkHeadings?: boolean;
102
+ /** Wire rehype-external-links — adds `target="_blank"` + `rel="noopener noreferrer"` to outbound http(s) links. Default: true. */
103
+ externalLinks?: boolean;
104
+ /**
105
+ * Site-wide search backend. Default: `'pagefind'`.
106
+ *
107
+ * Set to `false` to skip injecting the search-button and search-dialog
108
+ * client scripts from the page bundle. The shell does NOT register
109
+ * `astro-pagefind` itself — register it explicitly in
110
+ * `integrations: [docsShell(), …, pagefind()]` to enable Pagefind-driven
111
+ * search.
112
+ */
113
+ search?: 'pagefind' | false;
114
+ /**
115
+ * Default-route injection. Default: all enabled — but routes whose
116
+ * matching `src/content/<name>/` directory is absent are skipped.
117
+ *
118
+ * `rss` controls the `/blog/rss.xml` + `/changelog/rss.xml` feed routes;
119
+ * they're only injected when `publier.config.yaml#site.url` is set
120
+ * (`@astrojs/rss` requires `context.site` to emit absolute URLs).
121
+ */
122
+ routes?: false | {
123
+ docs?: boolean;
124
+ blog?: boolean;
125
+ changelog?: boolean;
126
+ notFound?: boolean;
127
+ rss?: boolean;
128
+ };
129
+ }
130
+ interface AnnouncementConfig {
131
+ message: string;
132
+ href?: string;
133
+ variant?: 'info' | 'warning' | 'success';
134
+ storageKey?: string;
135
+ }
136
+ interface SiteConfig {
137
+ name: string;
138
+ url: string | null;
139
+ description: string | null;
140
+ logo: {
141
+ light?: string;
142
+ dark?: string;
143
+ } | null;
144
+ favicon: string | null;
145
+ footer: string | null;
146
+ serviceWorker: boolean;
147
+ }
148
+ interface DocsSidebarMetaOverride {
149
+ label?: string;
150
+ collapsed?: boolean;
151
+ order?: number;
152
+ }
153
+ interface DocVersionConfig {
154
+ label: string;
155
+ path: string;
156
+ badge?: string;
157
+ default?: boolean;
158
+ }
159
+ interface SidebarAnchorConfig {
160
+ label: string;
161
+ href: string;
162
+ icon?: string;
163
+ target?: string;
164
+ badge?: string;
165
+ }
166
+ interface DocsConfig {
167
+ tabSections: string[];
168
+ sidebarMeta: Record<string, DocsSidebarMetaOverride>;
169
+ versions: DocVersionConfig[];
170
+ anchors: SidebarAnchorConfig[];
171
+ }
172
+ interface NavLink {
173
+ label: string;
174
+ href: string;
175
+ external?: boolean;
176
+ }
177
+ interface NavCta {
178
+ label: string;
179
+ href: string;
180
+ }
181
+ interface NavVariant {
182
+ brand: string;
183
+ logo: {
184
+ light?: string;
185
+ dark?: string;
186
+ } | null;
187
+ tabs: NavLink[];
188
+ links: NavLink[];
189
+ cta: NavCta | null;
190
+ }
191
+ interface NavPathRule {
192
+ path: string;
193
+ variant: string | false;
194
+ }
195
+ interface NavConfig {
196
+ variants: Record<string, NavVariant>;
197
+ pathRules: NavPathRule[];
198
+ defaultVariant: string;
199
+ searchEnabled: boolean;
200
+ }
201
+ declare function docsShell(options?: DocsShellOptions): AstroIntegration;
202
+ //#endregion
203
+ export { extractVarsFromYaml as S, extractDocsConfigFromYaml as _, DocsSidebarMetaOverride as a, extractSiteFromYaml as b, NavLink as c, SidebarAnchorConfig as d, SiteConfig as f, extractAnnouncementFromYaml as g, publierCascadeHoistPlugin as h, DocsShellOptions as i, NavPathRule as l, hoistMediaOutOfUtilitiesLayer as m, DocVersionConfig as n, NavConfig as o, docsShell as p, DocsConfig as r, NavCta as s, AnnouncementConfig as t, NavVariant as u, extractFontsFromYaml as v, extractSnippetsFromYaml as x, extractNavFromYaml as y };
@@ -0,0 +1,2 @@
1
+ import { S as extractVarsFromYaml, _ as extractDocsConfigFromYaml, a as DocsSidebarMetaOverride, b as extractSiteFromYaml, c as NavLink, d as SidebarAnchorConfig, f as SiteConfig, g as extractAnnouncementFromYaml, 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, v as extractFontsFromYaml, x as extractSnippetsFromYaml, y as extractNavFromYaml } from "./integration-DKTmdCWN.mjs";
2
+ export { AnnouncementConfig, DocVersionConfig, DocsConfig, DocsShellOptions, DocsSidebarMetaOverride, NavConfig, NavCta, NavLink, NavPathRule, NavVariant, SidebarAnchorConfig, SiteConfig, docsShell, extractAnnouncementFromYaml, extractDocsConfigFromYaml, extractFontsFromYaml, extractNavFromYaml, extractSiteFromYaml, extractSnippetsFromYaml, extractVarsFromYaml, hoistMediaOutOfUtilitiesLayer, publierCascadeHoistPlugin };
@@ -0,0 +1 @@
1
+ import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"./integration-6L__3wwu.mjs";export{c as docsShell,n as extractAnnouncementFromYaml,e as extractDocsConfigFromYaml,a as extractFontsFromYaml,s as extractNavFromYaml,t as extractSiteFromYaml,r as extractSnippetsFromYaml,l as extractVarsFromYaml,i as hoistMediaOutOfUtilitiesLayer,o as publierCascadeHoistPlugin};
@@ -0,0 +1,54 @@
1
+ import * as _$astro_loaders0 from "astro/loaders";
2
+
3
+ //#region src/loaders/index.d.ts
4
+ /**
5
+ * Astro content-collection loaders for Publier.
6
+ *
7
+ * The customer's `content.config.ts` wires these into collection definitions:
8
+ *
9
+ * ```ts
10
+ * import { defineCollection } from 'astro:content';
11
+ * import { docsLoader, blogLoader, pagesLoader } from '@publier/shell/loaders';
12
+ * import { docsSchema, blogSchema, pagesSchema } from '@publier/shell/schemas';
13
+ *
14
+ * export const collections = {
15
+ * docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }),
16
+ * blog: defineCollection({ loader: blogLoader(), schema: blogSchema }),
17
+ * pages: defineCollection({ loader: pagesLoader(), schema: pagesSchema }),
18
+ * };
19
+ * ```
20
+ *
21
+ * ID generation and glob-pattern construction live in `@publier/native`; this
22
+ * module is the thin shim that wires them into Astro's `glob()` loader protocol.
23
+ */
24
+ /**
25
+ * Content loader for Publier's `docs` collection.
26
+ */
27
+ declare function docsLoader(options?: {
28
+ base?: string;
29
+ pattern?: string;
30
+ }): _$astro_loaders0.Loader;
31
+ /**
32
+ * Content loader for the `blog` collection.
33
+ */
34
+ declare function blogLoader(options?: {
35
+ base?: string;
36
+ pattern?: string;
37
+ }): _$astro_loaders0.Loader;
38
+ /**
39
+ * Content loader for the `pages` collection.
40
+ */
41
+ declare function pagesLoader(options?: {
42
+ base?: string;
43
+ pattern?: string;
44
+ }): _$astro_loaders0.Loader;
45
+ /**
46
+ * Generic content loader for any MDX collection (changelog, recipes, press,
47
+ * careers, etc.).
48
+ */
49
+ declare function contentLoader(options: {
50
+ base: string;
51
+ pattern?: string;
52
+ }): _$astro_loaders0.Loader;
53
+ //#endregion
54
+ export { blogLoader, contentLoader, docsLoader, pagesLoader };
@@ -0,0 +1 @@
1
+ import{shellBuildGlobPattern as e,shellGenerateId as t}from"@publier/native";import{glob as n}from"astro/loaders";function r({entry:e}){return t(e)}function i(t){return e(t)}function a(e){return n({base:e?.base??`./src/content/docs`,pattern:e?.pattern??i(`docs`),generateId:r})}function o(e){return n({base:e?.base??`./src/content/blog`,pattern:e?.pattern??i(`blog`),generateId:r})}function s(e){return n({base:e?.base??`./src/content/pages`,pattern:e?.pattern??i(`pages`),generateId:r})}function c(e){return n({base:e.base,pattern:e.pattern??i(`content`),generateId:r})}export{o as blogLoader,c as contentLoader,a as docsLoader,s as pagesLoader};
@@ -0,0 +1,8 @@
1
+ import { t as Root } from "../index-Bc-beOEe.mjs";
2
+ import { Plugin } from "unified";
3
+
4
+ //#region src/plugins/remark-asides.d.ts
5
+ declare const remarkAsides: Plugin<[], Root>;
6
+ declare const remarkDirectivesRestoration: Plugin<[], Root>;
7
+ //#endregion
8
+ export { remarkAsides, remarkDirectivesRestoration };
@@ -0,0 +1,2 @@
1
+ import e from"@publier/native";import{directiveToMarkdown as t}from"mdast-util-directive";import{toMarkdown as n}from"mdast-util-to-markdown";import{visit as r}from"unist-util-visit";const i=()=>t=>{t.children=JSON.parse(e.remarkTransformAsides(JSON.stringify(t))).children};function a(e,r,i){let a=n(e,{extensions:[t()]});a.at(-1)===`
2
+ `&&(a=a.slice(0,-1));let o={type:`text`,value:a};e.type===`textDirective`?i.children[r]=o:i.children[r]={type:`paragraph`,children:[o]}}const o=()=>e=>{r(e,(e,t,n)=>{t!==void 0&&n&&(e.type===`textDirective`||e.type===`leafDirective`)&&e.data===void 0&&a(e,t,n)})};export{i as remarkAsides,o as remarkDirectivesRestoration};
@@ -0,0 +1,11 @@
1
+ import { t as Root } from "../index-Bc-beOEe.mjs";
2
+ import { Plugin } from "unified";
3
+
4
+ //#region src/plugins/remark-snippets.d.ts
5
+ interface SnippetOptions {
6
+ directory?: string;
7
+ contentRoot?: string;
8
+ }
9
+ declare const remarkSnippets: Plugin<[SnippetOptions?], Root>;
10
+ //#endregion
11
+ export { remarkSnippets as default };
@@ -0,0 +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};
@@ -0,0 +1,13 @@
1
+ import { t as Root } from "../index-Bc-beOEe.mjs";
2
+ import { StructuredSection } from "@publier/native";
3
+ import { Plugin } from "unified";
4
+
5
+ //#region src/plugins/remark-structure.d.ts
6
+ declare module 'vfile' {
7
+ interface DataMap {
8
+ structuredData: StructuredSection[];
9
+ }
10
+ }
11
+ declare const remarkStructure: Plugin<[], Root>;
12
+ //#endregion
13
+ export { remarkStructure as default };
@@ -0,0 +1 @@
1
+ import e from"@publier/native";import{toString as t}from"mdast-util-to-string";const n=process.env.PUBLIER_NATIVE_REMARK!==`off`;function r(e){let n=[],r=``,i=[],a=()=>{let e=i.map(e=>t(e)).join(` `).replace(/\s+/g,` `).trim();(e||r)&&n.push({heading:r,content:e}),i=[]};for(let n of e.children)n.type===`heading`?(a(),r=t(n)):i.push(n);return a(),n}const i=()=>(t,i)=>{i.data.structuredData=n?JSON.parse(e.remarkCollectSections(JSON.stringify(t))):r(t)};export{i as default};
@@ -0,0 +1,7 @@
1
+ import { t as Root } from "../index-Bc-beOEe.mjs";
2
+ import { Plugin } from "unified";
3
+
4
+ //#region src/plugins/remark-vars.d.ts
5
+ declare const remarkVars: Plugin<[Record<string, string>?], Root>;
6
+ //#endregion
7
+ export { remarkVars as default };
@@ -0,0 +1 @@
1
+ import e from"@publier/native";const t=t=>n=>{!t||Object.keys(t).length===0||(n.children=JSON.parse(e.remarkVarsSubstitute(JSON.stringify(n),JSON.stringify(t))).children)};export{t as default};
@@ -0,0 +1 @@
1
+ const e=[`almond`,`aspen`,`catppuccin`,`dark`,`dusk`,`emerald`,`light`,`maple`,`neutral`,`ocean`,`purple`,`ruby`,`solar`,`vitepress`];function t(){return e}function n(t){return e.includes(t)}export{n,t as r,e as t};
@@ -0,0 +1,16 @@
1
+ //#region src/tailwind/presets.d.ts
2
+ /**
3
+ * Browser-safe preset catalogue. Contains no Node-only imports so it can be
4
+ * imported from Astro integrations, Qwik components, or the CLI alike.
5
+ *
6
+ * Node-side introspection (reading CSS files, computing contrast) lives in
7
+ * `./loader.ts` to keep `node:fs` out of the browser bundle path.
8
+ */
9
+ declare const AVAILABLE_THEMES: readonly ["almond", "aspen", "catppuccin", "dark", "dusk", "emerald", "light", "maple", "neutral", "ocean", "purple", "ruby", "solar", "vitepress"];
10
+ type ThemePreset = (typeof AVAILABLE_THEMES)[number];
11
+ /** Return a read-only copy of the built-in preset list. */
12
+ declare function listPresets(): readonly ThemePreset[];
13
+ /** Narrow an arbitrary string to a known preset name. */
14
+ declare function isValidPreset(name: string): name is ThemePreset;
15
+ //#endregion
16
+ export { listPresets as i, ThemePreset as n, isValidPreset as r, AVAILABLE_THEMES as t };
@@ -0,0 +1,30 @@
1
+ //#region src/runtime/code-group-sync-runtime.d.ts
2
+ /**
3
+ * CodeGroup sync — cross-peer + cross-tab activation for shell's CodeGroup
4
+ * tabs.
5
+ *
6
+ * Injected globally by `docsShell()` via
7
+ * `injectScript('page', CODE_GROUP_SYNC_SCRIPT)`. Stored as a string constant
8
+ * (same pattern as `TABS_SYNC_SCRIPT` / `LAZY_UPGRADE_SCRIPT`) because
9
+ * Rolldown-vite tree-shakes plain side-effect module imports inside an
10
+ * injected page stage — wrapping as a literal string keeps the code out of
11
+ * the import graph entirely and lands it verbatim in the page bundle.
12
+ *
13
+ * Click + keyboard activation is owned by `<tab-container>` itself once the
14
+ * lazy-upgrade bootstrap (`runtime/lazy-upgrade-init.ts`) defines it. This script
15
+ * only layers peer / storage sync on top.
16
+ *
17
+ * Mirrors `tabs-sync-runtime.ts`:
18
+ * - listens for `tab-container-changed` (past tense, after-state) — the
19
+ * `tab-container-change` (no -d) event is the cancelable pre-state phase
20
+ * and listening to it loops infinitely with the idempotence guard.
21
+ * - reads `ev.tab` directly — `ev.detail` is deprecated upstream and
22
+ * returns the PANEL (not the tab button) behind a `console.warn`.
23
+ * - aria-selected is the SINGLE source of truth — daisyUI v5 styles
24
+ * `[aria-selected=true]` directly, so the pre-upgrade fallback does NOT
25
+ * toggle a `tab-active` class (would leave a stale highlight once
26
+ * `<tab-container>` upgrades and starts managing aria-selected alone).
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";
29
+ //#endregion
30
+ export { CODE_GROUP_SYNC_SCRIPT };