@kamod-ch/preactpress 1.0.0 → 1.0.3

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 (526) hide show
  1. package/README.md +87 -49
  2. package/bin/preactpress.mjs +5 -5
  3. package/dist/client/app.d.ts +1 -1
  4. package/dist/client/app.d.ts.map +1 -1
  5. package/dist/client/app.js +55 -42
  6. package/dist/client/app.js.map +1 -1
  7. package/dist/client/entry-client.js +11 -12
  8. package/dist/client/entry-client.js.map +1 -1
  9. package/dist/client/entry-ssr.d.ts +2 -2
  10. package/dist/client/entry-ssr.d.ts.map +1 -1
  11. package/dist/client/entry-ssr.js +16 -16
  12. package/dist/client/entry-ssr.js.map +1 -1
  13. package/dist/client/index.d.ts +3 -2
  14. package/dist/client/index.d.ts.map +1 -1
  15. package/dist/client/index.js +2 -1
  16. package/dist/client/index.js.map +1 -1
  17. package/dist/client/loadPage.d.ts +2 -1
  18. package/dist/client/loadPage.d.ts.map +1 -1
  19. package/dist/client/loadPage.js +15 -12
  20. package/dist/client/loadPage.js.map +1 -1
  21. package/dist/client/prefetchLinks.js +4 -4
  22. package/dist/client/prefetchLinks.js.map +1 -1
  23. package/dist/client/theme-default/AlgoliaSearch.d.ts +3 -3
  24. package/dist/client/theme-default/AlgoliaSearch.d.ts.map +1 -1
  25. package/dist/client/theme-default/AlgoliaSearch.js +15 -15
  26. package/dist/client/theme-default/AlgoliaSearch.js.map +1 -1
  27. package/dist/client/theme-default/Features.d.ts +2 -2
  28. package/dist/client/theme-default/Features.d.ts.map +1 -1
  29. package/dist/client/theme-default/Features.js +10 -8
  30. package/dist/client/theme-default/Features.js.map +1 -1
  31. package/dist/client/theme-default/Hero.d.ts +2 -2
  32. package/dist/client/theme-default/Hero.d.ts.map +1 -1
  33. package/dist/client/theme-default/Hero.js +9 -7
  34. package/dist/client/theme-default/Hero.js.map +1 -1
  35. package/dist/client/theme-default/Layout.d.ts +3 -3
  36. package/dist/client/theme-default/Layout.d.ts.map +1 -1
  37. package/dist/client/theme-default/Layout.js +56 -99
  38. package/dist/client/theme-default/Layout.js.map +1 -1
  39. package/dist/client/theme-default/Logo.d.ts +2 -2
  40. package/dist/client/theme-default/Logo.d.ts.map +1 -1
  41. package/dist/client/theme-default/Logo.js +8 -8
  42. package/dist/client/theme-default/Logo.js.map +1 -1
  43. package/dist/client/theme-default/NavLinks.d.ts +2 -2
  44. package/dist/client/theme-default/NavLinks.d.ts.map +1 -1
  45. package/dist/client/theme-default/NavLinks.js +3 -3
  46. package/dist/client/theme-default/NavLinks.js.map +1 -1
  47. package/dist/client/theme-default/SidebarNav.d.ts +2 -2
  48. package/dist/client/theme-default/SidebarNav.d.ts.map +1 -1
  49. package/dist/client/theme-default/SidebarNav.js +3 -3
  50. package/dist/client/theme-default/SidebarNav.js.map +1 -1
  51. package/dist/client/theme-default/SocialLinks.d.ts +2 -2
  52. package/dist/client/theme-default/SocialLinks.d.ts.map +1 -1
  53. package/dist/client/theme-default/SocialLinks.js +1 -1
  54. package/dist/client/theme-default/SocialLinks.js.map +1 -1
  55. package/dist/client/theme-default/ThemeToggle.d.ts +2 -3
  56. package/dist/client/theme-default/ThemeToggle.d.ts.map +1 -1
  57. package/dist/client/theme-default/ThemeToggle.js +2 -30
  58. package/dist/client/theme-default/ThemeToggle.js.map +1 -1
  59. package/dist/client/theme-default/index.d.ts +1 -1
  60. package/dist/client/theme-default/index.d.ts.map +1 -1
  61. package/dist/client/theme-default/index.js +1 -1
  62. package/dist/client/theme-default/index.js.map +1 -1
  63. package/dist/client/theme-utils.d.ts +24 -0
  64. package/dist/client/theme-utils.d.ts.map +1 -0
  65. package/dist/client/theme-utils.js +107 -0
  66. package/dist/client/theme-utils.js.map +1 -0
  67. package/dist/client/types.d.ts +5 -5
  68. package/dist/client/types.d.ts.map +1 -1
  69. package/dist/client/usePageHead.d.ts +2 -2
  70. package/dist/client/usePageHead.d.ts.map +1 -1
  71. package/dist/client/usePageHead.js +61 -56
  72. package/dist/client/usePageHead.js.map +1 -1
  73. package/dist/client/useSiteSearch.d.ts.map +1 -1
  74. package/dist/client/useSiteSearch.js +8 -8
  75. package/dist/client/useSiteSearch.js.map +1 -1
  76. package/dist/node/build.d.ts +1 -1
  77. package/dist/node/build.d.ts.map +1 -1
  78. package/dist/node/build.js +105 -96
  79. package/dist/node/build.js.map +1 -1
  80. package/dist/node/buildCache.d.ts.map +1 -1
  81. package/dist/node/buildCache.js +7 -7
  82. package/dist/node/buildCache.js.map +1 -1
  83. package/dist/node/check.d.ts +1 -1
  84. package/dist/node/check.d.ts.map +1 -1
  85. package/dist/node/check.js +52 -52
  86. package/dist/node/check.js.map +1 -1
  87. package/dist/node/cli.js +61 -64
  88. package/dist/node/cli.js.map +1 -1
  89. package/dist/node/config-helpers.d.ts +4 -4
  90. package/dist/node/config-helpers.d.ts.map +1 -1
  91. package/dist/node/config-helpers.js +1 -1
  92. package/dist/node/config-helpers.js.map +1 -1
  93. package/dist/node/config.d.ts +4 -4
  94. package/dist/node/config.d.ts.map +1 -1
  95. package/dist/node/config.js +37 -40
  96. package/dist/node/config.js.map +1 -1
  97. package/dist/node/content.d.ts +4 -4
  98. package/dist/node/content.d.ts.map +1 -1
  99. package/dist/node/content.js +28 -28
  100. package/dist/node/content.js.map +1 -1
  101. package/dist/node/createContentLoader.d.ts +1 -1
  102. package/dist/node/createContentLoader.d.ts.map +1 -1
  103. package/dist/node/createContentLoader.js +3 -3
  104. package/dist/node/createContentLoader.js.map +1 -1
  105. package/dist/node/devCss.d.ts +1 -1
  106. package/dist/node/devCss.d.ts.map +1 -1
  107. package/dist/node/devCss.js +5 -6
  108. package/dist/node/devCss.js.map +1 -1
  109. package/dist/node/devSsr.d.ts +3 -3
  110. package/dist/node/devSsr.d.ts.map +1 -1
  111. package/dist/node/devSsr.js +32 -32
  112. package/dist/node/devSsr.js.map +1 -1
  113. package/dist/node/dynamicRoutes.d.ts +2 -2
  114. package/dist/node/dynamicRoutes.d.ts.map +1 -1
  115. package/dist/node/dynamicRoutes.js +24 -24
  116. package/dist/node/dynamicRoutes.js.map +1 -1
  117. package/dist/node/favicon.d.ts +2 -2
  118. package/dist/node/favicon.d.ts.map +1 -1
  119. package/dist/node/favicon.js +26 -24
  120. package/dist/node/favicon.js.map +1 -1
  121. package/dist/node/feed.d.ts +2 -2
  122. package/dist/node/feed.d.ts.map +1 -1
  123. package/dist/node/feed.js +18 -16
  124. package/dist/node/feed.js.map +1 -1
  125. package/dist/node/hooks.d.ts +2 -2
  126. package/dist/node/hooks.d.ts.map +1 -1
  127. package/dist/node/hooks.js +1 -1
  128. package/dist/node/hooks.js.map +1 -1
  129. package/dist/node/html.d.ts +8 -8
  130. package/dist/node/html.d.ts.map +1 -1
  131. package/dist/node/html.js +75 -64
  132. package/dist/node/html.js.map +1 -1
  133. package/dist/node/index.d.ts +11 -11
  134. package/dist/node/index.d.ts.map +1 -1
  135. package/dist/node/index.js +8 -8
  136. package/dist/node/index.js.map +1 -1
  137. package/dist/node/init.d.ts +2 -0
  138. package/dist/node/init.d.ts.map +1 -1
  139. package/dist/node/init.js +59 -27
  140. package/dist/node/init.js.map +1 -1
  141. package/dist/node/lastUpdated.d.ts +2 -2
  142. package/dist/node/lastUpdated.d.ts.map +1 -1
  143. package/dist/node/lastUpdated.js +7 -4
  144. package/dist/node/lastUpdated.js.map +1 -1
  145. package/dist/node/loadSiteModule.js +2 -2
  146. package/dist/node/loadSiteModule.js.map +1 -1
  147. package/dist/node/markdown.d.ts +2 -2
  148. package/dist/node/markdown.d.ts.map +1 -1
  149. package/dist/node/markdown.js +110 -110
  150. package/dist/node/markdown.js.map +1 -1
  151. package/dist/node/markdownHeadings.d.ts +1 -1
  152. package/dist/node/markdownHeadings.d.ts.map +1 -1
  153. package/dist/node/markdownHeadings.js +11 -11
  154. package/dist/node/markdownHeadings.js.map +1 -1
  155. package/dist/node/markdownInclude.d.ts.map +1 -1
  156. package/dist/node/markdownInclude.js +11 -11
  157. package/dist/node/markdownInclude.js.map +1 -1
  158. package/dist/node/markdownSnippets.d.ts.map +1 -1
  159. package/dist/node/markdownSnippets.js +34 -34
  160. package/dist/node/markdownSnippets.js.map +1 -1
  161. package/dist/node/mdx.d.ts +1 -1
  162. package/dist/node/mdx.d.ts.map +1 -1
  163. package/dist/node/mdx.js +4 -4
  164. package/dist/node/mdx.js.map +1 -1
  165. package/dist/node/packageRoot.d.ts.map +1 -1
  166. package/dist/node/packageRoot.js +4 -4
  167. package/dist/node/packageRoot.js.map +1 -1
  168. package/dist/node/pageDataLoaders.d.ts +2 -2
  169. package/dist/node/pageDataLoaders.d.ts.map +1 -1
  170. package/dist/node/pageDataLoaders.js +24 -20
  171. package/dist/node/pageDataLoaders.js.map +1 -1
  172. package/dist/node/paths.d.ts.map +1 -1
  173. package/dist/node/paths.js +4 -4
  174. package/dist/node/paths.js.map +1 -1
  175. package/dist/node/plugin.d.ts +3 -3
  176. package/dist/node/plugin.d.ts.map +1 -1
  177. package/dist/node/plugin.js +66 -66
  178. package/dist/node/plugin.js.map +1 -1
  179. package/dist/node/resolveDeps.js +10 -10
  180. package/dist/node/resolveDeps.js.map +1 -1
  181. package/dist/node/serve.d.ts.map +1 -1
  182. package/dist/node/serve.js +13 -15
  183. package/dist/node/serve.js.map +1 -1
  184. package/dist/node/server.d.ts +3 -3
  185. package/dist/node/server.d.ts.map +1 -1
  186. package/dist/node/server.js +28 -25
  187. package/dist/node/server.js.map +1 -1
  188. package/dist/node/siteConfig.d.ts +12 -12
  189. package/dist/node/siteConfig.d.ts.map +1 -1
  190. package/dist/node/tagIndex.d.ts +5 -5
  191. package/dist/node/tagIndex.d.ts.map +1 -1
  192. package/dist/node/tagIndex.js +10 -10
  193. package/dist/node/tagIndex.js.map +1 -1
  194. package/dist/shared/contentChunk.d.ts.map +1 -1
  195. package/dist/shared/contentChunk.js +6 -6
  196. package/dist/shared/contentChunk.js.map +1 -1
  197. package/dist/shared/contentSchema.d.ts.map +1 -1
  198. package/dist/shared/contentSchema.js +11 -11
  199. package/dist/shared/contentSchema.js.map +1 -1
  200. package/dist/shared/deadLinks.d.ts.map +1 -1
  201. package/dist/shared/deadLinks.js +6 -6
  202. package/dist/shared/deadLinks.js.map +1 -1
  203. package/dist/shared/escapeHtml.js +4 -4
  204. package/dist/shared/escapeHtml.js.map +1 -1
  205. package/dist/shared/index.d.ts +14 -14
  206. package/dist/shared/index.d.ts.map +1 -1
  207. package/dist/shared/index.js +14 -14
  208. package/dist/shared/index.js.map +1 -1
  209. package/dist/shared/locale.d.ts +1 -1
  210. package/dist/shared/locale.d.ts.map +1 -1
  211. package/dist/shared/locale.js +10 -10
  212. package/dist/shared/locale.js.map +1 -1
  213. package/dist/shared/pageChrome.d.ts +4 -4
  214. package/dist/shared/pageChrome.d.ts.map +1 -1
  215. package/dist/shared/pageChrome.js +21 -21
  216. package/dist/shared/pageChrome.js.map +1 -1
  217. package/dist/shared/pageHead.d.ts +1 -1
  218. package/dist/shared/pageHead.d.ts.map +1 -1
  219. package/dist/shared/pageHead.js +4 -4
  220. package/dist/shared/pageHead.js.map +1 -1
  221. package/dist/shared/pageMeta.d.ts +5 -5
  222. package/dist/shared/pageMeta.d.ts.map +1 -1
  223. package/dist/shared/pageMeta.js +15 -17
  224. package/dist/shared/pageMeta.js.map +1 -1
  225. package/dist/shared/rewrites.d.ts +1 -1
  226. package/dist/shared/rewrites.d.ts.map +1 -1
  227. package/dist/shared/rewrites.js +2 -2
  228. package/dist/shared/rewrites.js.map +1 -1
  229. package/dist/shared/route.js +5 -5
  230. package/dist/shared/route.js.map +1 -1
  231. package/dist/shared/scrollRestoration.d.ts +10 -0
  232. package/dist/shared/scrollRestoration.d.ts.map +1 -0
  233. package/dist/shared/scrollRestoration.js +66 -0
  234. package/dist/shared/scrollRestoration.js.map +1 -0
  235. package/dist/shared/search.d.ts +3 -3
  236. package/dist/shared/search.d.ts.map +1 -1
  237. package/dist/shared/search.js +18 -15
  238. package/dist/shared/search.js.map +1 -1
  239. package/dist/shared/sidebar.d.ts +1 -1
  240. package/dist/shared/sidebar.d.ts.map +1 -1
  241. package/dist/shared/sidebar.js +4 -4
  242. package/dist/shared/sidebar.js.map +1 -1
  243. package/dist/shared/slug.d.ts +1 -1
  244. package/dist/shared/slug.d.ts.map +1 -1
  245. package/dist/shared/slug.js +5 -5
  246. package/dist/shared/slug.js.map +1 -1
  247. package/dist/shared/socialIcons.d.ts.map +1 -1
  248. package/dist/shared/socialIcons.js +4 -4
  249. package/dist/shared/socialIcons.js.map +1 -1
  250. package/dist/shared/tags.js +8 -8
  251. package/dist/shared/tags.js.map +1 -1
  252. package/dist/shared/theme.d.ts +1 -1
  253. package/dist/shared/theme.d.ts.map +1 -1
  254. package/dist/shared/theme.js +16 -10
  255. package/dist/shared/theme.js.map +1 -1
  256. package/dist/shared/themeLabels.d.ts +1 -1
  257. package/dist/shared/themeLabels.d.ts.map +1 -1
  258. package/dist/shared/themeLabels.js +26 -26
  259. package/dist/shared/themeLabels.js.map +1 -1
  260. package/dist/shared/url.d.ts.map +1 -1
  261. package/dist/shared/url.js +3 -3
  262. package/dist/shared/url.js.map +1 -1
  263. package/package.json +33 -9
  264. package/src/client/app.tsx +111 -92
  265. package/src/client/entry-client.tsx +17 -19
  266. package/src/client/entry-ssr.tsx +33 -33
  267. package/src/client/index.ts +16 -2
  268. package/src/client/loadPage.ts +41 -38
  269. package/src/client/prefetchLinks.ts +30 -30
  270. package/src/client/theme-default/AlgoliaSearch.tsx +46 -46
  271. package/src/client/theme-default/Features.tsx +27 -21
  272. package/src/client/theme-default/Hero.tsx +22 -18
  273. package/src/client/theme-default/Layout.tsx +189 -244
  274. package/src/client/theme-default/Logo.tsx +30 -40
  275. package/src/client/theme-default/NavLinks.tsx +21 -21
  276. package/src/client/theme-default/SidebarNav.tsx +29 -29
  277. package/src/client/theme-default/SocialLinks.tsx +11 -11
  278. package/src/client/theme-default/ThemeToggle.tsx +2 -78
  279. package/src/client/theme-default/index.ts +1 -1
  280. package/src/client/theme-default/styles.css +30 -21
  281. package/src/client/theme-utils.tsx +184 -0
  282. package/src/client/types.ts +30 -24
  283. package/src/client/usePageHead.ts +128 -128
  284. package/src/client/useSiteSearch.ts +34 -34
  285. package/src/client/virtual.d.ts +76 -76
  286. package/src/shared/contentChunk.ts +6 -6
  287. package/src/shared/contentSchema.ts +52 -49
  288. package/src/shared/deadLinks.ts +16 -16
  289. package/src/shared/escapeHtml.ts +5 -5
  290. package/src/shared/index.ts +21 -25
  291. package/src/shared/locale.ts +46 -46
  292. package/src/shared/pageChrome.ts +123 -123
  293. package/src/shared/pageHead.ts +16 -16
  294. package/src/shared/pageMeta.ts +79 -79
  295. package/src/shared/rewrites.ts +14 -16
  296. package/src/shared/route.ts +7 -7
  297. package/src/shared/scrollRestoration.ts +70 -0
  298. package/src/shared/search.ts +56 -52
  299. package/src/shared/sidebar.ts +28 -28
  300. package/src/shared/slug.ts +13 -13
  301. package/src/shared/socialIcons.ts +12 -14
  302. package/src/shared/tags.ts +20 -20
  303. package/src/shared/theme.ts +22 -13
  304. package/src/shared/themeLabels.ts +45 -45
  305. package/src/shared/url.ts +6 -10
  306. package/templates/default/.preactpress/config.ts +17 -17
  307. package/templates/default/README.md +16 -16
  308. package/templates/default/guide/first-five-minutes.md +21 -21
  309. package/templates/default/index.html +1 -1
  310. package/templates/default/index.md +9 -9
  311. package/templates/default/package.json +1 -1
  312. package/templates/default/pnpm-lock.yaml +5 -5
  313. package/templates/docs/.preactpress/config.ts +76 -56
  314. package/templates/docs/README.md +6 -6
  315. package/templates/docs/components/BenefitsGrid.tsx +45 -0
  316. package/templates/docs/components/CliBlock.tsx +38 -0
  317. package/templates/docs/components/ComparisonTable.tsx +60 -0
  318. package/templates/docs/components/CopyableCommand.tsx +86 -0
  319. package/templates/docs/components/Counter.tsx +7 -5
  320. package/templates/docs/components/MarketingHero.tsx +63 -0
  321. package/templates/docs/components/MdxDemo.tsx +96 -0
  322. package/templates/docs/components/References.tsx +62 -0
  323. package/templates/docs/components/TemplateGallery.tsx +46 -0
  324. package/templates/docs/components/marketing.css +992 -0
  325. package/templates/docs/examples/algolia-docsearch.md +33 -0
  326. package/templates/docs/examples/content-loader.data.ts +11 -0
  327. package/templates/docs/examples/content-loader.md +29 -0
  328. package/templates/docs/examples/dynamic-routes.md +16 -0
  329. package/templates/docs/examples/static-assets.md +13 -0
  330. package/templates/docs/guide/advanced.md +4 -4
  331. package/templates/docs/guide/commands.md +10 -10
  332. package/templates/docs/guide/configuration.md +43 -43
  333. package/templates/docs/guide/creating-pages.md +60 -39
  334. package/templates/docs/guide/custom-themes.md +9 -9
  335. package/templates/docs/guide/deploy.md +29 -29
  336. package/templates/docs/guide/first-five-minutes.md +22 -22
  337. package/templates/docs/guide/getting-started.md +29 -31
  338. package/templates/docs/guide/markdown-and-mdx.md +1 -1
  339. package/templates/docs/guide/routing.md +40 -40
  340. package/templates/docs/guide/what-is-preactpress.md +18 -18
  341. package/templates/docs/index.html +1 -1
  342. package/templates/docs/index.mdx +25 -0
  343. package/templates/docs/interactive.mdx +1 -1
  344. package/templates/docs/markdown-examples.md +73 -21
  345. package/templates/docs/package.json +1 -1
  346. package/templates/docs/packages/[pkg].md +15 -0
  347. package/templates/docs/packages/[pkg].paths.ts +20 -0
  348. package/templates/docs/parts/include-body.md +1 -0
  349. package/templates/docs/pnpm-lock.yaml +5 -5
  350. package/templates/docs/public/preactpress-example.txt +1 -0
  351. package/templates/docs/snippets/greet.ts +1 -1
  352. package/templates/hono/.preactpress/config.ts +65 -65
  353. package/templates/hono/.preactpress/theme/CodeSnippet.tsx +15 -15
  354. package/templates/hono/.preactpress/theme/FeatureGrid.tsx +7 -7
  355. package/templates/hono/.preactpress/theme/Hero.tsx +13 -13
  356. package/templates/hono/.preactpress/theme/Layout.tsx +122 -164
  357. package/templates/hono/.preactpress/theme/Logo.tsx +6 -6
  358. package/templates/hono/.preactpress/theme/ThemeToggle.tsx +3 -70
  359. package/templates/hono/.preactpress/theme/hono.css +31 -14
  360. package/templates/hono/README.md +17 -15
  361. package/templates/hono/components/Counter.tsx +7 -5
  362. package/templates/hono/de/guide/configuration.md +18 -20
  363. package/templates/hono/de/guide/deploy.md +29 -29
  364. package/templates/hono/de/guide/first-five-minutes.md +21 -21
  365. package/templates/hono/de/guide/getting-started.md +29 -29
  366. package/templates/hono/de/guide/routing.md +26 -25
  367. package/templates/hono/de/guide/seiten-erstellen.md +39 -39
  368. package/templates/hono/de/guide/what-is-preactpress.md +18 -18
  369. package/templates/hono/de/index.mdx +20 -17
  370. package/templates/hono/de/interactive.mdx +1 -1
  371. package/templates/hono/de/markdown-examples.md +6 -6
  372. package/templates/hono/de/parts/include-body.md +1 -0
  373. package/templates/hono/de/snippets/greet.ts +1 -1
  374. package/templates/hono/guide/configuration.md +25 -25
  375. package/templates/hono/guide/creating-pages.md +39 -39
  376. package/templates/hono/guide/deploy.md +29 -29
  377. package/templates/hono/guide/first-five-minutes.md +21 -21
  378. package/templates/hono/guide/getting-started.md +29 -29
  379. package/templates/hono/guide/routing.md +40 -40
  380. package/templates/hono/guide/what-is-preactpress.md +18 -18
  381. package/templates/hono/index.html +1 -1
  382. package/templates/hono/index.mdx +21 -17
  383. package/templates/hono/interactive.mdx +1 -1
  384. package/templates/hono/markdown-examples.md +6 -6
  385. package/templates/hono/package.json +1 -1
  386. package/templates/hono/parts/include-body.md +1 -0
  387. package/templates/hono/pnpm-lock.yaml +5 -5
  388. package/templates/hono/snippets/greet.ts +1 -1
  389. package/templates/magazine/.preactpress/config.ts +19 -19
  390. package/templates/magazine/.preactpress/theme/Layout.tsx +69 -172
  391. package/templates/magazine/.preactpress/theme/TeaserGrid.tsx +14 -14
  392. package/templates/magazine/.preactpress/theme/ThemeToggle.tsx +4 -70
  393. package/templates/magazine/.preactpress/theme/magazine.css +13 -8
  394. package/templates/magazine/README.md +30 -0
  395. package/templates/magazine/article-markets.md +2 -2
  396. package/templates/magazine/article-tech.mdx +10 -10
  397. package/templates/magazine/index.data.ts +9 -9
  398. package/templates/magazine/index.html +5 -1
  399. package/templates/magazine/index.mdx +1 -1
  400. package/templates/magazine/package.json +1 -1
  401. package/templates/magazine/pnpm-lock.yaml +2917 -0
  402. package/templates/docs/about.md +0 -10
  403. package/templates/docs/dist/404.html +0 -29
  404. package/templates/docs/dist/about/index.html +0 -32
  405. package/templates/docs/dist/assets/esm-DzlBxN5p.js +0 -110
  406. package/templates/docs/dist/assets/interactive-64o6YwrR.js +0 -9
  407. package/templates/docs/dist/assets/interactive-BedCloEw.js +0 -9
  408. package/templates/docs/dist/assets/main-BVLeh8GO.js +0 -1
  409. package/templates/docs/dist/assets/main-CreUBb3N.js +0 -1
  410. package/templates/docs/dist/assets/main-oodK-zZy.css +0 -2
  411. package/templates/docs/dist/de/guide/getting-started/index.html +0 -36
  412. package/templates/docs/dist/de/guide/what-is-preactpress/index.html +0 -38
  413. package/templates/docs/dist/de/index.html +0 -29
  414. package/templates/docs/dist/favicon-32.png +0 -0
  415. package/templates/docs/dist/favicon.png +0 -0
  416. package/templates/docs/dist/favicon.svg +0 -28
  417. package/templates/docs/dist/guide/advanced/index.html +0 -53
  418. package/templates/docs/dist/guide/commands/index.html +0 -89
  419. package/templates/docs/dist/guide/configuration/index.html +0 -196
  420. package/templates/docs/dist/guide/creating-pages/index.html +0 -234
  421. package/templates/docs/dist/guide/custom-themes/index.html +0 -52
  422. package/templates/docs/dist/guide/default-theme/index.html +0 -53
  423. package/templates/docs/dist/guide/deploy/index.html +0 -195
  424. package/templates/docs/dist/guide/first-five-minutes/index.html +0 -99
  425. package/templates/docs/dist/guide/getting-started/index.html +0 -173
  426. package/templates/docs/dist/guide/markdown-and-mdx/index.html +0 -59
  427. package/templates/docs/dist/guide/routing/index.html +0 -192
  428. package/templates/docs/dist/guide/what-is-preactpress/index.html +0 -141
  429. package/templates/docs/dist/index.html +0 -30
  430. package/templates/docs/dist/interactive/index.html +0 -37
  431. package/templates/docs/dist/markdown-examples/index.html +0 -231
  432. package/templates/docs/dist/preactpress-content/404.json +0 -8
  433. package/templates/docs/dist/preactpress-content/_index.json +0 -50
  434. package/templates/docs/dist/preactpress-content/about.json +0 -15
  435. package/templates/docs/dist/preactpress-content/de.json +0 -45
  436. package/templates/docs/dist/preactpress-content/de__guide__getting-started.json +0 -26
  437. package/templates/docs/dist/preactpress-content/de__guide__what-is-preactpress.json +0 -21
  438. package/templates/docs/dist/preactpress-content/guide__advanced.json +0 -46
  439. package/templates/docs/dist/preactpress-content/guide__commands.json +0 -26
  440. package/templates/docs/dist/preactpress-content/guide__configuration.json +0 -51
  441. package/templates/docs/dist/preactpress-content/guide__creating-pages.json +0 -71
  442. package/templates/docs/dist/preactpress-content/guide__custom-themes.json +0 -15
  443. package/templates/docs/dist/preactpress-content/guide__default-theme.json +0 -36
  444. package/templates/docs/dist/preactpress-content/guide__deploy.json +0 -56
  445. package/templates/docs/dist/preactpress-content/guide__first-five-minutes.json +0 -36
  446. package/templates/docs/dist/preactpress-content/guide__getting-started.json +0 -51
  447. package/templates/docs/dist/preactpress-content/guide__markdown-and-mdx.json +0 -31
  448. package/templates/docs/dist/preactpress-content/guide__routing.json +0 -71
  449. package/templates/docs/dist/preactpress-content/guide__what-is-preactpress.json +0 -51
  450. package/templates/docs/dist/preactpress-content/markdown-examples.json +0 -71
  451. package/templates/docs/dist/preactpress-content/tags__markdown.json +0 -16
  452. package/templates/docs/dist/preactpress-search.json +0 -166
  453. package/templates/docs/dist/preactpress-theme.js +0 -1
  454. package/templates/docs/dist/tags/markdown/index.html +0 -32
  455. package/templates/docs/index.md +0 -28
  456. package/templates/hono/dist/404.html +0 -29
  457. package/templates/hono/dist/README/index.html +0 -104
  458. package/templates/hono/dist/about/index.html +0 -32
  459. package/templates/hono/dist/assets/Counter-CCEByS-J.js +0 -1
  460. package/templates/hono/dist/assets/Hero--o6WMNvm.js +0 -2
  461. package/templates/hono/dist/assets/de-D5r6Ye70.js +0 -10
  462. package/templates/hono/dist/assets/hono-BXWYYdyv.js +0 -10
  463. package/templates/hono/dist/assets/interactive-Bxo-WBpC.js +0 -9
  464. package/templates/hono/dist/assets/interactive-BznI4IQ3.js +0 -9
  465. package/templates/hono/dist/assets/main-Bqi-VFEk.js +0 -2
  466. package/templates/hono/dist/assets/main-DIIN7FO0.css +0 -1
  467. package/templates/hono/dist/de/about/index.html +0 -32
  468. package/templates/hono/dist/de/guide/commands/index.html +0 -41
  469. package/templates/hono/dist/de/guide/configuration/index.html +0 -105
  470. package/templates/hono/dist/de/guide/deploy/index.html +0 -195
  471. package/templates/hono/dist/de/guide/first-five-minutes/index.html +0 -99
  472. package/templates/hono/dist/de/guide/getting-started/index.html +0 -173
  473. package/templates/hono/dist/de/guide/routing/index.html +0 -165
  474. package/templates/hono/dist/de/guide/seiten-erstellen/index.html +0 -234
  475. package/templates/hono/dist/de/guide/what-is-preactpress/index.html +0 -141
  476. package/templates/hono/dist/de/index.html +0 -30
  477. package/templates/hono/dist/de/interactive/index.html +0 -37
  478. package/templates/hono/dist/de/markdown-examples/index.html +0 -97
  479. package/templates/hono/dist/de/parts/include-body/index.html +0 -36
  480. package/templates/hono/dist/de/tags/markdown/index.html +0 -32
  481. package/templates/hono/dist/favicon-32.png +0 -0
  482. package/templates/hono/dist/favicon.png +0 -0
  483. package/templates/hono/dist/favicon.svg +0 -28
  484. package/templates/hono/dist/guide/commands/index.html +0 -41
  485. package/templates/hono/dist/guide/configuration/index.html +0 -158
  486. package/templates/hono/dist/guide/creating-pages/index.html +0 -234
  487. package/templates/hono/dist/guide/deploy/index.html +0 -195
  488. package/templates/hono/dist/guide/first-five-minutes/index.html +0 -99
  489. package/templates/hono/dist/guide/getting-started/index.html +0 -173
  490. package/templates/hono/dist/guide/routing/index.html +0 -165
  491. package/templates/hono/dist/guide/what-is-preactpress/index.html +0 -141
  492. package/templates/hono/dist/index.html +0 -30
  493. package/templates/hono/dist/interactive/index.html +0 -37
  494. package/templates/hono/dist/markdown-examples/index.html +0 -105
  495. package/templates/hono/dist/partials/shared-note/index.html +0 -30
  496. package/templates/hono/dist/parts/include-body/index.html +0 -36
  497. package/templates/hono/dist/preactpress-content/404.json +0 -8
  498. package/templates/hono/dist/preactpress-content/README.json +0 -26
  499. package/templates/hono/dist/preactpress-content/about.json +0 -15
  500. package/templates/hono/dist/preactpress-content/de__about.json +0 -15
  501. package/templates/hono/dist/preactpress-content/de__guide__commands.json +0 -36
  502. package/templates/hono/dist/preactpress-content/de__guide__configuration.json +0 -41
  503. package/templates/hono/dist/preactpress-content/de__guide__deploy.json +0 -56
  504. package/templates/hono/dist/preactpress-content/de__guide__first-five-minutes.json +0 -36
  505. package/templates/hono/dist/preactpress-content/de__guide__getting-started.json +0 -51
  506. package/templates/hono/dist/preactpress-content/de__guide__routing.json +0 -61
  507. package/templates/hono/dist/preactpress-content/de__guide__seiten-erstellen.json +0 -71
  508. package/templates/hono/dist/preactpress-content/de__guide__what-is-preactpress.json +0 -51
  509. package/templates/hono/dist/preactpress-content/de__markdown-examples.json +0 -131
  510. package/templates/hono/dist/preactpress-content/de__parts__include-body.json +0 -16
  511. package/templates/hono/dist/preactpress-content/de__tags__markdown.json +0 -16
  512. package/templates/hono/dist/preactpress-content/guide__commands.json +0 -36
  513. package/templates/hono/dist/preactpress-content/guide__configuration.json +0 -51
  514. package/templates/hono/dist/preactpress-content/guide__creating-pages.json +0 -71
  515. package/templates/hono/dist/preactpress-content/guide__deploy.json +0 -56
  516. package/templates/hono/dist/preactpress-content/guide__first-five-minutes.json +0 -36
  517. package/templates/hono/dist/preactpress-content/guide__getting-started.json +0 -51
  518. package/templates/hono/dist/preactpress-content/guide__routing.json +0 -61
  519. package/templates/hono/dist/preactpress-content/guide__what-is-preactpress.json +0 -51
  520. package/templates/hono/dist/preactpress-content/markdown-examples.json +0 -141
  521. package/templates/hono/dist/preactpress-content/partials__shared-note.json +0 -10
  522. package/templates/hono/dist/preactpress-content/parts__include-body.json +0 -16
  523. package/templates/hono/dist/preactpress-content/tags__markdown.json +0 -16
  524. package/templates/hono/dist/preactpress-search.json +0 -242
  525. package/templates/hono/dist/preactpress-theme.js +0 -1
  526. package/templates/hono/dist/tags/markdown/index.html +0 -32
