@brainfish-ai/devdoc 0.1.41 → 0.1.43

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 (400) hide show
  1. package/ai-agents/.claude/skills/bootstrap-docs/SKILL.md +710 -79
  2. package/ai-agents/.claude/skills/check-docs/SKILL.md +83 -8
  3. package/ai-agents/.claude/skills/create-doc/SKILL.md +267 -55
  4. package/ai-agents/.claude/skills/update-doc/SKILL.md +162 -63
  5. package/ai-agents/.cursor/rules/devdoc-bootstrap.mdc +145 -15
  6. package/ai-agents/.cursor/rules/devdoc-create.mdc +108 -57
  7. package/ai-agents/.cursor/rules/devdoc-update.mdc +93 -70
  8. package/ai-agents/.cursor/rules/devdoc.mdc +21 -0
  9. package/ai-agents/schemas/docs.schema.json +332 -0
  10. package/ai-agents/schemas/theme.schema.json +243 -0
  11. package/dist/cli/commands/create.js +4 -9
  12. package/dist/cli/commands/deploy.js +50 -25
  13. package/dist/cli/commands/dev.js +19 -10
  14. package/package.json +3 -2
  15. package/renderer/app/api/assets/[...path]/route.js +108 -0
  16. package/renderer/app/api/assets/route.js +114 -0
  17. package/renderer/app/api/assets/upload/route.js +163 -0
  18. package/renderer/app/api/auth-schemes/route.js +58 -0
  19. package/renderer/app/api/chat/route.js +759 -0
  20. package/renderer/app/api/codegen/route.js +52 -0
  21. package/renderer/app/api/collections/route.js +675 -0
  22. package/renderer/app/api/debug/route.js +47 -0
  23. package/renderer/app/api/deploy/route.js +199 -0
  24. package/renderer/app/api/device/route.js +36 -0
  25. package/renderer/app/api/docs/route.js +205 -0
  26. package/renderer/app/api/domains/add/route.js +121 -0
  27. package/renderer/app/api/domains/lookup/route.js +43 -0
  28. package/renderer/app/api/domains/remove/route.js +89 -0
  29. package/renderer/app/api/domains/status/route.js +140 -0
  30. package/renderer/app/api/domains/verify/route.js +168 -0
  31. package/renderer/app/api/keys/regenerate/route.js +71 -0
  32. package/renderer/app/api/local-assets/[...path]/route.js +108 -0
  33. package/renderer/app/api/openapi-spec/route.js +73 -0
  34. package/renderer/app/api/projects/[slug]/route.js +129 -0
  35. package/renderer/app/api/projects/[slug]/stats/route.js +80 -0
  36. package/renderer/app/api/projects/register/route.js +176 -0
  37. package/renderer/app/api/proxy/route.js +139 -0
  38. package/renderer/app/api/proxy-stream/route.js +156 -0
  39. package/renderer/app/api/redirects/route.js +35 -0
  40. package/renderer/app/api/schema/route.js +85 -0
  41. package/renderer/app/api/subdomains/check/route.js +158 -0
  42. package/renderer/app/api/suggestions/route.js +175 -0
  43. package/renderer/app/layout.js +47 -0
  44. package/renderer/app/llms-full.txt/route.js +257 -0
  45. package/renderer/app/llms.txt/route.js +219 -0
  46. package/renderer/app/page.js +12 -0
  47. package/renderer/app/robots.txt/route.js +66 -0
  48. package/renderer/app/sitemap.xml/route.js +145 -0
  49. package/renderer/components/docs/index.js +8 -0
  50. package/renderer/components/docs/mdx/accordion.js +113 -0
  51. package/renderer/components/docs/mdx/badge.js +72 -0
  52. package/renderer/components/docs/mdx/callouts.js +137 -0
  53. package/renderer/components/docs/mdx/cards.js +175 -0
  54. package/renderer/components/docs/mdx/changelog.js +100 -0
  55. package/renderer/components/docs/mdx/code-block.js +147 -0
  56. package/renderer/components/docs/mdx/code-group.js +287 -0
  57. package/renderer/components/docs/mdx/file-embeds.js +82 -0
  58. package/renderer/components/docs/mdx/frame.js +59 -0
  59. package/renderer/components/docs/mdx/highlight.js +90 -0
  60. package/renderer/components/docs/mdx/iframe.js +69 -0
  61. package/renderer/components/docs/mdx/image.js +135 -0
  62. package/renderer/components/docs/mdx/index.js +134 -0
  63. package/renderer/components/docs/mdx/landing.js +315 -0
  64. package/renderer/components/docs/mdx/mermaid.js +212 -0
  65. package/renderer/components/docs/mdx/param-field.js +112 -0
  66. package/renderer/components/docs/mdx/steps.js +74 -0
  67. package/renderer/components/docs/mdx/tabs.js +50 -0
  68. package/renderer/components/docs/mdx-renderer.js +77 -0
  69. package/renderer/components/docs/navigation/breadcrumbs.js +64 -0
  70. package/renderer/components/docs/navigation/index.js +6 -0
  71. package/renderer/components/docs/navigation/page-nav.js +57 -0
  72. package/renderer/components/docs/navigation/sidebar.js +375 -0
  73. package/renderer/components/docs/navigation/toc.js +89 -0
  74. package/renderer/components/docs/notice.js +77 -0
  75. package/renderer/components/docs-header.js +202 -0
  76. package/renderer/components/docs-viewer/agent/agent-chat.js +1930 -0
  77. package/renderer/components/docs-viewer/agent/cards/debug-context-card.js +107 -0
  78. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.js +57 -0
  79. package/renderer/components/docs-viewer/agent/cards/index.js +45 -0
  80. package/renderer/components/docs-viewer/agent/cards/response-options-card.js +154 -0
  81. package/renderer/components/docs-viewer/agent/cards/types.js +22 -0
  82. package/renderer/components/docs-viewer/agent/chat-message.js +2 -0
  83. package/renderer/components/docs-viewer/agent/index.js +4 -0
  84. package/renderer/components/docs-viewer/agent/messages/assistant-message.js +108 -0
  85. package/renderer/components/docs-viewer/agent/messages/chat-message.js +34 -0
  86. package/renderer/components/docs-viewer/agent/messages/index.js +6 -0
  87. package/renderer/components/docs-viewer/agent/messages/tool-call-display.js +1065 -0
  88. package/renderer/components/docs-viewer/agent/messages/types.js +2 -0
  89. package/renderer/components/docs-viewer/agent/messages/typing-indicator.js +26 -0
  90. package/renderer/components/docs-viewer/agent/messages/user-message.js +37 -0
  91. package/renderer/components/docs-viewer/code-editor/{index.tsx → index.js} +1 -1
  92. package/renderer/components/docs-viewer/code-editor/notes-mode.js +1338 -0
  93. package/renderer/components/docs-viewer/content/changelog-page.js +297 -0
  94. package/renderer/components/docs-viewer/content/doc-page.js +264 -0
  95. package/renderer/components/docs-viewer/content/documentation-viewer.js +14 -0
  96. package/renderer/components/docs-viewer/content/index.js +29 -0
  97. package/renderer/components/docs-viewer/content/not-found-page.js +300 -0
  98. package/renderer/components/docs-viewer/content/request-details.js +528 -0
  99. package/renderer/components/docs-viewer/content/sections/auth.js +108 -0
  100. package/renderer/components/docs-viewer/content/sections/body.js +80 -0
  101. package/renderer/components/docs-viewer/content/sections/headers.js +64 -0
  102. package/renderer/components/docs-viewer/content/sections/overview.js +56 -0
  103. package/renderer/components/docs-viewer/content/sections/parameters.js +64 -0
  104. package/renderer/components/docs-viewer/content/sections/responses.js +91 -0
  105. package/renderer/components/docs-viewer/global-auth-modal.js +427 -0
  106. package/renderer/components/docs-viewer/index.js +1552 -0
  107. package/renderer/components/docs-viewer/playground/auth-editor.js +418 -0
  108. package/renderer/components/docs-viewer/playground/body-editor.js +240 -0
  109. package/renderer/components/docs-viewer/playground/code-editor.js +135 -0
  110. package/renderer/components/docs-viewer/playground/code-snippet.js +393 -0
  111. package/renderer/components/docs-viewer/playground/graphql-playground.js +734 -0
  112. package/renderer/components/docs-viewer/playground/index.js +682 -0
  113. package/renderer/components/docs-viewer/playground/key-value-editor.js +317 -0
  114. package/renderer/components/docs-viewer/playground/method-selector.js +65 -0
  115. package/renderer/components/docs-viewer/playground/request-builder.js +181 -0
  116. package/renderer/components/docs-viewer/playground/request-tabs.js +240 -0
  117. package/renderer/components/docs-viewer/playground/response-cards/idle-card.js +42 -0
  118. package/renderer/components/docs-viewer/playground/response-cards/index.js +72 -0
  119. package/renderer/components/docs-viewer/playground/response-cards/loading-card.js +24 -0
  120. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.js +28 -0
  121. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.js +308 -0
  122. package/renderer/components/docs-viewer/playground/response-cards/types.js +9 -0
  123. package/renderer/components/docs-viewer/playground/response-viewer.js +18 -0
  124. package/renderer/components/docs-viewer/search/index.js +2 -0
  125. package/renderer/components/docs-viewer/search/search-dialog.js +367 -0
  126. package/renderer/components/docs-viewer/search/use-search.js +89 -0
  127. package/renderer/components/docs-viewer/shared/markdown-renderer.js +423 -0
  128. package/renderer/components/docs-viewer/shared/method-badge.js +23 -0
  129. package/renderer/components/docs-viewer/shared/schema-viewer.js +321 -0
  130. package/renderer/components/docs-viewer/sidebar/collection-tree.js +222 -0
  131. package/renderer/components/docs-viewer/sidebar/endpoint-options.js +512 -0
  132. package/renderer/components/docs-viewer/sidebar/index.js +196 -0
  133. package/renderer/components/docs-viewer/sidebar/right-sidebar.js +163 -0
  134. package/renderer/components/docs-viewer/sidebar/sidebar-group.js +87 -0
  135. package/renderer/components/docs-viewer/sidebar/sidebar-item.js +172 -0
  136. package/renderer/components/docs-viewer/sidebar/sidebar-section.js +31 -0
  137. package/renderer/components/theme-provider.js +10 -0
  138. package/renderer/components/theme-toggle.js +106 -0
  139. package/renderer/components/ui/badge.js +29 -0
  140. package/renderer/components/ui/button.js +40 -0
  141. package/renderer/components/ui/dialog.js +50 -0
  142. package/renderer/components/ui/dropdown-menu.js +143 -0
  143. package/renderer/components/ui/input.js +12 -0
  144. package/renderer/components/ui/label.js +13 -0
  145. package/renderer/components/ui/navigation-menu.js +83 -0
  146. package/renderer/components/ui/select.js +116 -0
  147. package/renderer/components/ui/spinner.js +92 -0
  148. package/renderer/components/ui/tabs.js +34 -0
  149. package/renderer/components/ui/tooltip.js +43 -0
  150. package/renderer/hooks/use-code-copy.js +76 -0
  151. package/renderer/hooks/use-openapi-title.js +33 -0
  152. package/renderer/lib/api-docs/agent/index.js +4 -0
  153. package/renderer/lib/api-docs/agent/indexer.js +254 -0
  154. package/renderer/lib/api-docs/agent/spec-summary.js +227 -0
  155. package/renderer/lib/api-docs/agent/types.js +5 -0
  156. package/renderer/lib/api-docs/auth/auth-context.js +157 -0
  157. package/renderer/lib/api-docs/auth/auth-storage.js +66 -0
  158. package/renderer/lib/api-docs/auth/crypto.js +64 -0
  159. package/renderer/lib/api-docs/auth/index.js +3 -0
  160. package/renderer/lib/api-docs/code-editor/db.js +145 -0
  161. package/renderer/lib/api-docs/code-editor/hooks.js +254 -0
  162. package/renderer/lib/api-docs/code-editor/{index.ts → index.js} +3 -4
  163. package/renderer/lib/api-docs/code-editor/mode-context.js +154 -0
  164. package/renderer/lib/api-docs/code-editor/types.js +53 -0
  165. package/renderer/lib/api-docs/codegen/definitions.js +258 -0
  166. package/renderer/lib/api-docs/codegen/har.js +171 -0
  167. package/renderer/lib/api-docs/codegen/index.js +118 -0
  168. package/renderer/lib/api-docs/factories.js +136 -0
  169. package/renderer/lib/api-docs/{index.ts → index.js} +5 -10
  170. package/renderer/lib/api-docs/mobile-context.js +79 -0
  171. package/renderer/lib/api-docs/navigation-context.js +62 -0
  172. package/renderer/lib/api-docs/parsers/graphql/index.js +50 -0
  173. package/renderer/lib/api-docs/parsers/graphql/parser.js +350 -0
  174. package/renderer/lib/api-docs/parsers/graphql/transformer.js +215 -0
  175. package/renderer/lib/api-docs/parsers/graphql/types.js +46 -0
  176. package/renderer/lib/api-docs/parsers/openapi/dereferencer.js +43 -0
  177. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.js +486 -0
  178. package/renderer/lib/api-docs/parsers/openapi/extractors/body.js +295 -0
  179. package/renderer/lib/api-docs/parsers/openapi/extractors/index.js +132 -0
  180. package/renderer/lib/api-docs/parsers/openapi/index.js +127 -0
  181. package/renderer/lib/api-docs/parsers/openapi/transformer.js +192 -0
  182. package/renderer/lib/api-docs/parsers/openapi/validator.js +24 -0
  183. package/renderer/lib/api-docs/playground/context.js +65 -0
  184. package/renderer/lib/api-docs/playground/navigation-context.js +74 -0
  185. package/renderer/lib/api-docs/playground/request-builder.js +163 -0
  186. package/renderer/lib/api-docs/playground/request-runner.js +224 -0
  187. package/renderer/lib/api-docs/playground/types.js +5 -0
  188. package/renderer/lib/api-docs/types.js +23 -0
  189. package/renderer/lib/api-docs/utils.js +212 -0
  190. package/renderer/lib/cache.js +157 -0
  191. package/renderer/lib/docs/config/domain-schema.js +161 -0
  192. package/renderer/lib/docs/config/index.js +5 -0
  193. package/renderer/lib/docs/config/loader.js +113 -0
  194. package/renderer/lib/docs/config/schema.js +269 -0
  195. package/renderer/lib/docs/index.js +8 -0
  196. package/renderer/lib/docs/mdx/compiler.js +128 -0
  197. package/renderer/lib/docs/mdx/frontmatter.js +73 -0
  198. package/renderer/lib/docs/mdx/index.js +8 -0
  199. package/renderer/lib/docs/navigation/generator.js +269 -0
  200. package/renderer/lib/docs/navigation/index.js +4 -0
  201. package/renderer/lib/docs/navigation/types.js +9 -0
  202. package/renderer/lib/docs-navigation-context.js +40 -0
  203. package/renderer/lib/multi-tenant/context.js +80 -0
  204. package/renderer/lib/storage/blob.js +767 -0
  205. package/renderer/lib/utils/icons.js +30 -0
  206. package/renderer/lib/utils.js +5 -0
  207. package/renderer/next.config.js +62 -0
  208. package/renderer/tsconfig.json +23 -5
  209. package/renderer/app/api/assets/[...path]/route.ts +0 -123
  210. package/renderer/app/api/assets/route.ts +0 -124
  211. package/renderer/app/api/assets/upload/route.ts +0 -177
  212. package/renderer/app/api/auth-schemes/route.ts +0 -77
  213. package/renderer/app/api/chat/route.ts +0 -858
  214. package/renderer/app/api/codegen/route.ts +0 -72
  215. package/renderer/app/api/collections/route.ts +0 -1002
  216. package/renderer/app/api/debug/route.ts +0 -53
  217. package/renderer/app/api/deploy/route.ts +0 -234
  218. package/renderer/app/api/device/route.ts +0 -42
  219. package/renderer/app/api/docs/route.ts +0 -201
  220. package/renderer/app/api/domains/add/route.ts +0 -132
  221. package/renderer/app/api/domains/lookup/route.ts +0 -43
  222. package/renderer/app/api/domains/remove/route.ts +0 -100
  223. package/renderer/app/api/domains/status/route.ts +0 -158
  224. package/renderer/app/api/domains/verify/route.ts +0 -181
  225. package/renderer/app/api/keys/regenerate/route.ts +0 -80
  226. package/renderer/app/api/local-assets/[...path]/route.ts +0 -122
  227. package/renderer/app/api/openapi-spec/route.ts +0 -151
  228. package/renderer/app/api/projects/[slug]/route.ts +0 -153
  229. package/renderer/app/api/projects/[slug]/stats/route.ts +0 -96
  230. package/renderer/app/api/projects/register/route.ts +0 -152
  231. package/renderer/app/api/proxy/route.ts +0 -149
  232. package/renderer/app/api/proxy-stream/route.ts +0 -168
  233. package/renderer/app/api/redirects/route.ts +0 -47
  234. package/renderer/app/api/schema/route.ts +0 -73
  235. package/renderer/app/api/subdomains/check/route.ts +0 -172
  236. package/renderer/app/api/suggestions/route.ts +0 -144
  237. package/renderer/app/layout.tsx +0 -54
  238. package/renderer/app/llms-full.txt/route.ts +0 -346
  239. package/renderer/app/llms.txt/route.ts +0 -279
  240. package/renderer/app/page.tsx +0 -14
  241. package/renderer/app/robots.txt/route.ts +0 -84
  242. package/renderer/app/sitemap.xml/route.ts +0 -199
  243. package/renderer/components/docs/index.ts +0 -12
  244. package/renderer/components/docs/mdx/accordion.tsx +0 -169
  245. package/renderer/components/docs/mdx/badge.tsx +0 -132
  246. package/renderer/components/docs/mdx/callouts.tsx +0 -154
  247. package/renderer/components/docs/mdx/cards.tsx +0 -241
  248. package/renderer/components/docs/mdx/changelog.tsx +0 -120
  249. package/renderer/components/docs/mdx/code-block.tsx +0 -186
  250. package/renderer/components/docs/mdx/code-group.tsx +0 -421
  251. package/renderer/components/docs/mdx/file-embeds.tsx +0 -105
  252. package/renderer/components/docs/mdx/frame.tsx +0 -112
  253. package/renderer/components/docs/mdx/highlight.tsx +0 -151
  254. package/renderer/components/docs/mdx/iframe.tsx +0 -134
  255. package/renderer/components/docs/mdx/image.tsx +0 -235
  256. package/renderer/components/docs/mdx/index.ts +0 -237
  257. package/renderer/components/docs/mdx/landing.tsx +0 -684
  258. package/renderer/components/docs/mdx/mermaid.tsx +0 -240
  259. package/renderer/components/docs/mdx/param-field.tsx +0 -200
  260. package/renderer/components/docs/mdx/steps.tsx +0 -113
  261. package/renderer/components/docs/mdx/tabs.tsx +0 -86
  262. package/renderer/components/docs/mdx-renderer.tsx +0 -100
  263. package/renderer/components/docs/navigation/breadcrumbs.tsx +0 -76
  264. package/renderer/components/docs/navigation/index.ts +0 -8
  265. package/renderer/components/docs/navigation/page-nav.tsx +0 -64
  266. package/renderer/components/docs/navigation/sidebar.tsx +0 -515
  267. package/renderer/components/docs/navigation/toc.tsx +0 -113
  268. package/renderer/components/docs/notice.tsx +0 -105
  269. package/renderer/components/docs-header.tsx +0 -278
  270. package/renderer/components/docs-viewer/agent/agent-chat.tsx +0 -2076
  271. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +0 -90
  272. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +0 -49
  273. package/renderer/components/docs-viewer/agent/cards/index.tsx +0 -50
  274. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +0 -212
  275. package/renderer/components/docs-viewer/agent/cards/types.ts +0 -84
  276. package/renderer/components/docs-viewer/agent/chat-message.tsx +0 -17
  277. package/renderer/components/docs-viewer/agent/index.tsx +0 -6
  278. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +0 -119
  279. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +0 -46
  280. package/renderer/components/docs-viewer/agent/messages/index.ts +0 -17
  281. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +0 -721
  282. package/renderer/components/docs-viewer/agent/messages/types.ts +0 -61
  283. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +0 -24
  284. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +0 -51
  285. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +0 -1283
  286. package/renderer/components/docs-viewer/content/changelog-page.tsx +0 -331
  287. package/renderer/components/docs-viewer/content/doc-page.tsx +0 -367
  288. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +0 -17
  289. package/renderer/components/docs-viewer/content/index.tsx +0 -29
  290. package/renderer/components/docs-viewer/content/not-found-page.tsx +0 -330
  291. package/renderer/components/docs-viewer/content/request-details.tsx +0 -330
  292. package/renderer/components/docs-viewer/content/sections/auth.tsx +0 -69
  293. package/renderer/components/docs-viewer/content/sections/body.tsx +0 -66
  294. package/renderer/components/docs-viewer/content/sections/headers.tsx +0 -43
  295. package/renderer/components/docs-viewer/content/sections/overview.tsx +0 -40
  296. package/renderer/components/docs-viewer/content/sections/parameters.tsx +0 -43
  297. package/renderer/components/docs-viewer/content/sections/responses.tsx +0 -87
  298. package/renderer/components/docs-viewer/global-auth-modal.tsx +0 -352
  299. package/renderer/components/docs-viewer/index.tsx +0 -1662
  300. package/renderer/components/docs-viewer/playground/auth-editor.tsx +0 -280
  301. package/renderer/components/docs-viewer/playground/body-editor.tsx +0 -221
  302. package/renderer/components/docs-viewer/playground/code-editor.tsx +0 -224
  303. package/renderer/components/docs-viewer/playground/code-snippet.tsx +0 -387
  304. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +0 -745
  305. package/renderer/components/docs-viewer/playground/index.tsx +0 -671
  306. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +0 -261
  307. package/renderer/components/docs-viewer/playground/method-selector.tsx +0 -60
  308. package/renderer/components/docs-viewer/playground/request-builder.tsx +0 -179
  309. package/renderer/components/docs-viewer/playground/request-tabs.tsx +0 -237
  310. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +0 -21
  311. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +0 -93
  312. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +0 -16
  313. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +0 -23
  314. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +0 -268
  315. package/renderer/components/docs-viewer/playground/response-cards/types.ts +0 -82
  316. package/renderer/components/docs-viewer/playground/response-viewer.tsx +0 -43
  317. package/renderer/components/docs-viewer/search/index.ts +0 -2
  318. package/renderer/components/docs-viewer/search/search-dialog.tsx +0 -331
  319. package/renderer/components/docs-viewer/search/use-search.ts +0 -117
  320. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +0 -431
  321. package/renderer/components/docs-viewer/shared/method-badge.tsx +0 -41
  322. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +0 -349
  323. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +0 -259
  324. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +0 -316
  325. package/renderer/components/docs-viewer/sidebar/index.tsx +0 -282
  326. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +0 -202
  327. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +0 -118
  328. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +0 -212
  329. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +0 -38
  330. package/renderer/components/theme-provider.tsx +0 -11
  331. package/renderer/components/theme-toggle.tsx +0 -76
  332. package/renderer/components/ui/badge.tsx +0 -46
  333. package/renderer/components/ui/button.tsx +0 -59
  334. package/renderer/components/ui/dialog.tsx +0 -118
  335. package/renderer/components/ui/dropdown-menu.tsx +0 -257
  336. package/renderer/components/ui/input.tsx +0 -21
  337. package/renderer/components/ui/label.tsx +0 -24
  338. package/renderer/components/ui/navigation-menu.tsx +0 -168
  339. package/renderer/components/ui/select.tsx +0 -190
  340. package/renderer/components/ui/spinner.tsx +0 -114
  341. package/renderer/components/ui/tabs.tsx +0 -66
  342. package/renderer/components/ui/tooltip.tsx +0 -61
  343. package/renderer/hooks/use-code-copy.ts +0 -88
  344. package/renderer/hooks/use-openapi-title.ts +0 -44
  345. package/renderer/lib/api-docs/agent/index.ts +0 -6
  346. package/renderer/lib/api-docs/agent/indexer.ts +0 -323
  347. package/renderer/lib/api-docs/agent/spec-summary.ts +0 -335
  348. package/renderer/lib/api-docs/agent/types.ts +0 -116
  349. package/renderer/lib/api-docs/auth/auth-context.tsx +0 -225
  350. package/renderer/lib/api-docs/auth/auth-storage.ts +0 -87
  351. package/renderer/lib/api-docs/auth/crypto.ts +0 -89
  352. package/renderer/lib/api-docs/auth/index.ts +0 -4
  353. package/renderer/lib/api-docs/code-editor/db.ts +0 -164
  354. package/renderer/lib/api-docs/code-editor/hooks.ts +0 -266
  355. package/renderer/lib/api-docs/code-editor/mode-context.tsx +0 -207
  356. package/renderer/lib/api-docs/code-editor/types.ts +0 -105
  357. package/renderer/lib/api-docs/codegen/definitions.ts +0 -297
  358. package/renderer/lib/api-docs/codegen/har.ts +0 -251
  359. package/renderer/lib/api-docs/codegen/index.ts +0 -159
  360. package/renderer/lib/api-docs/factories.ts +0 -170
  361. package/renderer/lib/api-docs/mobile-context.tsx +0 -112
  362. package/renderer/lib/api-docs/navigation-context.tsx +0 -88
  363. package/renderer/lib/api-docs/parsers/graphql/README.md +0 -129
  364. package/renderer/lib/api-docs/parsers/graphql/index.ts +0 -91
  365. package/renderer/lib/api-docs/parsers/graphql/parser.ts +0 -491
  366. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +0 -246
  367. package/renderer/lib/api-docs/parsers/graphql/types.ts +0 -283
  368. package/renderer/lib/api-docs/parsers/openapi/README.md +0 -32
  369. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +0 -60
  370. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +0 -574
  371. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +0 -403
  372. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +0 -232
  373. package/renderer/lib/api-docs/parsers/openapi/index.ts +0 -171
  374. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +0 -278
  375. package/renderer/lib/api-docs/parsers/openapi/validator.ts +0 -31
  376. package/renderer/lib/api-docs/playground/context.tsx +0 -107
  377. package/renderer/lib/api-docs/playground/navigation-context.tsx +0 -124
  378. package/renderer/lib/api-docs/playground/request-builder.ts +0 -223
  379. package/renderer/lib/api-docs/playground/request-runner.ts +0 -282
  380. package/renderer/lib/api-docs/playground/types.ts +0 -35
  381. package/renderer/lib/api-docs/types.ts +0 -269
  382. package/renderer/lib/api-docs/utils.ts +0 -311
  383. package/renderer/lib/cache.ts +0 -193
  384. package/renderer/lib/docs/config/domain-schema.ts +0 -260
  385. package/renderer/lib/docs/config/index.ts +0 -43
  386. package/renderer/lib/docs/config/loader.ts +0 -142
  387. package/renderer/lib/docs/config/schema.ts +0 -308
  388. package/renderer/lib/docs/index.ts +0 -12
  389. package/renderer/lib/docs/mdx/compiler.ts +0 -176
  390. package/renderer/lib/docs/mdx/frontmatter.ts +0 -91
  391. package/renderer/lib/docs/mdx/index.ts +0 -26
  392. package/renderer/lib/docs/navigation/generator.ts +0 -348
  393. package/renderer/lib/docs/navigation/index.ts +0 -12
  394. package/renderer/lib/docs/navigation/types.ts +0 -123
  395. package/renderer/lib/docs-navigation-context.tsx +0 -80
  396. package/renderer/lib/multi-tenant/context.ts +0 -105
  397. package/renderer/lib/storage/blob.ts +0 -1083
  398. package/renderer/lib/utils/icons.ts +0 -48
  399. package/renderer/lib/utils.ts +0 -6
  400. package/renderer/next.config.ts +0 -76
