@hanzo/docs-radix-ui 16.4.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.
- package/LICENSE +21 -0
- package/README.md +5 -0
- package/css/black.css +1 -0
- package/css/catppuccin.css +1 -0
- package/css/dusk.css +1 -0
- package/css/layouts/docs.css +1 -0
- package/css/layouts/home.css +1 -0
- package/css/layouts/notebook.css +1 -0
- package/css/neutral.css +1 -0
- package/css/ocean.css +1 -0
- package/css/preset.css +89 -0
- package/css/purple.css +1 -0
- package/css/shadcn.css +1 -0
- package/css/solar.css +1 -0
- package/css/style.css +9 -0
- package/css/vitepress.css +1 -0
- package/dist/_virtual/rolldown_runtime.js +36 -0
- package/dist/components/accordion.d.ts +25 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +70 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/banner.d.ts +35 -0
- package/dist/components/banner.d.ts.map +1 -0
- package/dist/components/banner.js +70 -0
- package/dist/components/banner.js.map +1 -0
- package/dist/components/callout.d.ts +43 -0
- package/dist/components/callout.d.ts.map +1 -0
- package/dist/components/callout.js +63 -0
- package/dist/components/callout.js.map +1 -0
- package/dist/components/card.d.ts +21 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +41 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/codeblock.d.ts +63 -0
- package/dist/components/codeblock.d.ts.map +1 -0
- package/dist/components/codeblock.js +126 -0
- package/dist/components/codeblock.js.map +1 -0
- package/dist/components/dialog/search-algolia.d.ts +39 -0
- package/dist/components/dialog/search-algolia.d.ts.map +1 -0
- package/dist/components/dialog/search-algolia.js +68 -0
- package/dist/components/dialog/search-algolia.js.map +1 -0
- package/dist/components/dialog/search-default.d.ts +44 -0
- package/dist/components/dialog/search-default.d.ts.map +1 -0
- package/dist/components/dialog/search-default.js +66 -0
- package/dist/components/dialog/search-default.js.map +1 -0
- package/dist/components/dialog/search-orama.d.ts +46 -0
- package/dist/components/dialog/search-orama.d.ts.map +1 -0
- package/dist/components/dialog/search-orama.js +73 -0
- package/dist/components/dialog/search-orama.js.map +1 -0
- package/dist/components/dialog/search.d.ts +113 -0
- package/dist/components/dialog/search.d.ts.map +1 -0
- package/dist/components/dialog/search.js +271 -0
- package/dist/components/dialog/search.js.map +1 -0
- package/dist/components/dynamic-codeblock.d.ts +32 -0
- package/dist/components/dynamic-codeblock.d.ts.map +1 -0
- package/dist/components/dynamic-codeblock.js +66 -0
- package/dist/components/dynamic-codeblock.js.map +1 -0
- package/dist/components/files.d.ts +35 -0
- package/dist/components/files.d.ts.map +1 -0
- package/dist/components/files.js +44 -0
- package/dist/components/files.js.map +1 -0
- package/dist/components/github-info.d.ts +19 -0
- package/dist/components/github-info.d.ts.map +1 -0
- package/dist/components/github-info.js +68 -0
- package/dist/components/github-info.js.map +1 -0
- package/dist/components/heading.d.ts +15 -0
- package/dist/components/heading.d.ts.map +1 -0
- package/dist/components/heading.js +29 -0
- package/dist/components/heading.js.map +1 -0
- package/dist/components/image-zoom-CtfZieBH.css +80 -0
- package/dist/components/image-zoom-CtfZieBH.css.map +1 -0
- package/dist/components/image-zoom.css +77 -0
- package/dist/components/image-zoom.d.ts +25 -0
- package/dist/components/image-zoom.d.ts.map +1 -0
- package/dist/components/image-zoom.js +36 -0
- package/dist/components/image-zoom.js.map +1 -0
- package/dist/components/image-zoom2.js +1 -0
- package/dist/components/inline-toc.d.ts +16 -0
- package/dist/components/inline-toc.d.ts.map +1 -0
- package/dist/components/inline-toc.js +30 -0
- package/dist/components/inline-toc.js.map +1 -0
- package/dist/components/sidebar/base.d.ts +109 -0
- package/dist/components/sidebar/base.d.ts.map +1 -0
- package/dist/components/sidebar/base.js +262 -0
- package/dist/components/sidebar/base.js.map +1 -0
- package/dist/components/sidebar/link-item.d.ts +24 -0
- package/dist/components/sidebar/link-item.d.ts.map +1 -0
- package/dist/components/sidebar/link-item.js +33 -0
- package/dist/components/sidebar/link-item.js.map +1 -0
- package/dist/components/sidebar/page-tree.d.ts +30 -0
- package/dist/components/sidebar/page-tree.d.ts.map +1 -0
- package/dist/components/sidebar/page-tree.js +58 -0
- package/dist/components/sidebar/page-tree.js.map +1 -0
- package/dist/components/sidebar/tabs/dropdown.d.ts +20 -0
- package/dist/components/sidebar/tabs/dropdown.d.ts.map +1 -0
- package/dist/components/sidebar/tabs/dropdown.js +78 -0
- package/dist/components/sidebar/tabs/dropdown.js.map +1 -0
- package/dist/components/sidebar/tabs/index.d.ts +27 -0
- package/dist/components/sidebar/tabs/index.d.ts.map +1 -0
- package/dist/components/sidebar/tabs/index.js +49 -0
- package/dist/components/sidebar/tabs/index.js.map +1 -0
- package/dist/components/steps.d.ts +17 -0
- package/dist/components/steps.d.ts.map +1 -0
- package/dist/components/steps.js +19 -0
- package/dist/components/steps.js.map +1 -0
- package/dist/components/tabs.d.ts +52 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +101 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/toc/clerk.d.ts +1 -0
- package/dist/components/toc/clerk.js +12 -0
- package/dist/components/toc/clerk.js.map +1 -0
- package/dist/components/toc/default.d.ts +1 -0
- package/dist/components/toc/default.js +12 -0
- package/dist/components/toc/default.js.map +1 -0
- package/dist/components/toc/index.d.ts +1 -0
- package/dist/components/toc/index.js +12 -0
- package/dist/components/toc/index.js.map +1 -0
- package/dist/components/type-table.d.ts +39 -0
- package/dist/components/type-table.d.ts.map +1 -0
- package/dist/components/type-table.js +109 -0
- package/dist/components/type-table.js.map +1 -0
- package/dist/components/ui/accordion.d.ts +32 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +46 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/button.d.ts +13 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +23 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +13 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +27 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts +16 -0
- package/dist/components/ui/navigation-menu.d.ts.map +1 -0
- package/dist/components/ui/navigation-menu.js +44 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/popover.d.ts +11 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +24 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +11 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +37 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +39 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +81 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/contexts/i18n.d.ts +1 -0
- package/dist/contexts/i18n.js +12 -0
- package/dist/contexts/i18n.js.map +1 -0
- package/dist/contexts/search.d.ts +8 -0
- package/dist/contexts/search.d.ts.map +1 -0
- package/dist/contexts/search.js +12 -0
- package/dist/contexts/search.js.map +1 -0
- package/dist/contexts/tree.d.ts +1 -0
- package/dist/contexts/tree.js +12 -0
- package/dist/contexts/tree.js.map +1 -0
- package/dist/i18n.d.ts +1 -0
- package/dist/i18n.js +3 -0
- package/dist/layouts/docs/client.d.ts +32 -0
- package/dist/layouts/docs/client.d.ts.map +1 -0
- package/dist/layouts/docs/client.js +68 -0
- package/dist/layouts/docs/client.js.map +1 -0
- package/dist/layouts/docs/index.d.ts +60 -0
- package/dist/layouts/docs/index.d.ts.map +1 -0
- package/dist/layouts/docs/index.js +179 -0
- package/dist/layouts/docs/index.js.map +1 -0
- package/dist/layouts/docs/page/client.d.ts +46 -0
- package/dist/layouts/docs/page/client.d.ts.map +1 -0
- package/dist/layouts/docs/page/client.js +227 -0
- package/dist/layouts/docs/page/client.js.map +1 -0
- package/dist/layouts/docs/page/index.d.ts +94 -0
- package/dist/layouts/docs/page/index.d.ts.map +1 -0
- package/dist/layouts/docs/page/index.js +104 -0
- package/dist/layouts/docs/page/index.js.map +1 -0
- package/dist/layouts/docs/sidebar.d.ts +58 -0
- package/dist/layouts/docs/sidebar.d.ts.map +1 -0
- package/dist/layouts/docs/sidebar.js +147 -0
- package/dist/layouts/docs/sidebar.js.map +1 -0
- package/dist/layouts/home/client.d.ts +19 -0
- package/dist/layouts/home/client.d.ts.map +1 -0
- package/dist/layouts/home/client.js +262 -0
- package/dist/layouts/home/client.js.map +1 -0
- package/dist/layouts/home/index.d.ts +17 -0
- package/dist/layouts/home/index.d.ts.map +1 -0
- package/dist/layouts/home/index.js +25 -0
- package/dist/layouts/home/index.js.map +1 -0
- package/dist/layouts/home/navbar.d.ts +14 -0
- package/dist/layouts/home/navbar.d.ts.map +1 -0
- package/dist/layouts/home/navbar.js +38 -0
- package/dist/layouts/home/navbar.js.map +1 -0
- package/dist/layouts/notebook/client.d.ts +47 -0
- package/dist/layouts/notebook/client.d.ts.map +1 -0
- package/dist/layouts/notebook/client.js +159 -0
- package/dist/layouts/notebook/client.js.map +1 -0
- package/dist/layouts/notebook/index.d.ts +38 -0
- package/dist/layouts/notebook/index.d.ts.map +1 -0
- package/dist/layouts/notebook/index.js +219 -0
- package/dist/layouts/notebook/index.js.map +1 -0
- package/dist/layouts/notebook/page/client.d.ts +46 -0
- package/dist/layouts/notebook/page/client.d.ts.map +1 -0
- package/dist/layouts/notebook/page/client.js +227 -0
- package/dist/layouts/notebook/page/client.js.map +1 -0
- package/dist/layouts/notebook/page/index.d.ts +94 -0
- package/dist/layouts/notebook/page/index.d.ts.map +1 -0
- package/dist/layouts/notebook/page/index.js +104 -0
- package/dist/layouts/notebook/page/index.js.map +1 -0
- package/dist/layouts/notebook/sidebar.d.ts +63 -0
- package/dist/layouts/notebook/sidebar.d.ts.map +1 -0
- package/dist/layouts/notebook/sidebar.js +147 -0
- package/dist/layouts/notebook/sidebar.js.map +1 -0
- package/dist/layouts/shared/index.d.ts +69 -0
- package/dist/layouts/shared/index.d.ts.map +1 -0
- package/dist/layouts/shared/index.js +39 -0
- package/dist/layouts/shared/index.js.map +1 -0
- package/dist/layouts/shared/language-toggle.d.ts +10 -0
- package/dist/layouts/shared/language-toggle.d.ts.map +1 -0
- package/dist/layouts/shared/language-toggle.js +47 -0
- package/dist/layouts/shared/language-toggle.js.map +1 -0
- package/dist/layouts/shared/search-toggle.d.ts +23 -0
- package/dist/layouts/shared/search-toggle.d.ts.map +1 -0
- package/dist/layouts/shared/search-toggle.js +56 -0
- package/dist/layouts/shared/search-toggle.js.map +1 -0
- package/dist/layouts/shared/theme-toggle.d.ts +14 -0
- package/dist/layouts/shared/theme-toggle.d.ts.map +1 -0
- package/dist/layouts/shared/theme-toggle.js +62 -0
- package/dist/layouts/shared/theme-toggle.js.map +1 -0
- package/dist/mdx.d.ts +38 -0
- package/dist/mdx.d.ts.map +1 -0
- package/dist/mdx.js +74 -0
- package/dist/mdx.js.map +1 -0
- package/dist/mdx.server.d.ts +17 -0
- package/dist/mdx.server.d.ts.map +1 -0
- package/dist/mdx.server.js +23 -0
- package/dist/mdx.server.js.map +1 -0
- package/dist/og.d.ts +1 -0
- package/dist/og.js +3 -0
- package/dist/page.d.ts +37 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +38 -0
- package/dist/page.js.map +1 -0
- package/dist/provider/base.d.ts +50 -0
- package/dist/provider/base.d.ts.map +1 -0
- package/dist/provider/base.js +39 -0
- package/dist/provider/base.js.map +1 -0
- package/dist/provider/next.d.ts +22 -0
- package/dist/provider/next.d.ts.map +1 -0
- package/dist/provider/next.js +21 -0
- package/dist/provider/next.js.map +1 -0
- package/dist/provider/react-router.d.ts +22 -0
- package/dist/provider/react-router.d.ts.map +1 -0
- package/dist/provider/react-router.js +21 -0
- package/dist/provider/react-router.js.map +1 -0
- package/dist/provider/tanstack.d.ts +22 -0
- package/dist/provider/tanstack.d.ts.map +1 -0
- package/dist/provider/tanstack.js +21 -0
- package/dist/provider/tanstack.js.map +1 -0
- package/dist/provider/waku.d.ts +22 -0
- package/dist/provider/waku.d.ts.map +1 -0
- package/dist/provider/waku.js +21 -0
- package/dist/provider/waku.js.map +1 -0
- package/dist/style.css +3255 -0
- package/dist/utils/use-copy-button.d.ts +1 -0
- package/dist/utils/use-copy-button.js +3 -0
- package/dist/utils/use-footer-items.d.ts +1 -0
- package/dist/utils/use-footer-items.js +3 -0
- package/dist/utils/use-is-scroll-top.d.ts +1 -0
- package/dist/utils/use-is-scroll-top.js +3 -0
- package/package.json +149 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { search_d_exports } from "../../contexts/search.js";
|
|
2
|
+
import * as react_jsx_runtime47 from "react/jsx-runtime";
|
|
3
|
+
import { ComponentProps, ReactNode } from "react";
|
|
4
|
+
import { DialogContent, DialogOverlay } from "@radix-ui/react-dialog";
|
|
5
|
+
import { HighlightedText, ReactSortedResult } from "@hanzo/docs-core/search";
|
|
6
|
+
|
|
7
|
+
//#region src/components/dialog/search.d.ts
|
|
8
|
+
type SearchItemType = (ReactSortedResult & {
|
|
9
|
+
external?: boolean;
|
|
10
|
+
}) | {
|
|
11
|
+
id: string;
|
|
12
|
+
type: 'action';
|
|
13
|
+
node: ReactNode;
|
|
14
|
+
onSelect: () => void;
|
|
15
|
+
};
|
|
16
|
+
interface SearchDialogProps extends search_d_exports.SharedProps {
|
|
17
|
+
search: string;
|
|
18
|
+
onSearchChange: (v: string) => void;
|
|
19
|
+
onSelect?: (item: SearchItemType) => void;
|
|
20
|
+
isLoading?: boolean;
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
declare function SearchDialog({
|
|
24
|
+
open,
|
|
25
|
+
onOpenChange,
|
|
26
|
+
search,
|
|
27
|
+
onSearchChange,
|
|
28
|
+
isLoading,
|
|
29
|
+
onSelect: onSelectProp,
|
|
30
|
+
children
|
|
31
|
+
}: SearchDialogProps): react_jsx_runtime47.JSX.Element;
|
|
32
|
+
declare function SearchDialogHeader(props: ComponentProps<'div'>): react_jsx_runtime47.JSX.Element;
|
|
33
|
+
declare function SearchDialogInput(props: ComponentProps<'input'>): react_jsx_runtime47.JSX.Element;
|
|
34
|
+
declare function SearchDialogClose({
|
|
35
|
+
children,
|
|
36
|
+
className,
|
|
37
|
+
...props
|
|
38
|
+
}: ComponentProps<'button'>): react_jsx_runtime47.JSX.Element;
|
|
39
|
+
declare function SearchDialogFooter(props: ComponentProps<'div'>): react_jsx_runtime47.JSX.Element;
|
|
40
|
+
declare function SearchDialogOverlay(props: ComponentProps<typeof DialogOverlay>): react_jsx_runtime47.JSX.Element;
|
|
41
|
+
declare function SearchDialogContent({
|
|
42
|
+
children,
|
|
43
|
+
...props
|
|
44
|
+
}: ComponentProps<typeof DialogContent>): react_jsx_runtime47.JSX.Element;
|
|
45
|
+
declare function SearchDialogList({
|
|
46
|
+
items,
|
|
47
|
+
Empty,
|
|
48
|
+
Item,
|
|
49
|
+
...props
|
|
50
|
+
}: Omit<ComponentProps<'div'>, 'children'> & {
|
|
51
|
+
items: SearchItemType[] | null | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* Renderer for empty list UI
|
|
54
|
+
*/
|
|
55
|
+
Empty?: () => ReactNode;
|
|
56
|
+
/**
|
|
57
|
+
* Renderer for items
|
|
58
|
+
*/
|
|
59
|
+
Item?: (props: {
|
|
60
|
+
item: SearchItemType;
|
|
61
|
+
onClick: () => void;
|
|
62
|
+
}) => ReactNode;
|
|
63
|
+
}): react_jsx_runtime47.JSX.Element;
|
|
64
|
+
declare function SearchDialogListItem({
|
|
65
|
+
item,
|
|
66
|
+
className,
|
|
67
|
+
children,
|
|
68
|
+
renderHighlights: render,
|
|
69
|
+
...props
|
|
70
|
+
}: ComponentProps<'button'> & {
|
|
71
|
+
renderHighlights?: typeof renderHighlights;
|
|
72
|
+
item: SearchItemType;
|
|
73
|
+
}): react_jsx_runtime47.JSX.Element;
|
|
74
|
+
declare function SearchDialogIcon(props: ComponentProps<'svg'>): react_jsx_runtime47.JSX.Element;
|
|
75
|
+
interface TagsListProps extends ComponentProps<'div'> {
|
|
76
|
+
tag?: string;
|
|
77
|
+
onTagChange: (tag: string | undefined) => void;
|
|
78
|
+
allowClear?: boolean;
|
|
79
|
+
}
|
|
80
|
+
declare function TagsList({
|
|
81
|
+
tag,
|
|
82
|
+
onTagChange,
|
|
83
|
+
allowClear,
|
|
84
|
+
...props
|
|
85
|
+
}: TagsListProps): react_jsx_runtime47.JSX.Element;
|
|
86
|
+
declare function TagsListItem({
|
|
87
|
+
value,
|
|
88
|
+
className,
|
|
89
|
+
...props
|
|
90
|
+
}: ComponentProps<'button'> & {
|
|
91
|
+
value: string;
|
|
92
|
+
}): react_jsx_runtime47.JSX.Element;
|
|
93
|
+
declare function renderHighlights(highlights: HighlightedText<ReactNode>[]): ReactNode;
|
|
94
|
+
declare function useSearch(): {
|
|
95
|
+
open: boolean;
|
|
96
|
+
onOpenChange: (open: boolean) => void;
|
|
97
|
+
search: string;
|
|
98
|
+
onSearchChange: (v: string) => void;
|
|
99
|
+
onSelect: (item: SearchItemType) => void;
|
|
100
|
+
isLoading: boolean;
|
|
101
|
+
};
|
|
102
|
+
declare function useTagsList(): {
|
|
103
|
+
value?: string;
|
|
104
|
+
onValueChange: (value: string | undefined) => void;
|
|
105
|
+
allowClear: boolean;
|
|
106
|
+
};
|
|
107
|
+
declare function useSearchList(): {
|
|
108
|
+
active: string | null;
|
|
109
|
+
setActive: (v: string | null) => void;
|
|
110
|
+
};
|
|
111
|
+
type SharedProps = search_d_exports.SharedProps;
|
|
112
|
+
export { SearchDialog, SearchDialogClose, SearchDialogContent, SearchDialogFooter, SearchDialogHeader, SearchDialogIcon, SearchDialogInput, SearchDialogList, SearchDialogListItem, SearchDialogOverlay, SearchDialogProps, SearchItemType, type SharedProps, TagsList, TagsListItem, TagsListProps, useSearch, useSearchList, useTagsList };
|
|
113
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -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, DialogContent, DialogOverlay, DialogTitle } from "@radix-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, {
|
|
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(props) {
|
|
88
|
+
return /* @__PURE__ */ jsx(DialogOverlay, {
|
|
89
|
+
...props,
|
|
90
|
+
className: cn("fixed inset-0 z-50 backdrop-blur-xs bg-fd-overlay data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out", props.className)
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function SearchDialogContent({ children, ...props }) {
|
|
94
|
+
const { text } = (0, i18n_exports.useI18n)();
|
|
95
|
+
return /* @__PURE__ */ jsxs(DialogContent, {
|
|
96
|
+
"aria-describedby": void 0,
|
|
97
|
+
...props,
|
|
98
|
+
className: 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-[state=closed]:animate-fd-dialog-out data-[state=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", props.className),
|
|
99
|
+
children: [/* @__PURE__ */ jsx(DialogTitle, {
|
|
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, DialogContent, DialogOverlay, DialogTitle } from '@radix-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 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>\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(props: ComponentProps<typeof DialogOverlay>) {\n return (\n <DialogOverlay\n {...props}\n className={cn(\n 'fixed inset-0 z-50 backdrop-blur-xs bg-fd-overlay data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out',\n props.className,\n )}\n />\n );\n}\n\nexport function SearchDialogContent({ children, ...props }: ComponentProps<typeof DialogContent>) {\n const { text } = useI18n();\n\n return (\n <DialogContent\n aria-describedby={undefined}\n {...props}\n className={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-[state=closed]:animate-fd-dialog-out data-[state=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 props.className,\n )}\n >\n <DialogTitle className=\"hidden\">{text.search}</DialogTitle>\n {children}\n </DialogContent>\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_runtime4 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_runtime4.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,kBAAA,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_runtime13 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_runtime13.JSX.Element>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { GithubInfo };
|
|
19
|
+
//# sourceMappingURL=github-info.d.ts.map
|