@@ -1,136 +1,136 @@
1
- import type { Feature, Hero, PageAside, PageOutlineConfig } from './pageChrome.js'
1
+ import type { Feature, Hero, PageAside, PageOutlineConfig } from "./pageChrome.js";
2
2
 
3
- export const META_DESCRIPTION_MAX = 155
4
- export const PAGE_LAYOUTS = ['doc', 'home', 'page'] as const
5
- export type PageLayout = (typeof PAGE_LAYOUTS)[number]
3
+ export const META_DESCRIPTION_MAX = 155;
4
+ export const PAGE_LAYOUTS = ["doc", "home", "page"] as const;
5
+ export type PageLayout = (typeof PAGE_LAYOUTS)[number];
6
6
 
7
- export const DEFAULT_TITLE_TEMPLATE = ':title | :siteTitle'
7
+ export const DEFAULT_TITLE_TEMPLATE = ":title | :siteTitle";
8
8
 
9
9
  /** Frontmatter and page metadata fields supported by PreactPress pages. */
10
10
  export interface PageMetaInput {
11
- meta?: Record<string, unknown>
12
- title?: string
13
- titleTemplate?: string | false
14
- description?: string
15
- tags?: string[]
16
- image?: string
17
- pageType?: 'website' | 'article'
18
- layout?: PageLayout
19
- navbar?: boolean
20
- sidebar?: boolean
21
- aside?: PageAside
22
- outline?: PageOutlineConfig
23
- footer?: boolean
24
- editLink?: boolean
25
- lastUpdated?: boolean
26
- pageClass?: string
27
- isHome?: boolean
28
- markdownStyles?: boolean
29
- hero?: Hero
30
- features?: Feature[]
31
- kind?: 'markdown' | 'mdx'
32
- html?: string
11
+ meta?: Record<string, unknown>;
12
+ title?: string;
13
+ titleTemplate?: string | false;
14
+ description?: string;
15
+ tags?: string[];
16
+ image?: string;
17
+ pageType?: "website" | "article";
18
+ layout?: PageLayout;
19
+ navbar?: boolean;
20
+ sidebar?: boolean;
21
+ aside?: PageAside;
22
+ outline?: PageOutlineConfig;
23
+ footer?: boolean;
24
+ editLink?: boolean;
25
+ lastUpdated?: boolean;
26
+ pageClass?: string;
27
+ isHome?: boolean;
28
+ markdownStyles?: boolean;
29
+ hero?: Hero;
30
+ features?: Feature[];
31
+ kind?: "markdown" | "mdx";
32
+ html?: string;
33
33
  }
