@lupinum/ginko-docs 0.4.0-rc.9 → 0.4.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 (296) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/LICENSE +1 -1
  3. package/README.md +206 -54
  4. package/app/app.config.ts +42 -55
  5. package/app/assets/docs.css +555 -0
  6. package/app/components/DocsBanner.vue +29 -0
  7. package/app/components/DocsExample.vue +43 -0
  8. package/app/components/DocsFooter.vue +19 -0
  9. package/app/components/DocsHeader.vue +112 -0
  10. package/app/components/DocsLanding.vue +55 -0
  11. package/app/components/DocsLanguage.vue +29 -0
  12. package/app/components/DocsNavTree.vue +38 -0
  13. package/app/components/DocsPage.vue +84 -0
  14. package/app/components/DocsPageActions.vue +47 -0
  15. package/app/components/DocsPost.vue +58 -0
  16. package/app/components/DocsSearch.vue +134 -0
  17. package/app/components/DocsShell.vue +20 -0
  18. package/app/components/DocsSidebar.vue +18 -0
  19. package/app/components/DocsTable.vue +11 -0
  20. package/app/components/DocsThemeToggle.vue +45 -0
  21. package/app/components/DocsToc.vue +73 -0
  22. package/app/composables/useDocs.ts +52 -0
  23. package/app/composables/useDocsBlog.ts +32 -0
  24. package/app/composables/useDocsCopy.ts +17 -0
  25. package/app/composables/useDocsPopover.ts +36 -0
  26. package/app/composables/useDocsSite.ts +10 -0
  27. package/app/docs-pages/blog.vue +47 -0
  28. package/app/docs-pages/changelog.vue +27 -0
  29. package/app/docs-pages/doc.vue +14 -0
  30. package/app/docs-pages/docs.vue +9 -0
  31. package/app/docs-pages/index.vue +12 -0
  32. package/app/docs-pages/post.vue +8 -0
  33. package/app/error.vue +23 -115
  34. package/app/layouts/default.vue +25 -7
  35. package/app/lib/blogTypes.ts +8 -0
  36. package/app/lib/docsFirst.ts +11 -0
  37. package/app/lib/docsInit.ts +18 -0
  38. package/app/lib/docsNav.ts +36 -0
  39. package/app/lib/docsPage.ts +44 -0
  40. package/app/lib/markdownComponents.ts +16 -0
  41. package/app/lib/previewToc.ts +18 -0
  42. package/dist/config.d.mts +232 -0
  43. package/dist/config.d.ts +232 -0
  44. package/dist/config.mjs +114 -0
  45. package/dist/pages.d.mts +5 -0
  46. package/dist/pages.d.ts +5 -0
  47. package/dist/pages.mjs +36 -0
  48. package/dist/shared/ginko-docs.BwbF7JBR.mjs +4 -0
  49. package/i18n/de.json +1 -0
  50. package/i18n/en.json +1 -0
  51. package/icons/README.md +2 -0
  52. package/icons/bluesky.svg +1 -0
  53. package/icons/claude.svg +1 -0
  54. package/icons/discord.svg +1 -0
  55. package/icons/github.svg +1 -0
  56. package/icons/linkedin.svg +1 -0
  57. package/icons/mastodon.svg +1 -0
  58. package/icons/openai.svg +1 -0
  59. package/icons/x.svg +1 -0
  60. package/icons/youtube.svg +1 -0
  61. package/nuxt.config.ts +34 -209
  62. package/package.json +43 -76
  63. package/public/_docs/fonts/LICENSE +188 -0
  64. package/public/_docs/fonts/inter-latin-wght-normal.woff2 +0 -0
  65. package/public/_docs/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  66. package/public/_docs/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  67. package/server/feeds/blog-locale.get.ts +9 -0
  68. package/server/feeds/blog.get.ts +4 -0
  69. package/server/lib/blogFeed.ts +35 -0
  70. package/server/lib/rss.ts +57 -0
  71. package/server/mcp/handler.ts +108 -0
  72. package/server/routes/__ginko/docs-mcp.ts +35 -0
  73. package/shared/paths.ts +4 -0
  74. package/app/app.vue +0 -98
  75. package/app/assets/css/prose.css +0 -3240
  76. package/app/assets/css/tailwind.css +0 -394
  77. package/app/assets/css/theme-palettes.css +0 -309
  78. package/app/assets/css/theme-presets.css +0 -141
  79. package/app/components/OgImage/GinkoDocs.satori.vue +0 -238
  80. package/app/components/content/DocumentPageShell.vue +0 -55
  81. package/app/components/content/Feedback.vue +0 -102
  82. package/app/components/content/ImageZoomDialog.vue +0 -84
  83. package/app/components/content/PageMarkdownCopy.vue +0 -104
  84. package/app/components/content/imageZoom.ts +0 -25
  85. package/app/components/mdc/MdcAccordion.vue +0 -67
  86. package/app/components/mdc/MdcAccordionItem.vue +0 -42
  87. package/app/components/mdc/MdcApi.vue +0 -159
  88. package/app/components/mdc/MdcAside.vue +0 -23
  89. package/app/components/mdc/MdcCallout.vue +0 -61
  90. package/app/components/mdc/MdcCard.vue +0 -175
  91. package/app/components/mdc/MdcCards.vue +0 -30
  92. package/app/components/mdc/MdcCenter.vue +0 -71
  93. package/app/components/mdc/MdcCodeGroup.vue +0 -197
  94. package/app/components/mdc/MdcCodeTree.vue +0 -234
  95. package/app/components/mdc/MdcCollapse.vue +0 -61
  96. package/app/components/mdc/MdcColumn.vue +0 -70
  97. package/app/components/mdc/MdcDropcap.vue +0 -84
  98. package/app/components/mdc/MdcError.vue +0 -23
  99. package/app/components/mdc/MdcExcerpt.vue +0 -26
  100. package/app/components/mdc/MdcFigure.vue +0 -85
  101. package/app/components/mdc/MdcFiles.vue +0 -120
  102. package/app/components/mdc/MdcIdea.vue +0 -17
  103. package/app/components/mdc/MdcInfo.vue +0 -17
  104. package/app/components/mdc/MdcInlineToc.vue +0 -51
  105. package/app/components/mdc/MdcKbd.vue +0 -10
  106. package/app/components/mdc/MdcLayout.vue +0 -57
  107. package/app/components/mdc/MdcNote.vue +0 -17
  108. package/app/components/mdc/MdcQuiz.vue +0 -241
  109. package/app/components/mdc/MdcQuizQuestion.vue +0 -221
  110. package/app/components/mdc/MdcReadMore.vue +0 -70
  111. package/app/components/mdc/MdcSteps.vue +0 -59
  112. package/app/components/mdc/MdcSuccess.vue +0 -23
  113. package/app/components/mdc/MdcTab.vue +0 -17
  114. package/app/components/mdc/MdcTabs.vue +0 -150
  115. package/app/components/mdc/MdcTimeline.vue +0 -17
  116. package/app/components/mdc/MdcTimelineItem.vue +0 -40
  117. package/app/components/mdc/MdcWarning.vue +0 -23
  118. package/app/components/mdc/api.utils.ts +0 -132
  119. package/app/components/mdc/code-tree.utils.ts +0 -22
  120. package/app/components/mdc/icons.ts +0 -10
  121. package/app/components/mdc/quiz.utils.ts +0 -38
  122. package/app/components/prose/ProseA.vue +0 -27
  123. package/app/components/prose/ProseBlockquote.vue +0 -30
  124. package/app/components/prose/ProseCode.vue +0 -14
  125. package/app/components/prose/ProseEm.vue +0 -14
  126. package/app/components/prose/ProseH1.vue +0 -18
  127. package/app/components/prose/ProseH2.vue +0 -29
  128. package/app/components/prose/ProseH3.vue +0 -29
  129. package/app/components/prose/ProseH4.vue +0 -29
  130. package/app/components/prose/ProseH5.vue +0 -15
  131. package/app/components/prose/ProseH6.vue +0 -15
  132. package/app/components/prose/ProseHr.vue +0 -12
  133. package/app/components/prose/ProseImg.vue +0 -55
  134. package/app/components/prose/ProseLi.vue +0 -14
  135. package/app/components/prose/ProseOl.vue +0 -14
  136. package/app/components/prose/ProseP.vue +0 -14
  137. package/app/components/prose/ProsePre.vue +0 -180
  138. package/app/components/prose/ProseStrong.vue +0 -14
  139. package/app/components/prose/ProseTable.vue +0 -18
  140. package/app/components/prose/ProseTbody.vue +0 -14
  141. package/app/components/prose/ProseTd.vue +0 -14
  142. package/app/components/prose/ProseTh.vue +0 -14
  143. package/app/components/prose/ProseThead.vue +0 -14
  144. package/app/components/prose/ProseTr.vue +0 -14
  145. package/app/components/prose/ProseUl.vue +0 -14
  146. package/app/components/site/ModeToggle.vue +0 -81
  147. package/app/components/site/SiteBanner.vue +0 -97
  148. package/app/components/site/SiteFooter.vue +0 -90
  149. package/app/components/site/SiteHeader.vue +0 -371
  150. package/app/components/site/SiteHeroCode.vue +0 -173
  151. package/app/components/site/SiteInteractionLayer.vue +0 -42
  152. package/app/components/site/SiteLocaleSwitcher.vue +0 -190
  153. package/app/components/site/SiteLogoMark.vue +0 -12
  154. package/app/components/site/SiteSkipLink.vue +0 -14
  155. package/app/components/site/SiteSocialLinks.vue +0 -33
  156. package/app/components/site/header-utils.ts +0 -3
  157. package/app/components/site/mode-toggle.utils.ts +0 -18
  158. package/app/components/ui/badge/Badge.vue +0 -28
  159. package/app/components/ui/badge/index.ts +0 -24
  160. package/app/components/ui/button/Button.vue +0 -31
  161. package/app/components/ui/button/index.ts +0 -35
  162. package/app/components/ui/collapsible/Collapsible.vue +0 -15
  163. package/app/components/ui/collapsible/CollapsibleContent.vue +0 -25
  164. package/app/components/ui/collapsible/CollapsibleTrigger.vue +0 -12
  165. package/app/components/ui/collapsible/index.ts +0 -3
  166. package/app/components/ui/dropdown-menu/DropdownMenu.vue +0 -15
  167. package/app/components/ui/dropdown-menu/DropdownMenuContent.vue +0 -50
  168. package/app/components/ui/dropdown-menu/DropdownMenuItem.vue +0 -41
  169. package/app/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +0 -15
  170. package/app/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +0 -37
  171. package/app/components/ui/dropdown-menu/DropdownMenuSeparator.vue +0 -23
  172. package/app/components/ui/dropdown-menu/DropdownMenuTrigger.vue +0 -14
  173. package/app/components/ui/dropdown-menu/index.ts +0 -7
  174. package/app/components/ui/kbd/Kbd.vue +0 -23
  175. package/app/components/ui/kbd/index.ts +0 -21
  176. package/app/components/ui/scroll-area/ScrollArea.vue +0 -39
  177. package/app/components/ui/scroll-area/ScrollBar.vue +0 -33
  178. package/app/components/ui/scroll-area/index.ts +0 -2
  179. package/app/components/ui/separator/Separator.vue +0 -27
  180. package/app/components/ui/separator/index.ts +0 -1
  181. package/app/components/ui/sheet/Sheet.vue +0 -15
  182. package/app/components/ui/sheet/SheetContent.vue +0 -59
  183. package/app/components/ui/sheet/SheetDescription.vue +0 -21
  184. package/app/components/ui/sheet/SheetOverlay.vue +0 -26
  185. package/app/components/ui/sheet/SheetTitle.vue +0 -21
  186. package/app/components/ui/sheet/SheetTrigger.vue +0 -12
  187. package/app/components/ui/sheet/index.ts +0 -5
  188. package/app/components/ui/tabs/Tabs.vue +0 -24
  189. package/app/components/ui/tabs/TabsList.vue +0 -26
  190. package/app/components/ui/tabs/TabsTrigger.vue +0 -28
  191. package/app/components/ui/tabs/index.ts +0 -3
  192. package/app/composables/site-navigation.utils.ts +0 -133
  193. package/app/composables/useCanonicalUrl.ts +0 -9
  194. package/app/composables/useContentRouteAlternates.ts +0 -35
  195. package/app/composables/useGinkoAnalytics.ts +0 -52
  196. package/app/composables/useGinkoDocsConfig.ts +0 -6
  197. package/app/composables/useGinkoOgImage.ts +0 -20
  198. package/app/composables/useLocalizedPath.ts +0 -12
  199. package/app/composables/useLocalizedRouteSwitch.ts +0 -31
  200. package/app/composables/useMetaKey.ts +0 -18
  201. package/app/composables/usePageMarkdownActions.ts +0 -79
  202. package/app/composables/useProseAppearance.ts +0 -24
  203. package/app/composables/useSchemaJsonLd.ts +0 -25
  204. package/app/composables/useSiteNavigation.ts +0 -64
  205. package/app/config/site.utils.ts +0 -36
  206. package/app/features/docs/components/DocsBreadcrumb.vue +0 -37
  207. package/app/features/docs/components/DocsContributeLinks.vue +0 -75
  208. package/app/features/docs/components/DocsMobileToc.vue +0 -108
  209. package/app/features/docs/components/DocsPageContent.vue +0 -234
  210. package/app/features/docs/components/DocsPageNav.vue +0 -57
  211. package/app/features/docs/components/DocsSidebar.vue +0 -145
  212. package/app/features/docs/components/DocsSidebarDropdown.vue +0 -70
  213. package/app/features/docs/components/DocsSidebarItem.vue +0 -122
  214. package/app/features/docs/components/DocsSidebarList.vue +0 -35
  215. package/app/features/docs/components/DocsSidebarRow.vue +0 -27
  216. package/app/features/docs/components/DocsSidebarTabs.vue +0 -59
  217. package/app/features/docs/components/DocsToc.vue +0 -106
  218. package/app/features/docs/composables/useDocsNavigation.ts +0 -29
  219. package/app/features/docs/composables/useDocsNavigationData.ts +0 -18
  220. package/app/features/docs/composables/useRevealActive.ts +0 -58
  221. package/app/features/docs/composables/useScrollspy.ts +0 -135
  222. package/app/features/docs/docs-navigation.ts +0 -157
  223. package/app/features/docs/toc-context.ts +0 -6
  224. package/app/features/search/command-center.ts +0 -110
  225. package/app/features/search/components/SiteCommandCenter.vue +0 -359
  226. package/app/features/search/components/SiteSearchPageHighlight.vue +0 -126
  227. package/app/features/search/useCommandCenter.ts +0 -292
  228. package/app/layouts/blog.vue +0 -15
  229. package/app/layouts/docs.vue +0 -20
  230. package/app/lib/errors.ts +0 -37
  231. package/app/lib/schema-org.ts +0 -38
  232. package/app/pages/blog/[slug].vue +0 -228
  233. package/app/pages/blog/index.vue +0 -130
  234. package/app/pages/docs/[...slug].vue +0 -10
  235. package/app/pages/docs/index.vue +0 -19
  236. package/app/pages/index.vue +0 -278
  237. package/app/plugins/ginko-docs-theme.ts +0 -14
  238. package/app/plugins/ssr-width.ts +0 -6
  239. package/app/utils/content.ts +0 -67
  240. package/app/utils/file-icons.ts +0 -90
  241. package/app/utils/index.ts +0 -7
  242. package/app/utils/repository.ts +0 -20
  243. package/components.ts +0 -9
  244. package/content-collections.ts +0 -89
  245. package/content.js +0 -200
  246. package/content.ts +0 -104
  247. package/i18n/i18n.config.ts +0 -10
  248. package/i18n/locales.ts +0 -81
  249. package/i18n/messages/global/banner.ts +0 -8
  250. package/i18n/messages/global/blog.ts +0 -18
  251. package/i18n/messages/global/command.ts +0 -49
  252. package/i18n/messages/global/docs.ts +0 -36
  253. package/i18n/messages/global/errors.ts +0 -36
  254. package/i18n/messages/global/feedback.ts +0 -11
  255. package/i18n/messages/global/index.ts +0 -21
  256. package/i18n/messages/global/nav.ts +0 -26
  257. package/i18n/messages/global/site.ts +0 -4
  258. package/i18n/messages/global/theme.ts +0 -9
  259. package/i18n/messages/index.ts +0 -20
  260. package/i18n/messages/localize.ts +0 -35
  261. package/i18n/routes.ts +0 -33
  262. package/icon-bundle.ts +0 -116
  263. package/index.d.ts +0 -37
  264. package/modules/analytics-boundary.ts +0 -23
  265. package/modules/feature-routing.ts +0 -68
  266. package/modules/syntax-highlighting.ts +0 -120
  267. package/public/fonts/public-sans/LICENSE +0 -93
  268. package/public/fonts/public-sans/README.md +0 -12
  269. package/public/fonts/public-sans/public-sans-400-normal-latin.woff +0 -0
  270. package/public/fonts/public-sans/public-sans-500-normal-latin.woff +0 -0
  271. package/public/fonts/public-sans/public-sans-600-normal-latin.woff +0 -0
  272. package/public/fonts/public-sans/public-sans-700-normal-latin.woff +0 -0
  273. package/runtime/generate-favicons.mjs +0 -124
  274. package/runtime/server/agent-markdown.ts +0 -19
  275. package/server/api/_ginko-docs/redirects.get.ts +0 -28
  276. package/server/mcp/tools/get-page.ts +0 -14
  277. package/server/mcp/tools/list-pages.ts +0 -10
  278. package/server/middleware/redirects.ts +0 -22
  279. package/server/plugins/agent-markdown.ts +0 -6
  280. package/server/plugins/sitemap-policy.ts +0 -12
  281. package/server/routes/.well-known/ai-catalog.json.get.ts +0 -10
  282. package/server/routes/[locale]/blog/rss.xml.get.ts +0 -13
  283. package/server/routes/blog/rss.xml.get.ts +0 -5
  284. package/server/routes/mcp/server-card.get.ts +0 -14
  285. package/server/utils/blog-feed.ts +0 -51
  286. package/server/utils/feed.ts +0 -70
  287. package/server/utils/mcp-server-card.ts +0 -45
  288. package/server/utils/redirects.ts +0 -38
  289. package/server/utils/redirects.utils.ts +0 -58
  290. package/server/utils/sitemap.ts +0 -45
  291. package/shared/route-slugs.ts +0 -5
  292. package/shared/theme-palettes.ts +0 -37
  293. package/shared/theme-presets.ts +0 -3
  294. package/shared/types/app-config.ts +0 -172
  295. package/shared/types/nuxt-config.ts +0 -14
  296. package/tags.ts +0 -192
