@hanzo/docs-base-ui 16.4.8 → 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 (306) hide show
  1. package/README.md +1 -1
  2. package/css/aspen.css +39 -1
  3. package/css/black.css +39 -1
  4. package/css/catppuccin.css +49 -1
  5. package/css/dusk.css +47 -1
  6. package/css/emerald.css +39 -1
  7. package/css/generated/docs.css +455 -0
  8. package/css/generated/flux.css +419 -0
  9. package/css/generated/home.css +201 -0
  10. package/css/generated/notebook.css +492 -0
  11. package/css/generated/shared.css +1033 -0
  12. package/css/lib/base.css +217 -0
  13. package/css/lib/default-colors.css +51 -0
  14. package/css/lib/shiki.css +90 -0
  15. package/css/neutral.css +7 -1
  16. package/css/ocean.css +44 -1
  17. package/css/preset.css +6 -7
  18. package/css/purple.css +39 -1
  19. package/css/ruby.css +39 -1
  20. package/css/shadcn.css +36 -1
  21. package/css/solar.css +75 -1
  22. package/css/vitepress.css +65 -1
  23. package/dist/_virtual/_rolldown/runtime.js +18 -0
  24. package/dist/components/accordion.d.ts +3 -3
  25. package/dist/components/accordion.d.ts.map +1 -1
  26. package/dist/components/accordion.js +6 -6
  27. package/dist/components/accordion.js.map +1 -1
  28. package/dist/components/banner.d.ts +2 -2
  29. package/dist/components/banner.d.ts.map +1 -1
  30. package/dist/components/banner.js +4 -4
  31. package/dist/components/banner.js.map +1 -1
  32. package/dist/components/callout.d.ts +5 -5
  33. package/dist/components/callout.d.ts.map +1 -1
  34. package/dist/components/callout.js +1 -1
  35. package/dist/components/callout.js.map +1 -1
  36. package/dist/components/card.d.ts +3 -3
  37. package/dist/components/card.d.ts.map +1 -1
  38. package/dist/components/card.js +2 -2
  39. package/dist/components/card.js.map +1 -1
  40. package/dist/components/codeblock.d.ts +7 -7
  41. package/dist/components/codeblock.d.ts.map +1 -1
  42. package/dist/components/codeblock.js +7 -7
  43. package/dist/components/codeblock.js.map +1 -1
  44. package/dist/components/dialog/search-algolia.d.ts +6 -6
  45. package/dist/components/dialog/search-algolia.d.ts.map +1 -1
  46. package/dist/components/dialog/search-algolia.js +7 -7
  47. package/dist/components/dialog/search-algolia.js.map +1 -1
  48. package/dist/components/dialog/search-default.d.ts +6 -6
  49. package/dist/components/dialog/search-default.d.ts.map +1 -1
  50. package/dist/components/dialog/search-default.js +7 -7
  51. package/dist/components/dialog/search-default.js.map +1 -1
  52. package/dist/components/dialog/search-orama.d.ts +6 -6
  53. package/dist/components/dialog/search-orama.d.ts.map +1 -1
  54. package/dist/components/dialog/search-orama.js +7 -7
  55. package/dist/components/dialog/search-orama.js.map +1 -1
  56. package/dist/components/dialog/search.d.ts +16 -16
  57. package/dist/components/dialog/search.d.ts.map +1 -1
  58. package/dist/components/dialog/search.js +19 -27
  59. package/dist/components/dialog/search.js.map +1 -1
  60. package/dist/components/dynamic-codeblock.core.d.ts +33 -0
  61. package/dist/components/dynamic-codeblock.core.d.ts.map +1 -0
  62. package/dist/components/dynamic-codeblock.core.js +66 -0
  63. package/dist/components/dynamic-codeblock.core.js.map +1 -0
  64. package/dist/components/dynamic-codeblock.d.ts +4 -28
  65. package/dist/components/dynamic-codeblock.d.ts.map +1 -1
  66. package/dist/components/dynamic-codeblock.js +9 -53
  67. package/dist/components/dynamic-codeblock.js.map +1 -1
  68. package/dist/components/files.d.ts.map +1 -1
  69. package/dist/components/files.js +2 -2
  70. package/dist/components/files.js.map +1 -1
  71. package/dist/components/github-info.d.ts +2 -2
  72. package/dist/components/github-info.d.ts.map +1 -1
  73. package/dist/components/github-info.js +1 -1
  74. package/dist/components/github-info.js.map +1 -1
  75. package/dist/components/heading.d.ts.map +1 -1
  76. package/dist/components/heading.js +1 -1
  77. package/dist/components/heading.js.map +1 -1
  78. package/dist/components/{image-zoom-CtfZieBH.css → image-zoom-DGvp66QF.css} +1 -1
  79. package/dist/components/{image-zoom-CtfZieBH.css.map → image-zoom-DGvp66QF.css.map} +1 -1
  80. package/dist/components/image-zoom.d.ts +3 -3
  81. package/dist/components/image-zoom.d.ts.map +1 -1
  82. package/dist/components/inline-toc.d.ts +2 -2
  83. package/dist/components/inline-toc.d.ts.map +1 -1
  84. package/dist/components/inline-toc.js +1 -1
  85. package/dist/components/inline-toc.js.map +1 -1
  86. package/dist/components/sidebar/base.d.ts +16 -16
  87. package/dist/components/sidebar/base.d.ts.map +1 -1
  88. package/dist/components/sidebar/base.js +5 -5
  89. package/dist/components/sidebar/base.js.map +1 -1
  90. package/dist/components/sidebar/link-item.d.ts +3 -3
  91. package/dist/components/sidebar/link-item.d.ts.map +1 -1
  92. package/dist/components/sidebar/link-item.js.map +1 -1
  93. package/dist/components/sidebar/page-tree.d.ts +2 -2
  94. package/dist/components/sidebar/page-tree.d.ts.map +1 -1
  95. package/dist/components/sidebar/page-tree.js +5 -5
  96. package/dist/components/sidebar/page-tree.js.map +1 -1
  97. package/dist/components/sidebar/tabs/dropdown.d.ts +3 -3
  98. package/dist/components/sidebar/tabs/dropdown.d.ts.map +1 -1
  99. package/dist/components/sidebar/tabs/dropdown.js +19 -19
  100. package/dist/components/sidebar/tabs/dropdown.js.map +1 -1
  101. package/dist/components/sidebar/tabs/index.d.ts.map +1 -1
  102. package/dist/components/steps.d.ts +3 -3
  103. package/dist/components/steps.d.ts.map +1 -1
  104. package/dist/components/tabs.d.ts +4 -4
  105. package/dist/components/tabs.d.ts.map +1 -1
  106. package/dist/components/tabs.js +2 -2
  107. package/dist/components/tabs.js.map +1 -1
  108. package/dist/components/toc/clerk.d.ts +12 -1
  109. package/dist/components/toc/clerk.d.ts.map +1 -0
  110. package/dist/components/toc/clerk.js +106 -6
  111. package/dist/components/toc/clerk.js.map +1 -1
  112. package/dist/components/toc/default.d.ts +12 -1
  113. package/dist/components/toc/default.d.ts.map +1 -0
  114. package/dist/components/toc/default.js +34 -6
  115. package/dist/components/toc/default.js.map +1 -1
  116. package/dist/components/toc/index.d.ts +26 -1
  117. package/dist/components/toc/index.d.ts.map +1 -0
  118. package/dist/components/toc/index.js +76 -6
  119. package/dist/components/toc/index.js.map +1 -1
  120. package/dist/components/type-table.d.ts +2 -2
  121. package/dist/components/type-table.d.ts.map +1 -1
  122. package/dist/components/type-table.js +7 -7
  123. package/dist/components/type-table.js.map +1 -1
  124. package/dist/components/ui/accordion.d.ts +6 -6
  125. package/dist/components/ui/accordion.d.ts.map +1 -1
  126. package/dist/components/ui/accordion.js +1 -1
  127. package/dist/components/ui/accordion.js.map +1 -1
  128. package/dist/components/ui/button.d.ts +1 -1
  129. package/dist/components/ui/button.d.ts.map +1 -1
  130. package/dist/components/ui/collapsible.d.ts +6 -6
  131. package/dist/components/ui/collapsible.d.ts.map +1 -1
  132. package/dist/components/ui/collapsible.js +1 -1
  133. package/dist/components/ui/collapsible.js.map +1 -1
  134. package/dist/components/ui/navigation-menu.d.ts +7 -7
  135. package/dist/components/ui/navigation-menu.d.ts.map +1 -1
  136. package/dist/components/ui/navigation-menu.js +2 -2
  137. package/dist/components/ui/navigation-menu.js.map +1 -1
  138. package/dist/components/ui/popover.d.ts +3 -3
  139. package/dist/components/ui/popover.d.ts.map +1 -1
  140. package/dist/components/ui/popover.js +2 -2
  141. package/dist/components/ui/popover.js.map +1 -1
  142. package/dist/components/ui/scroll-area.d.ts +4 -4
  143. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  144. package/dist/components/ui/scroll-area.js +2 -2
  145. package/dist/components/ui/scroll-area.js.map +1 -1
  146. package/dist/components/ui/tabs.d.ts +7 -7
  147. package/dist/components/ui/tabs.d.ts.map +1 -1
  148. package/dist/components/ui/tabs.js +5 -5
  149. package/dist/components/ui/tabs.js.map +1 -1
  150. package/dist/contexts/i18n.d.ts +60 -1
  151. package/dist/contexts/i18n.d.ts.map +1 -0
  152. package/dist/contexts/i18n.js +54 -6
  153. package/dist/contexts/i18n.js.map +1 -1
  154. package/dist/contexts/search.d.ts +70 -4
  155. package/dist/contexts/search.d.ts.map +1 -1
  156. package/dist/contexts/search.js +62 -6
  157. package/dist/contexts/search.js.map +1 -1
  158. package/dist/contexts/tree.d.ts +22 -1
  159. package/dist/contexts/tree.d.ts.map +1 -0
  160. package/dist/contexts/tree.js +36 -6
  161. package/dist/contexts/tree.js.map +1 -1
  162. package/dist/i18n.d.ts +14 -1
  163. package/dist/i18n.d.ts.map +1 -0
  164. package/dist/i18n.js +19 -2
  165. package/dist/i18n.js.map +1 -0
  166. package/dist/layouts/docs/client.d.ts +7 -7
  167. package/dist/layouts/docs/client.d.ts.map +1 -1
  168. package/dist/layouts/docs/client.js +4 -4
  169. package/dist/layouts/docs/client.js.map +1 -1
  170. package/dist/layouts/docs/index.d.ts +3 -3
  171. package/dist/layouts/docs/index.d.ts.map +1 -1
  172. package/dist/layouts/docs/index.js +11 -11
  173. package/dist/layouts/docs/index.js.map +1 -1
  174. package/dist/layouts/docs/page/client.d.ts +7 -7
  175. package/dist/layouts/docs/page/client.d.ts.map +1 -1
  176. package/dist/layouts/docs/page/client.js +21 -21
  177. package/dist/layouts/docs/page/client.js.map +1 -1
  178. package/dist/layouts/docs/page/index.d.ts +5 -5
  179. package/dist/layouts/docs/page/index.d.ts.map +1 -1
  180. package/dist/layouts/docs/page/index.js +13 -13
  181. package/dist/layouts/docs/page/index.js.map +1 -1
  182. package/dist/layouts/docs/sidebar.d.ts +20 -19
  183. package/dist/layouts/docs/sidebar.d.ts.map +1 -1
  184. package/dist/layouts/docs/sidebar.js +6 -6
  185. package/dist/layouts/docs/sidebar.js.map +1 -1
  186. package/dist/layouts/flux/index.d.ts +79 -0
  187. package/dist/layouts/flux/index.d.ts.map +1 -0
  188. package/dist/layouts/flux/index.js +168 -0
  189. package/dist/layouts/flux/index.js.map +1 -0
  190. package/dist/layouts/flux/page/client.d.ts +45 -0
  191. package/dist/layouts/flux/page/client.d.ts.map +1 -0
  192. package/dist/layouts/flux/page/client.js +255 -0
  193. package/dist/layouts/flux/page/client.js.map +1 -0
  194. package/dist/layouts/flux/page/index.d.ts +98 -0
  195. package/dist/layouts/flux/page/index.d.ts.map +1 -0
  196. package/dist/layouts/flux/page/index.js +76 -0
  197. package/dist/layouts/flux/page/index.js.map +1 -0
  198. package/dist/layouts/flux/sidebar.d.ts +59 -0
  199. package/dist/layouts/flux/sidebar.d.ts.map +1 -0
  200. package/dist/layouts/flux/sidebar.js +197 -0
  201. package/dist/layouts/flux/sidebar.js.map +1 -0
  202. package/dist/layouts/flux/tab-dropdown.d.ts +21 -0
  203. package/dist/layouts/flux/tab-dropdown.d.ts.map +1 -0
  204. package/dist/layouts/flux/tab-dropdown.js +96 -0
  205. package/dist/layouts/flux/tab-dropdown.js.map +1 -0
  206. package/dist/layouts/home/client.d.ts +3 -3
  207. package/dist/layouts/home/client.d.ts.map +1 -1
  208. package/dist/layouts/home/client.js +20 -38
  209. package/dist/layouts/home/client.js.map +1 -1
  210. package/dist/layouts/home/index.d.ts +2 -2
  211. package/dist/layouts/home/index.d.ts.map +1 -1
  212. package/dist/layouts/home/index.js +1 -1
  213. package/dist/layouts/home/index.js.map +1 -1
  214. package/dist/layouts/home/navbar.d.ts +6 -6
  215. package/dist/layouts/home/navbar.d.ts.map +1 -1
  216. package/dist/layouts/home/navbar.js +2 -2
  217. package/dist/layouts/home/navbar.js.map +1 -1
  218. package/dist/layouts/notebook/client.d.ts +9 -9
  219. package/dist/layouts/notebook/client.d.ts.map +1 -1
  220. package/dist/layouts/notebook/client.js +8 -8
  221. package/dist/layouts/notebook/client.js.map +1 -1
  222. package/dist/layouts/notebook/index.d.ts +2 -2
  223. package/dist/layouts/notebook/index.d.ts.map +1 -1
  224. package/dist/layouts/notebook/index.js +18 -18
  225. package/dist/layouts/notebook/index.js.map +1 -1
  226. package/dist/layouts/notebook/page/client.d.ts +7 -7
  227. package/dist/layouts/notebook/page/client.d.ts.map +1 -1
  228. package/dist/layouts/notebook/page/client.js +21 -21
  229. package/dist/layouts/notebook/page/client.js.map +1 -1
  230. package/dist/layouts/notebook/page/index.d.ts +5 -5
  231. package/dist/layouts/notebook/page/index.d.ts.map +1 -1
  232. package/dist/layouts/notebook/page/index.js +13 -13
  233. package/dist/layouts/notebook/page/index.js.map +1 -1
  234. package/dist/layouts/notebook/sidebar.d.ts +15 -14
  235. package/dist/layouts/notebook/sidebar.d.ts.map +1 -1
  236. package/dist/layouts/notebook/sidebar.js +4 -4
  237. package/dist/layouts/notebook/sidebar.js.map +1 -1
  238. package/dist/layouts/shared/index.d.ts +13 -6
  239. package/dist/layouts/shared/index.d.ts.map +1 -1
  240. package/dist/layouts/shared/index.js +29 -2
  241. package/dist/layouts/shared/index.js.map +1 -1
  242. package/dist/layouts/shared/language-toggle.d.ts +2 -2
  243. package/dist/layouts/shared/language-toggle.d.ts.map +1 -1
  244. package/dist/layouts/shared/language-toggle.js +4 -4
  245. package/dist/layouts/shared/language-toggle.js.map +1 -1
  246. package/dist/layouts/shared/search-toggle.d.ts +3 -3
  247. package/dist/layouts/shared/search-toggle.d.ts.map +1 -1
  248. package/dist/layouts/shared/search-toggle.js +6 -6
  249. package/dist/layouts/shared/search-toggle.js.map +1 -1
  250. package/dist/layouts/shared/theme-toggle.d.ts +2 -2
  251. package/dist/layouts/shared/theme-toggle.d.ts.map +1 -1
  252. package/dist/layouts/shared/theme-toggle.js +7 -7
  253. package/dist/layouts/shared/theme-toggle.js.map +1 -1
  254. package/dist/mdx.d.ts +1 -1
  255. package/dist/mdx.d.ts.map +1 -1
  256. package/dist/mdx.js +2 -2
  257. package/dist/mdx.js.map +1 -1
  258. package/dist/mdx.server.d.ts +0 -1
  259. package/dist/mdx.server.d.ts.map +1 -1
  260. package/dist/og.d.ts +23 -1
  261. package/dist/og.d.ts.map +1 -0
  262. package/dist/og.js +69 -2
  263. package/dist/og.js.map +1 -0
  264. package/dist/page.d.ts +3 -3
  265. package/dist/page.d.ts.map +1 -1
  266. package/dist/page.js +5 -5
  267. package/dist/page.js.map +1 -1
  268. package/dist/provider/base.d.ts +4 -4
  269. package/dist/provider/base.d.ts.map +1 -1
  270. package/dist/provider/base.js +3 -3
  271. package/dist/provider/base.js.map +1 -1
  272. package/dist/provider/next.d.ts +3 -3
  273. package/dist/provider/next.d.ts.map +1 -1
  274. package/dist/provider/react-router.d.ts +3 -3
  275. package/dist/provider/react-router.d.ts.map +1 -1
  276. package/dist/provider/tanstack.d.ts +3 -3
  277. package/dist/provider/tanstack.d.ts.map +1 -1
  278. package/dist/provider/waku.d.ts +3 -3
  279. package/dist/provider/waku.d.ts.map +1 -1
  280. package/dist/style.css +187 -56
  281. package/dist/utils/cn.js +3 -0
  282. package/dist/utils/link-item.d.ts +86 -0
  283. package/dist/utils/link-item.d.ts.map +1 -0
  284. package/dist/utils/link-item.js +25 -0
  285. package/dist/utils/link-item.js.map +1 -0
  286. package/dist/utils/merge-refs.js +13 -0
  287. package/dist/utils/merge-refs.js.map +1 -0
  288. package/dist/utils/urls.js +17 -0
  289. package/dist/utils/urls.js.map +1 -0
  290. package/dist/utils/use-copy-button.d.ts +7 -1
  291. package/dist/utils/use-copy-button.d.ts.map +1 -0
  292. package/dist/utils/use-copy-button.js +29 -2
  293. package/dist/utils/use-copy-button.js.map +1 -0
  294. package/dist/utils/use-footer-items.d.ts +10 -1
  295. package/dist/utils/use-footer-items.d.ts.map +1 -0
  296. package/dist/utils/use-footer-items.js +27 -2
  297. package/dist/utils/use-footer-items.js.map +1 -0
  298. package/dist/utils/use-is-scroll-top.d.ts +9 -1
  299. package/dist/utils/use-is-scroll-top.d.ts.map +1 -0
  300. package/dist/utils/use-is-scroll-top.js +23 -2
  301. package/dist/utils/use-is-scroll-top.js.map +1 -0
  302. package/package.json +28 -17
  303. package/css/layouts/docs.css +0 -1
  304. package/css/layouts/home.css +0 -1
  305. package/css/layouts/notebook.css +0 -1
  306. package/dist/_virtual/rolldown_runtime.js +0 -36
