@hanzo/docs-base-ui 16.5.0 → 16.5.3

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 (308) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -3
  3. package/css/aspen.css +39 -0
  4. package/css/black.css +39 -1
  5. package/css/catppuccin.css +49 -1
  6. package/css/dusk.css +47 -1
  7. package/css/emerald.css +39 -0
  8. package/css/generated/docs.css +455 -0
  9. package/css/generated/flux.css +419 -0
  10. package/css/generated/home.css +201 -0
  11. package/css/generated/notebook.css +492 -0
  12. package/css/generated/shared.css +1033 -0
  13. package/css/lib/base.css +217 -0
  14. package/css/lib/default-colors.css +51 -0
  15. package/css/lib/shiki.css +90 -0
  16. package/css/neutral.css +7 -1
  17. package/css/ocean.css +44 -1
  18. package/css/preset.css +6 -7
  19. package/css/purple.css +39 -1
  20. package/css/ruby.css +39 -0
  21. package/css/shadcn.css +36 -1
  22. package/css/solar.css +75 -1
  23. package/css/vitepress.css +65 -1
  24. package/dist/_virtual/_rolldown/runtime.js +18 -0
  25. package/dist/components/accordion.d.ts +1 -1
  26. package/dist/components/accordion.d.ts.map +1 -1
  27. package/dist/components/accordion.js +6 -6
  28. package/dist/components/accordion.js.map +1 -1
  29. package/dist/components/banner.d.ts +2 -2
  30. package/dist/components/banner.d.ts.map +1 -1
  31. package/dist/components/banner.js +4 -4
  32. package/dist/components/banner.js.map +1 -1
  33. package/dist/components/callout.d.ts +5 -5
  34. package/dist/components/callout.d.ts.map +1 -1
  35. package/dist/components/callout.js +1 -1
  36. package/dist/components/callout.js.map +1 -1
  37. package/dist/components/card.d.ts +3 -3
  38. package/dist/components/card.d.ts.map +1 -1
  39. package/dist/components/card.js +2 -2
  40. package/dist/components/card.js.map +1 -1
  41. package/dist/components/codeblock.d.ts +7 -7
  42. package/dist/components/codeblock.d.ts.map +1 -1
  43. package/dist/components/codeblock.js +7 -7
  44. package/dist/components/codeblock.js.map +1 -1
  45. package/dist/components/dialog/search-algolia.d.ts +6 -6
  46. package/dist/components/dialog/search-algolia.d.ts.map +1 -1
  47. package/dist/components/dialog/search-algolia.js +7 -7
  48. package/dist/components/dialog/search-algolia.js.map +1 -1
  49. package/dist/components/dialog/search-default.d.ts +6 -6
  50. package/dist/components/dialog/search-default.d.ts.map +1 -1
  51. package/dist/components/dialog/search-default.js +7 -7
  52. package/dist/components/dialog/search-default.js.map +1 -1
  53. package/dist/components/dialog/search-orama.d.ts +6 -6
  54. package/dist/components/dialog/search-orama.d.ts.map +1 -1
  55. package/dist/components/dialog/search-orama.js +7 -7
  56. package/dist/components/dialog/search-orama.js.map +1 -1
  57. package/dist/components/dialog/search.d.ts +16 -16
  58. package/dist/components/dialog/search.d.ts.map +1 -1
  59. package/dist/components/dialog/search.js +14 -14
  60. package/dist/components/dialog/search.js.map +1 -1
  61. package/dist/components/dynamic-codeblock.core.d.ts +33 -0
  62. package/dist/components/dynamic-codeblock.core.d.ts.map +1 -0
  63. package/dist/components/dynamic-codeblock.core.js +66 -0
  64. package/dist/components/dynamic-codeblock.core.js.map +1 -0
  65. package/dist/components/dynamic-codeblock.d.ts +4 -28
  66. package/dist/components/dynamic-codeblock.d.ts.map +1 -1
  67. package/dist/components/dynamic-codeblock.js +9 -53
  68. package/dist/components/dynamic-codeblock.js.map +1 -1
  69. package/dist/components/files.d.ts.map +1 -1
  70. package/dist/components/files.js +2 -2
  71. package/dist/components/files.js.map +1 -1
  72. package/dist/components/github-info.d.ts +2 -2
  73. package/dist/components/github-info.d.ts.map +1 -1
  74. package/dist/components/github-info.js +1 -1
  75. package/dist/components/github-info.js.map +1 -1
  76. package/dist/components/heading.d.ts.map +1 -1
  77. package/dist/components/heading.js +1 -1
  78. package/dist/components/heading.js.map +1 -1
  79. package/dist/components/{image-zoom-CtfZieBH.css → image-zoom-DGvp66QF.css} +1 -1
  80. package/dist/components/{image-zoom-CtfZieBH.css.map → image-zoom-DGvp66QF.css.map} +1 -1
  81. package/dist/components/image-zoom.d.ts +3 -3
  82. package/dist/components/image-zoom.d.ts.map +1 -1
  83. package/dist/components/inline-toc.d.ts +2 -2
  84. package/dist/components/inline-toc.d.ts.map +1 -1
  85. package/dist/components/inline-toc.js +1 -1
  86. package/dist/components/inline-toc.js.map +1 -1
  87. package/dist/components/sidebar/base.d.ts +24 -22
  88. package/dist/components/sidebar/base.d.ts.map +1 -1
  89. package/dist/components/sidebar/base.js +11 -7
  90. package/dist/components/sidebar/base.js.map +1 -1
  91. package/dist/components/sidebar/link-item.d.ts +2 -2
  92. package/dist/components/sidebar/link-item.d.ts.map +1 -1
  93. package/dist/components/sidebar/link-item.js.map +1 -1
  94. package/dist/components/sidebar/page-tree.d.ts +2 -2
  95. package/dist/components/sidebar/page-tree.d.ts.map +1 -1
  96. package/dist/components/sidebar/page-tree.js +5 -5
  97. package/dist/components/sidebar/page-tree.js.map +1 -1
  98. package/dist/components/sidebar/tabs/dropdown.d.ts +2 -2
  99. package/dist/components/sidebar/tabs/dropdown.d.ts.map +1 -1
  100. package/dist/components/sidebar/tabs/dropdown.js +19 -19
  101. package/dist/components/sidebar/tabs/dropdown.js.map +1 -1
  102. package/dist/components/sidebar/tabs/index.d.ts.map +1 -1
  103. package/dist/components/sidebar/tabs/index.js.map +1 -1
  104. package/dist/components/steps.d.ts +3 -3
  105. package/dist/components/steps.d.ts.map +1 -1
  106. package/dist/components/tabs.d.ts +7 -7
  107. package/dist/components/tabs.d.ts.map +1 -1
  108. package/dist/components/tabs.js +2 -2
  109. package/dist/components/tabs.js.map +1 -1
  110. package/dist/components/toc/clerk.d.ts +12 -1
  111. package/dist/components/toc/clerk.d.ts.map +1 -0
  112. package/dist/components/toc/clerk.js +106 -6
  113. package/dist/components/toc/clerk.js.map +1 -1
  114. package/dist/components/toc/default.d.ts +12 -1
  115. package/dist/components/toc/default.d.ts.map +1 -0
  116. package/dist/components/toc/default.js +34 -6
  117. package/dist/components/toc/default.js.map +1 -1
  118. package/dist/components/toc/index.d.ts +26 -1
  119. package/dist/components/toc/index.d.ts.map +1 -0
  120. package/dist/components/toc/index.js +76 -6
  121. package/dist/components/toc/index.js.map +1 -1
  122. package/dist/components/type-table.d.ts +2 -2
  123. package/dist/components/type-table.d.ts.map +1 -1
  124. package/dist/components/type-table.js +7 -7
  125. package/dist/components/type-table.js.map +1 -1
  126. package/dist/components/ui/accordion.d.ts +6 -6
  127. package/dist/components/ui/accordion.d.ts.map +1 -1
  128. package/dist/components/ui/accordion.js +1 -1
  129. package/dist/components/ui/accordion.js.map +1 -1
  130. package/dist/components/ui/button.d.ts +1 -1
  131. package/dist/components/ui/button.d.ts.map +1 -1
  132. package/dist/components/ui/collapsible.d.ts +5 -5
  133. package/dist/components/ui/collapsible.d.ts.map +1 -1
  134. package/dist/components/ui/collapsible.js +1 -1
  135. package/dist/components/ui/collapsible.js.map +1 -1
  136. package/dist/components/ui/navigation-menu.d.ts +7 -7
  137. package/dist/components/ui/navigation-menu.d.ts.map +1 -1
  138. package/dist/components/ui/navigation-menu.js +2 -2
  139. package/dist/components/ui/navigation-menu.js.map +1 -1
  140. package/dist/components/ui/popover.d.ts +3 -3
  141. package/dist/components/ui/popover.d.ts.map +1 -1
  142. package/dist/components/ui/popover.js +2 -2
  143. package/dist/components/ui/popover.js.map +1 -1
  144. package/dist/components/ui/scroll-area.d.ts +4 -4
  145. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  146. package/dist/components/ui/scroll-area.js +2 -2
  147. package/dist/components/ui/scroll-area.js.map +1 -1
  148. package/dist/components/ui/tabs.d.ts +7 -7
  149. package/dist/components/ui/tabs.d.ts.map +1 -1
  150. package/dist/components/ui/tabs.js +4 -4
  151. package/dist/components/ui/tabs.js.map +1 -1
  152. package/dist/contexts/i18n.d.ts +60 -1
  153. package/dist/contexts/i18n.d.ts.map +1 -0
  154. package/dist/contexts/i18n.js +54 -6
  155. package/dist/contexts/i18n.js.map +1 -1
  156. package/dist/contexts/search.d.ts +70 -4
  157. package/dist/contexts/search.d.ts.map +1 -1
  158. package/dist/contexts/search.js +62 -6
  159. package/dist/contexts/search.js.map +1 -1
  160. package/dist/contexts/tree.d.ts +22 -1
  161. package/dist/contexts/tree.d.ts.map +1 -0
  162. package/dist/contexts/tree.js +36 -6
  163. package/dist/contexts/tree.js.map +1 -1
  164. package/dist/i18n.d.ts +14 -1
  165. package/dist/i18n.d.ts.map +1 -0
  166. package/dist/i18n.js +19 -2
  167. package/dist/i18n.js.map +1 -0
  168. package/dist/layouts/docs/client.d.ts +7 -7
  169. package/dist/layouts/docs/client.d.ts.map +1 -1
  170. package/dist/layouts/docs/client.js +4 -4
  171. package/dist/layouts/docs/client.js.map +1 -1
  172. package/dist/layouts/docs/index.d.ts +3 -3
  173. package/dist/layouts/docs/index.d.ts.map +1 -1
  174. package/dist/layouts/docs/index.js +13 -13
  175. package/dist/layouts/docs/index.js.map +1 -1
  176. package/dist/layouts/docs/page/client.d.ts +9 -7
  177. package/dist/layouts/docs/page/client.d.ts.map +1 -1
  178. package/dist/layouts/docs/page/client.js +24 -24
  179. package/dist/layouts/docs/page/client.js.map +1 -1
  180. package/dist/layouts/docs/page/index.d.ts +19 -8
  181. package/dist/layouts/docs/page/index.d.ts.map +1 -1
  182. package/dist/layouts/docs/page/index.js +16 -16
  183. package/dist/layouts/docs/page/index.js.map +1 -1
  184. package/dist/layouts/docs/sidebar.d.ts +20 -19
  185. package/dist/layouts/docs/sidebar.d.ts.map +1 -1
  186. package/dist/layouts/docs/sidebar.js +6 -6
  187. package/dist/layouts/docs/sidebar.js.map +1 -1
  188. package/dist/layouts/flux/index.d.ts +79 -0
  189. package/dist/layouts/flux/index.d.ts.map +1 -0
  190. package/dist/layouts/flux/index.js +168 -0
  191. package/dist/layouts/flux/index.js.map +1 -0
  192. package/dist/layouts/flux/page/client.d.ts +45 -0
  193. package/dist/layouts/flux/page/client.d.ts.map +1 -0
  194. package/dist/layouts/flux/page/client.js +255 -0
  195. package/dist/layouts/flux/page/client.js.map +1 -0
  196. package/dist/layouts/flux/page/index.d.ts +98 -0
  197. package/dist/layouts/flux/page/index.d.ts.map +1 -0
  198. package/dist/layouts/flux/page/index.js +76 -0
  199. package/dist/layouts/flux/page/index.js.map +1 -0
  200. package/dist/layouts/flux/sidebar.d.ts +59 -0
  201. package/dist/layouts/flux/sidebar.d.ts.map +1 -0
  202. package/dist/layouts/flux/sidebar.js +197 -0
  203. package/dist/layouts/flux/sidebar.js.map +1 -0
  204. package/dist/layouts/flux/tab-dropdown.d.ts +21 -0
  205. package/dist/layouts/flux/tab-dropdown.d.ts.map +1 -0
  206. package/dist/layouts/flux/tab-dropdown.js +96 -0
  207. package/dist/layouts/flux/tab-dropdown.js.map +1 -0
  208. package/dist/layouts/home/client.d.ts +3 -3
  209. package/dist/layouts/home/client.d.ts.map +1 -1
  210. package/dist/layouts/home/client.js +18 -36
  211. package/dist/layouts/home/client.js.map +1 -1
  212. package/dist/layouts/home/index.d.ts +2 -2
  213. package/dist/layouts/home/index.d.ts.map +1 -1
  214. package/dist/layouts/home/index.js +1 -1
  215. package/dist/layouts/home/index.js.map +1 -1
  216. package/dist/layouts/home/navbar.d.ts +7 -7
  217. package/dist/layouts/home/navbar.d.ts.map +1 -1
  218. package/dist/layouts/home/navbar.js +2 -2
  219. package/dist/layouts/home/navbar.js.map +1 -1
  220. package/dist/layouts/notebook/client.d.ts +9 -9
  221. package/dist/layouts/notebook/client.d.ts.map +1 -1
  222. package/dist/layouts/notebook/client.js +8 -8
  223. package/dist/layouts/notebook/client.js.map +1 -1
  224. package/dist/layouts/notebook/index.d.ts +2 -2
  225. package/dist/layouts/notebook/index.d.ts.map +1 -1
  226. package/dist/layouts/notebook/index.js +45 -46
  227. package/dist/layouts/notebook/index.js.map +1 -1
  228. package/dist/layouts/notebook/page/client.d.ts +9 -7
  229. package/dist/layouts/notebook/page/client.d.ts.map +1 -1
  230. package/dist/layouts/notebook/page/client.js +24 -24
  231. package/dist/layouts/notebook/page/client.js.map +1 -1
  232. package/dist/layouts/notebook/page/index.d.ts +19 -8
  233. package/dist/layouts/notebook/page/index.d.ts.map +1 -1
  234. package/dist/layouts/notebook/page/index.js +16 -16
  235. package/dist/layouts/notebook/page/index.js.map +1 -1
  236. package/dist/layouts/notebook/sidebar.d.ts +15 -14
  237. package/dist/layouts/notebook/sidebar.d.ts.map +1 -1
  238. package/dist/layouts/notebook/sidebar.js +4 -4
  239. package/dist/layouts/notebook/sidebar.js.map +1 -1
  240. package/dist/layouts/shared/index.d.ts +13 -6
  241. package/dist/layouts/shared/index.d.ts.map +1 -1
  242. package/dist/layouts/shared/index.js +29 -2
  243. package/dist/layouts/shared/index.js.map +1 -1
  244. package/dist/layouts/shared/language-toggle.d.ts +2 -2
  245. package/dist/layouts/shared/language-toggle.d.ts.map +1 -1
  246. package/dist/layouts/shared/language-toggle.js +4 -4
  247. package/dist/layouts/shared/language-toggle.js.map +1 -1
  248. package/dist/layouts/shared/search-toggle.d.ts +3 -3
  249. package/dist/layouts/shared/search-toggle.d.ts.map +1 -1
  250. package/dist/layouts/shared/search-toggle.js +6 -6
  251. package/dist/layouts/shared/search-toggle.js.map +1 -1
  252. package/dist/layouts/shared/theme-toggle.d.ts +2 -2
  253. package/dist/layouts/shared/theme-toggle.d.ts.map +1 -1
  254. package/dist/layouts/shared/theme-toggle.js +7 -7
  255. package/dist/layouts/shared/theme-toggle.js.map +1 -1
  256. package/dist/mdx.d.ts +10 -10
  257. package/dist/mdx.d.ts.map +1 -1
  258. package/dist/mdx.js +2 -2
  259. package/dist/mdx.js.map +1 -1
  260. package/dist/mdx.server.d.ts +0 -1
  261. package/dist/mdx.server.d.ts.map +1 -1
  262. package/dist/og.d.ts +23 -1
  263. package/dist/og.d.ts.map +1 -0
  264. package/dist/og.js +69 -2
  265. package/dist/og.js.map +1 -0
  266. package/dist/page.d.ts +3 -3
  267. package/dist/page.d.ts.map +1 -1
  268. package/dist/page.js +5 -5
  269. package/dist/page.js.map +1 -1
  270. package/dist/provider/base.d.ts +4 -4
  271. package/dist/provider/base.d.ts.map +1 -1
  272. package/dist/provider/base.js +3 -3
  273. package/dist/provider/base.js.map +1 -1
  274. package/dist/provider/next.d.ts +3 -3
  275. package/dist/provider/next.d.ts.map +1 -1
  276. package/dist/provider/react-router.d.ts +3 -3
  277. package/dist/provider/react-router.d.ts.map +1 -1
  278. package/dist/provider/tanstack.d.ts +3 -3
  279. package/dist/provider/tanstack.d.ts.map +1 -1
  280. package/dist/provider/waku.d.ts +3 -3
  281. package/dist/provider/waku.d.ts.map +1 -1
  282. package/dist/style.css +194 -59
  283. package/dist/utils/cn.js +3 -0
  284. package/dist/utils/link-item.d.ts +86 -0
  285. package/dist/utils/link-item.d.ts.map +1 -0
  286. package/dist/utils/link-item.js +25 -0
  287. package/dist/utils/link-item.js.map +1 -0
  288. package/dist/utils/merge-refs.js +13 -0
  289. package/dist/utils/merge-refs.js.map +1 -0
  290. package/dist/utils/urls.js +17 -0
  291. package/dist/utils/urls.js.map +1 -0
  292. package/dist/utils/use-copy-button.d.ts +7 -1
  293. package/dist/utils/use-copy-button.d.ts.map +1 -0
  294. package/dist/utils/use-copy-button.js +29 -2
  295. package/dist/utils/use-copy-button.js.map +1 -0
  296. package/dist/utils/use-footer-items.d.ts +10 -1
  297. package/dist/utils/use-footer-items.d.ts.map +1 -0
  298. package/dist/utils/use-footer-items.js +27 -2
  299. package/dist/utils/use-footer-items.js.map +1 -0
  300. package/dist/utils/use-is-scroll-top.d.ts +9 -1
  301. package/dist/utils/use-is-scroll-top.d.ts.map +1 -0
  302. package/dist/utils/use-is-scroll-top.js +23 -2
  303. package/dist/utils/use-is-scroll-top.js.map +1 -0
  304. package/package.json +41 -25
  305. package/css/layouts/docs.css +0 -1
  306. package/css/layouts/home.css +0 -1
  307. package/css/layouts/notebook.css +0 -1
  308. package/dist/_virtual/rolldown_runtime.js +0 -36