@@ -0,0 +1,375 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import React, { useState, useMemo } from 'react';
4
+ import Link from 'next/link';
5
+ import { usePathname } from 'next/navigation';
6
+ import { cn } from '@/lib/utils';
7
+ import { MagnifyingGlass, CaretRight, CaretDown, ArrowSquareOut, X } from '@phosphor-icons/react';
8
+ import { Input } from '@/components/ui/input';
9
+ import { Button } from '@/components/ui/button';
10
+ import * as PhosphorIcons from '@phosphor-icons/react';
11
+ /**
12
+ * Docs Sidebar Navigation Component
13
+ *
14
+ * Matches the API docs sidebar styling for visual consistency
15
+ */ // Dynamic icon resolver
16
+ function getIcon(iconName) {
17
+ if (!iconName) return null;
18
+ const pascalCase = iconName.split(/[-_]/).map((word)=>word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join('');
19
+ const Icon = PhosphorIcons[pascalCase];
20
+ return Icon || null;
21
+ }
22
+ // Helper to check if item is a NavItem (has href)
23
+ function isNavItem(item) {
24
+ return 'href' in item && typeof item.href === 'string';
25
+ }
26
+ // Recursively check if any item matches the path
27
+ function hasMatchingItem(items, path) {
28
+ for (const item of items){
29
+ if (isNavItem(item)) {
30
+ if (item.href === path || path.startsWith(item.href + '/')) {
31
+ return true;
32
+ }
33
+ }
34
+ if ('items' in item && Array.isArray(item.items)) {
35
+ if (hasMatchingItem(item.items, path)) {
36
+ return true;
37
+ }
38
+ }
39
+ }
40
+ return false;
41
+ }
42
+ // Filter navigation based on search query
43
+ function filterNavigation(navigation, query) {
44
+ if (!query.trim()) return navigation;
45
+ const lowerQuery = query.toLowerCase();
46
+ const filterItems = (items)=>{
47
+ return items.reduce((acc, item)=>{
48
+ if (isNavItem(item)) {
49
+ if (item.title.toLowerCase().includes(lowerQuery)) {
50
+ acc.push(item);
51
+ }
52
+ } else {
53
+ // It's a NavGroup
54
+ const filteredNestedItems = filterItems(item.items);
55
+ if (filteredNestedItems.length > 0 || item.title.toLowerCase().includes(lowerQuery)) {
56
+ acc.push({
57
+ ...item,
58
+ items: filteredNestedItems.length > 0 ? filteredNestedItems : item.items
59
+ });
60
+ }
61
+ }
62
+ return acc;
63
+ }, []);
64
+ };
65
+ const filterGroups = (groups)=>{
66
+ return groups.reduce((acc, group)=>{
67
+ const filteredItems = filterItems(group.items);
68
+ if (filteredItems.length > 0 || group.title.toLowerCase().includes(lowerQuery)) {
69
+ acc.push({
70
+ ...group,
71
+ items: filteredItems.length > 0 ? filteredItems : group.items
72
+ });
73
+ }
74
+ return acc;
75
+ }, []);
76
+ };
77
+ return {
78
+ tabs: navigation.tabs?.map((tab)=>({
79
+ ...tab,
80
+ groups: filterGroups(tab.groups)
81
+ })).filter((tab)=>tab.groups.length > 0),
82
+ groups: navigation.groups ? filterGroups(navigation.groups) : undefined,
83
+ anchors: navigation.anchors
84
+ };
85
+ }
86
+ export function DocsSidebar({ navigation, siteName = 'Documentation', className, isMobile = false, isOpen = true, onClose }) {
87
+ const pathname = usePathname();
88
+ const [searchQuery, setSearchQuery] = useState('');
89
+ const [activeTab, setActiveTab] = useState(navigation.tabs?.[0]?.slug || '');
90
+ // Filter navigation based on search
91
+ const filteredNav = useMemo(()=>filterNavigation(navigation, searchQuery), [
92
+ navigation,
93
+ searchQuery
94
+ ]);
95
+ // Find active tab from current path
96
+ React.useEffect(()=>{
97
+ if (navigation.tabs) {
98
+ for (const tab of navigation.tabs){
99
+ for (const group of tab.groups){
100
+ if (hasMatchingItem(group.items, pathname)) {
101
+ setActiveTab(tab.slug);
102
+ return;
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }, [
108
+ pathname,
109
+ navigation.tabs
110
+ ]);
111
+ const currentTabData = filteredNav.tabs?.find((t)=>t.slug === activeTab);
112
+ const groups = currentTabData?.groups || filteredNav.groups || [];
113
+ return /*#__PURE__*/ _jsxs(_Fragment, {
114
+ children: [
115
+ isMobile && isOpen && /*#__PURE__*/ _jsx("div", {
116
+ className: "fixed inset-0 bg-black/50 z-[55] lg:hidden",
117
+ onClick: onClose
118
+ }),
119
+ /*#__PURE__*/ _jsxs("aside", {
120
+ className: cn("flex flex-col border-r bg-sidebar border-sidebar-border overflow-hidden", // Desktop: always visible, fixed width
121
+ "lg:relative lg:w-72 lg:h-full lg:z-auto", // Mobile: drawer behavior - z-[60] to appear above header (z-50)
122
+ "fixed inset-y-0 left-0 z-[60] w-[280px] h-full", "transform transition-transform duration-300 ease-in-out", "lg:transform-none lg:translate-x-0", isMobile && !isOpen && "-translate-x-full", isMobile && isOpen && "translate-x-0", className),
123
+ children: [
124
+ /*#__PURE__*/ _jsxs("div", {
125
+ className: "px-4 h-[41px] flex items-center justify-between border-b border-sidebar-border shrink-0",
126
+ children: [
127
+ /*#__PURE__*/ _jsx("h2", {
128
+ className: "text-sm font-semibold text-sidebar-foreground truncate",
129
+ children: siteName
130
+ }),
131
+ isMobile && /*#__PURE__*/ _jsx(Button, {
132
+ variant: "ghost",
133
+ size: "icon",
134
+ onClick: onClose,
135
+ className: "h-7 w-7 lg:hidden",
136
+ children: /*#__PURE__*/ _jsx(X, {
137
+ className: "h-4 w-4",
138
+ weight: "bold"
139
+ })
140
+ })
141
+ ]
142
+ }),
143
+ /*#__PURE__*/ _jsx("div", {
144
+ className: "px-3 py-2 border-b border-sidebar-border shrink-0",
145
+ children: /*#__PURE__*/ _jsxs("div", {
146
+ className: "relative",
147
+ children: [
148
+ /*#__PURE__*/ _jsx(MagnifyingGlass, {
149
+ className: "absolute left-2.5 top-1/2 transform -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground/60"
150
+ }),
151
+ /*#__PURE__*/ _jsx(Input, {
152
+ type: "text",
153
+ placeholder: "Search...",
154
+ value: searchQuery,
155
+ onChange: (e)=>setSearchQuery(e.target.value),
156
+ className: "w-full pl-8 h-8 text-sm bg-muted/40 border-0 focus-visible:ring-1 focus-visible:ring-border placeholder:text-muted-foreground/50"
157
+ }),
158
+ searchQuery && /*#__PURE__*/ _jsx("button", {
159
+ onClick: ()=>setSearchQuery(''),
160
+ className: "absolute right-2 top-1/2 transform -translate-y-1/2 text-muted-foreground/60 hover:text-muted-foreground",
161
+ children: /*#__PURE__*/ _jsx("span", {
162
+ className: "text-xs",
163
+ children: "✕"
164
+ })
165
+ })
166
+ ]
167
+ })
168
+ }),
169
+ filteredNav.tabs && filteredNav.tabs.length > 1 && /*#__PURE__*/ _jsx("div", {
170
+ className: "flex border-b border-sidebar-border px-2 py-1 gap-1 shrink-0",
171
+ children: filteredNav.tabs.map((tab)=>/*#__PURE__*/ _jsx("button", {
172
+ onClick: ()=>setActiveTab(tab.slug),
173
+ className: cn('px-3 py-1.5 text-xs font-medium rounded-md transition-colors', activeTab === tab.slug ? 'bg-sidebar-primary text-sidebar-primary-foreground' : 'text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent/50'),
174
+ children: tab.title
175
+ }, tab.slug))
176
+ }),
177
+ /*#__PURE__*/ _jsx("div", {
178
+ className: "flex-1 overflow-y-auto overflow-x-hidden",
179
+ children: groups.map((group, index)=>/*#__PURE__*/ _jsx(DocsSidebarSection, {
180
+ title: group.title,
181
+ className: index > 0 ? 'border-t border-sidebar-border' : '',
182
+ children: group.items.map((item, itemIndex)=>{
183
+ // Handle nested NavGroup
184
+ if (!isNavItem(item)) {
185
+ return /*#__PURE__*/ _jsx(DocsSidebarNestedGroup, {
186
+ group: item,
187
+ pathname: pathname,
188
+ onItemSelect: ()=>isMobile && onClose?.()
189
+ }, `group-${item.title}-${itemIndex}`);
190
+ }
191
+ return /*#__PURE__*/ _jsx(DocsSidebarItem, {
192
+ item: item,
193
+ selected: item.href === pathname,
194
+ onSelect: ()=>isMobile && onClose?.()
195
+ }, `${item.href}-${itemIndex}`);
196
+ })
197
+ }, `${group.title}-${index}`))
198
+ }),
199
+ filteredNav.anchors && filteredNav.anchors.length > 0 && /*#__PURE__*/ _jsx("div", {
200
+ className: "border-t border-sidebar-border px-2 py-2 shrink-0",
201
+ children: filteredNav.anchors.map((anchor, index)=>/*#__PURE__*/ _jsx(DocsSidebarItem, {
202
+ item: anchor,
203
+ selected: false
204
+ }, `anchor-${index}`))
205
+ })
206
+ ]
207
+ })
208
+ ]
209
+ });
210
+ }
211
+ function DocsSidebarSection({ title, children, className }) {
212
+ return /*#__PURE__*/ _jsxs("div", {
213
+ className: cn('flex flex-col', className),
214
+ children: [
215
+ /*#__PURE__*/ _jsx("div", {
216
+ className: "px-4 py-2.5",
217
+ children: /*#__PURE__*/ _jsx("span", {
218
+ className: "text-[11px] font-semibold text-sidebar-foreground/60 uppercase tracking-wider",
219
+ children: title
220
+ })
221
+ }),
222
+ /*#__PURE__*/ _jsx("ul", {
223
+ className: "flex flex-col gap-px px-2 pb-2",
224
+ children: children
225
+ })
226
+ ]
227
+ });
228
+ }
229
+ function DocsSidebarNestedGroup({ group, pathname, onItemSelect }) {
230
+ const hasActiveChild = hasMatchingItem(group.items, pathname);
231
+ const [isOpen, setIsOpen] = React.useState(hasActiveChild);
232
+ return /*#__PURE__*/ _jsxs("li", {
233
+ className: "mb-1",
234
+ children: [
235
+ /*#__PURE__*/ _jsxs("button", {
236
+ type: "button",
237
+ onClick: ()=>setIsOpen(!isOpen),
238
+ className: cn("flex items-center justify-between w-full py-1.5 px-2 text-sm rounded-md transition-colors", hasActiveChild ? "text-sidebar-foreground font-medium" : "text-sidebar-foreground/70 hover:text-sidebar-foreground hover:bg-sidebar-accent/50"),
239
+ children: [
240
+ /*#__PURE__*/ _jsxs("span", {
241
+ className: "flex items-center gap-2",
242
+ children: [
243
+ group.icon && (()=>{
244
+ const Icon = getIcon(group.icon);
245
+ return Icon ? /*#__PURE__*/ _jsx(Icon, {
246
+ className: "w-4 h-4"
247
+ }) : null;
248
+ })(),
249
+ group.title
250
+ ]
251
+ }),
252
+ /*#__PURE__*/ _jsx(CaretRight, {
253
+ className: cn("w-4 h-4 transition-transform", isOpen && "rotate-90")
254
+ })
255
+ ]
256
+ }),
257
+ isOpen && /*#__PURE__*/ _jsx("ul", {
258
+ className: "ml-4 pl-2 border-l border-sidebar-border space-y-0.5 mt-1",
259
+ children: group.items.map((item, idx)=>{
260
+ if (!isNavItem(item)) {
261
+ return /*#__PURE__*/ _jsx(DocsSidebarNestedGroup, {
262
+ group: item,
263
+ pathname: pathname,
264
+ onItemSelect: onItemSelect
265
+ }, `nested-group-${item.title}-${idx}`);
266
+ }
267
+ return /*#__PURE__*/ _jsx(DocsSidebarItem, {
268
+ item: item,
269
+ selected: item.href === pathname,
270
+ onSelect: onItemSelect
271
+ }, `${item.href}-${idx}`);
272
+ })
273
+ })
274
+ ]
275
+ });
276
+ }
277
+ function DocsSidebarItem({ item, selected, indent = 0, onSelect }) {
278
+ const Icon = item.icon ? getIcon(item.icon) : null;
279
+ const content = /*#__PURE__*/ _jsxs(_Fragment, {
280
+ children: [
281
+ Icon && /*#__PURE__*/ _jsx(Icon, {
282
+ className: cn('h-4 w-4 shrink-0 mr-2', selected ? 'text-sidebar-primary-foreground' : 'text-sidebar-foreground/60'),
283
+ weight: selected ? 'fill' : 'regular'
284
+ }),
285
+ /*#__PURE__*/ _jsx("span", {
286
+ className: "flex-1 truncate",
287
+ children: item.title
288
+ }),
289
+ item.external && /*#__PURE__*/ _jsx(ArrowSquareOut, {
290
+ className: "h-3 w-3 shrink-0 ml-1 text-sidebar-foreground/40"
291
+ }),
292
+ item.badge && /*#__PURE__*/ _jsx("span", {
293
+ className: "ml-2 px-1.5 py-0.5 text-[10px] font-medium rounded bg-sidebar-primary/10 text-sidebar-primary",
294
+ children: item.badge
295
+ }),
296
+ item.deprecated && /*#__PURE__*/ _jsx("span", {
297
+ className: "ml-2 px-1.5 py-0.5 text-[10px] font-medium rounded bg-amber-500/10 text-amber-600 dark:text-amber-400",
298
+ children: "deprecated"
299
+ })
300
+ ]
301
+ });
302
+ const className = cn('group/button flex items-center rounded-sm px-3 py-1.5 w-full text-left', 'text-sm leading-5 transition-colors duration-150', selected ? 'bg-sidebar-primary text-sidebar-primary-foreground font-medium' : 'text-sidebar-foreground hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground');
303
+ const style = indent > 0 ? {
304
+ paddingLeft: `${indent * 12 + 12}px`
305
+ } : undefined;
306
+ if (item.external) {
307
+ return /*#__PURE__*/ _jsx("li", {
308
+ className: "flex flex-col",
309
+ children: /*#__PURE__*/ _jsx("a", {
310
+ href: item.href,
311
+ target: "_blank",
312
+ rel: "noopener noreferrer",
313
+ className: className,
314
+ style: style,
315
+ children: content
316
+ })
317
+ });
318
+ }
319
+ return /*#__PURE__*/ _jsx("li", {
320
+ className: "flex flex-col",
321
+ children: /*#__PURE__*/ _jsx(Link, {
322
+ href: item.href,
323
+ className: className,
324
+ style: style,
325
+ onClick: onSelect,
326
+ children: content
327
+ })
328
+ });
329
+ }
330
+ export function DocsSidebarGroup({ title, items, icon, defaultOpen = false, currentPath, onItemSelect }) {
331
+ const hasActiveItem = items.some((item)=>item.href === currentPath);
332
+ const [isOpen, setIsOpen] = useState(defaultOpen || hasActiveItem);
333
+ const Icon = icon ? getIcon(icon) : null;
334
+ return /*#__PURE__*/ _jsxs("li", {
335
+ className: "flex flex-col gap-px",
336
+ children: [
337
+ /*#__PURE__*/ _jsxs("button", {
338
+ type: "button",
339
+ "aria-expanded": isOpen,
340
+ onClick: ()=>setIsOpen(!isOpen),
341
+ className: cn('group/button flex items-center rounded-sm px-3 py-1.5 w-full text-left', 'text-sm leading-5 transition-colors duration-150', 'text-sidebar-foreground hover:bg-sidebar-accent/50 hover:text-sidebar-accent-foreground'),
342
+ children: [
343
+ /*#__PURE__*/ _jsx("span", {
344
+ className: "mr-1.5 text-sidebar-foreground/60 group-hover/button:text-sidebar-foreground",
345
+ children: isOpen ? /*#__PURE__*/ _jsx(CaretDown, {
346
+ weight: "bold",
347
+ className: "h-3.5 w-3.5"
348
+ }) : /*#__PURE__*/ _jsx(CaretRight, {
349
+ weight: "bold",
350
+ className: "h-3.5 w-3.5"
351
+ })
352
+ }),
353
+ Icon && /*#__PURE__*/ _jsx(Icon, {
354
+ className: "h-4 w-4 mr-2 text-sidebar-foreground/60",
355
+ weight: "regular"
356
+ }),
357
+ /*#__PURE__*/ _jsx("span", {
358
+ className: "flex-1 truncate",
359
+ children: title
360
+ })
361
+ ]
362
+ }),
363
+ isOpen && /*#__PURE__*/ _jsx("ul", {
364
+ className: "flex flex-col gap-px",
365
+ children: items.map((item, index)=>/*#__PURE__*/ _jsx(DocsSidebarItem, {
366
+ item: item,
367
+ selected: item.href === currentPath,
368
+ indent: 1,
369
+ onSelect: onItemSelect
370
+ }, `${item.href}-${index}`))
371
+ })
372
+ ]
373
+ });
374
+ }
375
+ export { DocsSidebarSection, DocsSidebarItem };
@@ -0,0 +1,89 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { useEffect, useState } from 'react';
4
+ import { cn } from '@/lib/utils';
5
+ export function TableOfContents({ headings, className }) {
6
+ const [activeId, setActiveId] = useState('');
7
+ // Track which heading is currently in view
8
+ useEffect(()=>{
9
+ if (headings.length === 0) return;
10
+ const observer = new IntersectionObserver((entries)=>{
11
+ entries.forEach((entry)=>{
12
+ if (entry.isIntersecting) {
13
+ setActiveId(entry.target.id);
14
+ }
15
+ });
16
+ }, {
17
+ rootMargin: '-80px 0px -80% 0px',
18
+ threshold: 0
19
+ });
20
+ // Observe all headings
21
+ headings.forEach((heading)=>{
22
+ const element = document.getElementById(heading.id);
23
+ if (element) {
24
+ observer.observe(element);
25
+ }
26
+ });
27
+ return ()=>observer.disconnect();
28
+ }, [
29
+ headings
30
+ ]);
31
+ if (headings.length === 0) return null;
32
+ // Filter to only show h2 and h3
33
+ const filteredHeadings = headings.filter((h)=>h.level >= 2 && h.level <= 3);
34
+ if (filteredHeadings.length === 0) return null;
35
+ return /*#__PURE__*/ _jsxs("nav", {
36
+ className: cn('text-sm', className),
37
+ children: [
38
+ /*#__PURE__*/ _jsx("h4", {
39
+ className: "font-semibold text-foreground mb-3",
40
+ children: "On this page"
41
+ }),
42
+ /*#__PURE__*/ _jsx("ul", {
43
+ className: "space-y-2",
44
+ children: filteredHeadings.map((heading)=>/*#__PURE__*/ _jsx("li", {
45
+ style: {
46
+ paddingLeft: `${(heading.level - 2) * 12}px`
47
+ },
48
+ children: /*#__PURE__*/ _jsx("a", {
49
+ href: `#${heading.id}`,
50
+ onClick: (e)=>{
51
+ e.preventDefault();
52
+ const element = document.getElementById(heading.id);
53
+ if (element) {
54
+ element.scrollIntoView({
55
+ behavior: 'smooth'
56
+ });
57
+ // Update URL without scroll
58
+ window.history.pushState(null, '', `#${heading.id}`);
59
+ setActiveId(heading.id);
60
+ }
61
+ },
62
+ className: cn('block py-1 transition-colors hover:text-foreground', activeId === heading.id ? 'text-primary font-medium' : 'text-muted-foreground'),
63
+ children: heading.title
64
+ })
65
+ }, heading.id))
66
+ })
67
+ ]
68
+ });
69
+ }
70
+ /**
71
+ * Extract headings from rendered content
72
+ * Call this on the client after MDX renders
73
+ */ export function extractHeadingsFromDOM() {
74
+ const headings = [];
75
+ const elements = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
76
+ elements.forEach((el)=>{
77
+ const id = el.id;
78
+ const title = el.textContent || '';
79
+ const level = parseInt(el.tagName[1], 10);
80
+ if (id && title) {
81
+ headings.push({
82
+ id,
83
+ title,
84
+ level
85
+ });
86
+ }
87
+ });
88
+ return headings;
89
+ }
@@ -0,0 +1,77 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { useState, useEffect } from 'react';
4
+ import { X } from '@phosphor-icons/react';
5
+ import { cn } from '@/lib/utils';
6
+ import ReactMarkdown from 'react-markdown';
7
+ const STORAGE_PREFIX = 'docs-notice-dismissed-';
8
+ export function Notice({ config, storageKey = 'default', className }) {
9
+ // For non-dismissible notices, show immediately
10
+ // For dismissible notices, start hidden until we check storage
11
+ const [isDismissed, setIsDismissed] = useState(config.dismissible ? true : false);
12
+ const [isLoaded, setIsLoaded] = useState(!config.dismissible);
13
+ const fullStorageKey = `${STORAGE_PREFIX}${storageKey}`;
14
+ useEffect(()=>{
15
+ if (!config.dismissible) return;
16
+ // Check if notice was previously dismissed
17
+ const dismissed = sessionStorage.getItem(fullStorageKey);
18
+ setIsDismissed(dismissed === 'true');
19
+ setIsLoaded(true);
20
+ }, [
21
+ fullStorageKey,
22
+ config.dismissible
23
+ ]);
24
+ const handleDismiss = ()=>{
25
+ sessionStorage.setItem(fullStorageKey, 'true');
26
+ setIsDismissed(true);
27
+ };
28
+ // Don't render until we've checked storage (for dismissible notices)
29
+ if (!isLoaded) return null;
30
+ // Don't render if dismissed
31
+ if (isDismissed && config.dismissible) return null;
32
+ // Don't render if no content
33
+ if (!config.content) return null;
34
+ // Default to a neutral dark color that works with any theme
35
+ const defaultBackground = '#1e293b' // slate-800
36
+ ;
37
+ const backgroundStyle = {
38
+ backgroundColor: config.background || defaultBackground
39
+ };
40
+ return /*#__PURE__*/ _jsx("div", {
41
+ className: cn('docs-notice sticky top-0 z-[100] w-full text-white', 'px-4 py-2.5 text-sm text-center', 'shadow-[0_4px_6px_-1px_rgba(0,0,0,0.3)]', className),
42
+ style: backgroundStyle,
43
+ children: /*#__PURE__*/ _jsxs("div", {
44
+ className: "docs-notice-content max-w-screen-xl mx-auto flex items-center justify-center gap-2",
45
+ children: [
46
+ /*#__PURE__*/ _jsx("div", {
47
+ className: "docs-notice-text flex-1 [&_a]:underline [&_a]:font-medium [&_a]:hover:opacity-80 [&_p]:m-0 [&_p]:inline",
48
+ children: /*#__PURE__*/ _jsx(ReactMarkdown, {
49
+ components: {
50
+ // Render links properly
51
+ a: ({ href, children })=>/*#__PURE__*/ _jsx("a", {
52
+ href: href,
53
+ className: "underline font-medium hover:opacity-80",
54
+ children: children
55
+ }),
56
+ // Render paragraphs inline
57
+ p: ({ children })=>/*#__PURE__*/ _jsx("span", {
58
+ children: children
59
+ })
60
+ },
61
+ children: config.content
62
+ })
63
+ }),
64
+ config.dismissible && /*#__PURE__*/ _jsx("button", {
65
+ type: "button",
66
+ onClick: handleDismiss,
67
+ className: cn('docs-notice-dismiss flex-shrink-0 p-1 rounded-sm', 'hover:bg-white/20 transition-colors', 'focus:outline-none focus-visible:ring-2 focus-visible:ring-white/50'),
68
+ "aria-label": "Dismiss notice",
69
+ children: /*#__PURE__*/ _jsx(X, {
70
+ className: "h-4 w-4",
71
+ weight: "bold"
72
+ })
73
+ })
74
+ ]
75
+ })
76
+ });
77
+ }