@@ -1,15 +1,15 @@
1
1
  'use client';
2
2
 
3
- import { i18n_exports } from "../../contexts/i18n.js";
3
+ import { useI18n } from "../../contexts/i18n.js";
4
4
  import { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogOverlay, TagsList, TagsListItem } from "./search.js";
5
- import { jsx, jsxs } from "react/jsx-runtime";
6
5
  import { useMemo, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { useOnChange } from "@hanzo/docs-core/utils/use-on-change";
8
8
  import { useDocsSearch } from "@hanzo/docs-core/search/client";
9
9
 
10
10
  //#region src/components/dialog/search-default.tsx
11
11
  function DefaultSearchDialog({ defaultTag, tags = [], api, delayMs, type = "fetch", allowClear = false, links = [], footer, ...props }) {
12
- const { locale } = (0, i18n_exports.useI18n)();
12
+ const { locale } = useI18n();
13
13
  const [tag, setTag] = useState(defaultTag);
14
14
  const { search, setSearch, query } = useDocsSearch(type === "fetch" ? {
15
15
  type: "fetch",
@@ -52,10 +52,10 @@ function DefaultSearchDialog({ defaultTag, tags = [], api, delayMs, type = "fetc
52
52
  tag,
53
53
  onTagChange: setTag,
54
54
  allowClear,
55
- children: tags.map((tag$1) => /* @__PURE__ */ jsx(TagsListItem, {
56
- value: tag$1.value,
57
- children: tag$1.name
58
- }, tag$1.value))
55
+ children: tags.map((tag) => /* @__PURE__ */ jsx(TagsListItem, {
56
+ value: tag.value,
57
+ children: tag.name
58
+ }, tag.value))
59
59
  }), footer] })
60
60
  ]
61
61
  });
