@brainfish-ai/devdoc 0.1.21

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/LICENSE +33 -0
  2. package/README.md +415 -0
  3. package/bin/devdoc.js +13 -0
  4. package/dist/cli/commands/build.d.ts +5 -0
  5. package/dist/cli/commands/build.js +87 -0
  6. package/dist/cli/commands/check.d.ts +1 -0
  7. package/dist/cli/commands/check.js +143 -0
  8. package/dist/cli/commands/create.d.ts +24 -0
  9. package/dist/cli/commands/create.js +387 -0
  10. package/dist/cli/commands/deploy.d.ts +9 -0
  11. package/dist/cli/commands/deploy.js +433 -0
  12. package/dist/cli/commands/dev.d.ts +6 -0
  13. package/dist/cli/commands/dev.js +139 -0
  14. package/dist/cli/commands/init.d.ts +11 -0
  15. package/dist/cli/commands/init.js +238 -0
  16. package/dist/cli/commands/keys.d.ts +12 -0
  17. package/dist/cli/commands/keys.js +165 -0
  18. package/dist/cli/commands/start.d.ts +5 -0
  19. package/dist/cli/commands/start.js +56 -0
  20. package/dist/cli/commands/upload.d.ts +13 -0
  21. package/dist/cli/commands/upload.js +238 -0
  22. package/dist/cli/commands/whoami.d.ts +8 -0
  23. package/dist/cli/commands/whoami.js +91 -0
  24. package/dist/cli/index.d.ts +1 -0
  25. package/dist/cli/index.js +106 -0
  26. package/dist/config/index.d.ts +80 -0
  27. package/dist/config/index.js +133 -0
  28. package/dist/constants.d.ts +9 -0
  29. package/dist/constants.js +13 -0
  30. package/dist/index.d.ts +7 -0
  31. package/dist/index.js +12 -0
  32. package/dist/utils/logger.d.ts +16 -0
  33. package/dist/utils/logger.js +61 -0
  34. package/dist/utils/paths.d.ts +16 -0
  35. package/dist/utils/paths.js +50 -0
  36. package/package.json +51 -0
  37. package/renderer/app/api/assets/[...path]/route.ts +123 -0
  38. package/renderer/app/api/assets/route.ts +124 -0
  39. package/renderer/app/api/assets/upload/route.ts +177 -0
  40. package/renderer/app/api/auth-schemes/route.ts +77 -0
  41. package/renderer/app/api/chat/route.ts +858 -0
  42. package/renderer/app/api/codegen/route.ts +72 -0
  43. package/renderer/app/api/collections/route.ts +1016 -0
  44. package/renderer/app/api/debug/route.ts +53 -0
  45. package/renderer/app/api/deploy/route.ts +234 -0
  46. package/renderer/app/api/device/route.ts +42 -0
  47. package/renderer/app/api/docs/route.ts +187 -0
  48. package/renderer/app/api/keys/regenerate/route.ts +80 -0
  49. package/renderer/app/api/openapi-spec/route.ts +151 -0
  50. package/renderer/app/api/projects/[slug]/route.ts +153 -0
  51. package/renderer/app/api/projects/[slug]/stats/route.ts +96 -0
  52. package/renderer/app/api/projects/register/route.ts +152 -0
  53. package/renderer/app/api/proxy/route.ts +149 -0
  54. package/renderer/app/api/proxy-stream/route.ts +168 -0
  55. package/renderer/app/api/redirects/route.ts +47 -0
  56. package/renderer/app/api/schema/route.ts +65 -0
  57. package/renderer/app/api/subdomains/check/route.ts +172 -0
  58. package/renderer/app/api/suggestions/route.ts +144 -0
  59. package/renderer/app/favicon.ico +0 -0
  60. package/renderer/app/globals.css +1103 -0
  61. package/renderer/app/layout.tsx +47 -0
  62. package/renderer/app/llms-full.txt/route.ts +346 -0
  63. package/renderer/app/llms.txt/route.ts +279 -0
  64. package/renderer/app/page.tsx +14 -0
  65. package/renderer/app/robots.txt/route.ts +84 -0
  66. package/renderer/app/sitemap.xml/route.ts +199 -0
  67. package/renderer/components/docs/index.ts +12 -0
  68. package/renderer/components/docs/mdx/accordion.tsx +169 -0
  69. package/renderer/components/docs/mdx/badge.tsx +132 -0
  70. package/renderer/components/docs/mdx/callouts.tsx +154 -0
  71. package/renderer/components/docs/mdx/cards.tsx +213 -0
  72. package/renderer/components/docs/mdx/changelog.tsx +120 -0
  73. package/renderer/components/docs/mdx/code-block.tsx +186 -0
  74. package/renderer/components/docs/mdx/code-group.tsx +421 -0
  75. package/renderer/components/docs/mdx/file-embeds.tsx +105 -0
  76. package/renderer/components/docs/mdx/frame.tsx +112 -0
  77. package/renderer/components/docs/mdx/highlight.tsx +151 -0
  78. package/renderer/components/docs/mdx/iframe.tsx +134 -0
  79. package/renderer/components/docs/mdx/image.tsx +235 -0
  80. package/renderer/components/docs/mdx/index.ts +204 -0
  81. package/renderer/components/docs/mdx/mermaid.tsx +240 -0
  82. package/renderer/components/docs/mdx/param-field.tsx +200 -0
  83. package/renderer/components/docs/mdx/steps.tsx +113 -0
  84. package/renderer/components/docs/mdx/tabs.tsx +86 -0
  85. package/renderer/components/docs/mdx-renderer.tsx +100 -0
  86. package/renderer/components/docs/navigation/breadcrumbs.tsx +76 -0
  87. package/renderer/components/docs/navigation/index.ts +8 -0
  88. package/renderer/components/docs/navigation/page-nav.tsx +64 -0
  89. package/renderer/components/docs/navigation/sidebar.tsx +515 -0
  90. package/renderer/components/docs/navigation/toc.tsx +113 -0
  91. package/renderer/components/docs/notice.tsx +105 -0
  92. package/renderer/components/docs-header.tsx +274 -0
  93. package/renderer/components/docs-viewer/agent/agent-chat.tsx +2076 -0
  94. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +90 -0
  95. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +49 -0
  96. package/renderer/components/docs-viewer/agent/cards/index.tsx +50 -0
  97. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +212 -0
  98. package/renderer/components/docs-viewer/agent/cards/types.ts +84 -0
  99. package/renderer/components/docs-viewer/agent/chat-message.tsx +17 -0
  100. package/renderer/components/docs-viewer/agent/index.tsx +6 -0
  101. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +119 -0
  102. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +46 -0
  103. package/renderer/components/docs-viewer/agent/messages/index.ts +17 -0
  104. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +721 -0
  105. package/renderer/components/docs-viewer/agent/messages/types.ts +61 -0
  106. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +24 -0
  107. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +51 -0
  108. package/renderer/components/docs-viewer/code-editor/index.tsx +2 -0
  109. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +1283 -0
  110. package/renderer/components/docs-viewer/content/changelog-page.tsx +331 -0
  111. package/renderer/components/docs-viewer/content/doc-page.tsx +285 -0
  112. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +17 -0
  113. package/renderer/components/docs-viewer/content/index.tsx +29 -0
  114. package/renderer/components/docs-viewer/content/introduction.tsx +21 -0
  115. package/renderer/components/docs-viewer/content/request-details.tsx +330 -0
  116. package/renderer/components/docs-viewer/content/sections/auth.tsx +69 -0
  117. package/renderer/components/docs-viewer/content/sections/body.tsx +66 -0
  118. package/renderer/components/docs-viewer/content/sections/headers.tsx +43 -0
  119. package/renderer/components/docs-viewer/content/sections/overview.tsx +40 -0
  120. package/renderer/components/docs-viewer/content/sections/parameters.tsx +43 -0
  121. package/renderer/components/docs-viewer/content/sections/responses.tsx +87 -0
  122. package/renderer/components/docs-viewer/global-auth-modal.tsx +352 -0
  123. package/renderer/components/docs-viewer/index.tsx +1466 -0
  124. package/renderer/components/docs-viewer/playground/auth-editor.tsx +280 -0
  125. package/renderer/components/docs-viewer/playground/body-editor.tsx +221 -0
  126. package/renderer/components/docs-viewer/playground/code-editor.tsx +224 -0
  127. package/renderer/components/docs-viewer/playground/code-snippet.tsx +387 -0
  128. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +745 -0
  129. package/renderer/components/docs-viewer/playground/index.tsx +671 -0
  130. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +261 -0
  131. package/renderer/components/docs-viewer/playground/method-selector.tsx +60 -0
  132. package/renderer/components/docs-viewer/playground/request-builder.tsx +179 -0
  133. package/renderer/components/docs-viewer/playground/request-tabs.tsx +237 -0
  134. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +21 -0
  135. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +93 -0
  136. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +16 -0
  137. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +23 -0
  138. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +268 -0
  139. package/renderer/components/docs-viewer/playground/response-cards/types.ts +82 -0
  140. package/renderer/components/docs-viewer/playground/response-viewer.tsx +43 -0
  141. package/renderer/components/docs-viewer/search/index.ts +2 -0
  142. package/renderer/components/docs-viewer/search/search-dialog.tsx +331 -0
  143. package/renderer/components/docs-viewer/search/use-search.ts +117 -0
  144. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +431 -0
  145. package/renderer/components/docs-viewer/shared/method-badge.tsx +41 -0
  146. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +349 -0
  147. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +239 -0
  148. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +316 -0
  149. package/renderer/components/docs-viewer/sidebar/index.tsx +343 -0
  150. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +202 -0
  151. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +118 -0
  152. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +226 -0
  153. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +52 -0
  154. package/renderer/components/theme-provider.tsx +11 -0
  155. package/renderer/components/theme-toggle.tsx +76 -0
  156. package/renderer/components/ui/badge.tsx +46 -0
  157. package/renderer/components/ui/button.tsx +59 -0
  158. package/renderer/components/ui/dialog.tsx +118 -0
  159. package/renderer/components/ui/dropdown-menu.tsx +257 -0
  160. package/renderer/components/ui/input.tsx +21 -0
  161. package/renderer/components/ui/label.tsx +24 -0
  162. package/renderer/components/ui/navigation-menu.tsx +168 -0
  163. package/renderer/components/ui/select.tsx +190 -0
  164. package/renderer/components/ui/spinner.tsx +114 -0
  165. package/renderer/components/ui/tabs.tsx +66 -0
  166. package/renderer/components/ui/tooltip.tsx +61 -0
  167. package/renderer/hooks/use-code-copy.ts +88 -0
  168. package/renderer/hooks/use-openapi-title.ts +44 -0
  169. package/renderer/lib/api-docs/agent/index.ts +6 -0
  170. package/renderer/lib/api-docs/agent/indexer.ts +323 -0
  171. package/renderer/lib/api-docs/agent/spec-summary.ts +335 -0
  172. package/renderer/lib/api-docs/agent/types.ts +116 -0
  173. package/renderer/lib/api-docs/auth/auth-context.tsx +225 -0
  174. package/renderer/lib/api-docs/auth/auth-storage.ts +87 -0
  175. package/renderer/lib/api-docs/auth/crypto.ts +89 -0
  176. package/renderer/lib/api-docs/auth/index.ts +4 -0
  177. package/renderer/lib/api-docs/code-editor/db.ts +164 -0
  178. package/renderer/lib/api-docs/code-editor/hooks.ts +266 -0
  179. package/renderer/lib/api-docs/code-editor/index.ts +6 -0
  180. package/renderer/lib/api-docs/code-editor/mode-context.tsx +207 -0
  181. package/renderer/lib/api-docs/code-editor/types.ts +105 -0
  182. package/renderer/lib/api-docs/codegen/definitions.ts +297 -0
  183. package/renderer/lib/api-docs/codegen/har.ts +251 -0
  184. package/renderer/lib/api-docs/codegen/index.ts +159 -0
  185. package/renderer/lib/api-docs/factories.ts +151 -0
  186. package/renderer/lib/api-docs/index.ts +17 -0
  187. package/renderer/lib/api-docs/mobile-context.tsx +112 -0
  188. package/renderer/lib/api-docs/navigation-context.tsx +88 -0
  189. package/renderer/lib/api-docs/parsers/graphql/README.md +129 -0
  190. package/renderer/lib/api-docs/parsers/graphql/index.ts +91 -0
  191. package/renderer/lib/api-docs/parsers/graphql/parser.ts +491 -0
  192. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +246 -0
  193. package/renderer/lib/api-docs/parsers/graphql/types.ts +283 -0
  194. package/renderer/lib/api-docs/parsers/openapi/README.md +32 -0
  195. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +60 -0
  196. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +574 -0
  197. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +403 -0
  198. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +232 -0
  199. package/renderer/lib/api-docs/parsers/openapi/index.ts +171 -0
  200. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +277 -0
  201. package/renderer/lib/api-docs/parsers/openapi/validator.ts +31 -0
  202. package/renderer/lib/api-docs/playground/context.tsx +107 -0
  203. package/renderer/lib/api-docs/playground/navigation-context.tsx +124 -0
  204. package/renderer/lib/api-docs/playground/request-builder.ts +223 -0
  205. package/renderer/lib/api-docs/playground/request-runner.ts +282 -0
  206. package/renderer/lib/api-docs/playground/types.ts +35 -0
  207. package/renderer/lib/api-docs/types.ts +269 -0
  208. package/renderer/lib/api-docs/utils.ts +311 -0
  209. package/renderer/lib/cache.ts +193 -0
  210. package/renderer/lib/docs/config/index.ts +29 -0
  211. package/renderer/lib/docs/config/loader.ts +142 -0
  212. package/renderer/lib/docs/config/schema.ts +298 -0
  213. package/renderer/lib/docs/index.ts +12 -0
  214. package/renderer/lib/docs/mdx/compiler.ts +176 -0
  215. package/renderer/lib/docs/mdx/frontmatter.ts +80 -0
  216. package/renderer/lib/docs/mdx/index.ts +26 -0
  217. package/renderer/lib/docs/navigation/generator.ts +348 -0
  218. package/renderer/lib/docs/navigation/index.ts +12 -0
  219. package/renderer/lib/docs/navigation/types.ts +123 -0
  220. package/renderer/lib/docs-navigation-context.tsx +80 -0
  221. package/renderer/lib/multi-tenant/context.ts +105 -0
  222. package/renderer/lib/storage/blob.ts +845 -0
  223. package/renderer/lib/utils.ts +6 -0
  224. package/renderer/next.config.ts +76 -0
  225. package/renderer/package.json +66 -0
  226. package/renderer/postcss.config.mjs +5 -0
  227. package/renderer/public/assets/images/screenshot.png +0 -0
  228. package/renderer/public/assets/logo/dark.svg +9 -0
  229. package/renderer/public/assets/logo/light.svg +9 -0
  230. package/renderer/public/assets/logo.svg +9 -0
  231. package/renderer/public/file.svg +1 -0
  232. package/renderer/public/globe.svg +1 -0
  233. package/renderer/public/icon.png +0 -0
  234. package/renderer/public/logo.svg +9 -0
  235. package/renderer/public/window.svg +1 -0
  236. package/renderer/tsconfig.json +28 -0
  237. package/templates/basic/README.md +139 -0
  238. package/templates/basic/assets/favicon.svg +4 -0
  239. package/templates/basic/assets/logo.svg +9 -0
  240. package/templates/basic/docs.json +47 -0
  241. package/templates/basic/guides/configuration.mdx +149 -0
  242. package/templates/basic/guides/overview.mdx +96 -0
  243. package/templates/basic/index.mdx +39 -0
  244. package/templates/basic/package.json +14 -0
  245. package/templates/basic/quickstart.mdx +92 -0
  246. package/templates/basic/vercel.json +6 -0
  247. package/templates/graphql/README.md +139 -0
  248. package/templates/graphql/api-reference/schema.graphql +305 -0
  249. package/templates/graphql/assets/favicon.svg +4 -0
  250. package/templates/graphql/assets/logo.svg +9 -0
  251. package/templates/graphql/docs.json +54 -0
  252. package/templates/graphql/guides/configuration.mdx +149 -0
  253. package/templates/graphql/guides/overview.mdx +96 -0
  254. package/templates/graphql/index.mdx +39 -0
  255. package/templates/graphql/package.json +14 -0
  256. package/templates/graphql/quickstart.mdx +92 -0
  257. package/templates/graphql/vercel.json +6 -0
  258. package/templates/openapi/README.md +139 -0
  259. package/templates/openapi/api-reference/openapi.json +419 -0
  260. package/templates/openapi/assets/favicon.svg +4 -0
  261. package/templates/openapi/assets/logo.svg +9 -0
  262. package/templates/openapi/docs.json +61 -0
  263. package/templates/openapi/guides/configuration.mdx +149 -0
  264. package/templates/openapi/guides/overview.mdx +96 -0
  265. package/templates/openapi/index.mdx +39 -0
  266. package/templates/openapi/package.json +14 -0
  267. package/templates/openapi/quickstart.mdx +92 -0
  268. package/templates/openapi/vercel.json +6 -0