@@ -1,64 +1,20 @@
1
1
  'use client';
2
2
 
3
- import { CodeBlock, Pre } from "./codeblock.js";
4
- import { cn } from "@hanzo/docs-ui/cn";
3
+ import { DynamicCodeBlock as DynamicCodeBlock$1 } from "./dynamic-codeblock.core.js";
5
4
  import { jsx } from "react/jsx-runtime";
6
- import { Suspense, createContext, use, useDeferredValue, useId } from "react";
7
- import { useShiki } from "@hanzo/docs-core/highlight/client";
5
+ import { useShikiConfigOptional } from "@hanzo/docs-core/highlight/core/client";
6
+ import { configDefault } from "@hanzo/docs-core/highlight";
8
7
 
9
8
  //#region src/components/dynamic-codeblock.tsx
10
- const PropsContext = createContext(void 0);
11
- function DefaultPre(props) {
12
- const extraProps = use(PropsContext);
13
- return /* @__PURE__ */ jsx(CodeBlock, {
9
+ function DynamicCodeBlock(props) {
10
+ const config = useShikiConfigOptional() ?? configDefault;
11
+ return /* @__PURE__ */ jsx(DynamicCodeBlock$1, {
14
12
  ...props,
15
- ...extraProps,
16
- className: cn("my-0", props.className, extraProps?.className),
17
- children: /* @__PURE__ */ jsx(Pre, { children: props.children })
18
- });
19
- }
20
- function DynamicCodeBlock({ lang, code, codeblock, options, wrapInSuspense = true }) {
21
- const id = useId();
22
- const shikiOptions = {
23
- lang,
24
- ...options,
25
- components: {
26
- pre: DefaultPre,
27
- ...options?.components
13
+ options: {
14
+ config,
15
+ ...props.options
28
16
  }
29
- };
30
- const children = /* @__PURE__ */ jsx(PropsContext, {
31
- value: codeblock,
32
- children: /* @__PURE__ */ jsx(Internal, {
33
- id,
34
- ...useDeferredValue({
35
- code,
36
- options: shikiOptions
37
- })
38
- })
39
- });
40
- if (wrapInSuspense) return /* @__PURE__ */ jsx(Suspense, {
41
- fallback: /* @__PURE__ */ jsx(Placeholder, {
42
- code,
43
- components: shikiOptions.components
44
- }),
45
- children
46
17
  });
47
- return children;
48
- }
49
- function Placeholder({ code, components = {} }) {
50
- const { pre: Pre$1 = "pre", code: Code = "code" } = components;
51
- return /* @__PURE__ */ jsx(Pre$1, { children: /* @__PURE__ */ jsx(Code, { children: code.split("\n").map((line, i) => /* @__PURE__ */ jsx("span", {
52
- className: "line",
53
- children: line
54
- }, i)) }) });
55
- }
56
- function Internal({ id, code, options }) {
57
- return useShiki(code, options, [
58
- id,
59
- options.lang,
60
- code
61
- ]);
62
18
  }
63
19
 
64
20
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-codeblock.js","names":["Pre"],"sources":["../../src/components/dynamic-codeblock.tsx"],"sourcesContent":["'use client';\nimport { CodeBlock, type CodeBlockProps, Pre } from '@/components/codeblock';\nimport type {\n HighlightOptions,\n HighlightOptionsCommon,\n HighlightOptionsThemes,\n} from '@hanzo/docs-core/highlight';\nimport { useShiki } from '@hanzo/docs-core/highlight/client';\nimport { cn } from '@hanzo/docs-ui/cn';\nimport {\n type ComponentProps,\n createContext,\n type FC,\n Suspense,\n use,\n useDeferredValue,\n useId,\n} from 'react';\n\nexport interface DynamicCodeblockProps {\n lang: string;\n code: string;\n /**\n * Extra props for the underlying `<CodeBlock />` component.\n *\n * Ignored if you defined your own `pre` component in `options.components`.\n */\n codeblock?: CodeBlockProps;\n /**\n * Wrap in React `<Suspense />` and provide a fallback.\n *\n * @defaultValue true\n */\n wrapInSuspense?: boolean;\n options?: Omit<HighlightOptionsCommon, 'lang'> & HighlightOptionsThemes;\n}\n\nconst PropsContext = createContext<CodeBlockProps | undefined>(undefined);\n\nfunction DefaultPre(props: ComponentProps<'pre'>) {\n const extraProps = use(PropsContext);\n\n return (\n <CodeBlock\n {...props}\n {...extraProps}\n className={cn('my-0', props.className, extraProps?.className)}\n >\n <Pre>{props.children}</Pre>\n </CodeBlock>\n );\n}\n\nexport function DynamicCodeBlock({\n lang,\n code,\n codeblock,\n options,\n wrapInSuspense = true,\n}: DynamicCodeblockProps) {\n const id = useId();\n const shikiOptions = {\n lang,\n ...options,\n components: {\n pre: DefaultPre,\n ...options?.components,\n },\n } satisfies HighlightOptions;\n\n const children = (\n <PropsContext value={codeblock}>\n <Internal id={id} {...useDeferredValue({ code, options: shikiOptions })} />\n </PropsContext>\n );\n\n if (wrapInSuspense)\n return (\n <Suspense fallback={<Placeholder code={code} components={shikiOptions.components} />}>\n {children}\n </Suspense>\n );\n\n return children;\n}\n\nfunction Placeholder({\n code,\n components = {},\n}: {\n code: string;\n components: HighlightOptions['components'];\n}) {\n const { pre: Pre = 'pre', code: Code = 'code' } = components as Record<string, FC>;\n\n return (\n <Pre>\n <Code>\n {code.split('\\n').map((line, i) => (\n <span key={i} className=\"line\">\n {line}\n </span>\n ))}\n </Code>\n </Pre>\n );\n}\n\nfunction Internal({ id, code, options }: { id: string; code: string; options: HighlightOptions }) {\n return useShiki(code, options, [id, options.lang, code]);\n}\n"],"mappings":";;;;;;;;;AAqCA,MAAM,eAAe,cAA0C,OAAU;AAEzE,SAAS,WAAW,OAA8B;CAChD,MAAM,aAAa,IAAI,aAAa;AAEpC,QACE,oBAAC;EACC,GAAI;EACJ,GAAI;EACJ,WAAW,GAAG,QAAQ,MAAM,WAAW,YAAY,UAAU;YAE7D,oBAAC,iBAAK,MAAM,WAAe;GACjB;;AAIhB,SAAgB,iBAAiB,EAC/B,MACA,MACA,WACA,SACA,iBAAiB,QACO;CACxB,MAAM,KAAK,OAAO;CAClB,MAAM,eAAe;EACnB;EACA,GAAG;EACH,YAAY;GACV,KAAK;GACL,GAAG,SAAS;GACb;EACF;CAED,MAAM,WACJ,oBAAC;EAAa,OAAO;YACnB,oBAAC;GAAa;GAAI,GAAI,iBAAiB;IAAE;IAAM,SAAS;IAAc,CAAC;IAAI;GAC9D;AAGjB,KAAI,eACF,QACE,oBAAC;EAAS,UAAU,oBAAC;GAAkB;GAAM,YAAY,aAAa;IAAc;EACjF;GACQ;AAGf,QAAO;;AAGT,SAAS,YAAY,EACnB,MACA,aAAa,EAAE,IAId;CACD,MAAM,EAAE,KAAKA,QAAM,OAAO,MAAM,OAAO,WAAW;AAElD,QACE,oBAACA,mBACC,oBAAC,kBACE,KAAK,MAAM,KAAK,CAAC,KAAK,MAAM,MAC3B,oBAAC;EAAa,WAAU;YACrB;IADQ,EAEJ,CACP,GACG,GACH;;AAIV,SAAS,SAAS,EAAE,IAAI,MAAM,WAAoE;AAChG,QAAO,SAAS,MAAM,SAAS;EAAC;EAAI,QAAQ;EAAM;EAAK,CAAC"}
1
+ {"version":3,"file":"dynamic-codeblock.js","names":["base.DynamicCodeBlock"],"sources":["../../src/components/dynamic-codeblock.tsx"],"sourcesContent":["'use client';\nimport { useShikiConfigOptional } from '@hanzo/docs-core/highlight/core/client';\nimport * as base from './dynamic-codeblock.core';\nimport { configDefault } from '@hanzo/docs-core/highlight';\n\nexport function DynamicCodeBlock(props: base.DynamicCodeblockProps) {\n const config = useShikiConfigOptional() ?? configDefault;\n return (\n <base.DynamicCodeBlock\n {...props}\n options={{\n config,\n ...props.options,\n }}\n />\n );\n}\n\nexport type { DynamicCodeblockProps } from './dynamic-codeblock.core';\n"],"mappings":";;;;;;;;AAKA,SAAgB,iBAAiB,OAAmC;CAClE,MAAM,SAAS,wBAAwB,IAAI;AAC3C,QACE,oBAACA;EACC,GAAI;EACJ,SAAS;GACP;GACA,GAAG,MAAM;GACV;GACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"files.d.ts","names":[],"sources":["../../src/components/files.tsx"],"sourcesContent":[],"mappings":";;;iBAYgB,KAAA;;;GAA+B,eAAe,kBAAkB,KAAA,CAAM;UAQrE,SAAA,SAAkB,eAAe;EARlC,IAAA,EAAA,MAAK;EAAG,IAAA,CAAA,EAUf,SAVe;;AAAuB,UAa9B,WAAA,SAAoB,cAbU,CAaK,cAbL,CAAA,CAAA;EAAiC,IAAM,EAAA,MAAA;EAAY,QAAA,CAAA,EAAA,OAAA;EAQjF;;;;;EAKA,WAAA,CAAA,EAAY,OAAA;AAa7B;AACE,iBADc,IAAA,CACd;EAAA,IAAA;EAAA,IAAA;EAAA,SAAA;EAAA,GAAA;AAAA,CAAA,EAIC,SAJD,CAAA,EAIa,KAAA,CAAM,YAJnB;AACA,iBAYc,MAAA,CAZd;EAAA,IAAA;EAAA,WAAA;EAAA,GAAA;AAAA,CAAA,EAY8D,WAZ9D,CAAA,EAY4E,KAAA,CAAM,YAZlF"}
1
+ {"version":3,"file":"files.d.ts","names":[],"sources":["../../src/components/files.tsx"],"mappings":";;;iBAYgB,KAAA,CAAA;EAAQ,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,CAAe,cAAA,IAAkB,KAAA,CAAM,YAAA;AAAA,UAQrE,SAAA,SAAkB,cAAA,CAAe,cAAA;EAChD,IAAA;EACA,IAAA,GAAO,SAAA;AAAA;AAAA,UAGQ,WAAA,SAAoB,cAAA,CAAe,cAAA;EAClD,IAAA;EAEA,QAAA;EAhB8E;;;;;EAuB9E,WAAA;AAAA;AAAA,iBAGc,IAAA,CAAA;EACd,IAAA;EACA,IAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,SAAA,GAAY,KAAA,CAAM,YAAA;AAAA,iBASL,MAAA,CAAA;EAAS,IAAA;EAAM,WAAA;EAAA,GAAwB;AAAA,GAAS,WAAA,GAAc,KAAA,CAAM,YAAA"}
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
 
3
+ import { cn } from "../utils/cn.js";
3
4
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./ui/collapsible.js";
4
- import { cn } from "@hanzo/docs-ui/cn";
5
+ import { useState } from "react";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
7
  import { File as File$1, Folder as Folder$1, FolderOpen } from "lucide-react";
7
- import { useState } from "react";
8
8
  import { cva } from "class-variance-authority";
9
9
 
10
10
  //#region src/components/files.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","names":["FileIcon","FolderIcon"],"sources":["../../src/components/files.tsx"],"sourcesContent":["'use client';\n\nimport { cva } from 'class-variance-authority';\nimport { File as FileIcon, Folder as FolderIcon, FolderOpen } from 'lucide-react';\nimport { type HTMLAttributes, type ReactNode, useState } from 'react';\nimport { cn } from '@hanzo/docs-ui/cn';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible';\n\nconst itemVariants = cva(\n 'flex flex-row items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-fd-accent hover:text-fd-accent-foreground [&_svg]:size-4',\n);\n\nexport function Files({ className, ...props }: HTMLAttributes<HTMLDivElement>): React.ReactElement {\n return (\n <div className={cn('not-prose rounded-md border bg-fd-card p-2', className)} {...props}>\n {props.children}\n </div>\n );\n}\n\nexport interface FileProps extends HTMLAttributes<HTMLDivElement> {\n name: string;\n icon?: ReactNode;\n}\n\nexport interface FolderProps extends HTMLAttributes<HTMLDivElement> {\n name: string;\n\n disabled?: boolean;\n\n /**\n * Open folder by default\n *\n * @defaultValue false\n */\n defaultOpen?: boolean;\n}\n\nexport function File({\n name,\n icon = <FileIcon />,\n className,\n ...rest\n}: FileProps): React.ReactElement {\n return (\n <div className={cn(itemVariants({ className }))} {...rest}>\n {icon}\n {name}\n </div>\n );\n}\n\nexport function Folder({ name, defaultOpen = false, ...props }: FolderProps): React.ReactElement {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <Collapsible open={open} onOpenChange={setOpen} {...props}>\n <CollapsibleTrigger className={cn(itemVariants({ className: 'w-full' }))}>\n {open ? <FolderOpen /> : <FolderIcon />}\n {name}\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"ms-2 flex flex-col border-l ps-2\">{props.children}</div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"mappings":";;;;;;;;;;AAQA,MAAM,eAAe,IACnB,oIACD;AAED,SAAgB,MAAM,EAAE,WAAW,GAAG,SAA6D;AACjG,QACE,oBAAC;EAAI,WAAW,GAAG,8CAA8C,UAAU;EAAE,GAAI;YAC9E,MAAM;GACH;;AAsBV,SAAgB,KAAK,EACnB,MACA,OAAO,oBAACA,WAAW,EACnB,WACA,GAAG,QAC6B;AAChC,QACE,qBAAC;EAAI,WAAW,GAAG,aAAa,EAAE,WAAW,CAAC,CAAC;EAAE,GAAI;aAClD,MACA;GACG;;AAIV,SAAgB,OAAO,EAAE,MAAM,cAAc,OAAO,GAAG,SAA0C;CAC/F,MAAM,CAAC,MAAM,WAAW,SAAS,YAAY;AAE7C,QACE,qBAAC;EAAkB;EAAM,cAAc;EAAS,GAAI;aAClD,qBAAC;GAAmB,WAAW,GAAG,aAAa,EAAE,WAAW,UAAU,CAAC,CAAC;cACrE,OAAO,oBAAC,eAAa,GAAG,oBAACC,aAAa,EACtC;IACkB,EACrB,oBAAC,gCACC,oBAAC;GAAI,WAAU;aAAoC,MAAM;IAAe,GACrD;GACT"}
1
+ {"version":3,"file":"files.js","names":["FileIcon","FolderIcon"],"sources":["../../src/components/files.tsx"],"sourcesContent":["'use client';\n\nimport { cva } from 'class-variance-authority';\nimport { File as FileIcon, Folder as FolderIcon, FolderOpen } from 'lucide-react';\nimport { type HTMLAttributes, type ReactNode, useState } from 'react';\nimport { cn } from '@/utils/cn';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible';\n\nconst itemVariants = cva(\n 'flex flex-row items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-fd-accent hover:text-fd-accent-foreground [&_svg]:size-4',\n);\n\nexport function Files({ className, ...props }: HTMLAttributes<HTMLDivElement>): React.ReactElement {\n return (\n <div className={cn('not-prose rounded-md border bg-fd-card p-2', className)} {...props}>\n {props.children}\n </div>\n );\n}\n\nexport interface FileProps extends HTMLAttributes<HTMLDivElement> {\n name: string;\n icon?: ReactNode;\n}\n\nexport interface FolderProps extends HTMLAttributes<HTMLDivElement> {\n name: string;\n\n disabled?: boolean;\n\n /**\n * Open folder by default\n *\n * @defaultValue false\n */\n defaultOpen?: boolean;\n}\n\nexport function File({\n name,\n icon = <FileIcon />,\n className,\n ...rest\n}: FileProps): React.ReactElement {\n return (\n <div className={cn(itemVariants({ className }))} {...rest}>\n {icon}\n {name}\n </div>\n );\n}\n\nexport function Folder({ name, defaultOpen = false, ...props }: FolderProps): React.ReactElement {\n const [open, setOpen] = useState(defaultOpen);\n\n return (\n <Collapsible open={open} onOpenChange={setOpen} {...props}>\n <CollapsibleTrigger className={cn(itemVariants({ className: 'w-full' }))}>\n {open ? <FolderOpen /> : <FolderIcon />}\n {name}\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"ms-2 flex flex-col border-l ps-2\">{props.children}</div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"mappings":";;;;;;;;;;AAQA,MAAM,eAAe,IACnB,oIACD;AAED,SAAgB,MAAM,EAAE,WAAW,GAAG,SAA6D;AACjG,QACE,oBAAC;EAAI,WAAW,GAAG,8CAA8C,UAAU;EAAE,GAAI;YAC9E,MAAM;GACH;;AAsBV,SAAgB,KAAK,EACnB,MACA,OAAO,oBAACA,WAAW,EACnB,WACA,GAAG,QAC6B;AAChC,QACE,qBAAC;EAAI,WAAW,GAAG,aAAa,EAAE,WAAW,CAAC,CAAC;EAAE,GAAI;aAClD,MACA;GACG;;AAIV,SAAgB,OAAO,EAAE,MAAM,cAAc,OAAO,GAAG,SAA0C;CAC/F,MAAM,CAAC,MAAM,WAAW,SAAS,YAAY;AAE7C,QACE,qBAAC;EAAkB;EAAM,cAAc;EAAS,GAAI;aAClD,qBAAC;GAAmB,WAAW,GAAG,aAAa,EAAE,WAAW,UAAU,CAAC,CAAC;cACrE,OAAO,oBAAC,eAAa,GAAG,oBAACC,aAAa,EACtC;IACkB,EACrB,oBAAC,gCACC,oBAAC;GAAI,WAAU;aAAoC,MAAM;IAAe,GACrD;GACT"}
@@ -1,5 +1,5 @@
1
- import * as react_jsx_runtime130 from "react/jsx-runtime";
2
1
  import { AnchorHTMLAttributes } from "react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/github-info.d.ts
5
5
  declare function GithubInfo({
@@ -13,7 +13,7 @@ declare function GithubInfo({
13
13
  repo: string;
14
14
  token?: string;
15
15
  baseUrl?: string;
16
- }): Promise<react_jsx_runtime130.JSX.Element>;
16
+ }): Promise<react_jsx_runtime0.JSX.Element>;
17
17
  //#endregion
18
18
  export { GithubInfo };
19
19
  //# sourceMappingURL=github-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-info.d.ts","names":[],"sources":["../../src/components/github-info.tsx"],"sourcesContent":[],"mappings":";;;;iBAwCsB,UAAA;;;;;;GAMnB,qBAAqB;;;EANF,KAAA,CAAA,EAAA,MAAU;EAC9B,OAAA,CAAA,EAAA,MAAA;CACA,CAAA,EASD,OATC,CASD,oBAAA,CAAA,GAAA,CAAA,OAAA,CATC"}
1
+ {"version":3,"file":"github-info.d.ts","names":[],"sources":["../../src/components/github-info.tsx"],"mappings":";;;;iBAwCsB,UAAA,CAAA;EACpB,IAAA;EACA,KAAA;EACA,KAAA;EACA,OAAA;EAAA,GACG;AAAA,GACF,oBAAA,CAAqB,iBAAA;EACtB,KAAA;EACA,IAAA;EACA,KAAA;EACA,OAAA;AAAA,IACD,OAAA,CAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,4 +1,4 @@
1
- import { cn } from "@hanzo/docs-ui/cn";
1
+ import { cn } from "../utils/cn.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Star } from "lucide-react";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"github-info.js","names":[],"sources":["../../src/components/github-info.tsx"],"sourcesContent":["import { cn } from '@hanzo/docs-ui/cn';\nimport { Star } from 'lucide-react';\nimport { type AnchorHTMLAttributes } from 'react';\n\nasync function getRepoStarsAndForks(\n owner: string,\n repo: string,\n token?: string,\n baseUrl: string = 'https://api.github.com',\n): Promise<{\n stars: number;\n forks: number;\n}> {\n const endpoint = `${baseUrl}/repos/${owner}/${repo}`;\n const headers = new Headers({\n 'Content-Type': 'application/json',\n });\n\n if (token) headers.set('Authorization', `Bearer ${token}`);\n\n const response = await fetch(endpoint, {\n headers,\n next: {\n revalidate: 60,\n },\n } as RequestInit);\n\n if (!response.ok) {\n const message = await response.text();\n\n throw new Error(`Failed to fetch repository data: ${message}`);\n }\n\n const data = await response.json();\n return {\n stars: data.stargazers_count,\n forks: data.forks_count,\n };\n}\n\nexport async function GithubInfo({\n repo,\n owner,\n token,\n baseUrl,\n ...props\n}: AnchorHTMLAttributes<HTMLAnchorElement> & {\n owner: string;\n repo: string;\n token?: string;\n baseUrl?: string;\n}) {\n const { stars } = await getRepoStarsAndForks(owner, repo, token, baseUrl);\n const humanizedStars = humanizeNumber(stars);\n\n return (\n <a\n href={`https://github.com/${owner}/${repo}`}\n rel=\"noreferrer noopener\"\n target=\"_blank\"\n {...props}\n className={cn(\n 'flex flex-col gap-1.5 p-2 rounded-lg text-sm text-fd-foreground/80 transition-colors lg:flex-row lg:items-center hover:text-fd-accent-foreground hover:bg-fd-accent',\n props.className,\n )}\n >\n <p className=\"flex items-center gap-2 truncate\">\n <svg fill=\"currentColor\" viewBox=\"0 0 24 24\" className=\"size-3.5\">\n <title>GitHub</title>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n {owner}/{repo}\n </p>\n <p className=\"flex text-xs items-center gap-1 text-fd-muted-foreground\">\n <Star className=\"size-3\" />\n {humanizedStars}\n </p>\n </a>\n );\n}\n\n/**\n * Converts a number to a human-readable string with K suffix for thousands\n * @example 1500 -> \"1.5K\", 1000000 -> \"1000000\"\n */\nfunction humanizeNumber(num: number): string {\n if (num < 1000) {\n return num.toString();\n }\n\n if (num < 100000) {\n // For numbers between 1,000 and 99,999, show with one decimal (e.g., 1.5K)\n const value = (num / 1000).toFixed(1);\n // Remove trailing .0 if present\n const formattedValue = value.endsWith('.0') ? value.slice(0, -2) : value;\n\n return `${formattedValue}K`;\n }\n\n if (num < 1000000) {\n // For numbers between 10,000 and 999,999, show as whole K (e.g., 10K, 999K)\n return `${Math.floor(num / 1000)}K`;\n }\n\n // For 1,000,000 and above, just return the number\n return num.toString();\n}\n"],"mappings":";;;;;AAIA,eAAe,qBACb,OACA,MACA,OACA,UAAkB,0BAIjB;CACD,MAAM,WAAW,GAAG,QAAQ,SAAS,MAAM,GAAG;CAC9C,MAAM,UAAU,IAAI,QAAQ,EAC1B,gBAAgB,oBACjB,CAAC;AAEF,KAAI,MAAO,SAAQ,IAAI,iBAAiB,UAAU,QAAQ;CAE1D,MAAM,WAAW,MAAM,MAAM,UAAU;EACrC;EACA,MAAM,EACJ,YAAY,IACb;EACF,CAAgB;AAEjB,KAAI,CAAC,SAAS,IAAI;EAChB,MAAM,UAAU,MAAM,SAAS,MAAM;AAErC,QAAM,IAAI,MAAM,oCAAoC,UAAU;;CAGhE,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,QAAO;EACL,OAAO,KAAK;EACZ,OAAO,KAAK;EACb;;AAGH,eAAsB,WAAW,EAC/B,MACA,OACA,OACA,SACA,GAAG,SAMF;CACD,MAAM,EAAE,UAAU,MAAM,qBAAqB,OAAO,MAAM,OAAO,QAAQ;CACzE,MAAM,iBAAiB,eAAe,MAAM;AAE5C,QACE,qBAAC;EACC,MAAM,sBAAsB,MAAM,GAAG;EACrC,KAAI;EACJ,QAAO;EACP,GAAI;EACJ,WAAW,GACT,uKACA,MAAM,UACP;aAED,qBAAC;GAAE,WAAU;;IACX,qBAAC;KAAI,MAAK;KAAe,SAAQ;KAAY,WAAU;gBACrD,oBAAC,qBAAM,WAAc,EACrB,oBAAC,UAAK,GAAE,6sBAA6sB;MACjtB;IACL;IAAM;IAAE;;IACP,EACJ,qBAAC;GAAE,WAAU;cACX,oBAAC,QAAK,WAAU,WAAW,EAC1B;IACC;GACF;;;;;;AAQR,SAAS,eAAe,KAAqB;AAC3C,KAAI,MAAM,IACR,QAAO,IAAI,UAAU;AAGvB,KAAI,MAAM,KAAQ;EAEhB,MAAM,SAAS,MAAM,KAAM,QAAQ,EAAE;AAIrC,SAAO,GAFgB,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,GAAG,GAAG,MAE1C;;AAG3B,KAAI,MAAM,IAER,QAAO,GAAG,KAAK,MAAM,MAAM,IAAK,CAAC;AAInC,QAAO,IAAI,UAAU"}
1
+ {"version":3,"file":"github-info.js","names":[],"sources":["../../src/components/github-info.tsx"],"sourcesContent":["import { cn } from '@/utils/cn';\nimport { Star } from 'lucide-react';\nimport { type AnchorHTMLAttributes } from 'react';\n\nasync function getRepoStarsAndForks(\n owner: string,\n repo: string,\n token?: string,\n baseUrl: string = 'https://api.github.com',\n): Promise<{\n stars: number;\n forks: number;\n}> {\n const endpoint = `${baseUrl}/repos/${owner}/${repo}`;\n const headers = new Headers({\n 'Content-Type': 'application/json',\n });\n\n if (token) headers.set('Authorization', `Bearer ${token}`);\n\n const response = await fetch(endpoint, {\n headers,\n next: {\n revalidate: 60,\n },\n } as RequestInit);\n\n if (!response.ok) {\n const message = await response.text();\n\n throw new Error(`Failed to fetch repository data: ${message}`);\n }\n\n const data = await response.json();\n return {\n stars: data.stargazers_count,\n forks: data.forks_count,\n };\n}\n\nexport async function GithubInfo({\n repo,\n owner,\n token,\n baseUrl,\n ...props\n}: AnchorHTMLAttributes<HTMLAnchorElement> & {\n owner: string;\n repo: string;\n token?: string;\n baseUrl?: string;\n}) {\n const { stars } = await getRepoStarsAndForks(owner, repo, token, baseUrl);\n const humanizedStars = humanizeNumber(stars);\n\n return (\n <a\n href={`https://github.com/${owner}/${repo}`}\n rel=\"noreferrer noopener\"\n target=\"_blank\"\n {...props}\n className={cn(\n 'flex flex-col gap-1.5 p-2 rounded-lg text-sm text-fd-foreground/80 transition-colors lg:flex-row lg:items-center hover:text-fd-accent-foreground hover:bg-fd-accent',\n props.className,\n )}\n >\n <p className=\"flex items-center gap-2 truncate\">\n <svg fill=\"currentColor\" viewBox=\"0 0 24 24\" className=\"size-3.5\">\n <title>GitHub</title>\n <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n </svg>\n {owner}/{repo}\n </p>\n <p className=\"flex text-xs items-center gap-1 text-fd-muted-foreground\">\n <Star className=\"size-3\" />\n {humanizedStars}\n </p>\n </a>\n );\n}\n\n/**\n * Converts a number to a human-readable string with K suffix for thousands\n * @example 1500 -> \"1.5K\", 1000000 -> \"1000000\"\n */\nfunction humanizeNumber(num: number): string {\n if (num < 1000) {\n return num.toString();\n }\n\n if (num < 100000) {\n // For numbers between 1,000 and 99,999, show with one decimal (e.g., 1.5K)\n const value = (num / 1000).toFixed(1);\n // Remove trailing .0 if present\n const formattedValue = value.endsWith('.0') ? value.slice(0, -2) : value;\n\n return `${formattedValue}K`;\n }\n\n if (num < 1000000) {\n // For numbers between 10,000 and 999,999, show as whole K (e.g., 10K, 999K)\n return `${Math.floor(num / 1000)}K`;\n }\n\n // For 1,000,000 and above, just return the number\n return num.toString();\n}\n"],"mappings":";;;;;AAIA,eAAe,qBACb,OACA,MACA,OACA,UAAkB,0BAIjB;CACD,MAAM,WAAW,GAAG,QAAQ,SAAS,MAAM,GAAG;CAC9C,MAAM,UAAU,IAAI,QAAQ,EAC1B,gBAAgB,oBACjB,CAAC;AAEF,KAAI,MAAO,SAAQ,IAAI,iBAAiB,UAAU,QAAQ;CAE1D,MAAM,WAAW,MAAM,MAAM,UAAU;EACrC;EACA,MAAM,EACJ,YAAY,IACb;EACF,CAAgB;AAEjB,KAAI,CAAC,SAAS,IAAI;EAChB,MAAM,UAAU,MAAM,SAAS,MAAM;AAErC,QAAM,IAAI,MAAM,oCAAoC,UAAU;;CAGhE,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,QAAO;EACL,OAAO,KAAK;EACZ,OAAO,KAAK;EACb;;AAGH,eAAsB,WAAW,EAC/B,MACA,OACA,OACA,SACA,GAAG,SAMF;CACD,MAAM,EAAE,UAAU,MAAM,qBAAqB,OAAO,MAAM,OAAO,QAAQ;CACzE,MAAM,iBAAiB,eAAe,MAAM;AAE5C,QACE,qBAAC;EACC,MAAM,sBAAsB,MAAM,GAAG;EACrC,KAAI;EACJ,QAAO;EACP,GAAI;EACJ,WAAW,GACT,uKACA,MAAM,UACP;aAED,qBAAC;GAAE,WAAU;;IACX,qBAAC;KAAI,MAAK;KAAe,SAAQ;KAAY,WAAU;gBACrD,oBAAC,qBAAM,WAAc,EACrB,oBAAC,UAAK,GAAE,6sBAA6sB;MACjtB;IACL;IAAM;IAAE;;IACP,EACJ,qBAAC;GAAE,WAAU;cACX,oBAAC,QAAK,WAAU,WAAW,EAC1B;IACC;GACF;;;;;;AAQR,SAAS,eAAe,KAAqB;AAC3C,KAAI,MAAM,IACR,QAAO,IAAI,UAAU;AAGvB,KAAI,MAAM,KAAQ;EAEhB,MAAM,SAAS,MAAM,KAAM,QAAQ,EAAE;AAIrC,SAAO,GAFgB,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,GAAG,GAAG,MAE1C;;AAG3B,KAAI,MAAM,IAER,QAAO,GAAG,KAAK,MAAM,MAAM,IAAK,CAAC;AAInC,QAAO,IAAI,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"heading.d.ts","names":[],"sources":["../../src/components/heading.tsx"],"sourcesContent":[],"mappings":";;;KAIK,KAAA;KACA,uBAAuB,SAAS,KAAK,yBAAyB;EAD9D,EAAA,CAAA,EAEE,CAFF;AAAK,CAAA;AACkB,iBAIZ,OAJY,CAAA,UAIM,KAJN,GAAA,IAAA,CAAA,CAAA;EAAA,EAAA;EAAA,SAAA;EAAA,GAAA;AAAA,CAAA,EAQzB,YARyB,CAQZ,CARY,CAAA,CAAA,EAQP,KAAA,CAAM,YARC"}
1
+ {"version":3,"file":"heading.d.ts","names":[],"sources":["../../src/components/heading.tsx"],"mappings":";;;KAIK,KAAA;AAAA,KACA,YAAA,WAAuB,KAAA,IAAS,IAAA,CAAK,wBAAA,CAAyB,CAAA;EACjE,EAAA,GAAK,CAAA;AAAA;AAAA,iBAGS,OAAA,WAAkB,KAAA,QAAA,CAAA;EAChC,EAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,YAAA,CAAa,CAAA,IAAK,KAAA,CAAM,YAAA"}
@@ -1,4 +1,4 @@
1
- import { cn } from "@hanzo/docs-ui/cn";
1
+ import { cn } from "../utils/cn.js";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Link } from "lucide-react";
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"heading.js","names":[],"sources":["../../src/components/heading.tsx"],"sourcesContent":["import { Link } from 'lucide-react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@hanzo/docs-ui/cn';\n\ntype Types = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\ntype HeadingProps<T extends Types> = Omit<ComponentPropsWithoutRef<T>, 'as'> & {\n as?: T;\n};\n\nexport function Heading<T extends Types = 'h1'>({\n as,\n className,\n ...props\n}: HeadingProps<T>): React.ReactElement {\n const As = as ?? 'h1';\n\n if (!props.id) return <As className={className} {...props} />;\n\n return (\n <As className={cn('flex scroll-m-28 flex-row items-center gap-2', className)} {...props}>\n <a data-card=\"\" href={`#${props.id}`} className=\"peer\">\n {props.children}\n </a>\n <Link\n aria-hidden\n className=\"size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100\"\n />\n </As>\n );\n}\n"],"mappings":";;;;;AASA,SAAgB,QAAgC,EAC9C,IACA,WACA,GAAG,SACmC;CACtC,MAAM,KAAK,MAAM;AAEjB,KAAI,CAAC,MAAM,GAAI,QAAO,oBAAC;EAAc;EAAW,GAAI;GAAS;AAE7D,QACE,qBAAC;EAAG,WAAW,GAAG,gDAAgD,UAAU;EAAE,GAAI;aAChF,oBAAC;GAAE,aAAU;GAAG,MAAM,IAAI,MAAM;GAAM,WAAU;aAC7C,MAAM;IACL,EACJ,oBAAC;GACC;GACA,WAAU;IACV;GACC"}
1
+ {"version":3,"file":"heading.js","names":[],"sources":["../../src/components/heading.tsx"],"sourcesContent":["import { Link } from 'lucide-react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/utils/cn';\n\ntype Types = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\ntype HeadingProps<T extends Types> = Omit<ComponentPropsWithoutRef<T>, 'as'> & {\n as?: T;\n};\n\nexport function Heading<T extends Types = 'h1'>({\n as,\n className,\n ...props\n}: HeadingProps<T>): React.ReactElement {\n const As = as ?? 'h1';\n\n if (!props.id) return <As className={className} {...props} />;\n\n return (\n <As className={cn('flex scroll-m-28 flex-row items-center gap-2', className)} {...props}>\n <a data-card=\"\" href={`#${props.id}`} className=\"peer\">\n {props.children}\n </a>\n <Link\n aria-hidden\n className=\"size-3.5 shrink-0 text-fd-muted-foreground opacity-0 transition-opacity peer-hover:opacity-100\"\n />\n </As>\n );\n}\n"],"mappings":";;;;;AASA,SAAgB,QAAgC,EAC9C,IACA,WACA,GAAG,SACmC;CACtC,MAAM,KAAK,MAAM;AAEjB,KAAI,CAAC,MAAM,GAAI,QAAO,oBAAC;EAAc;EAAW,GAAI;GAAS;AAE7D,QACE,qBAAC;EAAG,WAAW,GAAG,gDAAgD,UAAU;EAAE,GAAI;aAChF,oBAAC;GAAE,aAAU;GAAG,MAAM,IAAI,MAAM;GAAM,WAAU;aAC7C,MAAM;IACL,EACJ,oBAAC;GACC;GACA,WAAU;IACV;GACC"}
@@ -77,4 +77,4 @@
77
77
  }
78
78
 
79
79
 
80
- /*# sourceMappingURL=image-zoom-CtfZieBH.css.map*/
80
+ /*# sourceMappingURL=image-zoom-DGvp66QF.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"image-zoom-CtfZieBH.css","names":[],"sources":["../../src/components/image-zoom.css"],"sourcesContent":["[data-rmiz] {\n display: block;\n position: relative;\n}\n\n[data-rmiz-ghost] {\n pointer-events: none;\n position: absolute;\n}\n\n[data-rmiz-btn-zoom],\n[data-rmiz-btn-unzoom] {\n display: none;\n}\n\n[data-rmiz-content='found'] img {\n cursor: zoom-in;\n}\n\n[data-rmiz-modal][open] {\n width: 100vw /* fallback */;\n width: 100dvw;\n\n height: 100vh /* fallback */;\n height: 100dvh;\n\n background-color: transparent;\n max-width: none;\n max-height: none;\n margin: 0;\n padding: 0;\n position: fixed;\n overflow: hidden;\n}\n\n[data-rmiz-modal]:focus-visible {\n outline: none;\n}\n\n[data-rmiz-modal-overlay] {\n transition: background-color 0.3s;\n position: absolute;\n inset: 0;\n}\n\n[data-rmiz-modal-overlay='visible'] {\n background-color: var(--color-fd-background);\n}\n\n[data-rmiz-modal-overlay='hidden'] {\n background-color: transparent;\n}\n\n[data-rmiz-modal-content] {\n width: 100%;\n height: 100%;\n position: relative;\n}\n\n[data-rmiz-modal]::backdrop {\n display: none;\n}\n\n[data-rmiz-modal-img] {\n cursor: zoom-out;\n image-rendering: high-quality;\n transform-origin: 0 0;\n transition: transform 0.3s;\n position: absolute;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-rmiz-modal-overlay],\n [data-rmiz-modal-img] {\n transition-duration: 0.01ms !important;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"image-zoom-DGvp66QF.css","names":[],"sources":["../../src/components/image-zoom.css"],"sourcesContent":["[data-rmiz] {\n display: block;\n position: relative;\n}\n\n[data-rmiz-ghost] {\n pointer-events: none;\n position: absolute;\n}\n\n[data-rmiz-btn-zoom],\n[data-rmiz-btn-unzoom] {\n display: none;\n}\n\n[data-rmiz-content='found'] img {\n cursor: zoom-in;\n}\n\n[data-rmiz-modal][open] {\n width: 100vw /* fallback */;\n width: 100dvw;\n\n height: 100vh /* fallback */;\n height: 100dvh;\n\n background-color: transparent;\n max-width: none;\n max-height: none;\n margin: 0;\n padding: 0;\n position: fixed;\n overflow: hidden;\n}\n\n[data-rmiz-modal]:focus-visible {\n outline: none;\n}\n\n[data-rmiz-modal-overlay] {\n transition: background-color 0.3s;\n position: absolute;\n inset: 0;\n}\n\n[data-rmiz-modal-overlay='visible'] {\n background-color: var(--color-fd-background);\n}\n\n[data-rmiz-modal-overlay='hidden'] {\n background-color: transparent;\n}\n\n[data-rmiz-modal-content] {\n width: 100%;\n height: 100%;\n position: relative;\n}\n\n[data-rmiz-modal]::backdrop {\n display: none;\n}\n\n[data-rmiz-modal-img] {\n cursor: zoom-out;\n image-rendering: high-quality;\n transform-origin: 0 0;\n transition: transform 0.3s;\n position: absolute;\n}\n\n@media (prefers-reduced-motion: reduce) {\n [data-rmiz-modal-overlay],\n [data-rmiz-modal-img] {\n transition-duration: 0.01ms !important;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA"}
@@ -1,6 +1,6 @@
1
- import { ImageProps } from "@hanzo/docs-core/framework";
2
- import * as react_jsx_runtime129 from "react/jsx-runtime";
3
1
  import { ComponentProps } from "react";
2
+ import { ImageProps } from "@hanzo/docs-core/framework";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
4
  import { UncontrolledProps } from "react-medium-image-zoom";
5
5
 
6
6
  //#region src/components/image-zoom.d.ts
@@ -19,7 +19,7 @@ declare function ImageZoom({
19
19
  children,
20
20
  rmiz,
21
21
  ...props
22
- }: ImageZoomProps): react_jsx_runtime129.JSX.Element;
22
+ }: ImageZoomProps): react_jsx_runtime0.JSX.Element;
23
23
  //#endregion
24
24
  export { ImageZoom, ImageZoomProps };
25
25
  //# sourceMappingURL=image-zoom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-zoom.d.ts","names":[],"sources":["../../src/components/image-zoom.tsx"],"sourcesContent":[],"mappings":";;;;;;KAOY,cAAA,GAAiB;;AAA7B;;EAIgB,WAAA,CAAA,EAAA,cAAA,CAAA,KAAA,CAAA;EAKP;;AAeT;EAA4B,IAAA,CAAA,EAfnB,iBAemB;CAAa;AAAU,iBAAnC,SAAA,CAAmC;EAAA,WAAA;EAAA,QAAA;EAAA,IAAA;EAAA,GAAA;AAAA,CAAA,EAAkB,cAAlB,CAAA,EAAgC,oBAAA,CAAA,GAAA,CAAA,OAAhC"}
1
+ {"version":3,"file":"image-zoom.d.ts","names":[],"sources":["../../src/components/image-zoom.tsx"],"mappings":";;;;;;KAOY,cAAA,GAAiB,UAAA;;AAA7B;;EAIE,WAAA,GAAc,cAAA;EAJa;;;EAS3B,IAAA,GAAO,iBAAA;AAAA;AAAA,iBAeO,SAAA,CAAA;EAAY,WAAA;EAAa,QAAA;EAAU,IAAA;EAAA,GAAS;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Collapsible } from "./ui/collapsible.js";
2
- import * as react_jsx_runtime82 from "react/jsx-runtime";
3
2
  import { ComponentProps } from "react";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
4
  import { TOCItemType } from "@hanzo/docs-core/toc";
5
5
 
6
6
  //#region src/components/inline-toc.d.ts
@@ -11,7 +11,7 @@ declare function InlineTOC({
11
11
  items,
12
12
  className,
13
13
  ...props
14
- }: InlineTocProps): react_jsx_runtime82.JSX.Element;
14
+ }: InlineTocProps): react_jsx_runtime0.JSX.Element;
15
15
  //#endregion
16
16
  export { InlineTOC, InlineTocProps };
17
17
  //# sourceMappingURL=inline-toc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"inline-toc.d.ts","names":[],"sources":["../../src/components/inline-toc.tsx"],"sourcesContent":[],"mappings":";;;;;;UAQiB,cAAA,SAAuB,sBAAsB;SACrD;;AADQ,iBAID,SAAA,CAJgB;EAAA,KAAA;EAAA,SAAA;EAAA,GAAA;AAAA,CAAA,EAI0B,cAJ1B,CAAA,EAIwC,mBAAA,CAAA,GAAA,CAAA,OAJxC"}
1
+ {"version":3,"file":"inline-toc.d.ts","names":[],"sources":["../../src/components/inline-toc.tsx"],"mappings":";;;;;;UAQiB,cAAA,SAAuB,cAAA,QAAsB,WAAA;EAC5D,KAAA,EAAO,WAAA;AAAA;AAAA,iBAGO,SAAA,CAAA;EAAY,KAAA;EAAO,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
+ import { cn } from "../utils/cn.js";
3
4
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./ui/collapsible.js";
4
- import { cn } from "@hanzo/docs-ui/cn";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { ChevronDown } from "lucide-react";
7
7
 
@@ -1 +1 @@
1
- {"version":3,"file":"inline-toc.js","names":[],"sources":["../../src/components/inline-toc.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport type { TOCItemType } from '@hanzo/docs-core/toc';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible';\nimport type { ComponentProps } from 'react';\nimport { cn } from '@hanzo/docs-ui/cn';\n\nexport interface InlineTocProps extends ComponentProps<typeof Collapsible> {\n items: TOCItemType[];\n}\n\nexport function InlineTOC({ items, className, ...props }: InlineTocProps) {\n return (\n <Collapsible\n {...props}\n className={(s) =>\n cn(\n 'not-prose rounded-lg border bg-fd-card text-fd-card-foreground',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <CollapsibleTrigger className=\"group inline-flex w-full items-center justify-between px-4 py-2.5 font-medium\">\n {props.children ?? 'Table of Contents'}\n <ChevronDown className=\"size-4 transition-transform duration-200 group-data-[open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"flex flex-col p-4 pt-0 text-sm text-fd-muted-foreground\">\n {items.map((item) => (\n <a\n key={item.url}\n href={item.url}\n className=\"border-s py-1.5 hover:text-fd-accent-foreground\"\n style={{\n paddingInlineStart: 12 * Math.max(item.depth - 1, 0),\n }}\n >\n {item.title}\n </a>\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,UAAU,EAAE,OAAO,WAAW,GAAG,SAAyB;AACxE,QACE,qBAAC;EACC,GAAI;EACJ,YAAY,MACV,GACE,kEACA,OAAO,cAAc,aAAa,UAAU,EAAE,GAAG,UAClD;aAGH,qBAAC;GAAmB,WAAU;cAC3B,MAAM,YAAY,qBACnB,oBAAC,eAAY,WAAU,0EAA0E;IAC9E,EACrB,oBAAC,gCACC,oBAAC;GAAI,WAAU;aACZ,MAAM,KAAK,SACV,oBAAC;IAEC,MAAM,KAAK;IACX,WAAU;IACV,OAAO,EACL,oBAAoB,KAAK,KAAK,IAAI,KAAK,QAAQ,GAAG,EAAE,EACrD;cAEA,KAAK;MAPD,KAAK,IAQR,CACJ;IACE,GACa;GACT"}
1
+ {"version":3,"file":"inline-toc.js","names":[],"sources":["../../src/components/inline-toc.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport type { TOCItemType } from '@hanzo/docs-core/toc';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from './ui/collapsible';\nimport type { ComponentProps } from 'react';\nimport { cn } from '@/utils/cn';\n\nexport interface InlineTocProps extends ComponentProps<typeof Collapsible> {\n items: TOCItemType[];\n}\n\nexport function InlineTOC({ items, className, ...props }: InlineTocProps) {\n return (\n <Collapsible\n {...props}\n className={(s) =>\n cn(\n 'not-prose rounded-lg border bg-fd-card text-fd-card-foreground',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <CollapsibleTrigger className=\"group inline-flex w-full items-center justify-between px-4 py-2.5 font-medium\">\n {props.children ?? 'Table of Contents'}\n <ChevronDown className=\"size-4 transition-transform duration-200 group-data-[open]:rotate-180\" />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"flex flex-col p-4 pt-0 text-sm text-fd-muted-foreground\">\n {items.map((item) => (\n <a\n key={item.url}\n href={item.url}\n className=\"border-s py-1.5 hover:text-fd-accent-foreground\"\n style={{\n paddingInlineStart: 12 * Math.max(item.depth - 1, 0),\n }}\n >\n {item.title}\n </a>\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n}\n"],"mappings":";;;;;;;;AAYA,SAAgB,UAAU,EAAE,OAAO,WAAW,GAAG,SAAyB;AACxE,QACE,qBAAC;EACC,GAAI;EACJ,YAAY,MACV,GACE,kEACA,OAAO,cAAc,aAAa,UAAU,EAAE,GAAG,UAClD;aAGH,qBAAC;GAAmB,WAAU;cAC3B,MAAM,YAAY,qBACnB,oBAAC,eAAY,WAAU,0EAA0E;IAC9E,EACrB,oBAAC,gCACC,oBAAC;GAAI,WAAU;aACZ,MAAM,KAAK,SACV,oBAAC;IAEC,MAAM,KAAK;IACX,WAAU;IACV,OAAO,EACL,oBAAoB,KAAK,KAAK,IAAI,KAAK,QAAQ,GAAG,EAAE,EACrD;cAEA,KAAK;MAPD,KAAK,IAQR,CACJ;IACE,GACa;GACT"}
@@ -1,13 +1,13 @@
1
1
  import { CollapsibleContentProps, CollapsibleTriggerProps } from "../ui/collapsible.js";
2
2
  import { ScrollAreaProps } from "../ui/scroll-area.js";
3
- import { LinkProps } from "@hanzo/docs-core/link";
4
- import * as react_jsx_runtime105 from "react/jsx-runtime";
5
- import * as react20 from "react";
3
+ import * as react from "react";
6
4
  import { ComponentProps, PointerEvent, ReactNode, RefObject } from "react";
5
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
6
+ import { LinkProps } from "@hanzo/docs-core/link";
7
7
 
8
8
  //#region src/components/sidebar/base.d.ts
9
9
  declare namespace base_d_exports {
10
- export { SidebarCollapseTrigger, SidebarContent, SidebarDrawerContent, SidebarDrawerOverlay, SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, SidebarProvider, SidebarProviderProps, SidebarSeparator, SidebarTrigger, SidebarViewport, useFolder, useFolderDepth, useSidebar };
10
+ export { SidebarCollapseTrigger, SidebarContent, SidebarDrawerContent, SidebarDrawerOverlay, SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, SidebarProvider, SidebarProviderProps, SidebarSeparator, SidebarTrigger, SidebarViewport, useAutoScroll, useFolder, useFolderDepth, useSidebar };
11
11
  }
12
12
  interface SidebarContext {
13
13
  open: boolean;
@@ -19,7 +19,7 @@ interface SidebarContext {
19
19
  */
20
20
  closeOnRedirect: RefObject<boolean>;
21
21
  defaultOpenLevel: number;
22
- prefetch: boolean;
22
+ prefetch?: boolean;
23
23
  mode: Mode;
24
24
  }
25
25
  interface SidebarProviderProps {
@@ -31,20 +31,18 @@ interface SidebarProviderProps {
31
31
  */
32
32
  defaultOpenLevel?: number;
33
33
  /**
34
- * Prefetch links
35
- *
36
- * @defaultValue true
34
+ * Prefetch links, default behaviour depends on your React.js framework.
37
35
  */
38
36
  prefetch?: boolean;
39
37
  children?: ReactNode;
40
38
  }
41
39
  type Mode = 'drawer' | 'full';
42
- declare const SidebarContext: react20.Context<SidebarContext | null>;
40
+ declare const SidebarContext: react.Context<SidebarContext | null>;
43
41
  declare function SidebarProvider({
44
42
  defaultOpenLevel,
45
43
  prefetch,
46
44
  children
47
- }: SidebarProviderProps): react_jsx_runtime105.JSX.Element;
45
+ }: SidebarProviderProps): react_jsx_runtime0.JSX.Element;
48
46
  declare function useSidebar(): SidebarContext;
49
47
  declare function useFolder(): {
50
48
  open: boolean;
@@ -64,24 +62,24 @@ declare function SidebarContent({
64
62
  onPointerLeave: (event: PointerEvent) => void;
65
63
  }) => ReactNode;
66
64
  }): ReactNode;
67
- declare function SidebarDrawerOverlay(props: ComponentProps<'div'>): react_jsx_runtime105.JSX.Element | undefined;
65
+ declare function SidebarDrawerOverlay(props: ComponentProps<'div'>): react_jsx_runtime0.JSX.Element | undefined;
68
66
  declare function SidebarDrawerContent({
69
67
  className,
70
68
  children,
71
69
  ...props
72
- }: ComponentProps<'aside'>): react_jsx_runtime105.JSX.Element | undefined;
70
+ }: ComponentProps<'aside'>): react_jsx_runtime0.JSX.Element | undefined;
73
71
  declare function SidebarViewport({
74
72
  className,
75
73
  ...props
76
- }: ScrollAreaProps): react_jsx_runtime105.JSX.Element;
77
- declare function SidebarSeparator(props: ComponentProps<'p'>): react_jsx_runtime105.JSX.Element;
74
+ }: ScrollAreaProps): react_jsx_runtime0.JSX.Element;
75
+ declare function SidebarSeparator(props: ComponentProps<'p'>): react_jsx_runtime0.JSX.Element;
78
76
  declare function SidebarItem({
79
77
  icon,
80
78
  children,
81
79
  ...props
82
80
  }: LinkProps & {
83
81
  icon?: ReactNode;
84
- }): react_jsx_runtime105.JSX.Element;
82
+ }): react_jsx_runtime0.JSX.Element;
85
83
  declare function SidebarFolder({
86
84
  defaultOpen: defaultOpenProp,
87
85
  collapsible,
@@ -92,21 +90,25 @@ declare function SidebarFolder({
92
90
  active?: boolean;
93
91
  defaultOpen?: boolean;
94
92
  collapsible?: boolean;
95
- }): react_jsx_runtime105.JSX.Element;
93
+ }): react_jsx_runtime0.JSX.Element;
96
94
  declare function SidebarFolderTrigger({
97
95
  children,
98
96
  ...props
99
- }: CollapsibleTriggerProps): react_jsx_runtime105.JSX.Element;
97
+ }: CollapsibleTriggerProps): react_jsx_runtime0.JSX.Element;
100
98
  declare function SidebarFolderLink({
101
99
  children,
102
100
  ...props
103
- }: LinkProps): react_jsx_runtime105.JSX.Element;
104
- declare function SidebarFolderContent(props: CollapsibleContentProps): react_jsx_runtime105.JSX.Element;
101
+ }: LinkProps): react_jsx_runtime0.JSX.Element;
102
+ declare function SidebarFolderContent(props: CollapsibleContentProps): react_jsx_runtime0.JSX.Element;
105
103
  declare function SidebarTrigger({
106
104
  children,
107
105
  ...props
108
- }: ComponentProps<'button'>): react_jsx_runtime105.JSX.Element;
109
- declare function SidebarCollapseTrigger(props: ComponentProps<'button'>): react_jsx_runtime105.JSX.Element;
106
+ }: ComponentProps<'button'>): react_jsx_runtime0.JSX.Element;
107
+ declare function SidebarCollapseTrigger(props: ComponentProps<'button'>): react_jsx_runtime0.JSX.Element;
108
+ /**
109
+ * scroll to the element if `active` is true
110
+ */
111
+ declare function useAutoScroll(active: boolean, ref: RefObject<HTMLElement | null>): void;
110
112
  //#endregion