34
34
 
35
35
  /** Alias for {@link PageMetaInput} — use in themes, hooks, and custom frontmatter helpers. */
36
- export type PageFrontmatter = PageMetaInput
36
+ export type PageFrontmatter = PageMetaInput;
37
37
 
38
38
  export interface SiteMetaInput {
39
- title: string
40
- description: string
41
- titleTemplate?: string | false
39
+ title: string;
40
+ description: string;
41
+ titleTemplate?: string | false;
42
42
  }
43
43
 
44
44
  export function formatTitleTemplate(
45
45
  template: string | false | undefined,
46
- params: { title?: string; siteTitle: string }
46
+ params: { title?: string; siteTitle: string },
47
47
  ): string {
48
48
  if (template === false) {
49
- return params.title?.trim() || params.siteTitle
49
+ return params.title?.trim() || params.siteTitle;
50
50
  }
51
- const pattern = template?.trim() || DEFAULT_TITLE_TEMPLATE
52
- if (!params.title?.trim()) return params.siteTitle
53
- return pattern
54
- .replace(/:title/g, params.title.trim())
55
- .replace(/:siteTitle/g, params.siteTitle)
51
+ const pattern = template?.trim() || DEFAULT_TITLE_TEMPLATE;
52
+ if (!params.title?.trim()) return params.siteTitle;
53
+ return pattern.replace(/:title/g, params.title.trim()).replace(/:siteTitle/g, params.siteTitle);
56
54
  }