@@ -1 +1 @@
1
- {"version":3,"file":"search-default.js","names":["tag"],"sources":["../../../src/components/dialog/search-default.tsx"],"sourcesContent":["'use client';\n\nimport { useDocsSearch } from '@hanzo/docs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport { useI18n } from '@/contexts/i18n';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from '@hanzo/docs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\n\nexport interface DefaultSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n\n /**\n * @defaultValue 'fetch'\n */\n type?: 'fetch' | 'static';\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Search API URL\n */\n api?: string;\n\n /**\n * The debounced delay for performing a search.\n */\n delayMs?: number;\n\n footer?: ReactNode;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\nexport default function DefaultSearchDialog({\n defaultTag,\n tags = [],\n api,\n delayMs,\n type = 'fetch',\n allowClear = false,\n links = [],\n footer,\n ...props\n}: DefaultSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch(\n type === 'fetch'\n ? {\n type: 'fetch',\n api,\n locale,\n tag,\n delayMs,\n }\n : {\n type: 'static',\n from: api,\n locale,\n tag,\n delayMs,\n },\n );\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n </SearchDialogContent>\n <SearchDialogFooter>\n {tags.length > 0 && (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n </TagsList>\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialog>\n );\n}\n"],"mappings":";;;;;;;;;;AAsDA,SAAwB,oBAAoB,EAC1C,YACA,OAAO,EAAE,EACT,KACA,SACA,OAAO,SACP,aAAa,OACb,QAAQ,EAAE,EACV,QACA,GAAG,SACwB;CAC3B,MAAM,EAAE,sCAAoB;CAC5B,MAAM,CAAC,KAAK,UAAU,SAAS,WAAW;CAC1C,MAAM,EAAE,QAAQ,WAAW,UAAU,cACnC,SAAS,UACL;EACE,MAAM;EACN;EACA;EACA;EACA;EACD,GACD;EACE,MAAM;EACN,MAAM;EACN;EACA;EACA;EACD,CACN;CACD,MAAM,eAAe,cAAqC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MAAM,KAAK,CAAC,MAAM,WAAW;GAClC,MAAM;GACN,IAAI;GACJ,SAAS;GACT,KAAK;GACN,EAAE;IACF,CAAC,MAAM,CAAC;AAEX,aAAY,aAAa,MAAM;AAC7B,SAAO,EAAE;GACT;AAEF,QACE,qBAAC;EAAqB;EAAQ,gBAAgB;EAAW,WAAW,MAAM;EAAW,GAAI;;GACvF,oBAAC,wBAAsB;GACvB,qBAAC,kCACC,qBAAC;IACC,oBAAC,qBAAmB;IACpB,oBAAC,sBAAoB;IACrB,oBAAC,sBAAoB;OACF,EACrB,oBAAC,oBAAiB,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,eAAgB,IAC3D;GACtB,qBAAC,iCACE,KAAK,SAAS,KACb,oBAAC;IAAc;IAAK,aAAa;IAAoB;cAClD,KAAK,KAAK,UACT,oBAAC;KAA6B,OAAOA,MAAI;eACtCA,MAAI;OADYA,MAAI,MAER,CACf;KACO,EAEZ,UACkB;;GACR"}
1
+ {"version":3,"file":"search-default.js","names":[],"sources":["../../../src/components/dialog/search-default.tsx"],"sourcesContent":["'use client';\n\nimport { useDocsSearch } from '@hanzo/docs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport { useI18n } from '@/contexts/i18n';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from '@hanzo/docs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\n\nexport interface DefaultSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n\n /**\n * @defaultValue 'fetch'\n */\n type?: 'fetch' | 'static';\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Search API URL\n */\n api?: string;\n\n /**\n * The debounced delay for performing a search.\n */\n delayMs?: number;\n\n footer?: ReactNode;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\nexport default function DefaultSearchDialog({\n defaultTag,\n tags = [],\n api,\n delayMs,\n type = 'fetch',\n allowClear = false,\n links = [],\n footer,\n ...props\n}: DefaultSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch(\n type === 'fetch'\n ? {\n type: 'fetch',\n api,\n locale,\n tag,\n delayMs,\n }\n : {\n type: 'static',\n from: api,\n locale,\n tag,\n delayMs,\n },\n );\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n </SearchDialogContent>\n <SearchDialogFooter>\n {tags.length > 0 && (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n </TagsList>\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialog>\n );\n}\n"],"mappings":";;;;;;;;;;AAsDA,SAAwB,oBAAoB,EAC1C,YACA,OAAO,EAAE,EACT,KACA,SACA,OAAO,SACP,aAAa,OACb,QAAQ,EAAE,EACV,QACA,GAAG,SACwB;CAC3B,MAAM,EAAE,WAAW,SAAS;CAC5B,MAAM,CAAC,KAAK,UAAU,SAAS,WAAW;CAC1C,MAAM,EAAE,QAAQ,WAAW,UAAU,cACnC,SAAS,UACL;EACE,MAAM;EACN;EACA;EACA;EACA;EACD,GACD;EACE,MAAM;EACN,MAAM;EACN;EACA;EACA;EACD,CACN;CACD,MAAM,eAAe,cAAqC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO,MAAM,KAAK,CAAC,MAAM,WAAW;GAClC,MAAM;GACN,IAAI;GACJ,SAAS;GACT,KAAK;GACN,EAAE;IACF,CAAC,MAAM,CAAC;AAEX,aAAY,aAAa,MAAM;AAC7B,SAAO,EAAE;GACT;AAEF,QACE,qBAAC;EAAqB;EAAQ,gBAAgB;EAAW,WAAW,MAAM;EAAW,GAAI;;GACvF,oBAAC,wBAAsB;GACvB,qBAAC,kCACC,qBAAC;IACC,oBAAC,qBAAmB;IACpB,oBAAC,sBAAoB;IACrB,oBAAC,sBAAoB;OACF,EACrB,oBAAC,oBAAiB,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,eAAgB,IAC3D;GACtB,qBAAC,iCACE,KAAK,SAAS,KACb,oBAAC;IAAc;IAAK,aAAa;IAAoB;cAClD,KAAK,KAAK,QACT,oBAAC;KAA6B,OAAO,IAAI;eACtC,IAAI;OADY,IAAI,MAER,CACf;KACO,EAEZ,UACkB;;GACR"}
@@ -1,18 +1,18 @@
1
- import { search_d_exports } from "../../contexts/search.js";
1
+ import { SearchLink, SharedProps, TagItem } from "../../contexts/search.js";
2
2
  import "./search.js";
3
- import * as react_jsx_runtime16 from "react/jsx-runtime";
4
3
  import { ReactNode } from "react";
4
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
5
5
  import { OramaCloudOptions } from "@hanzo/docs-core/search/client";
6
6
 
7
7
  //#region src/components/dialog/search-orama.d.ts
8
- interface OramaSearchDialogProps extends search_d_exports.SharedProps {
9
- links?: search_d_exports.SearchLink[];
8
+ interface OramaSearchDialogProps extends SharedProps {
9
+ links?: SearchLink[];
10
10
  client: OramaCloudOptions['client'];
11
11
  searchOptions?: OramaCloudOptions['params'];
12
12
  index?: OramaCloudOptions['index'];
13
13
  footer?: ReactNode;
14
14
  defaultTag?: string;
15
- tags?: search_d_exports.TagItem[];
15
+ tags?: TagItem[];
16
16
  /**
17
17
  * Add the "Powered by Orama" label
18
18
  *
@@ -40,7 +40,7 @@ declare function OramaSearchDialog({
40
40
  footer,
41
41
  links,
42
42
  ...props
43
- }: OramaSearchDialogProps): react_jsx_runtime16.JSX.Element;
43
+ }: OramaSearchDialogProps): react_jsx_runtime0.JSX.Element;
44
44
  //#endregion
45
45
  export { OramaSearchDialogProps, OramaSearchDialog as default };
46
46
  //# sourceMappingURL=search-orama.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-orama.d.ts","names":[],"sources":["../../../src/components/dialog/search-orama.tsx"],"sourcesContent":[],"mappings":";;;;;;;UAuBiB,sBAAA,SAA+B,gBAAA,CAAA;UACtC,gBAAA,CAAA;UACA;EAFO,aAAA,CAAA,EAGC,iBAHsB,CAAA,QAAA,CAAA;EAC9B,KAAA,CAAA,EAGA,iBAHA,CAAA,OAAA,CAAA;EACA,MAAA,CAAA,EAIC,SAJD;EACQ,UAAA,CAAA,EAAA,MAAA;EACR,IAAA,CAAA,EAKD,gBAAA,CAAA,OALC,EAAA;EAEC;;;;AAkBV;EAMC,SAAA,CAAA,EAAA,OAAA;EACA;;;;;EAKA,UAAA,CAAA,EAAA,OAAA;;;;;AAIuB,iBAXD,iBAAA,CAWC;EAAA,MAAA;EAAA,aAAA;EAAA,IAAA;EAAA,UAAA;EAAA,SAAA;EAAA,UAAA;EAAA,KAAA;EAAA,MAAA;EAAA,KAAA;EAAA,GAAA;AAAA,CAAA,EAAtB,sBAAsB,CAAA,EAAA,mBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"search-orama.d.ts","names":[],"sources":["../../../src/components/dialog/search-orama.tsx"],"mappings":";;;;;;;UAuBiB,sBAAA,SAA+B,WAAA;EAC9C,KAAA,GAAQ,UAAA;EACR,MAAA,EAAQ,iBAAA;EACR,aAAA,GAAgB,iBAAA;EAChB,KAAA,GAAQ,iBAAA;EAER,MAAA,GAAS,SAAA;EAET,UAAA;EACA,IAAA,GAAO,OAAA;EANS;;;;;EAahB,SAAA;EAhByD;;;;;EAuBzD,UAAA;AAAA;;;;iBAMsB,iBAAA,CAAA;EACtB,MAAA;EACA,aAAA;EACA,IAAA;EACA,UAAA;EACA,SAAA;EACA,UAAA;EACA,KAAA;EACA,MAAA;EACA,KAAA;EAAA,GACG;AAAA,GACF,sBAAA,GAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
 
3
- import { i18n_exports } from "../../contexts/i18n.js";
3
+ import { useI18n } from "../../contexts/i18n.js";
4
4
  import { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogOverlay, TagsList, TagsListItem } from "./search.js";
5
- import { jsx, jsxs } from "react/jsx-runtime";
6
5
  import { useMemo, useState } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { useOnChange } from "@hanzo/docs-core/utils/use-on-change";
8
8
  import { useDocsSearch } from "@hanzo/docs-core/search/client";
9
9
 
@@ -12,7 +12,7 @@ import { useDocsSearch } from "@hanzo/docs-core/search/client";
12
12
  * Orama Cloud integration
13
13
  */
14
14
  function OramaSearchDialog({ client, searchOptions, tags = [], defaultTag, showOrama = true, allowClear = false, index, footer, links = [], ...props }) {
15
- const { locale } = (0, i18n_exports.useI18n)();
15
+ const { locale } = useI18n();
16
16
  const [tag, setTag] = useState(defaultTag);
17
17
  const { search, setSearch, query } = useDocsSearch({
18
18
  type: "orama-cloud",
@@ -51,10 +51,10 @@ function OramaSearchDialog({ client, searchOptions, tags = [], defaultTag, showO
51
51
  tag,
52
52
  onTagChange: setTag,
53
53
  allowClear,
54
- children: [tags.map((tag$1) => /* @__PURE__ */ jsx(TagsListItem, {
55
- value: tag$1.value,
56
- children: tag$1.name
57
- }, tag$1.value)), label]
54
+ children: [tags.map((tag) => /* @__PURE__ */ jsx(TagsListItem, {
55
+ value: tag.value,
56
+ children: tag.name
57
+ }, tag.value)), label]
58
58
  }) : label, footer] })
59
59
  ] })]
60
60
  });