111
- export { SidebarCollapseTrigger, SidebarContent, SidebarDrawerContent, SidebarDrawerOverlay, SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, SidebarProvider, SidebarProviderProps, SidebarSeparator, SidebarTrigger, SidebarViewport, base_d_exports, useFolder, useFolderDepth, useSidebar };
113
+ export { SidebarCollapseTrigger, SidebarContent, SidebarDrawerContent, SidebarDrawerOverlay, SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, SidebarProvider, SidebarProviderProps, SidebarSeparator, SidebarTrigger, SidebarViewport, base_d_exports, useAutoScroll, useFolder, useFolderDepth, useSidebar };
112
114
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","names":[],"sources":["../../../src/components/sidebar/base.tsx"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"base.d.ts","names":[],"sources":["../../../src/components/sidebar/base.tsx"],"mappings":";;;;;;;;;;;UA+BU,cAAA;EACR,IAAA;EACA,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA;EAC9B,SAAA;EACA,YAAA,EAAc,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA;;;;EAKnC,eAAA,EAAiB,SAAA;EACjB,gBAAA;EACA,QAAA;EACA,IAAA,EAAM,IAAA;AAAA;AAAA,UAGS,oBAAA;;;;;;;EAOf,gBAAA;;;;EAKA,QAAA;EAEA,QAAA,GAAW,SAAA;AAAA;AAAA,KAGR,IAAA;AAAA,cAEC,cAAA,EAAc,KAAA,CAAA,OAAA,CAAA,cAAA;AAAA,iBASJ,eAAA,CAAA;EACd,gBAAA;EACA,QAAA;EACA;AAAA,GACC,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAmCP,UAAA,CAAA,GAAc,cAAA;AAAA,iBAUd,SAAA,CAAA;;WAtDL,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA;;;;iBA0DhB,cAAA,CAAA;AAAA,iBAIA,cAAA,CAAA;EACd;AAAA;EAEA,QAAA,GAAW,KAAA;IACT,GAAA,EAAK,SAAA,CAAU,WAAA;IACf,SAAA;IACA,OAAA;IACA,cAAA,GAAiB,KAAA,EAAO,YAAA;IACxB,cAAA,GAAiB,KAAA,EAAO,YAAA;EAAA,MACpB,SAAA;AAAA,IACP,SAAA;AAAA,iBAyCe,oBAAA,CAAqB,KAAA,EAAO,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAkBjD,oBAAA,CAAA;EAAuB,SAAA;EAAW,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAqB/E,eAAA,CAAA;EAAkB,SAAA;EAAA,GAAc;AAAA,GAAS,eAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAuBxD,gBAAA,CAAiB,KAAA,EAAO,cAAA,QAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAgB3C,WAAA,CAAA;EACd,IAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,SAAA;EACD,IAAA,GAAO,SAAA;AAAA,IACR,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAgBe,aAAA,CAAA;EACd,WAAA,EAAa,eAAA;EACb,WAAA;EACA,MAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,cAAA;EACD,MAAA;EACA,WAAA;EACA,WAAA;AAAA,IACD,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAsBe,oBAAA,CAAA;EAAuB,QAAA;EAAA,GAAa;AAAA,GAAS,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAkBpE,iBAAA,CAAA;EAAoB,QAAA;EAAA,GAAa;AAAA,GAAS,SAAA,GAAS,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAqCnD,oBAAA,CAAqB,KAAA,EAAO,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAInD,cAAA,CAAA;EAAiB,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,aAAwB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAU/D,sBAAA,CAAuB,KAAA,EAAO,cAAA,aAAwB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;AAlUrE;iBAuVe,aAAA,CAAc,MAAA,WAAiB,GAAA,EAAK,SAAA,CAAU,WAAA"}
@@ -1,15 +1,15 @@
1
1
  'use client';
