@baybreezy/docd 0.0.1

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 (268) hide show
  1. package/app/app.config.ts +239 -0
  2. package/app/app.vue +19 -0
  3. package/app/assets/css/tailwind.css +335 -0
  4. package/app/assets/css/theme.css +1171 -0
  5. package/app/components/OgImage/Docs.takumi.vue +69 -0
  6. package/app/components/OgImage/Landing.takumi.vue +64 -0
  7. package/app/components/OgImage/Site.takumi.vue +32 -0
  8. package/app/components/Ui/Avatar/Avatar.vue +75 -0
  9. package/app/components/Ui/Avatar/Badge.vue +34 -0
  10. package/app/components/Ui/Avatar/Fallback.vue +30 -0
  11. package/app/components/Ui/Avatar/Group.vue +29 -0
  12. package/app/components/Ui/Avatar/GroupCount.vue +29 -0
  13. package/app/components/Ui/Avatar/Image.vue +29 -0
  14. package/app/components/Ui/Badge.vue +86 -0
  15. package/app/components/Ui/BadgeGroup.vue +314 -0
  16. package/app/components/Ui/BgPattern/Grid.vue +137 -0
  17. package/app/components/Ui/BorderBeam.vue +97 -0
  18. package/app/components/Ui/Breadcrumbs.vue +103 -0
  19. package/app/components/Ui/Button.vue +169 -0
  20. package/app/components/Ui/ButtonGroup/ButtonGroup.vue +54 -0
  21. package/app/components/Ui/ButtonGroup/Separator.vue +38 -0
  22. package/app/components/Ui/ButtonGroup/Text.vue +33 -0
  23. package/app/components/Ui/Card/Action.vue +31 -0
  24. package/app/components/Ui/Card/Card.vue +58 -0
  25. package/app/components/Ui/Card/Content.vue +34 -0
  26. package/app/components/Ui/Card/Description.vue +36 -0
  27. package/app/components/Ui/Card/Footer.vue +31 -0
  28. package/app/components/Ui/Card/Header.vue +31 -0
  29. package/app/components/Ui/Card/Title.vue +37 -0
  30. package/app/components/Ui/Collapsible/Collapsible.vue +16 -0
  31. package/app/components/Ui/Collapsible/Content.vue +27 -0
  32. package/app/components/Ui/Collapsible/Trigger.vue +13 -0
  33. package/app/components/Ui/Command/Command.vue +115 -0
  34. package/app/components/Ui/Command/Dialog.vue +65 -0
  35. package/app/components/Ui/Command/Empty.vue +32 -0
  36. package/app/components/Ui/Command/Footer.vue +40 -0
  37. package/app/components/Ui/Command/Group.vue +58 -0
  38. package/app/components/Ui/Command/Input.vue +57 -0
  39. package/app/components/Ui/Command/Item.vue +102 -0
  40. package/app/components/Ui/Command/List.vue +33 -0
  41. package/app/components/Ui/Command/Separator.vue +30 -0
  42. package/app/components/Ui/Command/Shortcut.vue +28 -0
  43. package/app/components/Ui/Container.vue +46 -0
  44. package/app/components/Ui/ContextMenu/Arrow.vue +43 -0
  45. package/app/components/Ui/ContextMenu/CheckboxItem.vue +42 -0
  46. package/app/components/Ui/ContextMenu/Content.vue +53 -0
  47. package/app/components/Ui/ContextMenu/ContextMenu.vue +14 -0
  48. package/app/components/Ui/ContextMenu/Group.vue +12 -0
  49. package/app/components/Ui/ContextMenu/Item.vue +65 -0
  50. package/app/components/Ui/ContextMenu/ItemIndicator.vue +30 -0
  51. package/app/components/Ui/ContextMenu/Label.vue +35 -0
  52. package/app/components/Ui/ContextMenu/Portal.vue +12 -0
  53. package/app/components/Ui/ContextMenu/RadioGroup.vue +16 -0
  54. package/app/components/Ui/ContextMenu/RadioItem.vue +40 -0
  55. package/app/components/Ui/ContextMenu/Separator.vue +25 -0
  56. package/app/components/Ui/ContextMenu/Shortcut.vue +30 -0
  57. package/app/components/Ui/ContextMenu/Sub.vue +15 -0
  58. package/app/components/Ui/ContextMenu/SubContent.vue +55 -0
  59. package/app/components/Ui/ContextMenu/SubTrigger.vue +42 -0
  60. package/app/components/Ui/ContextMenu/Trigger.vue +12 -0
  61. package/app/components/Ui/Dialog/Close.vue +12 -0
  62. package/app/components/Ui/Dialog/Content.vue +79 -0
  63. package/app/components/Ui/Dialog/Description.vue +29 -0
  64. package/app/components/Ui/Dialog/Dialog.vue +14 -0
  65. package/app/components/Ui/Dialog/Footer.vue +32 -0
  66. package/app/components/Ui/Dialog/Header.vue +32 -0
  67. package/app/components/Ui/Dialog/Overlay.vue +25 -0
  68. package/app/components/Ui/Dialog/Portal.vue +12 -0
  69. package/app/components/Ui/Dialog/Title.vue +29 -0
  70. package/app/components/Ui/Dialog/Trigger.vue +12 -0
  71. package/app/components/Ui/Divider.vue +102 -0
  72. package/app/components/Ui/Drawer/Close.vue +12 -0
  73. package/app/components/Ui/Drawer/Content.vue +67 -0
  74. package/app/components/Ui/Drawer/Description.vue +33 -0
  75. package/app/components/Ui/Drawer/Drawer.vue +17 -0
  76. package/app/components/Ui/Drawer/Footer.vue +35 -0
  77. package/app/components/Ui/Drawer/Header.vue +34 -0
  78. package/app/components/Ui/Drawer/Overlay.vue +20 -0
  79. package/app/components/Ui/Drawer/Portal.vue +12 -0
  80. package/app/components/Ui/Drawer/Title.vue +35 -0
  81. package/app/components/Ui/Drawer/Trigger.vue +12 -0
  82. package/app/components/Ui/DropdownMenu/Arrow.vue +43 -0
  83. package/app/components/Ui/DropdownMenu/CheckboxItem.vue +41 -0
  84. package/app/components/Ui/DropdownMenu/Content.vue +56 -0
  85. package/app/components/Ui/DropdownMenu/DropdownMenu.vue +15 -0
  86. package/app/components/Ui/DropdownMenu/Group.vue +12 -0
  87. package/app/components/Ui/DropdownMenu/Item.vue +64 -0
  88. package/app/components/Ui/DropdownMenu/ItemIndicator.vue +32 -0
  89. package/app/components/Ui/DropdownMenu/Label.vue +34 -0
  90. package/app/components/Ui/DropdownMenu/Portal.vue +12 -0
  91. package/app/components/Ui/DropdownMenu/RadioGroup.vue +16 -0
  92. package/app/components/Ui/DropdownMenu/RadioItem.vue +40 -0
  93. package/app/components/Ui/DropdownMenu/Separator.vue +25 -0
  94. package/app/components/Ui/DropdownMenu/Shortcut.vue +44 -0
  95. package/app/components/Ui/DropdownMenu/Sub.vue +14 -0
  96. package/app/components/Ui/DropdownMenu/SubContent.vue +56 -0
  97. package/app/components/Ui/DropdownMenu/SubTrigger.vue +47 -0
  98. package/app/components/Ui/DropdownMenu/Trigger.vue +12 -0
  99. package/app/components/Ui/FancyIcon.vue +243 -0
  100. package/app/components/Ui/GradientDivider.vue +26 -0
  101. package/app/components/Ui/IframeLazy.vue +97 -0
  102. package/app/components/Ui/Input.vue +97 -0
  103. package/app/components/Ui/InputGroup/Addon.vue +66 -0
  104. package/app/components/Ui/InputGroup/Button.vue +50 -0
  105. package/app/components/Ui/InputGroup/Input.vue +25 -0
  106. package/app/components/Ui/InputGroup/InputGroup.vue +44 -0
  107. package/app/components/Ui/InputGroup/Text.vue +33 -0
  108. package/app/components/Ui/InputGroup/Textarea.vue +25 -0
  109. package/app/components/Ui/Kbd/Group.vue +32 -0
  110. package/app/components/Ui/Kbd/Kbd.vue +62 -0
  111. package/app/components/Ui/Label.vue +40 -0
  112. package/app/components/Ui/Popover/Anchor.vue +13 -0
  113. package/app/components/Ui/Popover/Arrow.vue +42 -0
  114. package/app/components/Ui/Popover/Close.vue +13 -0
  115. package/app/components/Ui/Popover/Content.vue +55 -0
  116. package/app/components/Ui/Popover/Popover.vue +15 -0
  117. package/app/components/Ui/Popover/Portal.vue +13 -0
  118. package/app/components/Ui/Popover/Trigger.vue +12 -0
  119. package/app/components/Ui/Popover/X.vue +38 -0
  120. package/app/components/Ui/ScrollArea/Corner.vue +12 -0
  121. package/app/components/Ui/ScrollArea/ScrollArea.vue +38 -0
  122. package/app/components/Ui/ScrollArea/Scrollbar.vue +39 -0
  123. package/app/components/Ui/ScrollArea/Thumb.vue +39 -0
  124. package/app/components/Ui/ScrollArea/Viewport.vue +27 -0
  125. package/app/components/Ui/Scrollspy.vue +61 -0
  126. package/app/components/Ui/Separator.vue +40 -0
  127. package/app/components/Ui/Skeleton.vue +39 -0
  128. package/app/components/Ui/Sonner.vue +25 -0
  129. package/app/components/Ui/Tabs/Content.vue +27 -0
  130. package/app/components/Ui/Tabs/Indicator.vue +37 -0
  131. package/app/components/Ui/Tabs/List.vue +37 -0
  132. package/app/components/Ui/Tabs/Tabs.vue +25 -0
  133. package/app/components/Ui/Tabs/Trigger.vue +41 -0
  134. package/app/components/Ui/Textarea.vue +81 -0
  135. package/app/components/Ui/Tooltip/Arrow.vue +30 -0
  136. package/app/components/Ui/Tooltip/Content.vue +50 -0
  137. package/app/components/Ui/Tooltip/Portal.vue +12 -0
  138. package/app/components/Ui/Tooltip/Provider.vue +14 -0
  139. package/app/components/Ui/Tooltip/Tooltip.vue +25 -0
  140. package/app/components/Ui/Tooltip/Trigger.vue +12 -0
  141. package/app/components/Ui/Tree/Item.vue +15 -0
  142. package/app/components/Ui/Tree/Tree.vue +15 -0
  143. package/app/components/Ui/Tree/Virtualizer.vue +13 -0
  144. package/app/components/component-api/ComponentApiSection.vue +135 -0
  145. package/app/components/content/docs/Callout/DocsCallout.vue +99 -0
  146. package/app/components/content/prose/ProseA.global.vue +31 -0
  147. package/app/components/content/prose/ProseBlockquote.global.vue +28 -0
  148. package/app/components/content/prose/ProseCallout.global.vue +306 -0
  149. package/app/components/content/prose/ProseCard.global.vue +100 -0
  150. package/app/components/content/prose/ProseCodeCollapse.global.vue +125 -0
  151. package/app/components/content/prose/ProseCodeCopy.global.vue +67 -0
  152. package/app/components/content/prose/ProseCodeGroup.global.vue +104 -0
  153. package/app/components/content/prose/ProseCodeTree.global.vue +277 -0
  154. package/app/components/content/prose/ProseCollapsible.global.vue +64 -0
  155. package/app/components/content/prose/ProseColorModeImage.global.vue +58 -0
  156. package/app/components/content/prose/ProseComponentApi.global.vue +104 -0
  157. package/app/components/content/prose/ProseComponentEvents.global.vue +27 -0
  158. package/app/components/content/prose/ProseComponentExposed.global.vue +27 -0
  159. package/app/components/content/prose/ProseComponentProps.global.vue +27 -0
  160. package/app/components/content/prose/ProseComponentSlots.global.vue +27 -0
  161. package/app/components/content/prose/ProseEm.global.vue +5 -0
  162. package/app/components/content/prose/ProseField.global.vue +118 -0
  163. package/app/components/content/prose/ProseFieldGroup.global.vue +62 -0
  164. package/app/components/content/prose/ProseH1.global.vue +58 -0
  165. package/app/components/content/prose/ProseH2.global.vue +58 -0
  166. package/app/components/content/prose/ProseH3.global.vue +58 -0
  167. package/app/components/content/prose/ProseH4.global.vue +58 -0
  168. package/app/components/content/prose/ProseH5.global.vue +47 -0
  169. package/app/components/content/prose/ProseH6.global.vue +47 -0
  170. package/app/components/content/prose/ProseHr.global.vue +33 -0
  171. package/app/components/content/prose/ProseIconList.global.vue +113 -0
  172. package/app/components/content/prose/ProseImg.global.vue +119 -0
  173. package/app/components/content/prose/ProseLead.global.vue +28 -0
  174. package/app/components/content/prose/ProseLi.global.vue +25 -0
  175. package/app/components/content/prose/ProseMermaid.global.vue +127 -0
  176. package/app/components/content/prose/ProseOl.global.vue +25 -0
  177. package/app/components/content/prose/ProseP.global.vue +25 -0
  178. package/app/components/content/prose/ProsePmInstall.global.vue +60 -0
  179. package/app/components/content/prose/ProsePmRun.global.vue +51 -0
  180. package/app/components/content/prose/ProsePmX.global.vue +56 -0
  181. package/app/components/content/prose/ProsePre.global.vue +181 -0
  182. package/app/components/content/prose/ProseShowCase.global.vue +56 -0
  183. package/app/components/content/prose/ProseSmartIcon.global.vue +54 -0
  184. package/app/components/content/prose/ProseStep.global.vue +22 -0
  185. package/app/components/content/prose/ProseSteps.global.vue +22 -0
  186. package/app/components/content/prose/ProseStrong.global.vue +34 -0
  187. package/app/components/content/prose/ProseTable.global.vue +34 -0
  188. package/app/components/content/prose/ProseTabs.global.vue +104 -0
  189. package/app/components/content/prose/ProseTabsInner.global.vue +274 -0
  190. package/app/components/content/prose/ProseTbody.global.vue +5 -0
  191. package/app/components/content/prose/ProseTd.global.vue +25 -0
  192. package/app/components/content/prose/ProseTh.global.vue +25 -0
  193. package/app/components/content/prose/ProseThead.global.vue +9 -0
  194. package/app/components/content/prose/ProseTr.global.vue +35 -0
  195. package/app/components/content/prose/ProseUl.global.vue +25 -0
  196. package/app/components/docs/DocsExtraStuff.vue +39 -0
  197. package/app/components/docs/DocsGithubLink.vue +11 -0
  198. package/app/components/docs/DocsHeader.vue +3 -0
  199. package/app/components/docs/DocsLogo.vue +74 -0
  200. package/app/components/docs/DocsMobileBar.vue +26 -0
  201. package/app/components/docs/DocsMobileNav.vue +49 -0
  202. package/app/components/docs/DocsNav.vue +161 -0
  203. package/app/components/docs/DocsPageTransition.vue +32 -0
  204. package/app/components/docs/DocsSearch.vue +220 -0
  205. package/app/components/docs/DocsSearchButton.vue +20 -0
  206. package/app/components/docs/DocsThemeCustomizer.vue +229 -0
  207. package/app/components/docs/DocsThemeToggler.vue +98 -0
  208. package/app/components/docs/DocsTocRail.vue +162 -0
  209. package/app/components/docs/DocsToclink.vue +52 -0
  210. package/app/components/docs/DocsZigZagRail.vue +70 -0
  211. package/app/components/landing/Hero.vue +222 -0
  212. package/app/components/page/PageFooter.vue +49 -0
  213. package/app/components/page/PageHeader.vue +68 -0
  214. package/app/components/page/PageHeaderLinks.vue +138 -0
  215. package/app/components/page/PageMobileToc.vue +162 -0
  216. package/app/components/page/PageToc.vue +33 -0
  217. package/app/composables/useDefaultSlotItems.ts +90 -0
  218. package/app/composables/useDocPage.ts +66 -0
  219. package/app/composables/useDocSearch.ts +23 -0
  220. package/app/composables/useDocd.ts +107 -0
  221. package/app/composables/useLogoAssets.ts +319 -0
  222. package/app/composables/usePm.ts +73 -0
  223. package/app/composables/useProseComponentMeta.ts +30 -0
  224. package/app/composables/useScrollspy.ts +327 -0
  225. package/app/composables/useSeo.ts +240 -0
  226. package/app/composables/useUIConfig.ts +36 -0
  227. package/app/layouts/default.vue +5 -0
  228. package/app/layouts/docs.vue +64 -0
  229. package/app/middleware/colorMode.global.ts +8 -0
  230. package/app/middleware/doc-page-layout.ts +11 -0
  231. package/app/middleware/landing-page-layout.ts +11 -0
  232. package/app/pages/[...slug].vue +63 -0
  233. package/app/plugins/mermaid.client.ts +35 -0
  234. package/app/plugins/navigation-direction.client.ts +15 -0
  235. package/app/plugins/theme-restore.client.ts +7 -0
  236. package/app/templates/landing.vue +40 -0
  237. package/app/transitions/presets.ts +71 -0
  238. package/app/types/prose-component-meta.d.ts +4 -0
  239. package/app/utils/og.ts +26 -0
  240. package/app/utils/prerender.ts +9 -0
  241. package/app/utils/translucent.ts +56 -0
  242. package/app/utils/tw-helper.ts +4 -0
  243. package/content.config.ts +81 -0
  244. package/index.d.ts +25 -0
  245. package/modules/config.ts +89 -0
  246. package/modules/custom-icons.ts +17 -0
  247. package/modules/markdown-rewrite.ts +96 -0
  248. package/modules/prose-component-meta.ts +150 -0
  249. package/modules/routing.ts +22 -0
  250. package/modules/skills/index.ts +167 -0
  251. package/modules/skills/runtime/server/routes/skills-files.ts +49 -0
  252. package/modules/skills/runtime/server/routes/skills-index.ts +8 -0
  253. package/nuxt.config.ts +96 -0
  254. package/nuxt.schema.ts +288 -0
  255. package/package.json +95 -0
  256. package/server/mcp/tools/get-page.ts +66 -0
  257. package/server/mcp/tools/list-pages.ts +61 -0
  258. package/server/routes/sitemap.xml.ts +73 -0
  259. package/server/utils/content.ts +3 -0
  260. package/tailwind.config.cjs +55 -0
  261. package/utils/component-api-content.ts +467 -0
  262. package/utils/component-api-discovery.ts +165 -0
  263. package/utils/component-api-schema.ts +28 -0
  264. package/utils/component-api.ts +243 -0
  265. package/utils/generate-prose-component-meta.ts +303 -0
  266. package/utils/git.ts +123 -0
  267. package/utils/meta.ts +40 -0
  268. package/utils/pages.ts +21 -0