@@ -1 +1 @@
1
- {"version":3,"file":"search-orama.js","names":["tag"],"sources":["../../../src/components/dialog/search-orama.tsx"],"sourcesContent":["'use client';\n\nimport { type OramaCloudOptions, useDocsSearch } from '@hanzo/docs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from '@hanzo/docs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\nimport { useI18n } from '@/contexts/i18n';\n\nexport interface OramaSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n client: OramaCloudOptions['client'];\n searchOptions?: OramaCloudOptions['params'];\n index?: OramaCloudOptions['index'];\n\n footer?: ReactNode;\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Add the \"Powered by Orama\" label\n *\n * @defaultValue true\n */\n showOrama?: boolean;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\n/**\n * Orama Cloud integration\n */\nexport default function OramaSearchDialog({\n client,\n searchOptions,\n tags = [],\n defaultTag,\n showOrama = true,\n allowClear = false,\n index,\n footer,\n links = [],\n ...props\n}: OramaSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch({\n type: 'orama-cloud',\n client,\n index,\n params: searchOptions,\n locale,\n tag,\n });\n\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n const label = showOrama && <Label />;\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n <SearchDialogFooter>\n {tags.length > 0 ? (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n {label}\n </TagsList>\n ) : (\n label\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialogContent>\n </SearchDialog>\n );\n}\n\nfunction Label() {\n return (\n <a\n href=\"https://orama.com\"\n rel=\"noreferrer noopener\"\n className=\"ms-auto text-xs text-fd-muted-foreground\"\n >\n Search powered by Orama\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAoDA,SAAwB,kBAAkB,EACxC,QACA,eACA,OAAO,EAAE,EACT,YACA,YAAY,MACZ,aAAa,OACb,OACA,QACA,QAAQ,EAAE,EACV,GAAG,SACsB;CACzB,MAAM,EAAE,sCAAoB;CAC5B,MAAM,CAAC,KAAK,UAAU,SAAS,WAAW;CAC1C,MAAM,EAAE,QAAQ,WAAW,UAAU,cAAc;EACjD,MAAM;EACN;EACA;EACA,QAAQ;EACR;EACA;EACD,CAAC;CAEF,MAAM,eAAe,cAAqC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SAAO,MAAM,KAAK,CAAC,MAAM,WAAW;GAClC,MAAM;GACN,IAAI;GACJ,SAAS;GACT,KAAK;GACN,EAAE;IACF,CAAC,MAAM,CAAC;AAEX,aAAY,aAAa,MAAM;AAC7B,SAAO,EAAE;GACT;CAEF,MAAM,QAAQ,aAAa,oBAAC,UAAQ;AAEpC,QACE,qBAAC;EAAqB;EAAQ,gBAAgB;EAAW,WAAW,MAAM;EAAW,GAAI;aACvF,oBAAC,wBAAsB,EACvB,qBAAC;GACC,qBAAC;IACC,oBAAC,qBAAmB;IACpB,oBAAC,sBAAoB;IACrB,oBAAC,sBAAoB;OACF;GACrB,oBAAC,oBAAiB,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,eAAgB;GAC/E,qBAAC,iCACE,KAAK,SAAS,IACb,qBAAC;IAAc;IAAK,aAAa;IAAoB;eAClD,KAAK,KAAK,UACT,oBAAC;KAA6B,OAAOA,MAAI;eACtCA,MAAI;OADYA,MAAI,MAER,CACf,EACD;KACQ,GAEX,OAED,UACkB;MACD;GACT;;AAInB,SAAS,QAAQ;AACf,QACE,oBAAC;EACC,MAAK;EACL,KAAI;EACJ,WAAU;YACX;GAEG"}
1
+ {"version":3,"file":"search-orama.js","names":[],"sources":["../../../src/components/dialog/search-orama.tsx"],"sourcesContent":["'use client';\n\nimport { type OramaCloudOptions, useDocsSearch } from '@hanzo/docs-core/search/client';\nimport { type ReactNode, useMemo, useState } from 'react';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport {\n SearchDialog,\n SearchDialogClose,\n SearchDialogContent,\n SearchDialogFooter,\n SearchDialogHeader,\n SearchDialogIcon,\n SearchDialogInput,\n SearchDialogList,\n SearchDialogOverlay,\n type SharedProps,\n TagsList,\n TagsListItem,\n} from './search';\nimport type { SortedResult } from '@hanzo/docs-core/search';\nimport type { SearchLink, TagItem } from '@/contexts/search';\nimport { useI18n } from '@/contexts/i18n';\n\nexport interface OramaSearchDialogProps extends SharedProps {\n links?: SearchLink[];\n client: OramaCloudOptions['client'];\n searchOptions?: OramaCloudOptions['params'];\n index?: OramaCloudOptions['index'];\n\n footer?: ReactNode;\n\n defaultTag?: string;\n tags?: TagItem[];\n\n /**\n * Add the \"Powered by Orama\" label\n *\n * @defaultValue true\n */\n showOrama?: boolean;\n\n /**\n * Allow to clear tag filters\n *\n * @defaultValue false\n */\n allowClear?: boolean;\n}\n\n/**\n * Orama Cloud integration\n */\nexport default function OramaSearchDialog({\n client,\n searchOptions,\n tags = [],\n defaultTag,\n showOrama = true,\n allowClear = false,\n index,\n footer,\n links = [],\n ...props\n}: OramaSearchDialogProps) {\n const { locale } = useI18n();\n const [tag, setTag] = useState(defaultTag);\n const { search, setSearch, query } = useDocsSearch({\n type: 'orama-cloud',\n client,\n index,\n params: searchOptions,\n locale,\n tag,\n });\n\n const defaultItems = useMemo<SortedResult[] | null>(() => {\n if (links.length === 0) return null;\n\n return links.map(([name, link]) => ({\n type: 'page',\n id: name,\n content: name,\n url: link,\n }));\n }, [links]);\n\n useOnChange(defaultTag, (v) => {\n setTag(v);\n });\n\n const label = showOrama && <Label />;\n\n return (\n <SearchDialog search={search} onSearchChange={setSearch} isLoading={query.isLoading} {...props}>\n <SearchDialogOverlay />\n <SearchDialogContent>\n <SearchDialogHeader>\n <SearchDialogIcon />\n <SearchDialogInput />\n <SearchDialogClose />\n </SearchDialogHeader>\n <SearchDialogList items={query.data !== 'empty' ? query.data : defaultItems} />\n <SearchDialogFooter>\n {tags.length > 0 ? (\n <TagsList tag={tag} onTagChange={setTag} allowClear={allowClear}>\n {tags.map((tag) => (\n <TagsListItem key={tag.value} value={tag.value}>\n {tag.name}\n </TagsListItem>\n ))}\n {label}\n </TagsList>\n ) : (\n label\n )}\n {footer}\n </SearchDialogFooter>\n </SearchDialogContent>\n </SearchDialog>\n );\n}\n\nfunction Label() {\n return (\n <a\n href=\"https://orama.com\"\n rel=\"noreferrer noopener\"\n className=\"ms-auto text-xs text-fd-muted-foreground\"\n >\n Search powered by Orama\n </a>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAoDA,SAAwB,kBAAkB,EACxC,QACA,eACA,OAAO,EAAE,EACT,YACA,YAAY,MACZ,aAAa,OACb,OACA,QACA,QAAQ,EAAE,EACV,GAAG,SACsB;CACzB,MAAM,EAAE,WAAW,SAAS;CAC5B,MAAM,CAAC,KAAK,UAAU,SAAS,WAAW;CAC1C,MAAM,EAAE,QAAQ,WAAW,UAAU,cAAc;EACjD,MAAM;EACN;EACA;EACA,QAAQ;EACR;EACA;EACD,CAAC;CAEF,MAAM,eAAe,cAAqC;AACxD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SAAO,MAAM,KAAK,CAAC,MAAM,WAAW;GAClC,MAAM;GACN,IAAI;GACJ,SAAS;GACT,KAAK;GACN,EAAE;IACF,CAAC,MAAM,CAAC;AAEX,aAAY,aAAa,MAAM;AAC7B,SAAO,EAAE;GACT;CAEF,MAAM,QAAQ,aAAa,oBAAC,UAAQ;AAEpC,QACE,qBAAC;EAAqB;EAAQ,gBAAgB;EAAW,WAAW,MAAM;EAAW,GAAI;aACvF,oBAAC,wBAAsB,EACvB,qBAAC;GACC,qBAAC;IACC,oBAAC,qBAAmB;IACpB,oBAAC,sBAAoB;IACrB,oBAAC,sBAAoB;OACF;GACrB,oBAAC,oBAAiB,OAAO,MAAM,SAAS,UAAU,MAAM,OAAO,eAAgB;GAC/E,qBAAC,iCACE,KAAK,SAAS,IACb,qBAAC;IAAc;IAAK,aAAa;IAAoB;eAClD,KAAK,KAAK,QACT,oBAAC;KAA6B,OAAO,IAAI;eACtC,IAAI;OADY,IAAI,MAER,CACf,EACD;KACQ,GAEX,OAED,UACkB;MACD;GACT;;AAInB,SAAS,QAAQ;AACf,QACE,oBAAC;EACC,MAAK;EACL,KAAI;EACJ,WAAU;YACX;GAEG"}
@@ -1,6 +1,6 @@
1
- import { search_d_exports } from "../../contexts/search.js";
2
- import * as react_jsx_runtime20 from "react/jsx-runtime";
1
+ import { SharedProps } from "../../contexts/search.js";
3
2
  import { ComponentProps, ReactNode } from "react";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
4
  import { Dialog } from "@base-ui/react/dialog";
5
5
  import { HighlightedText, ReactSortedResult } from "@hanzo/docs-core/search";
6
6
 
@@ -13,7 +13,7 @@ type SearchItemType = (ReactSortedResult & {
13
13
  node: ReactNode;
14
14
  onSelect: () => void;
15
15
  };
16
- interface SearchDialogProps extends search_d_exports.SharedProps {
16
+ interface SearchDialogProps extends SharedProps {
17
17
  search: string;
18
18
  onSearchChange: (v: string) => void;
19
19
  onSelect?: (item: SearchItemType) => void;
@@ -28,24 +28,24 @@ declare function SearchDialog({
28
28
  isLoading,
29
29
  onSelect: onSelectProp,
30
30
  children
31
- }: SearchDialogProps): react_jsx_runtime20.JSX.Element;
32
- declare function SearchDialogHeader(props: ComponentProps<'div'>): react_jsx_runtime20.JSX.Element;
33
- declare function SearchDialogInput(props: ComponentProps<'input'>): react_jsx_runtime20.JSX.Element;
31
+ }: SearchDialogProps): react_jsx_runtime0.JSX.Element;
32
+ declare function SearchDialogHeader(props: ComponentProps<'div'>): react_jsx_runtime0.JSX.Element;
33
+ declare function SearchDialogInput(props: ComponentProps<'input'>): react_jsx_runtime0.JSX.Element;
34
34
  declare function SearchDialogClose({
35
35
  children,
36
36
  className,
37
37
  ...props
38
- }: ComponentProps<'button'>): react_jsx_runtime20.JSX.Element;
39
- declare function SearchDialogFooter(props: ComponentProps<'div'>): react_jsx_runtime20.JSX.Element;
38
+ }: ComponentProps<'button'>): react_jsx_runtime0.JSX.Element;
39
+ declare function SearchDialogFooter(props: ComponentProps<'div'>): react_jsx_runtime0.JSX.Element;
40
40
  declare function SearchDialogOverlay({
41
41
  className,
42
42
  ...props
43
- }: ComponentProps<typeof Dialog.Backdrop>): react_jsx_runtime20.JSX.Element;
43
+ }: ComponentProps<typeof Dialog.Backdrop>): react_jsx_runtime0.JSX.Element;
44
44
  declare function SearchDialogContent({
45
45
  children,
46
46
  className,
47
47
  ...props
48
- }: ComponentProps<typeof Dialog.Popup>): react_jsx_runtime20.JSX.Element;
48
+ }: ComponentProps<typeof Dialog.Popup>): react_jsx_runtime0.JSX.Element;
49
49
  declare function SearchDialogList({
50
50
  items,
51
51
  Empty,
@@ -64,7 +64,7 @@ declare function SearchDialogList({
64
64
  item: SearchItemType;
65
65
  onClick: () => void;
66
66
  }) => ReactNode;
67
- }): react_jsx_runtime20.JSX.Element;
67
+ }): react_jsx_runtime0.JSX.Element;
68
68
  declare function SearchDialogListItem({
69
69
  item,
70
70
  className,
@@ -74,8 +74,8 @@ declare function SearchDialogListItem({
74
74
  }: ComponentProps<'button'> & {
75
75
  renderHighlights?: typeof renderHighlights;
76
76
  item: SearchItemType;
77
- }): react_jsx_runtime20.JSX.Element;
78
- declare function SearchDialogIcon(props: ComponentProps<'svg'>): react_jsx_runtime20.JSX.Element;
77
+ }): react_jsx_runtime0.JSX.Element;
78
+ declare function SearchDialogIcon(props: ComponentProps<'svg'>): react_jsx_runtime0.JSX.Element;
79
79
  interface TagsListProps extends ComponentProps<'div'> {
80
80
  tag?: string;
81
81
  onTagChange: (tag: string | undefined) => void;
@@ -86,14 +86,14 @@ declare function TagsList({
86
86
  onTagChange,
87
87
  allowClear,
88
88
  ...props
89
- }: TagsListProps): react_jsx_runtime20.JSX.Element;
89
+ }: TagsListProps): react_jsx_runtime0.JSX.Element;
90
90
  declare function TagsListItem({
91
91
  value,
92
92
  className,
93
93
  ...props
94
94
  }: ComponentProps<'button'> & {
95
95
  value: string;
96
- }): react_jsx_runtime20.JSX.Element;
96
+ }): react_jsx_runtime0.JSX.Element;
97
97
  declare function renderHighlights(highlights: HighlightedText<ReactNode>[]): ReactNode;