2
2
 
3
- import { __exportAll } from "../../_virtual/rolldown_runtime.js";
3
+ import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
4
+ import { cn } from "../../utils/cn.js";
5
+ import { isActive } from "../../utils/urls.js";
4
6
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../ui/collapsible.js";
5
7
  import { ScrollArea, ScrollViewport } from "../ui/scroll-area.js";
6
- import Link from "@hanzo/docs-core/link";
8
+ import { createContext, use, useEffect, useMemo, useRef, useState } from "react";
7
9
  import { usePathname } from "@hanzo/docs-core/framework";
8
- import { cn } from "@hanzo/docs-ui/cn";
9
10
  import { jsx, jsxs } from "react/jsx-runtime";
11
+ import Link from "@hanzo/docs-core/link";
10
12
  import { ChevronDown, ExternalLink } from "lucide-react";
11
- import { createContext, use, useEffect, useMemo, useRef, useState } from "react";
12
- import { isActive } from "@hanzo/docs-ui/urls";
13
13
  import { useOnChange } from "@hanzo/docs-core/utils/use-on-change";
14
14
  import { useMediaQuery } from "@hanzo/docs-core/utils/use-media-query";
15
15
  import scrollIntoView from "scroll-into-view-if-needed";
@@ -30,13 +30,14 @@ var base_exports = /* @__PURE__ */ __exportAll({
30
30
  SidebarSeparator: () => SidebarSeparator,
31
31
  SidebarTrigger: () => SidebarTrigger,
32
32
  SidebarViewport: () => SidebarViewport,
33
+ useAutoScroll: () => useAutoScroll,
33
34
  useFolder: () => useFolder,
34
35
  useFolderDepth: () => useFolderDepth,
35
36
  useSidebar: () => useSidebar
36
37
  });
