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,185 @@
1
+ /* ============================================================
2
+ SEARCH MODAL TOKENS
3
+ ============================================================ */
4
+ :root {
5
+ --modal-max-width: 640px;
6
+ --modal-overlay-bg: rgba(0, 0, 0, 0.45);
7
+ --modal-bg: var(--color-bg);
8
+ --modal-border: var(--color-border);
9
+ --modal-shadow: 0 24px 64px rgba(0, 0, 0, 0.22);
10
+ --modal-input-size: 16px;
11
+ --modal-result-hover: var(--color-bg-hover);
12
+ --modal-result-selected: var(--accent-subtle);
13
+ }
14
+
15
+ :global(.dark) {
16
+ --modal-overlay-bg: rgba(0, 0, 0, 0.65);
17
+ }
18
+
19
+ /* ============================================================
20
+ OVERLAY — full-screen backdrop
21
+ ============================================================ */
22
+ .overlay {
23
+ position: fixed;
24
+ inset: 0;
25
+ z-index: 1000;
26
+ background: var(--modal-overlay-bg);
27
+ display: flex;
28
+ align-items: flex-start;
29
+ justify-content: center;
30
+ padding-top: 8vh;
31
+ padding-inline: 1rem;
32
+ }
33
+
34
+ /* ============================================================
35
+ MODAL SHELL
36
+ ============================================================ */
37
+ .modal {
38
+ width: 100%;
39
+ max-width: var(--modal-max-width);
40
+ background: var(--modal-bg);
41
+ border: 1px solid var(--modal-border);
42
+ border-radius: var(--radius-lg);
43
+ box-shadow: var(--modal-shadow);
44
+ overflow: hidden;
45
+ display: flex;
46
+ flex-direction: column;
47
+ }
48
+
49
+ /* ============================================================
50
+ INPUT ROW
51
+ ============================================================ */
52
+ .inputRow {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 10px;
56
+ padding: 0 14px;
57
+ height: 54px;
58
+ border-bottom: 1px solid var(--modal-border);
59
+ flex-shrink: 0;
60
+ }
61
+
62
+ .searchIcon {
63
+ color: var(--color-fg-muted);
64
+ flex-shrink: 0;
65
+ }
66
+
67
+ .input {
68
+ flex: 1;
69
+ background: none;
70
+ border: none;
71
+ outline: none;
72
+ font-family: var(--font-sans);
73
+ font-size: var(--modal-input-size);
74
+ color: var(--color-fg);
75
+ min-width: 0;
76
+ }
77
+
78
+ .input::placeholder {
79
+ color: var(--color-fg-muted);
80
+ }
81
+
82
+ .input:disabled {
83
+ cursor: not-allowed;
84
+ }
85
+
86
+ .closeBtn {
87
+ display: flex;
88
+ align-items: center;
89
+ background: none;
90
+ border: none;
91
+ padding: 0;
92
+ cursor: pointer;
93
+ flex-shrink: 0;
94
+ }
95
+
96
+ .closeBtn kbd {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ padding: 2px 7px;
100
+ border: 1px solid var(--color-border);
101
+ border-radius: var(--radius-sm);
102
+ font-family: var(--font-mono);
103
+ font-size: 11px;
104
+ font-weight: 500;
105
+ color: var(--color-fg-muted);
106
+ background: var(--color-surface);
107
+ }
108
+
109
+ /* ============================================================
110
+ STATUS / NOTICES
111
+ ============================================================ */
112
+ .notice,
113
+ .status {
114
+ padding: 20px 16px;
115
+ color: var(--color-fg-muted);
116
+ font-size: 13px;
117
+ text-align: center;
118
+ line-height: 1.6;
119
+ }
120
+
121
+ .notice code {
122
+ font-family: var(--font-mono);
123
+ font-size: 12px;
124
+ background: var(--color-surface);
125
+ padding: 1px 5px;
126
+ border-radius: var(--radius-sm);
127
+ border: 1px solid var(--color-border);
128
+ }
129
+
130
+ /* ============================================================
131
+ RESULTS LIST
132
+ ============================================================ */
133
+ .results {
134
+ list-style: none;
135
+ margin: 0;
136
+ padding: 6px;
137
+ max-height: 420px;
138
+ overflow-y: auto;
139
+ }
140
+
141
+ .result {
142
+ display: flex;
143
+ flex-direction: column;
144
+ gap: 3px;
145
+ padding: 10px 12px;
146
+ border-radius: var(--radius-md);
147
+ cursor: pointer;
148
+ transition: background-color 0.1s;
149
+ }
150
+
151
+ .result:hover {
152
+ background: var(--modal-result-hover);
153
+ }
154
+
155
+ .resultSelected {
156
+ background: var(--modal-result-selected);
157
+ }
158
+
159
+ .resultTitle {
160
+ font-size: 14px;
161
+ font-weight: 500;
162
+ color: var(--color-fg);
163
+ white-space: nowrap;
164
+ overflow: hidden;
165
+ text-overflow: ellipsis;
166
+ }
167
+
168
+ .resultExcerpt {
169
+ font-size: 12px;
170
+ color: var(--color-fg-muted);
171
+ line-height: 1.55;
172
+ display: -webkit-box;
173
+ -webkit-line-clamp: 2;
174
+ -webkit-box-orient: vertical;
175
+ overflow: hidden;
176
+ }
177
+
178
+ /* Pagefind wraps matched terms in <mark> for highlighting */
179
+ .resultExcerpt :global(mark) {
180
+ background: var(--accent-muted);
181
+ color: var(--color-fg);
182
+ border-radius: 2px;
183
+ padding: 0 2px;
184
+ font-style: normal;
185
+ }
@@ -0,0 +1,245 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import { useNavigate } from 'react-router';
3
+ import styles from './SearchModal.module.css';
4
+
5
+ // Module-level singleton so the loaded Pagefind instance is reused across
6
+ // open/close cycles. Replaced atomically when the language changes.
7
+ let pf: PagefindAPI | null = null;
8
+ let pfLoadPromise: Promise<void> | null = null;
9
+ let currentIndexPath: string | null = null;
10
+
11
+ /**
12
+ * Loads (or switches to) the Pagefind index at `indexPath`.
13
+ *
14
+ * Called from App.tsx on every language change, including the initial mount.
15
+ * Switching languages:
16
+ * 1. Destroys the previous Pagefind instance to release index memory.
17
+ * 2. Resets module state so any in-progress search awaits the new index.
18
+ * 3. Starts fetching the new index manifest in the background.
19
+ *
20
+ * Race-condition guard: if another switch fires before this load completes,
21
+ * the stale `.then()` handler checks `currentIndexPath` and discards itself.
22
+ */
23
+ export function switchPagefind(indexPath: string): void {
24
+ if (indexPath === currentIndexPath) return;
25
+
26
+ pf?.destroy?.();
27
+ pf = null;
28
+ pfLoadPromise = null;
29
+ currentIndexPath = indexPath;
30
+
31
+ pfLoadPromise = import(/* @vite-ignore */ indexPath)
32
+ .then(async (mod) => {
33
+ if (currentIndexPath !== indexPath) return; // superseded by a later switch
34
+ pf = mod as PagefindAPI;
35
+ await mod.init?.();
36
+ })
37
+ .catch(() => {
38
+ if (currentIndexPath === indexPath) {
39
+ pf = null;
40
+ pfLoadPromise = null;
41
+ currentIndexPath = null;
42
+ }
43
+ });
44
+ }
45
+
46
+ interface SearchModalProps {
47
+ open: boolean;
48
+ onClose: () => void;
49
+ }
50
+
51
+ interface SearchResult {
52
+ id: string;
53
+ url: string;
54
+ title: string;
55
+ excerpt: string;
56
+ }
57
+
58
+ /**
59
+ * Full-screen search modal with Pagefind-powered results.
60
+ *
61
+ * Dev mode: shows the input disabled with a "build required" notice, since
62
+ * the Pagefind index only exists after `mordoc build` has run.
63
+ *
64
+ * Production: queries the preloaded Pagefind index on every keystroke
65
+ * (debounced). If the index is still loading when the user types, the
66
+ * component awaits the load promise before running the query.
67
+ *
68
+ * Keyboard navigation: ↑/↓ moves between results, Enter navigates, Esc closes.
69
+ *
70
+ * Result excerpts use dangerouslySetInnerHTML for Pagefind's <mark> highlights.
71
+ * This is safe — the content comes from our own indexed pages, not user input.
72
+ */
73
+ export function SearchModal({ open, onClose }: SearchModalProps) {
74
+ const [query, setQuery] = useState('');
75
+ const [results, setResults] = useState<SearchResult[]>([]);
76
+ const [selectedIndex, setSelectedIndex] = useState(0);
77
+ const [isLoading, setIsLoading] = useState(false);
78
+ const inputRef = useRef<HTMLInputElement>(null);
79
+ const navigate = useNavigate();
80
+
81
+ const isDev = import.meta.env.DEV;
82
+
83
+ // Focus input on open; reset state on close
84
+ useEffect(() => {
85
+ if (open) {
86
+ setQuery('');
87
+ setResults([]);
88
+ setSelectedIndex(0);
89
+ requestAnimationFrame(() => inputRef.current?.focus());
90
+ }
91
+ }, [open]);
92
+
93
+ // Global Escape listener — handles dev mode where the disabled input
94
+ // swallows keyboard events and they never reach the modal's onKeyDown.
95
+ useEffect(() => {
96
+ if (!open) return;
97
+ function handleEscape(e: KeyboardEvent) {
98
+ if (e.key === 'Escape') onClose();
99
+ }
100
+ document.addEventListener('keydown', handleEscape);
101
+ return () => document.removeEventListener('keydown', handleEscape);
102
+ }, [open, onClose]);
103
+
104
+ // Debounced search — waits 180 ms after the last keystroke
105
+ useEffect(() => {
106
+ if (!query.trim() || isDev) {
107
+ setResults([]);
108
+ return;
109
+ }
110
+
111
+ const timerId = setTimeout(async () => {
112
+ if (!pf) {
113
+ if (pfLoadPromise) {
114
+ setIsLoading(true);
115
+ await pfLoadPromise;
116
+ setIsLoading(false);
117
+ }
118
+ if (!pf) return;
119
+ }
120
+
121
+ const capturedQuery = query;
122
+ try {
123
+ const { results: raw } = await pf.search(capturedQuery);
124
+ const resolved = await Promise.all(
125
+ raw.slice(0, 8).map(async (r) => {
126
+ const data = await r.data();
127
+ return {
128
+ id: r.id,
129
+ url: data.url,
130
+ title: data.meta?.title ?? data.url,
131
+ excerpt: data.excerpt,
132
+ };
133
+ }),
134
+ );
135
+ setResults(resolved);
136
+ setSelectedIndex(0);
137
+ } catch {
138
+ setResults([]);
139
+ }
140
+ }, 180);
141
+
142
+ return () => clearTimeout(timerId);
143
+ }, [query, isDev]);
144
+
145
+ function handleKeyDown(e: React.KeyboardEvent) {
146
+ if (e.key === 'Escape') {
147
+ onClose();
148
+ } else if (e.key === 'ArrowDown') {
149
+ e.preventDefault();
150
+ setSelectedIndex((i) => Math.min(i + 1, results.length - 1));
151
+ } else if (e.key === 'ArrowUp') {
152
+ e.preventDefault();
153
+ setSelectedIndex((i) => Math.max(i - 1, 0));
154
+ } else if (e.key === 'Enter' && results[selectedIndex]) {
155
+ onClose();
156
+ navigate(results[selectedIndex].url);
157
+ }
158
+ }
159
+
160
+ if (!open) return null;
161
+
162
+ return (
163
+ <div
164
+ className={styles.overlay}
165
+ onClick={(e) => { if (e.target === e.currentTarget) onClose(); }}
166
+ role="dialog"
167
+ aria-modal="true"
168
+ aria-label="Search"
169
+ >
170
+ <div className={styles.modal} onKeyDown={handleKeyDown}>
171
+ <div className={styles.inputRow}>
172
+ <svg
173
+ className={styles.searchIcon}
174
+ width="18"
175
+ height="18"
176
+ viewBox="0 0 24 24"
177
+ fill="none"
178
+ stroke="currentColor"
179
+ strokeWidth="2"
180
+ strokeLinecap="round"
181
+ strokeLinejoin="round"
182
+ aria-hidden="true"
183
+ >
184
+ <circle cx="11" cy="11" r="8" />
185
+ <line x1="21" y1="21" x2="16.65" y2="16.65" />
186
+ </svg>
187
+ <input
188
+ ref={inputRef}
189
+ className={styles.input}
190
+ type="text"
191
+ placeholder={isDev ? 'Search unavailable in dev mode' : 'Search docs…'}
192
+ value={query}
193
+ onChange={(e) => setQuery(e.target.value)}
194
+ disabled={isDev}
195
+ aria-label="Search"
196
+ />
197
+ <button
198
+ className={styles.closeBtn}
199
+ onClick={onClose}
200
+ aria-label="Close search"
201
+ type="button"
202
+ >
203
+ <kbd>esc</kbd>
204
+ </button>
205
+ </div>
206
+
207
+ {isDev && (
208
+ <div className={styles.notice}>
209
+ Search is only available after running <code>mordoc build</code>.
210
+ </div>
211
+ )}
212
+
213
+ {!isDev && isLoading && (
214
+ <div className={styles.status}>Loading search index…</div>
215
+ )}
216
+
217
+ {!isDev && !isLoading && query.trim() && results.length === 0 && (
218
+ <div className={styles.status}>No results for &ldquo;{query}&rdquo;</div>
219
+ )}
220
+
221
+ {results.length > 0 && (
222
+ <ul className={styles.results} role="listbox">
223
+ {results.map((result, i) => (
224
+ <li
225
+ key={result.id}
226
+ role="option"
227
+ aria-selected={i === selectedIndex}
228
+ className={`${styles.result}${i === selectedIndex ? ` ${styles.resultSelected}` : ''}`}
229
+ onClick={() => { onClose(); navigate(result.url); }}
230
+ onMouseEnter={() => setSelectedIndex(i)}
231
+ >
232
+ <span className={styles.resultTitle}>{result.title}</span>
233
+ {/* Pagefind wraps matched terms in <mark> — safe to inject as HTML */}
234
+ <span
235
+ className={styles.resultExcerpt}
236
+ dangerouslySetInnerHTML={{ __html: result.excerpt }}
237
+ />
238
+ </li>
239
+ ))}
240
+ </ul>
241
+ )}
242
+ </div>
243
+ </div>
244
+ );
245
+ }
@@ -0,0 +1,37 @@
1
+ /* Topnav lives in the second header row (.topnavRow in Header.module.css).
2
+ Links use height: 100% + a bottom-border indicator for the active state. */
3
+ .topnav {
4
+ display: flex;
5
+ align-items: stretch;
6
+ gap: 0;
7
+ height: 100%;
8
+ }
9
+
10
+ .link {
11
+ display: flex;
12
+ align-items: center;
13
+ padding: 0 0.75rem;
14
+ color: var(--color-fg-muted);
15
+ text-decoration: none;
16
+ font-size: 0.875rem;
17
+ font-weight: 500;
18
+ white-space: nowrap;
19
+ border-bottom: 2px solid transparent;
20
+ transition: color 0.15s, border-color 0.15s;
21
+ /* Shift content up by 1px so the bottom border doesn't push layout */
22
+ margin-bottom: -1px;
23
+ }
24
+
25
+ .link:hover {
26
+ color: var(--color-fg);
27
+ }
28
+
29
+ .link:focus-visible {
30
+ outline: 2px solid var(--accent-emphasis);
31
+ outline-offset: -2px;
32
+ }
33
+
34
+ .link.active {
35
+ color: var(--color-fg);
36
+ border-bottom-color: var(--accent-emphasis);
37
+ }
@@ -0,0 +1,30 @@
1
+ import { NavLink, useLocation } from 'react-router';
2
+ import { useMordocData } from '../data-context.js';
3
+ import { detectCurrentLang, buildLangPrefix, resolveLabel } from '../lang-utils.js';
4
+ import styles from './Topnav.module.css';
5
+
6
+ export function Topnav() {
7
+ const { navigation, language, site, translations } = useMordocData();
8
+ const { pathname } = useLocation();
9
+
10
+ if (navigation.kind !== 'topnav') return null;
11
+
12
+ const currentLang = detectCurrentLang(pathname, language, site.defaultLanguage);
13
+ const prefix = buildLangPrefix(currentLang, site.defaultLanguage);
14
+
15
+ return (
16
+ <nav className={styles.topnav} aria-label="Top navigation">
17
+ {navigation.topnav.map((item) => (
18
+ <NavLink
19
+ key={item.path}
20
+ to={`${prefix}${item.path}`}
21
+ className={({ isActive }) =>
22
+ isActive ? `${styles.link} ${styles.active}` : styles.link
23
+ }
24
+ >
25
+ {resolveLabel(item.label, currentLang, site.defaultLanguage, translations)}
26
+ </NavLink>
27
+ ))}
28
+ </nav>
29
+ );
30
+ }
@@ -0,0 +1,119 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
2
+
3
+ /* ============================================================
4
+ ROOT TOKENS — global design primitives only.
5
+ Component-specific tokens live at the top of each component's
6
+ CSS module file (e.g. Sidenav.module.css, Header.module.css).
7
+ ============================================================ */
8
+ :root {
9
+ /* Surfaces */
10
+ --color-bg: #ffffff;
11
+ --color-surface: #fafafa;
12
+ --color-border: #e5e5e5;
13
+ --color-header-bg: rgba(255, 255, 255);
14
+
15
+ /* Text */
16
+ --color-fg: #1c1c1c;
17
+ --color-content-fg: rgb(46, 46, 46);
18
+ --color-fg-muted: #6b7280;
19
+
20
+ /* Interaction */
21
+ --color-bg-hover: #f3f4f6;
22
+
23
+ /* Accent — single configurable token; all other accent vars are derived.
24
+ Users override --accent (and optionally dark) in config/theme.css. */
25
+ --accent: #D64518;
26
+ --accent-subtle: color-mix(in oklch, var(--accent) 8%, white);
27
+ --accent-muted: color-mix(in oklch, var(--accent) 20%, white);
28
+ --accent-emphasis: var(--accent);
29
+ --accent-strong: color-mix(in oklch, var(--accent) 80%, black);
30
+ --accent-on: white;
31
+
32
+ /* Layout — shared across multiple components */
33
+ --header-height: 4rem;
34
+ --topnav-height: 0px;
35
+ --header-total: calc(var(--header-height) + var(--topnav-height));
36
+ --sidebar-width: 16rem;
37
+ --sidebar-width-icon: 3.5rem;
38
+ --toc-width: 16rem;
39
+ --content-max-width: 48rem;
40
+ --page-gutter: 2.5rem;
41
+
42
+ /* Typography */
43
+ --font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
44
+ --font-mono: ui-monospace, 'Cascadia Code', 'Fira Code', 'Consolas', monospace;
45
+
46
+ /* Shape */
47
+ --radius-sm: 4px;
48
+ --radius-md: 6px;
49
+ --radius-lg: 10px;
50
+
51
+ /* Shadow */
52
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06), 0 1px 2px rgba(0, 0, 0, 0.04);
53
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.07), 0 2px 4px -1px rgba(0, 0, 0, 0.04);
54
+ }
55
+
56
+ /* Dark mode overrides — global primitives only */
57
+ .dark {
58
+ --color-bg: #121212;
59
+ --color-surface: #0f0f0f;
60
+ --color-border: #2e2e2e;
61
+ --color-header-bg: rgba(18, 18, 18);
62
+
63
+ --color-fg: #e2e8f0;
64
+ --color-content-fg: rgb(214, 214, 214);
65
+ --color-fg-muted: #94a3b8;
66
+
67
+ --color-bg-hover: #1e2432;
68
+
69
+ /* Accent — re-derived for dark surfaces; --accent base stays the same */
70
+ --accent-subtle: color-mix(in oklch, var(--accent) 12%, #121212);
71
+ --accent-muted: color-mix(in oklch, var(--accent) 25%, #121212);
72
+ --accent-emphasis: color-mix(in oklch, var(--accent) 70%, white);
73
+ --accent-strong: color-mix(in oklch, var(--accent) 50%, white);
74
+ }
75
+
76
+ /* ============================================================
77
+ BASE RESET
78
+ ============================================================ */
79
+ *,
80
+ *::before,
81
+ *::after {
82
+ box-sizing: border-box;
83
+ }
84
+
85
+ html {
86
+ -webkit-font-smoothing: antialiased;
87
+ -moz-osx-font-smoothing: grayscale;
88
+ }
89
+
90
+ html,
91
+ body {
92
+ margin: 0;
93
+ padding: 0;
94
+ overscroll-behavior: none;
95
+ }
96
+
97
+ body {
98
+ background: var(--color-bg);
99
+ color: var(--color-fg);
100
+ font-family: var(--font-sans);
101
+ font-size: 15px;
102
+ line-height: 1.6;
103
+ }
104
+
105
+ /* Scrollbar */
106
+ ::-webkit-scrollbar {
107
+ width: 6px;
108
+ height: 6px;
109
+ }
110
+ ::-webkit-scrollbar-track {
111
+ background: transparent;
112
+ }
113
+ ::-webkit-scrollbar-thumb {
114
+ background: var(--color-border);
115
+ border-radius: 3px;
116
+ }
117
+ ::-webkit-scrollbar-thumb:hover {
118
+ background: var(--color-fg-muted);
119
+ }
@@ -0,0 +1,13 @@
1
+ <!doctype html>
2
+ <html lang="<!--ssr-lang-->">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <script>(()=>{try{if(localStorage.getItem('mordoc-theme')==='dark')document.documentElement.classList.add('dark')}catch(e){}})();</script>
7
+ <!--ssr-head-->
8
+ </head>
9
+ <body>
10
+ <div id="app"><!--ssr-outlet--></div>
11
+ <script type="module" src="/main.tsx"></script>
12
+ </body>
13
+ </html>
@@ -0,0 +1,14 @@
1
+ /* ── Landing page shell ───────────────────────────────────────── */
2
+
3
+ .landing {
4
+ display: flex;
5
+ flex-direction: column;
6
+ min-height: calc(100svh - var(--header-total));
7
+ }
8
+
9
+ /* No padding — hero and section components each own their inner spacing
10
+ so full-bleed backgrounds can reach the viewport edge. */
11
+ .content {
12
+ flex: 1;
13
+ width: 100%;
14
+ }