98
98
  declare function useSearch(): {
99
99
  open: boolean;
@@ -112,6 +112,6 @@ declare function useSearchList(): {
112
112
  active: string | null;
113
113
  setActive: (v: string | null) => void;
114
114
  };
115
- type SharedProps = search_d_exports.SharedProps;
115
+ //#endregion
116
116
  export { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogListItem, SearchDialogOverlay, SearchDialogProps, SearchItemType, type SharedProps, TagsList, TagsListItem, TagsListProps, useSearch, useSearchList, useTagsList };
117
117
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","names":[],"sources":["../../../src/components/dialog/search.tsx"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"search.d.ts","names":[],"sources":["../../../src/components/dialog/search.tsx"],"mappings":";;;;;;;KA2BY,cAAA,IACP,iBAAA;EACC,QAAA;AAAA;EAGA,EAAA;EACA,IAAA;EACA,IAAA,EAAM,SAAA;EACN,QAAA;AAAA;AAAA,UAMW,iBAAA,SAA0B,WAAA;EACzC,MAAA;EACA,cAAA,GAAiB,CAAA;EACjB,QAAA,IAAY,IAAA,EAAM,cAAA;EAClB,SAAA;EAEA,QAAA,EAAU,SAAA;AAAA;AAAA,iBAuBI,YAAA,CAAA;EACd,IAAA;EACA,YAAA;EACA,MAAA;EACA,cAAA;EACA,SAAA;EACA,QAAA,EAAU,YAAA;EACV;AAAA,GACC,iBAAA,GAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAqCJ,kBAAA,CAAmB,KAAA,EAAO,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI/C,iBAAA,CAAkB,KAAA,EAAO,cAAA,YAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAehD,iBAAA,CAAA;EACd,QAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA,aAAwB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAsBX,kBAAA,CAAmB,KAAA,EAAO,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI/C,mBAAA,CAAA;EACd,SAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,MAAA,CAAO,QAAA,IAAS,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAczB,mBAAA,CAAA;EACd,QAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA,QAAsB,MAAA,CAAO,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAuBtB,gBAAA,CAAA;EACd,KAAA;EACA,KAAA;EAKA,IAAA;EAAA,GACG;AAAA,GACF,IAAA,CAAK,cAAA;EACN,KAAA,EAAO,cAAA;EAhLP;;;EAoLA,KAAA,SAAc,SAAA;EAlLI;;;EAsLlB,IAAA,IAAQ,KAAA;IAAS,IAAA,EAAM,cAAA;IAAgB,OAAA;EAAA,MAA0B,SAAA;AAAA,IAClE,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAuFe,oBAAA,CAAA;EACd,IAAA;EACA,SAAA;EACA,QAAA;EACA,gBAAA,EAAkB,MAAA;EAAA,GACf;AAAA,GACF,cAAA;EACD,gBAAA,UAA0B,gBAAA;EAC1B,IAAA,EAAM,cAAA;AAAA,IACP,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAoEe,gBAAA,CAAiB,KAAA,EAAO,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,UAe5C,aAAA,SAAsB,cAAA;EACrC,GAAA;EACA,WAAA,GAAc,GAAA;EACd,UAAA;AAAA;AAAA,iBAcc,QAAA,CAAA;EAAW,GAAA;EAAK,WAAA;EAAa,UAAA;EAAA,GAAuB;AAAA,GAAS,aAAA,GAAa,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAmB1E,YAAA,CAAA;EACd,KAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,cAAA;EACD,KAAA;AAAA,IACD,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAoBQ,gBAAA,CAAiB,UAAA,EAAY,eAAA,CAAgB,SAAA,MAAe,SAAA;AAAA,iBAcrD,SAAA,CAAA;;iBA9aC,IAAA;;mBAEE,CAAA;aACN,IAAA,EAAM,cAAA;;;iBAibH,WAAA,CAAA;;kBAtaE,KAAA;;;iBA4aF,aAAA,CAAA;;cAjbF,CAAA;AAAA"}
@@ -1,12 +1,12 @@
1
1
  'use client';
2
2
 
3
+ import { I18nLabel, useI18n } from "../../contexts/i18n.js";
4
+ import { cn } from "../../utils/cn.js";
3
5
  import { buttonVariants } from "../ui/button.js";
4
- import { i18n_exports } from "../../contexts/i18n.js";
6
+ import { Fragment, createContext, use, useCallback, useEffect, useEffectEvent, useMemo, useRef, useState } from "react";
5
7
  import { useRouter } from "@hanzo/docs-core/framework";
6
- import { cn } from "@hanzo/docs-ui/cn";
7
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
9
  import { ChevronRight, Hash, Search } from "lucide-react";
9
- import { Fragment as Fragment$1, createContext, use, useCallback, useEffect, useMemo, useRef, useState } from "react";
10
10
  import { cva } from "class-variance-authority";
11
11
  import { useOnChange } from "@hanzo/docs-core/utils/use-on-change";
12
12
  import scrollIntoView from "scroll-into-view-if-needed";
@@ -18,17 +18,13 @@ const ListContext = createContext(null);
18
18
  const TagsListContext = createContext(null);
19
19
  function SearchDialog({ open, onOpenChange, search, onSearchChange, isLoading = false, onSelect: onSelectProp, children }) {
20
20
  const router = useRouter();
21
- const onSelect = useCallback((item) => {
21
+ const onSelect = useEffectEvent((item) => {
22
22
  if (item.type === "action") item.onSelect();
23
23
  else if (item.external) window.open(item.url, "_blank")?.focus();
24
24
  else router.push(item.url);
25
25
  onOpenChange(false);
26
26
  onSelectProp?.(item);
27
- }, [
28
- router,
29
- onOpenChange,
30
- onSelectProp
31
- ]);
27
+ });
32
28
  return /* @__PURE__ */ jsx(Dialog.Root, {
33
29
  open,
34
30
  onOpenChange,
@@ -58,7 +54,7 @@ function SearchDialogHeader(props) {
58
54
  });
59
55
  }
60
56
  function SearchDialogInput(props) {
61
- const { text } = (0, i18n_exports.useI18n)();
57
+ const { text } = useI18n();
62
58
  const { search, onSearchChange } = useSearch();
63
59
  return /* @__PURE__ */ jsx("input", {
64
60
  ...props,
@@ -95,7 +91,7 @@ function SearchDialogOverlay({ className, ...props }) {
95
91
  });
96
92
  }
97
93
  function SearchDialogContent({ children, className, ...props }) {
98
- const { text } = (0, i18n_exports.useI18n)();
94
+ const { text } = useI18n();
99
95
  return /* @__PURE__ */ jsx(Dialog.Portal, { children: /* @__PURE__ */ jsxs(Dialog.Popup, {
100
96
  "aria-describedby": void 0,
101
97
  ...props,
@@ -108,12 +104,12 @@ function SearchDialogContent({ children, className, ...props }) {
108
104
  }
109
105
  function SearchDialogList({ items = null, Empty = () => /* @__PURE__ */ jsx("div", {
110
106
  className: "py-12 text-center text-sm text-fd-muted-foreground",
111
- children: /* @__PURE__ */ jsx(i18n_exports.I18nLabel, { label: "searchNoResult" })
112
- }), Item = (props$1) => /* @__PURE__ */ jsx(SearchDialogListItem, { ...props$1 }), ...props }) {
107
+ children: /* @__PURE__ */ jsx(I18nLabel, { label: "searchNoResult" })
108
+ }), Item = (props) => /* @__PURE__ */ jsx(SearchDialogListItem, { ...props }), ...props }) {
113
109
  const ref = useRef(null);
114
110
  const { onSelect } = useSearch();
115
111
  const [active, setActive] = useState(() => items && items.length > 0 ? items[0].id : null);
116
- const onKey = useCallback((e) => {
112
+ const onKey = useEffectEvent((e) => {
117
113
  if (!items || e.isComposing) return;
118
114
  if (e.key === "ArrowDown" || e.key == "ArrowUp") {
119
115
  let idx = items.findIndex((item) => item.id === active);
@@ -128,17 +124,13 @@ function SearchDialogList({ items = null, Empty = () => /* @__PURE__ */ jsx("div
128
124
  if (selected) onSelect(selected);
129
125
  e.preventDefault();
130
126
  }
131
- }, [
132
- items,
133
- active,
134
- onSelect
135
- ]);
127
+ });
136
128
  useEffect(() => {
137
129
  const element = ref.current;
138
130
  if (!element) return;
139
131
  const observer = new ResizeObserver(() => {
140
- const viewport$1 = element.firstElementChild;
141
- element.style.setProperty("--fd-animated-height", `${viewport$1.clientHeight}px`);
132
+ const viewport = element.firstElementChild;
133
+ element.style.setProperty("--fd-animated-height", `${viewport.clientHeight}px`);
142
134
  });
143
135
  const viewport = element.firstElementChild;
144
136
  if (viewport) observer.observe(viewport);
@@ -147,7 +139,7 @@ function SearchDialogList({ items = null, Empty = () => /* @__PURE__ */ jsx("div
147
139
  observer.disconnect();
148
140
  window.removeEventListener("keydown", onKey);
149
141
  };
150
- }, [onKey]);
142
+ }, []);
151
143
  useOnChange(items, () => {
152
144
  if (items && items.length > 0) setActive(items[0].id);
153
145
  });
@@ -163,7 +155,7 @@ function SearchDialogList({ items = null, Empty = () => /* @__PURE__ */ jsx("div
163
155
  active,
164
156
  setActive
165
157
  }), [active]),
166
- children: [items?.length === 0 && Empty(), items?.map((item) => /* @__PURE__ */ jsx(Fragment$1, { children: Item({
158
+ children: [items?.length === 0 && Empty(), items?.map((item) => /* @__PURE__ */ jsx(Fragment, { children: Item({
167
159
  item,
168
160
  onClick: () => onSelect(item)
169
161
  }) }, item.id))]
@@ -175,10 +167,10 @@ function SearchDialogListItem({ item, className, children, renderHighlights: ren
175
167
  const { active: activeId, setActive } = useSearchList();
176
168
  const active = item.id === activeId;
177
169
  if (item.type === "action") children ??= item.node;
178
- else children ??= /* @__PURE__ */ jsxs(Fragment, { children: [
170
+ else children ??= /* @__PURE__ */ jsxs(Fragment$1, { children: [
179
171
  /* @__PURE__ */ jsx("div", {
180
172
  className: "inline-flex items-center text-fd-muted-foreground text-xs empty:hidden",
181
- children: item.breadcrumbs?.map((item$1, i) => /* @__PURE__ */ jsxs(Fragment$1, { children: [i > 0 && /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 rtl:rotate-180" }), item$1] }, i))
173
+ children: item.breadcrumbs?.map((item, i) => /* @__PURE__ */ jsxs(Fragment, { children: [i > 0 && /* @__PURE__ */ jsx(ChevronRight, { className: "size-4 rtl:rotate-180" }), item] }, i))
182
174
  }),
183
175
  item.type !== "page" && /* @__PURE__ */ jsx("div", {
184
176
  role: "none",
@@ -255,7 +247,7 @@ function renderHighlights(highlights) {
255
247
  className: "text-fd-primary underline",
256
248
  children: node.content
257
249
  }, i);
258
- return /* @__PURE__ */ jsx(Fragment$1, { children: node.content }, i);
250
+ return /* @__PURE__ */ jsx(Fragment, { children: node.content }, i);
259
251
  });
260
252
  }
261
253
  function useSearch() {
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","names":["I18nLabel","props","viewport","Fragment","item","SearchIcon"],"sources":["../../../src/components/dialog/search.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronRight, Hash, Search as SearchIcon } from 'lucide-react';\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n type ReactNode,\n use,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { I18nLabel, useI18n } from '@/contexts/i18n';\nimport { cn } from '@hanzo/docs-ui/cn';\nimport { Dialog } from '@base-ui/react/dialog';\nimport type { HighlightedText, ReactSortedResult as BaseResultType } from '@hanzo/docs-core/search';\nimport { cva } from 'class-variance-authority';\nimport { useRouter } from '@hanzo/docs-core/framework';\nimport type { SharedProps } from '@/contexts/search';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport scrollIntoView from 'scroll-into-view-if-needed';\nimport { buttonVariants } from '@/components/ui/button';\n\nexport type SearchItemType =\n | (BaseResultType & {\n external?: boolean;\n })\n | {\n id: string;\n type: 'action';\n node: ReactNode;\n onSelect: () => void;\n };\n\n// needed for backward compatible since some previous guides referenced it\nexport type { SharedProps };\n\nexport interface SearchDialogProps extends SharedProps {\n search: string;\n onSearchChange: (v: string) => void;\n onSelect?: (item: SearchItemType) => void;\n isLoading?: boolean;\n\n children: ReactNode;\n}\n\nconst Context = createContext<{\n open: boolean;\n onOpenChange: (open: boolean) => void;\n search: string;\n onSearchChange: (v: string) => void;\n onSelect: (item: SearchItemType) => void;\n isLoading: boolean;\n} | null>(null);\n\nconst ListContext = createContext<{\n active: string | null;\n setActive: (v: string | null) => void;\n} | null>(null);\n\nconst TagsListContext = createContext<{\n value?: string;\n onValueChange: (value: string | undefined) => void;\n allowClear: boolean;\n} | null>(null);\n\nexport function SearchDialog({\n open,\n onOpenChange,\n search,\n onSearchChange,\n isLoading = false,\n onSelect: onSelectProp,\n children,\n}: SearchDialogProps) {\n const router = useRouter();\n const onSelect = useCallback((item: SearchItemType) => {\n if (item.type === 'action') {\n item.onSelect();\n } else if (item.external) {\n window.open(item.url, '_blank')?.focus();\n } else {\n router.push(item.url);\n }\n\n onOpenChange(false);\n onSelectProp?.(item);\n }, [router, onOpenChange, onSelectProp]);\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Context.Provider\n value={useMemo(\n () => ({\n open,\n onOpenChange,\n search,\n onSearchChange,\n // eslint-disable-next-line react-hooks/rules-of-hooks -- used in child components\n onSelect,\n isLoading,\n }),\n [isLoading, onOpenChange, onSearchChange, open, search],\n )}\n >\n {children}\n </Context.Provider>\n </Dialog.Root>\n );\n}\n\nexport function SearchDialogHeader(props: ComponentProps<'div'>) {\n return <div {...props} className={cn('flex flex-row items-center gap-2 p-3', props.className)} />;\n}\n\nexport function SearchDialogInput(props: ComponentProps<'input'>) {\n const { text } = useI18n();\n const { search, onSearchChange } = useSearch();\n\n return (\n <input\n {...props}\n value={search}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={text.search}\n className=\"w-0 flex-1 bg-transparent text-lg placeholder:text-fd-muted-foreground focus-visible:outline-none\"\n />\n );\n}\n\nexport function SearchDialogClose({\n children = 'ESC',\n className,\n ...props\n}: ComponentProps<'button'>) {\n const { onOpenChange } = useSearch();\n\n return (\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className={cn(\n buttonVariants({\n color: 'outline',\n size: 'sm',\n className: 'font-mono text-fd-muted-foreground',\n }),\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function SearchDialogFooter(props: ComponentProps<'div'>) {\n return <div {...props} className={cn('bg-fd-secondary/50 p-3 empty:hidden', props.className)} />;\n}\n\nexport function SearchDialogOverlay({\n className,\n ...props\n}: ComponentProps<typeof Dialog.Backdrop>) {\n return (\n <Dialog.Backdrop\n {...props}\n className={(s) =>\n cn(\n 'fixed inset-0 z-50 backdrop-blur-xs bg-fd-overlay data-[open]:animate-fd-fade-in data-[closed]:animate-fd-fade-out',\n typeof className === 'function' ? className(s) : className,\n )\n }\n />\n );\n}\n\nexport function SearchDialogContent({\n children,\n className,\n ...props\n}: ComponentProps<typeof Dialog.Popup>) {\n const { text } = useI18n();\n\n return (\n <Dialog.Portal>\n <Dialog.Popup\n aria-describedby={undefined}\n {...props}\n className={(s) =>\n cn(\n 'fixed left-1/2 top-4 md:top-[calc(50%-250px)] z-50 w-[calc(100%-1rem)] max-w-screen-sm -translate-x-1/2 rounded-xl border bg-fd-popover text-fd-popover-foreground shadow-2xl shadow-black/50 overflow-hidden data-[closed]:animate-fd-dialog-out data-[open]:animate-fd-dialog-in',\n '*:border-b *:has-[+:last-child[data-empty=true]]:border-b-0 *:data-[empty=true]:border-b-0 *:last:border-b-0',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <Dialog.Title className=\"hidden\">{text.search}</Dialog.Title>\n {children}\n </Dialog.Popup>\n </Dialog.Portal>\n );\n}\n\nexport function SearchDialogList({\n items = null,\n Empty = () => (\n <div className=\"py-12 text-center text-sm text-fd-muted-foreground\">\n <I18nLabel label=\"searchNoResult\" />\n </div>\n ),\n Item = (props) => <SearchDialogListItem {...props} />,\n ...props\n}: Omit<ComponentProps<'div'>, 'children'> & {\n items: SearchItemType[] | null | undefined;\n /**\n * Renderer for empty list UI\n */\n Empty?: () => ReactNode;\n /**\n * Renderer for items\n */\n Item?: (props: { item: SearchItemType; onClick: () => void }) => ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const { onSelect } = useSearch();\n const [active, setActive] = useState<string | null>(() =>\n items && items.length > 0 ? items[0].id : null,\n );\n\n const onKey = useCallback((e: KeyboardEvent) => {\n if (!items || e.isComposing) return;\n\n if (e.key === 'ArrowDown' || e.key == 'ArrowUp') {\n let idx = items.findIndex((item) => item.id === active);\n if (idx === -1) idx = 0;\n else if (e.key === 'ArrowDown') idx++;\n else idx--;\n\n setActive(items.at(idx % items.length)?.id ?? null);\n e.preventDefault();\n }\n\n if (e.key === 'Enter') {\n const selected = items.find((item) => item.id === active);\n\n if (selected) onSelect(selected);\n e.preventDefault();\n }\n }, [items, active, onSelect]);\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const observer = new ResizeObserver(() => {\n const viewport = element.firstElementChild!;\n\n element.style.setProperty('--fd-animated-height', `${viewport.clientHeight}px`);\n });\n\n const viewport = element.firstElementChild;\n if (viewport) observer.observe(viewport);\n\n window.addEventListener('keydown', onKey);\n return () => {\n observer.disconnect();\n window.removeEventListener('keydown', onKey);\n };\n }, [onKey]);\n\n useOnChange(items, () => {\n if (items && items.length > 0) {\n setActive(items[0].id);\n }\n });\n\n return (\n <div\n {...props}\n ref={ref}\n data-empty={items === null}\n className={cn(\n 'overflow-hidden h-(--fd-animated-height) transition-[height]',\n props.className,\n )}\n >\n <div\n className={cn('w-full flex flex-col overflow-y-auto max-h-[460px] p-1', !items && 'hidden')}\n >\n <ListContext.Provider\n value={useMemo(\n () => ({\n active,\n setActive,\n }),\n [active],\n )}\n >\n {items?.length === 0 && Empty()}\n\n {items?.map((item) => (\n <Fragment key={item.id}>{Item({ item, onClick: () => onSelect(item) })}</Fragment>\n ))}\n </ListContext.Provider>\n </div>\n </div>\n );\n}\n\nexport function SearchDialogListItem({\n item,\n className,\n children,\n renderHighlights: render = renderHighlights,\n ...props\n}: ComponentProps<'button'> & {\n renderHighlights?: typeof renderHighlights;\n item: SearchItemType;\n}) {\n const { active: activeId, setActive } = useSearchList();\n const active = item.id === activeId;\n\n if (item.type === 'action') {\n children ??= item.node;\n } else {\n children ??= (\n <>\n <div className=\"inline-flex items-center text-fd-muted-foreground text-xs empty:hidden\">\n {item.breadcrumbs?.map((item, i) => (\n <Fragment key={i}>\n {i > 0 && <ChevronRight className=\"size-4 rtl:rotate-180\" />}\n {item}\n </Fragment>\n ))}\n </div>\n\n {item.type !== 'page' && (\n <div role=\"none\" className=\"absolute start-3 inset-y-0 w-px bg-fd-border\" />\n )}\n <p\n className={cn(\n 'min-w-0 truncate',\n item.type !== 'page' && 'ps-4',\n item.type === 'page' || item.type === 'heading'\n ? 'font-medium'\n : 'text-fd-popover-foreground/80',\n )}\n >\n {item.type === 'heading' && (\n <Hash className=\"inline me-1 size-4 text-fd-muted-foreground\" />\n )}\n {item.contentWithHighlights ? render(item.contentWithHighlights) : item.content}\n </p>\n </>\n );\n }\n\n return (\n <button\n type=\"button\"\n ref={useCallback(\n (element: HTMLButtonElement | null) => {\n if (active && element) {\n scrollIntoView(element, {\n scrollMode: 'if-needed',\n block: 'nearest',\n boundary: element.parentElement,\n });\n }\n },\n [active],\n )}\n aria-selected={active}\n className={cn(\n 'relative select-none px-2.5 py-2 text-start text-sm rounded-lg',\n active && 'bg-fd-accent text-fd-accent-foreground',\n className,\n )}\n onPointerMove={() => setActive(item.id)}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function SearchDialogIcon(props: ComponentProps<'svg'>) {\n const { isLoading } = useSearch();\n\n return (\n <SearchIcon\n {...props}\n className={cn(\n 'size-5 text-fd-muted-foreground',\n isLoading && 'animate-pulse duration-400',\n props.className,\n )}\n />\n );\n}\n\nexport interface TagsListProps extends ComponentProps<'div'> {\n tag?: string;\n onTagChange: (tag: string | undefined) => void;\n allowClear?: boolean;\n}\n\nconst itemVariants = cva(\n 'rounded-md border px-2 py-0.5 text-xs font-medium text-fd-muted-foreground transition-colors',\n {\n variants: {\n active: {\n true: 'bg-fd-accent text-fd-accent-foreground',\n },\n },\n },\n);\n\nexport function TagsList({ tag, onTagChange, allowClear = false, ...props }: TagsListProps) {\n return (\n <div {...props} className={cn('flex items-center gap-1 flex-wrap', props.className)}>\n <TagsListContext.Provider\n value={useMemo(\n () => ({\n value: tag,\n onValueChange: onTagChange,\n allowClear,\n }),\n [allowClear, onTagChange, tag],\n )}\n >\n {props.children}\n </TagsListContext.Provider>\n </div>\n );\n}\n\nexport function TagsListItem({\n value,\n className,\n ...props\n}: ComponentProps<'button'> & {\n value: string;\n}) {\n const { onValueChange, value: selectedValue, allowClear } = useTagsList();\n const selected = value === selectedValue;\n\n return (\n <button\n type=\"button\"\n data-active={selected}\n className={cn(itemVariants({ active: selected, className }))}\n onClick={() => {\n onValueChange(selected && allowClear ? undefined : value);\n }}\n tabIndex={-1}\n {...props}\n >\n {props.children}\n </button>\n );\n}\n\nfunction renderHighlights(highlights: HighlightedText<ReactNode>[]): ReactNode {\n return highlights.map((node, i) => {\n if (node.styles?.highlight) {\n return (\n <span key={i} className=\"text-fd-primary underline\">\n {node.content}\n </span>\n );\n }\n\n return <Fragment key={i}>{node.content}</Fragment>;\n });\n}\n\nexport function useSearch() {\n const ctx = use(Context);\n if (!ctx) throw new Error('Missing <SearchDialog />');\n return ctx;\n}\n\nexport function useTagsList() {\n const ctx = use(TagsListContext);\n if (!ctx) throw new Error('Missing <TagsList />');\n return ctx;\n}\n\nexport function useSearchList() {\n const ctx = use(ListContext);\n if (!ctx) throw new Error('Missing <SearchDialogList />');\n return ctx;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"search.js","names":["SearchIcon"],"sources":["../../../src/components/dialog/search.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronRight, Hash, Search as SearchIcon } from 'lucide-react';\nimport {\n type ComponentProps,\n createContext,\n Fragment,\n type ReactNode,\n use,\n useCallback,\n useEffect,\n useEffectEvent,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { I18nLabel, useI18n } from '@/contexts/i18n';\nimport { cn } from '@/utils/cn';\nimport { Dialog } from '@base-ui/react/dialog';\nimport type { HighlightedText, ReactSortedResult as BaseResultType } from '@hanzo/docs-core/search';\nimport { cva } from 'class-variance-authority';\nimport { useRouter } from '@hanzo/docs-core/framework';\nimport type { SharedProps } from '@/contexts/search';\nimport { useOnChange } from '@hanzo/docs-core/utils/use-on-change';\nimport scrollIntoView from 'scroll-into-view-if-needed';\nimport { buttonVariants } from '@/components/ui/button';\n\nexport type SearchItemType =\n | (BaseResultType & {\n external?: boolean;\n })\n | {\n id: string;\n type: 'action';\n node: ReactNode;\n onSelect: () => void;\n };\n\n// needed for backward compatible since some previous guides referenced it\nexport type { SharedProps };\n\nexport interface SearchDialogProps extends SharedProps {\n search: string;\n onSearchChange: (v: string) => void;\n onSelect?: (item: SearchItemType) => void;\n isLoading?: boolean;\n\n children: ReactNode;\n}\n\nconst Context = createContext<{\n open: boolean;\n onOpenChange: (open: boolean) => void;\n search: string;\n onSearchChange: (v: string) => void;\n onSelect: (item: SearchItemType) => void;\n isLoading: boolean;\n} | null>(null);\n\nconst ListContext = createContext<{\n active: string | null;\n setActive: (v: string | null) => void;\n} | null>(null);\n\nconst TagsListContext = createContext<{\n value?: string;\n onValueChange: (value: string | undefined) => void;\n allowClear: boolean;\n} | null>(null);\n\nexport function SearchDialog({\n open,\n onOpenChange,\n search,\n onSearchChange,\n isLoading = false,\n onSelect: onSelectProp,\n children,\n}: SearchDialogProps) {\n const router = useRouter();\n const onSelect = useEffectEvent((item: SearchItemType) => {\n if (item.type === 'action') {\n item.onSelect();\n } else if (item.external) {\n window.open(item.url, '_blank')?.focus();\n } else {\n router.push(item.url);\n }\n\n onOpenChange(false);\n onSelectProp?.(item);\n });\n\n return (\n <Dialog.Root open={open} onOpenChange={onOpenChange}>\n <Context.Provider\n value={useMemo(\n () => ({\n open,\n onOpenChange,\n search,\n onSearchChange,\n // eslint-disable-next-line react-hooks/rules-of-hooks -- used in child components\n onSelect,\n isLoading,\n }),\n [isLoading, onOpenChange, onSearchChange, open, search],\n )}\n >\n {children}\n </Context.Provider>\n </Dialog.Root>\n );\n}\n\nexport function SearchDialogHeader(props: ComponentProps<'div'>) {\n return <div {...props} className={cn('flex flex-row items-center gap-2 p-3', props.className)} />;\n}\n\nexport function SearchDialogInput(props: ComponentProps<'input'>) {\n const { text } = useI18n();\n const { search, onSearchChange } = useSearch();\n\n return (\n <input\n {...props}\n value={search}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={text.search}\n className=\"w-0 flex-1 bg-transparent text-lg placeholder:text-fd-muted-foreground focus-visible:outline-none\"\n />\n );\n}\n\nexport function SearchDialogClose({\n children = 'ESC',\n className,\n ...props\n}: ComponentProps<'button'>) {\n const { onOpenChange } = useSearch();\n\n return (\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className={cn(\n buttonVariants({\n color: 'outline',\n size: 'sm',\n className: 'font-mono text-fd-muted-foreground',\n }),\n className,\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function SearchDialogFooter(props: ComponentProps<'div'>) {\n return <div {...props} className={cn('bg-fd-secondary/50 p-3 empty:hidden', props.className)} />;\n}\n\nexport function SearchDialogOverlay({\n className,\n ...props\n}: ComponentProps<typeof Dialog.Backdrop>) {\n return (\n <Dialog.Backdrop\n {...props}\n className={(s) =>\n cn(\n 'fixed inset-0 z-50 backdrop-blur-xs bg-fd-overlay data-[open]:animate-fd-fade-in data-[closed]:animate-fd-fade-out',\n typeof className === 'function' ? className(s) : className,\n )\n }\n />\n );\n}\n\nexport function SearchDialogContent({\n children,\n className,\n ...props\n}: ComponentProps<typeof Dialog.Popup>) {\n const { text } = useI18n();\n\n return (\n <Dialog.Portal>\n <Dialog.Popup\n aria-describedby={undefined}\n {...props}\n className={(s) =>\n cn(\n 'fixed left-1/2 top-4 md:top-[calc(50%-250px)] z-50 w-[calc(100%-1rem)] max-w-screen-sm -translate-x-1/2 rounded-xl border bg-fd-popover text-fd-popover-foreground shadow-2xl shadow-black/50 overflow-hidden data-[closed]:animate-fd-dialog-out data-[open]:animate-fd-dialog-in',\n '*:border-b *:has-[+:last-child[data-empty=true]]:border-b-0 *:data-[empty=true]:border-b-0 *:last:border-b-0',\n typeof className === 'function' ? className(s) : className,\n )\n }\n >\n <Dialog.Title className=\"hidden\">{text.search}</Dialog.Title>\n {children}\n </Dialog.Popup>\n </Dialog.Portal>\n );\n}\n\nexport function SearchDialogList({\n items = null,\n Empty = () => (\n <div className=\"py-12 text-center text-sm text-fd-muted-foreground\">\n <I18nLabel label=\"searchNoResult\" />\n </div>\n ),\n Item = (props) => <SearchDialogListItem {...props} />,\n ...props\n}: Omit<ComponentProps<'div'>, 'children'> & {\n items: SearchItemType[] | null | undefined;\n /**\n * Renderer for empty list UI\n */\n Empty?: () => ReactNode;\n /**\n * Renderer for items\n */\n Item?: (props: { item: SearchItemType; onClick: () => void }) => ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const { onSelect } = useSearch();\n const [active, setActive] = useState<string | null>(() =>\n items && items.length > 0 ? items[0].id : null,\n );\n\n const onKey = useEffectEvent((e: KeyboardEvent) => {\n if (!items || e.isComposing) return;\n\n if (e.key === 'ArrowDown' || e.key == 'ArrowUp') {\n let idx = items.findIndex((item) => item.id === active);\n if (idx === -1) idx = 0;\n else if (e.key === 'ArrowDown') idx++;\n else idx--;\n\n setActive(items.at(idx % items.length)?.id ?? null);\n e.preventDefault();\n }\n\n if (e.key === 'Enter') {\n const selected = items.find((item) => item.id === active);\n\n if (selected) onSelect(selected);\n e.preventDefault();\n }\n });\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const observer = new ResizeObserver(() => {\n const viewport = element.firstElementChild!;\n\n element.style.setProperty('--fd-animated-height', `${viewport.clientHeight}px`);\n });\n\n const viewport = element.firstElementChild;\n if (viewport) observer.observe(viewport);\n\n window.addEventListener('keydown', onKey);\n return () => {\n observer.disconnect();\n window.removeEventListener('keydown', onKey);\n };\n }, []);\n\n useOnChange(items, () => {\n if (items && items.length > 0) {\n setActive(items[0].id);\n }\n });\n\n return (\n <div\n {...props}\n ref={ref}\n data-empty={items === null}\n className={cn(\n 'overflow-hidden h-(--fd-animated-height) transition-[height]',\n props.className,\n )}\n >\n <div\n className={cn('w-full flex flex-col overflow-y-auto max-h-[460px] p-1', !items && 'hidden')}\n >\n <ListContext.Provider\n value={useMemo(\n () => ({\n active,\n setActive,\n }),\n [active],\n )}\n >\n {items?.length === 0 && Empty()}\n\n {items?.map((item) => (\n <Fragment key={item.id}>{Item({ item, onClick: () => onSelect(item) })}</Fragment>\n ))}\n </ListContext.Provider>\n </div>\n </div>\n );\n}\n\nexport function SearchDialogListItem({\n item,\n className,\n children,\n renderHighlights: render = renderHighlights,\n ...props\n}: ComponentProps<'button'> & {\n renderHighlights?: typeof renderHighlights;\n item: SearchItemType;\n}) {\n const { active: activeId, setActive } = useSearchList();\n const active = item.id === activeId;\n\n if (item.type === 'action') {\n children ??= item.node;\n } else {\n children ??= (\n <>\n <div className=\"inline-flex items-center text-fd-muted-foreground text-xs empty:hidden\">\n {item.breadcrumbs?.map((item, i) => (\n <Fragment key={i}>\n {i > 0 && <ChevronRight className=\"size-4 rtl:rotate-180\" />}\n {item}\n </Fragment>\n ))}\n </div>\n\n {item.type !== 'page' && (\n <div role=\"none\" className=\"absolute start-3 inset-y-0 w-px bg-fd-border\" />\n )}\n <p\n className={cn(\n 'min-w-0 truncate',\n item.type !== 'page' && 'ps-4',\n item.type === 'page' || item.type === 'heading'\n ? 'font-medium'\n : 'text-fd-popover-foreground/80',\n )}\n >\n {item.type === 'heading' && (\n <Hash className=\"inline me-1 size-4 text-fd-muted-foreground\" />\n )}\n {item.contentWithHighlights ? render(item.contentWithHighlights) : item.content}\n </p>\n </>\n );\n }\n\n return (\n <button\n type=\"button\"\n ref={useCallback(\n (element: HTMLButtonElement | null) => {\n if (active && element) {\n scrollIntoView(element, {\n scrollMode: 'if-needed',\n block: 'nearest',\n boundary: element.parentElement,\n });\n }\n },\n [active],\n )}\n aria-selected={active}\n className={cn(\n 'relative select-none px-2.5 py-2 text-start text-sm rounded-lg',\n active && 'bg-fd-accent text-fd-accent-foreground',\n className,\n )}\n onPointerMove={() => setActive(item.id)}\n {...props}\n >\n {children}\n </button>\n );\n}\n\nexport function SearchDialogIcon(props: ComponentProps<'svg'>) {\n const { isLoading } = useSearch();\n\n return (\n <SearchIcon\n {...props}\n className={cn(\n 'size-5 text-fd-muted-foreground',\n isLoading && 'animate-pulse duration-400',\n props.className,\n )}\n />\n );\n}\n\nexport interface TagsListProps extends ComponentProps<'div'> {\n tag?: string;\n onTagChange: (tag: string | undefined) => void;\n allowClear?: boolean;\n}\n\nconst itemVariants = cva(\n 'rounded-md border px-2 py-0.5 text-xs font-medium text-fd-muted-foreground transition-colors',\n {\n variants: {\n active: {\n true: 'bg-fd-accent text-fd-accent-foreground',\n },\n },\n },\n);\n\nexport function TagsList({ tag, onTagChange, allowClear = false, ...props }: TagsListProps) {\n return (\n <div {...props} className={cn('flex items-center gap-1 flex-wrap', props.className)}>\n <TagsListContext.Provider\n value={useMemo(\n () => ({\n value: tag,\n onValueChange: onTagChange,\n allowClear,\n }),\n [allowClear, onTagChange, tag],\n )}\n >\n {props.children}\n </TagsListContext.Provider>\n </div>\n );\n}\n\nexport function TagsListItem({\n value,\n className,\n ...props\n}: ComponentProps<'button'> & {\n value: string;\n}) {\n const { onValueChange, value: selectedValue, allowClear } = useTagsList();\n const selected = value === selectedValue;\n\n return (\n <button\n type=\"button\"\n data-active={selected}\n className={cn(itemVariants({ active: selected, className }))}\n onClick={() => {\n onValueChange(selected && allowClear ? undefined : value);\n }}\n tabIndex={-1}\n {...props}\n >\n {props.children}\n </button>\n );\n}\n\nfunction renderHighlights(highlights: HighlightedText<ReactNode>[]): ReactNode {\n return highlights.map((node, i) => {\n if (node.styles?.highlight) {\n return (\n <span key={i} className=\"text-fd-primary underline\">\n {node.content}\n </span>\n );\n }\n\n return <Fragment key={i}>{node.content}</Fragment>;\n });\n}\n\nexport function useSearch() {\n const ctx = use(Context);\n if (!ctx) throw new Error('Missing <SearchDialog />');\n return ctx;\n}\n\nexport function useTagsList() {\n const ctx = use(TagsListContext);\n if (!ctx) throw new Error('Missing <TagsList />');\n return ctx;\n}\n\nexport function useSearchList() {\n const ctx = use(ListContext);\n if (!ctx) throw new Error('Missing <SearchDialogList />');\n return ctx;\n}\n"],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { CodeBlockProps } from "./codeblock.js";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
+ import { UseShikiOptions } from "@hanzo/docs-core/highlight/core/client";
4
+
5
+ //#region src/components/dynamic-codeblock.core.d.ts
6
+ interface DynamicCodeblockProps {
7
+ lang: string;
8
+ code: string;
9
+ /**
10
+ * Extra props for the underlying `<CodeBlock />` component.
11
+ *
12
+ * Ignored if you defined your own `pre` component in `options.components`.
13
+ */
14
+ codeblock?: CodeBlockProps;
15
+ /**
16
+ * Wrap in React `<Suspense />` and provide a fallback.
17
+ *
18
+ * @defaultValue true
19
+ */
20
+ wrapInSuspense?: boolean;
21
+ options?: DistributiveOmit<UseShikiOptions, 'lang'>;
22
+ }
23
+ type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;
24
+ declare function DynamicCodeBlock({
25
+ lang,
26
+ code,
27
+ codeblock,
28
+ options,
29
+ wrapInSuspense
30
+ }: DynamicCodeblockProps): react_jsx_runtime0.JSX.Element;
31
+ //#endregion
32
+ export { DynamicCodeBlock, DynamicCodeblockProps };
33
+ //# sourceMappingURL=dynamic-codeblock.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-codeblock.core.d.ts","names":[],"sources":["../../src/components/dynamic-codeblock.core.tsx"],"mappings":";;;;;UAciB,qBAAA;EACf,IAAA;EACA,IAAA;EAFe;;;;;EAQf,SAAA,GAAY,cAAA;EAOc;;;;;EAD1B,cAAA;EACA,OAAA,GAAU,gBAAA,CAAiB,eAAA;AAAA;AAAA,KAGxB,gBAAA,cAA8B,WAAA,IAAe,CAAA,mBAAoB,IAAA,CAAK,CAAA,EAAG,CAAA;AAAA,iBAkB9D,gBAAA,CAAA;EACd,IAAA;EACA,IAAA;EACA,SAAA;EACA,OAAA;EACA;AAAA,GACC,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,66 @@
1
+ 'use client';
2
+
3
+ import { cn } from "../utils/cn.js";
4
+ import { CodeBlock, Pre } from "./codeblock.js";
5
+ import { Suspense, createContext, use, useDeferredValue, useId } from "react";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { useShiki } from "@hanzo/docs-core/highlight/core/client";
8
+
9
+ //#region src/components/dynamic-codeblock.core.tsx
10
+ const PropsContext = createContext(void 0);
11
+ function DefaultPre(props) {
12
+ const extraProps = use(PropsContext);
13
+ return /* @__PURE__ */ jsx(CodeBlock, {
14
+ ...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
28
+ }
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
+ });
47
+ return children;
48
+ }
49
+ function Placeholder({ code, components = {} }) {
50
+ const { pre: Pre = "pre", code: Code = "code" } = components;
51
+ return /* @__PURE__ */ jsx(Pre, { 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
+ }
63
+
64
+ //#endregion
65
+ export { DynamicCodeBlock };
66
+ //# sourceMappingURL=dynamic-codeblock.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-codeblock.core.js","names":[],"sources":["../../src/components/dynamic-codeblock.core.tsx"],"sourcesContent":["'use client';\nimport { CodeBlock, type CodeBlockProps, Pre } from '@/components/codeblock';\nimport { useShiki, type UseShikiOptions } from '@hanzo/docs-core/highlight/core/client';\nimport { cn } from '@/utils/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?: DistributiveOmit<UseShikiOptions, 'lang'>;\n}\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\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: UseShikiOptions = {\n lang,\n ...options,\n components: {\n pre: DefaultPre,\n ...options?.components,\n },\n };\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: UseShikiOptions['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: UseShikiOptions }) {\n return useShiki(code, options, [id, options.lang, code]);\n}\n"],"mappings":";;;;;;;;;AAkCA,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,eAAgC;EACpC;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,KAAK,MAAM,OAAO,MAAM,OAAO,WAAW;AAElD,QACE,oBAAC,iBACC,oBAAC,kBACE,KAAK,MAAM,KAAK,CAAC,KAAK,MAAM,MAC3B,oBAAC;EAAa,WAAU;YACrB;IADQ,EAEJ,CACP,GACG,GACH;;AAIV,SAAS,SAAS,EAAE,IAAI,MAAM,WAAmE;AAC/F,QAAO,SAAS,MAAM,SAAS;EAAC;EAAI,QAAQ;EAAM;EAAK,CAAC"}