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.
- package/LICENSE +7 -0
- package/bin/cli.js +24 -71
- package/dist/cli/asset-rewrite.d.ts +40 -0
- package/dist/cli/asset-rewrite.d.ts.map +1 -0
- package/dist/cli/asset-rewrite.js +67 -0
- package/dist/cli/asset-rewrite.js.map +1 -0
- package/dist/cli/build.d.ts +45 -15
- package/dist/cli/build.d.ts.map +1 -1
- package/dist/cli/build.js +186 -101
- package/dist/cli/build.js.map +1 -1
- package/dist/cli/dev.d.ts +26 -14
- package/dist/cli/dev.d.ts.map +1 -1
- package/dist/cli/dev.js +116 -159
- package/dist/cli/dev.js.map +1 -1
- package/dist/cli/pagefind-indexer.d.ts +15 -0
- package/dist/cli/pagefind-indexer.d.ts.map +1 -0
- package/dist/cli/pagefind-indexer.js +68 -0
- package/dist/cli/pagefind-indexer.js.map +1 -0
- package/dist/cli/paths.d.ts +26 -0
- package/dist/cli/paths.d.ts.map +1 -0
- package/dist/cli/paths.js +32 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/ssg-runner.d.ts +58 -0
- package/dist/cli/ssg-runner.d.ts.map +1 -0
- package/dist/cli/ssg-runner.js +126 -0
- package/dist/cli/ssg-runner.js.map +1 -0
- package/dist/config/assets-loader.d.ts +11 -0
- package/dist/config/assets-loader.d.ts.map +1 -0
- package/dist/config/assets-loader.js +46 -0
- package/dist/config/assets-loader.js.map +1 -0
- package/dist/config/language-loader.d.ts +11 -0
- package/dist/config/language-loader.d.ts.map +1 -0
- package/dist/config/language-loader.js +61 -0
- package/dist/config/language-loader.js.map +1 -0
- package/dist/config/language.d.ts +11 -0
- package/dist/config/language.d.ts.map +1 -0
- package/dist/config/language.js +61 -0
- package/dist/config/language.js.map +1 -0
- package/dist/config/sidenav-loader.d.ts +14 -0
- package/dist/config/sidenav-loader.d.ts.map +1 -0
- package/dist/config/sidenav-loader.js +78 -0
- package/dist/config/sidenav-loader.js.map +1 -0
- package/dist/config/site-loader.d.ts +11 -0
- package/dist/config/site-loader.d.ts.map +1 -0
- package/dist/config/site-loader.js +72 -0
- package/dist/config/site-loader.js.map +1 -0
- package/dist/config/site.d.ts +11 -0
- package/dist/config/site.d.ts.map +1 -0
- package/dist/config/site.js +72 -0
- package/dist/config/site.js.map +1 -0
- package/dist/config/topnav-loader.d.ts +10 -0
- package/dist/config/topnav-loader.d.ts.map +1 -0
- package/dist/config/topnav-loader.js +78 -0
- package/dist/config/topnav-loader.js.map +1 -0
- package/dist/config/translations-loader.d.ts +7 -0
- package/dist/config/translations-loader.d.ts.map +1 -0
- package/dist/config/translations-loader.js +51 -0
- package/dist/config/translations-loader.js.map +1 -0
- package/dist/content/content-loader.d.ts +16 -0
- package/dist/content/content-loader.d.ts.map +1 -0
- package/dist/content/content-loader.js +126 -0
- package/dist/content/content-loader.js.map +1 -0
- package/dist/content/content-parser.d.ts +12 -0
- package/dist/content/content-parser.d.ts.map +1 -0
- package/dist/content/content-parser.js +54 -0
- package/dist/content/content-parser.js.map +1 -0
- package/dist/content/content-transformer.d.ts +17 -0
- package/dist/content/content-transformer.d.ts.map +1 -0
- package/dist/content/content-transformer.js +94 -0
- package/dist/content/content-transformer.js.map +1 -0
- package/dist/content/markdoc-config.d.ts +13 -0
- package/dist/content/markdoc-config.d.ts.map +1 -0
- package/dist/content/markdoc-config.js +210 -0
- package/dist/content/markdoc-config.js.map +1 -0
- package/dist/content/slug.d.ts +26 -0
- package/dist/content/slug.d.ts.map +1 -0
- package/dist/content/slug.js +31 -0
- package/dist/content/slug.js.map +1 -0
- package/dist/pipeline.d.ts +61 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +123 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/types/assets.d.ts +15 -0
- package/dist/types/assets.d.ts.map +1 -0
- package/dist/types/assets.js +2 -0
- package/dist/types/assets.js.map +1 -0
- package/dist/types/content.d.ts +114 -32
- package/dist/types/content.d.ts.map +1 -1
- package/dist/types/content.js +1 -6
- package/dist/types/content.js.map +1 -1
- package/dist/types/language.d.ts +9 -0
- package/dist/types/language.d.ts.map +1 -0
- package/dist/types/language.js +2 -0
- package/dist/types/language.js.map +1 -0
- package/dist/types/navigation.d.ts +24 -36
- package/dist/types/navigation.d.ts.map +1 -1
- package/dist/types/navigation.js +1 -6
- package/dist/types/navigation.js.map +1 -1
- package/dist/types/pipeline.d.ts +70 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +2 -0
- package/dist/types/pipeline.js.map +1 -0
- package/dist/types/site.d.ts +20 -0
- package/dist/types/site.d.ts.map +1 -0
- package/dist/types/site.js +2 -0
- package/dist/types/site.js.map +1 -0
- package/dist/utils/lang-utils.d.ts +23 -0
- package/dist/utils/lang-utils.d.ts.map +1 -0
- package/dist/utils/lang-utils.js +40 -0
- package/dist/utils/lang-utils.js.map +1 -0
- package/dist/utils/paths.d.ts +25 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +31 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/vite/plugin.d.ts +93 -0
- package/dist/vite/plugin.d.ts.map +1 -0
- package/dist/vite/plugin.js +435 -0
- package/dist/vite/plugin.js.map +1 -0
- package/package.json +46 -61
- package/src/app/App.module.css +82 -0
- package/src/app/App.tsx +95 -0
- package/src/app/content/Content.module.css +357 -0
- package/src/app/content/Content.tsx +212 -0
- package/src/app/content/callout/Callout.module.css +110 -0
- package/src/app/content/callout/Callout.tsx +82 -0
- package/src/app/content/card/Card.module.css +146 -0
- package/src/app/content/card/Card.tsx +110 -0
- package/src/app/content/card/CardGrid.module.css +22 -0
- package/src/app/content/card/CardGrid.tsx +34 -0
- package/src/app/content/code-block/CodeBlock.module.css +237 -0
- package/src/app/content/code-block/CodeBlock.tsx +123 -0
- package/src/app/content/heading/Heading.module.css +52 -0
- package/src/app/content/heading/Heading.tsx +75 -0
- package/src/app/content/image/Image.module.css +113 -0
- package/src/app/content/image/Image.tsx +98 -0
- package/src/app/content/link/ContentLink.tsx +46 -0
- package/src/app/data-context.tsx +39 -0
- package/src/app/entry-server.tsx +58 -0
- package/src/app/footer/Footer.module.css +36 -0
- package/src/app/footer/Footer.tsx +28 -0
- package/src/app/globals.d.ts +40 -0
- package/src/app/header/Header.module.css +205 -0
- package/src/app/header/Header.tsx +188 -0
- package/src/app/header/LanguagePicker.module.css +97 -0
- package/src/app/header/LanguagePicker.tsx +174 -0
- package/src/app/header/SearchBar.module.css +92 -0
- package/src/app/header/SearchBar.tsx +37 -0
- package/src/app/header/SearchModal.module.css +185 -0
- package/src/app/header/SearchModal.tsx +245 -0
- package/src/app/header/Topnav.module.css +37 -0
- package/src/app/header/Topnav.tsx +30 -0
- package/src/app/index.css +119 -0
- package/src/app/index.html +13 -0
- package/src/app/landing/LandingPage.module.css +14 -0
- package/src/app/landing/LandingPage.tsx +62 -0
- package/src/app/landing/button/Button.module.css +37 -0
- package/src/app/landing/button/Button.tsx +50 -0
- package/src/app/landing/hero/Hero.module.css +108 -0
- package/src/app/landing/hero/Hero.tsx +81 -0
- package/src/app/landing/section/Section.module.css +100 -0
- package/src/app/landing/section/Section.tsx +61 -0
- package/src/app/lang-utils.ts +11 -0
- package/src/app/main.tsx +67 -0
- package/src/app/not-found/NotFound.module.css +92 -0
- package/src/app/not-found/NotFound.tsx +34 -0
- package/src/app/routes.tsx +86 -0
- package/src/app/sidenav/Sidenav.module.css +239 -0
- package/src/app/sidenav/Sidenav.tsx +182 -0
- package/src/app/skeleton/Skeleton.module.css +100 -0
- package/src/app/skeleton/Skeleton.tsx +75 -0
- package/src/app/toc/Toc.module.css +59 -0
- package/src/app/toc/Toc.tsx +77 -0
- package/src/app/tsconfig.json +18 -0
- package/src/app/virtual-modules.d.ts +74 -0
- package/dist/assets/fonts/inter/Inter-Italic-VariableFont_opsz,wght.ttf +0 -0
- package/dist/assets/fonts/inter/Inter-VariableFont_opsz,wght.ttf +0 -0
- package/dist/assets/fonts/inter/OFL.txt +0 -93
- package/dist/build/Builder.d.ts +0 -92
- package/dist/build/Builder.d.ts.map +0 -1
- package/dist/build/Builder.js +0 -394
- package/dist/build/Builder.js.map +0 -1
- package/dist/build/ClientBundler.d.ts +0 -48
- package/dist/build/ClientBundler.d.ts.map +0 -1
- package/dist/build/ClientBundler.js +0 -169
- package/dist/build/ClientBundler.js.map +0 -1
- package/dist/build/HtmlGenerator.d.ts +0 -46
- package/dist/build/HtmlGenerator.d.ts.map +0 -1
- package/dist/build/HtmlGenerator.js +0 -190
- package/dist/build/HtmlGenerator.js.map +0 -1
- package/dist/build/SearchIndexer.d.ts +0 -31
- package/dist/build/SearchIndexer.d.ts.map +0 -1
- package/dist/build/SearchIndexer.js +0 -116
- package/dist/build/SearchIndexer.js.map +0 -1
- package/dist/bundles/client.js +0 -126
- package/dist/cli/create-app.d.ts +0 -14
- package/dist/cli/create-app.d.ts.map +0 -1
- package/dist/cli/create-app.js +0 -241
- package/dist/cli/create-app.js.map +0 -1
- package/dist/client/App.d.ts +0 -17
- package/dist/client/App.d.ts.map +0 -1
- package/dist/client/App.js +0 -91
- package/dist/client/App.js.map +0 -1
- package/dist/client/contexts/ConfigContext.d.ts +0 -22
- package/dist/client/contexts/ConfigContext.d.ts.map +0 -1
- package/dist/client/contexts/ConfigContext.js +0 -27
- package/dist/client/contexts/ConfigContext.js.map +0 -1
- package/dist/client/contexts/ContentContext.d.ts +0 -31
- package/dist/client/contexts/ContentContext.d.ts.map +0 -1
- package/dist/client/contexts/ContentContext.js +0 -46
- package/dist/client/contexts/ContentContext.js.map +0 -1
- package/dist/client/contexts/SearchContext.d.ts +0 -38
- package/dist/client/contexts/SearchContext.d.ts.map +0 -1
- package/dist/client/contexts/SearchContext.js +0 -185
- package/dist/client/contexts/SearchContext.js.map +0 -1
- package/dist/client/contexts/ThemeContext.d.ts +0 -23
- package/dist/client/contexts/ThemeContext.d.ts.map +0 -1
- package/dist/client/contexts/ThemeContext.js +0 -53
- package/dist/client/contexts/ThemeContext.js.map +0 -1
- package/dist/client/hooks/useContent.d.ts +0 -12
- package/dist/client/hooks/useContent.d.ts.map +0 -1
- package/dist/client/hooks/useContent.js +0 -74
- package/dist/client/hooks/useContent.js.map +0 -1
- package/dist/client/hooks/useNavigation.d.ts +0 -15
- package/dist/client/hooks/useNavigation.d.ts.map +0 -1
- package/dist/client/hooks/useNavigation.js +0 -101
- package/dist/client/hooks/useNavigation.js.map +0 -1
- package/dist/client/hooks/useSearch.d.ts +0 -22
- package/dist/client/hooks/useSearch.d.ts.map +0 -1
- package/dist/client/hooks/useSearch.js +0 -64
- package/dist/client/hooks/useSearch.js.map +0 -1
- package/dist/client/main.d.ts +0 -5
- package/dist/client/main.d.ts.map +0 -1
- package/dist/client/main.js +0 -66
- package/dist/client/main.js.map +0 -1
- package/dist/components/Callout.d.ts +0 -9
- package/dist/components/Callout.d.ts.map +0 -1
- package/dist/components/Callout.js +0 -24
- package/dist/components/Callout.js.map +0 -1
- package/dist/components/Card.d.ts +0 -10
- package/dist/components/Card.d.ts.map +0 -1
- package/dist/components/Card.js +0 -15
- package/dist/components/Card.js.map +0 -1
- package/dist/components/CardGrid.d.ts +0 -8
- package/dist/components/CardGrid.d.ts.map +0 -1
- package/dist/components/CardGrid.js +0 -9
- package/dist/components/CardGrid.js.map +0 -1
- package/dist/components/CodeBlock.d.ts +0 -28
- package/dist/components/CodeBlock.d.ts.map +0 -1
- package/dist/components/CodeBlock.js +0 -80
- package/dist/components/CodeBlock.js.map +0 -1
- package/dist/components/ContentPage.d.ts +0 -9
- package/dist/components/ContentPage.d.ts.map +0 -1
- package/dist/components/ContentPage.js +0 -102
- package/dist/components/ContentPage.js.map +0 -1
- package/dist/components/Header.d.ts +0 -14
- package/dist/components/Header.d.ts.map +0 -1
- package/dist/components/Header.js +0 -30
- package/dist/components/Header.js.map +0 -1
- package/dist/components/Heading.d.ts +0 -16
- package/dist/components/Heading.d.ts.map +0 -1
- package/dist/components/Heading.js +0 -31
- package/dist/components/Heading.js.map +0 -1
- package/dist/components/Image.d.ts +0 -8
- package/dist/components/Image.d.ts.map +0 -1
- package/dist/components/Image.js +0 -24
- package/dist/components/Image.js.map +0 -1
- package/dist/components/Layout.d.ts +0 -14
- package/dist/components/Layout.d.ts.map +0 -1
- package/dist/components/Layout.js +0 -32
- package/dist/components/Layout.js.map +0 -1
- package/dist/components/MarkdocRenderer.d.ts +0 -15
- package/dist/components/MarkdocRenderer.d.ts.map +0 -1
- package/dist/components/MarkdocRenderer.js +0 -73
- package/dist/components/MarkdocRenderer.js.map +0 -1
- package/dist/components/MobileMenu.d.ts +0 -14
- package/dist/components/MobileMenu.d.ts.map +0 -1
- package/dist/components/MobileMenu.js +0 -45
- package/dist/components/MobileMenu.js.map +0 -1
- package/dist/components/PageNavigation.d.ts +0 -9
- package/dist/components/PageNavigation.d.ts.map +0 -1
- package/dist/components/PageNavigation.js +0 -23
- package/dist/components/PageNavigation.js.map +0 -1
- package/dist/components/SearchModal.d.ts +0 -9
- package/dist/components/SearchModal.d.ts.map +0 -1
- package/dist/components/SearchModal.js +0 -74
- package/dist/components/SearchModal.js.map +0 -1
- package/dist/components/SideNav.d.ts +0 -9
- package/dist/components/SideNav.d.ts.map +0 -1
- package/dist/components/SideNav.js +0 -66
- package/dist/components/SideNav.js.map +0 -1
- package/dist/components/TableOfContents.d.ts +0 -10
- package/dist/components/TableOfContents.d.ts.map +0 -1
- package/dist/components/TableOfContents.js +0 -151
- package/dist/components/TableOfContents.js.map +0 -1
- package/dist/config/ConfigLoader.d.ts +0 -50
- package/dist/config/ConfigLoader.d.ts.map +0 -1
- package/dist/config/ConfigLoader.js +0 -214
- package/dist/config/ConfigLoader.js.map +0 -1
- package/dist/config/StyleCompiler.d.ts +0 -17
- package/dist/config/StyleCompiler.d.ts.map +0 -1
- package/dist/config/StyleCompiler.js +0 -116
- package/dist/config/StyleCompiler.js.map +0 -1
- package/dist/config/ThemeGenerator.d.ts +0 -14
- package/dist/config/ThemeGenerator.d.ts.map +0 -1
- package/dist/config/ThemeGenerator.js +0 -129
- package/dist/config/ThemeGenerator.js.map +0 -1
- package/dist/content/ContentLoader.d.ts +0 -70
- package/dist/content/ContentLoader.d.ts.map +0 -1
- package/dist/content/ContentLoader.js +0 -146
- package/dist/content/ContentLoader.js.map +0 -1
- package/dist/content/ContentProcessor.d.ts +0 -84
- package/dist/content/ContentProcessor.d.ts.map +0 -1
- package/dist/content/ContentProcessor.js +0 -380
- package/dist/content/ContentProcessor.js.map +0 -1
- package/dist/content/RouteManager.d.ts +0 -69
- package/dist/content/RouteManager.d.ts.map +0 -1
- package/dist/content/RouteManager.js +0 -143
- package/dist/content/RouteManager.js.map +0 -1
- package/dist/styles/components/callout.d.ts +0 -11
- package/dist/styles/components/callout.d.ts.map +0 -1
- package/dist/styles/components/callout.js +0 -87
- package/dist/styles/components/callout.js.map +0 -1
- package/dist/styles/components/card.d.ts +0 -11
- package/dist/styles/components/card.d.ts.map +0 -1
- package/dist/styles/components/card.js +0 -179
- package/dist/styles/components/card.js.map +0 -1
- package/dist/styles/components/codeblock.d.ts +0 -11
- package/dist/styles/components/codeblock.d.ts.map +0 -1
- package/dist/styles/components/codeblock.js +0 -251
- package/dist/styles/components/codeblock.js.map +0 -1
- package/dist/styles/components/content.d.ts +0 -11
- package/dist/styles/components/content.d.ts.map +0 -1
- package/dist/styles/components/content.js +0 -197
- package/dist/styles/components/content.js.map +0 -1
- package/dist/styles/components/fonts.d.ts +0 -11
- package/dist/styles/components/fonts.d.ts.map +0 -1
- package/dist/styles/components/fonts.js +0 -34
- package/dist/styles/components/fonts.js.map +0 -1
- package/dist/styles/components/header.d.ts +0 -11
- package/dist/styles/components/header.d.ts.map +0 -1
- package/dist/styles/components/header.js +0 -293
- package/dist/styles/components/header.js.map +0 -1
- package/dist/styles/components/heading.d.ts +0 -11
- package/dist/styles/components/heading.d.ts.map +0 -1
- package/dist/styles/components/heading.js +0 -115
- package/dist/styles/components/heading.js.map +0 -1
- package/dist/styles/components/layout.d.ts +0 -11
- package/dist/styles/components/layout.d.ts.map +0 -1
- package/dist/styles/components/layout.js +0 -79
- package/dist/styles/components/layout.js.map +0 -1
- package/dist/styles/components/mobilemenu.d.ts +0 -11
- package/dist/styles/components/mobilemenu.d.ts.map +0 -1
- package/dist/styles/components/mobilemenu.js +0 -112
- package/dist/styles/components/mobilemenu.js.map +0 -1
- package/dist/styles/components/reset.d.ts +0 -11
- package/dist/styles/components/reset.d.ts.map +0 -1
- package/dist/styles/components/reset.js +0 -131
- package/dist/styles/components/reset.js.map +0 -1
- package/dist/styles/components/searchmodal.d.ts +0 -11
- package/dist/styles/components/searchmodal.d.ts.map +0 -1
- package/dist/styles/components/searchmodal.js +0 -333
- package/dist/styles/components/searchmodal.js.map +0 -1
- package/dist/styles/components/sidenav.d.ts +0 -11
- package/dist/styles/components/sidenav.d.ts.map +0 -1
- package/dist/styles/components/sidenav.js +0 -212
- package/dist/styles/components/sidenav.js.map +0 -1
- package/dist/styles/components/toc.d.ts +0 -11
- package/dist/styles/components/toc.d.ts.map +0 -1
- package/dist/styles/components/toc.js +0 -120
- package/dist/styles/components/toc.js.map +0 -1
- package/dist/styles/components/typography.d.ts +0 -11
- package/dist/styles/components/typography.d.ts.map +0 -1
- package/dist/styles/components/typography.js +0 -248
- package/dist/styles/components/typography.js.map +0 -1
- package/dist/styles/components/utility.d.ts +0 -11
- package/dist/styles/components/utility.d.ts.map +0 -1
- package/dist/styles/components/utility.js +0 -231
- package/dist/styles/components/utility.js.map +0 -1
- package/dist/styles/types.d.ts +0 -79
- package/dist/styles/types.d.ts.map +0 -1
- package/dist/styles/types.js +0 -7
- package/dist/styles/types.js.map +0 -1
- package/dist/styles/utils.d.ts +0 -21
- package/dist/styles/utils.d.ts.map +0 -1
- package/dist/styles/utils.js +0 -50
- package/dist/styles/utils.js.map +0 -1
- package/dist/styles/variables/main.d.ts +0 -15
- package/dist/styles/variables/main.d.ts.map +0 -1
- package/dist/styles/variables/main.js +0 -116
- package/dist/styles/variables/main.js.map +0 -1
- package/dist/types/config.d.ts +0 -43
- package/dist/types/config.d.ts.map +0 -1
- package/dist/types/config.js +0 -7
- package/dist/types/config.js.map +0 -1
- package/dist/utils/language-utils.d.ts +0 -41
- package/dist/utils/language-utils.d.ts.map +0 -1
- package/dist/utils/language-utils.js +0 -79
- package/dist/utils/language-utils.js.map +0 -1
- package/dist/utils/slugify.d.ts +0 -20
- package/dist/utils/slugify.d.ts.map +0 -1
- package/dist/utils/slugify.js +0 -44
- package/dist/utils/slugify.js.map +0 -1
- package/templates/default/config/favicon.ico +0 -0
- package/templates/default/config/logo-dark.png +0 -0
- package/templates/default/config/logo.png +0 -0
- package/templates/default/config/sidenav.yaml +0 -36
- package/templates/default/config/site.json +0 -16
- package/templates/default/config/styles/main.json +0 -6
- package/templates/default/config/styles/typography.json +0 -6
- package/templates/default/content/en/changelog.md +0 -35
- package/templates/default/content/en/faq.md +0 -50
- package/templates/default/content/en/field-manual/engines.md +0 -59
- package/templates/default/content/en/field-manual/relativity.md +0 -46
- package/templates/default/content/en/field-manual/safety.md +0 -44
- package/templates/default/content/en/field-manual.md +0 -22
- package/templates/default/content/en/flight-school/navigation.md +0 -61
- package/templates/default/content/en/flight-school/primer.md +0 -64
- package/templates/default/content/en/flight-school.md +0 -48
- package/templates/default/content/en/index.md +0 -83
- package/templates/default/content/en/ship-systems/flux-sails.md +0 -33
- package/templates/default/content/en/ship-systems/photonic-core.md +0 -39
- package/templates/default/content/en/ship-systems.md +0 -25
- package/templates/default/package.json +0 -21
- package/templates/default/public/icons/academy.svg +0 -15
- package/templates/default/public/icons/manual.svg +0 -16
- package/templates/default/public/icons/relativity.svg +0 -16
- package/templates/default/public/icons/systems.svg +0 -14
- package/templates/default/public/icons/warning.svg +0 -14
- package/templates/default/public/images/flux-sails.svg +0 -33
- package/templates/default/public/images/photonic-core.svg +0 -44
- package/templates/default/public/images/starwake.svg +0 -49
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image — inline content image with a lightbox popup.
|
|
3
|
+
*
|
|
4
|
+
* Renders a styled <figure> inline; clicking it opens a full-screen overlay
|
|
5
|
+
* via a React portal mounted on document.body. The portal approach avoids
|
|
6
|
+
* z-index stacking context fights with the fixed header and sidebar.
|
|
7
|
+
*
|
|
8
|
+
* SSR safety: the portal is only rendered when `isOpen` is true, which starts
|
|
9
|
+
* as false — so document.body is never accessed during server-side rendering.
|
|
10
|
+
*
|
|
11
|
+
* Wired via the `image` node override in markdoc-config.ts, registered in
|
|
12
|
+
* Content.tsx's components map.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
16
|
+
import { createPortal } from 'react-dom';
|
|
17
|
+
import styles from './Image.module.css';
|
|
18
|
+
|
|
19
|
+
interface ImageProps {
|
|
20
|
+
src: string;
|
|
21
|
+
alt?: string;
|
|
22
|
+
title?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function Image({ src, alt = '', title }: ImageProps) {
|
|
26
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
27
|
+
|
|
28
|
+
const open = () => setIsOpen(true);
|
|
29
|
+
|
|
30
|
+
const close = useCallback(() => setIsOpen(false), []);
|
|
31
|
+
|
|
32
|
+
// Escape key closes the lightbox; body scroll is locked while open
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
if (!isOpen) return;
|
|
35
|
+
|
|
36
|
+
const handleKey = (e: KeyboardEvent) => {
|
|
37
|
+
if (e.key === 'Escape') close();
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
document.body.style.overflow = 'hidden';
|
|
41
|
+
window.addEventListener('keydown', handleKey);
|
|
42
|
+
|
|
43
|
+
return () => {
|
|
44
|
+
document.body.style.overflow = '';
|
|
45
|
+
window.removeEventListener('keydown', handleKey);
|
|
46
|
+
};
|
|
47
|
+
}, [isOpen, close]);
|
|
48
|
+
|
|
49
|
+
const lightbox = (
|
|
50
|
+
<div
|
|
51
|
+
className={styles.overlay}
|
|
52
|
+
onClick={close}
|
|
53
|
+
role="dialog"
|
|
54
|
+
aria-modal="true"
|
|
55
|
+
aria-label={alt || 'Image preview'}
|
|
56
|
+
>
|
|
57
|
+
<button
|
|
58
|
+
className={styles.closeButton}
|
|
59
|
+
onClick={close}
|
|
60
|
+
aria-label="Close image preview"
|
|
61
|
+
type="button"
|
|
62
|
+
>
|
|
63
|
+
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
64
|
+
<path d="M18 6L6 18M6 6L18 18" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
|
|
65
|
+
</svg>
|
|
66
|
+
</button>
|
|
67
|
+
|
|
68
|
+
<div
|
|
69
|
+
className={styles.lightboxImageWrap}
|
|
70
|
+
onClick={(e) => e.stopPropagation()}
|
|
71
|
+
>
|
|
72
|
+
<img
|
|
73
|
+
src={src}
|
|
74
|
+
alt={alt}
|
|
75
|
+
className={styles.lightboxImage}
|
|
76
|
+
/>
|
|
77
|
+
{title && <p className={styles.lightboxCaption}>{title}</p>}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<>
|
|
84
|
+
<figure className={styles.figure} onClick={open}>
|
|
85
|
+
<img
|
|
86
|
+
src={src}
|
|
87
|
+
alt={alt}
|
|
88
|
+
className={styles.image}
|
|
89
|
+
/>
|
|
90
|
+
{title && <figcaption className={styles.caption}>{title}</figcaption>}
|
|
91
|
+
</figure>
|
|
92
|
+
|
|
93
|
+
{isOpen && createPortal(lightbox, document.body)}
|
|
94
|
+
</>
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export default Image;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContentLink — SPA-aware link component for Markdoc-rendered prose.
|
|
3
|
+
*
|
|
4
|
+
* Replaces Markdoc's default `<a>` output so that internal route links use
|
|
5
|
+
* React Router's <Link> (client-side navigation, no page reload) while
|
|
6
|
+
* external URLs open in a new tab. Anchor-only links (#heading) are left as
|
|
7
|
+
* plain <a> elements — they are in-page scrolls and do not involve routing.
|
|
8
|
+
*
|
|
9
|
+
* Registered as a custom Markdoc `link` node in markdoc-config.ts and wired
|
|
10
|
+
* into the components map in Content.tsx and LandingPage.tsx.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Link } from 'react-router';
|
|
14
|
+
import React from 'react';
|
|
15
|
+
|
|
16
|
+
interface ContentLinkProps {
|
|
17
|
+
href: string;
|
|
18
|
+
title?: string;
|
|
19
|
+
children?: React.ReactNode;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function isExternal(href: string) {
|
|
23
|
+
return href.startsWith('http://') || href.startsWith('https://') || href.startsWith('//');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function ContentLink({ href, title, children }: ContentLinkProps) {
|
|
27
|
+
if (href.startsWith('#')) {
|
|
28
|
+
return <a href={href} title={title}>{children}</a>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (isExternal(href)) {
|
|
32
|
+
return (
|
|
33
|
+
<a href={href} title={title} target="_blank" rel="noopener noreferrer">
|
|
34
|
+
{children}
|
|
35
|
+
</a>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<Link to={href} title={title}>
|
|
41
|
+
{children}
|
|
42
|
+
</Link>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default ContentLink;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import type { ShellData } from '../types/pipeline.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* React context carrying the site-wide `ShellData` projection.
|
|
6
|
+
*
|
|
7
|
+
* This context is the single channel by which shell components read the
|
|
8
|
+
* configs, navigation, and route index. The browser entry (`main.tsx`)
|
|
9
|
+
* assembles the value from the eager `virtual:mordoc/*` modules; the
|
|
10
|
+
* server entry (`entry-server.tsx`) receives it as the `data` parameter
|
|
11
|
+
* of `render()`. Both then wrap the React tree in this provider, which
|
|
12
|
+
* is what makes the same component code (`App`, `Page`, future theme
|
|
13
|
+
* components) work identically under CSR and SSR.
|
|
14
|
+
*
|
|
15
|
+
* The default value is `null` so that any component reading the context
|
|
16
|
+
* outside a provider trips a clear runtime error in `useMordocData()`,
|
|
17
|
+
* rather than silently rendering against an empty object.
|
|
18
|
+
*/
|
|
19
|
+
export const MordocDataContext = createContext<ShellData | null>(null);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Hook for shell components to read the current `ShellData`.
|
|
23
|
+
*
|
|
24
|
+
* Throws if called outside a `<MordocDataContext.Provider>`. Both
|
|
25
|
+
* entry points (`main.tsx`, `entry-server.tsx`) wrap their entire tree
|
|
26
|
+
* in the provider, so a missing-provider error means a regression in
|
|
27
|
+
* the entry wiring — surface it loudly rather than letting components
|
|
28
|
+
* read `null` and crash deeper.
|
|
29
|
+
*/
|
|
30
|
+
export function useMordocData(): ShellData {
|
|
31
|
+
const value = useContext(MordocDataContext);
|
|
32
|
+
if (value === null) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
'mordoc: useMordocData() called outside <MordocDataContext.Provider>. ' +
|
|
35
|
+
'Both main.tsx and entry-server.tsx must wrap the React tree in the provider.',
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { StrictMode } from 'react';
|
|
2
|
+
import { renderToString } from 'react-dom/server';
|
|
3
|
+
import {
|
|
4
|
+
createStaticHandler,
|
|
5
|
+
createStaticRouter,
|
|
6
|
+
StaticRouterProvider,
|
|
7
|
+
} from 'react-router';
|
|
8
|
+
import type { ShellData } from '../types/pipeline.js';
|
|
9
|
+
import { MordocDataContext } from './data-context.js';
|
|
10
|
+
import { buildRoutes } from './routes.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Renders a single route to an HTML string for SSG.
|
|
14
|
+
*
|
|
15
|
+
* Called once per route by the SSG runner at build time. Pure function —
|
|
16
|
+
* no Vite, no I/O. The SSG runner synthesises a `Request` for each route
|
|
17
|
+
* path, loads this module from the bundled SSR output, and calls `render()`.
|
|
18
|
+
*
|
|
19
|
+
* The flow:
|
|
20
|
+
* 1. Build the route list (shared with the browser entry via `buildRoutes`).
|
|
21
|
+
* 2. `createStaticHandler.query(request)` runs the matched route's loader,
|
|
22
|
+
* which imports the lazy `virtual:mordoc/page/...` module — resolved by
|
|
23
|
+
* the Vite plugin and bundled into the SSR output.
|
|
24
|
+
* 3. `createStaticRouter` + `<StaticRouterProvider>` render the matched
|
|
25
|
+
* component tree to a string.
|
|
26
|
+
* 4. The tree is wrapped in `MordocDataContext.Provider` and `StrictMode`
|
|
27
|
+
* to mirror `main.tsx` — divergence here causes hydration mismatches.
|
|
28
|
+
*
|
|
29
|
+
* If the static handler returns a `Response` (e.g. a redirect from a loader),
|
|
30
|
+
* this function throws — redirect handling is not yet supported.
|
|
31
|
+
*/
|
|
32
|
+
export async function render(
|
|
33
|
+
request: Request,
|
|
34
|
+
data: ShellData,
|
|
35
|
+
): Promise<{ html: string }> {
|
|
36
|
+
const routes = buildRoutes();
|
|
37
|
+
const handler = createStaticHandler(routes);
|
|
38
|
+
const context = await handler.query(request);
|
|
39
|
+
|
|
40
|
+
if (context instanceof Response) {
|
|
41
|
+
throw new Error(
|
|
42
|
+
`mordoc render: static handler returned Response (status ${context.status}). ` +
|
|
43
|
+
'Redirects/responses from loaders are not yet supported in the SSR path.',
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const router = createStaticRouter(routes, context);
|
|
48
|
+
|
|
49
|
+
const html = renderToString(
|
|
50
|
+
<StrictMode>
|
|
51
|
+
<MordocDataContext.Provider value={data}>
|
|
52
|
+
<StaticRouterProvider router={router} context={context} />
|
|
53
|
+
</MordocDataContext.Provider>
|
|
54
|
+
</StrictMode>,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
return { html };
|
|
58
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
.footer {
|
|
2
|
+
max-width: var(--content-max-width);
|
|
3
|
+
width: 100%;
|
|
4
|
+
margin: 0 auto;
|
|
5
|
+
padding: 0 1.5rem 2rem;
|
|
6
|
+
background: var(--color-bg);
|
|
7
|
+
font-size: 0.875rem;
|
|
8
|
+
color: var(--color-fg-muted);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@media (min-width: 768px) {
|
|
12
|
+
.footer {
|
|
13
|
+
padding-left: 2rem;
|
|
14
|
+
padding-right: 2rem;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.inner {
|
|
19
|
+
border-top: 1px solid var(--color-border);
|
|
20
|
+
padding-top: 2rem;
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
justify-content: space-between;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.link {
|
|
27
|
+
color: var(--accent-emphasis);
|
|
28
|
+
text-decoration: underline;
|
|
29
|
+
text-underline-offset: 2px;
|
|
30
|
+
text-decoration-color: transparent;
|
|
31
|
+
transition: text-decoration-color 0.15s;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.link:hover {
|
|
35
|
+
text-decoration-color: var(--accent-emphasis);
|
|
36
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { useMordocData } from '../data-context.js';
|
|
2
|
+
import styles from './Footer.module.css';
|
|
3
|
+
|
|
4
|
+
export function Footer() {
|
|
5
|
+
const { site } = useMordocData();
|
|
6
|
+
const year = new Date().getFullYear();
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<footer className={styles.footer} data-pagefind-ignore>
|
|
10
|
+
<div className={styles.inner}>
|
|
11
|
+
<span className={styles.copy}>
|
|
12
|
+
© {year} {site.name}
|
|
13
|
+
</span>
|
|
14
|
+
<span className={styles.built}>
|
|
15
|
+
Built with{' '}
|
|
16
|
+
<a
|
|
17
|
+
href="https://mordoc.dev"
|
|
18
|
+
target="_blank"
|
|
19
|
+
rel="noopener noreferrer"
|
|
20
|
+
className={styles.link}
|
|
21
|
+
>
|
|
22
|
+
Mordoc
|
|
23
|
+
</a>
|
|
24
|
+
</span>
|
|
25
|
+
</div>
|
|
26
|
+
</footer>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Ambient declarations for browser-side globals. This file must remain a
|
|
2
|
+
// script (no top-level import/export) so that wildcard declare module
|
|
3
|
+
// statements are picked up by the TS language server.
|
|
4
|
+
|
|
5
|
+
// Dynamic import types are allowed in ambient script files since TS 2.9,
|
|
6
|
+
// so no export {} needed to use import('...') syntax below.
|
|
7
|
+
|
|
8
|
+
interface Window {
|
|
9
|
+
__staticRouterHydrationData?: import('react-router').HydrationState;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Shape of a single result returned by pagefind.search(). */
|
|
13
|
+
interface PagefindSearchResult {
|
|
14
|
+
id: string;
|
|
15
|
+
data: () => Promise<PagefindSearchResultData>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface PagefindSearchResultData {
|
|
19
|
+
url: string;
|
|
20
|
+
excerpt: string;
|
|
21
|
+
meta: { title?: string; [key: string]: string | undefined };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Shape of the dynamically-imported Pagefind browser bundle (/pagefind[-lang]/pagefind.js). */
|
|
25
|
+
interface PagefindAPI {
|
|
26
|
+
init?: () => Promise<void>;
|
|
27
|
+
search: (query: string) => Promise<{ results: PagefindSearchResult[] }>;
|
|
28
|
+
/** Releases index memory. Call before switching to a different language index. */
|
|
29
|
+
destroy?: () => Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
declare module '*.css' {
|
|
33
|
+
const styles: Record<string, string>;
|
|
34
|
+
export default styles;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
declare module '*.module.css' {
|
|
38
|
+
const styles: Record<string, string>;
|
|
39
|
+
export default styles;
|
|
40
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
HEADER TOKENS
|
|
3
|
+
============================================================ */
|
|
4
|
+
:root {
|
|
5
|
+
--header-px: 16px;
|
|
6
|
+
--header-gap: 12px;
|
|
7
|
+
--actions-gap: 4px;
|
|
8
|
+
--brand-gap: 8px;
|
|
9
|
+
--brand-logo-size: 28px;
|
|
10
|
+
--brand-logo-radius: 6px;
|
|
11
|
+
--menu-btn-size: 36px;
|
|
12
|
+
--menu-btn-radius: 6px;
|
|
13
|
+
--menu-btn-icon: 20px;
|
|
14
|
+
--toggle-size: 40px;
|
|
15
|
+
--toggle-radius: 8px;
|
|
16
|
+
--toggle-icon-size: 20px;
|
|
17
|
+
--toggle-bg: #ffffff;
|
|
18
|
+
--toggle-bg-hover: #f5f5f5;
|
|
19
|
+
--toggle-border: #e5e5e5;
|
|
20
|
+
--toggle-fg: #1c1c1c;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:global(.dark) {
|
|
24
|
+
--toggle-bg: #1a1a1a;
|
|
25
|
+
--toggle-bg-hover: #242424;
|
|
26
|
+
--toggle-border: #2e2e2e;
|
|
27
|
+
--toggle-fg: #ebebeb;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@media (max-width: 479px) {
|
|
31
|
+
:root {
|
|
32
|
+
--header-gap: 8px;
|
|
33
|
+
--actions-gap: 2px;
|
|
34
|
+
--toggle-size: 36px;
|
|
35
|
+
--toggle-icon-size: 18px;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
@media (min-width: 768px) {
|
|
40
|
+
:root {
|
|
41
|
+
--header-gap: 16px;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@media (min-width: 1024px) {
|
|
46
|
+
:root {
|
|
47
|
+
--header-gap: 20px;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@media (min-width: 1280px) {
|
|
52
|
+
:root {
|
|
53
|
+
--header-gap: 24px;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Aesthetic + internal layout only.
|
|
58
|
+
Structural placement (position: sticky, z-index, height) lives in App.module.css .headerArea */
|
|
59
|
+
.header {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
width: 100%;
|
|
63
|
+
background: var(--color-header-bg);
|
|
64
|
+
backdrop-filter: blur(20px);
|
|
65
|
+
-webkit-backdrop-filter: blur(20px);
|
|
66
|
+
border-bottom: 1px solid var(--color-border);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* ── Top bar ────────────────────────────────────────────── */
|
|
70
|
+
.inner {
|
|
71
|
+
width: 100%;
|
|
72
|
+
height: var(--header-height);
|
|
73
|
+
padding: 0 var(--header-px);
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
justify-content: space-between;
|
|
77
|
+
gap: var(--header-gap);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Three regions */
|
|
81
|
+
.brand {
|
|
82
|
+
display: flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
gap: var(--brand-gap);
|
|
85
|
+
flex-shrink: 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.search {
|
|
89
|
+
flex: 1;
|
|
90
|
+
display: flex;
|
|
91
|
+
justify-content: center;
|
|
92
|
+
min-width: 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.actions {
|
|
96
|
+
display: flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
gap: var(--actions-gap);
|
|
99
|
+
flex-shrink: 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ── Logo / brand link ──────────────────────────────────── */
|
|
103
|
+
.logo {
|
|
104
|
+
display: flex;
|
|
105
|
+
align-items: center;
|
|
106
|
+
text-decoration: none;
|
|
107
|
+
color: inherit;
|
|
108
|
+
flex-shrink: 0;
|
|
109
|
+
border-radius: var(--brand-logo-radius);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.logoImage {
|
|
113
|
+
height: var(--brand-logo-size);
|
|
114
|
+
width: auto;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.logoText {
|
|
118
|
+
font-weight: 700;
|
|
119
|
+
font-size: 1.25rem;
|
|
120
|
+
white-space: nowrap;
|
|
121
|
+
letter-spacing: -0.01em;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* ── Hamburger ──────────────────────────────────────────── */
|
|
125
|
+
.menuBtn {
|
|
126
|
+
display: none;
|
|
127
|
+
align-items: center;
|
|
128
|
+
justify-content: center;
|
|
129
|
+
width: var(--menu-btn-size);
|
|
130
|
+
height: var(--menu-btn-size);
|
|
131
|
+
border: 0;
|
|
132
|
+
background: transparent;
|
|
133
|
+
border-radius: var(--menu-btn-radius);
|
|
134
|
+
color: inherit;
|
|
135
|
+
cursor: pointer;
|
|
136
|
+
flex-shrink: 0;
|
|
137
|
+
transition: background 0.15s;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.menuBtn:hover {
|
|
141
|
+
background: var(--lang-bg-hover);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.menuBtn:focus-visible {
|
|
145
|
+
outline: 2px solid var(--accent-emphasis);
|
|
146
|
+
outline-offset: 2px;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* ── Theme toggle ───────────────────────────────────────── */
|
|
150
|
+
.themeToggle {
|
|
151
|
+
display: flex;
|
|
152
|
+
align-items: center;
|
|
153
|
+
justify-content: center;
|
|
154
|
+
width: var(--toggle-size);
|
|
155
|
+
height: var(--toggle-size);
|
|
156
|
+
background: var(--toggle-bg);
|
|
157
|
+
color: var(--toggle-fg);
|
|
158
|
+
border: 1px solid var(--toggle-border);
|
|
159
|
+
border-radius: var(--toggle-radius);
|
|
160
|
+
cursor: pointer;
|
|
161
|
+
transition: background 0.2s, border-color 0.2s;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.themeToggle:hover {
|
|
165
|
+
background: var(--toggle-bg-hover);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.themeToggle:focus-visible {
|
|
169
|
+
outline: 2px solid var(--accent-emphasis);
|
|
170
|
+
outline-offset: 2px;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* ── Topnav second row ──────────────────────────────────── */
|
|
174
|
+
.topnavRow {
|
|
175
|
+
width: 100%;
|
|
176
|
+
height: 2.75rem;
|
|
177
|
+
padding: 0 var(--header-px);
|
|
178
|
+
display: flex;
|
|
179
|
+
align-items: stretch;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* ── Focus ring on logo ─────────────────────────────────── */
|
|
183
|
+
.logo:focus-visible {
|
|
184
|
+
outline: 2px solid var(--accent-emphasis);
|
|
185
|
+
outline-offset: 2px;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* ════════════════════════════════════════════════════════════
|
|
189
|
+
Responsive
|
|
190
|
+
════════════════════════════════════════════════════════════ */
|
|
191
|
+
|
|
192
|
+
/* < 768px: hamburger visible, search + topnav row hidden */
|
|
193
|
+
@media (max-width: 767.98px) {
|
|
194
|
+
.menuBtn {
|
|
195
|
+
display: inline-flex;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.search {
|
|
199
|
+
display: none;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.topnavRow {
|
|
203
|
+
display: none;
|
|
204
|
+
}
|
|
205
|
+
}
|