37
38
  const SidebarContext = createContext(null);
38
39
  const FolderContext = createContext(null);
39
- function SidebarProvider({ defaultOpenLevel = 0, prefetch = true, children }) {
40
+ function SidebarProvider({ defaultOpenLevel = 0, prefetch, children }) {
40
41
  const closeOnRedirect = useRef(true);
41
42
  const [open, setOpen] = useState(false);
42
43
  const [collapsed, setCollapsed] = useState(false);
@@ -265,6 +266,9 @@ function SidebarCollapseTrigger(props) {
265
266
  children: props.children
266
267
  });
267
268
  }
269
+ /**
270
+ * scroll to the element if `active` is true
271
+ */
268
272
  function useAutoScroll(active, ref) {
269
273
  const { mode } = useSidebar();
270
274
  useEffect(() => {
@@ -280,5 +284,5 @@ function useAutoScroll(active, ref) {
280
284
  }
281
285
 
282
286
  //#endregion
283
- export { SidebarCollapseTrigger, SidebarContent, SidebarDrawerContent, SidebarDrawerOverlay, SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, SidebarProvider, SidebarSeparator, SidebarTrigger, SidebarViewport, base_exports, useFolder, useFolderDepth, useSidebar };
287
+ export { SidebarCollapseTrigger, SidebarContent, SidebarDrawerContent, SidebarDrawerOverlay, SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, SidebarProvider, SidebarSeparator, SidebarTrigger, SidebarViewport, base_exports, useAutoScroll, useFolder, useFolderDepth, useSidebar };
284
288
  //# sourceMappingURL=base.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","names":["mode: Mode"],"sources":["../../../src/components/sidebar/base.tsx"],"sourcesContent":["'use client';\nimport { ChevronDown, ExternalLink } from 'lucide-react';\nimport {\n type ComponentProps,\n createContext,\n type PointerEvent,\n type ReactNode,\n type RefObject,\n use,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Link, { type LinkProps } from '@hanzo/docs-core/link';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport { cn } from '@hanzo/docs-ui/cn';\nimport { ScrollArea, type ScrollAreaProps, ScrollViewport } from '@/components/ui/scroll-area';\nimport { isActive } from '@hanzo/docs-ui/urls';\nimport {\n Collapsible,\n CollapsibleContent,\n type CollapsibleContentProps,\n CollapsibleTrigger,\n type CollapsibleTriggerProps,\n} from '@/components/ui/collapsible';\nimport { useMediaQuery } from '@hanzo/docs-core/utils/use-media-query';\nimport scrollIntoView from 'scroll-into-view-if-needed';\nimport { usePathname } from '@hanzo/docs-core/framework';\nimport ReactDOM from 'react-dom';\n\ninterface SidebarContext {\n open: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n collapsed: boolean;\n setCollapsed: React.Dispatch<React.SetStateAction<boolean>>;\n\n /**\n * When set to false, don't close the sidebar when navigate to another page\n */\n closeOnRedirect: RefObject<boolean>;\n defaultOpenLevel: number;\n prefetch: boolean;\n mode: Mode;\n}\n\nexport interface SidebarProviderProps {\n /**\n * Open folders by default if their level is lower or equal to a specific level\n * (Starting from 1)\n *\n * @defaultValue 0\n */\n defaultOpenLevel?: number;\n\n /**\n * Prefetch links\n *\n * @defaultValue true\n */\n prefetch?: boolean;\n\n children?: ReactNode;\n}\n\ntype Mode = 'drawer' | 'full';\n\nconst SidebarContext = createContext<SidebarContext | null>(null);\n\nconst FolderContext = createContext<{\n open: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n depth: number;\n collapsible: boolean;\n} | null>(null);\n\nexport function SidebarProvider({\n defaultOpenLevel = 0,\n prefetch = true,\n children,\n}: SidebarProviderProps) {\n const closeOnRedirect = useRef(true);\n const [open, setOpen] = useState(false);\n const [collapsed, setCollapsed] = useState(false);\n const pathname = usePathname();\n const mode: Mode = useMediaQuery('(width < 768px)') ? 'drawer' : 'full';\n\n useOnChange(pathname, () => {\n if (closeOnRedirect.current) {\n setOpen(false);\n }\n closeOnRedirect.current = true;\n });\n\n return (\n <SidebarContext\n value={useMemo(\n () => ({\n open,\n setOpen,\n collapsed,\n setCollapsed,\n closeOnRedirect,\n defaultOpenLevel,\n prefetch,\n mode,\n }),\n [open, collapsed, defaultOpenLevel, prefetch, mode],\n )}\n >\n {children}\n </SidebarContext>\n );\n}\n\nexport function useSidebar(): SidebarContext {\n const ctx = use(SidebarContext);\n if (!ctx)\n throw new Error(\n 'Missing SidebarContext, make sure you have wrapped the component in <DocsLayout /> and the context is available.',\n );\n\n return ctx;\n}\n\nexport function useFolder() {\n return use(FolderContext);\n}\n\nexport function useFolderDepth() {\n return use(FolderContext)?.depth ?? 0;\n}\n\nexport function SidebarContent({\n children,\n}: {\n children: (state: {\n ref: RefObject<HTMLElement | null>;\n collapsed: boolean;\n hovered: boolean;\n onPointerEnter: (event: PointerEvent) => void;\n onPointerLeave: (event: PointerEvent) => void;\n }) => ReactNode;\n}) {\n const { collapsed, mode } = useSidebar();\n const [hover, setHover] = useState(false);\n const ref = useRef<HTMLElement>(null);\n const timerRef = useRef(0);\n\n useOnChange(collapsed, () => {\n if (collapsed) setHover(false);\n });\n\n if (mode !== 'full') return;\n\n function shouldIgnoreHover(e: PointerEvent): boolean {\n const element = ref.current;\n if (!element) return true;\n\n return !collapsed || e.pointerType === 'touch' || element.getAnimations().length > 0;\n }\n\n return children({\n ref,\n collapsed,\n hovered: hover,\n onPointerEnter(e) {\n if (shouldIgnoreHover(e)) return;\n window.clearTimeout(timerRef.current);\n setHover(true);\n },\n onPointerLeave(e) {\n if (shouldIgnoreHover(e)) return;\n window.clearTimeout(timerRef.current);\n\n timerRef.current = window.setTimeout(\n () => setHover(false),\n // if mouse is leaving the viewport, add a close delay\n Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100 ? 0 : 500,\n );\n },\n });\n}\n\nexport function SidebarDrawerOverlay(props: ComponentProps<'div'>) {\n const { open, setOpen, mode } = useSidebar();\n const [hidden, setHidden] = useState(!open);\n\n if (open && hidden) setHidden(false);\n if (mode !== 'drawer' || hidden) return;\n return (\n <div\n data-state={open ? 'open' : 'closed'}\n onClick={() => setOpen(false)}\n onAnimationEnd={() => {\n if (!open) ReactDOM.flushSync(() => setHidden(true));\n }}\n {...props}\n />\n );\n}\n\nexport function SidebarDrawerContent({ className, children, ...props }: ComponentProps<'aside'>) {\n const { open, mode } = useSidebar();\n const [hidden, setHidden] = useState(!open);\n\n if (open && hidden) setHidden(false);\n if (mode !== 'drawer') return;\n return (\n <aside\n id=\"nd-sidebar-mobile\"\n data-state={open ? 'open' : 'closed'}\n className={cn(hidden && 'invisible', className)}\n onAnimationEnd={() => {\n if (!open) ReactDOM.flushSync(() => setHidden(true));\n }}\n {...props}\n >\n {children}\n </aside>\n );\n}\n\nexport function SidebarViewport({ className, ...props }: ScrollAreaProps) {\n return (\n <ScrollArea\n className={(s) =>\n cn('min-h-0 flex-1', typeof className === 'function' ? className(s) : className)\n }\n {...props}\n >\n <ScrollViewport\n className=\"p-4 overscroll-contain\"\n style={\n {\n maskImage:\n 'linear-gradient(to bottom, transparent, white 12px, white calc(100% - 12px), transparent)',\n } as object\n }\n >\n {props.children}\n </ScrollViewport>\n </ScrollArea>\n );\n}\n\nexport function SidebarSeparator(props: ComponentProps<'p'>) {\n const depth = useFolderDepth();\n return (\n <p\n {...props}\n className={cn(\n 'inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0',\n depth === 0 && 'first:mt-0',\n props.className,\n )}\n >\n {props.children}\n </p>\n );\n}\n\nexport function SidebarItem({\n icon,\n children,\n ...props\n}: LinkProps & {\n icon?: ReactNode;\n}) {\n const pathname = usePathname();\n const ref = useRef<HTMLAnchorElement>(null);\n const { prefetch } = useSidebar();\n const active = props.href !== undefined && isActive(props.href, pathname, false);\n\n useAutoScroll(active, ref);\n\n return (\n <Link ref={ref} data-active={active} prefetch={prefetch} {...props}>\n {icon ?? (props.external ? <ExternalLink /> : null)}\n {children}\n </Link>\n );\n}\n\nexport function SidebarFolder({\n defaultOpen: defaultOpenProp,\n collapsible = true,\n active = false,\n children,\n ...props\n}: ComponentProps<'div'> & {\n active?: boolean;\n defaultOpen?: boolean;\n collapsible?: boolean;\n}) {\n const { defaultOpenLevel } = useSidebar();\n const depth = useFolderDepth() + 1;\n const defaultOpen =\n collapsible === false || active || (defaultOpenProp ?? defaultOpenLevel >= depth);\n const [open, setOpen] = useState(defaultOpen);\n\n useOnChange(defaultOpen, (v) => {\n if (v) setOpen(v);\n });\n\n return (\n <Collapsible open={open} onOpenChange={setOpen} disabled={!collapsible} {...props}>\n <FolderContext\n value={useMemo(() => ({ open, setOpen, depth, collapsible }), [collapsible, depth, open])}\n >\n {children}\n </FolderContext>\n </Collapsible>\n );\n}\n\nexport function SidebarFolderTrigger({ children, ...props }: CollapsibleTriggerProps) {\n const { open, collapsible } = use(FolderContext)!;\n\n if (collapsible) {\n return (\n <CollapsibleTrigger {...props}>\n {children}\n <ChevronDown\n data-icon\n className={cn('ms-auto transition-transform', !open && '-rotate-90')}\n />\n </CollapsibleTrigger>\n );\n }\n\n return <div {...(props as ComponentProps<'div'>)}>{children}</div>;\n}\n\nexport function SidebarFolderLink({ children, ...props }: LinkProps) {\n const ref = useRef<HTMLAnchorElement>(null);\n const { open, setOpen, collapsible } = use(FolderContext)!;\n const { prefetch } = useSidebar();\n const pathname = usePathname();\n const active = props.href !== undefined && isActive(props.href, pathname, false);\n\n useAutoScroll(active, ref);\n\n return (\n <Link\n ref={ref}\n data-active={active}\n onClick={(e) => {\n if (!collapsible) return;\n\n if (e.target instanceof Element && e.target.matches('[data-icon], [data-icon] *')) {\n setOpen(!open);\n e.preventDefault();\n } else {\n setOpen(active ? !open : true);\n }\n }}\n prefetch={prefetch}\n {...props}\n >\n {children}\n {collapsible && (\n <ChevronDown\n data-icon\n className={cn('ms-auto transition-transform', !open && '-rotate-90')}\n />\n )}\n </Link>\n );\n}\n\nexport function SidebarFolderContent(props: CollapsibleContentProps) {\n return <CollapsibleContent {...props}>{props.children}</CollapsibleContent>;\n}\n\nexport function SidebarTrigger({ children, ...props }: ComponentProps<'button'>) {\n const { setOpen } = useSidebar();\n\n return (\n <button aria-label=\"Open Sidebar\" onClick={() => setOpen((prev) => !prev)} {...props}>\n {children}\n </button>\n );\n}\n\nexport function SidebarCollapseTrigger(props: ComponentProps<'button'>) {\n const { collapsed, setCollapsed } = useSidebar();\n\n return (\n <button\n type=\"button\"\n aria-label=\"Collapse Sidebar\"\n data-collapsed={collapsed}\n onClick={() => {\n setCollapsed((prev) => !prev);\n }}\n {...props}\n >\n {props.children}\n </button>\n );\n}\n\nfunction useAutoScroll(active: boolean, ref: RefObject<HTMLAnchorElement | null>) {\n const { mode } = useSidebar();\n\n useEffect(() => {\n if (active && ref.current) {\n scrollIntoView(ref.current, {\n boundary: document.getElementById(mode === 'drawer' ? 'nd-sidebar-mobile' : 'nd-sidebar'),\n scrollMode: 'if-needed',\n });\n }\n }, [active, mode, ref]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"base.js","names":[],"sources":["../../../src/components/sidebar/base.tsx"],"sourcesContent":["'use client';\nimport { ChevronDown, ExternalLink } from 'lucide-react';\nimport {\n type ComponentProps,\n createContext,\n type PointerEvent,\n type ReactNode,\n type RefObject,\n use,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Link, { type LinkProps } from '@hanzo/docs-core/link';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport { cn } from '@/utils/cn';\nimport { ScrollArea, type ScrollAreaProps, ScrollViewport } from '@/components/ui/scroll-area';\nimport { isActive } from '@/utils/urls';\nimport {\n Collapsible,\n CollapsibleContent,\n type CollapsibleContentProps,\n CollapsibleTrigger,\n type CollapsibleTriggerProps,\n} from '@/components/ui/collapsible';\nimport { useMediaQuery } from '@hanzo/docs-core/utils/use-media-query';\nimport scrollIntoView from 'scroll-into-view-if-needed';\nimport { usePathname } from '@hanzo/docs-core/framework';\nimport ReactDOM from 'react-dom';\n\ninterface SidebarContext {\n open: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n collapsed: boolean;\n setCollapsed: React.Dispatch<React.SetStateAction<boolean>>;\n\n /**\n * When set to false, don't close the sidebar when navigate to another page\n */\n closeOnRedirect: RefObject<boolean>;\n defaultOpenLevel: number;\n prefetch?: boolean;\n mode: Mode;\n}\n\nexport interface SidebarProviderProps {\n /**\n * Open folders by default if their level is lower or equal to a specific level\n * (Starting from 1)\n *\n * @defaultValue 0\n */\n defaultOpenLevel?: number;\n\n /**\n * Prefetch links, default behaviour depends on your React.js framework.\n */\n prefetch?: boolean;\n\n children?: ReactNode;\n}\n\ntype Mode = 'drawer' | 'full';\n\nconst SidebarContext = createContext<SidebarContext | null>(null);\n\nconst FolderContext = createContext<{\n open: boolean;\n setOpen: React.Dispatch<React.SetStateAction<boolean>>;\n depth: number;\n collapsible: boolean;\n} | null>(null);\n\nexport function SidebarProvider({\n defaultOpenLevel = 0,\n prefetch,\n children,\n}: SidebarProviderProps) {\n const closeOnRedirect = useRef(true);\n const [open, setOpen] = useState(false);\n const [collapsed, setCollapsed] = useState(false);\n const pathname = usePathname();\n const mode: Mode = useMediaQuery('(width < 768px)') ? 'drawer' : 'full';\n\n useOnChange(pathname, () => {\n if (closeOnRedirect.current) {\n setOpen(false);\n }\n closeOnRedirect.current = true;\n });\n\n return (\n <SidebarContext\n value={useMemo(\n () => ({\n open,\n setOpen,\n collapsed,\n setCollapsed,\n closeOnRedirect,\n defaultOpenLevel,\n prefetch,\n mode,\n }),\n [open, collapsed, defaultOpenLevel, prefetch, mode],\n )}\n >\n {children}\n </SidebarContext>\n );\n}\n\nexport function useSidebar(): SidebarContext {\n const ctx = use(SidebarContext);\n if (!ctx)\n throw new Error(\n 'Missing SidebarContext, make sure you have wrapped the component in <DocsLayout /> and the context is available.',\n );\n\n return ctx;\n}\n\nexport function useFolder() {\n return use(FolderContext);\n}\n\nexport function useFolderDepth() {\n return use(FolderContext)?.depth ?? 0;\n}\n\nexport function SidebarContent({\n children,\n}: {\n children: (state: {\n ref: RefObject<HTMLElement | null>;\n collapsed: boolean;\n hovered: boolean;\n onPointerEnter: (event: PointerEvent) => void;\n onPointerLeave: (event: PointerEvent) => void;\n }) => ReactNode;\n}) {\n const { collapsed, mode } = useSidebar();\n const [hover, setHover] = useState(false);\n const ref = useRef<HTMLElement>(null);\n const timerRef = useRef(0);\n\n useOnChange(collapsed, () => {\n if (collapsed) setHover(false);\n });\n\n if (mode !== 'full') return;\n\n function shouldIgnoreHover(e: PointerEvent): boolean {\n const element = ref.current;\n if (!element) return true;\n\n return !collapsed || e.pointerType === 'touch' || element.getAnimations().length > 0;\n }\n\n return children({\n ref,\n collapsed,\n hovered: hover,\n onPointerEnter(e) {\n if (shouldIgnoreHover(e)) return;\n window.clearTimeout(timerRef.current);\n setHover(true);\n },\n onPointerLeave(e) {\n if (shouldIgnoreHover(e)) return;\n window.clearTimeout(timerRef.current);\n\n timerRef.current = window.setTimeout(\n () => setHover(false),\n // if mouse is leaving the viewport, add a close delay\n Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100 ? 0 : 500,\n );\n },\n });\n}\n\nexport function SidebarDrawerOverlay(props: ComponentProps<'div'>) {\n const { open, setOpen, mode } = useSidebar();\n const [hidden, setHidden] = useState(!open);\n\n if (open && hidden) setHidden(false);\n if (mode !== 'drawer' || hidden) return;\n return (\n <div\n data-state={open ? 'open' : 'closed'}\n onClick={() => setOpen(false)}\n onAnimationEnd={() => {\n if (!open) ReactDOM.flushSync(() => setHidden(true));\n }}\n {...props}\n />\n );\n}\n\nexport function SidebarDrawerContent({ className, children, ...props }: ComponentProps<'aside'>) {\n const { open, mode } = useSidebar();\n const [hidden, setHidden] = useState(!open);\n\n if (open && hidden) setHidden(false);\n if (mode !== 'drawer') return;\n return (\n <aside\n id=\"nd-sidebar-mobile\"\n data-state={open ? 'open' : 'closed'}\n className={cn(hidden && 'invisible', className)}\n onAnimationEnd={() => {\n if (!open) ReactDOM.flushSync(() => setHidden(true));\n }}\n {...props}\n >\n {children}\n </aside>\n );\n}\n\nexport function SidebarViewport({ className, ...props }: ScrollAreaProps) {\n return (\n <ScrollArea\n className={(s) =>\n cn('min-h-0 flex-1', typeof className === 'function' ? className(s) : className)\n }\n {...props}\n >\n <ScrollViewport\n className=\"p-4 overscroll-contain\"\n style={\n {\n maskImage:\n 'linear-gradient(to bottom, transparent, white 12px, white calc(100% - 12px), transparent)',\n } as object\n }\n >\n {props.children}\n </ScrollViewport>\n </ScrollArea>\n );\n}\n\nexport function SidebarSeparator(props: ComponentProps<'p'>) {\n const depth = useFolderDepth();\n return (\n <p\n {...props}\n className={cn(\n 'inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0',\n depth === 0 && 'first:mt-0',\n props.className,\n )}\n >\n {props.children}\n </p>\n );\n}\n\nexport function SidebarItem({\n icon,\n children,\n ...props\n}: LinkProps & {\n icon?: ReactNode;\n}) {\n const pathname = usePathname();\n const ref = useRef<HTMLAnchorElement>(null);\n const { prefetch } = useSidebar();\n const active = props.href !== undefined && isActive(props.href, pathname, false);\n\n useAutoScroll(active, ref);\n\n return (\n <Link ref={ref} data-active={active} prefetch={prefetch} {...props}>\n {icon ?? (props.external ? <ExternalLink /> : null)}\n {children}\n </Link>\n );\n}\n\nexport function SidebarFolder({\n defaultOpen: defaultOpenProp,\n collapsible = true,\n active = false,\n children,\n ...props\n}: ComponentProps<'div'> & {\n active?: boolean;\n defaultOpen?: boolean;\n collapsible?: boolean;\n}) {\n const { defaultOpenLevel } = useSidebar();\n const depth = useFolderDepth() + 1;\n const defaultOpen =\n collapsible === false || active || (defaultOpenProp ?? defaultOpenLevel >= depth);\n const [open, setOpen] = useState(defaultOpen);\n\n useOnChange(defaultOpen, (v) => {\n if (v) setOpen(v);\n });\n\n return (\n <Collapsible open={open} onOpenChange={setOpen} disabled={!collapsible} {...props}>\n <FolderContext\n value={useMemo(() => ({ open, setOpen, depth, collapsible }), [collapsible, depth, open])}\n >\n {children}\n </FolderContext>\n </Collapsible>\n );\n}\n\nexport function SidebarFolderTrigger({ children, ...props }: CollapsibleTriggerProps) {\n const { open, collapsible } = use(FolderContext)!;\n\n if (collapsible) {\n return (\n <CollapsibleTrigger {...props}>\n {children}\n <ChevronDown\n data-icon\n className={cn('ms-auto transition-transform', !open && '-rotate-90')}\n />\n </CollapsibleTrigger>\n );\n }\n\n return <div {...(props as ComponentProps<'div'>)}>{children}</div>;\n}\n\nexport function SidebarFolderLink({ children, ...props }: LinkProps) {\n const ref = useRef<HTMLAnchorElement>(null);\n const { open, setOpen, collapsible } = use(FolderContext)!;\n const { prefetch } = useSidebar();\n const pathname = usePathname();\n const active = props.href !== undefined && isActive(props.href, pathname, false);\n\n useAutoScroll(active, ref);\n\n return (\n <Link\n ref={ref}\n data-active={active}\n onClick={(e) => {\n if (!collapsible) return;\n\n if (e.target instanceof Element && e.target.matches('[data-icon], [data-icon] *')) {\n setOpen(!open);\n e.preventDefault();\n } else {\n setOpen(active ? !open : true);\n }\n }}\n prefetch={prefetch}\n {...props}\n >\n {children}\n {collapsible && (\n <ChevronDown\n data-icon\n className={cn('ms-auto transition-transform', !open && '-rotate-90')}\n />\n )}\n </Link>\n );\n}\n\nexport function SidebarFolderContent(props: CollapsibleContentProps) {\n return <CollapsibleContent {...props}>{props.children}</CollapsibleContent>;\n}\n\nexport function SidebarTrigger({ children, ...props }: ComponentProps<'button'>) {\n const { setOpen } = useSidebar();\n\n return (\n <button aria-label=\"Open Sidebar\" onClick={() => setOpen((prev) => !prev)} {...props}>\n {children}\n </button>\n );\n}\n\nexport function SidebarCollapseTrigger(props: ComponentProps<'button'>) {\n const { collapsed, setCollapsed } = useSidebar();\n\n return (\n <button\n type=\"button\"\n aria-label=\"Collapse Sidebar\"\n data-collapsed={collapsed}\n onClick={() => {\n setCollapsed((prev) => !prev);\n }}\n {...props}\n >\n {props.children}\n </button>\n );\n}\n\n/**\n * scroll to the element if `active` is true\n */\nexport function useAutoScroll(active: boolean, ref: RefObject<HTMLElement | null>) {\n const { mode } = useSidebar();\n\n useEffect(() => {\n if (active && ref.current) {\n scrollIntoView(ref.current, {\n boundary: document.getElementById(mode === 'drawer' ? 'nd-sidebar-mobile' : 'nd-sidebar'),\n scrollMode: 'if-needed',\n });\n }\n }, [active, mode, ref]);\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { base_d_exports } from "./base.js";
2
- import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { LinkItemType } from "../../utils/link-item.js";
3
3
  import { HTMLAttributes } from "react";
4
- import { LinkItemType } from "@hanzo/docs-ui/link-item";
4
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
5
5
 
6
6
  //#region src/components/sidebar/link-item.d.ts
7
7
  type InternalComponents = Pick<typeof base_d_exports, 'SidebarFolder' | 'SidebarFolderLink' | 'SidebarFolderContent' | 'SidebarFolderTrigger' | 'SidebarItem'>;
@@ -1 +1 @@
1
- {"version":3,"file":"link-item.d.ts","names":[],"sources":["../../../src/components/sidebar/link-item.tsx"],"sourcesContent":[],"mappings":";;;;;;KAIK,kBAAA,GAAqB,YACjB;iBAQO,sBAAA;;;;;;GAMb;;;GAOE,eAAe;QACV,QAAQ;IAvBb,IAAA,EAAA,MAAA;EASW,CAAA,CAAA;CACd,EAAA,GAcC,kBAAA,CAAA,GAAA,CAAA,OAdD"}
1
+ {"version":3,"file":"link-item.d.ts","names":[],"sources":["../../../src/components/sidebar/link-item.tsx"],"mappings":";;;;;;KAIK,kBAAA,GAAqB,IAAA,QACjB,cAAA;AAAA,iBAQO,sBAAA,CAAA;EACd,aAAA;EACA,oBAAA;EACA,iBAAA;EACA,oBAAA;EACA;AAAA,GACC,kBAAA;EAI+B,IAAA;EAAA,GAAA;AAAA,GAG7B,cAAA,CAAe,WAAA;EAChB,IAAA,EAAM,OAAA,CAAQ,YAAA;IAAgB,IAAA;EAAA;AAAA,MAC/B,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"link-item.js","names":[],"sources":["../../../src/components/sidebar/link-item.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport type * as Base from './base';\nimport type { LinkItemType } from '@hanzo/docs-ui/link-item';\n\ntype InternalComponents = Pick<\n typeof Base,\n | 'SidebarFolder'\n | 'SidebarFolderLink'\n | 'SidebarFolderContent'\n | 'SidebarFolderTrigger'\n | 'SidebarItem'\n>;\n\nexport function createLinkItemRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n}: InternalComponents) {\n /**\n * Render sidebar items from page tree\n */\n return function SidebarLinkItem({\n item,\n ...props\n }: HTMLAttributes<HTMLElement> & {\n item: Exclude<LinkItemType, { type: 'icon' }>;\n }) {\n if (item.type === 'custom') return <div {...props}>{item.children}</div>;\n\n if (item.type === 'menu')\n return (\n <SidebarFolder {...props}>\n {item.url ? (\n <SidebarFolderLink href={item.url} external={item.external}>\n {item.icon}\n {item.text}\n </SidebarFolderLink>\n ) : (\n <SidebarFolderTrigger>\n {item.icon}\n {item.text}\n </SidebarFolderTrigger>\n )}\n <SidebarFolderContent>\n {item.items.map((child, i) => (\n <SidebarLinkItem key={i} item={child} />\n ))}\n </SidebarFolderContent>\n </SidebarFolder>\n );\n\n return (\n <SidebarItem href={item.url} icon={item.icon} external={item.external} {...props}>\n {item.text}\n </SidebarItem>\n );\n };\n}\n"],"mappings":";;;AAaA,SAAgB,uBAAuB,EACrC,eACA,sBACA,mBACA,sBACA,eACqB;;;;AAIrB,QAAO,SAAS,gBAAgB,EAC9B,MACA,GAAG,SAGF;AACD,MAAI,KAAK,SAAS,SAAU,QAAO,oBAAC;GAAI,GAAI;aAAQ,KAAK;IAAe;AAExE,MAAI,KAAK,SAAS,OAChB,QACE,qBAAC;GAAc,GAAI;cAChB,KAAK,MACJ,qBAAC;IAAkB,MAAM,KAAK;IAAK,UAAU,KAAK;eAC/C,KAAK,MACL,KAAK;KACY,GAEpB,qBAAC,mCACE,KAAK,MACL,KAAK,QACe,EAEzB,oBAAC,kCACE,KAAK,MAAM,KAAK,OAAO,MACtB,oBAAC,mBAAwB,MAAM,SAAT,EAAkB,CACxC,GACmB;IACT;AAGpB,SACE,oBAAC;GAAY,MAAM,KAAK;GAAK,MAAM,KAAK;GAAM,UAAU,KAAK;GAAU,GAAI;aACxE,KAAK;IACM"}
1
+ {"version":3,"file":"link-item.js","names":[],"sources":["../../../src/components/sidebar/link-item.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport type * as Base from './base';\nimport type { LinkItemType } from '@/utils/link-item';\n\ntype InternalComponents = Pick<\n typeof Base,\n | 'SidebarFolder'\n | 'SidebarFolderLink'\n | 'SidebarFolderContent'\n | 'SidebarFolderTrigger'\n | 'SidebarItem'\n>;\n\nexport function createLinkItemRenderer({\n SidebarFolder,\n SidebarFolderContent,\n SidebarFolderLink,\n SidebarFolderTrigger,\n SidebarItem,\n}: InternalComponents) {\n /**\n * Render sidebar items from page tree\n */\n return function SidebarLinkItem({\n item,\n ...props\n }: HTMLAttributes<HTMLElement> & {\n item: Exclude<LinkItemType, { type: 'icon' }>;\n }) {\n if (item.type === 'custom') return <div {...props}>{item.children}</div>;\n\n if (item.type === 'menu')\n return (\n <SidebarFolder {...props}>\n {item.url ? (\n <SidebarFolderLink href={item.url} external={item.external}>\n {item.icon}\n {item.text}\n </SidebarFolderLink>\n ) : (\n <SidebarFolderTrigger>\n {item.icon}\n {item.text}\n </SidebarFolderTrigger>\n )}\n <SidebarFolderContent>\n {item.items.map((child, i) => (\n <SidebarLinkItem key={i} item={child} />\n ))}\n </SidebarFolderContent>\n </SidebarFolder>\n );\n\n return (\n <SidebarItem href={item.url} icon={item.icon} external={item.external} {...props}>\n {item.text}\n </SidebarItem>\n );\n };\n}\n"],"mappings":";;;AAaA,SAAgB,uBAAuB,EACrC,eACA,sBACA,mBACA,sBACA,eACqB;;;;AAIrB,QAAO,SAAS,gBAAgB,EAC9B,MACA,GAAG,SAGF;AACD,MAAI,KAAK,SAAS,SAAU,QAAO,oBAAC;GAAI,GAAI;aAAQ,KAAK;IAAe;AAExE,MAAI,KAAK,SAAS,OAChB,QACE,qBAAC;GAAc,GAAI;cAChB,KAAK,MACJ,qBAAC;IAAkB,MAAM,KAAK;IAAK,UAAU,KAAK;eAC/C,KAAK,MACL,KAAK;KACY,GAEpB,qBAAC,mCACE,KAAK,MACL,KAAK,QACe,EAEzB,oBAAC,kCACE,KAAK,MAAM,KAAK,OAAO,MACtB,oBAAC,mBAAwB,MAAM,SAAT,EAAkB,CACxC,GACmB;IACT;AAGpB,SACE,oBAAC;GAAY,MAAM,KAAK;GAAK,MAAM,KAAK;GAAM,UAAU,KAAK;GAAU,GAAI;aACxE,KAAK;IACM"}