@publish.os/nextjs 0.0.1-alpha.5 → 0.0.1-alpha.7

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 (400) hide show
  1. package/README.md +3 -5
  2. package/compiler-assets/nextjs/defaults/app/globals.css +6 -0
  3. package/compiler-assets/nextjs/defaults/group/layout.tsx +23 -0
  4. package/compiler-assets/nextjs/defaults/group/leaf.tsx +48 -0
  5. package/compiler-assets/nextjs/defaults/group/page.tsx +50 -0
  6. package/compiler-assets/nextjs/defaults/project/next.config.mjs +45 -0
  7. package/compiler-assets/nextjs/defaults/project/postcss.config.mjs +5 -0
  8. package/compiler-assets/nextjs/defaults/project/tsconfig.json.template +41 -0
  9. package/compiler-assets/nextjs/defaults/root/css/animation.css +90 -0
  10. package/compiler-assets/nextjs/defaults/root/css/components/dialog.css +21 -0
  11. package/compiler-assets/nextjs/defaults/root/css/components/drawer.css +21 -0
  12. package/compiler-assets/nextjs/defaults/root/css/components/menu.css +23 -0
  13. package/compiler-assets/nextjs/defaults/root/css/components/navigation-menu.css +25 -0
  14. package/compiler-assets/nextjs/defaults/root/css/components/popover.css +17 -0
  15. package/compiler-assets/nextjs/defaults/root/css/components/select.css +23 -0
  16. package/compiler-assets/nextjs/defaults/root/css/components/toast.css +19 -0
  17. package/compiler-assets/nextjs/defaults/root/css/components/tooltip.css +15 -0
  18. package/compiler-assets/nextjs/defaults/root/css/layout.css +22 -0
  19. package/compiler-assets/nextjs/defaults/root/css/media.css +81 -0
  20. package/compiler-assets/nextjs/defaults/root/css/radius.css +49 -0
  21. package/compiler-assets/nextjs/defaults/root/css/scrollbar.css +43 -0
  22. package/compiler-assets/nextjs/defaults/root/css/shadow.css +145 -0
  23. package/compiler-assets/nextjs/defaults/root/css/typography.css +607 -0
  24. package/compiler-assets/nextjs/defaults/root/css/zindex.css +39 -0
  25. package/compiler-assets/nextjs/defaults/root/globals.css +191 -0
  26. package/compiler-assets/nextjs/defaults/root/layout.tsx +19 -0
  27. package/compiler-assets/nextjs/defaults/root/page.tsx +61 -0
  28. package/compiler-assets/nextjs/defaults/root/theme.css +50 -0
  29. package/compiler-assets/nextjs/defaults/source/_internal/logger.ts +21 -0
  30. package/compiler-assets/nextjs/shims/generated-group-layout.tsx +19 -0
  31. package/compiler-assets/nextjs/shims/generated-group-page.tsx +18 -0
  32. package/compiler-assets/nextjs/shims/generated-leaf-page.tsx +21 -0
  33. package/compiler-assets/nextjs/shims/global-layout.tsx +134 -0
  34. package/compiler-assets/nextjs/shims/markdown-route.ts +29 -0
  35. package/compiler-assets/nextjs/shims/og-image-route.ts +18 -0
  36. package/compiler-assets/nextjs/shims/powered-by-footer.tsx +40 -0
  37. package/compiler-assets/nextjs/shims/providers.tsx +13 -0
  38. package/compiler-assets/nextjs/shims/proxy.ts +317 -0
  39. package/compiler-assets/nextjs/shims/publish-os-theme-provider.tsx +77 -0
  40. package/compiler-assets/nextjs/shims/root-page.tsx +13 -0
  41. package/compiler-assets/nextjs/shims/theme-defaults.css +177 -0
  42. package/dist/{kernel/components/ui/button.d.cts → button-CFdx-ohV.d.ts} +1 -3
  43. package/dist/cache/tags.js +6 -14
  44. package/dist/compiler.d.ts +100 -0
  45. package/dist/compiler.js +13379 -0
  46. package/dist/config/createNextConfig.d.ts +2 -1
  47. package/dist/config/createNextConfig.js +16 -12
  48. package/dist/icons.d.ts +1 -0
  49. package/dist/icons.js +2 -0
  50. package/dist/index.d.ts +303 -15
  51. package/dist/index.js +30 -1196
  52. package/dist/kernel/components/blocks/AgentActions.d.ts +9 -3
  53. package/dist/kernel/components/blocks/AgentActions.js +114 -200
  54. package/dist/kernel/components/blocks/animated-icon-swap.js +4 -25
  55. package/dist/kernel/components/blocks/color-palette.js +107 -157
  56. package/dist/kernel/components/blocks/design-system-preview.d.ts +38 -6
  57. package/dist/kernel/components/blocks/design-system-preview.js +44 -52
  58. package/dist/kernel/components/blocks/link-playground.js +23 -71
  59. package/dist/kernel/components/blocks/logo-block.js +19 -48
  60. package/dist/kernel/components/blocks/nav-breadcrumb.d.ts +1 -1
  61. package/dist/kernel/components/blocks/nav-breadcrumb.js +28 -52
  62. package/dist/kernel/components/blocks/navbar.d.ts +1 -1
  63. package/dist/kernel/components/blocks/navbar.js +14 -41
  64. package/dist/kernel/components/blocks/navigation-progress-playground.js +56 -149
  65. package/dist/kernel/components/blocks/navigation-progress.js +53 -157
  66. package/dist/kernel/components/blocks/next-prev.d.ts +1 -1
  67. package/dist/kernel/components/blocks/next-prev.js +16 -42
  68. package/dist/kernel/components/blocks/page-list.d.ts +1 -1
  69. package/dist/kernel/components/blocks/page-list.js +11 -16
  70. package/dist/kernel/components/blocks/search.d.ts +13 -2
  71. package/dist/kernel/components/blocks/search.js +116 -247
  72. package/dist/kernel/components/blocks/sidebar-node.d.ts +2 -2
  73. package/dist/kernel/components/blocks/sidebar-node.js +56 -95
  74. package/dist/kernel/components/blocks/sidebar.d.ts +5 -23
  75. package/dist/kernel/components/blocks/sidebar.js +35 -103
  76. package/dist/kernel/components/blocks/theme-toggle.d.ts +7 -3
  77. package/dist/kernel/components/blocks/theme-toggle.js +2 -2
  78. package/dist/kernel/components/blocks/toc.js +42 -178
  79. package/dist/kernel/components/mdx/components/blockquote.js +3 -24
  80. package/dist/kernel/components/mdx/components/callout.d.ts +1 -1
  81. package/dist/kernel/components/mdx/components/callout.js +15 -47
  82. package/dist/kernel/components/mdx/components/code-block.js +2 -2
  83. package/dist/kernel/components/mdx/components/figure-caption.js +6 -24
  84. package/dist/kernel/components/mdx/components/figure.js +9 -36
  85. package/dist/kernel/components/mdx/components/footnotes.js +3 -24
  86. package/dist/kernel/components/mdx/components/heading-copy-link.js +13 -37
  87. package/dist/kernel/components/mdx/components/heading.d.ts +8 -3
  88. package/dist/kernel/components/mdx/components/heading.js +32 -116
  89. package/dist/kernel/components/mdx/components/hr.d.ts +5 -3
  90. package/dist/kernel/components/mdx/components/hr.js +2 -2
  91. package/dist/kernel/components/mdx/components/image-zoom.js +2 -3
  92. package/dist/kernel/components/mdx/components/image.js +23 -63
  93. package/dist/kernel/components/mdx/components/inline-code.js +3 -24
  94. package/dist/kernel/components/mdx/components/kbd.d.ts +9 -4
  95. package/dist/kernel/components/mdx/components/kbd.js +2 -2
  96. package/dist/kernel/components/mdx/components/link.d.ts +1 -2
  97. package/dist/kernel/components/mdx/components/link.js +2 -2
  98. package/dist/kernel/components/mdx/components/paragraph.js +13 -41
  99. package/dist/kernel/components/mdx/components/pre.js +3 -24
  100. package/dist/kernel/components/mdx/components/strikethrough.js +6 -24
  101. package/dist/kernel/components/mdx/components/table.js +2 -2
  102. package/dist/kernel/components/mdx/components/task-list.js +6 -28
  103. package/dist/kernel/components/mdx/components/video-player.js +53 -88
  104. package/dist/kernel/components/mdx/components/video.js +27 -75
  105. package/dist/kernel/components/mdx/error-boundary.d.ts +1 -1
  106. package/dist/kernel/components/mdx/error-boundary.js +12 -15
  107. package/dist/kernel/components/mdx/error-fallback.js +4 -4
  108. package/dist/kernel/components/mdx/mdx.d.ts +68 -11
  109. package/dist/kernel/components/mdx/mdx.js +29 -29
  110. package/dist/kernel/components/mdx/rehype-heading-ids.js +11 -67
  111. package/dist/kernel/components/mdx/types.d.ts +1 -1
  112. package/dist/kernel/components/ui/accordion.js +3 -26
  113. package/dist/kernel/components/ui/breadcrumb-trail.d.ts +26 -8
  114. package/dist/kernel/components/ui/breadcrumb-trail.js +32 -79
  115. package/dist/kernel/components/ui/breadcrumb.d.ts +2 -6
  116. package/dist/kernel/components/ui/breadcrumb.js +21 -70
  117. package/dist/kernel/components/ui/button-group.d.ts +4 -3
  118. package/dist/kernel/components/ui/button-group.js +7 -30
  119. package/dist/kernel/components/ui/button.js +13 -36
  120. package/dist/kernel/components/ui/card.d.ts +2 -2
  121. package/dist/kernel/components/ui/card.js +2 -23
  122. package/dist/kernel/components/ui/dialog.d.ts +9 -9
  123. package/dist/kernel/components/ui/dialog.js +15 -33
  124. package/dist/kernel/components/ui/drawer.d.ts +10 -10
  125. package/dist/kernel/components/ui/drawer.js +15 -33
  126. package/dist/kernel/components/ui/input.js +6 -30
  127. package/dist/kernel/components/ui/kbd.js +10 -31
  128. package/dist/kernel/components/ui/link.d.ts +1 -1
  129. package/dist/kernel/components/ui/link.js +53 -104
  130. package/dist/kernel/components/ui/menu.d.ts +21 -21
  131. package/dist/kernel/components/ui/menu.js +14 -36
  132. package/dist/kernel/components/ui/meta-key.d.ts +9 -4
  133. package/dist/kernel/components/ui/meta-key.js +2 -2
  134. package/dist/kernel/components/ui/navigation-menu.d.ts +14 -14
  135. package/dist/kernel/components/ui/navigation-menu.js +9 -30
  136. package/dist/kernel/components/ui/popover.d.ts +10 -10
  137. package/dist/kernel/components/ui/popover.js +13 -34
  138. package/dist/kernel/components/ui/progress.js +2 -25
  139. package/dist/kernel/components/ui/scroll-area.js +39 -118
  140. package/dist/kernel/components/ui/select.d.ts +15 -15
  141. package/dist/kernel/components/ui/select.js +19 -35
  142. package/dist/kernel/components/ui/separator.js +2 -25
  143. package/dist/kernel/components/ui/table.js +2 -23
  144. package/dist/kernel/components/ui/tabs.js +39 -99
  145. package/dist/kernel/components/ui/tag.d.ts +2 -2
  146. package/dist/kernel/components/ui/tag.js +4 -25
  147. package/dist/kernel/components/ui/text.d.ts +2 -2
  148. package/dist/kernel/components/ui/text.js +112 -131
  149. package/dist/kernel/components/ui/theme-toggle.d.ts +18 -4
  150. package/dist/kernel/components/ui/theme-toggle.js +18 -44
  151. package/dist/kernel/components/ui/toast.d.ts +10 -10
  152. package/dist/kernel/components/ui/toast.js +13 -35
  153. package/dist/kernel/components/ui/tooltip.d.ts +8 -8
  154. package/dist/kernel/components/ui/tooltip.js +9 -30
  155. package/dist/kernel/defaults.registry.d.ts +61 -70
  156. package/dist/kernel/defaults.registry.js +61 -69
  157. package/dist/kernel/framework-icons.d.ts +1 -0
  158. package/dist/kernel/framework-icons.js +39 -0
  159. package/dist/kernel/routes/agent/markdown.js +36 -65
  160. package/dist/kernel/routes/layouts/group.d.ts +1 -1
  161. package/dist/kernel/routes/layouts/group.js +20 -109
  162. package/dist/kernel/routes/metadata/feed.d.ts +1 -2
  163. package/dist/kernel/routes/metadata/feed.js +46 -127
  164. package/dist/kernel/routes/metadata/llms.d.ts +1 -2
  165. package/dist/kernel/routes/metadata/llms.js +42 -120
  166. package/dist/kernel/routes/metadata/og-image.d.ts +11 -1
  167. package/dist/kernel/routes/metadata/og-image.js +264 -198
  168. package/dist/kernel/routes/metadata/robots.d.ts +1 -2
  169. package/dist/kernel/routes/metadata/robots.js +21 -90
  170. package/dist/kernel/routes/metadata/sitemap.d.ts +1 -2
  171. package/dist/kernel/routes/metadata/sitemap.js +36 -102
  172. package/dist/kernel/routes/pages/group.d.ts +1 -1
  173. package/dist/kernel/routes/pages/group.js +42 -137
  174. package/dist/kernel/routes/pages/leaf.d.ts +1 -1
  175. package/dist/kernel/routes/pages/leaf.js +74 -213
  176. package/dist/kernel/routes/pages/root.d.ts +1 -1
  177. package/dist/kernel/routes/pages/root.js +37 -108
  178. package/dist/keyboard-shortcuts.js +69 -141
  179. package/dist/{kernel/components/ui/link.d.cts → link-CYaCRDb6.d.ts} +9 -5
  180. package/dist/resolvers/manifest-resolver.d.ts +3 -3
  181. package/dist/resolvers/manifest-resolver.js +15 -21
  182. package/dist/{kernel/routes/metadata/og-image.d.cts → route-metadata-og-image-BeKKFHg7.d.ts} +12 -16
  183. package/dist/search.d.ts +81 -4
  184. package/dist/search.js +124 -195
  185. package/dist/{kernel/components/blocks/sidebar.d.cts → sidebar-types-Bgchdfd6.d.ts} +2 -10
  186. package/dist/theme-scope.d.ts +15 -0
  187. package/dist/theme-scope.js +23 -0
  188. package/dist/types-B_b3C0U6.d.ts +63 -0
  189. package/dist/types-CIwwieNw.d.ts +127 -0
  190. package/dist/types-DHBm7-j6.d.ts +57 -0
  191. package/dist/types-sM2g9nW0.d.ts +12 -0
  192. package/dist/types.d.ts +0 -1
  193. package/dist/types.js +1 -1
  194. package/dist/utils/cn.d.ts +5 -9
  195. package/dist/utils/cn.js +13 -7
  196. package/dist/utils/heading-ids.js +20 -47
  197. package/dist/utils/pretty-date.js +7 -13
  198. package/init/seed/minimal/publish.os/assets/logo/publish-dev-logo.dark.png +0 -0
  199. package/init/seed/minimal/publish.os/assets/logo/publish-dev-logo.png +0 -0
  200. package/init/seed/minimal/publish.os/docs/content/get-started.mdx +54 -0
  201. package/init/seed/minimal/publish.os/docs/content/groups.mdx +31 -0
  202. package/init/seed/minimal/publish.os/docs/content/theme.mdx +64 -0
  203. package/init/seed/minimal/publish.os/publish.os.config.json +21 -0
  204. package/init/seed/minimal/publish.os/theme.css +47 -0
  205. package/init/seed/minimal/seed.json +13 -0
  206. package/package.json +470 -40
  207. package/release/{package.json → app/lucide/package.json} +14 -7
  208. package/release/app/lucide/pnpm-lock.yaml.template +2905 -0
  209. package/release/app/lucide/pnpm-workspace.yaml +11 -0
  210. package/release/app/phosphor/package.json +30 -0
  211. package/release/app/phosphor/pnpm-lock.yaml.template +2908 -0
  212. package/release/app/phosphor/pnpm-workspace.yaml +11 -0
  213. package/release/app/tabler/package.json +30 -0
  214. package/release/app/tabler/pnpm-lock.yaml.template +2911 -0
  215. package/release/app/tabler/pnpm-workspace.yaml +11 -0
  216. package/release/compiler/package.json +20 -0
  217. package/release/compiler/pnpm-lock.yaml.template +2432 -0
  218. package/release/compiler/pnpm-workspace.yaml +11 -0
  219. package/release/release.json +31 -7
  220. package/dist/cache/tags.cjs +0 -79
  221. package/dist/cache/tags.d.cts +0 -13
  222. package/dist/config/createNextConfig.cjs +0 -52
  223. package/dist/config/createNextConfig.d.cts +0 -8
  224. package/dist/config.cjs +0 -78
  225. package/dist/config.d.cts +0 -101
  226. package/dist/config.d.ts +0 -101
  227. package/dist/config.js +0 -48
  228. package/dist/index.cjs +0 -1266
  229. package/dist/index.d.cts +0 -18
  230. package/dist/kernel/components/blocks/AgentActions.cjs +0 -425
  231. package/dist/kernel/components/blocks/AgentActions.d.cts +0 -52
  232. package/dist/kernel/components/blocks/animated-icon-swap.cjs +0 -101
  233. package/dist/kernel/components/blocks/animated-icon-swap.d.cts +0 -16
  234. package/dist/kernel/components/blocks/color-palette.cjs +0 -413
  235. package/dist/kernel/components/blocks/color-palette.d.cts +0 -7
  236. package/dist/kernel/components/blocks/design-system-preview.cjs +0 -593
  237. package/dist/kernel/components/blocks/design-system-preview.d.cts +0 -29
  238. package/dist/kernel/components/blocks/link-playground.cjs +0 -816
  239. package/dist/kernel/components/blocks/link-playground.d.cts +0 -5
  240. package/dist/kernel/components/blocks/logo-block.cjs +0 -156
  241. package/dist/kernel/components/blocks/logo-block.d.cts +0 -21
  242. package/dist/kernel/components/blocks/nav-breadcrumb.cjs +0 -122
  243. package/dist/kernel/components/blocks/nav-breadcrumb.d.cts +0 -11
  244. package/dist/kernel/components/blocks/navbar.cjs +0 -154
  245. package/dist/kernel/components/blocks/navbar.d.cts +0 -16
  246. package/dist/kernel/components/blocks/navigation-progress-playground.cjs +0 -735
  247. package/dist/kernel/components/blocks/navigation-progress-playground.d.cts +0 -5
  248. package/dist/kernel/components/blocks/navigation-progress.cjs +0 -270
  249. package/dist/kernel/components/blocks/navigation-progress.d.cts +0 -16
  250. package/dist/kernel/components/blocks/next-prev.cjs +0 -142
  251. package/dist/kernel/components/blocks/next-prev.d.cts +0 -11
  252. package/dist/kernel/components/blocks/page-list.cjs +0 -59
  253. package/dist/kernel/components/blocks/page-list.d.cts +0 -11
  254. package/dist/kernel/components/blocks/search.cjs +0 -717
  255. package/dist/kernel/components/blocks/search.d.cts +0 -77
  256. package/dist/kernel/components/blocks/sidebar-node.cjs +0 -309
  257. package/dist/kernel/components/blocks/sidebar-node.d.cts +0 -8
  258. package/dist/kernel/components/blocks/sidebar.cjs +0 -317
  259. package/dist/kernel/components/blocks/theme-toggle.cjs +0 -31
  260. package/dist/kernel/components/blocks/theme-toggle.d.cts +0 -6
  261. package/dist/kernel/components/blocks/toc.cjs +0 -356
  262. package/dist/kernel/components/blocks/toc.d.cts +0 -10
  263. package/dist/kernel/components/mdx/components/blockquote.cjs +0 -66
  264. package/dist/kernel/components/mdx/components/blockquote.d.cts +0 -6
  265. package/dist/kernel/components/mdx/components/callout.cjs +0 -137
  266. package/dist/kernel/components/mdx/components/callout.d.cts +0 -18
  267. package/dist/kernel/components/mdx/components/code-block.cjs +0 -39
  268. package/dist/kernel/components/mdx/components/code-block.d.cts +0 -9
  269. package/dist/kernel/components/mdx/components/figure-caption.cjs +0 -63
  270. package/dist/kernel/components/mdx/components/figure-caption.d.cts +0 -6
  271. package/dist/kernel/components/mdx/components/figure.cjs +0 -78
  272. package/dist/kernel/components/mdx/components/figure.d.cts +0 -10
  273. package/dist/kernel/components/mdx/components/footnotes.cjs +0 -66
  274. package/dist/kernel/components/mdx/components/footnotes.d.cts +0 -6
  275. package/dist/kernel/components/mdx/components/heading-copy-link.cjs +0 -108
  276. package/dist/kernel/components/mdx/components/heading-copy-link.d.cts +0 -23
  277. package/dist/kernel/components/mdx/components/heading.cjs +0 -166
  278. package/dist/kernel/components/mdx/components/heading.d.cts +0 -8
  279. package/dist/kernel/components/mdx/components/hr.cjs +0 -34
  280. package/dist/kernel/components/mdx/components/hr.d.cts +0 -9
  281. package/dist/kernel/components/mdx/components/image-zoom.cjs +0 -49
  282. package/dist/kernel/components/mdx/components/image-zoom.d.cts +0 -10
  283. package/dist/kernel/components/mdx/components/image.cjs +0 -192
  284. package/dist/kernel/components/mdx/components/image.d.cts +0 -21
  285. package/dist/kernel/components/mdx/components/inline-code.cjs +0 -66
  286. package/dist/kernel/components/mdx/components/inline-code.d.cts +0 -6
  287. package/dist/kernel/components/mdx/components/kbd.cjs +0 -34
  288. package/dist/kernel/components/mdx/components/kbd.d.cts +0 -10
  289. package/dist/kernel/components/mdx/components/link.cjs +0 -49
  290. package/dist/kernel/components/mdx/components/link.d.cts +0 -11
  291. package/dist/kernel/components/mdx/components/paragraph.cjs +0 -87
  292. package/dist/kernel/components/mdx/components/paragraph.d.cts +0 -5
  293. package/dist/kernel/components/mdx/components/pre.cjs +0 -66
  294. package/dist/kernel/components/mdx/components/pre.d.cts +0 -6
  295. package/dist/kernel/components/mdx/components/strikethrough.cjs +0 -63
  296. package/dist/kernel/components/mdx/components/strikethrough.d.cts +0 -6
  297. package/dist/kernel/components/mdx/components/table.cjs +0 -59
  298. package/dist/kernel/components/mdx/components/table.d.cts +0 -10
  299. package/dist/kernel/components/mdx/components/task-list.cjs +0 -88
  300. package/dist/kernel/components/mdx/components/task-list.d.cts +0 -8
  301. package/dist/kernel/components/mdx/components/video-player.cjs +0 -173
  302. package/dist/kernel/components/mdx/components/video-player.d.cts +0 -18
  303. package/dist/kernel/components/mdx/components/video.cjs +0 -185
  304. package/dist/kernel/components/mdx/components/video.d.cts +0 -15
  305. package/dist/kernel/components/mdx/error-boundary.cjs +0 -62
  306. package/dist/kernel/components/mdx/error-boundary.d.cts +0 -8
  307. package/dist/kernel/components/mdx/error-fallback.cjs +0 -58
  308. package/dist/kernel/components/mdx/error-fallback.d.cts +0 -9
  309. package/dist/kernel/components/mdx/mdx.cjs +0 -141
  310. package/dist/kernel/components/mdx/mdx.d.cts +0 -22
  311. package/dist/kernel/components/mdx/rehype-heading-ids.cjs +0 -113
  312. package/dist/kernel/components/mdx/rehype-heading-ids.d.cts +0 -10
  313. package/dist/kernel/components/mdx/types.cjs +0 -18
  314. package/dist/kernel/components/mdx/types.d.cts +0 -18
  315. package/dist/kernel/components/ui/accordion.cjs +0 -104
  316. package/dist/kernel/components/ui/accordion.d.cts +0 -16
  317. package/dist/kernel/components/ui/breadcrumb-trail.cjs +0 -238
  318. package/dist/kernel/components/ui/breadcrumb-trail.d.cts +0 -13
  319. package/dist/kernel/components/ui/breadcrumb.cjs +0 -399
  320. package/dist/kernel/components/ui/breadcrumb.d.cts +0 -52
  321. package/dist/kernel/components/ui/button-group.cjs +0 -143
  322. package/dist/kernel/components/ui/button-group.d.cts +0 -19
  323. package/dist/kernel/components/ui/button.cjs +0 -139
  324. package/dist/kernel/components/ui/card.cjs +0 -133
  325. package/dist/kernel/components/ui/card.d.cts +0 -17
  326. package/dist/kernel/components/ui/dialog.cjs +0 -149
  327. package/dist/kernel/components/ui/dialog.d.cts +0 -22
  328. package/dist/kernel/components/ui/drawer.cjs +0 -163
  329. package/dist/kernel/components/ui/drawer.d.cts +0 -24
  330. package/dist/kernel/components/ui/input.cjs +0 -96
  331. package/dist/kernel/components/ui/input.d.cts +0 -18
  332. package/dist/kernel/components/ui/kbd.cjs +0 -105
  333. package/dist/kernel/components/ui/kbd.d.cts +0 -13
  334. package/dist/kernel/components/ui/link.cjs +0 -253
  335. package/dist/kernel/components/ui/menu.cjs +0 -301
  336. package/dist/kernel/components/ui/menu.d.cts +0 -70
  337. package/dist/kernel/components/ui/meta-key.cjs +0 -34
  338. package/dist/kernel/components/ui/meta-key.d.cts +0 -12
  339. package/dist/kernel/components/ui/navigation-menu.cjs +0 -253
  340. package/dist/kernel/components/ui/navigation-menu.d.cts +0 -47
  341. package/dist/kernel/components/ui/popover.cjs +0 -168
  342. package/dist/kernel/components/ui/popover.d.cts +0 -24
  343. package/dist/kernel/components/ui/progress.cjs +0 -112
  344. package/dist/kernel/components/ui/progress.d.cts +0 -16
  345. package/dist/kernel/components/ui/scroll-area.cjs +0 -413
  346. package/dist/kernel/components/ui/scroll-area.d.cts +0 -58
  347. package/dist/kernel/components/ui/select.cjs +0 -244
  348. package/dist/kernel/components/ui/select.d.cts +0 -40
  349. package/dist/kernel/components/ui/separator.cjs +0 -73
  350. package/dist/kernel/components/ui/separator.d.cts +0 -8
  351. package/dist/kernel/components/ui/table.cjs +0 -131
  352. package/dist/kernel/components/ui/table.d.cts +0 -11
  353. package/dist/kernel/components/ui/tabs.cjs +0 -450
  354. package/dist/kernel/components/ui/tabs.d.cts +0 -82
  355. package/dist/kernel/components/ui/tag.cjs +0 -104
  356. package/dist/kernel/components/ui/tag.d.cts +0 -14
  357. package/dist/kernel/components/ui/text.cjs +0 -184
  358. package/dist/kernel/components/ui/text.d.cts +0 -17
  359. package/dist/kernel/components/ui/theme-toggle.cjs +0 -108
  360. package/dist/kernel/components/ui/theme-toggle.d.cts +0 -10
  361. package/dist/kernel/components/ui/toast.cjs +0 -154
  362. package/dist/kernel/components/ui/toast.d.cts +0 -26
  363. package/dist/kernel/components/ui/tooltip.cjs +0 -127
  364. package/dist/kernel/components/ui/tooltip.d.cts +0 -20
  365. package/dist/kernel/defaults.registry.cjs +0 -541
  366. package/dist/kernel/defaults.registry.d.cts +0 -469
  367. package/dist/kernel/routes/agent/markdown.cjs +0 -202
  368. package/dist/kernel/routes/agent/markdown.d.cts +0 -58
  369. package/dist/kernel/routes/layouts/group.cjs +0 -181
  370. package/dist/kernel/routes/layouts/group.d.cts +0 -20
  371. package/dist/kernel/routes/metadata/feed.cjs +0 -293
  372. package/dist/kernel/routes/metadata/feed.d.cts +0 -20
  373. package/dist/kernel/routes/metadata/llms.cjs +0 -239
  374. package/dist/kernel/routes/metadata/llms.d.cts +0 -26
  375. package/dist/kernel/routes/metadata/og-image.cjs +0 -630
  376. package/dist/kernel/routes/metadata/robots.cjs +0 -148
  377. package/dist/kernel/routes/metadata/robots.d.cts +0 -6
  378. package/dist/kernel/routes/metadata/sitemap.cjs +0 -192
  379. package/dist/kernel/routes/metadata/sitemap.d.cts +0 -8
  380. package/dist/kernel/routes/pages/group.cjs +0 -263
  381. package/dist/kernel/routes/pages/group.d.cts +0 -17
  382. package/dist/kernel/routes/pages/leaf.cjs +0 -421
  383. package/dist/kernel/routes/pages/leaf.d.cts +0 -36
  384. package/dist/kernel/routes/pages/root.cjs +0 -229
  385. package/dist/kernel/routes/pages/root.d.cts +0 -16
  386. package/dist/keyboard-shortcuts.cjs +0 -345
  387. package/dist/keyboard-shortcuts.d.cts +0 -34
  388. package/dist/resolvers/manifest-resolver.cjs +0 -111
  389. package/dist/resolvers/manifest-resolver.d.cts +0 -13
  390. package/dist/search.cjs +0 -411
  391. package/dist/search.d.cts +0 -20
  392. package/dist/types.cjs +0 -30
  393. package/dist/types.d.cts +0 -269
  394. package/dist/utils/cn.cjs +0 -49
  395. package/dist/utils/cn.d.cts +0 -15
  396. package/dist/utils/heading-ids.cjs +0 -119
  397. package/dist/utils/heading-ids.d.cts +0 -15
  398. package/dist/utils/pretty-date.cjs +0 -55
  399. package/dist/utils/pretty-date.d.cts +0 -6
  400. package/release/pnpm-lock.yaml +0 -1215