@@ -0,0 +1,69 @@
1
+ <template>
2
+ <div class="h-full w-full bg-zinc-950 p-20 text-zinc-50">
3
+ <div
4
+ class="relative flex h-full w-full flex-col justify-center gap-4 border border-zinc-900/80 bg-zinc-900/10 p-10"
5
+ >
6
+ <div class="absolute -top-px right-0 h-px w-12 bg-zinc-700" />
7
+ <div class="absolute top-0 -right-px h-12 w-px bg-zinc-700" />
8
+ <div class="absolute right-0 -bottom-px h-px w-12 bg-zinc-700" />
9
+ <div class="absolute -right-px bottom-0 h-12 w-px bg-zinc-700" />
10
+
11
+ <div class="absolute -top-px left-0 h-px w-12 bg-zinc-700" />
12
+ <div class="absolute top-0 -left-px h-12 w-px bg-zinc-700" />
13
+ <div class="absolute -bottom-px left-0 h-px w-12 bg-zinc-700" />
14
+ <div class="absolute bottom-0 -left-px h-12 w-px bg-zinc-700" />
15
+
16
+ <p
17
+ v-if="headline"
18
+ class="mb-4 line-clamp-1 text-2xl text-pretty whitespace-pre-line"
19
+ v-html="headline"
20
+ />
21
+ <h1 v-if="title" class="mb-4 line-clamp-1 text-5xl leading-none font-bold tracking-tighter">
22
+ {{ title }}
23
+ </h1>
24
+ <p
25
+ v-if="description"
26
+ class="line-clamp-3 text-3xl leading-normal text-pretty whitespace-pre-line opacity-80"
27
+ >
28
+ {{ description }}
29
+ </p>
30
+
31
+ <div v-if="logoSvg" class="absolute bottom-7 left-7 size-10" v-html="logoSvg" />
32
+ </div>
33
+ </div>
34
+ </template>
35
+
36
+ <script lang="ts" setup>
37
+ defineProps<{
38
+ title?: string;
39
+ description?: string;
40
+ headline?: string;
41
+ }>();
42
+
43
+ const { darkLogo, lightLogo } = useDocd();
44
+ const logoPath = darkLogo.value || lightLogo.value;
45
+
46
+ const logoSvg = await fetchLogoSvg(logoPath);
47
+
48
+ function resizeSvg(svg: string, size: number): string {
49
+ const s = String(size);
50
+ const withWidth = /width="[^"]*"/.test(svg)
51
+ ? svg.replace(/width="[^"]*"/, `width="${s}"`)
52
+ : svg.replace("<svg", `<svg width="${s}"`);
53
+ return /height="[^"]*"/.test(withWidth)
54
+ ? withWidth.replace(/height="[^"]*"/, `height="${s}"`)
55
+ : withWidth.replace("<svg", `<svg height="${s}"`);
56
+ }
57
+
58
+ async function fetchLogoSvg(path?: string): Promise<string> {
59
+ if (!path) return "";
60
+ try {
61
+ const { url: siteUrl } = useSiteConfig();
62
+ const url = path.startsWith("http") ? path : `${siteUrl}${path}`;
63
+ const svg = await $fetch<string>(url, { responseType: "text" });
64
+ return resizeSvg(svg, 48);
65
+ } catch {
66
+ return "";
67
+ }
68
+ }
69
+ </script>
@@ -0,0 +1,64 @@
1
+ <template>
2
+ <div class="h-full w-full bg-zinc-950 p-20 text-zinc-50">
3
+ <div
4
+ class="relative flex h-full w-full flex-col justify-center gap-4 border border-zinc-900/80 bg-zinc-900/10 p-10"
5
+ >
6
+ <div class="absolute -top-px right-0 h-px w-12 bg-zinc-700" />
7
+ <div class="absolute top-0 -right-px h-12 w-px bg-zinc-700" />
8
+ <div class="absolute right-0 -bottom-px h-px w-12 bg-zinc-700" />
9
+ <div class="absolute -right-px bottom-0 h-12 w-px bg-zinc-700" />
10
+
11
+ <div class="absolute -top-px left-0 h-px w-12 bg-zinc-700" />
12
+ <div class="absolute top-0 -left-px h-12 w-px bg-zinc-700" />
13
+ <div class="absolute -bottom-px left-0 h-px w-12 bg-zinc-700" />
14
+ <div class="absolute bottom-0 -left-px h-12 w-px bg-zinc-700" />
15
+
16
+ <div class="flex flex-col items-center text-center">
17
+ <div v-if="logoSvg" v-html="logoSvg" class="mb-5" />
18
+
19
+ <h1 v-if="title" class="mb-4 line-clamp-1 text-5xl leading-none font-bold tracking-tighter">
20
+ {{ title }}
21
+ </h1>
22
+ <p
23
+ v-if="description"
24
+ class="line-clamp-3 text-3xl text-pretty whitespace-pre-line opacity-80"
25
+ v-html="description"
26
+ />
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </template>
31
+
32
+ <script lang="ts" setup>
33
+ defineProps<{
34
+ title?: string;
35
+ description?: string;
36
+ }>();
37
+
38
+ const { darkLogo, lightLogo } = useDocd();
39
+ const logoPath = darkLogo.value || lightLogo.value;
40
+
41
+ const logoSvg = await fetchLogoSvg(logoPath);
42
+
43
+ function resizeSvg(svg: string, size: number): string {
44
+ const s = String(size);
45
+ const withWidth = /width="[^"]*"/.test(svg)
46
+ ? svg.replace(/width="[^"]*"/, `width="${s}"`)
47
+ : svg.replace("<svg", `<svg width="${s}"`);
48
+ return /height="[^"]*"/.test(withWidth)
49
+ ? withWidth.replace(/height="[^"]*"/, `height="${s}"`)
50
+ : withWidth.replace("<svg", `<svg height="${s}"`);
51
+ }
52
+
53
+ async function fetchLogoSvg(path?: string): Promise<string> {
54
+ if (!path) return "";
55
+ try {
56
+ const { url: siteUrl } = useSiteConfig();
57
+ const url = path.startsWith("http") ? path : `${siteUrl}${path}`;
58
+ const svg = await $fetch<string>(url, { responseType: "text" });
59
+ return resizeSvg(svg, 48);
60
+ } catch {
61
+ return "";
62
+ }
63
+ }
64
+ </script>
@@ -0,0 +1,32 @@
1
+ <template>
2
+ <div class="h-full w-full bg-zinc-950 p-20 text-zinc-50">
3
+ <div
4
+ class="relative flex h-full w-full flex-col justify-center gap-4 border border-zinc-900/80 bg-zinc-900/10 p-10"
5
+ >
6
+ <div class="absolute -top-px right-0 h-px w-12 bg-zinc-700" />
7
+ <div class="absolute top-0 -right-px h-12 w-px bg-zinc-700" />
8
+ <div class="absolute right-0 -bottom-px h-px w-12 bg-zinc-700" />
9
+ <div class="absolute -right-px bottom-0 h-12 w-px bg-zinc-700" />
10
+
11
+ <div class="absolute -top-px left-0 h-px w-12 bg-zinc-700" />
12
+ <div class="absolute top-0 -left-px h-12 w-px bg-zinc-700" />
13
+ <div class="absolute -bottom-px left-0 h-px w-12 bg-zinc-700" />
14
+ <div class="absolute bottom-0 -left-px h-12 w-px bg-zinc-700" />
15
+
16
+ <h1 class="text-5xl leading-none tracking-tighter">{{ title }}</h1>
17
+ <p class="text-3xl text-pretty whitespace-pre-line opacity-80" v-html="description" />
18
+
19
+ <div v-if="logo" class="absolute right-6 bottom-6">
20
+ <img :src="logo" class="h-10 w-10 object-contain" />
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </template>
25
+
26
+ <script lang="ts" setup>
27
+ defineProps<{
28
+ title?: string;
29
+ description?: string;
30
+ logo?: string;
31
+ }>();
32
+ </script>
@@ -0,0 +1,75 @@
1
+ <template>
2
+ <AvatarRoot
3
+ data-slot="avatar"
4
+ :data-size="size"
5
+ :as="as"
6
+ :as-child="asChild"
7
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
8
+ >
9
+ <slot>
10
+ <slot name="image">
11
+ <UiAvatarImage
12
+ v-if="src"
13
+ :src="src"
14
+ :alt="alt"
15
+ :class="imageClass"
16
+ @loading-status-change="emits('loadingStatusChange', $event)"
17
+ />
18
+ </slot>
19
+ <slot name="fallback">
20
+ <UiAvatarFallback :delay-ms="delayMs" :class="fallbackClass" :fallback="fallback" />
21
+ </slot>
22
+ </slot>
23
+ </AvatarRoot>
24
+ </template>
25
+
26
+ <script lang="ts">
27
+ import { AvatarRoot } from "reka-ui";
28
+ import type { AvatarImageEmits, AvatarImageProps, AvatarRootProps } from "reka-ui";
29
+ import { normalizeClass } from "vue";
30
+
31
+ export type AvatarProps = AvatarRootProps &
32
+ Partial<AvatarImageProps> & {
33
+ /**
34
+ * Class to add to the root element
35
+ */
36
+ class?: any;
37
+ /**
38
+ * Class to pass to the image element
39
+ */
40
+ imageClass?: any;
41
+ /**
42
+ * Class to pass to the fallback element
43
+ */
44
+ fallbackClass?: any;
45
+ /**
46
+ * The `alt` attribute value for the image
47
+ */
48
+ alt?: string;
49
+ /**
50
+ * The fallback text to display when the image fails to load
51
+ */
52
+ fallback?: string;
53
+ /**
54
+ * Useful for delaying rendering so it only appears for those with slower connections.
55
+ */
56
+ delayMs?: number;
57
+ /**
58
+ * The size of the avatar
59
+ *
60
+ * @default "default"
61
+ */
62
+ size?: "default" | "sm" | "lg";
63
+ };
64
+ </script>
65
+
66
+ <script lang="ts" setup>
67
+ const props = withDefaults(defineProps<AvatarProps>(), {
68
+ size: "default",
69
+ });
70
+
71
+ const emits = defineEmits<AvatarImageEmits>();
72
+ const styles = tv({
73
+ base: "group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-border after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
74
+ });
75
+ </script>
@@ -0,0 +1,34 @@
1
+ <template>
2
+ <Primitive
3
+ data-slot="avatar-badge"
4
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
5
+ v-bind="forwarded"
6
+ >
7
+ <slot />
8
+ </Primitive>
9
+ </template>
10
+
11
+ <script lang="ts" setup>
12
+ import { Primitive } from "reka-ui";
13
+ import type { PrimitiveProps } from "reka-ui";
14
+ import { normalizeClass } from "vue";
15
+
16
+ const props = withDefaults(
17
+ defineProps<
18
+ PrimitiveProps & {
19
+ /** Custom class(es) to add to the element */
20
+ class?: any;
21
+ }
22
+ >(),
23
+ {
24
+ as: "span",
25
+ }
26
+ );
27
+
28
+ const forwarded = reactiveOmit(props, "class");
29
+ const styles = tv({
30
+ base: [
31
+ "absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full text-primary-foreground bg-blend-color ring-2 ring-background select-none group-data-[size=default]/avatar:size-2.5 group-data-[size=lg]/avatar:size-3 group-data-[size=sm]/avatar:size-2 group-data-[size=default]/avatar:[&>svg]:size-2 group-data-[size=lg]/avatar:[&>svg]:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
32
+ ],
33
+ });
34
+ </script>
@@ -0,0 +1,30 @@
1
+ <template>
2
+ <AvatarFallback
3
+ data-slot="avatar-fallback"
4
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
5
+ v-bind="forwarded"
6
+ >
7
+ <slot>
8
+ {{ fallback }}
9
+ </slot>
10
+ </AvatarFallback>
11
+ </template>
12
+
13
+ <script lang="ts" setup>
14
+ import { AvatarFallback } from "reka-ui";
15
+ import type { AvatarFallbackProps } from "reka-ui";
16
+ import { normalizeClass } from "vue";
17
+
18
+ const props = defineProps<
19
+ AvatarFallbackProps & {
20
+ /** The text to display inside the avatar */
21
+ fallback?: string;
22
+ /** Custom class(es) to add to the element */
23
+ class?: any;
24
+ }
25
+ >();
26
+ const forwarded = reactiveOmit(props, "class", "fallback");
27
+ const styles = tv({
28
+ base: "flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs",
29
+ });
30
+ </script>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <Primitive
3
+ data-slot="avatar-group"
4
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
5
+ v-bind="forwarded"
6
+ >
7
+ <slot />
8
+ </Primitive>
9
+ </template>
10
+
11
+ <script lang="ts" setup>
12
+ import { Primitive } from "reka-ui";
13
+ import type { PrimitiveProps } from "reka-ui";
14
+ import { normalizeClass } from "vue";
15
+
16
+ const props = defineProps<
17
+ PrimitiveProps & {
18
+ /** Custom class(es) to add to the element */
19
+ class?: any;
20
+ }
21
+ >();
22
+
23
+ const forwarded = reactiveOmit(props, "class");
24
+ const styles = tv({
25
+ base: [
26
+ "group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background",
27
+ ],
28
+ });
29
+ </script>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <Primitive
3
+ data-slot="avatar-group-count"
4
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
5
+ v-bind="forwarded"
6
+ >
7
+ <slot />
8
+ </Primitive>
9
+ </template>
10
+
11
+ <script lang="ts" setup>
12
+ import { Primitive } from "reka-ui";
13
+ import type { PrimitiveProps } from "reka-ui";
14
+ import { normalizeClass } from "vue";
15
+
16
+ const props = defineProps<
17
+ PrimitiveProps & {
18
+ /** Custom class(es) to add to the element */
19
+ class?: any;
20
+ }
21
+ >();
22
+
23
+ const forwarded = reactiveOmit(props, "class");
24
+ const styles = tv({
25
+ base: [
26
+ "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
27
+ ],
28
+ });
29
+ </script>
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <AvatarImage
3
+ data-slot="avatar-image"
4
+ v-bind="forwarded"
5
+ :class="styles({ class: normalizeClass(props.class) || undefined })"
6
+ />
7
+ </template>
8
+
9
+ <script lang="ts" setup>
10
+ import { AvatarImage, useForwardPropsEmits } from "reka-ui";
11
+ import type { AvatarImageEmits, AvatarImageProps } from "reka-ui";
12
+ import { normalizeClass } from "vue";
13
+
14
+ const props = defineProps<
15
+ AvatarImageProps & {
16
+ /** The alt text for the image */
17
+ alt?: string;
18
+ /** Custom class(es) to add to the element */
19
+ class?: any;
20
+ }
21
+ >();
22
+ const emits = defineEmits<AvatarImageEmits>();
23
+
24
+ const forwarded = useForwardPropsEmits(reactiveOmit(props, "class"), emits);
25
+
26
+ const styles = tv({
27
+ base: "aspect-square size-full rounded-full object-cover",
28
+ });
29
+ </script>
@@ -0,0 +1,86 @@
1
+ <template>
2
+ <component
3
+ :is="elementType"
4
+ :class="
5
+ badgeVariants({ disabled, size, variant, class: normalizeClass(props.class) || undefined })
6
+ "
7
+ v-bind="forwarded"
8
+ @click="onClick"
9
+ >
10
+ <slot />
11
+ </component>
12
+ </template>
13
+
14
+ <script lang="ts">
15
+ import { reactiveOmit } from "@vueuse/core";
16
+ import { useForwardProps } from "reka-ui";
17
+ import { normalizeClass } from "vue";
18
+ import type { HTMLAttributes } from "vue";
19
+
20
+ import type { NuxtLinkProps } from "#app/components";
21
+ </script>
22
+
23
+ <script lang="ts" setup>
24
+ const badgeVariants = tv({
25
+ base: "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3",
26
+ variants: {
27
+ variant: {
28
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
29
+ secondary:
30
+ "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
31
+ destructive:
32
+ "border-transparent bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90",
33
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
34
+ success:
35
+ "border-transparent bg-green-500 text-white focus-visible:ring-green-500/20 dark:bg-green-500/60 dark:focus-visible:ring-green-500/40 [a&]:hover:bg-green-600",
36
+ warning:
37
+ "border-transparent bg-yellow-500 text-white focus-visible:ring-yellow-500/20 dark:bg-yellow-500/60 dark:focus-visible:ring-yellow-500/40 [a&]:hover:bg-yellow-600",
38
+ info: "border-transparent bg-blue-500 text-white focus-visible:ring-blue-500/20 dark:bg-blue-500/60 dark:focus-visible:ring-blue-500/40 [a&]:hover:bg-blue-600",
39
+ ghost: "border-transparent bg-transparent text-foreground [a&]:hover:bg-accent/50",
40
+ error:
41
+ "border-transparent bg-red-500 text-white focus-visible:ring-red-500/20 dark:bg-red-500/60 dark:focus-visible:ring-red-500/40 [a&]:hover:bg-red-600",
42
+ },
43
+ disabled: {
44
+ true: "cursor-not-allowed opacity-50",
45
+ },
46
+ size: {
47
+ sm: "px-2 py-0.5 text-xs font-medium",
48
+ md: "px-2.5 py-[3px] text-sm font-medium",
49
+ lg: "px-2.5 py-1 text-sm font-semibold",
50
+ },
51
+ },
52
+ defaultVariants: {
53
+ variant: "default",
54
+ disabled: false,
55
+ size: "sm",
56
+ },
57
+ });
58
+
59
+ type BadgeProps = VariantProps<typeof badgeVariants>;
60
+
61
+ const props = defineProps<
62
+ NuxtLinkProps & {
63
+ /** Any additional class that should be added to the badge */
64
+ class?: HTMLAttributes["class"];
65
+ /** The variant of the badge */
66
+ variant?: BadgeProps["variant"];
67
+ /** The size of the badge */
68
+ size?: BadgeProps["size"];
69
+ /** The action to perform when the badge is clicked */
70
+ onClick?: () => void;
71
+ /** Should the badge be disabled or not */
72
+ disabled?: boolean;
73
+ /** The element to render the badge as */
74
+ tag?: string;
75
+ }
76
+ >();
77
+
78
+ const forwarded = useForwardProps(reactiveOmit(props, "class", "variant", "onClick", "disabled"));
79
+
80
+ const elementType = computed(() => {
81
+ if (props.tag) return props.tag;
82
+ if (props.href || props.to) return resolveComponent("NuxtLink");
83
+ if (props.onClick) return "button";
84
+ return props.tag || "div";
85
+ });
86
+ </script>