mordoc 0.1.13 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/LICENSE +7 -0
  2. package/bin/cli.js +24 -71
  3. package/dist/cli/asset-rewrite.d.ts +40 -0
  4. package/dist/cli/asset-rewrite.d.ts.map +1 -0
  5. package/dist/cli/asset-rewrite.js +67 -0
  6. package/dist/cli/asset-rewrite.js.map +1 -0
  7. package/dist/cli/build.d.ts +45 -15
  8. package/dist/cli/build.d.ts.map +1 -1
  9. package/dist/cli/build.js +186 -101
  10. package/dist/cli/build.js.map +1 -1
  11. package/dist/cli/dev.d.ts +26 -14
  12. package/dist/cli/dev.d.ts.map +1 -1
  13. package/dist/cli/dev.js +116 -159
  14. package/dist/cli/dev.js.map +1 -1
  15. package/dist/cli/pagefind-indexer.d.ts +15 -0
  16. package/dist/cli/pagefind-indexer.d.ts.map +1 -0
  17. package/dist/cli/pagefind-indexer.js +68 -0
  18. package/dist/cli/pagefind-indexer.js.map +1 -0
  19. package/dist/cli/paths.d.ts +26 -0
  20. package/dist/cli/paths.d.ts.map +1 -0
  21. package/dist/cli/paths.js +32 -0
  22. package/dist/cli/paths.js.map +1 -0
  23. package/dist/cli/ssg-runner.d.ts +58 -0
  24. package/dist/cli/ssg-runner.d.ts.map +1 -0
  25. package/dist/cli/ssg-runner.js +126 -0
  26. package/dist/cli/ssg-runner.js.map +1 -0
  27. package/dist/config/assets-loader.d.ts +11 -0
  28. package/dist/config/assets-loader.d.ts.map +1 -0
  29. package/dist/config/assets-loader.js +46 -0
  30. package/dist/config/assets-loader.js.map +1 -0
  31. package/dist/config/language-loader.d.ts +11 -0
  32. package/dist/config/language-loader.d.ts.map +1 -0
  33. package/dist/config/language-loader.js +61 -0
  34. package/dist/config/language-loader.js.map +1 -0
  35. package/dist/config/language.d.ts +11 -0
  36. package/dist/config/language.d.ts.map +1 -0
  37. package/dist/config/language.js +61 -0
  38. package/dist/config/language.js.map +1 -0
  39. package/dist/config/sidenav-loader.d.ts +14 -0
  40. package/dist/config/sidenav-loader.d.ts.map +1 -0
  41. package/dist/config/sidenav-loader.js +78 -0
  42. package/dist/config/sidenav-loader.js.map +1 -0
  43. package/dist/config/site-loader.d.ts +11 -0
  44. package/dist/config/site-loader.d.ts.map +1 -0
  45. package/dist/config/site-loader.js +72 -0
  46. package/dist/config/site-loader.js.map +1 -0
  47. package/dist/config/site.d.ts +11 -0
  48. package/dist/config/site.d.ts.map +1 -0
  49. package/dist/config/site.js +72 -0
  50. package/dist/config/site.js.map +1 -0
  51. package/dist/config/topnav-loader.d.ts +10 -0
  52. package/dist/config/topnav-loader.d.ts.map +1 -0
  53. package/dist/config/topnav-loader.js +78 -0
  54. package/dist/config/topnav-loader.js.map +1 -0
  55. package/dist/config/translations-loader.d.ts +7 -0
  56. package/dist/config/translations-loader.d.ts.map +1 -0
  57. package/dist/config/translations-loader.js +51 -0
  58. package/dist/config/translations-loader.js.map +1 -0
  59. package/dist/content/content-loader.d.ts +16 -0
  60. package/dist/content/content-loader.d.ts.map +1 -0
  61. package/dist/content/content-loader.js +126 -0
  62. package/dist/content/content-loader.js.map +1 -0
  63. package/dist/content/content-parser.d.ts +12 -0
  64. package/dist/content/content-parser.d.ts.map +1 -0
  65. package/dist/content/content-parser.js +54 -0
  66. package/dist/content/content-parser.js.map +1 -0
  67. package/dist/content/content-transformer.d.ts +17 -0
  68. package/dist/content/content-transformer.d.ts.map +1 -0
  69. package/dist/content/content-transformer.js +94 -0
  70. package/dist/content/content-transformer.js.map +1 -0
  71. package/dist/content/markdoc-config.d.ts +13 -0
  72. package/dist/content/markdoc-config.d.ts.map +1 -0
  73. package/dist/content/markdoc-config.js +210 -0
  74. package/dist/content/markdoc-config.js.map +1 -0
  75. package/dist/content/slug.d.ts +26 -0
  76. package/dist/content/slug.d.ts.map +1 -0
  77. package/dist/content/slug.js +31 -0
  78. package/dist/content/slug.js.map +1 -0
  79. package/dist/pipeline.d.ts +61 -0
  80. package/dist/pipeline.d.ts.map +1 -0
  81. package/dist/pipeline.js +123 -0
  82. package/dist/pipeline.js.map +1 -0
  83. package/dist/types/assets.d.ts +15 -0
  84. package/dist/types/assets.d.ts.map +1 -0
  85. package/dist/types/assets.js +2 -0
  86. package/dist/types/assets.js.map +1 -0
  87. package/dist/types/content.d.ts +114 -32
  88. package/dist/types/content.d.ts.map +1 -1
  89. package/dist/types/content.js +1 -6
  90. package/dist/types/content.js.map +1 -1
  91. package/dist/types/language.d.ts +9 -0
  92. package/dist/types/language.d.ts.map +1 -0
  93. package/dist/types/language.js +2 -0
  94. package/dist/types/language.js.map +1 -0
  95. package/dist/types/navigation.d.ts +24 -36
  96. package/dist/types/navigation.d.ts.map +1 -1
  97. package/dist/types/navigation.js +1 -6
  98. package/dist/types/navigation.js.map +1 -1
  99. package/dist/types/pipeline.d.ts +70 -0
  100. package/dist/types/pipeline.d.ts.map +1 -0
  101. package/dist/types/pipeline.js +2 -0
  102. package/dist/types/pipeline.js.map +1 -0
  103. package/dist/types/site.d.ts +20 -0
  104. package/dist/types/site.d.ts.map +1 -0
  105. package/dist/types/site.js +2 -0
  106. package/dist/types/site.js.map +1 -0
  107. package/dist/utils/lang-utils.d.ts +23 -0
  108. package/dist/utils/lang-utils.d.ts.map +1 -0
  109. package/dist/utils/lang-utils.js +40 -0
  110. package/dist/utils/lang-utils.js.map +1 -0
  111. package/dist/utils/paths.d.ts +25 -0
  112. package/dist/utils/paths.d.ts.map +1 -0
  113. package/dist/utils/paths.js +31 -0
  114. package/dist/utils/paths.js.map +1 -0
  115. package/dist/vite/plugin.d.ts +93 -0
  116. package/dist/vite/plugin.d.ts.map +1 -0
  117. package/dist/vite/plugin.js +435 -0
  118. package/dist/vite/plugin.js.map +1 -0
  119. package/package.json +46 -61
  120. package/src/app/App.module.css +82 -0
  121. package/src/app/App.tsx +95 -0
  122. package/src/app/content/Content.module.css +357 -0
  123. package/src/app/content/Content.tsx +212 -0
  124. package/src/app/content/callout/Callout.module.css +110 -0
  125. package/src/app/content/callout/Callout.tsx +82 -0
  126. package/src/app/content/card/Card.module.css +146 -0
  127. package/src/app/content/card/Card.tsx +110 -0
  128. package/src/app/content/card/CardGrid.module.css +22 -0
  129. package/src/app/content/card/CardGrid.tsx +34 -0
  130. package/src/app/content/code-block/CodeBlock.module.css +237 -0
  131. package/src/app/content/code-block/CodeBlock.tsx +123 -0
  132. package/src/app/content/heading/Heading.module.css +52 -0
  133. package/src/app/content/heading/Heading.tsx +75 -0
  134. package/src/app/content/image/Image.module.css +113 -0
  135. package/src/app/content/image/Image.tsx +98 -0
  136. package/src/app/content/link/ContentLink.tsx +46 -0
  137. package/src/app/data-context.tsx +39 -0
  138. package/src/app/entry-server.tsx +58 -0
  139. package/src/app/footer/Footer.module.css +36 -0
  140. package/src/app/footer/Footer.tsx +28 -0
  141. package/src/app/globals.d.ts +40 -0
  142. package/src/app/header/Header.module.css +205 -0
  143. package/src/app/header/Header.tsx +188 -0
  144. package/src/app/header/LanguagePicker.module.css +97 -0
  145. package/src/app/header/LanguagePicker.tsx +174 -0
  146. package/src/app/header/SearchBar.module.css +92 -0
  147. package/src/app/header/SearchBar.tsx +37 -0
  148. package/src/app/header/SearchModal.module.css +185 -0
  149. package/src/app/header/SearchModal.tsx +245 -0
  150. package/src/app/header/Topnav.module.css +37 -0
  151. package/src/app/header/Topnav.tsx +30 -0
  152. package/src/app/index.css +119 -0
  153. package/src/app/index.html +13 -0
  154. package/src/app/landing/LandingPage.module.css +14 -0
  155. package/src/app/landing/LandingPage.tsx +62 -0
  156. package/src/app/landing/button/Button.module.css +37 -0
  157. package/src/app/landing/button/Button.tsx +50 -0
  158. package/src/app/landing/hero/Hero.module.css +108 -0
  159. package/src/app/landing/hero/Hero.tsx +81 -0
  160. package/src/app/landing/section/Section.module.css +100 -0
  161. package/src/app/landing/section/Section.tsx +61 -0
  162. package/src/app/lang-utils.ts +11 -0
  163. package/src/app/main.tsx +67 -0
  164. package/src/app/not-found/NotFound.module.css +92 -0
  165. package/src/app/not-found/NotFound.tsx +34 -0
  166. package/src/app/routes.tsx +86 -0
  167. package/src/app/sidenav/Sidenav.module.css +239 -0
  168. package/src/app/sidenav/Sidenav.tsx +182 -0
  169. package/src/app/skeleton/Skeleton.module.css +100 -0
  170. package/src/app/skeleton/Skeleton.tsx +75 -0
  171. package/src/app/toc/Toc.module.css +59 -0
  172. package/src/app/toc/Toc.tsx +77 -0
  173. package/src/app/tsconfig.json +18 -0
  174. package/src/app/virtual-modules.d.ts +74 -0
  175. package/dist/assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
  176. package/dist/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf +0 -0
  177. package/dist/assets/fonts/inter/OFL.txt +0 -93
  178. package/dist/build/Builder.d.ts +0 -92
  179. package/dist/build/Builder.d.ts.map +0 -1
  180. package/dist/build/Builder.js +0 -394
  181. package/dist/build/Builder.js.map +0 -1
  182. package/dist/build/ClientBundler.d.ts +0 -48
  183. package/dist/build/ClientBundler.d.ts.map +0 -1
  184. package/dist/build/ClientBundler.js +0 -169
  185. package/dist/build/ClientBundler.js.map +0 -1
  186. package/dist/build/HtmlGenerator.d.ts +0 -46
  187. package/dist/build/HtmlGenerator.d.ts.map +0 -1
  188. package/dist/build/HtmlGenerator.js +0 -190
  189. package/dist/build/HtmlGenerator.js.map +0 -1
  190. package/dist/build/SearchIndexer.d.ts +0 -31
  191. package/dist/build/SearchIndexer.d.ts.map +0 -1
  192. package/dist/build/SearchIndexer.js +0 -116
  193. package/dist/build/SearchIndexer.js.map +0 -1
  194. package/dist/bundles/client.js +0 -126
  195. package/dist/cli/create-app.d.ts +0 -14
  196. package/dist/cli/create-app.d.ts.map +0 -1
  197. package/dist/cli/create-app.js +0 -241
  198. package/dist/cli/create-app.js.map +0 -1
  199. package/dist/client/App.d.ts +0 -17
  200. package/dist/client/App.d.ts.map +0 -1
  201. package/dist/client/App.js +0 -91
  202. package/dist/client/App.js.map +0 -1
  203. package/dist/client/contexts/ConfigContext.d.ts +0 -22
  204. package/dist/client/contexts/ConfigContext.d.ts.map +0 -1
  205. package/dist/client/contexts/ConfigContext.js +0 -27
  206. package/dist/client/contexts/ConfigContext.js.map +0 -1
  207. package/dist/client/contexts/ContentContext.d.ts +0 -31
  208. package/dist/client/contexts/ContentContext.d.ts.map +0 -1
  209. package/dist/client/contexts/ContentContext.js +0 -46
  210. package/dist/client/contexts/ContentContext.js.map +0 -1
  211. package/dist/client/contexts/SearchContext.d.ts +0 -38
  212. package/dist/client/contexts/SearchContext.d.ts.map +0 -1
  213. package/dist/client/contexts/SearchContext.js +0 -185
  214. package/dist/client/contexts/SearchContext.js.map +0 -1
  215. package/dist/client/contexts/ThemeContext.d.ts +0 -23
  216. package/dist/client/contexts/ThemeContext.d.ts.map +0 -1
  217. package/dist/client/contexts/ThemeContext.js +0 -53
  218. package/dist/client/contexts/ThemeContext.js.map +0 -1
  219. package/dist/client/hooks/useContent.d.ts +0 -12
  220. package/dist/client/hooks/useContent.d.ts.map +0 -1
  221. package/dist/client/hooks/useContent.js +0 -74
  222. package/dist/client/hooks/useContent.js.map +0 -1
  223. package/dist/client/hooks/useNavigation.d.ts +0 -15
  224. package/dist/client/hooks/useNavigation.d.ts.map +0 -1
  225. package/dist/client/hooks/useNavigation.js +0 -101
  226. package/dist/client/hooks/useNavigation.js.map +0 -1
  227. package/dist/client/hooks/useSearch.d.ts +0 -22
  228. package/dist/client/hooks/useSearch.d.ts.map +0 -1
  229. package/dist/client/hooks/useSearch.js +0 -64
  230. package/dist/client/hooks/useSearch.js.map +0 -1
  231. package/dist/client/main.d.ts +0 -5
  232. package/dist/client/main.d.ts.map +0 -1
  233. package/dist/client/main.js +0 -66
  234. package/dist/client/main.js.map +0 -1
  235. package/dist/components/Callout.d.ts +0 -9
  236. package/dist/components/Callout.d.ts.map +0 -1
  237. package/dist/components/Callout.js +0 -24
  238. package/dist/components/Callout.js.map +0 -1
  239. package/dist/components/Card.d.ts +0 -10
  240. package/dist/components/Card.d.ts.map +0 -1
  241. package/dist/components/Card.js +0 -15
  242. package/dist/components/Card.js.map +0 -1
  243. package/dist/components/CardGrid.d.ts +0 -8
  244. package/dist/components/CardGrid.d.ts.map +0 -1
  245. package/dist/components/CardGrid.js +0 -9
  246. package/dist/components/CardGrid.js.map +0 -1
  247. package/dist/components/CodeBlock.d.ts +0 -28
  248. package/dist/components/CodeBlock.d.ts.map +0 -1
  249. package/dist/components/CodeBlock.js +0 -80
  250. package/dist/components/CodeBlock.js.map +0 -1
  251. package/dist/components/ContentPage.d.ts +0 -9
  252. package/dist/components/ContentPage.d.ts.map +0 -1
  253. package/dist/components/ContentPage.js +0 -102
  254. package/dist/components/ContentPage.js.map +0 -1
  255. package/dist/components/Header.d.ts +0 -14
  256. package/dist/components/Header.d.ts.map +0 -1
  257. package/dist/components/Header.js +0 -30
  258. package/dist/components/Header.js.map +0 -1
  259. package/dist/components/Heading.d.ts +0 -16
  260. package/dist/components/Heading.d.ts.map +0 -1
  261. package/dist/components/Heading.js +0 -31
  262. package/dist/components/Heading.js.map +0 -1
  263. package/dist/components/Image.d.ts +0 -8
  264. package/dist/components/Image.d.ts.map +0 -1
  265. package/dist/components/Image.js +0 -24
  266. package/dist/components/Image.js.map +0 -1
  267. package/dist/components/Layout.d.ts +0 -14
  268. package/dist/components/Layout.d.ts.map +0 -1
  269. package/dist/components/Layout.js +0 -32
  270. package/dist/components/Layout.js.map +0 -1
  271. package/dist/components/MarkdocRenderer.d.ts +0 -15
  272. package/dist/components/MarkdocRenderer.d.ts.map +0 -1
  273. package/dist/components/MarkdocRenderer.js +0 -73
  274. package/dist/components/MarkdocRenderer.js.map +0 -1
  275. package/dist/components/MobileMenu.d.ts +0 -14
  276. package/dist/components/MobileMenu.d.ts.map +0 -1
  277. package/dist/components/MobileMenu.js +0 -45
  278. package/dist/components/MobileMenu.js.map +0 -1
  279. package/dist/components/PageNavigation.d.ts +0 -9
  280. package/dist/components/PageNavigation.d.ts.map +0 -1
  281. package/dist/components/PageNavigation.js +0 -23
  282. package/dist/components/PageNavigation.js.map +0 -1
  283. package/dist/components/SearchModal.d.ts +0 -9
  284. package/dist/components/SearchModal.d.ts.map +0 -1
  285. package/dist/components/SearchModal.js +0 -74
  286. package/dist/components/SearchModal.js.map +0 -1
  287. package/dist/components/SideNav.d.ts +0 -9
  288. package/dist/components/SideNav.d.ts.map +0 -1
  289. package/dist/components/SideNav.js +0 -66
  290. package/dist/components/SideNav.js.map +0 -1
  291. package/dist/components/TableOfContents.d.ts +0 -10
  292. package/dist/components/TableOfContents.d.ts.map +0 -1
  293. package/dist/components/TableOfContents.js +0 -151
  294. package/dist/components/TableOfContents.js.map +0 -1
  295. package/dist/config/ConfigLoader.d.ts +0 -50
  296. package/dist/config/ConfigLoader.d.ts.map +0 -1
  297. package/dist/config/ConfigLoader.js +0 -214
  298. package/dist/config/ConfigLoader.js.map +0 -1
  299. package/dist/config/StyleCompiler.d.ts +0 -17
  300. package/dist/config/StyleCompiler.d.ts.map +0 -1
  301. package/dist/config/StyleCompiler.js +0 -116
  302. package/dist/config/StyleCompiler.js.map +0 -1
  303. package/dist/config/ThemeGenerator.d.ts +0 -14
  304. package/dist/config/ThemeGenerator.d.ts.map +0 -1
  305. package/dist/config/ThemeGenerator.js +0 -129
  306. package/dist/config/ThemeGenerator.js.map +0 -1
  307. package/dist/content/ContentLoader.d.ts +0 -70
  308. package/dist/content/ContentLoader.d.ts.map +0 -1
  309. package/dist/content/ContentLoader.js +0 -146
  310. package/dist/content/ContentLoader.js.map +0 -1
  311. package/dist/content/ContentProcessor.d.ts +0 -84
  312. package/dist/content/ContentProcessor.d.ts.map +0 -1
  313. package/dist/content/ContentProcessor.js +0 -380
  314. package/dist/content/ContentProcessor.js.map +0 -1
  315. package/dist/content/RouteManager.d.ts +0 -69
  316. package/dist/content/RouteManager.d.ts.map +0 -1
  317. package/dist/content/RouteManager.js +0 -143
  318. package/dist/content/RouteManager.js.map +0 -1
  319. package/dist/styles/components/callout.d.ts +0 -11
  320. package/dist/styles/components/callout.d.ts.map +0 -1
  321. package/dist/styles/components/callout.js +0 -87
  322. package/dist/styles/components/callout.js.map +0 -1
  323. package/dist/styles/components/card.d.ts +0 -11
  324. package/dist/styles/components/card.d.ts.map +0 -1
  325. package/dist/styles/components/card.js +0 -179
  326. package/dist/styles/components/card.js.map +0 -1
  327. package/dist/styles/components/codeblock.d.ts +0 -11
  328. package/dist/styles/components/codeblock.d.ts.map +0 -1
  329. package/dist/styles/components/codeblock.js +0 -251
  330. package/dist/styles/components/codeblock.js.map +0 -1
  331. package/dist/styles/components/content.d.ts +0 -11
  332. package/dist/styles/components/content.d.ts.map +0 -1
  333. package/dist/styles/components/content.js +0 -197
  334. package/dist/styles/components/content.js.map +0 -1
  335. package/dist/styles/components/fonts.d.ts +0 -11
  336. package/dist/styles/components/fonts.d.ts.map +0 -1
  337. package/dist/styles/components/fonts.js +0 -34
  338. package/dist/styles/components/fonts.js.map +0 -1
  339. package/dist/styles/components/header.d.ts +0 -11
  340. package/dist/styles/components/header.d.ts.map +0 -1
  341. package/dist/styles/components/header.js +0 -293
  342. package/dist/styles/components/header.js.map +0 -1
  343. package/dist/styles/components/heading.d.ts +0 -11
  344. package/dist/styles/components/heading.d.ts.map +0 -1
  345. package/dist/styles/components/heading.js +0 -115
  346. package/dist/styles/components/heading.js.map +0 -1
  347. package/dist/styles/components/layout.d.ts +0 -11
  348. package/dist/styles/components/layout.d.ts.map +0 -1
  349. package/dist/styles/components/layout.js +0 -79
  350. package/dist/styles/components/layout.js.map +0 -1
  351. package/dist/styles/components/mobilemenu.d.ts +0 -11
  352. package/dist/styles/components/mobilemenu.d.ts.map +0 -1
  353. package/dist/styles/components/mobilemenu.js +0 -112
  354. package/dist/styles/components/mobilemenu.js.map +0 -1
  355. package/dist/styles/components/reset.d.ts +0 -11
  356. package/dist/styles/components/reset.d.ts.map +0 -1
  357. package/dist/styles/components/reset.js +0 -131
  358. package/dist/styles/components/reset.js.map +0 -1
  359. package/dist/styles/components/searchmodal.d.ts +0 -11
  360. package/dist/styles/components/searchmodal.d.ts.map +0 -1
  361. package/dist/styles/components/searchmodal.js +0 -333
  362. package/dist/styles/components/searchmodal.js.map +0 -1
  363. package/dist/styles/components/sidenav.d.ts +0 -11
  364. package/dist/styles/components/sidenav.d.ts.map +0 -1
  365. package/dist/styles/components/sidenav.js +0 -212
  366. package/dist/styles/components/sidenav.js.map +0 -1
  367. package/dist/styles/components/toc.d.ts +0 -11
  368. package/dist/styles/components/toc.d.ts.map +0 -1
  369. package/dist/styles/components/toc.js +0 -120
  370. package/dist/styles/components/toc.js.map +0 -1
  371. package/dist/styles/components/typography.d.ts +0 -11
  372. package/dist/styles/components/typography.d.ts.map +0 -1
  373. package/dist/styles/components/typography.js +0 -248
  374. package/dist/styles/components/typography.js.map +0 -1
  375. package/dist/styles/components/utility.d.ts +0 -11
  376. package/dist/styles/components/utility.d.ts.map +0 -1
  377. package/dist/styles/components/utility.js +0 -231
  378. package/dist/styles/components/utility.js.map +0 -1
  379. package/dist/styles/types.d.ts +0 -79
  380. package/dist/styles/types.d.ts.map +0 -1
  381. package/dist/styles/types.js +0 -7
  382. package/dist/styles/types.js.map +0 -1
  383. package/dist/styles/utils.d.ts +0 -21
  384. package/dist/styles/utils.d.ts.map +0 -1
  385. package/dist/styles/utils.js +0 -50
  386. package/dist/styles/utils.js.map +0 -1
  387. package/dist/styles/variables/main.d.ts +0 -15
  388. package/dist/styles/variables/main.d.ts.map +0 -1
  389. package/dist/styles/variables/main.js +0 -116
  390. package/dist/styles/variables/main.js.map +0 -1
  391. package/dist/types/config.d.ts +0 -43
  392. package/dist/types/config.d.ts.map +0 -1
  393. package/dist/types/config.js +0 -7
  394. package/dist/types/config.js.map +0 -1
  395. package/dist/utils/language-utils.d.ts +0 -41
  396. package/dist/utils/language-utils.d.ts.map +0 -1
  397. package/dist/utils/language-utils.js +0 -79
  398. package/dist/utils/language-utils.js.map +0 -1
  399. package/dist/utils/slugify.d.ts +0 -20
  400. package/dist/utils/slugify.d.ts.map +0 -1
  401. package/dist/utils/slugify.js +0 -44
  402. package/dist/utils/slugify.js.map +0 -1
  403. package/templates/default/config/favicon.ico +0 -0
  404. package/templates/default/config/logo-dark.png +0 -0
  405. package/templates/default/config/logo.png +0 -0
  406. package/templates/default/config/sidenav.yaml +0 -36
  407. package/templates/default/config/site.json +0 -16
  408. package/templates/default/config/styles/main.json +0 -6
  409. package/templates/default/config/styles/typography.json +0 -6
  410. package/templates/default/content/en/changelog.md +0 -35
  411. package/templates/default/content/en/faq.md +0 -50
  412. package/templates/default/content/en/field-manual/engines.md +0 -59
  413. package/templates/default/content/en/field-manual/relativity.md +0 -46
  414. package/templates/default/content/en/field-manual/safety.md +0 -44
  415. package/templates/default/content/en/field-manual.md +0 -22
  416. package/templates/default/content/en/flight-school/navigation.md +0 -61
  417. package/templates/default/content/en/flight-school/primer.md +0 -64
  418. package/templates/default/content/en/flight-school.md +0 -48
  419. package/templates/default/content/en/index.md +0 -83
  420. package/templates/default/content/en/ship-systems/flux-sails.md +0 -33
  421. package/templates/default/content/en/ship-systems/photonic-core.md +0 -39
  422. package/templates/default/content/en/ship-systems.md +0 -25
  423. package/templates/default/package.json +0 -21
  424. package/templates/default/public/icons/academy.svg +0 -15
  425. package/templates/default/public/icons/manual.svg +0 -16
  426. package/templates/default/public/icons/relativity.svg +0 -16
  427. package/templates/default/public/icons/systems.svg +0 -14
  428. package/templates/default/public/icons/warning.svg +0 -14
  429. package/templates/default/public/images/flux-sails.svg +0 -33
  430. package/templates/default/public/images/photonic-core.svg +0 -44
  431. package/templates/default/public/images/starwake.svg +0 -49
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Fallback route component for paths that don't match any page.
3
+ *
4
+ * Mirrors the article-column layout (same max-width, padding, and tokens as
5
+ * Content.tsx) so the 404 page feels like a natural part of the docs rather
6
+ * than an unstyled fallback. No TOC column — there's nothing to link to.
7
+ *
8
+ * On the client this is purely visual — CSR has no concept of an HTTP status
9
+ * code. The SSR/SSG steps also respond with an actual 404 status alongside
10
+ * rendering this component.
11
+ */
12
+
13
+ import { Link, useLocation } from 'react-router';
14
+ import { Footer } from '../footer/Footer.js';
15
+ import styles from './NotFound.module.css';
16
+
17
+ export function NotFound() {
18
+ const location = useLocation();
19
+ return (
20
+ <div className={styles.page}>
21
+ <div className={styles.articleArea}>
22
+ <div className={styles.article}>
23
+ <p className={styles.code404} aria-hidden="true">404</p>
24
+ <h1 className={styles.title}>Page not found</h1>
25
+ <p className={styles.description}>
26
+ No page exists at <code className={styles.path}>{location.pathname}</code>.
27
+ </p>
28
+ <Link to="/" className={styles.homeButton}>Go home</Link>
29
+ </div>
30
+ </div>
31
+ <Footer />
32
+ </div>
33
+ );
34
+ }
@@ -0,0 +1,86 @@
1
+ import type { HydrationState, RouteObject } from 'react-router';
2
+ import { createBrowserRouter } from 'react-router';
3
+ import pagesIndex from 'virtual:mordoc/pages-index';
4
+ import loaders from 'virtual:mordoc/page-loaders';
5
+ import { App } from './App.js';
6
+ import { Content } from './content/Content.js';
7
+ import { LandingPage } from './landing/LandingPage.js';
8
+ import { NotFound } from './not-found/NotFound.js';
9
+
10
+ /**
11
+ * Builds the React Router route config from Mordoc's eager virtual
12
+ * modules.
13
+ *
14
+ * Shape: one root layout route (`App`) whose children are all known
15
+ * pages plus a catch-all `*` for 404s. Absolute child paths are used
16
+ * so each route's `path` matches its `PageMeta.routePath` identity
17
+ * verbatim — no slice/join tricks, easier to reason about.
18
+ *
19
+ * Each route's `loader` resolves the matching lazy
20
+ * `virtual:mordoc/page/<routePath>` module via the pre-built
21
+ * `page-loaders` map. The map is what lets Vite statically code-split:
22
+ * every specifier inside it is a literal `import("...")` string.
23
+ *
24
+ * The same loader function runs in three contexts; only the runtime
25
+ * resolving the dynamic `import('virtual:mordoc/page/...')` differs:
26
+ * - Browser (CSR / post-hydration): native `import()` fetches the
27
+ * lazy chunk over HTTP (Vite-served virtual in dev, hashed JS in
28
+ * prod).
29
+ * - Dev SSR: Vite's `ssrLoadModule` resolves it through the plugin's
30
+ * `load` hook — the generated JS source is evaluated in Node.
31
+ * - SSG (later step): the bundled SSR output's module map resolves
32
+ * it at build time.
33
+ * The component code (`useLoaderData()`) and the data shape (`PageData`)
34
+ * are identical in all three; only the resolution mechanism changes.
35
+ *
36
+ * Kept as its own module so the SSR entry reuses the same route list
37
+ * against `createStaticHandler`/`createStaticRouter` without duplicating
38
+ * logic.
39
+ */
40
+ export function buildRoutes(): RouteObject[] {
41
+ const pageRoutes: RouteObject[] = pagesIndex.map((pageIndex) => {
42
+ const pageLoader = loaders[pageIndex.routePath];
43
+ if (!pageLoader) {
44
+ // Defensive: the plugin emits `page-loaders` and `pages-index` from the
45
+ // same pipeline output, so they should always agree. A mismatch
46
+ // here means the eager modules went out of sync — surface it
47
+ // loudly at app bootstrap rather than during navigation.
48
+ throw new Error(
49
+ `mordoc: no page loader found for routePath "${pageIndex.routePath}". ` +
50
+ `virtual:mordoc/pages-index and virtual:mordoc/page-loaders are out of sync.`,
51
+ );
52
+ }
53
+ const common = {
54
+ loader: async () => (await pageLoader()).default,
55
+ Component: pageIndex.layout === 'landing' ? LandingPage : Content,
56
+ handle: { language: pageIndex.language, routePath: pageIndex.routePath, layout: pageIndex.layout ?? 'content' },
57
+ };
58
+ return pageIndex.routePath === '/'
59
+ ? { index: true, ...common }
60
+ : { path: pageIndex.routePath, ...common };
61
+ });
62
+
63
+ return [
64
+ {
65
+ path: '/',
66
+ Component: App,
67
+ HydrateFallback: () => null,
68
+ children: [...pageRoutes, { path: '*', Component: NotFound }],
69
+ },
70
+ ];
71
+ }
72
+
73
+ /**
74
+ * Creates the browser-side data router. Consumed by `main.tsx`.
75
+ *
76
+ * `hydrationData` should be passed when SSR has run for the initial
77
+ * request — `<StaticRouterProvider>` serializes the loaders' results
78
+ * into a `<script>` tag at render time, exposed on the client as
79
+ * `window.__staticRouterHydrationData`. Threading it through here lets
80
+ * the data router skip re-running the initial route's loader (which
81
+ * would otherwise re-fetch the same lazy chunk that already produced
82
+ * the SSR HTML).
83
+ */
84
+ export function createAppRouter(hydrationData?: HydrationState) {
85
+ return createBrowserRouter(buildRoutes(), { hydrationData });
86
+ }
@@ -0,0 +1,239 @@
1
+ /* ============================================================
2
+ SIDENAV TOKENS
3
+ ============================================================ */
4
+ :root {
5
+ --sidebar-bg: #FAFAFA;
6
+ --sidebar-fg: #383838;
7
+ --sidebar-fg-muted: #666666;
8
+ --sidebar-border: #E5E5E5;
9
+ --sidebar-accent: #EFEFEF;
10
+ --sidebar-accent-fg: #1C1C1C;
11
+ --sidebar-group-label-fg: rgba(56, 56, 56, 0.7);
12
+ --sidebar-gap-y: 4px;
13
+ --sidebar-item-h: 36px;
14
+ --sidebar-group-h: 36px;
15
+ --sidebar-pad-x: 8px;
16
+ --sidebar-pad-y: 16px;
17
+ --sidebar-item-pad-x: 8px;
18
+ --sidebar-item-pad-y: 6px;
19
+ }
20
+
21
+ :global(.dark) {
22
+ --sidebar-bg: #0F0F0F;
23
+ --sidebar-fg: #D6D6D6;
24
+ --sidebar-fg-muted: #9E9E9E;
25
+ --sidebar-border: #292929;
26
+ --sidebar-accent: #1F1F1F;
27
+ --sidebar-accent-fg: #EBEBEB;
28
+ --sidebar-group-label-fg: rgba(214, 214, 214, 0.7);
29
+ }
30
+
31
+ /* ============================================================
32
+ SIDENAV — inner content only
33
+ Geometry (position / width / height / overflow) lives in App.module.css
34
+ ============================================================ */
35
+
36
+ .sidenav {
37
+ padding: var(--sidebar-pad-y) var(--sidebar-pad-x);
38
+ }
39
+
40
+ /* ── Menu list ───────────────────────────────────────────────── */
41
+
42
+ .menu {
43
+ display: flex;
44
+ flex-direction: column;
45
+ gap: 1px;
46
+ width: 100%;
47
+ list-style: none;
48
+ padding: 0;
49
+ margin: 0;
50
+ }
51
+
52
+ /* ── Menu item wrapper ───────────────────────────────────────── */
53
+
54
+ .menuItem {
55
+ width: 100%;
56
+ }
57
+
58
+ /* ============================================================
59
+ GROUP VARIANT 1 — non-linked trigger (no path, toggles whole row)
60
+ ============================================================ */
61
+
62
+ .groupLabelTrigger {
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: space-between;
66
+ width: 100%;
67
+ min-height: var(--sidebar-group-h);
68
+ padding: var(--sidebar-item-pad-y) var(--sidebar-item-pad-x);
69
+ margin-top: 10px;
70
+ border-radius: var(--radius-md);
71
+ background: none;
72
+ border: none;
73
+ font-size: 12px;
74
+ font-weight: 500;
75
+ line-height: 1.25;
76
+ letter-spacing: 0;
77
+ color: var(--sidebar-group-label-fg);
78
+ font-family: var(--font-sans);
79
+ cursor: pointer;
80
+ text-align: left;
81
+ transition: color 150ms ease, background-color 150ms ease;
82
+ }
83
+
84
+ .menuItem:first-child > .groupLabelTrigger {
85
+ margin-top: 0;
86
+ }
87
+
88
+ .groupLabelTrigger:hover {
89
+ background: var(--sidebar-accent);
90
+ }
91
+
92
+ .groupLabelText {
93
+ flex: 1;
94
+ }
95
+
96
+ /* ============================================================
97
+ GROUP VARIANT 2 — linked group label (whole row is one element)
98
+ ============================================================ */
99
+
100
+ .linkedGroupLabel {
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: space-between;
104
+ gap: 8px;
105
+ width: 100%;
106
+ min-height: var(--sidebar-group-h);
107
+ padding: var(--sidebar-item-pad-y) var(--sidebar-item-pad-x);
108
+ border-radius: var(--radius-md);
109
+ font-size: 14px;
110
+ font-weight: 500;
111
+ line-height: 1.25;
112
+ color: var(--sidebar-fg);
113
+ text-decoration: none;
114
+ cursor: pointer;
115
+ margin-top: 10px;
116
+ transition: color 150ms ease, background-color 150ms ease;
117
+ }
118
+
119
+ .menuItem:first-child > .linkedGroupLabel {
120
+ margin-top: 0;
121
+ }
122
+
123
+ .linkedGroupLabel:hover {
124
+ background: var(--sidebar-accent);
125
+ }
126
+
127
+ .linkedGroupLabel.linkActive {
128
+ color: var(--accent-emphasis);
129
+ background: var(--accent-subtle);
130
+ }
131
+
132
+ /* ============================================================
133
+ TOP-LEVEL LEAF LINK (depth=0, no children)
134
+ Matches group-label height/weight for visual consistency
135
+ ============================================================ */
136
+
137
+ .topLink {
138
+ display: flex;
139
+ align-items: center;
140
+ width: 100%;
141
+ min-height: var(--sidebar-group-h);
142
+ padding: var(--sidebar-item-pad-y) var(--sidebar-item-pad-x);
143
+ border-radius: var(--radius-md);
144
+ font-size: 14px;
145
+ font-weight: 500;
146
+ line-height: 1.25;
147
+ color: var(--sidebar-fg);
148
+ text-decoration: none;
149
+ transition: color 150ms ease, background-color 150ms ease;
150
+ }
151
+
152
+ .topLink:hover {
153
+ background: var(--sidebar-accent);
154
+ }
155
+
156
+ .topLink.topLinkActive {
157
+ background: var(--accent-subtle);
158
+ color: var(--accent-emphasis);
159
+ font-weight: 600;
160
+ }
161
+
162
+ /* ============================================================
163
+ NESTED LEAF LINK (depth>0)
164
+ Indented under a group, lighter weight
165
+ ============================================================ */
166
+
167
+ .navLink {
168
+ display: flex;
169
+ align-items: center;
170
+ width: 100%;
171
+ min-height: var(--sidebar-item-h);
172
+ padding: var(--sidebar-item-pad-y) 8px var(--sidebar-item-pad-y) 24px;
173
+ border-radius: var(--radius-md);
174
+ font-size: 14px;
175
+ font-weight: 400;
176
+ line-height: 1.4;
177
+ color: var(--sidebar-fg);
178
+ text-decoration: none;
179
+ transition: color 150ms ease, background-color 150ms ease;
180
+ }
181
+
182
+ .navLink:hover {
183
+ background: var(--sidebar-accent);
184
+ }
185
+
186
+ .navLink.navLinkActive {
187
+ background: var(--accent-subtle);
188
+ color: var(--accent-emphasis);
189
+ font-weight: 500;
190
+ }
191
+
192
+ /* ============================================================
193
+ GROUP CONTENT AREA — slight breathing room under label
194
+ ============================================================ */
195
+
196
+ .groupContent {
197
+ padding-top: 4px;
198
+ }
199
+
200
+ /* ============================================================
201
+ CHEVRON ICON
202
+ ============================================================ */
203
+
204
+ .chevron {
205
+ flex-shrink: 0;
206
+ color: var(--sidebar-fg-muted);
207
+ transition: transform 200ms ease;
208
+ }
209
+
210
+ .chevronOpen {
211
+ transform: rotate(180deg);
212
+ }
213
+
214
+ /* ============================================================
215
+ FOCUS STATES
216
+ ============================================================ */
217
+
218
+ .groupLabelTrigger:focus-visible,
219
+ .linkedGroupLabel:focus-visible,
220
+ .navLink:focus-visible,
221
+ .topLink:focus-visible {
222
+ outline: 2px solid var(--accent-emphasis);
223
+ outline-offset: -2px;
224
+ border-radius: var(--radius-md);
225
+ }
226
+
227
+ /* ============================================================
228
+ REDUCED MOTION
229
+ ============================================================ */
230
+
231
+ @media (prefers-reduced-motion: reduce) {
232
+ .groupLabelTrigger,
233
+ .linkedGroupLabel,
234
+ .navLink,
235
+ .topLink,
236
+ .chevron {
237
+ transition: none !important;
238
+ }
239
+ }
@@ -0,0 +1,182 @@
1
+ import React, { useState } from 'react';
2
+ import { NavLink, useLocation, useNavigate } from 'react-router';
3
+ import { useMordocData } from '../data-context.js';
4
+ import { detectCurrentLang, buildLangPrefix, stripLangPrefix, resolveLabel } from '../lang-utils.js';
5
+ import type { SidenavConfig, SidenavItem } from '../../types/navigation.js';
6
+ import styles from './Sidenav.module.css';
7
+
8
+ function ChevronIcon({ open }: { open: boolean }) {
9
+ return (
10
+ <svg
11
+ width="16"
12
+ height="16"
13
+ viewBox="0 0 24 24"
14
+ fill="none"
15
+ stroke="currentColor"
16
+ strokeWidth="2"
17
+ strokeLinecap="round"
18
+ strokeLinejoin="round"
19
+ aria-hidden="true"
20
+ className={`${styles.chevron} ${open ? styles.chevronOpen : ''}`}
21
+ >
22
+ <polyline points="6 9 12 15 18 9" />
23
+ </svg>
24
+ );
25
+ }
26
+
27
+ function groupContainsActive(items: SidenavConfig, activePath: string): boolean {
28
+ return items.some(
29
+ (item) =>
30
+ (item.path !== undefined && item.path === activePath) ||
31
+ (item.children !== undefined && groupContainsActive(item.children, activePath)),
32
+ );
33
+ }
34
+
35
+ function SidenavList({ items, depth = 0 }: { items: SidenavConfig; depth?: number }) {
36
+ return (
37
+ <ul className={styles.menu}>
38
+ {items.map((item, i) => (
39
+ <SidenavNode key={i} item={item} depth={depth} />
40
+ ))}
41
+ </ul>
42
+ );
43
+ }
44
+
45
+ function SidenavNode({ item, depth }: { item: SidenavItem; depth: number }) {
46
+ const location = useLocation();
47
+ const navigate = useNavigate();
48
+ const isGroupActive = item.children
49
+ ? groupContainsActive(item.children, location.pathname)
50
+ : false;
51
+ const isLabelActive = item.path ? location.pathname === item.path : false;
52
+ const [open, setOpen] = useState(isGroupActive || isLabelActive);
53
+
54
+ // Leaf item — path only, no children
55
+ if (item.path && !item.children) {
56
+ const isTop = depth === 0;
57
+ return (
58
+ <li className={styles.menuItem}>
59
+ <NavLink
60
+ to={item.path}
61
+ end
62
+ className={({ isActive }) =>
63
+ isTop
64
+ ? `${styles.topLink}${isActive ? ` ${styles.topLinkActive}` : ''}`
65
+ : `${styles.navLink}${isActive ? ` ${styles.navLinkActive}` : ''}`
66
+ }
67
+ >
68
+ {item.label}
69
+ </NavLink>
70
+ </li>
71
+ );
72
+ }
73
+
74
+ // Variant 2 — linked group: whole row navigates + toggles as one unit
75
+ if (item.path && item.children) {
76
+ function handleLinkedGroupClick(e: React.MouseEvent<HTMLAnchorElement>) {
77
+ e.preventDefault();
78
+ if (isLabelActive && open) {
79
+ setOpen(false);
80
+ } else {
81
+ setOpen(true);
82
+ if (!isLabelActive) navigate(item.path!);
83
+ }
84
+ }
85
+
86
+ return (
87
+ <li className={styles.menuItem}>
88
+ <a
89
+ href={item.path}
90
+ onClick={handleLinkedGroupClick}
91
+ aria-expanded={open}
92
+ className={isLabelActive ? `${styles.linkedGroupLabel} ${styles.linkActive}` : styles.linkedGroupLabel}
93
+ >
94
+ <span>{item.label}</span>
95
+ <ChevronIcon open={open} />
96
+ </a>
97
+ {open && (
98
+ <div className={styles.groupContent}>
99
+ <SidenavList items={item.children} depth={depth + 1} />
100
+ </div>
101
+ )}
102
+ </li>
103
+ );
104
+ }
105
+
106
+ // Variant 1 — non-linked group label, whole row toggles
107
+ return (
108
+ <li className={styles.menuItem}>
109
+ <button
110
+ className={styles.groupLabelTrigger}
111
+ onClick={() => setOpen((o) => !o)}
112
+ aria-expanded={open}
113
+ >
114
+ <span className={styles.groupLabelText}>{item.label}</span>
115
+ <ChevronIcon open={open} />
116
+ </button>
117
+ {open && item.children && (
118
+ <div className={styles.groupContent}>
119
+ <SidenavList items={item.children} depth={depth + 1} />
120
+ </div>
121
+ )}
122
+ </li>
123
+ );
124
+ }
125
+
126
+ function applyLangToSidenav(
127
+ items: SidenavConfig,
128
+ prefix: string,
129
+ lang: string,
130
+ defaultLanguage: string,
131
+ translations: Record<string, Record<string, string>>,
132
+ ): SidenavConfig {
133
+ return items.map((item) => ({
134
+ ...item,
135
+ label: resolveLabel(item.label, lang, defaultLanguage, translations),
136
+ path: item.path !== undefined ? `${prefix}${item.path}` : undefined,
137
+ children: item.children
138
+ ? applyLangToSidenav(item.children, prefix, lang, defaultLanguage, translations)
139
+ : undefined,
140
+ }));
141
+ }
142
+
143
+ function resolveActiveSidenav(
144
+ navigation: ReturnType<typeof useMordocData>['navigation'],
145
+ contentPath: string,
146
+ ): SidenavConfig {
147
+ if (navigation.kind === 'sidenav') return navigation.sidenav;
148
+
149
+ const match = navigation.topnav
150
+ .filter((item) => contentPath === item.path || contentPath.startsWith(item.path + '/'))
151
+ .sort((a, b) => b.path.length - a.path.length)[0];
152
+
153
+ return match?.sidenav ?? [];
154
+ }
155
+
156
+ export function Sidenav() {
157
+ const { navigation, language, site, translations } = useMordocData();
158
+ const { pathname } = useLocation();
159
+
160
+ const currentLang = detectCurrentLang(pathname, language, site.defaultLanguage);
161
+ const contentPath = stripLangPrefix(pathname, currentLang, site.defaultLanguage);
162
+ const sidenav = resolveActiveSidenav(navigation, contentPath);
163
+
164
+ if (sidenav.length === 0) {
165
+ return <nav className={styles.sidenav} aria-label="Side navigation" />;
166
+ }
167
+
168
+ const prefix = buildLangPrefix(currentLang, site.defaultLanguage);
169
+ const processedSidenav = applyLangToSidenav(
170
+ sidenav,
171
+ prefix,
172
+ currentLang,
173
+ site.defaultLanguage,
174
+ translations,
175
+ );
176
+
177
+ return (
178
+ <nav className={styles.sidenav} aria-label="Side navigation">
179
+ <SidenavList items={processedSidenav} depth={0} />
180
+ </nav>
181
+ );
182
+ }
@@ -0,0 +1,100 @@
1
+ /* ── Shimmer keyframe ────────────────────────────────────────── */
2
+
3
+ @keyframes shimmer {
4
+ 0% { background-position: -600px 0; }
5
+ 100% { background-position: 600px 0; }
6
+ }
7
+
8
+ /* ── Page shell — exact grid match to Content.module.css ────── */
9
+
10
+ /* Must use the same grid-template-columns as contentAreaGrid so that
11
+ the 1fr content column is the same width, keeping margin: 0 auto
12
+ centering identical between skeleton and real article. */
13
+ .page {
14
+ display: grid;
15
+ grid-template-columns: 1fr var(--toc-width);
16
+ grid-template-areas: "content toc";
17
+ min-height: calc(100svh - var(--header-total));
18
+ }
19
+
20
+ .articleArea {
21
+ grid-area: content;
22
+ min-width: 0;
23
+ }
24
+
25
+ .article {
26
+ max-width: var(--content-max-width);
27
+ width: 100%;
28
+ margin: 0 auto;
29
+ padding: 3rem 1.5rem;
30
+ }
31
+
32
+ @media (min-width: 768px) {
33
+ .article {
34
+ padding: 3rem 2rem;
35
+ }
36
+ }
37
+
38
+ /* Matches Content.module.css responsive collapse — TOC column disappears
39
+ below xl, so the content column becomes full width in both cases. */
40
+ @media (max-width: 1279.98px) {
41
+ .page {
42
+ grid-template-columns: 1fr;
43
+ grid-template-areas: "content";
44
+ }
45
+ }
46
+
47
+ /* ── Shimmer block — base primitive ─────────────────────────── */
48
+
49
+ /* Highlight travels from left to right using background-position.
50
+ background-size is fixed-pixel so the sweep width is constant
51
+ regardless of the block's rendered width. */
52
+ .block {
53
+ border-radius: var(--radius-sm);
54
+ background-image: linear-gradient(
55
+ 90deg,
56
+ var(--color-surface) 0px,
57
+ var(--color-border) 80px,
58
+ var(--color-surface) 160px
59
+ );
60
+ background-size: 600px 100%;
61
+ animation: shimmer 1.6s linear infinite;
62
+ }
63
+
64
+ /* ── Section layout ──────────────────────────────────────────── */
65
+
66
+ .breadcrumbRow {
67
+ margin-bottom: 1.25rem;
68
+ }
69
+
70
+ .header {
71
+ display: flex;
72
+ flex-direction: column;
73
+ gap: 0.75rem;
74
+ margin-bottom: 2.5rem;
75
+ padding-bottom: 1rem;
76
+ border-bottom: 1px solid var(--color-border);
77
+ }
78
+
79
+ .headerDesc {
80
+ display: flex;
81
+ flex-direction: column;
82
+ gap: 0.5rem;
83
+ margin-top: 0.25rem;
84
+ }
85
+
86
+ .prose {
87
+ display: flex;
88
+ flex-direction: column;
89
+ }
90
+
91
+ .paraGroup {
92
+ display: flex;
93
+ flex-direction: column;
94
+ gap: 0.5rem;
95
+ margin-bottom: 1.25rem;
96
+ }
97
+
98
+ .heading {
99
+ margin-bottom: 1rem;
100
+ }