package/dist/index.js CHANGED
@@ -1,1199 +1,33 @@
1
- // src/cache/tags.ts
2
- import { createHash } from "crypto";
3
- var MAX_TAG_LEN = 256;
4
- var MAX_SEGMENT_LEN = 80;
5
- var TAG_PATTERN = /^[a-z0-9:_./-]+$/;
6
- function sha256(value) {
7
- return createHash("sha256").update(value).digest("hex").slice(0, 16);
8
- }
9
- function safeSegment(value) {
10
- const raw = value.trim().toLowerCase() || "root";
11
- const normalized = raw.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/^\//, "").replace(/\/$/, "").replace(/[^a-z0-9:_./-]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
12
- const segment = normalized || "root";
13
- if (segment.length <= MAX_SEGMENT_LEN) return segment;
14
- return `${segment.slice(0, 48)}.${sha256(segment)}`;
15
- }
16
- function assertTag(tag) {
17
- if (tag.length > MAX_TAG_LEN || !TAG_PATTERN.test(tag)) {
18
- return `tag:${sha256(tag)}`;
19
- }
20
- return tag;
21
- }
22
- var tags = {
23
- site() {
24
- return "site";
25
- },
26
- pages() {
27
- return "pages";
28
- },
29
- group(group) {
30
- return assertTag(`group:${safeSegment(group)}`);
31
- },
32
- page(group, slug) {
33
- const path = Array.isArray(slug) ? slug.join("/") : slug;
34
- return assertTag(`page:${safeSegment(group)}:${safeSegment(path)}`);
35
- },
36
- manifest(contentHash) {
37
- return assertTag(`manifest:${safeSegment(contentHash)}`);
38
- },
39
- sitemap() {
40
- return "sitemap";
41
- },
42
- robots() {
43
- return "robots";
44
- },
45
- llms(scope = "root") {
46
- return assertTag(`llms:${safeSegment(scope)}`);
47
- },
48
- feed(format, scope = "site") {
49
- return assertTag(`feed:${safeSegment(format)}:${safeSegment(scope)}`);
50
- }
51
- };
52
-
53
- // src/config/createNextConfig.ts
54
- function createNextConfig(_options) {
55
- return {
56
- transpilePackages: ["@publish.os/nextjs"],
57
- cacheComponents: true,
58
- cacheLife: {
59
- page: {
60
- stale: 60 * 60 * 24,
61
- revalidate: 60 * 60 * 24 * 30,
62
- expire: 60 * 60 * 24 * 365
63
- },
64
- feed: {
65
- stale: 60 * 60,
66
- revalidate: 60 * 60 * 6,
67
- expire: 60 * 60 * 24 * 7
68
- },
69
- sitemap: {
70
- stale: 60 * 60,
71
- revalidate: 60 * 60 * 24,
72
- expire: 60 * 60 * 24 * 30
73
- }
74
- }
75
- };
76
- }
77
-
78
- // src/kernel/components/blocks/page-list.tsx
79
- import { Link } from "../ui/link.js";
80
- import { jsx } from "react/jsx-runtime";
81
- function pageNodes(nodes) {
82
- return nodes.flatMap((node) => {
83
- if (node.type === "page") return [node];
84
- if (node.type === "section" || node.type === "folder") {
85
- return pageNodes(node.children);
86
- }
87
- return [];
88
- });
89
- }
90
- function PageList({ tree, currentPath, className }) {
91
- const pages = pageNodes(tree);
92
- if (pages.length === 0) {
93
- return null;
94
- }
95
- return /* @__PURE__ */ jsx("nav", { "aria-label": "Pages in this group", className, children: /* @__PURE__ */ jsx("ul", { className: "space-y-2 text-sm", children: pages.map((page) => {
96
- const active = page.path === currentPath;
97
- return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
98
- Link,
99
- {
100
- active,
101
- color: active ? "accent" : "default",
102
- href: page.path,
103
- size: "sm",
104
- children: page.title
105
- }
106
- ) }, `${page.group}:${page.fileID}`);
107
- }) }) });
108
- }
109
-
110
- // src/kernel/routes/metadata/feed.ts
111
- import { cacheLife, cacheTag } from "next/cache";
112
-
113
- // src/kernel/routes/response.ts
114
- var CACHE_CONTROL = "public, max-age=300, s-maxage=86400, stale-while-revalidate=3600, must-revalidate";
115
- var CDN_CACHE_CONTROL = "public, max-age=2592000, stale-while-revalidate=31536000";
116
- var SHORT_CACHE_CONTROL = "public, max-age=60, s-maxage=600, stale-while-revalidate=300, must-revalidate";
117
- var SHORT_CDN_CACHE_CONTROL = "public, max-age=300, stale-while-revalidate=3600";
118
- function cacheControl(policy) {
119
- if (!policy || policy === "default") return CACHE_CONTROL;
120
- if (policy === "short") return SHORT_CACHE_CONTROL;
121
- return policy;
122
- }
123
- function cdnCacheControl(policy) {
124
- if (!policy || policy === "default") return CDN_CACHE_CONTROL;
125
- if (policy === "short") return SHORT_CDN_CACHE_CONTROL;
126
- return policy;
127
- }
128
- function cachedTextHeaders(contentType, options = {}) {
129
- const headers = new Headers(options.headers);
130
- headers.set("cache-control", cacheControl(options.cachePolicy));
131
- headers.set("cdn-cache-control", cdnCacheControl(options.cachePolicy));
132
- headers.set("vercel-cdn-cache-control", cdnCacheControl(options.cachePolicy));
133
- headers.set("content-type", contentType);
134
- headers.set("x-content-type-options", "nosniff");
135
- if (options.noindex) headers.set("x-robots-tag", "noindex");
136
- return headers;
137
- }
138
- function createCachedTextResponse(options) {
139
- const status = options.status ?? 200;
140
- const method = options.method ?? "GET";
141
- const headers = cachedTextHeaders(options.contentType, options);
142
- return new Response(method === "HEAD" ? null : options.body, {
143
- headers,
144
- status
145
- });
146
- }
147
-
148
- // src/kernel/routes/metadata/canonical-url.ts
149
- function canonicalUrl(manifest, path) {
150
- const origin = manifest.site.url?.replace(/\/+$/, "");
151
- if (!origin) return path;
152
- try {
153
- return new URL(path, `${origin}/`).toString();
154
- } catch {
155
- return path;
156
- }
157
- }
158
-
159
- // src/kernel/routes/metadata/feed.ts
160
- function xmlEscape(value) {
161
- return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
162
- }
163
- function pageTimestamp(page) {
164
- const value = page.publishedAt ?? page.updatedAt;
165
- if (!value) return -Infinity;
166
- const timestamp = Date.parse(value);
167
- return Number.isNaN(timestamp) ? -Infinity : timestamp;
168
- }
169
- function pageInScope(page, options) {
170
- if (options.scope === "site" || !options.group) return true;
171
- if (options.scope === "self") return page.group === options.group;
172
- return page.group === options.group || page.group.startsWith(`${options.group}/`);
173
- }
174
- function feedPages(manifest, options) {
175
- const statuses = options.status ?? ["published"];
176
- const pages = manifest.pages.filter((page) => statuses.includes(page.status)).filter((page) => pageInScope(page, options)).sort((a, b) => pageTimestamp(b) - pageTimestamp(a));
177
- return options.limit ? pages.slice(0, options.limit) : pages;
178
- }
179
- async function rssXml(manifest, options = {}) {
180
- "use cache";
181
- cacheLife("page");
182
- cacheTag(
183
- tags.site(),
184
- tags.feed("rss", options.group ?? options.scope ?? "site"),
185
- tags.manifest(manifest.contentHash)
186
- );
187
- const title = manifest.site.name;
188
- const description = manifest.site.description ?? title;
189
- const pages = feedPages(manifest, options);
190
- const homeUrl = canonicalUrl(manifest, "/");
191
- const items = pages.map((page) => {
192
- const pageUrl = canonicalUrl(manifest, page.path);
193
- const pubDate = page.publishedAt ? `
194
- <pubDate>${xmlEscape(new Date(page.publishedAt).toUTCString())}</pubDate>` : "";
195
- const description2 = page.description ? `
196
- <description>${xmlEscape(page.description)}</description>` : "";
197
- return ` <item>
198
- <title>${xmlEscape(page.title)}</title>
199
- <link>${xmlEscape(pageUrl)}</link>
200
- <guid>${xmlEscape(pageUrl)}</guid>${pubDate}${description2}
201
- </item>`;
202
- }).join("\n");
203
- return `<?xml version="1.0" encoding="UTF-8"?>
204
- <rss version="2.0">
205
- <channel>
206
- <title>${xmlEscape(title)}</title>
207
- <link>${xmlEscape(homeUrl)}</link>
208
- <description>${xmlEscape(description)}</description>
209
- ${items}
210
- </channel>
211
- </rss>
212
- `;
213
- }
214
- function pageDate(page) {
215
- return page.publishedAt ?? page.updatedAt;
216
- }
217
- function latestFeedDate(pages) {
218
- const timestamp = Math.max(0, ...pages.map((page) => pageTimestamp(page)));
219
- return new Date(timestamp).toISOString();
220
- }
221
- async function atomXml(manifest, options = {}) {
222
- "use cache";
223
- cacheLife("page");
224
- cacheTag(
225
- tags.site(),
226
- tags.feed("atom", options.group ?? options.scope ?? "site"),
227
- tags.manifest(manifest.contentHash)
228
- );
229
- const title = manifest.site.name;
230
- const pages = feedPages(manifest, options);
231
- const homeUrl = canonicalUrl(manifest, "/");
232
- const entries = pages.map((page) => {
233
- const date = pageDate(page);
234
- const updated = date ? new Date(date).toISOString() : latestFeedDate([]);
235
- const pageUrl = canonicalUrl(manifest, page.path);
236
- const summary = page.description ? `
237
- <summary>${xmlEscape(page.description)}</summary>` : "";
238
- return ` <entry>
239
- <title>${xmlEscape(page.title)}</title>
240
- <id>${xmlEscape(pageUrl)}</id>
241
- <link href="${xmlEscape(pageUrl)}" />
242
- <updated>${xmlEscape(updated)}</updated>${summary}
243
- </entry>`;
244
- }).join("\n");
245
- return `<?xml version="1.0" encoding="UTF-8"?>
246
- <feed xmlns="http://www.w3.org/2005/Atom">
247
- <title>${xmlEscape(title)}</title>
248
- <id>${xmlEscape(homeUrl)}</id>
249
- <updated>${xmlEscape(latestFeedDate(pages))}</updated>
250
- ${entries}
251
- </feed>
252
- `;
253
- }
254
- async function jsonFeed(manifest, options = {}) {
255
- "use cache";
256
- cacheLife("page");
257
- cacheTag(
258
- tags.site(),
259
- tags.feed("json", options.group ?? options.scope ?? "site"),
260
- tags.manifest(manifest.contentHash)
261
- );
262
- const pages = feedPages(manifest, options);
263
- return `${JSON.stringify(
264
- {
265
- version: "https://jsonfeed.org/version/1.1",
266
- title: manifest.site.name,
267
- description: manifest.site.description,
268
- home_page_url: canonicalUrl(manifest, "/"),
269
- items: pages.map((page) => ({
270
- id: canonicalUrl(manifest, page.path),
271
- url: canonicalUrl(manifest, page.path),
272
- title: page.title,
273
- summary: page.description,
274
- content_text: page.body,
275
- date_published: page.publishedAt,
276
- date_modified: page.updatedAt,
277
- tags: page.tags
278
- }))
279
- },
280
- null,
281
- 2
282
- )}
283
- `;
284
- }
285
- function createRssFeedRoute(manifest, options = {}) {
286
- return async function GET() {
287
- return createCachedTextResponse({
288
- body: await rssXml(manifest, options),
289
- contentType: "application/rss+xml; charset=utf-8"
290
- });
291
- };
292
- }
293
- function createAtomFeedRoute(manifest, options = {}) {
294
- return async function GET() {
295
- return createCachedTextResponse({
296
- body: await atomXml(manifest, options),
297
- contentType: "application/atom+xml; charset=utf-8"
298
- });
299
- };
300
- }
301
- function createJsonFeedRoute(manifest, options = {}) {
302
- return async function GET() {
303
- return createCachedTextResponse({
304
- body: await jsonFeed(manifest, options),
305
- contentType: "application/feed+json; charset=utf-8"
306
- });
307
- };
308
- }
309
-
310
- // src/kernel/routes/metadata/llms.ts
311
- import { cacheLife as cacheLife2, cacheTag as cacheTag2 } from "next/cache";
312
- var TEXT_ENCODER = new TextEncoder();
313
- function pageInScope2(page, options) {
314
- if (options.scope === "site" || !options.group) return true;
315
- if (options.scope === "self") return page.group === options.group;
316
- return page.group === options.group || page.group.startsWith(`${options.group}/`);
317
- }
318
- function llmsSummary(manifest) {
319
- return manifest.site.description ? `> ${manifest.site.description}` : `> Agent-readable index for ${manifest.site.name}.`;
320
- }
321
- async function llmsTxt(manifest, options = {}) {
322
- "use cache";
323
- cacheLife2("page");
324
- cacheTag2(
325
- tags.site(),
326
- tags.llms(options.group ?? options.scope ?? "root"),
327
- tags.manifest(manifest.contentHash)
328
- );
329
- const pages = manifest.pages.filter((page) => page.status === "published").filter((page) => pageInScope2(page, options));
330
- const visiblePages = options.limit ? pages.slice(0, options.limit) : pages;
331
- const lines = visiblePages.map((page) => {
332
- const description = options.includeDescriptions && page.description ? ` - ${page.description}` : "";
333
- return `- [${page.title}](${canonicalUrl(manifest, page.path)})${description}`;
334
- });
335
- const linkLines = (options.links ?? []).map(
336
- (link) => `- [${link.title}](${canonicalUrl(manifest, link.path)})`
337
- );
338
- const linkSection = linkLines.length ? `
339
-
340
- ## Group LLM indexes
341
-
342
- ${linkLines.join("\n")}` : "";
343
- return `# ${manifest.site.name}
344
-
345
- ${llmsSummary(manifest)}
346
-
347
- ${lines.join("\n")}${linkSection}
348
- `;
349
- }
350
- function createLlmsTxtRoute(manifest, options = {}) {
351
- return async function GET() {
352
- return createCachedTextResponse({
353
- body: await llmsTxt(manifest, options),
354
- contentType: "text/plain; charset=utf-8"
355
- });
356
- };
357
- }
358
-
359
- // src/kernel/routes/metadata/og-image.tsx
360
- import { readFile } from "fs/promises";
361
- import { createRequire } from "module";
362
- import { ImageResponse } from "next/og";
363
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
364
- var ERROR_HEADERS = {
365
- "cache-control": "public, max-age=60, must-revalidate",
366
- "cdn-cache-control": "public, max-age=300",
367
- "vercel-cdn-cache-control": "public, max-age=300",
368
- "x-content-type-options": "nosniff"
369
- };
370
- var SUCCESS_HEADERS = {
371
- "cache-control": "public, max-age=31536000, immutable",
372
- "cdn-cache-control": "public, max-age=31536000, immutable",
373
- "vercel-cdn-cache-control": "public, max-age=31536000, immutable",
374
- "x-content-type-options": "nosniff"
375
- };
376
- var DEVELOPMENT_SUCCESS_HEADERS = {
377
- "cache-control": "no-store",
378
- "cdn-cache-control": "no-store",
379
- "vercel-cdn-cache-control": "no-store",
380
- "x-content-type-options": "nosniff"
381
- };
382
- var KEY_PATTERN = /^[a-f0-9]{16}$/;
383
- var DESCRIPTION_MAX_LENGTH = 260;
384
- var LABEL_MAX_LENGTH = 72;
385
- var SITE_NAME_MAX_LENGTH = 42;
386
- var TITLE_MAX_LENGTH = 220;
387
- var GRID_INSET = 86;
388
- var GRID_BOTTOM = 544;
389
- var CONTENT_X = 122;
390
- var CONTENT_WIDTH = 956;
391
- var TITLE_MAX_FONT_SIZE = 60;
392
- var TITLE_MIN_FONT_SIZE = 40;
393
- var LOGO_MAX_WIDTH = 300;
394
- var LOGO_MAX_HEIGHT = 46;
395
- var MAX_RESPONSE_CACHE_ENTRIES = 128;
396
- var BADGE_RADIUS = 999;
397
- var CONTENT_TYPE_HEADER = { "content-type": "image/png" };
398
- var PLATFORM_FONT_FAMILY = "PublishOS Geist";
399
- var PLATFORM_FONT_WEIGHTS = [
400
- 400,
401
- 500,
402
- 600,
403
- 700,
404
- 800
405
- ];
406
- var fontArrayBufferCache = /* @__PURE__ */ new Map();
407
- var imageResponseFontCache = /* @__PURE__ */ new Map();
408
- var imageResponseCache = /* @__PURE__ */ new Map();
409
- var require2 = createRequire(`${process.cwd()}/package.json`);
410
- var platformFontPath = require2.resolve(
411
- "next/dist/compiled/@vercel/og/Geist-Regular.ttf"
412
- );
413
- var platformFontData;
414
- function isDevelopment() {
415
- return process.env.NODE_ENV === "development";
416
- }
417
- function successHeaders() {
418
- return isDevelopment() ? DEVELOPMENT_SUCCESS_HEADERS : SUCCESS_HEADERS;
419
- }
420
- function clampText(value, maxLength) {
421
- if (!value) return void 0;
422
- if (value.length <= maxLength) return value;
423
- return `${value.slice(0, maxLength - 3).trimEnd()}...`;
424
- }
425
- async function routeKey(context) {
426
- const params = await context.params;
427
- return params.key.replace(/\.png$/, "");
428
- }
429
- function ellipsize(value, maxLength) {
430
- if (value.length <= maxLength) return value;
431
- return `${value.slice(0, maxLength - 3).trimEnd()}...`;
432
- }
433
- function wrapText(options) {
434
- const source = clampText(options.text, options.maxLength);
435
- if (!source) return [];
436
- const maxCharsPerLine = Math.max(
437
- 12,
438
- Math.floor(options.width / (options.fontSize * 0.54))
439
- );
440
- const words = source.split(/\s+/).filter(Boolean);
441
- const lines = [];
442
- let line = "";
443
- for (const word of words) {
444
- const nextLine = line ? `${line} ${word}` : word;
445
- if (nextLine.length <= maxCharsPerLine) {
446
- line = nextLine;
447
- continue;
448
- }
449
- if (line) lines.push(line);
450
- line = word.length > maxCharsPerLine ? ellipsize(word, maxCharsPerLine) : word;
451
- if (lines.length === options.maxLines) break;
452
- }
453
- if (line && lines.length < options.maxLines) lines.push(line);
454
- const consumed = lines.join(" ").replace(/\.\.\.$/, "");
455
- const didOverflow = words.join(" ").length > consumed.length || (lines.at(-1)?.endsWith("...") ?? false);
456
- if (didOverflow && lines.length > 0) {
457
- const lastIndex = lines.length - 1;
458
- lines[lastIndex] = ellipsize(lines[lastIndex] ?? "", maxCharsPerLine);
459
- }
460
- return lines;
461
- }
462
- function singleLineText(options) {
463
- const source = clampText(options.text, options.maxLength);
464
- if (!source) return void 0;
465
- const charWidth = options.fontSize * (options.mono ? 0.62 : 0.54);
466
- const maxChars = Math.max(4, Math.floor(options.width / charWidth));
467
- return ellipsize(source.replace(/\s+/g, " "), maxChars);
468
- }
469
- function titleFontSize(title) {
470
- const length = title?.length ?? 0;
471
- if (length > 130) return TITLE_MIN_FONT_SIZE;
472
- if (length > 100) return 44;
473
- if (length > 80) return 48;
474
- if (length > 60) return 52;
475
- if (length > 40) return 56;
476
- return TITLE_MAX_FONT_SIZE;
477
- }
478
- function siteUrl(value) {
479
- if (!value) return void 0;
480
- const candidate = value.includes("://") ? value : `https://${value}`;
481
- try {
482
- return new URL(candidate);
483
- } catch {
484
- return void 0;
485
- }
486
- }
487
- function displayUrlParts(entry) {
488
- const url = siteUrl(entry.siteUrl);
489
- const host = url?.hostname ?? entry.siteUrl?.replace(/\/.*$/, "") ?? "";
490
- const basePath = url?.pathname.replace(/\/+$/, "") ?? "";
491
- const routePath = entry.routePath === "/" ? "" : `/${entry.routePath.replace(/^\/+/, "")}`;
492
- const path = `${basePath === "/" ? "" : basePath}${routePath}`;
493
- if (host) return { host, path };
494
- return { host: "", path: path || routePath };
495
- }
496
- function dataUrlToArrayBuffer(value) {
497
- const cached = fontArrayBufferCache.get(value);
498
- if (cached) return cached;
499
- const binary = atob(value);
500
- const bytes = new Uint8Array(binary.length);
501
- for (let index = 0; index < binary.length; index += 1) {
502
- bytes[index] = binary.charCodeAt(index);
503
- }
504
- fontArrayBufferCache.set(value, bytes.buffer);
505
- return bytes.buffer;
506
- }
507
- function platformFonts() {
508
- platformFontData ??= readFile(platformFontPath).then(
509
- (data) => data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)
510
- );
511
- return platformFontData.then(
512
- (data) => PLATFORM_FONT_WEIGHTS.map((weight) => ({
513
- data: data.slice(0),
514
- name: PLATFORM_FONT_FAMILY,
515
- style: "normal",
516
- weight
517
- }))
518
- );
519
- }
520
- async function imageResponseFonts(entry) {
521
- const cached = imageResponseFontCache.get(entry.key);
522
- if (cached) return cached;
523
- const manifestFonts = ["main", "mono"].flatMap((role) => {
524
- const font = entry.fonts?.[role];
525
- return font?.files?.map((file) => ({
526
- data: dataUrlToArrayBuffer(file.data),
527
- name: font.family,
528
- style: file.style,
529
- weight: file.weight
530
- })) ?? [];
531
- });
532
- const fonts = manifestFonts.length > 0 ? [...manifestFonts, ...await platformFonts()] : await platformFonts();
533
- imageResponseFontCache.set(entry.key, fonts);
534
- return fonts;
535
- }
536
- function fontFamily(font, fallback) {
537
- const fallbackStack = fallback === "mono" ? `"${PLATFORM_FONT_FAMILY}", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace` : `"${PLATFORM_FONT_FAMILY}", Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`;
538
- return font?.family ? `${JSON.stringify(font.family)}, ${fallbackStack}` : fallbackStack;
539
- }
540
- function fittedLogoDimensions(logo) {
541
- if (!logo?.width || !logo.height) return void 0;
542
- const scale = Math.min(
543
- LOGO_MAX_WIDTH / logo.width,
544
- LOGO_MAX_HEIGHT / logo.height,
545
- 1
546
- );
547
- return {
548
- height: Math.max(1, Math.round(logo.height * scale)),
549
- width: Math.max(1, Math.round(logo.width * scale))
550
- };
551
- }
552
- function cacheImageResponse(key, render) {
553
- if (isDevelopment()) return render();
554
- const cached = imageResponseCache.get(key);
555
- if (cached) return cached;
556
- const promise = render().catch((error) => {
557
- imageResponseCache.delete(key);
558
- throw error;
559
- });
560
- imageResponseCache.set(key, promise);
561
- if (imageResponseCache.size > MAX_RESPONSE_CACHE_ENTRIES) {
562
- const oldest = imageResponseCache.keys().next().value;
563
- if (oldest) imageResponseCache.delete(oldest);
564
- }
565
- return promise;
566
- }
567
- function responseFromCachedImage(cached) {
568
- return new Response(cached.body.slice(0), {
569
- headers: cached.headers,
570
- status: cached.status
571
- });
572
- }
573
- async function cachedImageResponse(response) {
574
- const headersToApply = successHeaders();
575
- const headers = new Headers(response.headers);
576
- headers.set("cache-control", headersToApply["cache-control"]);
577
- headers.set("cdn-cache-control", headersToApply["cdn-cache-control"]);
578
- headers.set(
579
- "vercel-cdn-cache-control",
580
- headersToApply["vercel-cdn-cache-control"]
581
- );
582
- headers.set(
583
- "x-content-type-options",
584
- headersToApply["x-content-type-options"]
585
- );
586
- if (!headers.has("content-type")) {
587
- headers.set("content-type", CONTENT_TYPE_HEADER["content-type"]);
588
- }
589
- return {
590
- body: await response.arrayBuffer(),
591
- headers,
592
- status: response.status
593
- };
594
- }
595
- function createOgImageRoute({ manifest }) {
596
- return async function GET(_request, context) {
597
- const key = await routeKey(context);
598
- if (!KEY_PATTERN.test(key)) {
599
- return new Response("Bad request", {
600
- headers: ERROR_HEADERS,
601
- status: 400
602
- });
603
- }
604
- const entry = manifest.generated[key];
605
- if (!entry || entry.source !== "generated") {
606
- return new Response("Not found", {
607
- headers: ERROR_HEADERS,
608
- status: 404
609
- });
610
- }
611
- const titleSize = titleFontSize(entry.title);
612
- const titleLines = wrapText({
613
- fontSize: titleSize,
614
- maxLength: TITLE_MAX_LENGTH,
615
- maxLines: 2,
616
- text: entry.title,
617
- width: 900
618
- });
619
- const descriptionLines = wrapText({
620
- fontSize: 30,
621
- maxLength: DESCRIPTION_MAX_LENGTH,
622
- maxLines: 2,
623
- text: entry.description,
624
- width: 870
625
- });
626
- const label = singleLineText({
627
- fontSize: 22,
628
- maxLength: LABEL_MAX_LENGTH,
629
- mono: true,
630
- text: entry.label,
631
- width: 520
632
- });
633
- const displayUrl = displayUrlParts(entry);
634
- const siteName = clampText(
635
- entry.siteName ?? entry.alt,
636
- SITE_NAME_MAX_LENGTH
637
- );
638
- const background = entry.background ?? "#ffffff";
639
- const textPrimary = entry.textPrimary ?? "#111111";
640
- const textSecondary = entry.textSecondary ?? "#525252";
641
- const accent = entry.accent ?? "#2563eb";
642
- const stroke = entry.stroke ?? "#e5e7eb";
643
- const logoSrc = entry.logo?.dataUri;
644
- const logoDimensions = fittedLogoDimensions(entry.logo);
645
- return responseFromCachedImage(
646
- await cacheImageResponse(
647
- entry.key,
648
- async () => cachedImageResponse(
649
- new ImageResponse(
650
- /* @__PURE__ */ jsxs(
651
- "div",
652
- {
653
- style: {
654
- background,
655
- color: textPrimary,
656
- display: "flex",
657
- fontFamily: fontFamily(entry.fonts?.main, "sans"),
658
- height: "100%",
659
- position: "relative",
660
- width: "100%"
661
- },
662
- children: [
663
- /* @__PURE__ */ jsx2(
664
- "div",
665
- {
666
- style: {
667
- background: stroke,
668
- display: "flex",
669
- height: "100%",
670
- left: GRID_INSET,
671
- position: "absolute",
672
- top: 0,
673
- width: 2
674
- }
675
- }
676
- ),
677
- /* @__PURE__ */ jsx2(
678
- "div",
679
- {
680
- style: {
681
- background: stroke,
682
- display: "flex",
683
- height: "100%",
684
- position: "absolute",
685
- right: GRID_INSET,
686
- top: 0,
687
- width: 2
688
- }
689
- }
690
- ),
691
- /* @__PURE__ */ jsx2(
692
- "div",
693
- {
694
- style: {
695
- background: stroke,
696
- display: "flex",
697
- height: 2,
698
- left: 0,
699
- position: "absolute",
700
- top: GRID_INSET,
701
- width: "100%"
702
- }
703
- }
704
- ),
705
- /* @__PURE__ */ jsx2(
706
- "div",
707
- {
708
- style: {
709
- background: stroke,
710
- bottom: GRID_INSET,
711
- display: "flex",
712
- height: 2,
713
- left: 0,
714
- position: "absolute",
715
- width: "100%"
716
- }
717
- }
718
- ),
719
- /* @__PURE__ */ jsx2(
720
- "div",
721
- {
722
- style: {
723
- alignItems: "center",
724
- color: accent,
725
- display: "flex",
726
- fontFamily: fontFamily(entry.fonts?.main, "sans"),
727
- fontSize: 22,
728
- fontWeight: 700,
729
- height: GRID_INSET,
730
- justifyContent: "flex-start",
731
- left: CONTENT_X,
732
- lineHeight: 1,
733
- overflow: "hidden",
734
- position: "absolute",
735
- top: 0,
736
- width: 430
737
- },
738
- children: logoSrc ? (
739
- // biome-ignore lint/performance/noImgElement: ImageResponse renders static manifest-provided logo data; next/image is not available in Satori output.
740
- /* @__PURE__ */ jsx2(
741
- "img",
742
- {
743
- alt: "",
744
- src: logoSrc,
745
- style: {
746
- height: logoDimensions?.height ?? LOGO_MAX_HEIGHT,
747
- maxHeight: LOGO_MAX_HEIGHT,
748
- maxWidth: LOGO_MAX_WIDTH,
749
- objectFit: "contain",
750
- objectPosition: "left center",
751
- width: logoDimensions?.width ?? "auto"
752
- }
753
- }
754
- )
755
- ) : siteName
756
- }
757
- ),
758
- label ? /* @__PURE__ */ jsx2(
759
- "div",
760
- {
761
- style: {
762
- alignItems: "center",
763
- display: "flex",
764
- fontFamily: fontFamily(entry.fonts?.mono, "mono"),
765
- height: GRID_INSET,
766
- justifyContent: "flex-end",
767
- overflow: "hidden",
768
- position: "absolute",
769
- right: CONTENT_X,
770
- top: 0,
771
- width: 520
772
- },
773
- children: /* @__PURE__ */ jsxs(
774
- "div",
775
- {
776
- style: {
777
- alignItems: "center",
778
- borderRadius: BADGE_RADIUS,
779
- color: accent,
780
- display: "flex",
781
- fontSize: 20,
782
- fontWeight: 600,
783
- lineHeight: 1,
784
- maxWidth: 520,
785
- overflow: "hidden",
786
- paddingBottom: 6,
787
- paddingLeft: 12,
788
- paddingRight: 12,
789
- paddingTop: 6,
790
- position: "relative"
791
- },
792
- children: [
793
- /* @__PURE__ */ jsx2(
794
- "div",
795
- {
796
- style: {
797
- background: accent,
798
- borderRadius: BADGE_RADIUS,
799
- bottom: 0,
800
- display: "flex",
801
- left: 0,
802
- opacity: 0.14,
803
- position: "absolute",
804
- right: 0,
805
- top: 0
806
- }
807
- }
808
- ),
809
- /* @__PURE__ */ jsx2(
810
- "div",
811
- {
812
- style: {
813
- borderColor: accent,
814
- borderRadius: BADGE_RADIUS,
815
- borderStyle: "solid",
816
- borderWidth: 1,
817
- bottom: 0,
818
- display: "flex",
819
- left: 0,
820
- opacity: 0.32,
821
- position: "absolute",
822
- right: 0,
823
- top: 0
824
- }
825
- }
826
- ),
827
- /* @__PURE__ */ jsx2("div", { style: { display: "flex", position: "relative" }, children: label })
828
- ]
829
- }
830
- )
831
- }
832
- ) : null,
833
- /* @__PURE__ */ jsxs(
834
- "div",
835
- {
836
- style: {
837
- display: "flex",
838
- flexDirection: "column",
839
- gap: 24,
840
- left: CONTENT_X,
841
- position: "absolute",
842
- top: 164,
843
- width: CONTENT_WIDTH
844
- },
845
- children: [
846
- /* @__PURE__ */ jsx2(
847
- "div",
848
- {
849
- style: {
850
- display: "flex",
851
- flexDirection: "column",
852
- fontSize: titleSize,
853
- fontWeight: 800,
854
- letterSpacing: 0,
855
- lineHeight: 1.08,
856
- width: 900
857
- },
858
- children: titleLines.map((line) => /* @__PURE__ */ jsx2("div", { style: { display: "flex" }, children: line }, line))
859
- }
860
- ),
861
- descriptionLines.length > 0 ? /* @__PURE__ */ jsx2(
862
- "div",
863
- {
864
- style: {
865
- color: textSecondary,
866
- display: "flex",
867
- flexDirection: "column",
868
- fontSize: 30,
869
- lineHeight: 1.25,
870
- width: 870
871
- },
872
- children: descriptionLines.map((line) => /* @__PURE__ */ jsx2("div", { style: { display: "flex" }, children: line }, line))
873
- }
874
- ) : null
875
- ]
876
- }
877
- ),
878
- /* @__PURE__ */ jsx2(
879
- "div",
880
- {
881
- style: {
882
- alignItems: "center",
883
- display: "flex",
884
- fontFamily: fontFamily(entry.fonts?.mono, "mono"),
885
- fontSize: 22,
886
- height: GRID_INSET,
887
- justifyContent: "flex-start",
888
- left: CONTENT_X,
889
- lineHeight: 1.2,
890
- overflow: "hidden",
891
- position: "absolute",
892
- top: GRID_BOTTOM,
893
- width: CONTENT_WIDTH
894
- },
895
- children: /* @__PURE__ */ jsxs(
896
- "div",
897
- {
898
- style: {
899
- display: "flex",
900
- flexDirection: "row",
901
- overflow: "hidden",
902
- textOverflow: "ellipsis",
903
- whiteSpace: "nowrap",
904
- width: CONTENT_WIDTH
905
- },
906
- children: [
907
- displayUrl.host ? /* @__PURE__ */ jsx2(
908
- "div",
909
- {
910
- style: {
911
- color: textSecondary,
912
- display: "flex",
913
- flexShrink: 0,
914
- whiteSpace: "nowrap"
915
- },
916
- children: displayUrl.host
917
- }
918
- ) : null,
919
- displayUrl.path ? /* @__PURE__ */ jsx2(
920
- "div",
921
- {
922
- style: {
923
- color: textPrimary,
924
- display: "flex",
925
- minWidth: 0,
926
- overflow: "hidden",
927
- textOverflow: "ellipsis",
928
- whiteSpace: "nowrap"
929
- },
930
- children: displayUrl.path
931
- }
932
- ) : null
933
- ]
934
- }
935
- )
936
- }
937
- )
938
- ]
939
- }
940
- ),
941
- {
942
- fonts: await imageResponseFonts(entry),
943
- headers: {
944
- ...CONTENT_TYPE_HEADER,
945
- ...successHeaders()
946
- },
947
- height: manifest.height,
948
- width: manifest.width
949
- }
950
- )
951
- )
952
- )
953
- );
954
- };
955
- }
956
- function createOgImageStaticParams({ manifest }) {
957
- return Object.keys(manifest.generated).map((key) => ({ key: `${key}.png` }));
958
- }
959
-
960
- // src/kernel/routes/metadata/robots.ts
961
- import { cacheLife as cacheLife3, cacheTag as cacheTag3 } from "next/cache";
962
- async function robotsTxt(manifest) {
963
- "use cache";
964
- cacheLife3("page");
965
- cacheTag3(tags.site(), tags.robots(), tags.manifest(manifest.contentHash));
966
- const sitemapUrl = canonicalUrl(manifest, "/sitemap.xml");
967
- return `User-agent: *
968
- Allow: /
969
- Sitemap: ${sitemapUrl}
970
- `;
971
- }
972
- function createRobotsTxtRoute(manifest) {
973
- return async function GET() {
974
- return createCachedTextResponse({
975
- body: await robotsTxt(manifest),
976
- contentType: "text/plain; charset=utf-8"
977
- });
978
- };
979
- }
980
-
981
- // src/kernel/routes/metadata/sitemap.ts
982
- import { cacheLife as cacheLife4, cacheTag as cacheTag4 } from "next/cache";
983
- function xmlEscape2(value) {
984
- return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
985
- }
986
- async function sitemapXml(manifest) {
987
- "use cache";
988
- cacheLife4("page");
989
- cacheTag4(tags.site(), tags.sitemap(), tags.manifest(manifest.contentHash));
990
- const urls = [
991
- "/",
992
- ...Object.values(manifest.groups).map((g) => g.path),
993
- ...manifest.pages.filter((page) => page.status === "published").map((page) => page.path)
994
- ];
995
- const uniqueUrls = [...new Set(urls)];
996
- const body = uniqueUrls.map(
997
- (url) => ` <url><loc>${xmlEscape2(canonicalUrl(manifest, url))}</loc></url>`
998
- ).join("\n");
999
- return `<?xml version="1.0" encoding="UTF-8"?>
1000
- <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
1001
- ${body}
1002
- </urlset>
1003
- `;
1004
- }
1005
- function createSitemapXmlRoute(manifest) {
1006
- return async function GET() {
1007
- return createCachedTextResponse({
1008
- body: await sitemapXml(manifest),
1009
- contentType: "application/xml; charset=utf-8"
1010
- });
1011
- };
1012
- }
1013
-
1014
- // src/resolvers/manifest-resolver.ts
1015
- function findNodeInTree(nodes, id) {
1016
- for (const node of nodes) {
1017
- if (node.type === "page") {
1018
- if (node.fileID === id) return node;
1019
- } else if (node.id === id) {
1020
- return node;
1021
- }
1022
- if (node.type === "section" || node.type === "folder") {
1023
- const found = findNodeInTree(node.children, id);
1024
- if (found) return found;
1025
- }
1026
- }
1027
- return null;
1028
- }
1029
- function pageNode(page) {
1030
- return {
1031
- type: "page",
1032
- fileID: page.fileID,
1033
- title: page.title,
1034
- path: page.path,
1035
- group: page.group,
1036
- description: page.description,
1037
- status: page.status,
1038
- publishedAt: page.publishedAt,
1039
- updatedAt: page.updatedAt,
1040
- authors: page.authors,
1041
- tags: page.tags,
1042
- meta: page.meta
1043
- };
1044
- }
1045
- function groupNode(group) {
1046
- return {
1047
- type: "section",
1048
- id: group.key,
1049
- title: group.title,
1050
- path: group.path,
1051
- group: group.key,
1052
- children: group.tree
1053
- };
1054
- }
1055
- function resolveLeaf(manifest, group, slug) {
1056
- const slugPath = Array.isArray(slug) ? slug.join("/") : slug;
1057
- const page = manifest.pages.find((p) => p.group === group && p.slug === slugPath) ?? null;
1058
- if (!page) return null;
1059
- const groupData = manifest.groups[group];
1060
- if (!groupData) return null;
1061
- return {
1062
- site: manifest.site,
1063
- tree: groupData.tree,
1064
- node: findNodeInTree(groupData.tree, page.fileID) ?? pageNode(page),
1065
- page,
1066
- currentPath: page.path,
1067
- group
1068
- };
1069
- }
1070
- function resolveGroup(manifest, group) {
1071
- const groupData = manifest.groups[group];
1072
- if (!groupData) return null;
1073
- return {
1074
- site: manifest.site,
1075
- tree: groupData.tree,
1076
- node: groupNode(groupData),
1077
- currentPath: groupData.path,
1078
- group
1079
- };
1080
- }
1081
- function resolveGroupLayout(manifest, group, children) {
1082
- const resolved = resolveGroup(manifest, group);
1083
- if (!resolved) return null;
1084
- return { ...resolved, children };
1085
- }
1086
- function listStaticParams(manifest, group) {
1087
- const groupData = manifest.groups[group];
1088
- if (!groupData) return [];
1089
- return groupData.pages.map((page) => ({ slug: page.slug.split("/") }));
1090
- }
1091
-
1092
- // src/utils/cn.ts
1093
- import { clsx } from "clsx";
1094
- import { extendTailwindMerge } from "tailwind-merge";
1095
- var twMerge = extendTailwindMerge({
1096
- extend: {
1097
- classGroups: {
1098
- z: [
1099
- "z-content",
1100
- "z-nav",
1101
- "z-overlay",
1102
- "z-modal",
1103
- "z-search",
1104
- "z-toast",
1105
- "z-progress"
1106
- ]
1107
- }
1108
- }
1109
- });
1110
- function cn(...inputs) {
1111
- return twMerge(clsx(inputs));
1112
- }
1113
-
1114
- // src/utils/heading-ids.ts
1115
- import { isValidElement } from "react";
1116
- var SELF_CLOSING_TAG_RE = new RegExp("<[^>]+/>", "g");
1117
- var PAIRED_TAG_RE = /<\/?\w[^>]*>/g;
1118
- var MDX_BOLD_RE = /\*\*(.*?)\*\*/g;
1119
- var MDX_ITALIC_RE = /\*(.*?)\*/g;
1120
- var MDX_UNDERLINE_BOLD_RE = /__(.*?)__/g;
1121
- var MDX_UNDERLINE_ITALIC_RE = /_(.*?)_/g;
1122
- var MDX_STRIKETHROUGH_RE = /~~(.*?)~~/g;
1123
- var MDX_INLINE_CODE_RE = /`(.*?)`/g;
1124
- var MDX_LINK_RE = /\[(.*?)\]\(.*?\)/g;
1125
- var NON_ALPHANUMERIC_RE = /[^a-z0-9]+/g;
1126
- var LEADING_TRAILING_HYPHEN_RE = /^-+|-+$/g;
1127
- var LEADING_DIGIT_RE = /^(\d)/;
1128
- var HEADING_RE = /^(#{1,6})[ \t]+(.+?)\s*#*\s*$/gm;
1129
- var FENCED_CODE_RE = /```[\s\S]*?```|~~~[\s\S]*?~~~/g;
1130
- function extractText(node) {
1131
- if (typeof node === "string") return node;
1132
- if (typeof node === "number") return String(node);
1133
- if (node == null || typeof node === "boolean") return "";
1134
- if (Array.isArray(node)) {
1135
- return node.map(extractText).join("");
1136
- }
1137
- if (isValidElement(node)) {
1138
- const element = node;
1139
- return element.props.children === void 0 ? "" : extractText(element.props.children);
1140
- }
1141
- return "";
1142
- }
1143
- function cleanHeadingText(input) {
1144
- const text = typeof input === "string" ? input : extractText(input);
1145
- return text.replace(SELF_CLOSING_TAG_RE, "").replace(PAIRED_TAG_RE, "").replace(MDX_BOLD_RE, "$1").replace(MDX_ITALIC_RE, "$1").replace(MDX_UNDERLINE_BOLD_RE, "$1").replace(MDX_UNDERLINE_ITALIC_RE, "$1").replace(MDX_STRIKETHROUGH_RE, "$1").replace(MDX_INLINE_CODE_RE, "$1").replace(MDX_LINK_RE, "$1").trim();
1146
- }
1147
- function slugify(text) {
1148
- return text.toLowerCase().replace(NON_ALPHANUMERIC_RE, "-").replace(LEADING_TRAILING_HYPHEN_RE, "").replace(LEADING_DIGIT_RE, "id-$1");
1149
- }
1150
- function headingToHTMLId(input) {
1151
- try {
1152
- const id = slugify(cleanHeadingText(input));
1153
- return id || "empty-heading";
1154
- } catch {
1155
- return "empty-heading";
1156
- }
1157
- }
1158
- function createHeadingIdGenerator() {
1159
- const usedIds = /* @__PURE__ */ new Map();
1160
- return (input) => {
1161
- const baseId = headingToHTMLId(input);
1162
- if (baseId === "empty-heading") return baseId;
1163
- const count = usedIds.get(baseId) ?? 0;
1164
- usedIds.set(baseId, count + 1);
1165
- return count === 0 ? baseId : `${baseId}-${count}`;
1166
- };
1167
- }
1168
- function extractMdxHeadings(content = "", levels) {
1169
- const [minDepth, maxDepth] = levels;
1170
- const headingId = createHeadingIdGenerator();
1171
- const headings = [];
1172
- const searchableContent = content.replace(FENCED_CODE_RE, "");
1173
- HEADING_RE.lastIndex = 0;
1174
- while (true) {
1175
- const match = HEADING_RE.exec(searchableContent);
1176
- if (!match) break;
1177
- const marker = match[1];
1178
- const rawText = match[2];
1179
- if (!marker || !rawText) continue;
1180
- const level = marker.length;
1181
- const text = cleanHeadingText(rawText);
1182
- const id = headingId(rawText);
1183
- if (!text || id === "empty-heading") continue;
1184
- if (level < minDepth || level > maxDepth) continue;
1185
- headings.push({ id, level, text });
1186
- }
1187
- return headings;
1188
- }
1189
- function urlIdToText(urlId) {
1190
- try {
1191
- if (typeof urlId !== "string") return "";
1192
- return urlId.replace(/^id-/, "").replace(/-/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
1193
- } catch {
1194
- return "";
1195
- }
1196
- }
1
+ // src/index.ts
2
+ import { tags } from "@publish.os/nextjs/cache/tags";
3
+ import { createNextConfig } from "@publish.os/nextjs/config/createNextConfig";
4
+ import { PageList } from "@publish.os/nextjs/kernel/components/blocks/page-list";
5
+ import {
6
+ createAtomFeedRoute,
7
+ createJsonFeedRoute,
8
+ createRssFeedRoute
9
+ } from "@publish.os/nextjs/kernel/routes/metadata/feed";
10
+ import { createLlmsTxtRoute } from "@publish.os/nextjs/kernel/routes/metadata/llms";
11
+ import {
12
+ createOgImageRoute,
13
+ createOgImageStaticParams
14
+ } from "@publish.os/nextjs/kernel/routes/metadata/og-image";
15
+ import { createRobotsTxtRoute } from "@publish.os/nextjs/kernel/routes/metadata/robots";
16
+ import { createSitemapXmlRoute } from "@publish.os/nextjs/kernel/routes/metadata/sitemap";
17
+ import {
18
+ listStaticParams,
19
+ resolveGroup,
20
+ resolveGroupLayout,
21
+ resolveLeaf
22
+ } from "@publish.os/nextjs/resolvers/manifest-resolver";
23
+ import { cn } from "@publish.os/nextjs/utils/cn";
24
+ import {
25
+ cleanHeadingText,
26
+ createHeadingIdGenerator,
27
+ extractMdxHeadings,
28
+ headingToHTMLId,
29
+ urlIdToText
30
+ } from "@publish.os/nextjs/utils/heading-ids";
1197
31
  export {
1198
32
  PageList,
1199
33
  cleanHeadingText,