@@ -0,0 +1,151 @@
1
+ 'use client'
2
+
3
+ import { cn } from '@/lib/utils'
4
+ import { ReactNode } from 'react'
5
+
6
+ type HighlightVariant = 'marker' | 'underline' | 'box' | 'gradient'
7
+ type HighlightColor = 'yellow' | 'blue' | 'green' | 'pink' | 'orange' | 'purple' | 'red'
8
+
9
+ interface HighlightProps {
10
+ children: ReactNode
11
+ /** Highlight style variant */
12
+ variant?: HighlightVariant
13
+ /** Highlight color */
14
+ color?: HighlightColor
15
+ /** Custom className */
16
+ className?: string
17
+ /** Whether to animate the highlight */
18
+ animated?: boolean
19
+ }
20
+
21
+ const colorStyles: Record<HighlightColor, Record<HighlightVariant, string>> = {
22
+ yellow: {
23
+ marker: 'bg-yellow-200/70 dark:bg-yellow-500/30',
24
+ underline: 'decoration-yellow-400 dark:decoration-yellow-500',
25
+ box: 'ring-yellow-400 dark:ring-yellow-500',
26
+ gradient: 'from-yellow-200/80 to-yellow-300/80 dark:from-yellow-500/30 dark:to-yellow-600/30',
27
+ },
28
+ blue: {
29
+ marker: 'bg-blue-200/70 dark:bg-blue-500/30',
30
+ underline: 'decoration-blue-400 dark:decoration-blue-500',
31
+ box: 'ring-blue-400 dark:ring-blue-500',
32
+ gradient: 'from-blue-200/80 to-blue-300/80 dark:from-blue-500/30 dark:to-blue-600/30',
33
+ },
34
+ green: {
35
+ marker: 'bg-green-200/70 dark:bg-green-500/30',
36
+ underline: 'decoration-green-400 dark:decoration-green-500',
37
+ box: 'ring-green-400 dark:ring-green-500',
38
+ gradient: 'from-green-200/80 to-green-300/80 dark:from-green-500/30 dark:to-green-600/30',
39
+ },
40
+ pink: {
41
+ marker: 'bg-pink-200/70 dark:bg-pink-500/30',
42
+ underline: 'decoration-pink-400 dark:decoration-pink-500',
43
+ box: 'ring-pink-400 dark:ring-pink-500',
44
+ gradient: 'from-pink-200/80 to-pink-300/80 dark:from-pink-500/30 dark:to-pink-600/30',
45
+ },
46
+ orange: {
47
+ marker: 'bg-orange-200/70 dark:bg-orange-500/30',
48
+ underline: 'decoration-orange-400 dark:decoration-orange-500',
49
+ box: 'ring-orange-400 dark:ring-orange-500',
50
+ gradient: 'from-orange-200/80 to-orange-300/80 dark:from-orange-500/30 dark:to-orange-600/30',
51
+ },
52
+ purple: {
53
+ marker: 'bg-purple-200/70 dark:bg-purple-500/30',
54
+ underline: 'decoration-purple-400 dark:decoration-purple-500',
55
+ box: 'ring-purple-400 dark:ring-purple-500',
56
+ gradient: 'from-purple-200/80 to-purple-300/80 dark:from-purple-500/30 dark:to-purple-600/30',
57
+ },
58
+ red: {
59
+ marker: 'bg-red-200/70 dark:bg-red-500/30',
60
+ underline: 'decoration-red-400 dark:decoration-red-500',
61
+ box: 'ring-red-400 dark:ring-red-500',
62
+ gradient: 'from-red-200/80 to-red-300/80 dark:from-red-500/30 dark:to-red-600/30',
63
+ },
64
+ }
65
+
66
+ /**
67
+ * Highlight - Text highlighter component
68
+ *
69
+ * Variants:
70
+ * - marker: Background highlight like a marker pen
71
+ * - underline: Wavy or straight underline
72
+ * - box: Outlined box around text
73
+ * - gradient: Gradient background highlight
74
+ */
75
+ export function Highlight({
76
+ children,
77
+ variant = 'marker',
78
+ color = 'yellow',
79
+ className,
80
+ animated = false,
81
+ }: HighlightProps) {
82
+ const colorStyle = colorStyles[color]?.[variant] || colorStyles.yellow[variant]
83
+
84
+ const baseStyles = {
85
+ marker: cn(
86
+ 'docs-highlight docs-highlight-marker',
87
+ 'px-1 py-0.5 rounded-sm',
88
+ colorStyle,
89
+ animated && 'animate-pulse',
90
+ className
91
+ ),
92
+ underline: cn(
93
+ 'docs-highlight docs-highlight-underline',
94
+ 'underline decoration-wavy decoration-2 underline-offset-4',
95
+ colorStyle,
96
+ className
97
+ ),
98
+ box: cn(
99
+ 'docs-highlight docs-highlight-box',
100
+ 'px-1 py-0.5 ring-2 rounded',
101
+ colorStyle,
102
+ className
103
+ ),
104
+ gradient: cn(
105
+ 'docs-highlight docs-highlight-gradient',
106
+ 'px-1 py-0.5 rounded-sm bg-gradient-to-r',
107
+ colorStyle,
108
+ animated && 'animate-pulse',
109
+ className
110
+ ),
111
+ }
112
+
113
+ return (
114
+ <span className={baseStyles[variant]}>
115
+ {children}
116
+ </span>
117
+ )
118
+ }
119
+
120
+ /**
121
+ * Marker - Shorthand for marker-style highlight
122
+ */
123
+ export function Marker({
124
+ children,
125
+ color = 'yellow',
126
+ className,
127
+ }: Omit<HighlightProps, 'variant'>) {
128
+ return (
129
+ <Highlight variant="marker" color={color} className={className}>
130
+ {children}
131
+ </Highlight>
132
+ )
133
+ }
134
+
135
+ /**
136
+ * Underline - Shorthand for underline-style highlight
137
+ */
138
+ export function Underline({
139
+ children,
140
+ color = 'orange',
141
+ className,
142
+ }: Omit<HighlightProps, 'variant'>) {
143
+ return (
144
+ <Highlight variant="underline" color={color} className={className}>
145
+ {children}
146
+ </Highlight>
147
+ )
148
+ }
149
+
150
+ // Export all components
151
+ export default Highlight
@@ -0,0 +1,134 @@
1
+ 'use client'
2
+
3
+ import React from 'react'
4
+ import { cn } from '@/lib/utils'
5
+
6
+ /**
7
+ * Iframe Component for MDX Documentation
8
+ *
9
+ * Embed external content like videos, demos, or interactive widgets.
10
+ */
11
+
12
+ interface IframeProps {
13
+ src: string
14
+ title?: string
15
+ width?: string | number
16
+ height?: string | number
17
+ aspectRatio?: '16/9' | '4/3' | '1/1' | '9/16' | string
18
+ allowFullScreen?: boolean
19
+ allow?: string
20
+ className?: string
21
+ frameBorder?: string | number
22
+ }
23
+
24
+ export function Iframe({
25
+ src,
26
+ title = 'Embedded content',
27
+ width,
28
+ height,
29
+ aspectRatio,
30
+ allowFullScreen = true,
31
+ allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',
32
+ className,
33
+ frameBorder = 0,
34
+ }: IframeProps) {
35
+ // Determine sizing approach
36
+ const hasFixedSize = width || height
37
+ const useAspectRatio = aspectRatio && !hasFixedSize
38
+
39
+ // Convert numeric values to pixels
40
+ const getSize = (value: string | number | undefined) => {
41
+ if (value === undefined) return undefined
42
+ if (typeof value === 'number') return `${value}px`
43
+ return value
44
+ }
45
+
46
+ const containerStyle: React.CSSProperties = useAspectRatio
47
+ ? { aspectRatio }
48
+ : {}
49
+
50
+ const iframeStyle: React.CSSProperties = {
51
+ width: getSize(width) || (useAspectRatio ? '100%' : undefined),
52
+ height: getSize(height) || (useAspectRatio ? '100%' : undefined),
53
+ }
54
+
55
+ return (
56
+ <div
57
+ className={cn(
58
+ 'docs-iframe my-4 overflow-hidden rounded-lg border border-border',
59
+ useAspectRatio && 'w-full',
60
+ className
61
+ )}
62
+ style={containerStyle}
63
+ >
64
+ <iframe
65
+ src={src}
66
+ title={title}
67
+ style={iframeStyle}
68
+ frameBorder={frameBorder}
69
+ allowFullScreen={allowFullScreen}
70
+ allow={allow}
71
+ className={cn(
72
+ 'docs-iframe-content',
73
+ useAspectRatio && 'w-full h-full'
74
+ )}
75
+ />
76
+ </div>
77
+ )
78
+ }
79
+
80
+ // Video embed component - convenience wrapper for common video platforms
81
+ interface VideoProps {
82
+ src: string
83
+ title?: string
84
+ aspectRatio?: '16/9' | '4/3'
85
+ className?: string
86
+ }
87
+
88
+ export function Video({ src, title = 'Video', aspectRatio = '16/9', className }: VideoProps) {
89
+ // Convert YouTube watch URLs to embed URLs
90
+ let embedSrc = src
91
+ if (src.includes('youtube.com/watch')) {
92
+ const videoId = new URL(src).searchParams.get('v')
93
+ if (videoId) {
94
+ embedSrc = `https://www.youtube.com/embed/${videoId}`
95
+ }
96
+ } else if (src.includes('youtu.be/')) {
97
+ const videoId = src.split('youtu.be/')[1]?.split('?')[0]
98
+ if (videoId) {
99
+ embedSrc = `https://www.youtube.com/embed/${videoId}`
100
+ }
101
+ } else if (src.includes('vimeo.com/') && !src.includes('player.vimeo.com')) {
102
+ const videoId = src.split('vimeo.com/')[1]?.split('?')[0]
103
+ if (videoId) {
104
+ embedSrc = `https://player.vimeo.com/video/${videoId}`
105
+ }
106
+ }
107
+
108
+ return (
109
+ <Iframe
110
+ src={embedSrc}
111
+ title={title}
112
+ aspectRatio={aspectRatio}
113
+ className={cn('docs-video', className)}
114
+ />
115
+ )
116
+ }
117
+
118
+ // Loom embed component
119
+ interface LoomProps {
120
+ id: string
121
+ title?: string
122
+ className?: string
123
+ }
124
+
125
+ export function Loom({ id, title = 'Loom video', className }: LoomProps) {
126
+ return (
127
+ <Iframe
128
+ src={`https://www.loom.com/embed/${id}`}
129
+ title={title}
130
+ aspectRatio="16/9"
131
+ className={cn('docs-loom', className)}
132
+ />
133
+ )
134
+ }
@@ -0,0 +1,235 @@
1
+ 'use client'
2
+
3
+ import React from 'react'
4
+ import { cn } from '@/lib/utils'
5
+
6
+ /**
7
+ * Image Component for MDX Documentation
8
+ *
9
+ * Supports resizing via wsrv.nl image proxy for optimization.
10
+ */
11
+
12
+ interface ImageProps {
13
+ src: string
14
+ alt: string
15
+ width?: number
16
+ height?: number
17
+ maxWidth?: number
18
+ maxHeight?: number
19
+ caption?: string
20
+ className?: string
21
+ rounded?: boolean
22
+ shadow?: boolean
23
+ border?: boolean
24
+ align?: 'left' | 'center' | 'right'
25
+ optimize?: boolean // Enable wsrv.nl optimization (default: true for external images)
26
+ quality?: number // Image quality 1-100 (default: 80)
27
+ }
28
+
29
+ /**
30
+ * Get resized image URL using wsrv.nl proxy
31
+ */
32
+ function getResizedImageUrl(
33
+ imageUrl: string,
34
+ options: {
35
+ width?: number
36
+ height?: number
37
+ maxWidth?: number
38
+ maxHeight?: number
39
+ quality?: number
40
+ } = {}
41
+ ): string {
42
+ const { width, height, maxWidth, maxHeight, quality = 80 } = options
43
+
44
+ // Skip if already a wsrv.nl URL
45
+ if (imageUrl.startsWith('https://wsrv.nl')) {
46
+ return imageUrl
47
+ }
48
+
49
+ // For data URLs, we can't use wsrv.nl
50
+ if (imageUrl.startsWith('data:')) {
51
+ return imageUrl
52
+ }
53
+
54
+ // For relative URLs (local images), don't proxy
55
+ if (imageUrl.startsWith('/') || imageUrl.startsWith('./') || imageUrl.startsWith('../')) {
56
+ return imageUrl
57
+ }
58
+
59
+ // Build wsrv.nl URL
60
+ const proxyUrl = new URL('https://wsrv.nl/')
61
+ proxyUrl.searchParams.set('url', imageUrl)
62
+
63
+ // Set dimensions
64
+ if (width) {
65
+ proxyUrl.searchParams.set('w', width.toString())
66
+ } else if (maxWidth) {
67
+ proxyUrl.searchParams.set('w', maxWidth.toString())
68
+ }
69
+
70
+ if (height) {
71
+ proxyUrl.searchParams.set('h', height.toString())
72
+ } else if (maxHeight) {
73
+ proxyUrl.searchParams.set('h', maxHeight.toString())
74
+ }
75
+
76
+ // If only max dimensions are set, use fit=inside to maintain aspect ratio
77
+ if ((maxWidth || maxHeight) && !width && !height) {
78
+ proxyUrl.searchParams.set('fit', 'inside')
79
+ proxyUrl.searchParams.set('n', '-1') // Don't upscale
80
+ }
81
+
82
+ // Quality and format
83
+ proxyUrl.searchParams.set('q', quality.toString())
84
+
85
+ return proxyUrl.toString()
86
+ }
87
+
88
+ export function Image({
89
+ src,
90
+ alt,
91
+ width,
92
+ height,
93
+ maxWidth,
94
+ maxHeight,
95
+ caption,
96
+ className,
97
+ rounded = true,
98
+ shadow = false,
99
+ border = false,
100
+ align = 'center',
101
+ optimize = true,
102
+ quality = 80,
103
+ }: ImageProps) {
104
+ // Determine if we should optimize
105
+ const isExternalImage = src.startsWith('http://') || src.startsWith('https://')
106
+ const shouldOptimize = optimize && isExternalImage
107
+
108
+ // Get the final image URL
109
+ const imageSrc = shouldOptimize
110
+ ? getResizedImageUrl(src, { width, height, maxWidth, maxHeight, quality })
111
+ : src
112
+
113
+ const alignmentClasses = {
114
+ left: 'mr-auto',
115
+ center: 'mx-auto',
116
+ right: 'ml-auto',
117
+ }
118
+
119
+ const imageElement = (
120
+ // eslint-disable-next-line @next/next/no-img-element
121
+ <img
122
+ src={imageSrc}
123
+ alt={alt}
124
+ width={width}
125
+ height={height}
126
+ style={{
127
+ maxWidth: maxWidth ? `${maxWidth}px` : '100%',
128
+ maxHeight: maxHeight ? `${maxHeight}px` : undefined,
129
+ height: 'auto',
130
+ }}
131
+ className={cn(
132
+ 'docs-image',
133
+ rounded && 'rounded-lg',
134
+ shadow && 'shadow-lg',
135
+ border && 'border border-border',
136
+ alignmentClasses[align],
137
+ className
138
+ )}
139
+ loading="lazy"
140
+ />
141
+ )
142
+
143
+ if (caption) {
144
+ return (
145
+ <figure className={cn('docs-image-figure my-6', alignmentClasses[align])}>
146
+ {imageElement}
147
+ <figcaption className="docs-image-caption mt-2 text-center text-sm text-muted-foreground">
148
+ {caption}
149
+ </figcaption>
150
+ </figure>
151
+ )
152
+ }
153
+
154
+ return <div className={cn('docs-image-wrapper my-4', alignmentClasses[align])}>{imageElement}</div>
155
+ }
156
+
157
+ /**
158
+ * Screenshot component - convenience wrapper with default styling
159
+ */
160
+ export function Screenshot({
161
+ src,
162
+ alt,
163
+ caption,
164
+ maxWidth = 800,
165
+ className,
166
+ ...props
167
+ }: Omit<ImageProps, 'shadow' | 'border' | 'rounded'>) {
168
+ return (
169
+ <Image
170
+ src={src}
171
+ alt={alt}
172
+ caption={caption}
173
+ maxWidth={maxWidth}
174
+ rounded
175
+ shadow
176
+ border
177
+ className={cn('docs-screenshot', className)}
178
+ {...props}
179
+ />
180
+ )
181
+ }
182
+
183
+ /**
184
+ * Logo component - for displaying logos without optimization artifacts
185
+ */
186
+ export function Logo({
187
+ src,
188
+ alt,
189
+ width = 200,
190
+ height,
191
+ className,
192
+ ...props
193
+ }: Omit<ImageProps, 'optimize' | 'quality' | 'shadow' | 'rounded' | 'border'>) {
194
+ return (
195
+ <Image
196
+ src={src}
197
+ alt={alt}
198
+ width={width}
199
+ height={height}
200
+ optimize={false}
201
+ rounded={false}
202
+ shadow={false}
203
+ border={false}
204
+ className={cn('docs-logo', className)}
205
+ {...props}
206
+ />
207
+ )
208
+ }
209
+
210
+ /**
211
+ * Icon component - small images/icons
212
+ */
213
+ export function Icon({
214
+ src,
215
+ alt,
216
+ size = 24,
217
+ className,
218
+ }: {
219
+ src: string
220
+ alt: string
221
+ size?: number
222
+ className?: string
223
+ }) {
224
+ return (
225
+ // eslint-disable-next-line @next/next/no-img-element
226
+ <img
227
+ src={src}
228
+ alt={alt}
229
+ width={size}
230
+ height={size}
231
+ className={cn('docs-icon inline-block', className)}
232
+ loading="lazy"
233
+ />
234
+ )
235
+ }
@@ -0,0 +1,204 @@
1
+ /**
2
+ * MDX Components Registry
3
+ *
4
+ * Exports all custom MDX components for use in documentation pages.
5
+ * These components are Mintlify-compatible.
6
+ */
7
+
8
+ // Callouts
9
+ export {
10
+ Note,
11
+ Warning,
12
+ Info,
13
+ Tip,
14
+ Check,
15
+ Error,
16
+ Callout,
17
+ } from './callouts'
18
+
19
+ // Cards
20
+ export {
21
+ Card,
22
+ CardGroup,
23
+ } from './cards'
24
+
25
+ // Accordion
26
+ export {
27
+ Accordion,
28
+ AccordionGroup,
29
+ } from './accordion'
30
+
31
+ // Steps
32
+ export {
33
+ Steps,
34
+ Step,
35
+ } from './steps'
36
+
37
+ // Tabs
38
+ export {
39
+ Tabs,
40
+ Tab,
41
+ } from './tabs'
42
+
43
+ // Code Group
44
+ export { CodeGroup } from './code-group'
45
+
46
+ // Layout
47
+ export {
48
+ Frame,
49
+ Columns,
50
+ Snippet,
51
+ Latex,
52
+ } from './frame'
53
+
54
+ // API Documentation
55
+ export {
56
+ ParamField,
57
+ ResponseField,
58
+ Expandable,
59
+ } from './param-field'
60
+
61
+ // Embeds
62
+ export {
63
+ Iframe,
64
+ Video,
65
+ Loom,
66
+ } from './iframe'
67
+
68
+ // Images
69
+ export {
70
+ Image,
71
+ Screenshot,
72
+ Logo,
73
+ Icon,
74
+ } from './image'
75
+
76
+ // Highlight
77
+ export {
78
+ Highlight,
79
+ Marker,
80
+ Underline,
81
+ } from './highlight'
82
+
83
+ // Badge
84
+ export { Badge } from './badge'
85
+
86
+ // Mermaid
87
+ export { Mermaid } from './mermaid'
88
+
89
+ // File Embeds
90
+ export { PDF, Audio, Download } from './file-embeds'
91
+
92
+ // Changelog
93
+ export {
94
+ ChangelogEntry,
95
+ ChangelogTitle,
96
+ ChangelogDescription,
97
+ ChangelogImage,
98
+ BreakingChange,
99
+ MoreUpdates,
100
+ UpdateItem,
101
+ } from './changelog'
102
+
103
+ // Re-export types
104
+ export type { Frontmatter } from '@/lib/docs/mdx/frontmatter'
105
+
106
+ /**
107
+ * Default MDX components mapping
108
+ *
109
+ * Use this object with next-mdx-remote to enable all custom components
110
+ */
111
+ import { Note, Warning, Info, Tip, Check, Error as ErrorCallout, Callout } from './callouts'
112
+ import { Card, CardGroup } from './cards'
113
+ import { Accordion, AccordionGroup } from './accordion'
114
+ import { Steps, Step } from './steps'
115
+ import { Tabs, Tab } from './tabs'
116
+ import { CodeGroup } from './code-group'
117
+ import { Frame, Columns, Snippet, Latex } from './frame'
118
+ import { ParamField, ResponseField, Expandable } from './param-field'
119
+ import { Iframe, Video, Loom } from './iframe'
120
+ import { Image, Screenshot, Logo, Icon } from './image'
121
+ import { Highlight, Marker, Underline } from './highlight'
122
+ import { Badge } from './badge'
123
+ import { Mermaid } from './mermaid'
124
+ import { PDF, Audio, Download } from './file-embeds'
125
+ import { ChangelogEntry, ChangelogTitle, ChangelogDescription, ChangelogImage, BreakingChange, MoreUpdates, UpdateItem } from './changelog'
126
+
127
+ export const mdxComponents = {
128
+ // Callouts
129
+ Note,
130
+ Warning,
131
+ Info,
132
+ Tip,
133
+ Check,
134
+ Error: ErrorCallout,
135
+ Callout,
136
+
137
+ // Cards
138
+ Card,
139
+ CardGroup,
140
+
141
+ // Accordion
142
+ Accordion,
143
+ AccordionGroup,
144
+
145
+ // Steps
146
+ Steps,
147
+ Step,
148
+
149
+ // Tabs
150
+ Tabs,
151
+ Tab,
152
+
153
+ // Code
154
+ CodeGroup,
155
+
156
+ // Layout
157
+ Frame,
158
+ Columns,
159
+ Snippet,
160
+ Latex,
161
+
162
+ // API docs
163
+ ParamField,
164
+ ResponseField,
165
+ Expandable,
166
+
167
+ // Embeds
168
+ Iframe,
169
+ Video,
170
+ Loom,
171
+
172
+ // Images
173
+ Image,
174
+ Screenshot,
175
+ Logo,
176
+ Icon,
177
+
178
+ // Highlight
179
+ Highlight,
180
+ Marker,
181
+ Underline,
182
+
183
+ // Badge
184
+ Badge,
185
+
186
+ // Mermaid
187
+ Mermaid,
188
+
189
+ // File Embeds
190
+ PDF,
191
+ Audio,
192
+ Download,
193
+
194
+ // Changelog
195
+ ChangelogEntry,
196
+ ChangelogTitle,
197
+ ChangelogDescription,
198
+ ChangelogImage,
199
+ BreakingChange,
200
+ MoreUpdates,
201
+ UpdateItem,
202
+ }
203
+
204
+ export default mdxComponents