package/CHANGELOG.md ADDED
@@ -0,0 +1,78 @@
1
+ # @lupinum/ginko-docs
2
+
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`ea2ea13`](https://github.com/lupinum-dev/ginko/commit/ea2ea133997f2011ad0d43f77a0f1dc75605923e) Thanks [@Mat4m0](https://github.com/Mat4m0)! - Add Ginko 0.4, the first release: one content system for Nuxt websites, from Markdown files in Git to a hosted platform.
8
+
9
+ Owners, staff and AI agents edit the same content. All seven packages release together under one version. It starts at 0.4 because `@lupinum/ginko-content` and `@lupinum/ginko-docs` already published an older, unrelated line up to 0.3. Until 1.0, a minor version (0.4 → 0.5) may contain breaking changes; the changelog names each one and how to update.
10
+
11
+ Requirements: Node 22.18+, 24 or 26, and Nuxt 4.6+ or Nuxt 5 (tested on its nightly until it is released). Start a site with `npm create ginko@latest my-site`; the documentation explains every step.
12
+
13
+ **Public API**
14
+
15
+ - `@lupinum/ginko`: `defineSite`, `single`, `collection`, `f`, `defineComponents`, `formatMoney`, `plainText`, `safeHref`, `startOfWeek` and the documented types. Imported, not auto-imported.
16
+ - `@lupinum/ginko/nuxt`: the module, the `useGinko*` composables (everything that needs a Nuxt app starts with `useGinko`), `<GinkoMarkdown>` and `<GinkoImage>`. `@lupinum/ginko/vue`: `<GinkoMarkdown>` for any Vue app. `@lupinum/ginko/search`: `loadIndex` and `search`.
17
+ - `@lupinum/ginko/internal` and `@lupinum/ginko/internal/search` are for Ginko's own packages and have no stability promise.
18
+ - The `ginko` CLI: `check [--offline]`, `release` and `export [folder]`, plus `--version`. Every command run prints one JSON line, `{ "ok": true, … }` or `{ "ok": false, "error": { code, message } }` (`--help` and `--version` print plain text), and ends with exit code 0 (ok), 1 (fix the code), 2 (usage), 3 (platform unreachable, retry) or 4 (key not allowed). CI deploys the site only when `release` prints `"deploy": true` (a superseded run exits 0 with `"deploy": false`). The CLI reads `GINKO_PLATFORM` (or `NUXT_PUBLIC_GINKO_PLATFORM`), `GINKO_KEY`, `GINKO_COMMIT` (or `GITHUB_SHA`), `GINKO_BRANCH` and `GINKO_REMOTE`; it does not read `.env` files. `ginko-i18n --json` uses the same output shape, error codes (`USAGE`, `INVALID`) and exit codes.
19
+ - Config names: `f.ref` (one entry) and `f.refs` (several); `visible: { mode: 'until', field, days?, deleteExpired? }`; prefill tokens `@today`, `@workWeek`, `@nextWorkWeek`; `firstDayOfWeek`, `linkCheck`, `untranslated`, `maxBytes`, `Migration.compute`, `retired` rule `{ drop: true }`. Options and defaults are typed per field, and an unknown top-level key fails the build.
20
+ - Markdown components: `embed`, `frame` (`none`, `card`, `border`, …), `background` (`none`, `muted`, `tint`), `appearance` (`quiet`, `tint`), `quiz-question{mode}`, `code-tree{file}`.
21
+
22
+ **Content (`@lupinum/ginko`, `@lupinum/ginko-content`)**
23
+
24
+ - One text format: Markdown (comark 0.7) everywhere, with field profiles that limit what a field may contain. Footnotes, emoji, alerts, Shiki code, task lists, route links (`$blog.my-post`), reusable snippets and heading anchors.
25
+ - Data files: YAML and JSON (one file, one entry) and CSV (one file, many entries), checked against the field schema; every error names the file and field, and the line for CSV rows and unreadable files. Entries with `draft: true` stay out of production builds.
26
+ - Query engine in the site, over the loaded bundle: `where`, `order`, `limit`, pagination with totals, field selection, `include` for references, previous/next and facet counts.
27
+ - References (`f.ref`, `f.refs`), navigation trees and breadcrumbs, and a URL for every entry in every language; two entries on one URL fail the build.
28
+ - Link check before any HTML exists: route links, anchors, snippets and redirected paths, in the build, the dev terminal, `ginko check` and the agent tools. On the platform a save, a new entry or a scheduled publish that adds a broken link is stopped, and History says why. External links are checked on request (`linkCheck.external`), at build and in `ginko check` (never in dev), with a 7-day cache.
29
+ - Images: WebP copies at 480, 960 and 1600 px, made at upload on the platform and at build for files. `<GinkoImage>` and Markdown images get `srcset` and `sizes`.
30
+ - Redirects from `redirectFrom` (301) and site rules in `redirects` (301 by default, `status` 302/307/308 per rule).
31
+ - SEO from the bundle, with no other module: title template, canonical, Open Graph with `og:url`, `<html lang>`, hreflang with `x-default`, sitemap with `lastmod`, images and alternates, robots.txt with `noindex` on preview hosts, JSON-LD. With `nuxt-og-image` (in every starter), every page gets a generated share card in the brand colour `seo.color`, with the site's logo and the page's image.
32
+ - Works with the Nuxt SEO modules (`@nuxtjs/seo` or single ones, in any order): Ginko leaves them sitemap, robots.txt and JSON-LD defaults and hands them its pages with hreflang, the site's address, name and languages, and `noindex` on preview hosts. `nuxt-ai-ready` stays off while Ginko serves `/llms.txt`. Requires `nuxt-og-image` 7.
33
+ - Search index built in plain JS at build time, one record per heading section, loaded lazily per language.
34
+ - Agent output: `/llms.txt`, `/llms-full.txt`, a `.md` twin for every entry page (collections with a `route`), and a Markdown 404 that suggests pages. The normal address always answers with HTML.
35
+ - Render modes: Git-only sites prerender everything; platform sites refresh changed pages after a publish; previews render with `noindex`.
36
+ - In dev, `nuxt dev` restarts when `ginko.config.ts` changes, and a brick that cannot reach the platform names itself and the fix.
37
+ - CLI `ginko`: `check` (schema, links and the share image, for every site; `--offline` without the platform) and `release` for CI, `export` for backups; `pnpm local:dev|import|pull` run only in the Ginko monorepo.
38
+
39
+ **Languages (`@lupinum/ginko-i18n`)**
40
+
41
+ - The only locale authority: routes, alternates, hreflang, messages with plurals, and formatters for dates, ranges, relative time, numbers, currency and lists, each in the site's time zone.
42
+ - Works on its own in any Nuxt 4.6+ or Nuxt 5 app, without the rest of Ginko.
43
+
44
+ **Components and docs (`@lupinum/ginko-components`, `@lupinum/ginko-docs`)**
45
+
46
+ - Content components with props defined as Ginko fields: callouts, tabs, code groups, steps, cards, accordion, figures, embeds (click to load), timeline, quiz and more. Each one can also be copied into an app with the shadcn-vue CLI, from a registry the docs build generates.
47
+ - Docs layer (`@lupinum/ginko-docs`; `npm create ginko@latest my-docs -- --preset docs` starts a site with it): navigation, section tabs, breadcrumbs, table of contents with scroll spy, previous/next, ⌘K search with heading results, blog with authors and RSS, changelog, copy page as Markdown, dark mode. A guide for switching from Nuxt Content and `@nuxtjs/i18n`. Math (KaTeX) and mermaid diagrams render and load only on pages that use them.
48
+
49
+ **Platform and Studio (hosted by Lupinum)**
50
+
51
+ The platform is a hosted service, not an npm package. A site connects to it with one setting; without it, the site reads its content from files.
52
+
53
+ - Quick tasks for the jobs owners do most ("Heute geschlossen", "Preis ändern"), phone first, with the full form behind "Alles bearbeiten".
54
+ - Files library: All, Recent, Unused, Missing alt text, Duplicates and folders; icon and list views; "used in" with links; replace a file and keep its references; a used file cannot be removed by mistake. Alt text set in the library is the default for every use, per language.
55
+ - Approvals, off by default: a task or agent key can need a yes. Reviewers see the change, approve, approve for a time, or reject with a sentence; the author sees the reason. Releases publish several changes together.
56
+ - History with "show changes", "back to this version" and undo; drafts and scheduled publishing; trash with restore; translation status per language; "why is this not on the website?".
57
+ - Team and invitations with per-task rights, sign-in with an emailed code, AI agent keys with an MCP tool catalog derived from the operations, and weekly reminder mails.
58
+ - Long forms group their fields under headings or in tabs (`group` on a field, `layout: 'tabs'` on a brick); phones always show headings.
59
+ - A rich text editor (TipTap 3) that writes Markdown, where untouched text stays byte for byte. Headings, lists, task lists, quotes, code blocks, tables, images from the library, embeds, registry components with prop forms, slash and bubble menus, Markdown shortcuts and paste, source mode, find and replace (⌘F), a drag handle and Alt+↑/↓ to move blocks, character counter, a link card for pasted URLs, uploads with progress, and a formatting bar above the phone keyboard.
60
+ - Delete a site, with seven days to cancel, and delete your own account. The last owner of a site must hand it over or delete it first.
61
+ - Studio in German, English and Spanish (beta), light and dark.
62
+
63
+ **Presets (`@lupinum/ginko-preset-gastro`, `create-ginko`)**
64
+
65
+ - Gastro: opening hours with exceptions, seasons, holidays and new hours from a date; lunch week with planning ahead and an optional PDF; menu with prices from a date; notices that expire; events; JSON-LD for Restaurant, Menu, opening hours and Event; a printable lunch sheet.
66
+ - `create-ginko` starts a new site, plain or with `--preset gastro|docs`. Starters install with npm, pnpm 11 and bun, carry a `typecheck` script, a page description and share cards (`nuxt-og-image` with Takumi, Nuxt 4.6.1 or later; set `NUXT_APP_SECRET` where the site runs, `.env` has one), and create-ginko warns on an unsupported Node.
67
+
68
+ **Not in 0.4**
69
+
70
+ Real-time co-editing comes next. Also not included: an agency preset, the editor UI as a shadcn-vue registry, OAuth for agent connectors, and a Google Business sync.
71
+
72
+ ### Patch Changes
73
+
74
+ - Updated dependencies [[`ea2ea13`](https://github.com/lupinum-dev/ginko/commit/ea2ea133997f2011ad0d43f77a0f1dc75605923e)]:
75
+ - @lupinum/ginko@0.4.0
76
+ - @lupinum/ginko-i18n@0.4.0
77
+ - @lupinum/ginko-content@0.4.0
78
+ - @lupinum/ginko-components@0.4.0
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024-present Lupinum OG and contributors
3
+ Copyright (c) 2025-2026 Lupinum OG
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,86 +1,238 @@
1
- <p align="center">
2
- <img src="https://raw.githubusercontent.com/lupinum-dev/ginko-docs/main/docs/public/favicon.svg" width="128" alt="Ginko Docs icon">
3
- </p>
1
+ # @lupinum/ginko-docs
4
2
 
5
- <h1 align="center">@lupinum/ginko-docs</h1>
3
+ A Nuxt layer for documentation sites on [`@lupinum/ginko`](https://github.com/lupinum-dev/ginko/tree/main/packages/ginko)
4
+ and [`@lupinum/ginko-content`](https://github.com/lupinum-dev/ginko/tree/main/packages/ginko-content):
5
+ a whole docs site with a start page, navigation, search, blog and changelog, or docs inside a site that already exists
6
+ (see "Inside an existing site"). The Markdown components (callouts, tabs, steps, cards,
7
+ code blocks and more) come from `@lupinum/ginko-components`. Math (`$x^2$`, `$$…$$`) renders with KaTeX and `mermaid` code fences as diagrams; both load only on pages that use them. Pages are Markdown files in `content/docs/`.
6
8
 
7
- <p align="center">Add a complete documentation experience to a Nuxt application through one reusable layer.</p>
9
+ ## Use
8
10
 
9
- <p align="center">
10
- <a href="https://www.npmjs.com/package/@lupinum/ginko-docs"><img src="https://img.shields.io/npm/v/@lupinum/ginko-docs?color=00DC82" alt="npm version"></a>
11
- <a href="https://github.com/lupinum-dev/ginko-docs/actions/workflows/ci.yml"><img src="https://github.com/lupinum-dev/ginko-docs/actions/workflows/ci.yml/badge.svg" alt="CI status"></a>
12
- <a href="https://github.com/lupinum-dev/ginko-docs/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT license"></a>
13
- </p>
11
+ ```bash
12
+ npm install @lupinum/ginko @lupinum/ginko-content @lupinum/ginko-i18n @lupinum/ginko-docs
13
+ ```
14
14
 
15
- > [!WARNING]
16
- > This package is stable in the 0.3 release line. Because it is pre-1.0, a later minor release can contain breaking changes.
15
+ ```ts
16
+ // ginko.config.ts
17
+ import { defineSite } from '@lupinum/ginko'
18
+ import { components, docsCollection } from '@lupinum/ginko-docs/config'
19
+
20
+ const locales = ['en', 'de'] as const
21
+
22
+ export default defineSite({
23
+ site: 'my-docs',
24
+ name: 'My docs',
25
+ url: 'https://docs.example.com',
26
+ timeZone: 'Europe/Vienna',
27
+ locales,
28
+ currency: 'EUR',
29
+ pages: { home: { en: '/', de: '/de' } }, // the start page is the page `home`
30
+ components, // the Markdown components: ::callout, ::tabs, ::steps …
31
+ bricks: { docs: docsCollection({ locales }) },
32
+ })
33
+ ```
17
34
 
18
- ## Purpose
35
+ `docsCollection`, `blogCollections`, `blogPages` and `changelogPages` take one options object. `locales` is the same list as
36
+ in `defineSite` (the layer accepts any `readonly string[]`; `defineSite` itself needs the tuple, hence `as const`).
19
37
 
20
- Use this package when a Nuxt application needs documentation routes, navigation, search, localization, metadata, social images, feedback, and agent-readable content. The layer provides the interface while the consuming application keeps ownership of its content and identity.
38
+ `components` is the registry of `@lupinum/ginko-components` (a dependency of the layer, re-exported here). With it, Ginko checks every component tag and prop in the
39
+ pages; a site can add its own components next to it (see "Inside an existing site").
21
40
 
22
- ## Requirements
41
+ Limits of the layer:
23
42
 
24
- - Node.js 22.18, 24.11, or 26 and later maintenance releases
25
- - Nuxt 4.5.1 or later in the Nuxt 4 line
26
- - Vue 3.5.40 or later
27
- - Ginko Content 0.4 prerelease or later in the 0.4 line
43
+ - It finds its content by brick key, so keep these names: `docs` (docsCollection), `home` (docsHome), `posts` and
44
+ `authors` (blogCollections), `changelog` (changelogCollection). Only `docs` is required. One site has one docs
45
+ collection.
46
+ - The docs move with `base`; the blog is always at `/blog` and the changelog at `/changelog` (with the language
47
+ prefix in other languages, for example `/de/blog`).
28
48
 
29
- ## Installation
49
+ ```ts
50
+ // nuxt.config.ts
51
+ import ginko from './ginko.config.ts'
30
52
 
31
- ```bash
32
- pnpm add -D @lupinum/ginko-docs@0.4.0-rc.9 @lupinum/ginko-content@1.0.0-beta.5
53
+ export default defineNuxtConfig({ extends: ['@lupinum/ginko-docs'], modules: ['@lupinum/ginko/nuxt'], ginko })
33
54
  ```
34
55
 
56
+ ## Configure
57
+
58
+ Options go in the site's `app.config.ts`. All are optional. Internal paths in `nav`, `footer.links` and `banner.href`
59
+ follow the reader's language (`/guide` becomes `/de/guide`); absolute URLs stay as written.
60
+
35
61
  ```ts
36
- export default defineNuxtConfig({
37
- extends: ["@lupinum/ginko-docs"],
38
- site: { url: "https://docs.example.com" },
39
- i18n: { baseUrl: "https://docs.example.com" },
40
- });
62
+ export default defineAppConfig({
63
+ docs: {
64
+ title: 'My docs', // header text, next to the logo (default: `name` from ginko.config.ts)
65
+ logo: { light: '/logo.svg', dark: '/logo-dark.svg' }, // `wordmark: true` when the image holds the name
66
+ theme: 'green', // colour preset: 'default' (emerald on zinc) or 'green' (green on slate)
67
+ nav: [{ id: 'guide', href: '/guide' }], // header links after Docs, Blog, Changelog
68
+ social: [{ icon: 'docs:github', href: 'https://github.com/me/docs', label: 'GitHub' }],
69
+ banner: { id: 'v2', href: '/docs/changes' }, // dismissible notice above the header; `href` optional
70
+ repository: { url: 'https://github.com/me/docs', branch: 'main' }, // "Edit this page" and "Report an issue"
71
+ markdownActions: { copy: true, openIn: ['chatgpt', 'claude'] }, // "Copy page" and the chats of its menu (the defaults)
72
+ footer: {
73
+ links: [{ id: 'github', href: 'https://github.com/me/docs' }],
74
+ attribution: true, // "Built with Ginko", default true
75
+ },
76
+ },
77
+ })
41
78
  ```
42
79
 
43
- ## Quick start
80
+ Texts are not part of the config, they come from the site's own messages (`i18n/<code>.json`), so every
81
+ language has its own:
44
82
 
45
- ```ts
46
- import { defineGinkoDocsConfig } from "@lupinum/ginko-docs/content";
83
+ ```json
84
+ { "docs": { "banner": { "v2": "Version 2 is out." }, "nav": { "guide": "Guide" }, "footer": { "github": "GitHub" } } }
85
+ ```
47
86
 
48
- export default defineGinkoDocsConfig({
49
- site: {
50
- name: "Example Docs",
51
- description: "Documentation for Example.",
52
- whenToUse: "Use this site to learn and operate Example.",
53
- },
54
- locales: ["en"],
55
- blog: false,
56
- });
87
+ - `docs` is a reserved message namespace: keep your own messages out of it. Only `docs.nav.<id>`, `docs.footer.<id>` and `docs.banner.<id>` are yours to set; the other `docs.*` keys are the layer's own texts.
88
+ - `banner.id` picks the message `docs.banner.<id>`. A reader who closes the banner does not see it again (it is remembered in `localStorage`, and the page gets `data-docs-banner-off` on `<html>`); a new `id` shows it to everyone.
89
+ - Each `nav` and footer link `id` picks the message `docs.nav.<id>` or `docs.footer.<id>`.
90
+ - `social` icons are any Iconify name. Built in: `docs:github`, `docs:discord`, `docs:x`, `docs:bluesky`, `docs:mastodon`, `docs:linkedin`, `docs:youtube`.
91
+ - `repository` adds "Edit this page" to every page that comes from a file (`<url>/edit/<branch>/<source>`; `branch` defaults to `main`)
92
+ and, for GitHub, "Report an issue". `editUrl` (`{url}`, `{branch}`, `{source}`) and `issueUrl` (`{url}`, `{title}`, `{page}`) are templates for other hosts. Pages stored on the Ginko platform (not in files) link to
93
+ their form in the Studio instead, at the site's platform address.
94
+ - Every page shows "Last updated" from the entry's `updatedAt`, and its JSON-LD is a `TechArticle` with `dateModified`.
95
+ - "Copy page" copies the page as Markdown; its menu opens the `.md` twin, or ChatGPT or Claude with a prompt that points at it.
96
+ - The layer also serves a read-only [MCP](https://modelcontextprotocol.io) endpoint at `POST /__ginko/docs-mcp` (Streamable HTTP, JSON-RPC)
97
+ with the tools `search_docs(query, locale?)` and `read_doc(path)`. No auth, no rate limit: it only exposes what the public site shows.
98
+
99
+ ### Pages
100
+
101
+ Each docs page's frontmatter can set, besides `title` and `description`:
102
+
103
+ | Field | Effect |
104
+ | --- | --- |
105
+ | `section` | Starts a group in the side navigation with this heading; the pages after it belong to it until the next `section`. |
106
+ | `tab` | Starts a tab above the side navigation (for example "Guide" and "Reference"); pages follow the tab before them. |
107
+ | `parent` | Nests the page under another one (`parent: docs/<name>`: the entry id, the file name without number, locale and extension). |
108
+ | `icon` | An Iconify name, e.g. `lucide:rocket`, before the title in the navigation. Main locale only. |
109
+ | `badge` | A short label after the title, e.g. "New". |
110
+
111
+ Icons come from `@nuxt/icon` with the `lucide` set installed. Any other Iconify set works once the site installs it
112
+ (`pnpm add -D @iconify-json/<set>`). Icons are bundled at build time; no icon API is called.
113
+
114
+ ### Start page (optional)
115
+
116
+ `docsHome()` adds a `home` brick: one file `content/home.md` (and `home.<locale>.md`). Its frontmatter fills the hero
117
+ and the feature grid, the text below it follows them:
118
+
119
+ ```md
120
+ ---
121
+ title: Docs for my library.
122
+ description: One sentence on what it does.
123
+ install: npm install my-library
124
+ links:
125
+ - { label: Get started, href: /docs/introduction }
126
+ - { label: GitHub, href: https://github.com/me/lib }
127
+ features:
128
+ - { icon: lucide:zap, title: Fast, description: Why it is fast., href: /docs/speed }
129
+ ---
57
130
  ```
58
131
 
59
- Put Markdown files in `content/docs`. Open `/docs` after the Nuxt server starts.
132
+ Add `home: docsHome()` to `bricks`. Without it, `/` leads to the first docs page. A site's own `pages/index.vue` wins.
60
133
 
61
- Generate the browser icon set from one square SVG or raster source:
134
+ ### Look and colours
62
135
 
63
- ```bash
64
- pnpm exec ginko-docs-favicons --source public/product-icon.svg --out public
136
+ The layer is plain CSS. Colours, radius and fonts are shadcn-style tokens, the same ones
137
+ `@lupinum/ginko-components` reads: `--background`, `--foreground`, `--muted`, `--muted-foreground`, `--accent`,
138
+ `--border`, `--primary`, `--primary-foreground`, `--card`, `--popover`, `--ring`, `--radius`, `--font-sans`,
139
+ `--font-mono`. The layer's defaults have zero specificity, so any value the site sets wins:
140
+
141
+ ```css
142
+ /* assets/site.css */
143
+ :root {
144
+ --primary: light-dark(#2f6f4f, #7cc59d);
145
+ --primary-foreground: light-dark(#fff, #0c1f15);
146
+ --font-sans: 'Inter', system-ui, sans-serif;
147
+ }
65
148
  ```
66
149
 
67
- The command writes `favicon.svg`, `favicon-96x96.png`, `apple-touch-icon.png`, and `favicon.ico`. Ginko Docs adds the matching head links and uses the generated 96px PNG in Nuxt-preset social images so every supported source format renders consistently.
150
+ The defaults are `light-dark(light, dark)` pairs. The header switch stores the reader's choice in `localStorage`
151
+ (key `docs-color-mode`) and sets `data-theme="light|dark"` on `<html>`; a small inline script applies it before the first paint. A `.dark` class
152
+ on `<html>` (for example from `@nuxtjs/color-mode`) works too. Layout sizes are tokens as well: `--docs-sidebar`,
153
+ `--docs-toc`, `--docs-max`, `--docs-header`.
68
154
 
69
- ## Exports
155
+ ## Inside an existing site
70
156
 
71
- - `@lupinum/ginko-docs` is the Nuxt layer entry.
72
- - `@lupinum/ginko-docs/content` exports `defineGinkoDocsConfig`.
73
- - `@lupinum/ginko-docs/app-config` exports application configuration types.
74
- - `@lupinum/ginko-docs/components` exports the public MDC component contract.
157
+ The layer can add docs to a site that has its own design, pages and layout, for example a company site with docs
158
+ under `/docs` or `/handbook`:
75
159
 
76
- ## Documentation
160
+ ```ts
161
+ // nuxt.config.ts of the existing site
162
+ export default defineNuxtConfig({ extends: ['@lupinum/ginko-docs'], modules: ['@lupinum/ginko/nuxt'], ginko })
163
+ ```
164
+
165
+ ```ts
166
+ // ginko.config.ts: the docs brick next to the site's own bricks, the Markdown components next to the site's own
167
+ import { components, docsCollection } from '@lupinum/ginko-docs/config'
77
168
 
78
- Read the [Ginko Docs documentation](https://ginko-docs.lupinum.com) and the [root README](https://github.com/lupinum-dev/ginko-docs#readme).
169
+ bricks: { docs: docsCollection({ locales, base: '/handbook' }), /* … */ },
170
+ components: { ...components, /* the site's own components; same name wins */ },
171
+ ```
172
+
173
+ - **Only the docs pages are added.** The layer registers its pages from the bricks: the docs at the `base` of
174
+ `docsCollection` (default `/docs`), `/blog` (with its RSS feed) and `/changelog` only when those bricks exist, `/` only when the site
175
+ has no start page of its own. A page the site defines itself always wins.
176
+ - **The site's frame stays.** The header, footer and page background are the layer's `layouts/default.vue`. When
177
+ the site has its own `layouts/default.vue`, that one is used and the docs (navigation, page, table of contents)
178
+ sit inside it. On phones the navigation opens from a bar above the page, so the docs need no header of their own.
179
+ - **Nothing leaks.** Every rule is under a `docs-` class; the page background, font and `color-scheme` are only set
180
+ by the layer's own frame. The search, the language menu and the light/dark switch are components
181
+ (`<DocsSearch />`, `<DocsLanguage />`, `<DocsThemeToggle />`) the site can put into its own header; the switch sets
182
+ `data-theme` on `<html>`, so it fits a site that themes with that attribute. `<DocsThemeToggle segmented />` is the
183
+ three-way Auto/Light/Dark switch (the phone menu uses it). These three are the public components. The other `Docs*`
184
+ components, the `useDocs*` composables and the files in `app/lib` are internal and can change in any release.
185
+ - **Error page:** the layer's `error.vue` shows a not-found page inside the site's layout, with links home and to
186
+ the docs. A site with its own `error.vue` keeps it.
187
+ - **Components:** the layer loads the Vue side of `@lupinum/ginko-components`. Pass the registry in the site's
188
+ `components` (see above): only then does Ginko check the tags and props in the pages. Without a registry, the
189
+ check accepts any tag, so a misspelled `::calout` goes through without an error.
190
+ - **Title:** pages get the title `Page · Site name` from Ginko (`seo.titleTemplate` in `defineSite`). A
191
+ `titleTemplate` in `app.head` or from nuxt-seo-utils does not apply to them, so the name is never added twice.
192
+ - **Styling:** map the site's design tokens to the token names above (leave out the ones the site already defines
193
+ under the same name, often `--font-sans` and `--font-mono`). Two layout tokens line the docs up with the site:
194
+ - `--docs-max`: the width of the site's content container, so the sidebar starts where the header's logo does.
195
+ - `--docs-top`: the space the sidebar and table of contents keep from the top of the window when they stick, and
196
+ the scroll offset of headings. With a sticky header, its height; with a header that scrolls away, a small gap.
197
+
198
+ ```css
199
+ :root {
200
+ --background: var(--color-white);
201
+ --foreground: var(--color-ink);
202
+ --muted: var(--color-stone-100);
203
+ --muted-foreground: var(--color-stone-600);
204
+ --border: var(--color-stone-300);
205
+ --primary: var(--color-brand);
206
+ --radius: 0.75rem;
207
+ --docs-max: 82.5rem;
208
+ --docs-top: 4.5rem; /* sticky header 4.5rem high; 1.5rem for one that scrolls away */
209
+ }
210
+ ```
211
+
212
+ ## Blog and changelog (optional)
213
+
214
+ A site opts in by adding the collections to `ginko.config.ts`. The layer then adds the pages and the header links;
215
+ a site without them gets neither.
216
+
217
+ ```ts
218
+ import { blogCollections, blogPages, changelogCollection, changelogPages, docsCollection } from '@lupinum/ginko-docs/config'
219
+
220
+ export default defineSite({
221
+ // ...
222
+ pages: { /* home */ blog: blogPages({ locales }), changelog: changelogPages({ locales }) },
223
+ bricks: { docs: docsCollection({ locales }), ...blogCollections({ locales }), changelog: changelogCollection() },
224
+ })
225
+ ```
79
226
 
80
- ## Support and security
227
+ - `blogCollections({ locales })` returns `{ posts, authors }`. Both are file bricks, so the folders are `content/posts/` and `content/authors/` (the brick name is the folder name).
228
+ - **Posts** (`content/posts/<n>.<name>[.<locale>].md`) have `title`, `description`, `date` (`YYYY-MM-DD`), `authors` (a list of author ids), `image`, `tags` and `slug`. They live at `/blog/<slug>` (`/<l>/blog/<slug>` in other languages), the list at `/blog`, newest first.
229
+ - **Authors** (`content/authors/<name>[.<locale>].yml`) have `name`, `role`, `avatar` and `url`. A post names them by id: `authors: [authors/jane]`. Authors have no page.
230
+ - A post page writes Article JSON-LD with the author names, `datePublished` from `date` and `dateModified` from the entry's `updatedAt`.
231
+ - **RSS:** `/blog/rss.xml` and `/<l>/blog/rss.xml`, RSS 2.0 with title and description (not the full text) and absolute links. It reads the build-time file bundle, so it works for file blogs only. `nuxt generate` writes it: the blog page sends the feed path in the `x-nitro-prerender` header, because Nitro's crawler does not follow `.xml` links.
232
+ - **Changelog:** `changelogCollection()` (options: `max`) is one collection with `version`, `date` and Markdown text per release (`content/changelog/v1-2-0.md`; no dots in the file name, a dot reads as a language). The page `/changelog` shows all releases newest first, each with an anchor (`#v1-2-0`). It is a collection, not a docs page, so the date orders it and it has its own link in the header.
81
233
 
82
- Use [GitHub issues](https://github.com/lupinum-dev/ginko-docs/issues) or the [Lupinum OSS Discord](https://discord.gg/RPH6SeA36N) for support. Report vulnerabilities through the [private security process](https://github.com/lupinum-dev/ginko-docs/security/policy).
234
+ The Ginko docs themselves are built this way: [sites/docs](https://github.com/lupinum-dev/ginko/tree/main/sites/docs).
83
235
 
84
236
  ## License
85
237
 
86
- Released by [Lupinum OG](https://lupinum.com) under the [MIT License](https://github.com/lupinum-dev/ginko-docs/blob/main/LICENSE).
238
+ MIT © Lupinum OG
package/app/app.config.ts CHANGED
@@ -1,55 +1,42 @@
1
- import type { GinkoDocsAppConfig } from "../shared/types/app-config";
2
- export default {
3
- ginkoDocs: {
4
- theme: {
5
- preset: "default",
6
- neutral: "zinc",
7
- primary: "neutral",
8
- codeBlocks: "dark",
9
- },
10
- prose: {
11
- appearance: "tint",
12
- },
13
- site: {
14
- name: { en: "Ginko Docs", de: "Ginko Docs" },
15
- description: {
16
- en: "Documentation sites built with Nuxt and Ginko Content.",
17
- de: "Dokumentations-Sites auf Basis von Nuxt und Ginko Content.",
18
- },
19
- url: "http://localhost:3000",
20
- icon: "/favicon.svg",
21
- logo: { light: "/logo.svg", dark: "/logo-dark.svg" },
22
- docsSidebarSwitcher: "tabs",
23
- lupinumAttribution: true,
24
- legalLinks: [],
25
- },
26
- nav: { links: "auto", socialIcons: false },
27
- banner: {
28
- enabled: false,
29
- id: "default",
30
- showOnLanding: true,
31
- },
32
- social: {},
33
- feedback: { enabled: false },
34
- ogImage: { enabled: true, component: "GinkoDocs" },
35
- markdownActions: { chatGpt: true, claude: true, mcp: true },
36
- images: { zoom: true },
37
- toc: { depth: 3 },
38
- repository: undefined,
39
- landing: {
40
- title: {
41
- en: "Publish structured documentation.",
42
- de: "Veröffentliche strukturierte Dokumentation.",
43
- },
44
- description: {
45
- en: "A Nuxt layer for searchable, localized documentation with stable routes and agent-readable output.",
46
- de: "Ein Nuxt-Layer für durchsuchbare, lokalisierte Dokumentation mit stabilen Routen und agentenlesbarer Ausgabe.",
47
- },
48
- primary: {
49
- label: { en: "Get started", de: "Erste Schritte" },
50
- to: { en: "/docs", de: "/de/dokumentation" },
51
- },
52
- features: [],
53
- },
54
- } satisfies GinkoDocsAppConfig,
55
- };
1
+ // The site sets its docs options in its own app.config.ts; every option is optional:
2
+ // export default defineAppConfig({ docs: { title: 'Ginko', logo: { light: '/logo.svg' }, social: [...] } })
3
+ // Texts are not configured here but in the site's i18n messages (see the README).
4
+ import type { DocsAssistant } from './lib/docsPage'
5
+
6
+ export default defineAppConfig({ docs: {} })
7
+
8
+ export interface DocsConfig {
9
+ /** Brand name in the header; the accessible name of the logo. Default: `name` from ginko.config.ts. */
10
+ title?: string
11
+ /** A logo before the title, or instead of it with `wordmark: true` (the image then carries the name).
12
+ * `dark` is shown in dark mode (else `light` always). */
13
+ logo?: { light: string, dark?: string, wordmark?: boolean }
14
+ /** Colour preset: `default` (emerald on zinc) or `green` (green on slate). A site's own shadcn tokens win over either. */
15
+ theme?: 'default' | 'green'
16
+ /** More header links after Docs, Blog and Changelog. Texts: messages `docs.nav.<id>`. */
17
+ nav?: { id: string, href: string }[]
18
+ /** Icon links at the end of the header, e.g. `{ icon: 'docs:github', href, label: 'GitHub' }`. Built in:
19
+ * `docs:github`, `docs:discord`, `docs:x`, `docs:bluesky`, `docs:mastodon`, `docs:linkedin`, `docs:youtube`. */
20
+ social?: { icon: string, href: string, label: string }[]
21
+ /** Dismissible banner above the header. Text: message `docs.banner.<id>`. A new id shows it again to everyone. */
22
+ banner?: { id: string, href?: string }
23
+ /** Git host of the docs: "Edit this page" for pages from files, "Report an issue" for GitHub repositories. */
24
+ repository?: {
25
+ url: string
26
+ /** Default `main`. */
27
+ branch?: string
28
+ /** Edit link template; `{url}`, `{branch}` and `{source}` are replaced. Default `{url}/edit/{branch}/{source}`. */
29
+ editUrl?: string
30
+ /** Issue link template; `{url}`, `{title}` and `{page}` are replaced. Default on GitHub: a new issue with the page title. */
31
+ issueUrl?: string
32
+ }
33
+ /** "Copy page" (default true) and the chats the page menu can open it in (default both, `[]` for none). */
34
+ markdownActions?: { copy?: boolean, openIn?: DocsAssistant[] }
35
+ /** Footer. Link texts: messages `docs.footer.<id>`. `attribution` (default true) adds "Built with Ginko". */
36
+ footer?: { links?: { id: string, href: string }[], attribution?: boolean }
37
+ }
38
+
39
+ declare module '@nuxt/schema' {
40
+ interface AppConfigInput { docs?: DocsConfig }
41
+ interface AppConfig { docs: DocsConfig }
42
+ }