57
55
 
58
- export function titleTemplateFromMeta(meta: Record<string, unknown> | undefined): string | false | undefined {
59
- const value = meta?.titleTemplate
60
- if (value === false) return false
61
- return typeof value === 'string' ? value : undefined
56
+ export function titleTemplateFromMeta(
57
+ meta: Record<string, unknown> | undefined,
58
+ ): string | false | undefined {
59
+ const value = meta?.titleTemplate;
60
+ if (value === false) return false;
61
+ return typeof value === "string" ? value : undefined;
62
62
  }
63
63
 
64
64
  export function excerptFromHtml(html: string, maxLen = META_DESCRIPTION_MAX): string {
65
65
  const text = html
66
- .replace(/<[^>]+>/g, ' ')
67
- .replace(/&[a-z0-9#]+;/gi, ' ')
68
- .replace(/\s+/g, ' ')
69
- .trim()
70
- if (!text) return ''
71
- if (text.length <= maxLen) return text
72
- const cut = text.slice(0, maxLen)
73
- const lastSpace = cut.lastIndexOf(' ')
74
- const trimmed = (lastSpace > 40 ? cut.slice(0, lastSpace) : cut).trim()
75
- return `${trimmed}…`
66
+ .replace(/<[^>]+>/g, " ")
67
+ .replace(/&[a-z0-9#]+;/gi, " ")
68
+ .replace(/\s+/g, " ")
69
+ .trim();
70
+ if (!text) return "";
71
+ if (text.length <= maxLen) return text;
72
+ const cut = text.slice(0, maxLen);
73
+ const lastSpace = cut.lastIndexOf(" ");
74
+ const trimmed = (lastSpace > 40 ? cut.slice(0, lastSpace) : cut).trim();
75
+ return `${trimmed}…`;
76
76
  }
77
77
 
78
78
  export function resolvePageMeta(
79
79
  page: PageMetaInput | undefined,
80
- site: SiteMetaInput
80
+ site: SiteMetaInput,
81
81
  ): { title: string; description: string } {
82
- const { title, description } = resolvePageHeadMeta(page, site)
83
- return { title, description }
82
+ const { title, description } = resolvePageHeadMeta(page, site);
83
+ return { title, description };
84
84
  }
85
85
 
86
86
  export function resolvePageHeadMeta(
87
87
  page: PageMetaInput | undefined,
88
- site: SiteMetaInput
88
+ site: SiteMetaInput,
89
89
  ): {
90
- title: string
91
- description: string
92
- tags: string[]
93
- image?: string
94
- pageType: 'website' | 'article'
90
+ title: string;
91
+ description: string;
92
+ tags: string[];
93
+ image?: string;
94
+ pageType: "website" | "article";
95
95
  } {
96
- const template = page?.titleTemplate ?? site.titleTemplate
96
+ const template = page?.titleTemplate ?? site.titleTemplate;
97
97
  const title = formatTitleTemplate(template, {
98
98
  title: page?.title,
99
- siteTitle: site.title
100
- })
99
+ siteTitle: site.title,
100
+ });
101
101
 
102
102
  let description =
103
- (page?.description && String(page.description).trim()) || site.description.trim()
103
+ (page?.description && String(page.description).trim()) || site.description.trim();
104
104
 
105
- if (!description && page?.kind === 'markdown' && page.html) {
106
- description = excerptFromHtml(page.html)
105
+ if (!description && page?.kind === "markdown" && page.html) {
106
+ description = excerptFromHtml(page.html);
107
107
  }
108
108
 
109
- const tags = page?.tags?.filter((tag) => tag.trim()).map((tag) => tag.trim()) ?? []
110
- const image = page?.image?.trim() || undefined
111
- const pageType = page?.pageType === 'article' ? 'article' : 'website'
109
+ const tags = page?.tags?.filter((tag) => tag.trim()).map((tag) => tag.trim()) ?? [];
110
+ const image = page?.image?.trim() || undefined;
111
+ const pageType = page?.pageType === "article" ? "article" : "website";
112
112
 
113
- return { title, description, tags, image, pageType }
113
+ return { title, description, tags, image, pageType };
114
114
  }
115
115
 
116
116
  export function pageImageFromMeta(meta: Record<string, unknown>): string | undefined {
117
- const value = meta.ogImage ?? meta.image
118
- return typeof value === 'string' && value.trim() ? value.trim() : undefined
117
+ const value = meta.ogImage ?? meta.image;
118
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
119
119
  }
120
120
 
121
- export function pageTypeFromMeta(meta: Record<string, unknown>): 'website' | 'article' {
122
- return meta.type === 'article' ? 'article' : 'website'
121
+ export function pageTypeFromMeta(meta: Record<string, unknown>): "website" | "article" {
122
+ return meta.type === "article" ? "article" : "website";
123
123
  }
124
124
 
125
125
  export function pageLayoutFromMeta(meta: Record<string, unknown> | undefined): PageLayout {
126
- const value = meta?.layout
127
- return PAGE_LAYOUTS.includes(value as PageLayout) ? (value as PageLayout) : 'doc'
126
+ const value = meta?.layout;
127
+ return PAGE_LAYOUTS.includes(value as PageLayout) ? (value as PageLayout) : "doc";
128
128
  }
129
129
 
130
130
  export function isPageLayout(value: unknown): value is PageLayout {
131
- return PAGE_LAYOUTS.includes(value as PageLayout)
131
+ return PAGE_LAYOUTS.includes(value as PageLayout);
132
132
  }
133
133
 
134
134
  export function isDraftPage(meta: Record<string, unknown>): boolean {
135
- return meta.draft === true
135
+ return meta.draft === true;
136
136
  }
@@ -1,35 +1,33 @@
1
- import type { ContentFile } from '../node/content.js'
2
- import { normalizeRoute } from './route.js'
1
+ import type { ContentFile } from "../node/content.js";
2
+ import { normalizeRoute } from "./route.js";
3
3
 
4
- export type RouteRewrites = Record<string, string>
4
+ export type RouteRewrites = Record<string, string>;
5
5
 
6
6
  export function normalizeRewriteRoute(route: string): string {
7
- return normalizeRoute(route)
7
+ return normalizeRoute(route);
8
8
  }
9
9
 
10
10
  export function applyRouteRewrites(
11
11
  routeToFile: Map<string, ContentFile>,
12
- rewrites: RouteRewrites
12
+ rewrites: RouteRewrites,
13
13
  ): void {
14
14
  for (const [aliasRaw, sourceRaw] of Object.entries(rewrites)) {
15
- const alias = normalizeRewriteRoute(aliasRaw)
16
- const source = normalizeRewriteRoute(sourceRaw)
17
- const sourceFile = routeToFile.get(source)
15
+ const alias = normalizeRewriteRoute(aliasRaw);
16
+ const source = normalizeRewriteRoute(sourceRaw);
17
+ const sourceFile = routeToFile.get(source);
18
18
  if (!sourceFile) {
19
- throw new Error(
20
- `preactpress: rewrite source route not found: ${sourceRaw} (${source})`
21
- )
19
+ throw new Error(`preactpress: rewrite source route not found: ${sourceRaw} (${source})`);
22
20
  }
23
- const existing = routeToFile.get(alias)
21
+ const existing = routeToFile.get(alias);
24
22
  if (existing && existing.file !== sourceFile.file) {
25
23
  throw new Error(
26
- `preactpress: rewrite collision for ${alias}: ${pathLabel(existing)} and ${pathLabel(sourceFile)}`
27
- )
24
+ `preactpress: rewrite collision for ${alias}: ${pathLabel(existing)} and ${pathLabel(sourceFile)}`,
25
+ );
28
26
  }
29
- routeToFile.set(alias, { ...sourceFile, route: alias })
27
+ routeToFile.set(alias, { ...sourceFile, route: alias });
30
28
  }
31
29
  }
32
30
 
33
31
  function pathLabel(file: ContentFile): string {
34
- return file.route === '/' ? '/' : file.route
32
+ return file.route === "/" ? "/" : file.route;
35
33
  }
@@ -1,14 +1,14 @@
1
1
  /** Normalize a path or route to a site route (no query/hash, leading slash, no trailing slash except `/`). */
2
2
  export function normalizeRoute(route: string): string {
3
- const clean = route.split(/[?#]/, 1)[0] || '/'
4
- const prefixed = clean.startsWith('/') ? clean : `/${clean}`
5
- return prefixed.replace(/\/$/, '') || '/'
3
+ const clean = route.split(/[?#]/, 1)[0] || "/";
4
+ const prefixed = clean.startsWith("/") ? clean : `/${clean}`;
5
+ return prefixed.replace(/\/$/, "") || "/";
6
6
  }
7
7
 
8
8
  /** Map a request pathname to a site route using the configured base. */
9
9
  export function routeFromPathname(pathname: string, base: string): string {
10
- const basePath = base === '/' ? '' : base.replace(/\/$/, '')
11
- let p = pathname
12
- if (basePath && p.startsWith(basePath)) p = p.slice(basePath.length) || '/'
13
- return normalizeRoute(p)
10
+ const basePath = base === "/" ? "" : base.replace(/\/$/, "");
11
+ let p = pathname;
12
+ if (basePath && p.startsWith(basePath)) p = p.slice(basePath.length) || "/";
13
+ return normalizeRoute(p);
14
14
  }
@@ -0,0 +1,70 @@
1
+ export const SCROLL_STATE_KEY = "ppScrollY";
2
+
3
+ let skipScrollRestoreOnce = false;
4
+
5
+ export function setupScrollRestoration(): () => void {
6
+ if (typeof window === "undefined") return () => {};
7
+
8
+ if ("scrollRestoration" in window.history) {
9
+ window.history.scrollRestoration = "manual";
10
+ }
11
+
12
+ let timeout: ReturnType<typeof setTimeout> | undefined;
13
+ const onScroll = () => {
14
+ clearTimeout(timeout);
15
+ timeout = setTimeout(persistScrollPosition, 150);
16
+ };
17
+ window.addEventListener("scroll", onScroll, { passive: true });
18
+ return () => {
19
+ window.removeEventListener("scroll", onScroll);
20
+ clearTimeout(timeout);
21
+ };
22
+ }
23
+
24
+ export function persistScrollPosition(): void {
25
+ if (typeof window === "undefined") return;
26
+ const scrollY = window.scrollY;
27
+ const state = window.history.state ?? {};
28
+ if (state[SCROLL_STATE_KEY] === scrollY) return;
29
+ window.history.replaceState({ ...state, [SCROLL_STATE_KEY]: scrollY }, "");
30
+ }
31
+
32
+ export function saveScrollPositionBeforeNavigation(): void {
33
+ persistScrollPosition();
34
+ }
35
+
36
+ export function readScrollPositionFromHistory(): number {
37
+ if (typeof window === "undefined") return 0;
38
+ const scrollY = window.history.state?.[SCROLL_STATE_KEY];
39
+ return typeof scrollY === "number" && Number.isFinite(scrollY) ? scrollY : 0;
40
+ }
41
+
42
+ export function restoreScrollPosition(): void {
43
+ if (typeof window === "undefined") return;
44
+ window.scrollTo({ top: readScrollPositionFromHistory(), left: 0, behavior: "auto" });
45
+ }
46
+
47
+ export function restoreScrollPositionAfterLayout(): void {
48
+ if (typeof window === "undefined") return;
49
+ requestAnimationFrame(() => {
50
+ requestAnimationFrame(() => {
51
+ const html = document.documentElement;
52
+ const previous = html.style.scrollBehavior;
53
+ html.style.scrollBehavior = "auto";
54
+ restoreScrollPosition();
55
+ html.style.scrollBehavior = previous;
56
+ });
57
+ });
58
+ }
59
+
60
+ export function skipNextScrollRestore(): void {
61
+ skipScrollRestoreOnce = true;
62
+ }
63
+
64
+ export function consumeScrollRestoreOnPopstate(): boolean {
65
+ if (skipScrollRestoreOnce) {
66
+ skipScrollRestoreOnce = false;
67
+ return false;
68
+ }
69
+ return true;
70
+ }
@@ -1,105 +1,109 @@
1
- export type SearchProvider = 'local' | 'algolia'
1
+ import { saveScrollPositionBeforeNavigation, skipNextScrollRestore } from "./scrollRestoration.js";
2
+
3
+ export type SearchProvider = "local" | "algolia";
2
4
 
3
5
  export interface LocalSearchConfig {
4
- provider: 'local'
6
+ provider: "local";
5
7
  }
6
8
 
7
9
  export interface AlgoliaSearchOptions {
8
- appId?: string
9
- apiKey?: string
10
- indexName?: string
11
- placeholder?: string
12
- maxResultsPerGroup?: number
13
- disableUserPersonalization?: boolean
14
- initialQuery?: string
15
- recentSearchesLimit?: number
16
- recentSearchesWithFavoritesLimit?: number
17
- insights?: boolean
18
- searchParameters?: Record<string, unknown>
10
+ appId?: string;
11
+ apiKey?: string;
12
+ indexName?: string;
13
+ placeholder?: string;
14
+ maxResultsPerGroup?: number;
15
+ disableUserPersonalization?: boolean;
16
+ initialQuery?: string;
17
+ recentSearchesLimit?: number;
18
+ recentSearchesWithFavoritesLimit?: number;
19
+ insights?: boolean;
20
+ searchParameters?: Record<string, unknown>;
19
21
  /** Locale-specific overrides (merged with root options). */
20
- locales?: Record<string, Partial<AlgoliaSearchOptions>>
22
+ locales?: Record<string, Partial<AlgoliaSearchOptions>>;
21
23
  }
22
24
 
23
25
  export interface AlgoliaSearchConfig {
24
- provider: 'algolia'
25
- options: AlgoliaSearchOptions
26
+ provider: "algolia";
27
+ options: AlgoliaSearchOptions;
26
28
  }
27
29
 
28
30
  /** `true` keeps local sidebar search; use `{ provider }` for explicit providers. */
29
- export type SearchConfig = boolean | LocalSearchConfig | AlgoliaSearchConfig
31
+ export type SearchConfig = boolean | LocalSearchConfig | AlgoliaSearchConfig;
30
32
 
31
33
  export function resolveSearchProvider(search?: SearchConfig): SearchProvider | false {
32
- if (search === true) return 'local'
33
- if (search === false || search == null) return false
34
- return search.provider
34
+ if (search === true) return "local";
35
+ if (search === false || search == null) return false;
36
+ return search.provider;
35
37
  }
36
38
 
37
39
  export function isLocalSearchEnabled(search?: SearchConfig): boolean {
38
- return resolveSearchProvider(search) === 'local'
40
+ return resolveSearchProvider(search) === "local";
39
41
  }
40
42
 
41
43
  export function isAlgoliaSearchEnabled(search?: SearchConfig): boolean {
42
- return resolveSearchProvider(search) === 'algolia'
44
+ return resolveSearchProvider(search) === "algolia";
43
45
  }
44
46
 
45
47
  export function algoliaOptionsFromSearch(search?: SearchConfig): AlgoliaSearchOptions | undefined {
46
- if (typeof search === 'object' && search.provider === 'algolia') return search.options
47
- return undefined
48
+ if (typeof search === "object" && search.provider === "algolia") return search.options;
49
+ return undefined;
48
50
  }
49
51
 
50
52
  export function resolveAlgoliaOptions(
51
53
  options: AlgoliaSearchOptions,
52
- localeKey?: string
54
+ localeKey?: string,
53
55
  ): AlgoliaSearchOptions {
54
- const { locales, ...root } = options
55
- const override = localeKey && locales?.[localeKey] ? locales[localeKey] : {}
56
+ const { locales, ...root } = options;
57
+ const override = localeKey && locales?.[localeKey] ? locales[localeKey] : {};
56
58
  return {
57
59
  ...root,
58
60
  ...override,
59
- searchParameters: override.searchParameters ?? root.searchParameters
60
- }
61
+ searchParameters: override.searchParameters ?? root.searchParameters,
62
+ };
61
63
  }
62
64
 
63
65
  export function validateAlgoliaCredentials(options: AlgoliaSearchOptions): {
64
- valid: boolean
65
- appId?: string
66
- apiKey?: string
67
- indexName?: string
66
+ valid: boolean;
67
+ appId?: string;
68
+ apiKey?: string;
69
+ indexName?: string;
68
70
  } {
69
- const appId = options.appId?.trim()
70
- const apiKey = options.apiKey?.trim()
71
- const indexName = options.indexName?.trim()
71
+ const appId = options.appId?.trim();
72
+ const apiKey = options.apiKey?.trim();
73
+ const indexName = options.indexName?.trim();
72
74
  return {
73
75
  valid: Boolean(appId && apiKey && indexName),
74
76
  appId,
75
77
  apiKey,
76
- indexName
77
- }
78
+ indexName,
79
+ };
78
80
  }
79
81
 
80
82
  export function getRelativeDocSearchUrl(url: string, base: string, cleanUrls = true): string {
81
- const { pathname, hash } = new URL(url, 'http://preactpress.local')
82
- const normalizedBase = base === '/' ? '' : base.replace(/\/$/, '')
83
- let path = pathname
83
+ const { pathname, hash } = new URL(url, "http://preactpress.local");
84
+ const normalizedBase = base === "/" ? "" : base.replace(/\/$/, "");
85
+ let path = pathname;
84
86
  if (normalizedBase && path.startsWith(normalizedBase)) {
85
- path = path.slice(normalizedBase.length) || '/'
87
+ path = path.slice(normalizedBase.length) || "/";
86
88
  }
87
- const route = cleanUrls ? path.replace(/\.html$/, '').replace(/\/index$/, '/') || '/' : path
88
- return `${route}${hash}`
89
+ const route = cleanUrls ? path.replace(/\.html$/, "").replace(/\/index$/, "/") || "/" : path;
90
+ return `${route}${hash}`;
89
91
  }
90
92
 
91
93
  export function navigateDocSearchResult(itemUrl: string, base: string): void {
92
- const url = new URL(itemUrl, window.location.origin)
93
- const normalizedBase = base === '/' ? '' : base.replace(/\/$/, '')
94
+ const url = new URL(itemUrl, window.location.origin);
95
+ const normalizedBase = base === "/" ? "" : base.replace(/\/$/, "");
94
96
  const href =
95
97
  normalizedBase && !url.pathname.startsWith(normalizedBase)
96
98
  ? itemUrl
97
- : `${normalizedBase}${url.pathname.replace(normalizedBase, '') || '/'}${url.search}${url.hash}`
99
+ : `${normalizedBase}${url.pathname.replace(normalizedBase, "") || "/"}${url.search}${url.hash}`;
98
100
  if (url.origin !== window.location.origin) {
99
- window.location.assign(href)
100
- return
101
+ window.location.assign(href);
102
+ return;
101
103
  }
102
- window.history.pushState({}, '', href)
103
- window.dispatchEvent(new PopStateEvent('popstate'))
104
- window.scrollTo({ top: 0 })
104
+ saveScrollPositionBeforeNavigation();
105
+ window.history.pushState({}, "", href);
106
+ skipNextScrollRestore();
107
+ window.dispatchEvent(new PopStateEvent("popstate"));
108
+ window.scrollTo({ top: 0, behavior: "auto" });
105
109
  }
@@ -1,67 +1,67 @@
1
- import type { NavItem, ResolvedI18n, SidebarGroup, SidebarItem } from '../node/siteConfig.js'
2
- import { routePathKey } from './locale.js'
3
- import { normalizeRoute } from './route.js'
1
+ import type { NavItem, ResolvedI18n, SidebarGroup, SidebarItem } from "../node/siteConfig.js";
2
+ import { routePathKey } from "./locale.js";
3
+ import { normalizeRoute } from "./route.js";
4
4
 
5
- export type SidebarConfig = SidebarGroup[] | Record<string, SidebarGroup[]>
5
+ export type SidebarConfig = SidebarGroup[] | Record<string, SidebarGroup[]>;
6
6
 
7
7
  export function isPathSidebarConfig(
8
- sidebar: SidebarConfig | undefined
8
+ sidebar: SidebarConfig | undefined,
9
9
  ): sidebar is Record<string, SidebarGroup[]> {
10
- return Boolean(sidebar && !Array.isArray(sidebar))
10
+ return Boolean(sidebar && !Array.isArray(sidebar));
11
11
  }
12
12
 
13
13
  export function resolveSidebarForRoute(
14
14
  sidebar: SidebarConfig | undefined,
15
15
  route: string,
16
- i18n?: ResolvedI18n
16
+ i18n?: ResolvedI18n,
17
17
  ): SidebarGroup[] {
18
- if (!sidebar) return []
19
- if (Array.isArray(sidebar)) return sidebar
18
+ if (!sidebar) return [];
19
+ if (Array.isArray(sidebar)) return sidebar;
20
20
 
21
- const pathKey = routePathKey(route, i18n)
21
+ const pathKey = routePathKey(route, i18n);
22
22
  const entries = Object.entries(sidebar)
23
23
  .map(([prefix, groups]) => ({ prefix: normalizeRoute(prefix), groups }))
24
- .filter(({ prefix }) => prefix !== '/')
25
- .sort((a, b) => b.prefix.length - a.prefix.length)
24
+ .filter(({ prefix }) => prefix !== "/")
25
+ .sort((a, b) => b.prefix.length - a.prefix.length);
26
26
 
27
27
  for (const { prefix, groups } of entries) {
28
28
  if (pathKey === prefix || pathKey.startsWith(`${prefix}/`)) {
29
- return groups
29
+ return groups;
30
30
  }
31
31
  }
32
32
 
33
- return sidebar['/'] ?? sidebar[''] ?? []
33
+ return sidebar["/"] ?? sidebar[""] ?? [];
34
34
  }
35
35
 
36
36
  export function flattenSidebarLeafItems(
37
- items: SidebarItem[]
37
+ items: SidebarItem[],
38
38
  ): Array<{ text: string; link: string }> {
39
- const out: Array<{ text: string; link: string }> = []
39
+ const out: Array<{ text: string; link: string }> = [];
40
40
  for (const item of items) {
41
- if (item.link) out.push({ text: item.text, link: item.link })
42
- if (item.items?.length) out.push(...flattenSidebarLeafItems(item.items))
41
+ if (item.link) out.push({ text: item.text, link: item.link });
42
+ if (item.items?.length) out.push(...flattenSidebarLeafItems(item.items));
43
43
  }
44
- return out
44
+ return out;
45
45
  }
46
46
 
47
47
  export function flattenSidebarItems(
48
- sidebar: SidebarConfig | undefined
48
+ sidebar: SidebarConfig | undefined,
49
49
  ): Array<{ text: string; link: string }> {
50
- return allSidebarGroups(sidebar).flatMap((group) => flattenSidebarLeafItems(group.items))
50
+ return allSidebarGroups(sidebar).flatMap((group) => flattenSidebarLeafItems(group.items));
51
51
  }
52
52
 
53
53
  export function flattenNavLeafItems(
54
- items: NavItem[] | undefined
54
+ items: NavItem[] | undefined,
55
55
  ): Array<{ text: string; link: string }> {
56
- const out: Array<{ text: string; link: string }> = []
56
+ const out: Array<{ text: string; link: string }> = [];
57
57
  for (const item of items ?? []) {
58
- if (item.link) out.push({ text: item.text, link: item.link })
59
- if (item.items?.length) out.push(...flattenNavLeafItems(item.items))
58
+ if (item.link) out.push({ text: item.text, link: item.link });
59
+ if (item.items?.length) out.push(...flattenNavLeafItems(item.items));
60
60
  }
61
- return out
61
+ return out;
62
62
  }
63
63
 
64
64
  export function allSidebarGroups(sidebar: SidebarConfig | undefined): SidebarGroup[] {
65
- if (!sidebar) return []
66
- return Array.isArray(sidebar) ? sidebar : Object.values(sidebar).flat()
65
+ if (!sidebar) return [];
66
+ return Array.isArray(sidebar) ? sidebar : Object.values(sidebar).flat();
67
67
  }
@@ -1,23 +1,23 @@
1
- import type { OutlineItem } from '../node/siteConfig.js'
1
+ import type { OutlineItem } from "../node/siteConfig.js";
2
2
 
3
- export function slugifySegment(text: string, fallback = 'section'): string {
3
+ export function slugifySegment(text: string, fallback = "section"): string {
4
4
  const slug = text
5
5
  .toLowerCase()
6
6
  .trim()
7
- .replace(/<[^>]+>/g, '')
8
- .replace(/&[a-z0-9#]+;/gi, '')
9
- .replace(/[^a-z0-9]+/g, '-')
10
- .replace(/^-+|-+$/g, '')
11
- return slug || fallback
7
+ .replace(/<[^>]+>/g, "")
8
+ .replace(/&[a-z0-9#]+;/gi, "")
9
+ .replace(/[^a-z0-9]+/g, "-")
10
+ .replace(/^-+|-+$/g, "");
11
+ return slug || fallback;
12
12
  }
13
13
 
14
14
  export function uniqueSlug(base: string, existing: OutlineItem[]): string {
15
- let id = base
16
- let i = 1
17
- const used = new Set(existing.map((h) => h.id))
15
+ let id = base;
16
+ let i = 1;
17
+ const used = new Set(existing.map((h) => h.id));
18
18
  while (used.has(id)) {
19
- i += 1
20
- id = `${base}-${i}`
19
+ i += 1;
20
+ id = `${base}-${i}`;
21
21
  }
22
- return id
22
+ return id;
23
23
  }