@pagesmith/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +481 -0
  2. package/assets/fonts/OFL.txt +7 -0
  3. package/assets/fonts/jetbrains-mono-variable.woff2 +0 -0
  4. package/assets/fonts/open-sans-variable.woff2 +0 -0
  5. package/assets/fonts.css +17 -0
  6. package/dist/ai/index.d.mts +41 -0
  7. package/dist/ai/index.d.mts.map +1 -0
  8. package/dist/ai/index.mjs +414 -0
  9. package/dist/ai/index.mjs.map +1 -0
  10. package/dist/assets/index.d.mts +31 -0
  11. package/dist/assets/index.d.mts.map +1 -0
  12. package/dist/assets/index.mjs +2 -0
  13. package/dist/assets-bX08zEJm.mjs +155 -0
  14. package/dist/assets-bX08zEJm.mjs.map +1 -0
  15. package/dist/content-config-fHPaFZ7i.d.mts +1128 -0
  16. package/dist/content-config-fHPaFZ7i.d.mts.map +1 -0
  17. package/dist/content-layer-B7fQ3im4.mjs +590 -0
  18. package/dist/content-layer-B7fQ3im4.mjs.map +1 -0
  19. package/dist/convert-DnuB6SVV.mjs +52 -0
  20. package/dist/convert-DnuB6SVV.mjs.map +1 -0
  21. package/dist/create/index.d.mts +20 -0
  22. package/dist/create/index.d.mts.map +1 -0
  23. package/dist/create/index.mjs +215 -0
  24. package/dist/create/index.mjs.map +1 -0
  25. package/dist/css/index.d.mts +2 -0
  26. package/dist/css/index.mjs +2 -0
  27. package/dist/css-ekIt2Fdb.mjs +19 -0
  28. package/dist/css-ekIt2Fdb.mjs.map +1 -0
  29. package/dist/heading-Dhvzlay-.d.mts +27 -0
  30. package/dist/heading-Dhvzlay-.d.mts.map +1 -0
  31. package/dist/index-BQ6B1-qG.d.mts +41 -0
  32. package/dist/index-BQ6B1-qG.d.mts.map +1 -0
  33. package/dist/index-CeNDTM-y.d.mts +7 -0
  34. package/dist/index-CeNDTM-y.d.mts.map +1 -0
  35. package/dist/index-DpRBzO8Q.d.mts +15 -0
  36. package/dist/index-DpRBzO8Q.d.mts.map +1 -0
  37. package/dist/index-sFCx17CD.d.mts +59 -0
  38. package/dist/index-sFCx17CD.d.mts.map +1 -0
  39. package/dist/index.d.mts +131 -0
  40. package/dist/index.d.mts.map +1 -0
  41. package/dist/index.mjs +56 -0
  42. package/dist/index.mjs.map +1 -0
  43. package/dist/jsx-runtime/index.d.mts +24 -0
  44. package/dist/jsx-runtime/index.d.mts.map +1 -0
  45. package/dist/jsx-runtime/index.mjs +88 -0
  46. package/dist/jsx-runtime/index.mjs.map +1 -0
  47. package/dist/loaders/index.d.mts +3 -0
  48. package/dist/loaders/index.mjs +2 -0
  49. package/dist/loaders-DyABmDrE.mjs +179 -0
  50. package/dist/loaders-DyABmDrE.mjs.map +1 -0
  51. package/dist/markdown/index.d.mts +3 -0
  52. package/dist/markdown/index.mjs +2 -0
  53. package/dist/markdown-Cj5X26FL.mjs +95 -0
  54. package/dist/markdown-Cj5X26FL.mjs.map +1 -0
  55. package/dist/runtime/index.d.mts +28 -0
  56. package/dist/runtime/index.d.mts.map +1 -0
  57. package/dist/runtime/index.mjs +90 -0
  58. package/dist/runtime/index.mjs.map +1 -0
  59. package/dist/schemas/index.d.mts +4 -0
  60. package/dist/schemas/index.mjs +2 -0
  61. package/dist/schemas-DJS7wOzd.mjs +47 -0
  62. package/dist/schemas-DJS7wOzd.mjs.map +1 -0
  63. package/dist/types-DUsjRE7Y.d.mts +28 -0
  64. package/dist/types-DUsjRE7Y.d.mts.map +1 -0
  65. package/dist/vite/index.d.mts +9878 -0
  66. package/dist/vite/index.d.mts.map +1 -0
  67. package/dist/vite/index.mjs +549 -0
  68. package/dist/vite/index.mjs.map +1 -0
  69. package/package.json +136 -0
  70. package/src/styles/code/inline.css +26 -0
  71. package/src/styles/content/alerts.css +87 -0
  72. package/src/styles/content/prose.css +225 -0
  73. package/src/styles/content/toc.css +87 -0
  74. package/src/styles/content.css +22 -0
  75. package/src/styles/foundations/reset.css +49 -0
  76. package/src/styles/foundations/tokens.css +66 -0
  77. package/src/styles/layout/grid.css +179 -0
  78. package/src/styles/layout/sidebar.css +18 -0
  79. package/src/styles/standalone.css +18 -0
  80. package/src/styles/viewport.css +20 -0
  81. package/templates/docs/content/README.md +18 -0
  82. package/templates/docs/content/guide/README.md +11 -0
  83. package/templates/docs/content/guide/getting-started/README.md +9 -0
  84. package/templates/docs/content/reference/README.md +11 -0
  85. package/templates/docs/pagesmith.config.json5 +15 -0
