@hanzo/radix 16.3.1
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/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 +91 -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/components/accordion.d.ts +8 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +43 -0
- package/dist/components/banner.d.ts +24 -0
- package/dist/components/banner.d.ts.map +1 -0
- package/dist/components/banner.js +54 -0
- package/dist/components/callout.d.ts +19 -0
- package/dist/components/callout.d.ts.map +1 -0
- package/dist/components/callout.js +34 -0
- package/dist/components/card.d.ts +11 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +10 -0
- package/dist/components/codeblock.d.ts +42 -0
- package/dist/components/codeblock.d.ts.map +1 -0
- package/dist/components/codeblock.js +68 -0
- package/dist/components/dialog/search-algolia.d.ts +25 -0
- package/dist/components/dialog/search-algolia.d.ts.map +1 -0
- package/dist/components/dialog/search-algolia.js +35 -0
- package/dist/components/dialog/search-default.d.ts +29 -0
- package/dist/components/dialog/search-default.d.ts.map +1 -0
- package/dist/components/dialog/search-default.js +40 -0
- package/dist/components/dialog/search-orama.d.ts +30 -0
- package/dist/components/dialog/search-orama.d.ts.map +1 -0
- package/dist/components/dialog/search-orama.js +40 -0
- package/dist/components/dialog/search.d.ts +72 -0
- package/dist/components/dialog/search.d.ts.map +1 -0
- package/dist/components/dialog/search.js +192 -0
- package/dist/components/dynamic-codeblock.d.ts +21 -0
- package/dist/components/dynamic-codeblock.d.ts.map +1 -0
- package/dist/components/dynamic-codeblock.js +33 -0
- package/dist/components/files.d.ts +19 -0
- package/dist/components/files.d.ts.map +1 -0
- package/dist/components/files.js +18 -0
- package/dist/components/github-info.d.ts +8 -0
- package/dist/components/github-info.d.ts.map +1 -0
- package/dist/components/github-info.js +53 -0
- package/dist/components/heading.d.ts +8 -0
- package/dist/components/heading.d.ts.map +1 -0
- package/dist/components/heading.js +9 -0
- package/dist/components/image-zoom.css +77 -0
- package/dist/components/image-zoom.d.ts +16 -0
- package/dist/components/image-zoom.d.ts.map +1 -0
- package/dist/components/image-zoom.js +23 -0
- package/dist/components/inline-toc.d.ts +8 -0
- package/dist/components/inline-toc.d.ts.map +1 -0
- package/dist/components/inline-toc.js +10 -0
- package/dist/components/sidebar/base.d.ts +72 -0
- package/dist/components/sidebar/base.d.ts.map +1 -0
- package/dist/components/sidebar/base.js +186 -0
- package/dist/components/sidebar/link-item.d.ts +11 -0
- package/dist/components/sidebar/link-item.d.ts.map +1 -0
- package/dist/components/sidebar/link-item.js +13 -0
- package/dist/components/sidebar/page-tree.d.ts +19 -0
- package/dist/components/sidebar/page-tree.d.ts.map +1 -0
- package/dist/components/sidebar/page-tree.js +34 -0
- package/dist/components/sidebar/tabs/dropdown.d.ts +11 -0
- package/dist/components/sidebar/tabs/dropdown.d.ts.map +1 -0
- package/dist/components/sidebar/tabs/dropdown.js +34 -0
- package/dist/components/sidebar/tabs/index.d.ts +21 -0
- package/dist/components/sidebar/tabs/index.d.ts.map +1 -0
- package/dist/components/sidebar/tabs/index.js +49 -0
- package/dist/components/steps.d.ts +8 -0
- package/dist/components/steps.d.ts.map +1 -0
- package/dist/components/steps.js +7 -0
- package/dist/components/tabs.d.ts +31 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +64 -0
- package/dist/components/toc/clerk.d.ts +2 -0
- package/dist/components/toc/clerk.d.ts.map +1 -0
- package/dist/components/toc/clerk.js +1 -0
- package/dist/components/toc/default.d.ts +2 -0
- package/dist/components/toc/default.d.ts.map +1 -0
- package/dist/components/toc/default.js +1 -0
- package/dist/components/toc/index.d.ts +2 -0
- package/dist/components/toc/index.d.ts.map +1 -0
- package/dist/components/toc/index.js +1 -0
- package/dist/components/type-table.d.ts +32 -0
- package/dist/components/type-table.d.ts.map +1 -0
- package/dist/components/type-table.js +28 -0
- package/dist/components/ui/accordion.d.ts +8 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +20 -0
- package/dist/components/ui/button.d.ts +8 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +20 -0
- package/dist/components/ui/collapsible.d.ts +9 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +17 -0
- package/dist/components/ui/navigation-menu.d.ts +13 -0
- package/dist/components/ui/navigation-menu.d.ts.map +1 -0
- package/dist/components/ui/navigation-menu.js +17 -0
- package/dist/components/ui/popover.d.ts +8 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +11 -0
- package/dist/components/ui/scroll-area.d.ts +8 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +11 -0
- package/dist/components/ui/tabs.d.ts +21 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +79 -0
- package/dist/contexts/i18n.d.ts +2 -0
- package/dist/contexts/i18n.d.ts.map +1 -0
- package/dist/contexts/i18n.js +2 -0
- package/dist/contexts/search.d.ts +2 -0
- package/dist/contexts/search.d.ts.map +1 -0
- package/dist/contexts/search.js +2 -0
- package/dist/contexts/tree.d.ts +2 -0
- package/dist/contexts/tree.d.ts.map +1 -0
- package/dist/contexts/tree.js +2 -0
- package/dist/i18n.d.ts +2 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +1 -0
- package/dist/layouts/docs/client.d.ts +15 -0
- package/dist/layouts/docs/client.d.ts.map +1 -0
- package/dist/layouts/docs/client.js +41 -0
- package/dist/layouts/docs/index.d.ts +36 -0
- package/dist/layouts/docs/index.d.ts.map +1 -0
- package/dist/layouts/docs/index.js +69 -0
- package/dist/layouts/docs/page/client.d.ts +24 -0
- package/dist/layouts/docs/page/client.d.ts.map +1 -0
- package/dist/layouts/docs/page/client.js +119 -0
- package/dist/layouts/docs/page/index.d.ts +58 -0
- package/dist/layouts/docs/page/index.d.ts.map +1 -0
- package/dist/layouts/docs/page/index.js +51 -0
- package/dist/layouts/docs/sidebar.d.ts +17 -0
- package/dist/layouts/docs/sidebar.d.ts.map +1 -0
- package/dist/layouts/docs/sidebar.js +94 -0
- package/dist/layouts/home/client.d.ts +6 -0
- package/dist/layouts/home/client.d.ts.map +1 -0
- package/dist/layouts/home/client.js +113 -0
- package/dist/layouts/home/index.d.ts +12 -0
- package/dist/layouts/home/index.d.ts.map +1 -0
- package/dist/layouts/home/index.js +8 -0
- package/dist/layouts/home/navbar.d.ts +7 -0
- package/dist/layouts/home/navbar.d.ts.map +1 -0
- package/dist/layouts/home/navbar.js +16 -0
- package/dist/layouts/notebook/client.d.ts +23 -0
- package/dist/layouts/notebook/client.d.ts.map +1 -0
- package/dist/layouts/notebook/client.js +104 -0
- package/dist/layouts/notebook/index.d.ts +34 -0
- package/dist/layouts/notebook/index.d.ts.map +1 -0
- package/dist/layouts/notebook/index.js +92 -0
- package/dist/layouts/notebook/page/client.d.ts +24 -0
- package/dist/layouts/notebook/page/client.d.ts.map +1 -0
- package/dist/layouts/notebook/page/client.js +119 -0
- package/dist/layouts/notebook/page/index.d.ts +58 -0
- package/dist/layouts/notebook/page/index.d.ts.map +1 -0
- package/dist/layouts/notebook/page/index.js +51 -0
- package/dist/layouts/notebook/sidebar.d.ts +17 -0
- package/dist/layouts/notebook/sidebar.d.ts.map +1 -0
- package/dist/layouts/notebook/sidebar.js +91 -0
- package/dist/layouts/shared/index.d.ts +57 -0
- package/dist/layouts/shared/index.d.ts.map +1 -0
- package/dist/layouts/shared/index.js +23 -0
- package/dist/layouts/shared/language-toggle.d.ts +5 -0
- package/dist/layouts/shared/language-toggle.d.ts.map +1 -0
- package/dist/layouts/shared/language-toggle.js +24 -0
- package/dist/layouts/shared/search-toggle.d.ts +11 -0
- package/dist/layouts/shared/search-toggle.d.ts.map +1 -0
- package/dist/layouts/shared/search-toggle.js +27 -0
- package/dist/layouts/shared/theme-toggle.d.ts +5 -0
- package/dist/layouts/shared/theme-toggle.d.ts.map +1 -0
- package/dist/layouts/shared/theme-toggle.js +38 -0
- package/dist/mdx.d.ts +33 -0
- package/dist/mdx.d.ts.map +1 -0
- package/dist/mdx.js +40 -0
- package/dist/mdx.server.d.ts +13 -0
- package/dist/mdx.server.d.ts.map +1 -0
- package/dist/mdx.server.js +15 -0
- package/dist/og.d.ts +2 -0
- package/dist/og.d.ts.map +1 -0
- package/dist/og.js +1 -0
- package/dist/page.d.ts +27 -0
- package/dist/page.d.ts.map +1 -0
- package/dist/page.js +22 -0
- package/dist/provider/base.d.ts +40 -0
- package/dist/provider/base.d.ts.map +1 -0
- package/dist/provider/base.js +19 -0
- package/dist/provider/next.d.ts +14 -0
- package/dist/provider/next.d.ts.map +1 -0
- package/dist/provider/next.js +7 -0
- package/dist/provider/react-router.d.ts +14 -0
- package/dist/provider/react-router.d.ts.map +1 -0
- package/dist/provider/react-router.js +7 -0
- package/dist/provider/tanstack.d.ts +14 -0
- package/dist/provider/tanstack.d.ts.map +1 -0
- package/dist/provider/tanstack.js +7 -0
- package/dist/provider/waku.d.ts +14 -0
- package/dist/provider/waku.d.ts.map +1 -0
- package/dist/provider/waku.js +7 -0
- package/dist/style.css +3246 -0
- package/dist/utils/use-copy-button.d.ts +2 -0
- package/dist/utils/use-copy-button.d.ts.map +1 -0
- package/dist/utils/use-copy-button.js +1 -0
- package/dist/utils/use-footer-items.d.ts +2 -0
- package/dist/utils/use-footer-items.d.ts.map +1 -0
- package/dist/utils/use-footer-items.js +1 -0
- package/dist/utils/use-is-scroll-top.d.ts +2 -0
- package/dist/utils/use-is-scroll-top.d.ts.map +1 -0
- package/dist/utils/use-is-scroll-top.js +1 -0
- package/package.json +155 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
[data-rmiz] {
|
|
2
|
+
display: block;
|
|
3
|
+
position: relative;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
[data-rmiz-ghost] {
|
|
7
|
+
pointer-events: none;
|
|
8
|
+
position: absolute;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
[data-rmiz-btn-zoom],
|
|
12
|
+
[data-rmiz-btn-unzoom] {
|
|
13
|
+
display: none;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
[data-rmiz-content='found'] img {
|
|
17
|
+
cursor: zoom-in;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
[data-rmiz-modal][open] {
|
|
21
|
+
width: 100vw /* fallback */;
|
|
22
|
+
width: 100dvw;
|
|
23
|
+
|
|
24
|
+
height: 100vh /* fallback */;
|
|
25
|
+
height: 100dvh;
|
|
26
|
+
|
|
27
|
+
background-color: transparent;
|
|
28
|
+
max-width: none;
|
|
29
|
+
max-height: none;
|
|
30
|
+
margin: 0;
|
|
31
|
+
padding: 0;
|
|
32
|
+
position: fixed;
|
|
33
|
+
overflow: hidden;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
[data-rmiz-modal]:focus-visible {
|
|
37
|
+
outline: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
[data-rmiz-modal-overlay] {
|
|
41
|
+
transition: background-color 0.3s;
|
|
42
|
+
position: absolute;
|
|
43
|
+
inset: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
[data-rmiz-modal-overlay='visible'] {
|
|
47
|
+
background-color: var(--color-fd-background);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
[data-rmiz-modal-overlay='hidden'] {
|
|
51
|
+
background-color: transparent;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
[data-rmiz-modal-content] {
|
|
55
|
+
width: 100%;
|
|
56
|
+
height: 100%;
|
|
57
|
+
position: relative;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
[data-rmiz-modal]::backdrop {
|
|
61
|
+
display: none;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
[data-rmiz-modal-img] {
|
|
65
|
+
cursor: zoom-out;
|
|
66
|
+
image-rendering: high-quality;
|
|
67
|
+
transform-origin: 0 0;
|
|
68
|
+
transition: transform 0.3s;
|
|
69
|
+
position: absolute;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@media (prefers-reduced-motion: reduce) {
|
|
73
|
+
[data-rmiz-modal-overlay],
|
|
74
|
+
[data-rmiz-modal-img] {
|
|
75
|
+
transition-duration: 0.01ms !important;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ImageProps } from '@hanzo/docs/framework';
|
|
2
|
+
import type { ComponentProps } from 'react';
|
|
3
|
+
import { type UncontrolledProps } from 'react-medium-image-zoom';
|
|
4
|
+
import './image-zoom.css';
|
|
5
|
+
export type ImageZoomProps = ImageProps & {
|
|
6
|
+
/**
|
|
7
|
+
* Image props when zoom in
|
|
8
|
+
*/
|
|
9
|
+
zoomInProps?: ComponentProps<'img'>;
|
|
10
|
+
/**
|
|
11
|
+
* Props for `react-medium-image-zoom`
|
|
12
|
+
*/
|
|
13
|
+
rmiz?: UncontrolledProps;
|
|
14
|
+
};
|
|
15
|
+
export declare function ImageZoom({ zoomInProps, children, rmiz, ...props }: ImageZoomProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=image-zoom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-zoom.d.ts","sourceRoot":"","sources":["../../src/components/image-zoom.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,kBAAkB,CAAC;AAE1B,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG;IACxC;;OAEG;IACH,WAAW,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IAEpC;;OAEG;IACH,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B,CAAC;AAeF,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,cAAc,2CAoBhB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Image } from '@hanzo/docs/framework';
|
|
4
|
+
import Zoom from 'react-medium-image-zoom';
|
|
5
|
+
import './image-zoom.css';
|
|
6
|
+
function getImageSrc(src) {
|
|
7
|
+
if (typeof src === 'string')
|
|
8
|
+
return src;
|
|
9
|
+
if (typeof src === 'object') {
|
|
10
|
+
// Next.js
|
|
11
|
+
if ('default' in src)
|
|
12
|
+
return src.default.src;
|
|
13
|
+
return src.src;
|
|
14
|
+
}
|
|
15
|
+
return '';
|
|
16
|
+
}
|
|
17
|
+
export function ImageZoom({ zoomInProps, children, rmiz, ...props }) {
|
|
18
|
+
return (_jsx(Zoom, { zoomMargin: 20, wrapElement: "span", ...rmiz, zoomImg: {
|
|
19
|
+
src: getImageSrc(props.src),
|
|
20
|
+
sizes: undefined,
|
|
21
|
+
...zoomInProps,
|
|
22
|
+
}, children: children ?? (_jsx(Image, { sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 70vw, 900px", ...props })) }));
|
|
23
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { TOCItemType } from '@hanzo/docs/toc';
|
|
2
|
+
import { Collapsible } from './ui/collapsible.js';
|
|
3
|
+
import type { ComponentProps } from 'react';
|
|
4
|
+
export interface InlineTocProps extends ComponentProps<typeof Collapsible> {
|
|
5
|
+
items: TOCItemType[];
|
|
6
|
+
}
|
|
7
|
+
export declare function InlineTOC({ items, ...props }: InlineTocProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=inline-toc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-toc.d.ts","sourceRoot":"","sources":["../../src/components/inline-toc.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,WAAW,EAGZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,OAAO,WAAW,CAAC;IACxE,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,2CA+B5D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronDown } from '@hanzo/ui/icons';
|
|
4
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from './ui/collapsible.js';
|
|
5
|
+
import { cn } from '@hanzo/ui/cn';
|
|
6
|
+
export function InlineTOC({ items, ...props }) {
|
|
7
|
+
return (_jsxs(Collapsible, { ...props, className: cn('not-prose rounded-lg border bg-fd-card text-fd-card-foreground', props.className), children: [_jsxs(CollapsibleTrigger, { className: "group inline-flex w-full items-center justify-between px-4 py-2.5 font-medium", children: [props.children ?? 'Table of Contents', _jsx(ChevronDown, { className: "size-4 transition-transform duration-200 group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { children: _jsx("div", { className: "flex flex-col p-4 pt-0 text-sm text-fd-muted-foreground", children: items.map((item) => (_jsx("a", { href: item.url, className: "border-s py-1.5 hover:text-fd-accent-foreground", style: {
|
|
8
|
+
paddingInlineStart: 12 * Math.max(item.depth - 1, 0),
|
|
9
|
+
}, children: item.title }, item.url))) }) })] }));
|
|
10
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type ComponentProps, type PointerEvent, type ReactNode, type RefObject } from 'react';
|
|
2
|
+
import { type LinkProps } from '@hanzo/docs/link';
|
|
3
|
+
import { type ScrollAreaProps } from '../../components/ui/scroll-area.js';
|
|
4
|
+
import { type CollapsibleContentProps, type CollapsibleTriggerProps } from '../../components/ui/collapsible.js';
|
|
5
|
+
interface SidebarContext {
|
|
6
|
+
open: boolean;
|
|
7
|
+
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
8
|
+
collapsed: boolean;
|
|
9
|
+
setCollapsed: React.Dispatch<React.SetStateAction<boolean>>;
|
|
10
|
+
/**
|
|
11
|
+
* When set to false, don't close the sidebar when navigate to another page
|
|
12
|
+
*/
|
|
13
|
+
closeOnRedirect: RefObject<boolean>;
|
|
14
|
+
defaultOpenLevel: number;
|
|
15
|
+
prefetch: boolean;
|
|
16
|
+
mode: Mode;
|
|
17
|
+
}
|
|
18
|
+
export interface SidebarProviderProps {
|
|
19
|
+
/**
|
|
20
|
+
* Open folders by default if their level is lower or equal to a specific level
|
|
21
|
+
* (Starting from 1)
|
|
22
|
+
*
|
|
23
|
+
* @defaultValue 0
|
|
24
|
+
*/
|
|
25
|
+
defaultOpenLevel?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Prefetch links
|
|
28
|
+
*
|
|
29
|
+
* @defaultValue true
|
|
30
|
+
*/
|
|
31
|
+
prefetch?: boolean;
|
|
32
|
+
children?: ReactNode;
|
|
33
|
+
}
|
|
34
|
+
type Mode = 'drawer' | 'full';
|
|
35
|
+
declare const SidebarContext: import("react").Context<SidebarContext | null>;
|
|
36
|
+
export declare function SidebarProvider({ defaultOpenLevel, prefetch, children, }: SidebarProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export declare function useSidebar(): SidebarContext;
|
|
38
|
+
export declare function useFolder(): {
|
|
39
|
+
open: boolean;
|
|
40
|
+
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
41
|
+
depth: number;
|
|
42
|
+
collapsible: boolean;
|
|
43
|
+
} | null;
|
|
44
|
+
export declare function useFolderDepth(): number;
|
|
45
|
+
export declare function SidebarContent({ children, }: {
|
|
46
|
+
children: (state: {
|
|
47
|
+
ref: RefObject<HTMLElement | null>;
|
|
48
|
+
collapsed: boolean;
|
|
49
|
+
hovered: boolean;
|
|
50
|
+
onPointerEnter: (event: PointerEvent) => void;
|
|
51
|
+
onPointerLeave: (event: PointerEvent) => void;
|
|
52
|
+
}) => ReactNode;
|
|
53
|
+
}): ReactNode;
|
|
54
|
+
export declare function SidebarDrawerOverlay(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element | undefined;
|
|
55
|
+
export declare function SidebarDrawerContent({ className, children, ...props }: ComponentProps<'aside'>): import("react/jsx-runtime").JSX.Element | undefined;
|
|
56
|
+
export declare function SidebarViewport(props: ScrollAreaProps): import("react/jsx-runtime").JSX.Element;
|
|
57
|
+
export declare function SidebarSeparator(props: ComponentProps<'p'>): import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
export declare function SidebarItem({ icon, children, ...props }: LinkProps & {
|
|
59
|
+
icon?: ReactNode;
|
|
60
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
61
|
+
export declare function SidebarFolder({ defaultOpen: defaultOpenProp, collapsible, active, children, ...props }: ComponentProps<'div'> & {
|
|
62
|
+
active?: boolean;
|
|
63
|
+
defaultOpen?: boolean;
|
|
64
|
+
collapsible?: boolean;
|
|
65
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
66
|
+
export declare function SidebarFolderTrigger({ children, ...props }: CollapsibleTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
67
|
+
export declare function SidebarFolderLink({ children, ...props }: LinkProps): import("react/jsx-runtime").JSX.Element;
|
|
68
|
+
export declare function SidebarFolderContent(props: CollapsibleContentProps): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
export declare function SidebarTrigger({ children, ...props }: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
|
|
70
|
+
export declare function SidebarCollapseTrigger(props: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/base.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronDown, ExternalLink } from '@hanzo/ui/icons';
|
|
4
|
+
import { createContext, use, useEffect, useMemo, useRef, useState, } from 'react';
|
|
5
|
+
import Link from '@hanzo/docs/link';
|
|
6
|
+
import { useOnChange } from '@hanzo/docs/utils/use-on-change';
|
|
7
|
+
import { cn } from '@hanzo/ui/cn';
|
|
8
|
+
import { ScrollArea, ScrollViewport, } from '../../components/ui/scroll-area.js';
|
|
9
|
+
import { isActive } from '@hanzo/ui/urls';
|
|
10
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '../../components/ui/collapsible.js';
|
|
11
|
+
import { useMediaQuery } from '@hanzo/docs/utils/use-media-query';
|
|
12
|
+
import { Presence } from '@radix-ui/react-presence';
|
|
13
|
+
import scrollIntoView from 'scroll-into-view-if-needed';
|
|
14
|
+
import { usePathname } from '@hanzo/docs/framework';
|
|
15
|
+
const SidebarContext = createContext(null);
|
|
16
|
+
const FolderContext = createContext(null);
|
|
17
|
+
export function SidebarProvider({ defaultOpenLevel = 0, prefetch = true, children, }) {
|
|
18
|
+
const closeOnRedirect = useRef(true);
|
|
19
|
+
const [open, setOpen] = useState(false);
|
|
20
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
21
|
+
const pathname = usePathname();
|
|
22
|
+
const mode = useMediaQuery('(width < 768px)') ? 'drawer' : 'full';
|
|
23
|
+
useOnChange(pathname, () => {
|
|
24
|
+
if (closeOnRedirect.current) {
|
|
25
|
+
setOpen(false);
|
|
26
|
+
}
|
|
27
|
+
closeOnRedirect.current = true;
|
|
28
|
+
});
|
|
29
|
+
return (_jsx(SidebarContext, { value: useMemo(() => ({
|
|
30
|
+
open,
|
|
31
|
+
setOpen,
|
|
32
|
+
collapsed,
|
|
33
|
+
setCollapsed,
|
|
34
|
+
closeOnRedirect,
|
|
35
|
+
defaultOpenLevel,
|
|
36
|
+
prefetch,
|
|
37
|
+
mode,
|
|
38
|
+
}), [open, collapsed, defaultOpenLevel, prefetch, mode]), children: children }));
|
|
39
|
+
}
|
|
40
|
+
export function useSidebar() {
|
|
41
|
+
const ctx = use(SidebarContext);
|
|
42
|
+
if (!ctx)
|
|
43
|
+
throw new Error('Missing SidebarContext, make sure you have wrapped the component in <DocsLayout /> and the context is available.');
|
|
44
|
+
return ctx;
|
|
45
|
+
}
|
|
46
|
+
export function useFolder() {
|
|
47
|
+
return use(FolderContext);
|
|
48
|
+
}
|
|
49
|
+
export function useFolderDepth() {
|
|
50
|
+
return use(FolderContext)?.depth ?? 0;
|
|
51
|
+
}
|
|
52
|
+
export function SidebarContent({ children, }) {
|
|
53
|
+
const { collapsed, mode } = useSidebar();
|
|
54
|
+
const [hover, setHover] = useState(false);
|
|
55
|
+
const ref = useRef(null);
|
|
56
|
+
const timerRef = useRef(0);
|
|
57
|
+
useOnChange(collapsed, () => {
|
|
58
|
+
if (collapsed)
|
|
59
|
+
setHover(false);
|
|
60
|
+
});
|
|
61
|
+
if (mode !== 'full')
|
|
62
|
+
return;
|
|
63
|
+
function shouldIgnoreHover(e) {
|
|
64
|
+
const element = ref.current;
|
|
65
|
+
if (!element)
|
|
66
|
+
return true;
|
|
67
|
+
return (!collapsed ||
|
|
68
|
+
e.pointerType === 'touch' ||
|
|
69
|
+
element.getAnimations().length > 0);
|
|
70
|
+
}
|
|
71
|
+
return children({
|
|
72
|
+
ref,
|
|
73
|
+
collapsed,
|
|
74
|
+
hovered: hover,
|
|
75
|
+
onPointerEnter(e) {
|
|
76
|
+
if (shouldIgnoreHover(e))
|
|
77
|
+
return;
|
|
78
|
+
window.clearTimeout(timerRef.current);
|
|
79
|
+
setHover(true);
|
|
80
|
+
},
|
|
81
|
+
onPointerLeave(e) {
|
|
82
|
+
if (shouldIgnoreHover(e))
|
|
83
|
+
return;
|
|
84
|
+
window.clearTimeout(timerRef.current);
|
|
85
|
+
timerRef.current = window.setTimeout(() => setHover(false),
|
|
86
|
+
// if mouse is leaving the viewport, add a close delay
|
|
87
|
+
Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100
|
|
88
|
+
? 0
|
|
89
|
+
: 500);
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
export function SidebarDrawerOverlay(props) {
|
|
94
|
+
const { open, setOpen, mode } = useSidebar();
|
|
95
|
+
if (mode !== 'drawer')
|
|
96
|
+
return;
|
|
97
|
+
return (_jsx(Presence, { present: open, children: _jsx("div", { "data-state": open ? 'open' : 'closed', onClick: () => setOpen(false), ...props }) }));
|
|
98
|
+
}
|
|
99
|
+
export function SidebarDrawerContent({ className, children, ...props }) {
|
|
100
|
+
const { open, mode } = useSidebar();
|
|
101
|
+
const state = open ? 'open' : 'closed';
|
|
102
|
+
if (mode !== 'drawer')
|
|
103
|
+
return;
|
|
104
|
+
return (_jsx(Presence, { present: open, children: ({ present }) => (_jsx("aside", { id: "nd-sidebar-mobile", "data-state": state, className: cn(!present && 'invisible', className), ...props, children: children })) }));
|
|
105
|
+
}
|
|
106
|
+
export function SidebarViewport(props) {
|
|
107
|
+
return (_jsx(ScrollArea, { ...props, className: cn('min-h-0 flex-1', props.className), children: _jsx(ScrollViewport, { className: "p-4 overscroll-contain", style: {
|
|
108
|
+
maskImage: 'linear-gradient(to bottom, transparent, white 12px, white calc(100% - 12px), transparent)',
|
|
109
|
+
}, children: props.children }) }));
|
|
110
|
+
}
|
|
111
|
+
export function SidebarSeparator(props) {
|
|
112
|
+
const depth = useFolderDepth();
|
|
113
|
+
return (_jsx("p", { ...props, className: cn('inline-flex items-center gap-2 mb-1.5 px-2 mt-6 empty:mb-0', depth === 0 && 'first:mt-0', props.className), children: props.children }));
|
|
114
|
+
}
|
|
115
|
+
export function SidebarItem({ icon, children, ...props }) {
|
|
116
|
+
const pathname = usePathname();
|
|
117
|
+
const ref = useRef(null);
|
|
118
|
+
const { prefetch } = useSidebar();
|
|
119
|
+
const active = props.href !== undefined && isActive(props.href, pathname, false);
|
|
120
|
+
useAutoScroll(active, ref);
|
|
121
|
+
return (_jsxs(Link, { ref: ref, "data-active": active, prefetch: prefetch, ...props, children: [icon ?? (props.external ? _jsx(ExternalLink, {}) : null), children] }));
|
|
122
|
+
}
|
|
123
|
+
export function SidebarFolder({ defaultOpen: defaultOpenProp, collapsible = true, active = false, children, ...props }) {
|
|
124
|
+
const { defaultOpenLevel } = useSidebar();
|
|
125
|
+
const depth = useFolderDepth() + 1;
|
|
126
|
+
const defaultOpen = collapsible === false ||
|
|
127
|
+
active ||
|
|
128
|
+
(defaultOpenProp ?? defaultOpenLevel >= depth);
|
|
129
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
130
|
+
useOnChange(defaultOpen, (v) => {
|
|
131
|
+
if (v)
|
|
132
|
+
setOpen(v);
|
|
133
|
+
});
|
|
134
|
+
return (_jsx(Collapsible, { open: open, onOpenChange: setOpen, disabled: !collapsible, ...props, children: _jsx(FolderContext, { value: useMemo(() => ({ open, setOpen, depth, collapsible }), [collapsible, depth, open]), children: children }) }));
|
|
135
|
+
}
|
|
136
|
+
export function SidebarFolderTrigger({ children, ...props }) {
|
|
137
|
+
const { open, collapsible } = use(FolderContext);
|
|
138
|
+
if (collapsible) {
|
|
139
|
+
return (_jsxs(CollapsibleTrigger, { ...props, children: [children, _jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') })] }));
|
|
140
|
+
}
|
|
141
|
+
return _jsx("div", { ...props, children: children });
|
|
142
|
+
}
|
|
143
|
+
export function SidebarFolderLink({ children, ...props }) {
|
|
144
|
+
const ref = useRef(null);
|
|
145
|
+
const { open, setOpen, collapsible } = use(FolderContext);
|
|
146
|
+
const { prefetch } = useSidebar();
|
|
147
|
+
const pathname = usePathname();
|
|
148
|
+
const active = props.href !== undefined && isActive(props.href, pathname, false);
|
|
149
|
+
useAutoScroll(active, ref);
|
|
150
|
+
return (_jsxs(Link, { ref: ref, "data-active": active, onClick: (e) => {
|
|
151
|
+
if (!collapsible)
|
|
152
|
+
return;
|
|
153
|
+
if (e.target instanceof Element &&
|
|
154
|
+
e.target.matches('[data-icon], [data-icon] *')) {
|
|
155
|
+
setOpen(!open);
|
|
156
|
+
e.preventDefault();
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
setOpen(active ? !open : true);
|
|
160
|
+
}
|
|
161
|
+
}, prefetch: prefetch, ...props, children: [children, collapsible && (_jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') }))] }));
|
|
162
|
+
}
|
|
163
|
+
export function SidebarFolderContent(props) {
|
|
164
|
+
return _jsx(CollapsibleContent, { ...props, children: props.children });
|
|
165
|
+
}
|
|
166
|
+
export function SidebarTrigger({ children, ...props }) {
|
|
167
|
+
const { setOpen } = useSidebar();
|
|
168
|
+
return (_jsx("button", { "aria-label": "Open Sidebar", onClick: () => setOpen((prev) => !prev), ...props, children: children }));
|
|
169
|
+
}
|
|
170
|
+
export function SidebarCollapseTrigger(props) {
|
|
171
|
+
const { collapsed, setCollapsed } = useSidebar();
|
|
172
|
+
return (_jsx("button", { type: "button", "aria-label": "Collapse Sidebar", "data-collapsed": collapsed, onClick: () => {
|
|
173
|
+
setCollapsed((prev) => !prev);
|
|
174
|
+
}, ...props, children: props.children }));
|
|
175
|
+
}
|
|
176
|
+
function useAutoScroll(active, ref) {
|
|
177
|
+
const { mode } = useSidebar();
|
|
178
|
+
useEffect(() => {
|
|
179
|
+
if (active && ref.current) {
|
|
180
|
+
scrollIntoView(ref.current, {
|
|
181
|
+
boundary: document.getElementById(mode === 'drawer' ? 'nd-sidebar-mobile' : 'nd-sidebar'),
|
|
182
|
+
scrollMode: 'if-needed',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}, [active, mode, ref]);
|
|
186
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
import type * as Base from './base.js';
|
|
3
|
+
import type { LinkItemType } from '@hanzo/ui/link-item';
|
|
4
|
+
type InternalComponents = Pick<typeof Base, 'SidebarFolder' | 'SidebarFolderLink' | 'SidebarFolderContent' | 'SidebarFolderTrigger' | 'SidebarItem'>;
|
|
5
|
+
export declare function createLinkItemRenderer({ SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, }: InternalComponents): ({ item, ...props }: HTMLAttributes<HTMLElement> & {
|
|
6
|
+
item: Exclude<LinkItemType, {
|
|
7
|
+
type: "icon";
|
|
8
|
+
}>;
|
|
9
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=link-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-item.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/link-item.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,KAAK,kBAAkB,GAAG,IAAI,CAC5B,OAAO,IAAI,EACT,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,aAAa,CAChB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,GACZ,EAAE,kBAAkB,IAIa,oBAG7B,cAAc,CAAC,WAAW,CAAC,GAAG;IAC/B,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,6CAoCF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export function createLinkItemRenderer({ SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarItem, }) {
|
|
3
|
+
/**
|
|
4
|
+
* Render sidebar items from page tree
|
|
5
|
+
*/
|
|
6
|
+
return function SidebarLinkItem({ item, ...props }) {
|
|
7
|
+
if (item.type === 'custom')
|
|
8
|
+
return _jsx("div", { ...props, children: item.children });
|
|
9
|
+
if (item.type === 'menu')
|
|
10
|
+
return (_jsxs(SidebarFolder, { ...props, children: [item.url ? (_jsxs(SidebarFolderLink, { href: item.url, external: item.external, children: [item.icon, item.text] })) : (_jsxs(SidebarFolderTrigger, { children: [item.icon, item.text] })), _jsx(SidebarFolderContent, { children: item.items.map((child, i) => (_jsx(SidebarLinkItem, { item: child }, i))) })] }));
|
|
11
|
+
return (_jsx(SidebarItem, { href: item.url, icon: item.icon, external: item.external, ...props, children: item.text }));
|
|
12
|
+
};
|
|
13
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type FC, type ReactNode } from 'react';
|
|
2
|
+
import type * as PageTree from '@hanzo/docs/page-tree';
|
|
3
|
+
import type * as Base from './base.js';
|
|
4
|
+
export interface SidebarPageTreeComponents {
|
|
5
|
+
Item: FC<{
|
|
6
|
+
item: PageTree.Item;
|
|
7
|
+
}>;
|
|
8
|
+
Folder: FC<{
|
|
9
|
+
item: PageTree.Folder;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}>;
|
|
12
|
+
Separator: FC<{
|
|
13
|
+
item: PageTree.Separator;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
type InternalComponents = Pick<typeof Base, 'SidebarSeparator' | 'SidebarFolder' | 'SidebarFolderLink' | 'SidebarFolderContent' | 'SidebarFolderTrigger' | 'SidebarItem'>;
|
|
17
|
+
export declare function createPageTreeRenderer({ SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarSeparator, SidebarItem, }: InternalComponents): (components: Partial<SidebarPageTreeComponents>) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=page-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-tree.d.ts","sourceRoot":"","sources":["../../../src/components/sidebar/page-tree.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AACnE,OAAO,KAAK,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;AAEpC,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,EAAE,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAA;KAAE,CAAC,CAAC;IAClC,MAAM,EAAE,EAAE,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAC3D,SAAS,EAAE,EAAE,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;CAC7C;AAED,KAAK,kBAAkB,GAAG,IAAI,CAC5B,OAAO,IAAI,EACT,kBAAkB,GAClB,eAAe,GACf,mBAAmB,GACnB,sBAAsB,GACtB,sBAAsB,GACtB,aAAa,CAChB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EACrC,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,GACZ,EAAE,kBAAkB,IAuCjB,YAAY,OAAO,CAAC,yBAAyB,CAAC,6CA6CjD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useTreeContext, useTreePath } from '../../contexts/tree.js';
|
|
3
|
+
import { useMemo, Fragment } from 'react';
|
|
4
|
+
export function createPageTreeRenderer({ SidebarFolder, SidebarFolderContent, SidebarFolderLink, SidebarFolderTrigger, SidebarSeparator, SidebarItem, }) {
|
|
5
|
+
function PageTreeFolder({ item, children, }) {
|
|
6
|
+
const path = useTreePath();
|
|
7
|
+
return (_jsxs(SidebarFolder, { collapsible: item.collapsible, active: path.includes(item), defaultOpen: item.defaultOpen, children: [item.index ? (_jsxs(SidebarFolderLink, { href: item.index.url, external: item.index.external, children: [item.icon, item.name] })) : (_jsxs(SidebarFolderTrigger, { children: [item.icon, item.name] })), _jsx(SidebarFolderContent, { children: children })] }));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Render sidebar items from page tree
|
|
11
|
+
*/
|
|
12
|
+
return function SidebarPageTree(components) {
|
|
13
|
+
const { root } = useTreeContext();
|
|
14
|
+
const { Separator, Item, Folder = PageTreeFolder } = components;
|
|
15
|
+
return useMemo(() => {
|
|
16
|
+
function renderSidebarList(items) {
|
|
17
|
+
return items.map((item, i) => {
|
|
18
|
+
if (item.type === 'separator') {
|
|
19
|
+
if (Separator)
|
|
20
|
+
return _jsx(Separator, { item: item }, i);
|
|
21
|
+
return (_jsxs(SidebarSeparator, { children: [item.icon, item.name] }, i));
|
|
22
|
+
}
|
|
23
|
+
if (item.type === 'folder') {
|
|
24
|
+
return (_jsx(Folder, { item: item, children: renderSidebarList(item.children) }, i));
|
|
25
|
+
}
|
|
26
|
+
if (Item)
|
|
27
|
+
return _jsx(Item, { item: item }, item.url);
|
|
28
|
+
return (_jsx(SidebarItem, { href: item.url, external: item.external, icon: item.icon, children: item.name }, item.url));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return (_jsx(Fragment, { children: renderSidebarList(root.children) }, root.$id));
|
|
32
|
+
}, [Folder, Item, Separator, root]);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
2
|
+
import type { SidebarTab } from './index.js';
|
|
3
|
+
export interface SidebarTabWithProps extends SidebarTab {
|
|
4
|
+
props?: ComponentProps<'a'>;
|
|
5
|
+
}
|
|
6
|
+
export declare function SidebarTabsDropdown({ options, placeholder, ...props }: {
|
|
7
|
+
placeholder?: ReactNode;
|
|
8
|
+
options: SidebarTabWithProps[];
|
|
9
|
+
} & ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare function isTabActive(tab: SidebarTab, pathname: string): boolean;
|
|
11
|
+
//# sourceMappingURL=dropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../../../../src/components/sidebar/tabs/dropdown.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAW/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAEpC,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,KAAK,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,WAAW,EACX,GAAG,KAAK,EACT,EAAE;IACD,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC,GAAG,cAAc,CAAC,QAAQ,CAAC,2CAkF3B;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAI5D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Check, ChevronsUpDown } from '@hanzo/ui/icons';
|
|
4
|
+
import { useMemo, useState } from 'react';
|
|
5
|
+
import Link from '@hanzo/docs/link';
|
|
6
|
+
import { usePathname } from '@hanzo/docs/framework';
|
|
7
|
+
import { cn } from '@hanzo/ui/cn';
|
|
8
|
+
import { isActive, normalize } from '@hanzo/ui/urls';
|
|
9
|
+
import { useSidebar } from '../../../components/sidebar/base.js';
|
|
10
|
+
import { Popover, PopoverContent, PopoverTrigger, } from '../../../components/ui/popover.js';
|
|
11
|
+
export function SidebarTabsDropdown({ options, placeholder, ...props }) {
|
|
12
|
+
const [open, setOpen] = useState(false);
|
|
13
|
+
const { closeOnRedirect } = useSidebar();
|
|
14
|
+
const pathname = usePathname();
|
|
15
|
+
const selected = useMemo(() => {
|
|
16
|
+
return options.findLast((item) => isTabActive(item, pathname));
|
|
17
|
+
}, [options, pathname]);
|
|
18
|
+
const onClick = () => {
|
|
19
|
+
closeOnRedirect.current = false;
|
|
20
|
+
setOpen(false);
|
|
21
|
+
};
|
|
22
|
+
const item = selected ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "size-9 shrink-0 empty:hidden md:size-5", children: selected.icon }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium", children: selected.title }), _jsx("p", { className: "text-sm text-fd-muted-foreground empty:hidden md:hidden", children: selected.description })] })] })) : (placeholder);
|
|
23
|
+
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [item && (_jsxs(PopoverTrigger, { ...props, className: cn('flex items-center gap-2 rounded-lg p-2 border bg-fd-secondary/50 text-start text-fd-secondary-foreground transition-colors hover:bg-fd-accent data-[state=open]:bg-fd-accent data-[state=open]:text-fd-accent-foreground', props.className), children: [item, _jsx(ChevronsUpDown, { className: "shrink-0 ms-auto size-4 text-fd-muted-foreground" })] })), _jsx(PopoverContent, { className: "flex flex-col gap-1 w-(--radix-popover-trigger-width) p-1 fd-scroll-container", children: options.map((item) => {
|
|
24
|
+
const isActive = selected && item.url === selected.url;
|
|
25
|
+
if (!isActive && item.unlisted)
|
|
26
|
+
return;
|
|
27
|
+
return (_jsxs(Link, { href: item.url, onClick: onClick, ...item.props, className: cn('flex items-center gap-2 rounded-lg p-1.5 hover:bg-fd-accent hover:text-fd-accent-foreground', item.props?.className), children: [_jsx("div", { className: "shrink-0 size-9 md:mb-auto md:size-5 empty:hidden", children: item.icon }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium leading-none", children: item.title }), _jsx("p", { className: "text-[0.8125rem] text-fd-muted-foreground mt-1 empty:hidden", children: item.description })] }), _jsx(Check, { className: cn('shrink-0 ms-auto size-3.5 text-fd-primary', !isActive && 'invisible') })] }, item.url));
|
|
28
|
+
}) })] }));
|
|
29
|
+
}
|
|
30
|
+
export function isTabActive(tab, pathname) {
|
|
31
|
+
if (tab.urls)
|
|
32
|
+
return tab.urls.has(normalize(pathname));
|
|
33
|
+
return isActive(tab.url, pathname, true);
|
|
34
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type * as PageTree from '@hanzo/docs/page-tree';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
export interface SidebarTab {
|
|
4
|
+
/**
|
|
5
|
+
* Redirect URL of the folder, usually the index page
|
|
6
|
+
*/
|
|
7
|
+
url: string;
|
|
8
|
+
icon?: ReactNode;
|
|
9
|
+
title: ReactNode;
|
|
10
|
+
description?: ReactNode;
|
|
11
|
+
/**
|
|
12
|
+
* Detect from a list of urls
|
|
13
|
+
*/
|
|
14
|
+
urls?: Set<string>;
|
|
15
|
+
unlisted?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface GetSidebarTabsOptions {
|
|
18
|
+
transform?: (option: SidebarTab, node: PageTree.Folder) => SidebarTab | null;
|
|
19
|
+
}
|
|
20
|
+
export declare function getSidebarTabs(tree: PageTree.Root, { transform }?: GetSidebarTabsOptions): SidebarTab[];
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/sidebar/tabs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,KAAK,UAAU,GAAG,IAAI,CAAC;CAC9E;AAeD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,EAAE,SAA4B,EAAE,GAAE,qBAA0B,GAC3D,UAAU,EAAE,CAkCd"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
const defaultTransform = (option, node) => {
|
|
3
|
+
if (!node.icon)
|
|
4
|
+
return option;
|
|
5
|
+
return {
|
|
6
|
+
...option,
|
|
7
|
+
icon: (_jsx("div", { className: "size-full [&_svg]:size-full max-md:p-1.5 max-md:rounded-md max-md:border max-md:bg-fd-secondary", children: node.icon })),
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export function getSidebarTabs(tree, { transform = defaultTransform } = {}) {
|
|
11
|
+
const results = [];
|
|
12
|
+
function scanOptions(node, unlisted) {
|
|
13
|
+
if ('root' in node && node.root) {
|
|
14
|
+
const urls = getFolderUrls(node);
|
|
15
|
+
if (urls.size > 0) {
|
|
16
|
+
const option = {
|
|
17
|
+
url: urls.values().next().value ?? '',
|
|
18
|
+
title: node.name,
|
|
19
|
+
icon: node.icon,
|
|
20
|
+
unlisted,
|
|
21
|
+
description: node.description,
|
|
22
|
+
urls,
|
|
23
|
+
};
|
|
24
|
+
const mapped = transform ? transform(option, node) : option;
|
|
25
|
+
if (mapped)
|
|
26
|
+
results.push(mapped);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
for (const child of node.children) {
|
|
30
|
+
if (child.type === 'folder')
|
|
31
|
+
scanOptions(child, unlisted);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
scanOptions(tree);
|
|
35
|
+
if (tree.fallback)
|
|
36
|
+
scanOptions(tree.fallback, true);
|
|
37
|
+
return results;
|
|
38
|
+
}
|
|
39
|
+
function getFolderUrls(folder, output = new Set()) {
|
|
40
|
+
if (folder.index)
|
|
41
|
+
output.add(folder.index.url);
|
|
42
|
+
for (const child of folder.children) {
|
|
43
|
+
if (child.type === 'page' && !child.external)
|
|
44
|
+
output.add(child.url);
|
|
45
|
+
if (child.type === 'folder')
|
|
46
|
+
getFolderUrls(child, output);
|
|
47
|
+
}
|
|
48
|
+
return output;
|
|
49
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export declare function Steps({ children }: {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare function Step({ children }: {
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../src/components/steps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAE1D;AAED,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEzD"}
|