markopress 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/bin/cli.js +16 -0
  2. package/dist/build/index.d.ts +83 -0
  3. package/dist/build/index.d.ts.map +1 -0
  4. package/dist/build/index.js +1553 -0
  5. package/dist/build/index.js.map +1 -0
  6. package/dist/build/manifest-generator.d.ts +34 -0
  7. package/dist/build/manifest-generator.d.ts.map +1 -0
  8. package/dist/build/manifest-generator.js +86 -0
  9. package/dist/build/manifest-generator.js.map +1 -0
  10. package/dist/build/security.test.d.ts +6 -0
  11. package/dist/build/security.test.d.ts.map +1 -0
  12. package/dist/build/security.test.js +88 -0
  13. package/dist/build/security.test.js.map +1 -0
  14. package/dist/build/types.d.ts +21 -0
  15. package/dist/build/types.d.ts.map +1 -0
  16. package/dist/build/types.js +5 -0
  17. package/dist/build/types.js.map +1 -0
  18. package/dist/build/vite-config.test.d.ts +2 -0
  19. package/dist/build/vite-config.test.d.ts.map +1 -0
  20. package/dist/build/vite-config.test.js +53 -0
  21. package/dist/build/vite-config.test.js.map +1 -0
  22. package/dist/build/vite-markdown-plugin.d.ts +13 -0
  23. package/dist/build/vite-markdown-plugin.d.ts.map +1 -0
  24. package/dist/build/vite-markdown-plugin.js +134 -0
  25. package/dist/build/vite-markdown-plugin.js.map +1 -0
  26. package/dist/build/vite-markdown-plugin.test.d.ts +2 -0
  27. package/dist/build/vite-markdown-plugin.test.d.ts.map +1 -0
  28. package/dist/build/vite-markdown-plugin.test.js +41 -0
  29. package/dist/build/vite-markdown-plugin.test.js.map +1 -0
  30. package/dist/cli/index.d.ts +6 -0
  31. package/dist/cli/index.d.ts.map +1 -0
  32. package/dist/cli/index.js +75 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/config/app-root.d.ts +11 -0
  35. package/dist/config/app-root.d.ts.map +1 -0
  36. package/dist/config/app-root.js +24 -0
  37. package/dist/config/app-root.js.map +1 -0
  38. package/dist/config/app-root.test.d.ts +2 -0
  39. package/dist/config/app-root.test.d.ts.map +1 -0
  40. package/dist/config/app-root.test.js +71 -0
  41. package/dist/config/app-root.test.js.map +1 -0
  42. package/dist/config/index.d.ts +6 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +6 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/config/loader.d.ts +25 -0
  47. package/dist/config/loader.d.ts.map +1 -0
  48. package/dist/config/loader.js +187 -0
  49. package/dist/config/loader.js.map +1 -0
  50. package/dist/config/loader.test.d.ts +2 -0
  51. package/dist/config/loader.test.d.ts.map +1 -0
  52. package/dist/config/loader.test.js +24 -0
  53. package/dist/config/loader.test.js.map +1 -0
  54. package/dist/config/types.d.ts +149 -0
  55. package/dist/config/types.d.ts.map +1 -0
  56. package/dist/config/types.js +5 -0
  57. package/dist/config/types.js.map +1 -0
  58. package/dist/config/validation.d.ts +188 -0
  59. package/dist/config/validation.d.ts.map +1 -0
  60. package/dist/config/validation.js +139 -0
  61. package/dist/config/validation.js.map +1 -0
  62. package/dist/content/index.d.ts +6 -0
  63. package/dist/content/index.d.ts.map +1 -0
  64. package/dist/content/index.js +6 -0
  65. package/dist/content/index.js.map +1 -0
  66. package/dist/content/registry.d.ts +29 -0
  67. package/dist/content/registry.d.ts.map +1 -0
  68. package/dist/content/registry.js +45 -0
  69. package/dist/content/registry.js.map +1 -0
  70. package/dist/content/scanner.d.ts +9 -0
  71. package/dist/content/scanner.d.ts.map +1 -0
  72. package/dist/content/scanner.js +115 -0
  73. package/dist/content/scanner.js.map +1 -0
  74. package/dist/content/types.d.ts +41 -0
  75. package/dist/content/types.d.ts.map +1 -0
  76. package/dist/content/types.js +5 -0
  77. package/dist/content/types.js.map +1 -0
  78. package/dist/dev/index.d.ts +18 -0
  79. package/dist/dev/index.d.ts.map +1 -0
  80. package/dist/dev/index.js +93 -0
  81. package/dist/dev/index.js.map +1 -0
  82. package/dist/index.d.ts +14 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +17 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/markdown/code.d.ts +79 -0
  87. package/dist/markdown/code.d.ts.map +1 -0
  88. package/dist/markdown/code.js +305 -0
  89. package/dist/markdown/code.js.map +1 -0
  90. package/dist/markdown/containers.d.ts +17 -0
  91. package/dist/markdown/containers.d.ts.map +1 -0
  92. package/dist/markdown/containers.js +143 -0
  93. package/dist/markdown/containers.js.map +1 -0
  94. package/dist/markdown/includes.d.ts +18 -0
  95. package/dist/markdown/includes.d.ts.map +1 -0
  96. package/dist/markdown/includes.js +9 -0
  97. package/dist/markdown/includes.js.map +1 -0
  98. package/dist/markdown/index.d.ts +8 -0
  99. package/dist/markdown/index.d.ts.map +1 -0
  100. package/dist/markdown/index.js +8 -0
  101. package/dist/markdown/index.js.map +1 -0
  102. package/dist/markdown/loader.d.ts +31 -0
  103. package/dist/markdown/loader.d.ts.map +1 -0
  104. package/dist/markdown/loader.js +325 -0
  105. package/dist/markdown/loader.js.map +1 -0
  106. package/dist/markdown/preserve-tags.d.ts +16 -0
  107. package/dist/markdown/preserve-tags.d.ts.map +1 -0
  108. package/dist/markdown/preserve-tags.js +233 -0
  109. package/dist/markdown/preserve-tags.js.map +1 -0
  110. package/dist/markdown/renderer.d.ts +28 -0
  111. package/dist/markdown/renderer.d.ts.map +1 -0
  112. package/dist/markdown/renderer.js +146 -0
  113. package/dist/markdown/renderer.js.map +1 -0
  114. package/dist/markdown/tag-validator.d.ts +64 -0
  115. package/dist/markdown/tag-validator.d.ts.map +1 -0
  116. package/dist/markdown/tag-validator.js +118 -0
  117. package/dist/markdown/tag-validator.js.map +1 -0
  118. package/dist/markdown/types.d.ts +44 -0
  119. package/dist/markdown/types.d.ts.map +1 -0
  120. package/dist/markdown/types.js +5 -0
  121. package/dist/markdown/types.js.map +1 -0
  122. package/dist/plugin/compat.d.ts +14 -0
  123. package/dist/plugin/compat.d.ts.map +1 -0
  124. package/dist/plugin/compat.js +78 -0
  125. package/dist/plugin/compat.js.map +1 -0
  126. package/dist/plugin/context.d.ts +38 -0
  127. package/dist/plugin/context.d.ts.map +1 -0
  128. package/dist/plugin/context.js +103 -0
  129. package/dist/plugin/context.js.map +1 -0
  130. package/dist/plugin/index.d.ts +6 -0
  131. package/dist/plugin/index.d.ts.map +1 -0
  132. package/dist/plugin/index.js +6 -0
  133. package/dist/plugin/index.js.map +1 -0
  134. package/dist/plugin/manager.d.ts +112 -0
  135. package/dist/plugin/manager.d.ts.map +1 -0
  136. package/dist/plugin/manager.js +385 -0
  137. package/dist/plugin/manager.js.map +1 -0
  138. package/dist/plugin/types.d.ts +182 -0
  139. package/dist/plugin/types.d.ts.map +1 -0
  140. package/dist/plugin/types.js +5 -0
  141. package/dist/plugin/types.js.map +1 -0
  142. package/dist/plugins/blog-index/index.d.ts +18 -0
  143. package/dist/plugins/blog-index/index.d.ts.map +1 -0
  144. package/dist/plugins/blog-index/index.js +158 -0
  145. package/dist/plugins/blog-index/index.js.map +1 -0
  146. package/dist/plugins/sidenav/index.d.ts +36 -0
  147. package/dist/plugins/sidenav/index.d.ts.map +1 -0
  148. package/dist/plugins/sidenav/index.js +86 -0
  149. package/dist/plugins/sidenav/index.js.map +1 -0
  150. package/dist/plugins/toc/index.d.ts +38 -0
  151. package/dist/plugins/toc/index.d.ts.map +1 -0
  152. package/dist/plugins/toc/index.js +79 -0
  153. package/dist/plugins/toc/index.js.map +1 -0
  154. package/dist/preview/index.d.ts +7 -0
  155. package/dist/preview/index.d.ts.map +1 -0
  156. package/dist/preview/index.js +25 -0
  157. package/dist/preview/index.js.map +1 -0
  158. package/dist/theme/default/build/generate-all.d.ts +9 -0
  159. package/dist/theme/default/build/generate-all.d.ts.map +1 -0
  160. package/dist/theme/default/build/generate-all.js +85 -0
  161. package/dist/theme/default/build/generate-all.js.map +1 -0
  162. package/dist/theme/default/build/generate-css.d.ts +19 -0
  163. package/dist/theme/default/build/generate-css.d.ts.map +1 -0
  164. package/dist/theme/default/build/generate-css.js +199 -0
  165. package/dist/theme/default/build/generate-css.js.map +1 -0
  166. package/dist/theme/default/build/index.d.ts +5 -0
  167. package/dist/theme/default/build/index.d.ts.map +1 -0
  168. package/dist/theme/default/build/index.js +5 -0
  169. package/dist/theme/default/build/index.js.map +1 -0
  170. package/dist/theme/default/design-systems/default.d.ts +12 -0
  171. package/dist/theme/default/design-systems/default.d.ts.map +1 -0
  172. package/dist/theme/default/design-systems/default.js +289 -0
  173. package/dist/theme/default/design-systems/default.js.map +1 -0
  174. package/dist/theme/default/design-systems/docusaurus.d.ts +12 -0
  175. package/dist/theme/default/design-systems/docusaurus.d.ts.map +1 -0
  176. package/dist/theme/default/design-systems/docusaurus.js +299 -0
  177. package/dist/theme/default/design-systems/docusaurus.js.map +1 -0
  178. package/dist/theme/default/design-systems/index.d.ts +50 -0
  179. package/dist/theme/default/design-systems/index.d.ts.map +1 -0
  180. package/dist/theme/default/design-systems/index.js +54 -0
  181. package/dist/theme/default/design-systems/index.js.map +1 -0
  182. package/dist/theme/default/design-systems/rspress.d.ts +12 -0
  183. package/dist/theme/default/design-systems/rspress.d.ts.map +1 -0
  184. package/dist/theme/default/design-systems/rspress.js +299 -0
  185. package/dist/theme/default/design-systems/rspress.js.map +1 -0
  186. package/dist/theme/default/design-systems/types.d.ts +238 -0
  187. package/dist/theme/default/design-systems/types.d.ts.map +1 -0
  188. package/dist/theme/default/design-systems/types.js +6 -0
  189. package/dist/theme/default/design-systems/types.js.map +1 -0
  190. package/dist/theme/default/design-systems/vitepress.d.ts +12 -0
  191. package/dist/theme/default/design-systems/vitepress.d.ts.map +1 -0
  192. package/dist/theme/default/design-systems/vitepress.js +299 -0
  193. package/dist/theme/default/design-systems/vitepress.js.map +1 -0
  194. package/dist/theme/default/index.d.ts +60 -0
  195. package/dist/theme/default/index.d.ts.map +1 -0
  196. package/dist/theme/default/index.js +44 -0
  197. package/dist/theme/default/index.js.map +1 -0
  198. package/dist/theme/default/theme.d.ts +14 -0
  199. package/dist/theme/default/theme.d.ts.map +1 -0
  200. package/dist/theme/default/theme.js +58 -0
  201. package/dist/theme/default/theme.js.map +1 -0
  202. package/dist/theme/index.d.ts +6 -0
  203. package/dist/theme/index.d.ts.map +1 -0
  204. package/dist/theme/index.js +6 -0
  205. package/dist/theme/index.js.map +1 -0
  206. package/dist/theme/loader.d.ts +21 -0
  207. package/dist/theme/loader.d.ts.map +1 -0
  208. package/dist/theme/loader.js +125 -0
  209. package/dist/theme/loader.js.map +1 -0
  210. package/dist/theme/types.d.ts +73 -0
  211. package/dist/theme/types.d.ts.map +1 -0
  212. package/dist/theme/types.js +5 -0
  213. package/dist/theme/types.js.map +1 -0
  214. package/dist/vite/index.d.ts +6 -0
  215. package/dist/vite/index.d.ts.map +1 -0
  216. package/dist/vite/index.js +6 -0
  217. package/dist/vite/index.js.map +1 -0
  218. package/dist/vite/markdownPlugin.d.ts +15 -0
  219. package/dist/vite/markdownPlugin.d.ts.map +1 -0
  220. package/dist/vite/markdownPlugin.js +111 -0
  221. package/dist/vite/markdownPlugin.js.map +1 -0
  222. package/dist/vite/plugin.d.ts +18 -0
  223. package/dist/vite/plugin.d.ts.map +1 -0
  224. package/dist/vite/plugin.js +94 -0
  225. package/dist/vite/plugin.js.map +1 -0
  226. package/marko.json +3 -0
  227. package/package.json +109 -0
  228. package/src/theme/default/build/generate-all.ts +99 -0
  229. package/src/theme/default/build/generate-css.ts +234 -0
  230. package/src/theme/default/build/index.ts +5 -0
  231. package/src/theme/default/components/doc-footer.marko +180 -0
  232. package/src/theme/default/components/footer.marko +32 -0
  233. package/src/theme/default/components/header.marko +49 -0
  234. package/src/theme/default/components/nav-bar.marko +191 -0
  235. package/src/theme/default/components/page-header.marko +20 -0
  236. package/src/theme/default/components/reading-progress.marko +36 -0
  237. package/src/theme/default/components/search.marko +239 -0
  238. package/src/theme/default/components/sidebar.marko +211 -0
  239. package/src/theme/default/components/site-footer.marko +211 -0
  240. package/src/theme/default/components/skip-link.marko +49 -0
  241. package/src/theme/default/components/theme/theme-aside-bottom.marko +1 -0
  242. package/src/theme/default/components/theme/theme-aside-top.marko +1 -0
  243. package/src/theme/default/components/theme/theme-body-bottom.marko +1 -0
  244. package/src/theme/default/components/theme/theme-body-top.marko +1 -0
  245. package/src/theme/default/components/theme/theme-doc-bottom.marko +1 -0
  246. package/src/theme/default/components/theme/theme-doc-footer-after.marko +1 -0
  247. package/src/theme/default/components/theme/theme-doc-footer-before.marko +1 -0
  248. package/src/theme/default/components/theme/theme-doc-top.marko +1 -0
  249. package/src/theme/default/components/theme/theme-head-bottom.marko +1 -0
  250. package/src/theme/default/components/theme/theme-head-top.marko +1 -0
  251. package/src/theme/default/components/theme/theme-home-features-after.marko +1 -0
  252. package/src/theme/default/components/theme/theme-home-hero-after.marko +1 -0
  253. package/src/theme/default/components/theme/theme-home-hero-before.marko +1 -0
  254. package/src/theme/default/components/theme/theme-navbar-center.marko +5 -0
  255. package/src/theme/default/components/theme/theme-navbar-end.marko +30 -0
  256. package/src/theme/default/components/theme/theme-navbar-start.marko +1 -0
  257. package/src/theme/default/components/theme/theme-page-bottom.marko +1 -0
  258. package/src/theme/default/components/theme/theme-page-top.marko +1 -0
  259. package/src/theme/default/components/theme/theme-sidebar-bottom.marko +1 -0
  260. package/src/theme/default/components/theme/theme-sidebar-top.marko +1 -0
  261. package/src/theme/default/components/theme/theme-toc-item.marko +1 -0
  262. package/src/theme/default/components/theme-toggle.marko +122 -0
  263. package/src/theme/default/components/toc.marko +140 -0
  264. package/src/theme/default/design-systems/default.ts +331 -0
  265. package/src/theme/default/design-systems/docusaurus.ts +341 -0
  266. package/src/theme/default/design-systems/index.ts +67 -0
  267. package/src/theme/default/design-systems/rspress.ts +341 -0
  268. package/src/theme/default/design-systems/types.ts +296 -0
  269. package/src/theme/default/design-systems/vitepress.ts +341 -0
  270. package/src/theme/default/index.ts +107 -0
  271. package/src/theme/default/layouts/blog.marko +65 -0
  272. package/src/theme/default/layouts/content-page.marko +41 -0
  273. package/src/theme/default/layouts/default.marko +209 -0
  274. package/src/theme/default/layouts/docs.marko +81 -0
  275. package/src/theme/default/layouts/home-page.marko +19 -0
  276. package/src/theme/default/layouts/page.marko +51 -0
  277. package/src/theme/default/public/theme-default.css +1081 -0
  278. package/src/theme/default/public/theme-docusaurus.css +1081 -0
  279. package/src/theme/default/public/theme-vitepress.css +1081 -0
  280. package/src/theme/default/public/theme.css +2 -0
  281. package/src/theme/default/routes/+layout.marko +57 -0
  282. package/src/theme/default/styles/main.css +249 -0
  283. package/src/theme/default/styles-base.css +757 -0
  284. package/src/theme/default/styles.css +899 -0
  285. package/src/theme/default/taglib.json +18 -0
  286. package/src/theme/default/tags/doc-footer.marko +180 -0
  287. package/src/theme/default/tags/footer.marko +32 -0
  288. package/src/theme/default/tags/header.marko +49 -0
  289. package/src/theme/default/tags/nav-bar.marko +191 -0
  290. package/src/theme/default/tags/page-header.marko +20 -0
  291. package/src/theme/default/tags/reading-progress.marko +36 -0
  292. package/src/theme/default/tags/search.marko +239 -0
  293. package/src/theme/default/tags/sidebar.marko +211 -0
  294. package/src/theme/default/tags/site-footer.marko +211 -0
  295. package/src/theme/default/tags/skip-link.marko +49 -0
  296. package/src/theme/default/tags/theme-aside-bottom.marko +1 -0
  297. package/src/theme/default/tags/theme-aside-top.marko +1 -0
  298. package/src/theme/default/tags/theme-body-bottom.marko +1 -0
  299. package/src/theme/default/tags/theme-body-top.marko +1 -0
  300. package/src/theme/default/tags/theme-doc-bottom.marko +1 -0
  301. package/src/theme/default/tags/theme-doc-footer-after.marko +1 -0
  302. package/src/theme/default/tags/theme-doc-footer-before.marko +1 -0
  303. package/src/theme/default/tags/theme-doc-top.marko +1 -0
  304. package/src/theme/default/tags/theme-head-bottom.marko +1 -0
  305. package/src/theme/default/tags/theme-head-top.marko +1 -0
  306. package/src/theme/default/tags/theme-home-features-after.marko +1 -0
  307. package/src/theme/default/tags/theme-home-hero-after.marko +1 -0
  308. package/src/theme/default/tags/theme-home-hero-before.marko +1 -0
  309. package/src/theme/default/tags/theme-navbar-center.marko +5 -0
  310. package/src/theme/default/tags/theme-navbar-end.marko +30 -0
  311. package/src/theme/default/tags/theme-navbar-start.marko +1 -0
  312. package/src/theme/default/tags/theme-page-bottom.marko +1 -0
  313. package/src/theme/default/tags/theme-page-top.marko +1 -0
  314. package/src/theme/default/tags/theme-sidebar-bottom.marko +1 -0
  315. package/src/theme/default/tags/theme-sidebar-top.marko +1 -0
  316. package/src/theme/default/tags/theme-toc-item.marko +1 -0
  317. package/src/theme/default/tags/theme-toggle.marko +122 -0
  318. package/src/theme/default/tags/toc.marko +140 -0
  319. package/src/theme/default/theme.ts +83 -0
  320. package/templates/blog-post.marko.template +13 -0
  321. package/templates/catch-all-handler.js.template +90 -0
  322. package/templates/catch-all-page.marko.template +69 -0
  323. package/templates/doc.marko.template +6 -0
  324. package/templates/example-tags/README.md +212 -0
  325. package/templates/example-tags/alert-box.marko +98 -0
  326. package/templates/example-tags/button-primary.marko +28 -0
  327. package/templates/example-tags/button-secondary.marko +28 -0
  328. package/templates/example-tags/button.marko +6 -0
  329. package/templates/example-tags/card-body.marko +8 -0
  330. package/templates/example-tags/card-footer.marko +7 -0
  331. package/templates/example-tags/card-header.marko +7 -0
  332. package/templates/example-tags/card.marko +20 -0
  333. package/templates/example-tags/icon.marko +149 -0
  334. package/templates/layout.marko.template +64 -0
  335. package/templates/page.marko.template +6 -0
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme body top -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme doc bottom -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme doc footer after -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme doc footer before -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme doc top -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme head bottom -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme head top -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme home features after -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme home hero after -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme home hero before -->
@@ -0,0 +1,5 @@
1
+ <nav class="navbar-nav">
2
+ <if=input.items>
3
+ <nav-bar items=input.items/>
4
+ </if>
5
+ </nav>
@@ -0,0 +1,30 @@
1
+ <div class="navbar-actions">
2
+ <!-- Search Component with Keyboard Shortcut -->
3
+ <search/>
4
+
5
+ <!-- Theme Toggle (Dark Mode) -->
6
+ <theme-toggle/>
7
+
8
+ <!-- Mobile Menu Toggle -->
9
+ <button class="btn-icon mobile-menu-toggle" aria-label="Toggle menu" onClick() {
10
+ if (input.setMobileMenuOpen) {
11
+ input.setMobileMenuOpen(!input.mobileMenuOpen);
12
+ }
13
+ }>
14
+ <if=input.mobileMenuOpen>
15
+ <!-- Close Icon -->
16
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
17
+ <line x1=18 y1=6 x2=6 y2=18/>
18
+ <line x1=6 y1=6 x2=18 y2=18/>
19
+ </svg>
20
+ </if>
21
+ <else>
22
+ <!-- Menu Icon -->
23
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
24
+ <line x1=3 y1=12 x2=21 y2=12/>
25
+ <line x1=3 y1=6 x2=21 y2=6/>
26
+ <line x1=3 y1=18 x2=21 y2=18/>
27
+ </svg>
28
+ </else>
29
+ </button>
30
+ </div>
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme navbar start -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme page bottom -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme page top -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme sidebar bottom -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme sidebar top -->
@@ -0,0 +1 @@
1
+ <!-- Extension point: theme toc item -->
@@ -0,0 +1,122 @@
1
+ /*!
2
+ * Theme Toggle Component
3
+ * Dark mode toggle with sun/moon icons and localStorage persistence
4
+ */
5
+
6
+ <let/isDark=false/>
7
+
8
+ <style/styles>
9
+ .toggle {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ width: 40px;
14
+ height: 40px;
15
+ padding: 0;
16
+ border: none;
17
+ background: transparent;
18
+ color: var(--text-2);
19
+ cursor: pointer;
20
+ border-radius: var(--radius-md, 8px);
21
+ transition: background-color var(--transition-fast), color var(--transition-fast);
22
+ }
23
+
24
+ .toggle:hover {
25
+ background: var(--bg-soft);
26
+ color: var(--text-1);
27
+ }
28
+
29
+ .toggle:focus-visible {
30
+ outline: 2px solid var(--color-primary-2, #3a5ccc);
31
+ outline-offset: 2px;
32
+ }
33
+
34
+ .icon {
35
+ transition: opacity var(--transition-fast), transform var(--transition-fast);
36
+ }
37
+
38
+ .icon.moon {
39
+ animation: moon-rise 0.3s ease-out;
40
+ }
41
+
42
+ .icon.sun {
43
+ animation: sun-rise 0.3s ease-out;
44
+ }
45
+
46
+ @keyframes moon-rise {
47
+ from {
48
+ opacity: 0;
49
+ transform: rotate(-90deg) scale(0.5);
50
+ }
51
+ to {
52
+ opacity: 1;
53
+ transform: rotate(0) scale(1);
54
+ }
55
+ }
56
+
57
+ @keyframes sun-rise {
58
+ from {
59
+ opacity: 0;
60
+ transform: rotate(90deg) scale(0.5);
61
+ }
62
+ to {
63
+ opacity: 1;
64
+ transform: rotate(0) scale(1);
65
+ }
66
+ }
67
+ </style>
68
+
69
+ <button
70
+ class=styles.toggle
71
+ aria-label="Toggle dark mode"
72
+ onClick(e) {
73
+ isDark = !isDark;
74
+ if (typeof document !== 'undefined') {
75
+ const html = document.documentElement;
76
+ if (isDark) {
77
+ html.classList.add('dark');
78
+ } else {
79
+ html.classList.remove('dark');
80
+ }
81
+ localStorage.setItem('theme', isDark ? 'dark' : 'light');
82
+ }
83
+ }>
84
+ <if=isDark>
85
+ <svg
86
+ class=styles.icon.sun
87
+ xmlns="http://www.w3.org/2000/svg"
88
+ width="20"
89
+ height="20"
90
+ viewBox="0 0 24 24"
91
+ fill="none"
92
+ stroke="currentColor"
93
+ stroke-width="2"
94
+ stroke-linecap="round"
95
+ stroke-linejoin="round">
96
+ <circle cx="12" cy="12" r="5"></circle>
97
+ <line x1="12" y1="1" x2="12" y2="3"></line>
98
+ <line x1="12" y1="21" x2="12" y2="23"></line>
99
+ <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
100
+ <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
101
+ <line x1="1" y1="12" x2="3" y2="12"></line>
102
+ <line x1="21" y1="12" x2="23" y2="12"></line>
103
+ <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
104
+ <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
105
+ </svg>
106
+ </if>
107
+ <else>
108
+ <svg
109
+ class=styles.icon.moon
110
+ xmlns="http://www.w3.org/2000/svg"
111
+ width="20"
112
+ height="20"
113
+ viewBox="0 0 24 24"
114
+ fill="none"
115
+ stroke="currentColor"
116
+ stroke-width="2"
117
+ stroke-linecap="round"
118
+ stroke-linejoin="round">
119
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
120
+ </svg>
121
+ </else>
122
+ </button>
@@ -0,0 +1,140 @@
1
+ <let/hasHeaders=(input.headers && input.headers.length > 0)/>
2
+
3
+ <if=hasHeaders>
4
+ <nav class="toc">
5
+ <div class="toc-header">On This Page</div>
6
+ <ul class="toc-list">
7
+ <for|header| of=input.headers>
8
+ <li class="toc-item">
9
+ <a href="#" + header.slug class="toc-link toc-link--level-2">
10
+ <span class="toc-text">${header.title}</span>
11
+ </a>
12
+
13
+ <if=(header.children && header.children.length > 0)>
14
+ <ul class="toc-list toc-list--nested">
15
+ <for|child| of=header.children>
16
+ <li class="toc-item">
17
+ <a href="#" + child.slug class="toc-link toc-link--level-3">
18
+ <span class="toc-text">${child.title}</span>
19
+ </a>
20
+ </li>
21
+ </for>
22
+ </ul>
23
+ </if>
24
+ </li>
25
+ </for>
26
+ </ul>
27
+ </nav>
28
+ </if>
29
+
30
+ <style>
31
+ .toc {
32
+ position: sticky;
33
+ top: var(--navbar-height, 60px);
34
+ width: var(--toc-width, 220px);
35
+ flex-shrink: 0;
36
+ align-self: flex-start;
37
+ max-height: calc(100vh - 80px);
38
+ overflow-y: auto;
39
+ padding-left: var(--space-md, 1rem);
40
+ border-left: 1px solid var(--border-color, #e5e7eb);
41
+ }
42
+
43
+ .toc-header {
44
+ font-size: var(--text-xs, 0.75rem);
45
+ font-weight: var(--font-semibold, 600);
46
+ color: var(--text-tertiary, #6b7280);
47
+ text-transform: uppercase;
48
+ letter-spacing: 0.05em;
49
+ margin-bottom: var(--space-sm, 0.75rem);
50
+ padding-left: var(--space-xs, 0.5rem);
51
+ }
52
+
53
+ .toc-list {
54
+ list-style: none;
55
+ padding: 0;
56
+ margin: 0;
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: 2px;
60
+ }
61
+
62
+ .toc-list--nested {
63
+ gap: 1px;
64
+ margin-top: 2px;
65
+ padding-left: 0;
66
+ }
67
+
68
+ .toc-item {
69
+ list-style: none;
70
+ }
71
+
72
+ .toc-link {
73
+ display: flex;
74
+ align-items: center;
75
+ padding: 6px var(--space-sm, 0.75rem);
76
+ font-size: var(--text-sm, 0.875rem);
77
+ color: var(--text-secondary, #64748b);
78
+ text-decoration: none;
79
+ border-radius: 4px;
80
+ transition: all 0.15s ease;
81
+ line-height: 1.5;
82
+ }
83
+
84
+ .toc-link:hover {
85
+ color: var(--text-primary, #334155);
86
+ background-color: var(--c-gray-100, #f1f5f9);
87
+ }
88
+
89
+ .toc-link.toc-link--level-3 {
90
+ font-size: var(--text-xs, 0.75rem);
91
+ padding: 4px var(--space-sm, 0.75rem) 4px 24px;
92
+ color: var(--text-tertiary, #94a3b8);
93
+ }
94
+
95
+ .toc-link.toc-link--level-3:hover {
96
+ color: var(--text-secondary, #475569);
97
+ background-color: var(--c-gray-50, #f8fafc);
98
+ }
99
+
100
+ .toc-link.active {
101
+ color: var(--c-brand, #3b82f6);
102
+ background-color: var(--accent-bg, rgba(59, 130, 246, 0.1));
103
+ font-weight: var(--font-medium, 500);
104
+ }
105
+
106
+ .toc-link.toc-link--level-3.active {
107
+ color: var(--c-brand, #3b82f6);
108
+ background-color: var(--accent-bg, rgba(59, 130, 246, 0.1));
109
+ }
110
+
111
+ /* Scrollbar styling for TOC */
112
+ .toc::-webkit-scrollbar {
113
+ width: 4px;
114
+ }
115
+
116
+ .toc::-webkit-scrollbar-track {
117
+ background: transparent;
118
+ }
119
+
120
+ .toc::-webkit-scrollbar-thumb {
121
+ background: var(--c-gray-300, #d1d5db);
122
+ border-radius: 2px;
123
+ }
124
+
125
+ .toc::-webkit-scrollbar-thumb:hover {
126
+ background: var(--c-gray-400, #9ca3af);
127
+ }
128
+
129
+ @media (max-width: 1280px) {
130
+ .toc {
131
+ width: 180px;
132
+ }
133
+ }
134
+
135
+ @media (max-width: 1024px) {
136
+ .toc {
137
+ display: none;
138
+ }
139
+ }
140
+ </style>
@@ -0,0 +1,83 @@
1
+ declare const document: any;
2
+ declare const localStorage: any;
3
+ declare const window: any;
4
+
5
+ /**
6
+ * MarkoPress Default Theme - Client-side Scripts
7
+ * Handles dark mode, sidebar, and other interactive features
8
+ */
9
+
10
+ declare global {
11
+ interface Window {
12
+ MarkoPressTheme?: {
13
+ toggleDarkMode: () => void;
14
+ toggleSidebar: () => void;
15
+ };
16
+ }
17
+ }
18
+
19
+ (function() {
20
+ 'use strict';
21
+
22
+ // Dark Mode Toggle
23
+ const darkModeToggle = document.getElementById('dark-mode-toggle');
24
+ const DARK_MODE_KEY = 'theme';
25
+
26
+ function initDarkMode() {
27
+ const currentTheme = localStorage.getItem(DARK_MODE_KEY) || 'light';
28
+ if (currentTheme === 'dark') {
29
+ document.body.classList.add('dark-mode');
30
+ if (darkModeToggle) {
31
+ darkModeToggle.textContent = '☀️';
32
+ }
33
+ }
34
+ }
35
+
36
+ function toggleDarkMode() {
37
+ document.body.classList.toggle('dark-mode');
38
+ const isDarkMode = document.body.classList.contains('dark-mode');
39
+ if (darkModeToggle) {
40
+ darkModeToggle.textContent = isDarkMode ? '☀️' : '🌙';
41
+ }
42
+ localStorage.setItem(DARK_MODE_KEY, isDarkMode ? 'dark' : 'light');
43
+ }
44
+
45
+ // Sidebar Toggle
46
+ const sidebarToggle = document.getElementById('sidebar-toggle');
47
+ const sidebar = document.getElementById('sidebar');
48
+
49
+ function toggleSidebar() {
50
+ if (sidebar) {
51
+ sidebar.classList.toggle('open');
52
+ }
53
+ }
54
+
55
+ // Initialize
56
+ function init() {
57
+ // Dark mode
58
+ if (darkModeToggle) {
59
+ initDarkMode();
60
+ darkModeToggle.addEventListener('click', toggleDarkMode);
61
+ }
62
+
63
+ // Sidebar
64
+ if (sidebarToggle) {
65
+ sidebarToggle.addEventListener('click', toggleSidebar);
66
+ }
67
+ }
68
+
69
+ // Run on DOM ready
70
+ if (document.readyState === 'loading') {
71
+ document.addEventListener('DOMContentLoaded', init);
72
+ } else {
73
+ init();
74
+ }
75
+
76
+ // Expose utilities globally
77
+ window.MarkoPressTheme = {
78
+ toggleDarkMode,
79
+ toggleSidebar,
80
+ };
81
+
82
+ console.log('[MarkoPress Theme] Initialized');
83
+ })();
@@ -0,0 +1,13 @@
1
+ <article class="blog-post">
2
+ <header>
3
+ <h1>${$global.title}</h1>
4
+ <div class="meta">
5
+ <span class="date">${$global.date || ''}</span>
6
+ <span class="author"> by ${$global.author || ''}</span>
7
+ </div>
8
+ </header>
9
+ <div class="content">
10
+ $!{$global.content}
11
+ </div>
12
+ </article>
13
+
@@ -0,0 +1,90 @@
1
+ import { renderMarkdown } from 'markopress/markdown';
2
+ import { promises as fs } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { config } from '{{CONFIG_PATH}}';
5
+ import { loadMarkdownModule, registerMarkdownContent } from '{{VITE_PLUGIN_PATH}}';
6
+
7
+ // Load module enhancements (sidebar, etc.) generated during build
8
+ let moduleEnhancements = {};
9
+ try {
10
+ const enhancementsPath = path.join(config.root, 'src/.generated/module-enhancements.json');
11
+ moduleEnhancements = await fs.readFile(enhancementsPath, 'utf-8').then(JSON.parse).catch(() => ({}));
12
+ } catch {
13
+ // Enhancements file not found, use empty object
14
+ }
15
+
16
+ export async function GET(context, next) {
17
+ const slug = context.params.slug || 'index';
18
+ const contentType = '{{CONTENT_TYPE}}'; // 'pages', 'blog', 'guides', etc.
19
+
20
+ // Build file path from content config
21
+ // Content paths in config are relative to config.root (e.g., ../content/pages)
22
+ // Get the content directory for this module
23
+ const contentConfig = config.content[contentType];
24
+ const contentDir = typeof contentConfig === 'string' ? contentConfig : contentConfig?.dir;
25
+
26
+ if (!contentDir) {
27
+ // No content directory configured for this type
28
+ return next();
29
+ }
30
+
31
+ // Resolve the full file path (contentDir is relative to config.root)
32
+ const filePath = path.join(config.root, contentDir, `${slug}.md`);
33
+
34
+ try {
35
+ // Check if file exists and read it
36
+ const source = await fs.readFile(filePath, 'utf-8').catch(() => null);
37
+
38
+ if (!source) {
39
+ // File not found - return 404
40
+ return new Response('Not Found', { status: 404, statusText: 'Not Found' });
41
+ }
42
+
43
+ // Render markdown at request time
44
+ const rendered = await renderMarkdown(source);
45
+
46
+ // Register the markdown content as a virtual Marko component
47
+ const contentId = `${contentType}/${slug}`;
48
+ await registerMarkdownContent(contentId, rendered.html);
49
+
50
+ // Import the virtual module (handled by vite plugin)
51
+ const contentComponent = (await loadMarkdownModule(`virtual:markdown-content/${contentId}`)).default;
52
+
53
+ // Set theme config from markopress.config.js (only after file is found)
54
+ context.navbar = config.theme.options.navbar || [];
55
+ context.lang = config.site.lang || 'en-US';
56
+ context.siteHead = config.site.head || [];
57
+ context.footer = config.theme.options.footer || null;
58
+
59
+ // Set context for template
60
+ context.title = rendered.frontmatter.title || slug;
61
+ context.description = rendered.frontmatter.description || '';
62
+ context.contentComponent = contentComponent;
63
+ context.slug = slug;
64
+
65
+ // Load module enhancements for this content type (sidebar, etc.)
66
+ const enhancements = moduleEnhancements[contentType] || {};
67
+ context.sidebar = enhancements.sidebar || null;
68
+
69
+ // TOC (table of contents) - extracted from headers
70
+ if (rendered.headers && rendered.headers.length > 0) {
71
+ context.toc = rendered.headers;
72
+ }
73
+
74
+ // Blog-specific fields
75
+ if (rendered.frontmatter.date) {
76
+ context.date = rendered.frontmatter.date;
77
+ }
78
+ if (rendered.frontmatter.author) {
79
+ context.author = rendered.frontmatter.author;
80
+ }
81
+ if (rendered.frontmatter.tags) {
82
+ context.tags = rendered.frontmatter.tags;
83
+ }
84
+
85
+ } catch (error) {
86
+ // Log error and return 404
87
+ console.error(`Error rendering ${contentType}/${slug}:`, error);
88
+ return new Response('Not Found', { status: 404, statusText: 'Not Found' });
89
+ }
90
+ }
@@ -0,0 +1,69 @@
1
+ <div class="content {{CONTENT_TYPE_CLASS}}">
2
+ <theme-body-top/>
3
+ <div class="content-layout">
4
+ <div class="content-body">
5
+ <h1>${$global.title}</h1>
6
+ <if=$global.description>
7
+ <p class="description">${$global.description}</p>
8
+ </if>
9
+ <if=$global.date>
10
+ <p class="meta">Published: ${$global.date}</p>
11
+ </if>
12
+ <if=$global.author>
13
+ <p class="meta">By ${$global.author}</p>
14
+ </if>
15
+ <if=$global.tags>
16
+ <p class="meta">
17
+ <for|tag| of=$global.tags>
18
+ <span class="tag">${tag}</span>
19
+ </for>
20
+ </p>
21
+ </if>
22
+ <hr>
23
+ <${$global.contentComponent || {}}>
24
+ <div>No content</div>
25
+ </${$global.contentComponent || {}}>
26
+ </div>
27
+ <if=$global.toc>
28
+ <toc headers=$global.toc/>
29
+ </if>
30
+ </div>
31
+ <theme-body-bottom/>
32
+ </div>
33
+
34
+ <style>
35
+ .content-layout {
36
+ display: flex;
37
+ gap: 32px;
38
+ max-width: 1100px;
39
+ margin: 0 auto;
40
+ position: relative;
41
+ }
42
+
43
+ .content-body {
44
+ flex: 1;
45
+ min-width: 0;
46
+ max-width: 100%;
47
+ }
48
+
49
+ .toc {
50
+ position: sticky;
51
+ top: 1rem;
52
+ width: 200px;
53
+ flex-shrink: 0;
54
+ }
55
+
56
+ .meta {
57
+ font-size: 0.875rem;
58
+ color: #666;
59
+ }
60
+
61
+ .tag {
62
+ display: inline-block;
63
+ background: #e5e7eb;
64
+ padding: 0.125rem 0.5rem;
65
+ border-radius: 4px;
66
+ margin-right: 0.5rem;
67
+ font-size: 0.75rem;
68
+ }
69
+ </style>
@@ -0,0 +1,6 @@
1
+ <div class="content">
2
+ <h1>${$global.title}</h1>
3
+ <div class="content-body">
4
+ $!{$global.content}
5
+ </div>
6
+ </div>