@@ -0,0 +1,95 @@
1
+ import matter from "gray-matter";
2
+ import { parse } from "yaml";
3
+ import { rehypeAccessibleEmojis } from "rehype-accessible-emojis";
4
+ import rehypeAutolinkHeadings from "rehype-autolink-headings";
5
+ import rehypeExpressiveCode from "rehype-expressive-code";
6
+ import rehypeExternalLinks from "rehype-external-links";
7
+ import rehypeMathjax from "rehype-mathjax/svg";
8
+ import rehypeSlug from "rehype-slug";
9
+ import rehypeStringify from "rehype-stringify";
10
+ import remarkFrontmatter from "remark-frontmatter";
11
+ import remarkGfm from "remark-gfm";
12
+ import remarkGithubAlerts from "remark-github-alerts";
13
+ import remarkMath from "remark-math";
14
+ import remarkParse from "remark-parse";
15
+ import remarkRehype from "remark-rehype";
16
+ import remarkSmartypants from "remark-smartypants";
17
+ import { unified } from "unified";
18
+ //#region src/markdown/pipeline.ts
19
+ const DEFAULT_MARKDOWN_CONFIG = {};
20
+ function getTextContent(node) {
21
+ if (node.type === "text") return node.value || "";
22
+ if (node.children) return node.children.map(getTextContent).join("");
23
+ return "";
24
+ }
25
+ function extractHeadings(tree, headings) {
26
+ if (tree.type === "element" && /^h[1-6]$/.test(tree.tagName)) headings.push({
27
+ depth: parseInt(tree.tagName[1]),
28
+ text: getTextContent(tree),
29
+ slug: tree.properties?.id || ""
30
+ });
31
+ if (tree.children) for (const child of tree.children) extractHeadings(child, headings);
32
+ }
33
+ function createProcessor(config) {
34
+ const processor = unified().use(remarkParse).use(remarkGfm).use(remarkMath).use(remarkFrontmatter, ["yaml"]).use(remarkGithubAlerts).use(remarkSmartypants);
35
+ if (config.remarkPlugins) for (const plugin of config.remarkPlugins) if (Array.isArray(plugin)) processor.use(plugin[0], plugin[1]);
36
+ else processor.use(plugin);
37
+ processor.use(remarkRehype, { allowDangerousHtml: true });
38
+ const lightTheme = config.shiki?.themes?.light || "github-light";
39
+ const darkTheme = config.shiki?.themes?.dark || "github-dark";
40
+ processor.use(rehypeExpressiveCode, {
41
+ themes: [darkTheme, lightTheme],
42
+ useDarkModeMediaQuery: true,
43
+ styleOverrides: {
44
+ uiFontFamily: "var(--ps-font-sans, var(--font-family, system-ui, sans-serif))",
45
+ codeFontFamily: "var(--ps-font-mono, var(--font-mono, ui-monospace, monospace))",
46
+ codeFontSize: "var(--ps-font-size-sm, 0.875rem)",
47
+ codeLineHeight: "1.7",
48
+ borderRadius: "var(--ps-radius-lg, 0.5rem)",
49
+ borderColor: "var(--ps-color-border-subtle, var(--color-border-subtle, #e5e7eb))"
50
+ }
51
+ });
52
+ processor.use(rehypeMathjax).use(rehypeSlug).use(rehypeAutolinkHeadings, { behavior: "wrap" }).use(rehypeExternalLinks, {
53
+ target: "_blank",
54
+ rel: ["noopener", "noreferrer"]
55
+ }).use(rehypeAccessibleEmojis);
56
+ processor.use(() => (tree, file) => {
57
+ const headings = [];
58
+ extractHeadings(tree, headings);
59
+ file.data.headings = headings;
60
+ });
61
+ if (config.rehypePlugins) for (const plugin of config.rehypePlugins) if (Array.isArray(plugin)) processor.use(plugin[0], plugin[1]);
62
+ else processor.use(plugin);
63
+ processor.use(rehypeStringify, { allowDangerousHtml: true });
64
+ return processor;
65
+ }
66
+ const processorCache = /* @__PURE__ */ new WeakMap();
67
+ async function processMarkdown(raw, config, preExtracted) {
68
+ let frontmatter;
69
+ let content;
70
+ if (preExtracted) {
71
+ frontmatter = preExtracted.frontmatter;
72
+ content = preExtracted.content;
73
+ } else {
74
+ const parsed = matter(raw, { engines: { yaml: parse } });
75
+ frontmatter = parsed.data;
76
+ content = parsed.content;
77
+ }
78
+ const resolvedConfig = config && Object.keys(config).length > 0 ? config : DEFAULT_MARKDOWN_CONFIG;
79
+ let processor = processorCache.get(resolvedConfig);
80
+ if (!processor) {
81
+ processor = createProcessor(resolvedConfig);
82
+ processorCache.set(resolvedConfig, processor);
83
+ }
84
+ const result = await processor.process(content);
85
+ const headings = Array.isArray(result.data.headings) ? result.data.headings : [];
86
+ return {
87
+ html: String(result),
88
+ headings,
89
+ frontmatter
90
+ };
91
+ }
92
+ //#endregion
93
+ export { processMarkdown as t };
94
+
95
+ //# sourceMappingURL=markdown-Cj5X26FL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-Cj5X26FL.mjs","names":["parseYaml"],"sources":["../src/markdown/pipeline.ts"],"sourcesContent":["import matter from 'gray-matter'\nimport { parse as parseYaml } from 'yaml'\nimport { rehypeAccessibleEmojis } from 'rehype-accessible-emojis'\nimport rehypeAutolinkHeadings from 'rehype-autolink-headings'\nimport rehypeExpressiveCode, {\n type BundledShikiTheme,\n type RehypeExpressiveCodeOptions,\n} from 'rehype-expressive-code'\nimport rehypeExternalLinks from 'rehype-external-links'\nimport rehypeMathjax from 'rehype-mathjax/svg'\nimport rehypeSlug from 'rehype-slug'\nimport rehypeStringify from 'rehype-stringify'\nimport remarkFrontmatter from 'remark-frontmatter'\nimport remarkGfm from 'remark-gfm'\nimport remarkGithubAlerts from 'remark-github-alerts'\nimport remarkMath from 'remark-math'\nimport remarkParse from 'remark-parse'\nimport remarkRehype from 'remark-rehype'\nimport remarkSmartypants from 'remark-smartypants'\nimport { unified } from 'unified'\nimport type { Heading } from '../schemas/heading'\nimport type { MarkdownConfig } from '../schemas/markdown-config'\n\nexport type MarkdownResult = {\n html: string\n headings: Heading[]\n frontmatter: Record<string, any>\n}\n\nexport type { MarkdownConfig }\n\nconst DEFAULT_MARKDOWN_CONFIG: MarkdownConfig = {}\n\nfunction getTextContent(node: any): string {\n if (node.type === 'text') return node.value || ''\n if (node.children) return node.children.map(getTextContent).join('')\n return ''\n}\n\nfunction extractHeadings(tree: any, headings: Heading[]): void {\n if (tree.type === 'element' && /^h[1-6]$/.test(tree.tagName)) {\n headings.push({\n depth: parseInt(tree.tagName[1]),\n text: getTextContent(tree),\n slug: tree.properties?.id || '',\n })\n }\n if (tree.children) {\n for (const child of tree.children) {\n extractHeadings(child, headings)\n }\n }\n}\n\nfunction createProcessor(config: MarkdownConfig) {\n const processor = unified()\n .use(remarkParse)\n .use(remarkGfm)\n .use(remarkMath)\n .use(remarkFrontmatter, ['yaml'])\n // GitHub-flavored alerts: > [!NOTE], > [!TIP], > [!IMPORTANT], > [!WARNING], > [!CAUTION]\n .use(remarkGithubAlerts)\n // Smart typography: \"smart quotes\", em—dashes, el…lipses\n .use(remarkSmartypants)\n\n if (config.remarkPlugins) {\n for (const plugin of config.remarkPlugins) {\n if (Array.isArray(plugin)) processor.use(plugin[0], plugin[1])\n else processor.use(plugin)\n }\n }\n\n processor.use(remarkRehype, { allowDangerousHtml: true })\n\n // Expressive Code — syntax highlighting, code frames, tabs, copy button\n const lightTheme = (config.shiki?.themes?.light || 'github-light') as BundledShikiTheme\n const darkTheme = (config.shiki?.themes?.dark || 'github-dark') as BundledShikiTheme\n\n processor.use(rehypeExpressiveCode, {\n themes: [darkTheme, lightTheme],\n useDarkModeMediaQuery: true,\n styleOverrides: {\n uiFontFamily: 'var(--ps-font-sans, var(--font-family, system-ui, sans-serif))',\n codeFontFamily: 'var(--ps-font-mono, var(--font-mono, ui-monospace, monospace))',\n codeFontSize: 'var(--ps-font-size-sm, 0.875rem)',\n codeLineHeight: '1.7',\n borderRadius: 'var(--ps-radius-lg, 0.5rem)',\n borderColor: 'var(--ps-color-border-subtle, var(--color-border-subtle, #e5e7eb))',\n },\n } satisfies RehypeExpressiveCodeOptions)\n\n processor\n .use(rehypeMathjax)\n .use(rehypeSlug)\n .use(rehypeAutolinkHeadings, { behavior: 'wrap' })\n // External links: add target=\"_blank\" rel=\"noopener noreferrer\" to absolute URLs\n .use(rehypeExternalLinks, {\n target: '_blank',\n rel: ['noopener', 'noreferrer'],\n })\n // Accessible emojis: wrap emoji characters in <span role=\"img\" aria-label=\"...\">\n .use(rehypeAccessibleEmojis)\n\n processor.use(() => (tree: any, file: any) => {\n const headings: Heading[] = []\n extractHeadings(tree, headings)\n file.data.headings = headings\n })\n\n if (config.rehypePlugins) {\n for (const plugin of config.rehypePlugins) {\n if (Array.isArray(plugin)) processor.use(plugin[0], plugin[1])\n else processor.use(plugin)\n }\n }\n\n processor.use(rehypeStringify, { allowDangerousHtml: true })\n return processor\n}\n\nconst processorCache = new WeakMap<MarkdownConfig, ReturnType<typeof createProcessor>>()\n\nexport async function processMarkdown(\n raw: string,\n config?: MarkdownConfig,\n preExtracted?: { content: string; frontmatter: Record<string, unknown> },\n): Promise<MarkdownResult> {\n let frontmatter: Record<string, unknown>\n let content: string\n if (preExtracted) {\n frontmatter = preExtracted.frontmatter\n content = preExtracted.content\n } else {\n const parsed = matter(raw, { engines: { yaml: parseYaml } })\n frontmatter = parsed.data\n content = parsed.content\n }\n const resolvedConfig = config && Object.keys(config).length > 0 ? config : DEFAULT_MARKDOWN_CONFIG\n let processor = processorCache.get(resolvedConfig)\n if (!processor) {\n processor = createProcessor(resolvedConfig)\n processorCache.set(resolvedConfig, processor)\n }\n const result = await processor.process(content)\n const headings = Array.isArray(result.data.headings) ? (result.data.headings as Heading[]) : []\n\n return { html: String(result), headings, frontmatter }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA+BA,MAAM,0BAA0C,EAAE;AAElD,SAAS,eAAe,MAAmB;AACzC,KAAI,KAAK,SAAS,OAAQ,QAAO,KAAK,SAAS;AAC/C,KAAI,KAAK,SAAU,QAAO,KAAK,SAAS,IAAI,eAAe,CAAC,KAAK,GAAG;AACpE,QAAO;;AAGT,SAAS,gBAAgB,MAAW,UAA2B;AAC7D,KAAI,KAAK,SAAS,aAAa,WAAW,KAAK,KAAK,QAAQ,CAC1D,UAAS,KAAK;EACZ,OAAO,SAAS,KAAK,QAAQ,GAAG;EAChC,MAAM,eAAe,KAAK;EAC1B,MAAM,KAAK,YAAY,MAAM;EAC9B,CAAC;AAEJ,KAAI,KAAK,SACP,MAAK,MAAM,SAAS,KAAK,SACvB,iBAAgB,OAAO,SAAS;;AAKtC,SAAS,gBAAgB,QAAwB;CAC/C,MAAM,YAAY,SAAS,CACxB,IAAI,YAAY,CAChB,IAAI,UAAU,CACd,IAAI,WAAW,CACf,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAEhC,IAAI,mBAAmB,CAEvB,IAAI,kBAAkB;AAEzB,KAAI,OAAO,cACT,MAAK,MAAM,UAAU,OAAO,cAC1B,KAAI,MAAM,QAAQ,OAAO,CAAE,WAAU,IAAI,OAAO,IAAI,OAAO,GAAG;KACzD,WAAU,IAAI,OAAO;AAI9B,WAAU,IAAI,cAAc,EAAE,oBAAoB,MAAM,CAAC;CAGzD,MAAM,aAAc,OAAO,OAAO,QAAQ,SAAS;CACnD,MAAM,YAAa,OAAO,OAAO,QAAQ,QAAQ;AAEjD,WAAU,IAAI,sBAAsB;EAClC,QAAQ,CAAC,WAAW,WAAW;EAC/B,uBAAuB;EACvB,gBAAgB;GACd,cAAc;GACd,gBAAgB;GAChB,cAAc;GACd,gBAAgB;GAChB,cAAc;GACd,aAAa;GACd;EACF,CAAuC;AAExC,WACG,IAAI,cAAc,CAClB,IAAI,WAAW,CACf,IAAI,wBAAwB,EAAE,UAAU,QAAQ,CAAC,CAEjD,IAAI,qBAAqB;EACxB,QAAQ;EACR,KAAK,CAAC,YAAY,aAAa;EAChC,CAAC,CAED,IAAI,uBAAuB;AAE9B,WAAU,WAAW,MAAW,SAAc;EAC5C,MAAM,WAAsB,EAAE;AAC9B,kBAAgB,MAAM,SAAS;AAC/B,OAAK,KAAK,WAAW;GACrB;AAEF,KAAI,OAAO,cACT,MAAK,MAAM,UAAU,OAAO,cAC1B,KAAI,MAAM,QAAQ,OAAO,CAAE,WAAU,IAAI,OAAO,IAAI,OAAO,GAAG;KACzD,WAAU,IAAI,OAAO;AAI9B,WAAU,IAAI,iBAAiB,EAAE,oBAAoB,MAAM,CAAC;AAC5D,QAAO;;AAGT,MAAM,iCAAiB,IAAI,SAA6D;AAExF,eAAsB,gBACpB,KACA,QACA,cACyB;CACzB,IAAI;CACJ,IAAI;AACJ,KAAI,cAAc;AAChB,gBAAc,aAAa;AAC3B,YAAU,aAAa;QAClB;EACL,MAAM,SAAS,OAAO,KAAK,EAAE,SAAS,EAAE,MAAMA,OAAW,EAAE,CAAC;AAC5D,gBAAc,OAAO;AACrB,YAAU,OAAO;;CAEnB,MAAM,iBAAiB,UAAU,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS;CAC3E,IAAI,YAAY,eAAe,IAAI,eAAe;AAClD,KAAI,CAAC,WAAW;AACd,cAAY,gBAAgB,eAAe;AAC3C,iBAAe,IAAI,gBAAgB,UAAU;;CAE/C,MAAM,SAAS,MAAM,UAAU,QAAQ,QAAQ;CAC/C,MAAM,WAAW,MAAM,QAAQ,OAAO,KAAK,SAAS,GAAI,OAAO,KAAK,WAAyB,EAAE;AAE/F,QAAO;EAAE,MAAM,OAAO,OAAO;EAAE;EAAU;EAAa"}
@@ -0,0 +1,28 @@
1
+ //#region src/runtime/index.d.ts
2
+ /**
3
+ * Runtime CSS/JS exports.
4
+ *
5
+ * Provides pre-built CSS and JS paths for consumers who want
6
+ * ready-to-use styling and interactivity for rendered content.
7
+ *
8
+ * Two tiers:
9
+ * - "Runtime" (standalone): full site — reset, prose, layout, TOC
10
+ * - "Content": just markdown rendering — reset, prose, viewport
11
+ *
12
+ * Code block styling is handled by Expressive Code (injected inline
13
+ * during markdown processing). The CSS bundles here cover prose,
14
+ * inline code, and layout only.
15
+ */
16
+ declare function getRuntimeCSS(): string;
17
+ declare function getRuntimeJS(): string;
18
+ declare function getRuntimeCSSPath(): string;
19
+ declare function getRuntimeJSPath(): string;
20
+ declare function getContentCSS(): string;
21
+ declare function getContentJS(): string;
22
+ declare function getContentCSSPath(): string;
23
+ declare function getContentJSPath(): string;
24
+ declare function getViewportCSS(): string;
25
+ declare function getViewportCSSPath(): string;
26
+ //#endregion
27
+ export { getContentCSS, getContentCSSPath, getContentJS, getContentJSPath, getRuntimeCSS, getRuntimeCSSPath, getRuntimeJS, getRuntimeJSPath, getViewportCSS, getViewportCSSPath };
28
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/runtime/index.ts"],"mappings":";;AAqEA;;;;;AAGA;;;;;AAGA;;;iBANgB,aAAA,CAAA;AAAA,iBAGA,YAAA,CAAA;AAAA,iBAGA,iBAAA,CAAA;AAAA,iBAGA,gBAAA,CAAA;AAAA,iBAKA,aAAA,CAAA;AAAA,iBAGA,YAAA,CAAA;AAAA,iBAGA,iBAAA,CAAA;AAAA,iBAGA,gBAAA,CAAA;AAAA,iBAKA,cAAA,CAAA;AAAA,iBAGA,kBAAA,CAAA"}
@@ -0,0 +1,90 @@
1
+ import { dirname, join } from "path";
2
+ import { readFileSync } from "fs";
3
+ import { fileURLToPath } from "url";
4
+ //#region src/runtime/index.ts
5
+ /**
6
+ * Runtime CSS/JS exports.
7
+ *
8
+ * Provides pre-built CSS and JS paths for consumers who want
9
+ * ready-to-use styling and interactivity for rendered content.
10
+ *
11
+ * Two tiers:
12
+ * - "Runtime" (standalone): full site — reset, prose, layout, TOC
13
+ * - "Content": just markdown rendering — reset, prose, viewport
14
+ *
15
+ * Code block styling is handled by Expressive Code (injected inline
16
+ * during markdown processing). The CSS bundles here cover prose,
17
+ * inline code, and layout only.
18
+ */
19
+ const ASSET_PATHS = {
20
+ "standalone.css": "styles/standalone.css",
21
+ "content.css": "styles/content.css",
22
+ "styles/viewport.css": "styles/viewport.css"
23
+ };
24
+ function getPackageDir() {
25
+ return join(dirname(fileURLToPath(import.meta.url)), "..", "..");
26
+ }
27
+ function readAsset(relPath) {
28
+ const pkgDir = getPackageDir();
29
+ const mapped = ASSET_PATHS[relPath];
30
+ if (mapped) try {
31
+ return readFileSync(join(pkgDir, "src", mapped), "utf-8");
32
+ } catch {}
33
+ for (const dir of ["dist", "src"]) try {
34
+ return readFileSync(join(pkgDir, dir, relPath), "utf-8");
35
+ } catch {}
36
+ return "";
37
+ }
38
+ function resolveAssetPath(relPath) {
39
+ const pkgDir = getPackageDir();
40
+ const mapped = ASSET_PATHS[relPath];
41
+ if (mapped) {
42
+ const path = join(pkgDir, "src", mapped);
43
+ try {
44
+ readFileSync(path);
45
+ return path;
46
+ } catch {}
47
+ }
48
+ for (const dir of ["dist", "src"]) {
49
+ const path = join(pkgDir, dir, relPath);
50
+ try {
51
+ readFileSync(path);
52
+ return path;
53
+ } catch {}
54
+ }
55
+ return join(pkgDir, "dist", relPath);
56
+ }
57
+ function getRuntimeCSS() {
58
+ return readAsset("standalone.css");
59
+ }
60
+ function getRuntimeJS() {
61
+ return readAsset("standalone.js");
62
+ }
63
+ function getRuntimeCSSPath() {
64
+ return resolveAssetPath("standalone.css");
65
+ }
66
+ function getRuntimeJSPath() {
67
+ return resolveAssetPath("standalone.js");
68
+ }
69
+ function getContentCSS() {
70
+ return readAsset("content.css");
71
+ }
72
+ function getContentJS() {
73
+ return readAsset("content.js");
74
+ }
75
+ function getContentCSSPath() {
76
+ return resolveAssetPath("content.css");
77
+ }
78
+ function getContentJSPath() {
79
+ return resolveAssetPath("content.js");
80
+ }
81
+ function getViewportCSS() {
82
+ return readAsset("styles/viewport.css");
83
+ }
84
+ function getViewportCSSPath() {
85
+ return resolveAssetPath("styles/viewport.css");
86
+ }
87
+ //#endregion
88
+ export { getContentCSS, getContentCSSPath, getContentJS, getContentJSPath, getRuntimeCSS, getRuntimeCSSPath, getRuntimeJS, getRuntimeJSPath, getViewportCSS, getViewportCSSPath };
89
+
90
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/runtime/index.ts"],"sourcesContent":["/**\n * Runtime CSS/JS exports.\n *\n * Provides pre-built CSS and JS paths for consumers who want\n * ready-to-use styling and interactivity for rendered content.\n *\n * Two tiers:\n * - \"Runtime\" (standalone): full site — reset, prose, layout, TOC\n * - \"Content\": just markdown rendering — reset, prose, viewport\n *\n * Code block styling is handled by Expressive Code (injected inline\n * during markdown processing). The CSS bundles here cover prose,\n * inline code, and layout only.\n */\n\nimport { readFileSync } from 'fs'\nimport { dirname, join } from 'path'\nimport { fileURLToPath } from 'url'\n\nconst ASSET_PATHS: Record<string, string> = {\n 'standalone.css': 'styles/standalone.css',\n 'content.css': 'styles/content.css',\n 'styles/viewport.css': 'styles/viewport.css',\n}\n\nfunction getPackageDir(): string {\n const thisDir = dirname(fileURLToPath(import.meta.url))\n // From src/runtime/ → src/ → package root\n // From dist/runtime/ → dist/ → package root\n return join(thisDir, '..', '..')\n}\n\nfunction readAsset(relPath: string): string {\n const pkgDir = getPackageDir()\n const mapped = ASSET_PATHS[relPath]\n if (mapped) {\n try {\n return readFileSync(join(pkgDir, 'src', mapped), 'utf-8')\n } catch {}\n }\n for (const dir of ['dist', 'src']) {\n try {\n return readFileSync(join(pkgDir, dir, relPath), 'utf-8')\n } catch {}\n }\n return ''\n}\n\nfunction resolveAssetPath(relPath: string): string {\n const pkgDir = getPackageDir()\n const mapped = ASSET_PATHS[relPath]\n if (mapped) {\n const path = join(pkgDir, 'src', mapped)\n try {\n readFileSync(path)\n return path\n } catch {}\n }\n for (const dir of ['dist', 'src']) {\n const path = join(pkgDir, dir, relPath)\n try {\n readFileSync(path)\n return path\n } catch {}\n }\n return join(pkgDir, 'dist', relPath)\n}\n\n// Standalone (full site)\nexport function getRuntimeCSS(): string {\n return readAsset('standalone.css')\n}\nexport function getRuntimeJS(): string {\n return readAsset('standalone.js')\n}\nexport function getRuntimeCSSPath(): string {\n return resolveAssetPath('standalone.css')\n}\nexport function getRuntimeJSPath(): string {\n return resolveAssetPath('standalone.js')\n}\n\n// Content (markdown rendering only)\nexport function getContentCSS(): string {\n return readAsset('content.css')\n}\nexport function getContentJS(): string {\n return readAsset('content.js')\n}\nexport function getContentCSSPath(): string {\n return resolveAssetPath('content.css')\n}\nexport function getContentJSPath(): string {\n return resolveAssetPath('content.js')\n}\n\n// Individual CSS files\nexport function getViewportCSS(): string {\n return readAsset('styles/viewport.css')\n}\nexport function getViewportCSSPath(): string {\n return resolveAssetPath('styles/viewport.css')\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmBA,MAAM,cAAsC;CAC1C,kBAAkB;CAClB,eAAe;CACf,uBAAuB;CACxB;AAED,SAAS,gBAAwB;AAI/B,QAAO,KAHS,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC,EAGlC,MAAM,KAAK;;AAGlC,SAAS,UAAU,SAAyB;CAC1C,MAAM,SAAS,eAAe;CAC9B,MAAM,SAAS,YAAY;AAC3B,KAAI,OACF,KAAI;AACF,SAAO,aAAa,KAAK,QAAQ,OAAO,OAAO,EAAE,QAAQ;SACnD;AAEV,MAAK,MAAM,OAAO,CAAC,QAAQ,MAAM,CAC/B,KAAI;AACF,SAAO,aAAa,KAAK,QAAQ,KAAK,QAAQ,EAAE,QAAQ;SAClD;AAEV,QAAO;;AAGT,SAAS,iBAAiB,SAAyB;CACjD,MAAM,SAAS,eAAe;CAC9B,MAAM,SAAS,YAAY;AAC3B,KAAI,QAAQ;EACV,MAAM,OAAO,KAAK,QAAQ,OAAO,OAAO;AACxC,MAAI;AACF,gBAAa,KAAK;AAClB,UAAO;UACD;;AAEV,MAAK,MAAM,OAAO,CAAC,QAAQ,MAAM,EAAE;EACjC,MAAM,OAAO,KAAK,QAAQ,KAAK,QAAQ;AACvC,MAAI;AACF,gBAAa,KAAK;AAClB,UAAO;UACD;;AAEV,QAAO,KAAK,QAAQ,QAAQ,QAAQ;;AAItC,SAAgB,gBAAwB;AACtC,QAAO,UAAU,iBAAiB;;AAEpC,SAAgB,eAAuB;AACrC,QAAO,UAAU,gBAAgB;;AAEnC,SAAgB,oBAA4B;AAC1C,QAAO,iBAAiB,iBAAiB;;AAE3C,SAAgB,mBAA2B;AACzC,QAAO,iBAAiB,gBAAgB;;AAI1C,SAAgB,gBAAwB;AACtC,QAAO,UAAU,cAAc;;AAEjC,SAAgB,eAAuB;AACrC,QAAO,UAAU,aAAa;;AAEhC,SAAgB,oBAA4B;AAC1C,QAAO,iBAAiB,cAAc;;AAExC,SAAgB,mBAA2B;AACzC,QAAO,iBAAiB,aAAa;;AAIvC,SAAgB,iBAAyB;AACvC,QAAO,UAAU,sBAAsB;;AAEzC,SAAgB,qBAA6B;AAC3C,QAAO,iBAAiB,sBAAsB"}
@@ -0,0 +1,4 @@
1
+ import { c as RawEntry, i as CollectionDef, n as ContentPlugin, t as ContentLayerConfig } from "../content-config-fHPaFZ7i.mjs";
2
+ import { i as MarkdownConfigSchema, n as HeadingSchema, r as MarkdownConfig, t as Heading } from "../heading-Dhvzlay-.mjs";
3
+ import { a as ProjectFrontmatter, i as BlogFrontmatterSchema, n as BaseFrontmatterSchema, o as ProjectFrontmatterSchema, r as BlogFrontmatter, t as BaseFrontmatter } from "../index-BQ6B1-qG.mjs";
4
+ export { BaseFrontmatter, BaseFrontmatterSchema, BlogFrontmatter, BlogFrontmatterSchema, CollectionDef, ContentLayerConfig, ContentPlugin, Heading, HeadingSchema, MarkdownConfig, MarkdownConfigSchema, ProjectFrontmatter, ProjectFrontmatterSchema, RawEntry };
@@ -0,0 +1,2 @@
1
+ import { a as ProjectFrontmatterSchema, i as BlogFrontmatterSchema, n as HeadingSchema, r as BaseFrontmatterSchema, t as MarkdownConfigSchema } from "../schemas-DJS7wOzd.mjs";
2
+ export { BaseFrontmatterSchema, BlogFrontmatterSchema, HeadingSchema, MarkdownConfigSchema, ProjectFrontmatterSchema };
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ //#region src/schemas/frontmatter.ts
3
+ const BaseFrontmatterSchema = z.object({
4
+ title: z.string(),
5
+ description: z.string(),
6
+ publishedDate: z.coerce.date(),
7
+ lastUpdatedOn: z.coerce.date(),
8
+ tags: z.array(z.string()).min(1),
9
+ draft: z.boolean().optional().default(false)
10
+ }).passthrough();
11
+ const ProjectFrontmatterSchema = BaseFrontmatterSchema.extend({
12
+ gitRepo: z.string().url().optional(),
13
+ links: z.array(z.object({
14
+ url: z.string().url(),
15
+ text: z.string()
16
+ })).optional()
17
+ });
18
+ const BlogFrontmatterSchema = BaseFrontmatterSchema.extend({
19
+ category: z.string().optional(),
20
+ featured: z.boolean().optional(),
21
+ coverImage: z.string().optional()
22
+ });
23
+ //#endregion
24
+ //#region src/schemas/heading.ts
25
+ const HeadingSchema = z.object({
26
+ depth: z.number(),
27
+ text: z.string(),
28
+ slug: z.string()
29
+ });
30
+ //#endregion
31
+ //#region src/schemas/markdown-config.ts
32
+ const MarkdownConfigSchema = z.object({
33
+ remarkPlugins: z.array(z.any()).optional(),
34
+ rehypePlugins: z.array(z.any()).optional(),
35
+ shiki: z.object({
36
+ themes: z.object({
37
+ light: z.string(),
38
+ dark: z.string()
39
+ }),
40
+ langAlias: z.record(z.string(), z.string()).optional(),
41
+ defaultShowLineNumbers: z.boolean().optional()
42
+ }).optional()
43
+ });
44
+ //#endregion
45
+ export { ProjectFrontmatterSchema as a, BlogFrontmatterSchema as i, HeadingSchema as n, BaseFrontmatterSchema as r, MarkdownConfigSchema as t };
46
+
47
+ //# sourceMappingURL=schemas-DJS7wOzd.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas-DJS7wOzd.mjs","names":[],"sources":["../src/schemas/frontmatter.ts","../src/schemas/heading.ts","../src/schemas/markdown-config.ts"],"sourcesContent":["import { z } from 'zod'\n\n// ── Base frontmatter (required for all content items) ──\n\nexport const BaseFrontmatterSchema = z\n .object({\n title: z.string(),\n description: z.string(),\n publishedDate: z.coerce.date(),\n lastUpdatedOn: z.coerce.date(),\n tags: z.array(z.string()).min(1),\n draft: z.boolean().optional().default(false),\n })\n .passthrough()\n\nexport type BaseFrontmatter = z.infer<typeof BaseFrontmatterSchema>\n\n// ── Project frontmatter (extends base with project-specific fields) ──\n\nexport const ProjectFrontmatterSchema = BaseFrontmatterSchema.extend({\n gitRepo: z.string().url().optional(),\n links: z\n .array(\n z.object({\n url: z.string().url(),\n text: z.string(),\n }),\n )\n .optional(),\n})\n\nexport type ProjectFrontmatter = z.infer<typeof ProjectFrontmatterSchema>\n\n// ── Blog frontmatter (extends base with blog-specific fields) ──\n\nexport const BlogFrontmatterSchema = BaseFrontmatterSchema.extend({\n category: z.string().optional(),\n featured: z.boolean().optional(),\n coverImage: z.string().optional(),\n})\n\nexport type BlogFrontmatter = z.infer<typeof BlogFrontmatterSchema>\n","import { z } from 'zod'\n\n// ── Heading (extracted from markdown) ──\n\nexport const HeadingSchema = z.object({\n depth: z.number(),\n text: z.string(),\n slug: z.string(),\n})\n\nexport type Heading = z.infer<typeof HeadingSchema>\n","import { z } from 'zod'\n\n// ── Markdown config ──\n\nexport const MarkdownConfigSchema = z.object({\n remarkPlugins: z.array(z.any()).optional(),\n rehypePlugins: z.array(z.any()).optional(),\n shiki: z\n .object({\n themes: z.object({\n light: z.string(),\n dark: z.string(),\n }),\n langAlias: z.record(z.string(), z.string()).optional(),\n defaultShowLineNumbers: z.boolean().optional(),\n })\n .optional(),\n})\n\nexport type MarkdownConfig = z.infer<typeof MarkdownConfigSchema>\n"],"mappings":";;AAIA,MAAa,wBAAwB,EAClC,OAAO;CACN,OAAO,EAAE,QAAQ;CACjB,aAAa,EAAE,QAAQ;CACvB,eAAe,EAAE,OAAO,MAAM;CAC9B,eAAe,EAAE,OAAO,MAAM;CAC9B,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE;CAChC,OAAO,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ,MAAM;CAC7C,CAAC,CACD,aAAa;AAMhB,MAAa,2BAA2B,sBAAsB,OAAO;CACnE,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;CACpC,OAAO,EACJ,MACC,EAAE,OAAO;EACP,KAAK,EAAE,QAAQ,CAAC,KAAK;EACrB,MAAM,EAAE,QAAQ;EACjB,CAAC,CACH,CACA,UAAU;CACd,CAAC;AAMF,MAAa,wBAAwB,sBAAsB,OAAO;CAChE,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,UAAU,EAAE,SAAS,CAAC,UAAU;CAChC,YAAY,EAAE,QAAQ,CAAC,UAAU;CAClC,CAAC;;;ACnCF,MAAa,gBAAgB,EAAE,OAAO;CACpC,OAAO,EAAE,QAAQ;CACjB,MAAM,EAAE,QAAQ;CAChB,MAAM,EAAE,QAAQ;CACjB,CAAC;;;ACJF,MAAa,uBAAuB,EAAE,OAAO;CAC3C,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,UAAU;CAC1C,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,UAAU;CAC1C,OAAO,EACJ,OAAO;EACN,QAAQ,EAAE,OAAO;GACf,OAAO,EAAE,QAAQ;GACjB,MAAM,EAAE,QAAQ;GACjB,CAAC;EACF,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC,UAAU;EACtD,wBAAwB,EAAE,SAAS,CAAC,UAAU;EAC/C,CAAC,CACD,UAAU;CACd,CAAC"}
@@ -0,0 +1,28 @@
1
+ //#region src/loaders/types.d.ts
2
+ /**
3
+ * Loader interface for content formats.
4
+ *
5
+ * Each loader handles a set of file extensions and knows how to parse
6
+ * raw file content into structured data + optional body text.
7
+ */
8
+ type LoaderType = 'markdown' | 'json' | 'json5' | 'jsonc' | 'yaml' | 'toml';
9
+ type LoaderKind = 'markdown' | 'data';
10
+ interface LoaderResult {
11
+ /** Parsed data (frontmatter for markdown, full object for JSON/YAML/TOML) */
12
+ data: Record<string, any>;
13
+ /** Raw body content (only markdown loaders provide this) */
14
+ content?: string;
15
+ }
16
+ interface Loader {
17
+ /** Loader name for error messages */
18
+ name: string;
19
+ /** High-level content shape produced by the loader. */
20
+ kind: LoaderKind;
21
+ /** File extensions this loader handles */
22
+ extensions: string[];
23
+ /** Parse raw file content into data + optional body */
24
+ load(filePath: string): LoaderResult | Promise<LoaderResult>;
25
+ }
26
+ //#endregion
27
+ export { LoaderResult as n, LoaderType as r, Loader as t };
28
+ //# sourceMappingURL=types-DUsjRE7Y.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DUsjRE7Y.d.mts","names":[],"sources":["../src/loaders/types.ts"],"mappings":";;AAOA;;;;;KAAY,UAAA;AAAA,KACA,UAAA;AAAA,UAEK,YAAA;EAFK;EAIpB,IAAA,EAAM,MAAA;EAFS;EAIf,OAAA;AAAA;AAAA,UAGe,MAAA;EALf;EAOA,IAAA;EALA;EAOA,IAAA,EAAM,UAAA;EAPC;EASP,UAAA;EANqB;EAQrB,IAAA,CAAK,QAAA,WAAmB,YAAA,GAAe,OAAA,CAAQ,YAAA;AAAA"}