@hanzo/docs-base-ui 16.4.2

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 (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/css/black.css +1 -0
  4. package/css/catppuccin.css +1 -0
  5. package/css/dusk.css +1 -0
  6. package/css/layouts/docs.css +1 -0
  7. package/css/layouts/home.css +1 -0
  8. package/css/layouts/notebook.css +1 -0
  9. package/css/neutral.css +1 -0
  10. package/css/ocean.css +1 -0
  11. package/css/preset.css +10 -0
  12. package/css/purple.css +1 -0
  13. package/css/shadcn.css +1 -0
  14. package/css/solar.css +1 -0
  15. package/css/style.css +9 -0
  16. package/css/vitepress.css +1 -0
  17. package/dist/_virtual/rolldown_runtime.js +36 -0
  18. package/dist/components/accordion.d.ts +24 -0
  19. package/dist/components/accordion.d.ts.map +1 -0
  20. package/dist/components/accordion.js +71 -0
  21. package/dist/components/accordion.js.map +1 -0
  22. package/dist/components/banner.d.ts +35 -0
  23. package/dist/components/banner.d.ts.map +1 -0
  24. package/dist/components/banner.js +70 -0
  25. package/dist/components/banner.js.map +1 -0
  26. package/dist/components/callout.d.ts +43 -0
  27. package/dist/components/callout.d.ts.map +1 -0
  28. package/dist/components/callout.js +63 -0
  29. package/dist/components/callout.js.map +1 -0
  30. package/dist/components/card.d.ts +21 -0
  31. package/dist/components/card.d.ts.map +1 -0
  32. package/dist/components/card.js +41 -0
  33. package/dist/components/card.js.map +1 -0
  34. package/dist/components/codeblock.d.ts +68 -0
  35. package/dist/components/codeblock.d.ts.map +1 -0
  36. package/dist/components/codeblock.js +126 -0
  37. package/dist/components/codeblock.js.map +1 -0
  38. package/dist/components/dialog/search-algolia.d.ts +39 -0
  39. package/dist/components/dialog/search-algolia.d.ts.map +1 -0
  40. package/dist/components/dialog/search-algolia.js +68 -0
  41. package/dist/components/dialog/search-algolia.js.map +1 -0
  42. package/dist/components/dialog/search-default.d.ts +44 -0
  43. package/dist/components/dialog/search-default.d.ts.map +1 -0
  44. package/dist/components/dialog/search-default.js +66 -0
  45. package/dist/components/dialog/search-default.js.map +1 -0
  46. package/dist/components/dialog/search-orama.d.ts +46 -0
  47. package/dist/components/dialog/search-orama.d.ts.map +1 -0
  48. package/dist/components/dialog/search-orama.js +73 -0
  49. package/dist/components/dialog/search-orama.js.map +1 -0
  50. package/dist/components/dialog/search.d.ts +117 -0
  51. package/dist/components/dialog/search.d.ts.map +1 -0
  52. package/dist/components/dialog/search.js +271 -0
  53. package/dist/components/dialog/search.js.map +1 -0
  54. package/dist/components/dynamic-codeblock.d.ts +32 -0
  55. package/dist/components/dynamic-codeblock.d.ts.map +1 -0
  56. package/dist/components/dynamic-codeblock.js +66 -0
  57. package/dist/components/dynamic-codeblock.js.map +1 -0
  58. package/dist/components/files.d.ts +35 -0
  59. package/dist/components/files.d.ts.map +1 -0
  60. package/dist/components/files.js +44 -0
  61. package/dist/components/files.js.map +1 -0
  62. package/dist/components/github-info.d.ts +19 -0
  63. package/dist/components/github-info.d.ts.map +1 -0
  64. package/dist/components/github-info.js +68 -0
  65. package/dist/components/github-info.js.map +1 -0
  66. package/dist/components/heading.d.ts +15 -0
  67. package/dist/components/heading.d.ts.map +1 -0
  68. package/dist/components/heading.js +29 -0
  69. package/dist/components/heading.js.map +1 -0
  70. package/dist/components/image-zoom-CtfZieBH.css +80 -0
  71. package/dist/components/image-zoom-CtfZieBH.css.map +1 -0
  72. package/dist/components/image-zoom.css +77 -0
  73. package/dist/components/image-zoom.d.ts +25 -0
  74. package/dist/components/image-zoom.d.ts.map +1 -0
  75. package/dist/components/image-zoom.js +36 -0
  76. package/dist/components/image-zoom.js.map +1 -0
  77. package/dist/components/image-zoom2.js +1 -0
  78. package/dist/components/inline-toc.d.ts +17 -0
  79. package/dist/components/inline-toc.d.ts.map +1 -0
  80. package/dist/components/inline-toc.js +30 -0
  81. package/dist/components/inline-toc.js.map +1 -0
  82. package/dist/components/sidebar/base.d.ts +112 -0
  83. package/dist/components/sidebar/base.d.ts.map +1 -0
  84. package/dist/components/sidebar/base.js +284 -0
  85. package/dist/components/sidebar/base.js.map +1 -0
  86. package/dist/components/sidebar/link-item.d.ts +24 -0
  87. package/dist/components/sidebar/link-item.d.ts.map +1 -0
  88. package/dist/components/sidebar/link-item.js +33 -0
  89. package/dist/components/sidebar/link-item.js.map +1 -0
  90. package/dist/components/sidebar/page-tree.d.ts +30 -0
  91. package/dist/components/sidebar/page-tree.d.ts.map +1 -0
  92. package/dist/components/sidebar/page-tree.js +58 -0
  93. package/dist/components/sidebar/page-tree.js.map +1 -0
  94. package/dist/components/sidebar/tabs/dropdown.d.ts +20 -0
  95. package/dist/components/sidebar/tabs/dropdown.d.ts.map +1 -0
  96. package/dist/components/sidebar/tabs/dropdown.js +78 -0
  97. package/dist/components/sidebar/tabs/dropdown.js.map +1 -0
  98. package/dist/components/sidebar/tabs/index.d.ts +27 -0
  99. package/dist/components/sidebar/tabs/index.d.ts.map +1 -0
  100. package/dist/components/sidebar/tabs/index.js +49 -0
  101. package/dist/components/sidebar/tabs/index.js.map +1 -0
  102. package/dist/components/steps.d.ts +17 -0
  103. package/dist/components/steps.d.ts.map +1 -0
  104. package/dist/components/steps.js +19 -0
  105. package/dist/components/steps.js.map +1 -0
  106. package/dist/components/tabs.d.ts +52 -0
  107. package/dist/components/tabs.d.ts.map +1 -0
  108. package/dist/components/tabs.js +101 -0
  109. package/dist/components/tabs.js.map +1 -0
  110. package/dist/components/toc/clerk.d.ts +1 -0
  111. package/dist/components/toc/clerk.js +12 -0
  112. package/dist/components/toc/clerk.js.map +1 -0
  113. package/dist/components/toc/default.d.ts +1 -0
  114. package/dist/components/toc/default.js +12 -0
  115. package/dist/components/toc/default.js.map +1 -0
  116. package/dist/components/toc/index.d.ts +1 -0
  117. package/dist/components/toc/index.js +12 -0
  118. package/dist/components/toc/index.js.map +1 -0
  119. package/dist/components/type-table.d.ts +39 -0
  120. package/dist/components/type-table.d.ts.map +1 -0
  121. package/dist/components/type-table.js +109 -0
  122. package/dist/components/type-table.js.map +1 -0
  123. package/dist/components/ui/accordion.d.ts +31 -0
  124. package/dist/components/ui/accordion.d.ts.map +1 -0
  125. package/dist/components/ui/accordion.js +45 -0
  126. package/dist/components/ui/accordion.js.map +1 -0
  127. package/dist/components/ui/button.d.ts +13 -0
  128. package/dist/components/ui/button.d.ts.map +1 -0
  129. package/dist/components/ui/button.js +23 -0
  130. package/dist/components/ui/button.js.map +1 -0
  131. package/dist/components/ui/collapsible.d.ts +20 -0
  132. package/dist/components/ui/collapsible.d.ts.map +1 -0
  133. package/dist/components/ui/collapsible.js +20 -0
  134. package/dist/components/ui/collapsible.js.map +1 -0
  135. package/dist/components/ui/navigation-menu.d.ts +16 -0
  136. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  137. package/dist/components/ui/navigation-menu.js +34 -0
  138. package/dist/components/ui/navigation-menu.js.map +1 -0
  139. package/dist/components/ui/popover.d.ts +12 -0
  140. package/dist/components/ui/popover.d.ts.map +1 -0
  141. package/dist/components/ui/popover.js +27 -0
  142. package/dist/components/ui/popover.js.map +1 -0
  143. package/dist/components/ui/scroll-area.d.ts +12 -0
  144. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  145. package/dist/components/ui/scroll-area.js +36 -0
  146. package/dist/components/ui/scroll-area.js.map +1 -0
  147. package/dist/components/ui/tabs.d.ts +41 -0
  148. package/dist/components/ui/tabs.d.ts.map +1 -0
  149. package/dist/components/ui/tabs.js +81 -0
  150. package/dist/components/ui/tabs.js.map +1 -0
  151. package/dist/contexts/i18n.d.ts +1 -0
  152. package/dist/contexts/i18n.js +12 -0
  153. package/dist/contexts/i18n.js.map +1 -0
  154. package/dist/contexts/search.d.ts +8 -0
  155. package/dist/contexts/search.d.ts.map +1 -0
  156. package/dist/contexts/search.js +12 -0
  157. package/dist/contexts/search.js.map +1 -0
  158. package/dist/contexts/tree.d.ts +1 -0
  159. package/dist/contexts/tree.js +12 -0
  160. package/dist/contexts/tree.js.map +1 -0
  161. package/dist/i18n.d.ts +1 -0
  162. package/dist/i18n.js +3 -0
  163. package/dist/layouts/docs/client.d.ts +32 -0
  164. package/dist/layouts/docs/client.d.ts.map +1 -0
  165. package/dist/layouts/docs/client.js +68 -0
  166. package/dist/layouts/docs/client.js.map +1 -0
  167. package/dist/layouts/docs/index.d.ts +59 -0
  168. package/dist/layouts/docs/index.d.ts.map +1 -0
  169. package/dist/layouts/docs/index.js +178 -0
  170. package/dist/layouts/docs/index.js.map +1 -0
  171. package/dist/layouts/docs/page/client.d.ts +46 -0
  172. package/dist/layouts/docs/page/client.d.ts.map +1 -0
  173. package/dist/layouts/docs/page/client.js +227 -0
  174. package/dist/layouts/docs/page/client.js.map +1 -0
  175. package/dist/layouts/docs/page/index.d.ts +94 -0
  176. package/dist/layouts/docs/page/index.d.ts.map +1 -0
  177. package/dist/layouts/docs/page/index.js +104 -0
  178. package/dist/layouts/docs/page/index.js.map +1 -0
  179. package/dist/layouts/docs/sidebar.d.ts +63 -0
  180. package/dist/layouts/docs/sidebar.d.ts.map +1 -0
  181. package/dist/layouts/docs/sidebar.js +162 -0
  182. package/dist/layouts/docs/sidebar.js.map +1 -0
  183. package/dist/layouts/home/client.d.ts +19 -0
  184. package/dist/layouts/home/client.d.ts.map +1 -0
  185. package/dist/layouts/home/client.js +285 -0
  186. package/dist/layouts/home/client.js.map +1 -0
  187. package/dist/layouts/home/index.d.ts +12 -0
  188. package/dist/layouts/home/index.d.ts.map +1 -0
  189. package/dist/layouts/home/index.js +25 -0
  190. package/dist/layouts/home/index.js.map +1 -0
  191. package/dist/layouts/home/navbar.d.ts +20 -0
  192. package/dist/layouts/home/navbar.d.ts.map +1 -0
  193. package/dist/layouts/home/navbar.js +35 -0
  194. package/dist/layouts/home/navbar.js.map +1 -0
  195. package/dist/layouts/notebook/client.d.ts +47 -0
  196. package/dist/layouts/notebook/client.d.ts.map +1 -0
  197. package/dist/layouts/notebook/client.js +159 -0
  198. package/dist/layouts/notebook/client.js.map +1 -0
  199. package/dist/layouts/notebook/index.d.ts +38 -0
  200. package/dist/layouts/notebook/index.d.ts.map +1 -0
  201. package/dist/layouts/notebook/index.js +219 -0
  202. package/dist/layouts/notebook/index.js.map +1 -0
  203. package/dist/layouts/notebook/page/client.d.ts +46 -0
  204. package/dist/layouts/notebook/page/client.d.ts.map +1 -0
  205. package/dist/layouts/notebook/page/client.js +227 -0
  206. package/dist/layouts/notebook/page/client.js.map +1 -0
  207. package/dist/layouts/notebook/page/index.d.ts +94 -0
  208. package/dist/layouts/notebook/page/index.d.ts.map +1 -0
  209. package/dist/layouts/notebook/page/index.js +104 -0
  210. package/dist/layouts/notebook/page/index.js.map +1 -0
  211. package/dist/layouts/notebook/sidebar.d.ts +59 -0
  212. package/dist/layouts/notebook/sidebar.d.ts.map +1 -0
  213. package/dist/layouts/notebook/sidebar.js +133 -0
  214. package/dist/layouts/notebook/sidebar.js.map +1 -0
  215. package/dist/layouts/shared/index.d.ts +69 -0
  216. package/dist/layouts/shared/index.d.ts.map +1 -0
  217. package/dist/layouts/shared/index.js +39 -0
  218. package/dist/layouts/shared/index.js.map +1 -0
  219. package/dist/layouts/shared/language-toggle.d.ts +10 -0
  220. package/dist/layouts/shared/language-toggle.d.ts.map +1 -0
  221. package/dist/layouts/shared/language-toggle.js +47 -0
  222. package/dist/layouts/shared/language-toggle.js.map +1 -0
  223. package/dist/layouts/shared/search-toggle.d.ts +23 -0
  224. package/dist/layouts/shared/search-toggle.d.ts.map +1 -0
  225. package/dist/layouts/shared/search-toggle.js +56 -0
  226. package/dist/layouts/shared/search-toggle.js.map +1 -0
  227. package/dist/layouts/shared/theme-toggle.d.ts +14 -0
  228. package/dist/layouts/shared/theme-toggle.d.ts.map +1 -0
  229. package/dist/layouts/shared/theme-toggle.js +62 -0
  230. package/dist/layouts/shared/theme-toggle.js.map +1 -0
  231. package/dist/mdx.d.ts +38 -0
  232. package/dist/mdx.d.ts.map +1 -0
  233. package/dist/mdx.js +74 -0
  234. package/dist/mdx.js.map +1 -0
  235. package/dist/mdx.server.d.ts +17 -0
  236. package/dist/mdx.server.d.ts.map +1 -0
  237. package/dist/mdx.server.js +23 -0
  238. package/dist/mdx.server.js.map +1 -0
  239. package/dist/og.d.ts +1 -0
  240. package/dist/og.js +3 -0
  241. package/dist/page.d.ts +37 -0
  242. package/dist/page.d.ts.map +1 -0
  243. package/dist/page.js +38 -0
  244. package/dist/page.js.map +1 -0
  245. package/dist/provider/base.d.ts +50 -0
  246. package/dist/provider/base.d.ts.map +1 -0
  247. package/dist/provider/base.js +39 -0
  248. package/dist/provider/base.js.map +1 -0
  249. package/dist/provider/next.d.ts +22 -0
  250. package/dist/provider/next.d.ts.map +1 -0
  251. package/dist/provider/next.js +21 -0
  252. package/dist/provider/next.js.map +1 -0
  253. package/dist/provider/react-router.d.ts +22 -0
  254. package/dist/provider/react-router.d.ts.map +1 -0
  255. package/dist/provider/react-router.js +21 -0
  256. package/dist/provider/react-router.js.map +1 -0
  257. package/dist/provider/tanstack.d.ts +22 -0
  258. package/dist/provider/tanstack.d.ts.map +1 -0
  259. package/dist/provider/tanstack.js +21 -0
  260. package/dist/provider/tanstack.js.map +1 -0
  261. package/dist/provider/waku.d.ts +22 -0
  262. package/dist/provider/waku.d.ts.map +1 -0
  263. package/dist/provider/waku.js +21 -0
  264. package/dist/provider/waku.js.map +1 -0
  265. package/dist/style.css +3180 -0
  266. package/dist/utils/use-copy-button.d.ts +1 -0
  267. package/dist/utils/use-copy-button.js +3 -0
  268. package/dist/utils/use-footer-items.d.ts +1 -0
  269. package/dist/utils/use-footer-items.js +3 -0
  270. package/dist/utils/use-is-scroll-top.d.ts +1 -0
  271. package/dist/utils/use-is-scroll-top.js +3 -0
  272. package/package.json +132 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","names":[],"sources":["../../../src/components/dialog/search.tsx"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ 'use client';
2
+
3
+ import { buttonVariants } from "../ui/button.js";
4
+ import { i18n_exports } from "../../contexts/i18n.js";
5
+ 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 { ChevronRight, Hash, Search } from "lucide-react";
9
+ import { Fragment as Fragment$1, createContext, use, useCallback, useEffect, useEffectEvent, useMemo, useRef, useState } from "react";
10
+ import { cva } from "class-variance-authority";
11
+ import { useOnChange } from "@hanzo/docs-core/utils/use-on-change";
12
+ import scrollIntoView from "scroll-into-view-if-needed";
13
+ import { Dialog } from "@base-ui/react/dialog";
14
+
15
+ //#region src/components/dialog/search.tsx
16
+ const Context = createContext(null);
17
+ const ListContext = createContext(null);
18
+ const TagsListContext = createContext(null);
19
+ function SearchDialog({ open, onOpenChange, search, onSearchChange, isLoading = false, onSelect: onSelectProp, children }) {
20
+ const router = useRouter();
21
+ const onSelect = useEffectEvent((item) => {
22
+ if (item.type === "action") item.onSelect();
23
+ else if (item.external) window.open(item.url, "_blank")?.focus();
24
+ else router.push(item.url);
25
+ onOpenChange(false);
26
+ onSelectProp?.(item);
27
+ });
28
+ return /* @__PURE__ */ jsx(Dialog.Root, {
29
+ open,
30
+ onOpenChange,
31
+ children: /* @__PURE__ */ jsx(Context.Provider, {
32
+ value: useMemo(() => ({
33
+ open,
34
+ onOpenChange,
35
+ search,
36
+ onSearchChange,
37
+ onSelect,
38
+ isLoading
39
+ }), [
40
+ isLoading,
41
+ onOpenChange,
42
+ onSearchChange,
43
+ open,
44
+ search
45
+ ]),
46
+ children
47
+ })
48
+ });
49
+ }
50
+ function SearchDialogHeader(props) {
51
+ return /* @__PURE__ */ jsx("div", {
52
+ ...props,
53
+ className: cn("flex flex-row items-center gap-2 p-3", props.className)
54
+ });
55
+ }
56
+ function SearchDialogInput(props) {
57
+ const { text } = (0, i18n_exports.useI18n)();
58
+ const { search, onSearchChange } = useSearch();
59
+ return /* @__PURE__ */ jsx("input", {
60
+ ...props,
61
+ value: search,
62
+ onChange: (e) => onSearchChange(e.target.value),
63
+ placeholder: text.search,
64
+ className: "w-0 flex-1 bg-transparent text-lg placeholder:text-fd-muted-foreground focus-visible:outline-none"
65
+ });
66
+ }
67
+ function SearchDialogClose({ children = "ESC", className, ...props }) {
68
+ const { onOpenChange } = useSearch();
69
+ return /* @__PURE__ */ jsx("button", {
70
+ type: "button",
71
+ onClick: () => onOpenChange(false),
72
+ className: cn(buttonVariants({
73
+ color: "outline",
74
+ size: "sm",
75
+ className: "font-mono text-fd-muted-foreground"
76
+ }), className),
77
+ ...props,
78
+ children
79
+ });
80
+ }
81
+ function SearchDialogFooter(props) {
82
+ return /* @__PURE__ */ jsx("div", {
83
+ ...props,
84
+ className: cn("bg-fd-secondary/50 p-3 empty:hidden", props.className)
85
+ });
86
+ }
87
+ function SearchDialogOverlay({ className, ...props }) {
88
+ return /* @__PURE__ */ jsx(Dialog.Backdrop, {
89
+ ...props,
90
+ className: (s) => cn("fixed inset-0 z-50 backdrop-blur-xs bg-fd-overlay data-[open]:animate-fd-fade-in data-[closed]:animate-fd-fade-out", typeof className === "function" ? className(s) : className)
91
+ });
92
+ }
93
+ function SearchDialogContent({ children, className, ...props }) {
94
+ const { text } = (0, i18n_exports.useI18n)();
95
+ return /* @__PURE__ */ jsx(Dialog.Portal, { children: /* @__PURE__ */ jsxs(Dialog.Popup, {
96
+ "aria-describedby": void 0,
97
+ ...props,
98
+ className: (s) => cn("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", "*:border-b *:has-[+:last-child[data-empty=true]]:border-b-0 *:data-[empty=true]:border-b-0 *:last:border-b-0", typeof className === "function" ? className(s) : className),
99
+ children: [/* @__PURE__ */ jsx(Dialog.Title, {
100
+ className: "hidden",
101
+ children: text.search
102
+ }), children]
103
+ }) });
104
+ }
105
+ function SearchDialogList({ items = null, Empty = () => /* @__PURE__ */ jsx("div", {
106
+ className: "py-12 text-center text-sm text-fd-muted-foreground",
107
+ children: /* @__PURE__ */ jsx(i18n_exports.I18nLabel, { label: "searchNoResult" })
108
+ }), Item = (props$1) => /* @__PURE__ */ jsx(SearchDialogListItem, { ...props$1 }), ...props }) {
109
+ const ref = useRef(null);
110
+ const { onSelect } = useSearch();
111
+ const [active, setActive] = useState(() => items && items.length > 0 ? items[0].id : null);
112
+ const onKey = useEffectEvent((e) => {
113
+ if (!items || e.isComposing) return;
114
+ if (e.key === "ArrowDown" || e.key == "ArrowUp") {
115
+ let idx = items.findIndex((item) => item.id === active);
116
+ if (idx === -1) idx = 0;
117
+ else if (e.key === "ArrowDown") idx++;
118
+ else idx--;
119
+ setActive(items.at(idx % items.length)?.id ?? null);
120
+ e.preventDefault();
121
+ }
122
+ if (e.key === "Enter") {
123
+ const selected = items.find((item) => item.id === active);
124
+ if (selected) onSelect(selected);
125
+ e.preventDefault();
126
+ }
127
+ });
128
+ useEffect(() => {
129
+ const element = ref.current;
130
+ if (!element) return;
131
+ const observer = new ResizeObserver(() => {
132
+ const viewport$1 = element.firstElementChild;
133
+ element.style.setProperty("--fd-animated-height", `${viewport$1.clientHeight}px`);
134
+ });
135
+ const viewport = element.firstElementChild;
136
+ if (viewport) observer.observe(viewport);
137
+ window.addEventListener("keydown", onKey);
138
+ return () => {
139
+ observer.disconnect();
140
+ window.removeEventListener("keydown", onKey);
141
+ };
142
+ }, []);
143
+ useOnChange(items, () => {
144
+ if (items && items.length > 0) setActive(items[0].id);
145
+ });
146
+ return /* @__PURE__ */ jsx("div", {
147
+ ...props,
148
+ ref,
149
+ "data-empty": items === null,
150
+ className: cn("overflow-hidden h-(--fd-animated-height) transition-[height]", props.className),
151
+ children: /* @__PURE__ */ jsx("div", {
152
+ className: cn("w-full flex flex-col overflow-y-auto max-h-[460px] p-1", !items && "hidden"),
153
+ children: /* @__PURE__ */ jsxs(ListContext.Provider, {
154
+ value: useMemo(() => ({
155
+ active,
156
+ setActive
157
+ }), [active]),
158
+ children: [items?.length === 0 && Empty(), items?.map((item) => /* @__PURE__ */ jsx(Fragment$1, { children: Item({
159
+ item,
160
+ onClick: () => onSelect(item)
161
+ }) }, item.id))]
162
+ })
163
+ })
164
+ });
165
+ }
166
+ function SearchDialogListItem({ item, className, children, renderHighlights: render = renderHighlights, ...props }) {
167
+ const { active: activeId, setActive } = useSearchList();
168
+ const active = item.id === activeId;
169
+ if (item.type === "action") children ??= item.node;
170
+ else children ??= /* @__PURE__ */ jsxs(Fragment, { children: [
171
+ /* @__PURE__ */ jsx("div", {
172
+ className: "inline-flex items-center text-fd-muted-foreground text-xs empty:hidden",
173
+ 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))
174
+ }),
175
+ item.type !== "page" && /* @__PURE__ */ jsx("div", {
176
+ role: "none",
177
+ className: "absolute start-3 inset-y-0 w-px bg-fd-border"
178
+ }),
179
+ /* @__PURE__ */ jsxs("p", {
180
+ className: cn("min-w-0 truncate", item.type !== "page" && "ps-4", item.type === "page" || item.type === "heading" ? "font-medium" : "text-fd-popover-foreground/80"),
181
+ children: [item.type === "heading" && /* @__PURE__ */ jsx(Hash, { className: "inline me-1 size-4 text-fd-muted-foreground" }), item.contentWithHighlights ? render(item.contentWithHighlights) : item.content]
182
+ })
183
+ ] });
184
+ return /* @__PURE__ */ jsx("button", {
185
+ type: "button",
186
+ ref: useCallback((element) => {
187
+ if (active && element) scrollIntoView(element, {
188
+ scrollMode: "if-needed",
189
+ block: "nearest",
190
+ boundary: element.parentElement
191
+ });
192
+ }, [active]),
193
+ "aria-selected": active,
194
+ className: cn("relative select-none px-2.5 py-2 text-start text-sm rounded-lg", active && "bg-fd-accent text-fd-accent-foreground", className),
195
+ onPointerMove: () => setActive(item.id),
196
+ ...props,
197
+ children
198
+ });
199
+ }
200
+ function SearchDialogIcon(props) {
201
+ const { isLoading } = useSearch();
202
+ return /* @__PURE__ */ jsx(Search, {
203
+ ...props,
204
+ className: cn("size-5 text-fd-muted-foreground", isLoading && "animate-pulse duration-400", props.className)
205
+ });
206
+ }
207
+ const itemVariants = cva("rounded-md border px-2 py-0.5 text-xs font-medium text-fd-muted-foreground transition-colors", { variants: { active: { true: "bg-fd-accent text-fd-accent-foreground" } } });
208
+ function TagsList({ tag, onTagChange, allowClear = false, ...props }) {
209
+ return /* @__PURE__ */ jsx("div", {
210
+ ...props,
211
+ className: cn("flex items-center gap-1 flex-wrap", props.className),
212
+ children: /* @__PURE__ */ jsx(TagsListContext.Provider, {
213
+ value: useMemo(() => ({
214
+ value: tag,
215
+ onValueChange: onTagChange,
216
+ allowClear
217
+ }), [
218
+ allowClear,
219
+ onTagChange,
220
+ tag
221
+ ]),
222
+ children: props.children
223
+ })
224
+ });
225
+ }
226
+ function TagsListItem({ value, className, ...props }) {
227
+ const { onValueChange, value: selectedValue, allowClear } = useTagsList();
228
+ const selected = value === selectedValue;
229
+ return /* @__PURE__ */ jsx("button", {
230
+ type: "button",
231
+ "data-active": selected,
232
+ className: cn(itemVariants({
233
+ active: selected,
234
+ className
235
+ })),
236
+ onClick: () => {
237
+ onValueChange(selected && allowClear ? void 0 : value);
238
+ },
239
+ tabIndex: -1,
240
+ ...props,
241
+ children: props.children
242
+ });
243
+ }
244
+ function renderHighlights(highlights) {
245
+ return highlights.map((node, i) => {
246
+ if (node.styles?.highlight) return /* @__PURE__ */ jsx("span", {
247
+ className: "text-fd-primary underline",
248
+ children: node.content
249
+ }, i);
250
+ return /* @__PURE__ */ jsx(Fragment$1, { children: node.content }, i);
251
+ });
252
+ }
253
+ function useSearch() {
254
+ const ctx = use(Context);
255
+ if (!ctx) throw new Error("Missing <SearchDialog />");
256
+ return ctx;
257
+ }
258
+ function useTagsList() {
259
+ const ctx = use(TagsListContext);
260
+ if (!ctx) throw new Error("Missing <TagsList />");
261
+ return ctx;
262
+ }
263
+ function useSearchList() {
264
+ const ctx = use(ListContext);
265
+ if (!ctx) throw new Error("Missing <SearchDialogList />");
266
+ return ctx;
267
+ }
268
+
269
+ //#endregion
270
+ export { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogListItem, SearchDialogOverlay, TagsList, TagsListItem, useSearch, useSearchList, useTagsList };
271
+ //# sourceMappingURL=search.js.map
@@ -0,0 +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 useEffectEvent,\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 = 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,32 @@
1
+ import { CodeBlockProps } from "./codeblock.js";
2
+ import * as react_jsx_runtime10 from "react/jsx-runtime";
3
+ import { HighlightOptionsCommon, HighlightOptionsThemes } from "@hanzo/docs-core/highlight";
4
+
5
+ //#region src/components/dynamic-codeblock.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?: Omit<HighlightOptionsCommon, 'lang'> & HighlightOptionsThemes;
22
+ }
23
+ declare function DynamicCodeBlock({
24
+ lang,
25
+ code,
26
+ codeblock,
27
+ options,
28
+ wrapInSuspense
29
+ }: DynamicCodeblockProps): react_jsx_runtime10.JSX.Element;
30
+ //#endregion
31
+ export { DynamicCodeBlock, DynamicCodeblockProps };
32
+ //# sourceMappingURL=dynamic-codeblock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic-codeblock.d.ts","names":[],"sources":["../../src/components/dynamic-codeblock.tsx"],"sourcesContent":[],"mappings":";;;;;UAmBiB,qBAAA;;;EAAA;;;;;EAewD,SAAA,CAAA,EAP3D,cAO2D;EAmBzD;;;;;EAKd,cAAA,CAAA,EAAA,OAAA;EACC,OAAA,CAAA,EAzBS,IAyBT,CAzBc,sBAyBd,EAAA,MAAA,CAAA,GAzBgD,sBAyBhD;;AAAqB,iBANR,gBAAA,CAMQ;EAAA,IAAA;EAAA,IAAA;EAAA,SAAA;EAAA,OAAA;EAAA;AAAA,CAAA,EAArB,qBAAqB,CAAA,EAAA,mBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,66 @@
1
+ 'use client';
2
+
3
+ import { CodeBlock, Pre } from "./codeblock.js";
4
+ import { cn } from "@hanzo/docs-ui/cn";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { Suspense, createContext, use, useDeferredValue, useId } from "react";
7
+ import { useShiki } from "@hanzo/docs-core/highlight/client";
8
+
9
+ //#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, {
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$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
+ }
63
+
64
+ //#endregion
65
+ export { DynamicCodeBlock };
66
+ //# sourceMappingURL=dynamic-codeblock.js.map
@@ -0,0 +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"}
@@ -0,0 +1,35 @@
1
+ import { HTMLAttributes, ReactNode } from "react";
2
+
3
+ //#region src/components/files.d.ts
4
+ declare function Files({
5
+ className,
6
+ ...props
7
+ }: HTMLAttributes<HTMLDivElement>): React.ReactElement;
8
+ interface FileProps extends HTMLAttributes<HTMLDivElement> {
9
+ name: string;
10
+ icon?: ReactNode;
11
+ }
12
+ interface FolderProps extends HTMLAttributes<HTMLDivElement> {
13
+ name: string;
14
+ disabled?: boolean;
15
+ /**
16
+ * Open folder by default
17
+ *
18
+ * @defaultValue false
19
+ */
20
+ defaultOpen?: boolean;
21
+ }
22
+ declare function File({
23
+ name,
24
+ icon,
25
+ className,
26
+ ...rest
27
+ }: FileProps): React.ReactElement;
28
+ declare function Folder({
29
+ name,
30
+ defaultOpen,
31
+ ...props
32
+ }: FolderProps): React.ReactElement;
33
+ //#endregion
34
+ export { File, FileProps, Files, Folder, FolderProps };
35
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+
3
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./ui/collapsible.js";
4
+ import { cn } from "@hanzo/docs-ui/cn";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { File as File$1, Folder as Folder$1, FolderOpen } from "lucide-react";
7
+ import { useState } from "react";
8
+ import { cva } from "class-variance-authority";
9
+
10
+ //#region src/components/files.tsx
11
+ const itemVariants = cva("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");
12
+ function Files({ className, ...props }) {
13
+ return /* @__PURE__ */ jsx("div", {
14
+ className: cn("not-prose rounded-md border bg-fd-card p-2", className),
15
+ ...props,
16
+ children: props.children
17
+ });
18
+ }
19
+ function File({ name, icon = /* @__PURE__ */ jsx(File$1, {}), className, ...rest }) {
20
+ return /* @__PURE__ */ jsxs("div", {
21
+ className: cn(itemVariants({ className })),
22
+ ...rest,
23
+ children: [icon, name]
24
+ });
25
+ }
26
+ function Folder({ name, defaultOpen = false, ...props }) {
27
+ const [open, setOpen] = useState(defaultOpen);
28
+ return /* @__PURE__ */ jsxs(Collapsible, {
29
+ open,
30
+ onOpenChange: setOpen,
31
+ ...props,
32
+ children: [/* @__PURE__ */ jsxs(CollapsibleTrigger, {
33
+ className: cn(itemVariants({ className: "w-full" })),
34
+ children: [open ? /* @__PURE__ */ jsx(FolderOpen, {}) : /* @__PURE__ */ jsx(Folder$1, {}), name]
35
+ }), /* @__PURE__ */ jsx(CollapsibleContent, { children: /* @__PURE__ */ jsx("div", {
36
+ className: "ms-2 flex flex-col border-l ps-2",
37
+ children: props.children
38
+ }) })]
39
+ });
40
+ }
41
+
42
+ //#endregion
43
+ export { File, Files, Folder };
44
+ //# sourceMappingURL=files.js.map
@@ -0,0 +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"}
@@ -0,0 +1,19 @@
1
+ import * as react_jsx_runtime22 from "react/jsx-runtime";
2
+ import { AnchorHTMLAttributes } from "react";
3
+
4
+ //#region src/components/github-info.d.ts
5
+ declare function GithubInfo({
6
+ repo,
7
+ owner,
8
+ token,
9
+ baseUrl,
10
+ ...props
11
+ }: AnchorHTMLAttributes<HTMLAnchorElement> & {
12
+ owner: string;
13
+ repo: string;
14
+ token?: string;
15
+ baseUrl?: string;
16
+ }): Promise<react_jsx_runtime22.JSX.Element>;
17
+ //#endregion
18
+ export { GithubInfo };
19
+ //# sourceMappingURL=github-info.d.ts.map
@@ -0,0 +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,mBAAA,CAAA,GAAA,CAAA,OAAA,CATC"}
@@ -0,0 +1,68 @@
1
+ import { cn } from "@hanzo/docs-ui/cn";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Star } from "lucide-react";
4
+
5
+ //#region src/components/github-info.tsx
6
+ async function getRepoStarsAndForks(owner, repo, token, baseUrl = "https://api.github.com") {
7
+ const endpoint = `${baseUrl}/repos/${owner}/${repo}`;
8
+ const headers = new Headers({ "Content-Type": "application/json" });
9
+ if (token) headers.set("Authorization", `Bearer ${token}`);
10
+ const response = await fetch(endpoint, {
11
+ headers,
12
+ next: { revalidate: 60 }
13
+ });
14
+ if (!response.ok) {
15
+ const message = await response.text();
16
+ throw new Error(`Failed to fetch repository data: ${message}`);
17
+ }
18
+ const data = await response.json();
19
+ return {
20
+ stars: data.stargazers_count,
21
+ forks: data.forks_count
22
+ };
23
+ }
24
+ async function GithubInfo({ repo, owner, token, baseUrl, ...props }) {
25
+ const { stars } = await getRepoStarsAndForks(owner, repo, token, baseUrl);
26
+ const humanizedStars = humanizeNumber(stars);
27
+ return /* @__PURE__ */ jsxs("a", {
28
+ href: `https://github.com/${owner}/${repo}`,
29
+ rel: "noreferrer noopener",
30
+ target: "_blank",
31
+ ...props,
32
+ className: cn("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", props.className),
33
+ children: [/* @__PURE__ */ jsxs("p", {
34
+ className: "flex items-center gap-2 truncate",
35
+ children: [
36
+ /* @__PURE__ */ jsxs("svg", {
37
+ fill: "currentColor",
38
+ viewBox: "0 0 24 24",
39
+ className: "size-3.5",
40
+ children: [/* @__PURE__ */ jsx("title", { children: "GitHub" }), /* @__PURE__ */ jsx("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" })]
41
+ }),
42
+ owner,
43
+ "/",
44
+ repo
45
+ ]
46
+ }), /* @__PURE__ */ jsxs("p", {
47
+ className: "flex text-xs items-center gap-1 text-fd-muted-foreground",
48
+ children: [/* @__PURE__ */ jsx(Star, { className: "size-3" }), humanizedStars]
49
+ })]
50
+ });
51
+ }
52
+ /**
53
+ * Converts a number to a human-readable string with K suffix for thousands
54
+ * @example 1500 -> "1.5K", 1000000 -> "1000000"
55
+ */
56
+ function humanizeNumber(num) {
57
+ if (num < 1e3) return num.toString();
58
+ if (num < 1e5) {
59
+ const value = (num / 1e3).toFixed(1);
60
+ return `${value.endsWith(".0") ? value.slice(0, -2) : value}K`;
61
+ }
62
+ if (num < 1e6) return `${Math.floor(num / 1e3)}K`;
63
+ return num.toString();
64
+ }
65
+
66
+ //#endregion
67
+ export { GithubInfo };
68
+ //# sourceMappingURL=github-info.js.map
@@ -0,0 +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"}
@@ -0,0 +1,15 @@
1
+ import { ComponentPropsWithoutRef } from "react";
2
+
3
+ //#region src/components/heading.d.ts
4
+ type Types = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
5
+ type HeadingProps<T extends Types> = Omit<ComponentPropsWithoutRef<T>, 'as'> & {
6
+ as?: T;
7
+ };
8
+ declare function Heading<T extends Types = 'h1'>({
9
+ as,
10
+ className,
11
+ ...props
12
+ }: HeadingProps<T>): React.ReactElement;
13
+ //#endregion
14
+ export { Heading };
15
+ //# sourceMappingURL=heading.d.ts.map