@lupinum/ginko-docs 0.4.0-rc.8 → 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
@@ -1,141 +0,0 @@
1
- /* Complete visual systems. Presets intentionally override palette selection;
2
- use the default preset when neutral and primary must be configured alone. */
3
-
4
- html[data-theme-preset="nuxt"] {
5
- /* Official Nuxt green scale. */
6
- --nuxt-green-50: #effdf5;
7
- --nuxt-green-100: #d9fbe8;
8
- --nuxt-green-200: #b3f5d1;
9
- --nuxt-green-300: #75edae;
10
- --nuxt-green-400: #00dc82;
11
- --nuxt-green-500: #00c16a;
12
- --nuxt-green-600: #00a155;
13
- --nuxt-green-700: #007f45;
14
- --nuxt-green-800: #016538;
15
- --nuxt-green-900: #0a5331;
16
- --nuxt-green-950: #052e16;
17
-
18
- /* Nuxt uses Slate for neutral surfaces. */
19
- --theme-neutral-50: var(--color-slate-50);
20
- --theme-neutral-100: var(--color-slate-100);
21
- --theme-neutral-200: var(--color-slate-200);
22
- --theme-neutral-300: var(--color-slate-300);
23
- --theme-neutral-400: var(--color-slate-400);
24
- --theme-neutral-500: var(--color-slate-500);
25
- --theme-neutral-600: var(--color-slate-600);
26
- --theme-neutral-700: var(--color-slate-700);
27
- --theme-neutral-800: var(--color-slate-800);
28
- --theme-neutral-900: var(--color-slate-900);
29
- --theme-neutral-950: var(--color-slate-950);
30
-
31
- /* Nuxt uses one recognizable brand green across interactive surfaces. */
32
- --theme-primary-light: var(--nuxt-green-400);
33
- --theme-primary-light-foreground: #020420;
34
- --theme-primary-light-ring: var(--nuxt-green-400);
35
- --theme-primary-dark: var(--nuxt-green-400);
36
- --theme-primary-dark-foreground: var(--nuxt-green-950);
37
- --theme-primary-dark-ring: var(--nuxt-green-400);
38
-
39
- /* Brand surfaces can use Nuxt green with its high-contrast navy foreground. */
40
- --brand: var(--nuxt-green-400);
41
- --brand-foreground: #020420;
42
-
43
- --background: #ffffff;
44
- --foreground: var(--color-slate-900);
45
- --card: #ffffff;
46
- --card-foreground: var(--color-slate-900);
47
- --popover: #ffffff;
48
- --popover-foreground: var(--color-slate-900);
49
- --primary: var(--theme-primary-light);
50
- --primary-foreground: var(--theme-primary-light-foreground);
51
- --secondary: var(--color-slate-50);
52
- --secondary-foreground: var(--color-slate-900);
53
- --muted: var(--color-slate-50);
54
- --muted-foreground: var(--color-slate-500);
55
- --accent: var(--color-slate-100);
56
- --accent-foreground: var(--color-slate-900);
57
- --border: var(--color-slate-200);
58
- --input: var(--color-slate-200);
59
- --ring: var(--nuxt-green-600);
60
- --code: var(--color-slate-50);
61
- --code-foreground: var(--color-slate-900);
62
- --code-border: var(--color-slate-200);
63
-
64
- --hero-bg: #ffffff;
65
- --hero-bg-muted: var(--color-slate-50);
66
- --hero-blue: var(--nuxt-green-400);
67
- --hero-blue-light: var(--nuxt-green-300);
68
- --hero-blue-dark: var(--nuxt-green-700);
69
- --hero-blue-muted: var(--nuxt-green-50);
70
- --hero-mint: var(--nuxt-green-400);
71
- --hero-mint-dark: var(--nuxt-green-700);
72
- --hero-mint-muted: var(--nuxt-green-50);
73
- --hero-mint-text: var(--nuxt-green-700);
74
- --hero-yellow: var(--nuxt-green-400);
75
- --hero-yellow-hover: var(--nuxt-green-500);
76
- --hero-yellow-dark: var(--nuxt-green-700);
77
- --hero-yellow-muted: var(--nuxt-green-50);
78
- --hero-coral: var(--nuxt-green-400);
79
- --hero-coral-light: var(--nuxt-green-300);
80
- --hero-coral-dark: var(--nuxt-green-700);
81
- --hero-coral-muted: var(--nuxt-green-50);
82
- --hero-coral-text: var(--nuxt-green-700);
83
- --hero-check: var(--nuxt-green-400);
84
- --hero-white: #ffffff;
85
-
86
- --agent-background: var(--color-slate-950);
87
- --agent-foreground: var(--color-slate-100);
88
- --agent-muted: var(--color-slate-400);
89
-
90
- /* Nuxt UI-compatible aliases for consumer-owned examples. */
91
- --ui-bg: var(--background);
92
- --ui-bg-muted: var(--muted);
93
- --ui-bg-elevated: var(--card);
94
- --ui-bg-accented: var(--accent);
95
- --ui-border: var(--border);
96
- --ui-border-muted: var(--border);
97
- --ui-border-accented: var(--border);
98
- --ui-text: var(--foreground);
99
- --ui-text-default: var(--foreground);
100
- --ui-text-highlighted: var(--foreground);
101
- --ui-text-muted: var(--muted-foreground);
102
- --ui-text-dimmed: var(--muted-foreground);
103
- --ui-text-toned: var(--muted-foreground);
104
- --ui-primary: var(--primary);
105
- }
106
-
107
- html.dark[data-theme-preset="nuxt"] {
108
- --background: var(--color-slate-950);
109
- --foreground: var(--color-slate-50);
110
- --card: var(--color-slate-900);
111
- --card-foreground: var(--color-slate-50);
112
- --popover: var(--color-slate-900);
113
- --popover-foreground: var(--color-slate-50);
114
- --primary: var(--nuxt-green-400);
115
- --primary-foreground: var(--nuxt-green-950);
116
- --secondary: var(--color-slate-900);
117
- --secondary-foreground: var(--color-slate-50);
118
- --muted: var(--color-slate-900);
119
- --muted-foreground: var(--color-slate-400);
120
- --accent: var(--color-slate-800);
121
- --accent-foreground: var(--color-slate-50);
122
- --border: var(--color-slate-800);
123
- --input: var(--color-slate-700);
124
- --ring: var(--nuxt-green-400);
125
- --code: var(--color-slate-900);
126
- --code-foreground: var(--color-slate-50);
127
- --code-border: var(--color-slate-800);
128
-
129
- --hero-bg: var(--color-slate-950);
130
- --hero-bg-muted: var(--color-slate-900);
131
- --hero-blue-dark: var(--nuxt-green-400);
132
- --hero-mint-dark: var(--nuxt-green-400);
133
- --hero-yellow-dark: var(--nuxt-green-400);
134
- --hero-coral-dark: var(--nuxt-green-400);
135
- --hero-blue-muted: color-mix(in oklab, var(--nuxt-green-400) 12%, var(--color-slate-900));
136
- --hero-mint-muted: var(--hero-blue-muted);
137
- --hero-yellow-muted: var(--hero-blue-muted);
138
- --hero-coral-muted: var(--hero-blue-muted);
139
- --hero-mint-text: var(--nuxt-green-300);
140
- --hero-coral-text: var(--nuxt-green-300);
141
- }
@@ -1,238 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed } from "vue";
3
- import { useAppConfig } from "#imports";
4
- import type { GinkoDocsAppConfig } from "../../../shared/types/app-config";
5
- import { getLocalizedSiteText } from "../../config/site.utils";
6
-
7
- const props = withDefaults(
8
- defineProps<{
9
- title?: string;
10
- description?: string;
11
- siteName?: string;
12
- logo?: string;
13
- locale?: string;
14
- colorBg?: string;
15
- colorFg?: string;
16
- colorMuted?: string;
17
- colorAccent?: string;
18
- }>(),
19
- {
20
- title: "",
21
- description: "",
22
- siteName: undefined,
23
- logo: undefined,
24
- locale: "en",
25
- },
26
- );
27
-
28
- const config = useAppConfig().ginkoDocs as GinkoDocsAppConfig;
29
- const isNuxtPreset = computed(() => config.theme.preset === "nuxt");
30
-
31
- const resolvedSiteName = computed(
32
- () => props.siteName ?? getLocalizedSiteText(config.site.name, props.locale),
33
- );
34
- const resolvedLogo = computed(() => props.logo ?? config.site.logo?.light);
35
- const resolvedNuxtIcon = computed(() => props.logo ?? "/favicon-96x96.png");
36
- const resolvedWordmark = computed(() =>
37
- isNuxtPreset.value ? config.site.logo?.dark : config.site.logo?.light,
38
- );
39
- const resolvedColorBg = computed(
40
- () => props.colorBg ?? (isNuxtPreset.value ? "#07111f" : "#ffffff"),
41
- );
42
- const resolvedColorFg = computed(
43
- () => props.colorFg ?? (isNuxtPreset.value ? "#ffffff" : "#0f172a"),
44
- );
45
- const resolvedColorMuted = computed(
46
- () => props.colorMuted ?? (isNuxtPreset.value ? "#aab8ca" : "#64748b"),
47
- );
48
- const resolvedColorAccent = computed(
49
- () => props.colorAccent ?? (isNuxtPreset.value ? "#00dc82" : "#2563eb"),
50
- );
51
- const displayTitle = computed(() => (props.title || resolvedSiteName.value).slice(0, 120));
52
- const displayDescription = computed(() => (props.description ?? "").slice(0, 180));
53
- </script>
54
-
55
- <template>
56
- <div
57
- v-if="isNuxtPreset"
58
- :style="{
59
- width: '100%',
60
- height: '100%',
61
- display: 'flex',
62
- flexDirection: 'column',
63
- backgroundColor: resolvedColorBg,
64
- fontFamily: 'Public Sans',
65
- overflow: 'hidden',
66
- position: 'relative',
67
- }"
68
- >
69
- <div
70
- :style="{
71
- position: 'absolute',
72
- top: '-360px',
73
- right: '-80px',
74
- width: '800px',
75
- height: '800px',
76
- borderRadius: '9999px',
77
- backgroundImage:
78
- 'radial-gradient(circle, rgba(0, 220, 130, 0.58) 0%, rgba(0, 220, 130, 0.08) 48%, rgba(0, 220, 130, 0) 72%)',
79
- }"
80
- />
81
-
82
- <div
83
- :style="{
84
- display: 'flex',
85
- alignItems: 'center',
86
- height: '72px',
87
- margin: '72px 96px 0',
88
- }"
89
- >
90
- <img :src="resolvedNuxtIcon" :width="72" :height="72" alt="" />
91
- <div
92
- :style="{
93
- display: 'flex',
94
- alignItems: 'center',
95
- height: '72px',
96
- marginLeft: '20px',
97
- color: resolvedColorFg,
98
- fontSize: '30px',
99
- fontWeight: 700,
100
- letterSpacing: '-0.03em',
101
- }"
102
- >
103
- {{ resolvedSiteName }}
104
- </div>
105
- </div>
106
-
107
- <div
108
- :style="{
109
- display: 'flex',
110
- flexDirection: 'column',
111
- justifyContent: 'flex-end',
112
- flex: 1,
113
- margin: '32px 96px 0',
114
- }"
115
- >
116
- <div
117
- :style="{
118
- display: 'flex',
119
- maxWidth: '980px',
120
- marginBottom: displayDescription ? '22px' : 0,
121
- fontSize: displayTitle.length > 50 ? '54px' : '72px',
122
- fontWeight: 700,
123
- lineHeight: 1.02,
124
- color: resolvedColorFg,
125
- letterSpacing: '-0.05em',
126
- }"
127
- >
128
- {{ displayTitle }}
129
- </div>
130
- <div
131
- v-if="displayDescription"
132
- :style="{
133
- display: 'flex',
134
- maxWidth: '900px',
135
- fontSize: '27px',
136
- lineHeight: 1.4,
137
- color: resolvedColorMuted,
138
- }"
139
- >
140
- {{ displayDescription }}
141
- </div>
142
- </div>
143
-
144
- <div
145
- :style="{
146
- display: 'flex',
147
- alignItems: 'center',
148
- height: '74px',
149
- margin: '24px 96px 56px',
150
- }"
151
- >
152
- <img
153
- v-if="resolvedWordmark"
154
- :src="resolvedWordmark"
155
- :width="240"
156
- :height="52"
157
- alt=""
158
- :style="{ objectFit: 'contain', objectPosition: 'left center' }"
159
- />
160
- </div>
161
- </div>
162
-
163
- <div
164
- v-else
165
- :style="{
166
- width: '100%',
167
- height: '100%',
168
- display: 'flex',
169
- flexDirection: 'column',
170
- justifyContent: 'space-between',
171
- padding: '72px 80px',
172
- backgroundColor: resolvedColorBg,
173
- fontFamily: 'Public Sans',
174
- }"
175
- >
176
- <div :style="{ display: 'flex', alignItems: 'center', gap: '20px' }">
177
- <img v-if="resolvedLogo" :src="resolvedLogo" :width="48" :height="48" alt="" />
178
- <div
179
- :style="{
180
- display: 'flex',
181
- fontSize: '30px',
182
- fontWeight: 700,
183
- color: resolvedColorFg,
184
- }"
185
- >
186
- {{ resolvedSiteName }}
187
- </div>
188
- </div>
189
-
190
- <div :style="{ display: 'flex', flexDirection: 'column', gap: '24px' }">
191
- <div
192
- :style="{
193
- display: 'flex',
194
- fontSize: displayTitle.length > 50 ? '56px' : '68px',
195
- fontWeight: 700,
196
- lineHeight: 1.15,
197
- color: resolvedColorFg,
198
- letterSpacing: '-0.02em',
199
- }"
200
- >
201
- {{ displayTitle }}
202
- </div>
203
- <div
204
- v-if="displayDescription"
205
- :style="{
206
- display: 'flex',
207
- fontSize: '30px',
208
- lineHeight: 1.4,
209
- color: resolvedColorMuted,
210
- }"
211
- >
212
- {{ displayDescription }}
213
- </div>
214
- </div>
215
-
216
- <div :style="{ display: 'flex', alignItems: 'center', gap: '16px' }">
217
- <div
218
- :style="{
219
- display: 'flex',
220
- width: '56px',
221
- height: '8px',
222
- borderRadius: '9999px',
223
- backgroundColor: resolvedColorAccent,
224
- }"
225
- />
226
- <div
227
- :style="{
228
- display: 'flex',
229
- width: '20px',
230
- height: '8px',
231
- borderRadius: '9999px',
232
- backgroundColor: resolvedColorMuted,
233
- opacity: 0.4,
234
- }"
235
- />
236
- </div>
237
- </div>
238
- </template>
@@ -1,55 +0,0 @@
1
- <script setup lang="ts">
2
- import type { FlatTocItem } from "#ginko-docs/utils/content";
3
- import { useI18n } from "#imports";
4
-
5
- const props = withDefaults(
6
- defineProps<{
7
- /** Server-provided table of contents from content metadata. */
8
- tocItems?: FlatTocItem[];
9
- tocTitle?: string;
10
- /** Inner wrapper (e.g. imprint: `max-w-2xl mx-auto w-full`). Default: full width of column. */
11
- contentClass?: string;
12
- /** Horizontal page gutter; set false when the parent layout already pads (e.g. blog). */
13
- padded?: boolean;
14
- }>(),
15
- {
16
- tocItems: () => [],
17
- contentClass: "w-full",
18
- padded: true,
19
- },
20
- );
21
-
22
- const { t } = useI18n();
23
- </script>
24
-
25
- <template>
26
- <div class="mx-auto w-full max-w-3xl" :class="padded ? 'px-4 md:px-6' : undefined">
27
- <div class="pt-8 pb-12 md:pt-10 md:pb-16 lg:pb-20">
28
- <div :class="contentClass">
29
- <nav
30
- v-if="tocItems.length > 0"
31
- :aria-label="tocTitle ?? t('docs.toc')"
32
- class="not-prose mb-8 border-b border-border pb-8"
33
- >
34
- <p class="mb-3 text-xs font-medium tracking-wider text-muted-foreground uppercase">
35
- {{ tocTitle ?? t("docs.toc") }}
36
- </p>
37
- <ul class="grid grid-cols-1 gap-x-6 gap-y-1.5 sm:grid-cols-2" role="list">
38
- <li v-for="item in tocItems" :key="item.id">
39
- <a
40
- :href="`#${item.id}`"
41
- class="text-sm leading-snug text-foreground/80 transition-colors hover:text-foreground"
42
- >
43
- {{ item.label }}
44
- </a>
45
- </li>
46
- </ul>
47
- </nav>
48
-
49
- <article class="[&_h2[id]]:scroll-mt-[var(--content-scroll-margin)]">
50
- <slot />
51
- </article>
52
- </div>
53
- </div>
54
- </div>
55
- </template>
@@ -1,102 +0,0 @@
1
- <script setup lang="ts">
2
- import { Button } from "#ginko-docs/components/ui/button";
3
- import { computed, ref, watch } from "vue";
4
- import { useI18n, useRouter } from "#imports";
5
- import { useGinkoAnalytics } from "#ginko-docs/composables/useGinkoAnalytics";
6
- import { useGinkoDocsConfig } from "#ginko-docs/composables/useGinkoDocsConfig";
7
- import { buildRepoIssueUrl } from "#ginko-docs/utils/repository";
8
-
9
- withDefaults(
10
- defineProps<{
11
- label?: string;
12
- }>(),
13
- {
14
- label: undefined,
15
- },
16
- );
17
- const { t, locale } = useI18n();
18
- const router = useRouter();
19
-
20
- const config = useGinkoDocsConfig();
21
- const analytics = useGinkoAnalytics();
22
- const enabled = config.feedback.enabled && analytics.enabled;
23
-
24
- type Sentiment = "positive" | "negative";
25
-
26
- const sentiment = ref<Sentiment | null>(null);
27
- const routePath = computed(() => router.currentRoute.value.path);
28
- watch(routePath, () => {
29
- sentiment.value = null;
30
- });
31
-
32
- const issueUrl = computed(() => {
33
- const repository = config.repository;
34
- if (!repository) return null;
35
- return buildRepoIssueUrl(repository, {
36
- title: t("feedback.issueTitle", { path: routePath.value }),
37
- body: t("docs.issueBody", { path: routePath.value }),
38
- });
39
- });
40
-
41
- function selectSentiment(s: Sentiment) {
42
- if (sentiment.value !== null) return;
43
- analytics.track("docs-feedback", {
44
- path: routePath.value,
45
- helpful: s === "positive" ? "yes" : "no",
46
- locale: locale.value,
47
- });
48
- sentiment.value = s;
49
- }
50
- </script>
51
-
52
- <template>
53
- <div v-if="enabled">
54
- <Transition
55
- enter-active-class="transition-opacity duration-200"
56
- enter-from-class="opacity-0"
57
- enter-to-class="opacity-100"
58
- >
59
- <div v-if="sentiment !== null" class="flex flex-wrap items-center gap-x-3 gap-y-1 py-1">
60
- <p class="text-sm text-muted-foreground">
61
- {{ t("feedback.thanks") }}
62
- </p>
63
- <a
64
- v-if="sentiment === 'negative' && issueUrl"
65
- :href="issueUrl"
66
- target="_blank"
67
- rel="noopener noreferrer"
68
- class="inline-flex items-center gap-1.5 text-sm font-medium text-foreground underline underline-offset-2 transition-colors hover:text-muted-foreground focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none"
69
- >
70
- <Icon name="lucide:circle-alert" class="size-4" aria-hidden="true" />
71
- {{ t("docs.reportIssue") }}
72
- </a>
73
- </div>
74
- </Transition>
75
-
76
- <div v-if="sentiment === null" class="flex flex-wrap items-center gap-3">
77
- <p class="text-sm font-semibold text-foreground">{{ label ?? t("feedback.label") }}</p>
78
-
79
- <div class="flex items-center gap-2">
80
- <Button
81
- variant="outline"
82
- size="sm"
83
- class="h-9 min-w-20 rounded-full px-4 text-muted-foreground shadow-sm"
84
- @click="selectSentiment('positive')"
85
- >
86
- <Icon name="lucide:thumbs-up" class="shrink-0" aria-hidden="true" />
87
- {{ t("feedback.yes") }}
88
- </Button>
89
-
90
- <Button
91
- variant="outline"
92
- size="sm"
93
- class="h-9 min-w-20 rounded-full px-4 text-muted-foreground shadow-sm"
94
- @click="selectSentiment('negative')"
95
- >
96
- <Icon name="lucide:thumbs-down" class="shrink-0" aria-hidden="true" />
97
- {{ t("feedback.no") }}
98
- </Button>
99
- </div>
100
- </div>
101
- </div>
102
- </template>
@@ -1,84 +0,0 @@
1
- <script setup lang="ts">
2
- import { AnimatePresence, Motion } from "motion-v";
3
- import { ref, useId } from "vue";
4
- import {
5
- DialogContent,
6
- DialogDescription,
7
- DialogPortal,
8
- DialogRoot,
9
- DialogTitle,
10
- DialogTrigger,
11
- } from "reka-ui";
12
- import { useI18n } from "#imports";
13
- import { useImageZoomMotion } from "./imageZoom";
14
-
15
- defineProps<{
16
- src?: string;
17
- alt?: string;
18
- /** Accessible dialog title; falls back to alt, then the zoom label. */
19
- label?: string;
20
- description?: string;
21
- }>();
22
-
23
- const { t } = useI18n();
24
- const open = ref(false);
25
- const layoutId = `ginko-image-${useId()}`;
26
- const { imageTransition, fadeTransition } = useImageZoomMotion();
27
- </script>
28
-
29
- <template>
30
- <DialogRoot v-model:open="open" :modal="false">
31
- <DialogTrigger as-child>
32
- <slot name="trigger" :layout-id="layoutId" :transition="imageTransition" />
33
- </DialogTrigger>
34
-
35
- <DialogPortal>
36
- <AnimatePresence>
37
- <Motion
38
- v-if="open"
39
- :initial="{ opacity: 0 }"
40
- :animate="{ opacity: 1 }"
41
- :exit="{ opacity: 0 }"
42
- :transition="fadeTransition"
43
- class="fixed inset-0 z-50 bg-background/80 backdrop-blur-sm will-change-opacity"
44
- />
45
-
46
- <DialogContent
47
- v-if="open"
48
- class="fixed inset-0 z-50 flex cursor-zoom-out flex-col items-center justify-center gap-4 p-[4vw] focus:outline-none"
49
- @click="open = false"
50
- >
51
- <DialogTitle class="sr-only">{{ label || alt || t("docs.zoomImage") }}</DialogTitle>
52
- <DialogDescription class="sr-only">{{
53
- description || alt || t("docs.zoomImage")
54
- }}</DialogDescription>
55
-
56
- <Motion as-child :layout-id="layoutId" :transition="imageTransition">
57
- <img
58
- :src="src"
59
- :alt="alt"
60
- class="max-h-[82dvh] w-auto max-w-[min(94vw,80rem)] rounded-lg object-contain will-change-transform"
61
- />
62
- </Motion>
63
-
64
- <Motion
65
- v-if="label || alt"
66
- as-child
67
- :initial="{ opacity: 0, y: 8 }"
68
- :animate="{ opacity: 1, y: 0 }"
69
- :exit="{ opacity: 0, y: -4 }"
70
- :transition="fadeTransition"
71
- >
72
- <p
73
- aria-hidden="true"
74
- class="max-w-[min(92vw,40rem)] rounded-full border border-border bg-background px-4 py-1.5 text-center text-sm shadow-sm"
75
- >
76
- {{ label || alt
77
- }}<span v-if="description" class="text-muted-foreground"> · {{ description }}</span>
78
- </p>
79
- </Motion>
80
- </DialogContent>
81
- </AnimatePresence>
82
- </DialogPortal>
83
- </DialogRoot>
84
- </template>