fumadocs-ui 15.2.8 → 16.0.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/README.md +1 -1
- package/css/black.css +4 -2
- package/css/catppuccin.css +2 -0
- package/css/default.css +33 -0
- package/css/dusk.css +2 -0
- package/css/neutral.css +11 -8
- package/css/ocean.css +5 -3
- package/css/preset.css +237 -16
- package/css/purple.css +12 -10
- package/css/shadcn.css +31 -0
- package/css/shiki.css +78 -51
- package/css/solar.css +48 -0
- package/css/vitepress.css +3 -4
- package/dist/components/accordion.d.ts +6 -3
- package/dist/components/accordion.d.ts.map +1 -1
- package/dist/components/accordion.js +19 -11
- package/dist/components/banner.d.ts +8 -2
- package/dist/components/banner.d.ts.map +1 -1
- package/dist/components/banner.js +25 -30
- package/dist/components/callout.d.ts +2 -2
- package/dist/components/callout.d.ts.map +1 -1
- package/dist/components/callout.js +15 -18
- package/dist/components/card.d.ts.map +1 -1
- package/dist/components/card.js +2 -2
- package/dist/components/codeblock.d.ts +19 -23
- package/dist/components/codeblock.d.ts.map +1 -1
- package/dist/components/codeblock.js +55 -24
- package/dist/components/dialog/search-algolia.d.ts +5 -4
- package/dist/components/dialog/search-algolia.d.ts.map +1 -1
- package/dist/components/dialog/search-algolia.js +21 -7
- package/dist/components/dialog/search-default.d.ts +4 -2
- package/dist/components/dialog/search-default.d.ts.map +1 -1
- package/dist/components/dialog/search-default.js +22 -6
- package/dist/components/dialog/search-orama.d.ts +5 -3
- package/dist/components/dialog/search-orama.d.ts.map +1 -1
- package/dist/components/dialog/search-orama.js +21 -6
- package/dist/components/dialog/search.d.ts +61 -27
- package/dist/components/dialog/search.d.ts.map +1 -1
- package/dist/components/dialog/search.js +155 -67
- package/dist/components/dynamic-codeblock.d.ts +16 -2
- package/dist/components/dynamic-codeblock.d.ts.map +1 -1
- package/dist/components/dynamic-codeblock.js +22 -10
- package/dist/components/files.d.ts.map +1 -1
- package/dist/components/files.js +1 -1
- package/dist/components/github-info.js +1 -1
- package/dist/components/heading.js +1 -1
- package/dist/components/image-zoom.css +4 -0
- package/dist/components/inline-toc.d.ts +2 -2
- package/dist/components/inline-toc.d.ts.map +1 -1
- package/dist/components/inline-toc.js +1 -1
- package/dist/components/layout/language-toggle.js +1 -1
- package/dist/components/layout/root-toggle.d.ts +5 -15
- package/dist/components/layout/root-toggle.d.ts.map +1 -1
- package/dist/components/layout/root-toggle.js +10 -12
- package/dist/components/layout/search-toggle.d.ts +6 -4
- package/dist/components/layout/search-toggle.d.ts.map +1 -1
- package/dist/components/layout/search-toggle.js +5 -5
- package/dist/components/layout/sidebar.d.ts +21 -13
- package/dist/components/layout/sidebar.d.ts.map +1 -1
- package/dist/components/layout/sidebar.js +67 -65
- package/dist/components/layout/theme-toggle.js +1 -1
- package/dist/components/layout/toc-clerk.d.ts +2 -4
- package/dist/components/layout/toc-clerk.d.ts.map +1 -1
- package/dist/components/layout/toc-clerk.js +9 -5
- package/dist/components/layout/toc-thumb.js +1 -1
- package/dist/components/layout/toc.d.ts +6 -22
- package/dist/components/layout/toc.d.ts.map +1 -1
- package/dist/components/layout/toc.js +14 -18
- package/dist/components/tabs.d.ts +18 -18
- package/dist/components/tabs.d.ts.map +1 -1
- package/dist/components/tabs.js +44 -105
- package/dist/components/tabs.unstyled.d.ts +24 -0
- package/dist/components/tabs.unstyled.d.ts.map +1 -0
- package/dist/components/tabs.unstyled.js +89 -0
- package/dist/components/type-table.d.ts +19 -10
- package/dist/components/type-table.d.ts.map +1 -1
- package/dist/components/type-table.js +19 -10
- package/dist/components/ui/button.d.ts +2 -1
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +12 -8
- package/dist/components/ui/navigation-menu.js +2 -2
- package/dist/components/ui/popover.js +1 -1
- package/dist/components/ui/scroll-area.d.ts.map +1 -1
- package/dist/components/ui/scroll-area.js +1 -1
- package/dist/contexts/search.d.ts +10 -2
- package/dist/contexts/search.d.ts.map +1 -1
- package/dist/contexts/search.js +7 -1
- package/dist/contexts/sidebar.d.ts.map +1 -1
- package/dist/contexts/sidebar.js +2 -3
- package/dist/contexts/tree.d.ts +2 -1
- package/dist/contexts/tree.d.ts.map +1 -1
- package/dist/contexts/tree.js +9 -2
- package/dist/i18n.d.ts +13 -11
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +14 -37
- package/dist/icons.d.ts +49 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +282 -0
- package/dist/layouts/docs/client.d.ts +9 -0
- package/dist/layouts/docs/client.d.ts.map +1 -0
- package/dist/layouts/docs/client.js +46 -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 +77 -0
- package/dist/layouts/docs/page-client.d.ts +25 -0
- package/dist/layouts/docs/page-client.d.ts.map +1 -0
- package/dist/layouts/docs/page-client.js +157 -0
- package/dist/layouts/docs/page.d.ts +17 -0
- package/dist/layouts/docs/page.d.ts.map +1 -0
- package/dist/layouts/docs/page.js +26 -0
- package/dist/layouts/{home.d.ts → home/index.d.ts} +2 -3
- package/dist/layouts/home/index.d.ts.map +1 -0
- package/dist/layouts/home/index.js +56 -0
- package/dist/layouts/home/menu.d.ts +1 -1
- package/dist/layouts/home/menu.d.ts.map +1 -1
- package/dist/layouts/home/menu.js +3 -6
- package/dist/layouts/home/navbar.d.ts +4 -4
- package/dist/layouts/home/navbar.d.ts.map +1 -1
- package/dist/layouts/home/navbar.js +3 -4
- package/dist/layouts/notebook/client.d.ts +11 -0
- package/dist/layouts/notebook/client.d.ts.map +1 -0
- package/dist/layouts/notebook/client.js +45 -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 +112 -0
- package/dist/layouts/shared/client.d.ts +6 -0
- package/dist/layouts/shared/client.d.ts.map +1 -0
- package/dist/layouts/{links.js → shared/client.js} +4 -6
- package/dist/layouts/shared/index.d.ts +122 -0
- package/dist/layouts/shared/index.d.ts.map +1 -0
- package/dist/layouts/{shared.js → shared/index.js} +1 -15
- package/dist/mdx.d.ts +7 -2
- package/dist/mdx.d.ts.map +1 -1
- package/dist/mdx.js +5 -1
- package/dist/mdx.server.d.ts.map +1 -1
- package/dist/mdx.server.js +10 -3
- package/dist/page.d.ts +33 -35
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +28 -32
- package/dist/provider/base.d.ts +1 -1
- package/dist/provider/base.d.ts.map +1 -1
- package/dist/provider/base.js +9 -9
- package/dist/provider/index.d.ts +5 -3
- package/dist/provider/index.d.ts.map +1 -1
- package/dist/provider/index.js +6 -6
- package/dist/provider/next.d.ts +4 -0
- package/dist/provider/next.d.ts.map +1 -0
- package/dist/provider/next.js +7 -0
- package/dist/provider/react-router.d.ts +4 -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 +4 -0
- package/dist/provider/tanstack.d.ts.map +1 -0
- package/dist/provider/tanstack.js +7 -0
- package/dist/provider/waku.d.ts +4 -0
- package/dist/provider/waku.d.ts.map +1 -0
- package/dist/provider/waku.js +7 -0
- package/dist/style.css +944 -470
- package/dist/utils/get-sidebar-tabs.d.ts +18 -4
- package/dist/utils/get-sidebar-tabs.d.ts.map +1 -1
- package/dist/utils/get-sidebar-tabs.js +11 -8
- package/dist/utils/is-active.d.ts +2 -0
- package/dist/utils/is-active.d.ts.map +1 -1
- package/dist/utils/is-active.js +12 -4
- package/dist/utils/merge-refs.d.ts +3 -0
- package/dist/utils/merge-refs.d.ts.map +1 -0
- package/dist/utils/merge-refs.js +12 -0
- package/dist/utils/use-copy-button.d.ts +1 -1
- package/dist/utils/use-copy-button.d.ts.map +1 -1
- package/dist/utils/use-copy-button.js +9 -7
- package/package.json +76 -32
- package/css/animations.css +0 -199
- package/dist/components/ui/tabs.d.ts +0 -8
- package/dist/components/ui/tabs.d.ts.map +0 -1
- package/dist/components/ui/tabs.js +0 -16
- package/dist/layouts/docs/shared.d.ts +0 -25
- package/dist/layouts/docs/shared.d.ts.map +0 -1
- package/dist/layouts/docs/shared.js +0 -24
- package/dist/layouts/docs-client.d.ts +0 -5
- package/dist/layouts/docs-client.d.ts.map +0 -1
- package/dist/layouts/docs-client.js +0 -33
- package/dist/layouts/docs.d.ts +0 -30
- package/dist/layouts/docs.d.ts.map +0 -1
- package/dist/layouts/docs.js +0 -50
- package/dist/layouts/home.d.ts.map +0 -1
- package/dist/layouts/home.js +0 -44
- package/dist/layouts/links.d.ts +0 -79
- package/dist/layouts/links.d.ts.map +0 -1
- package/dist/layouts/notebook-client.d.ts +0 -12
- package/dist/layouts/notebook-client.d.ts.map +0 -1
- package/dist/layouts/notebook-client.js +0 -47
- package/dist/layouts/notebook.d.ts +0 -17
- package/dist/layouts/notebook.d.ts.map +0 -1
- package/dist/layouts/notebook.js +0 -68
- package/dist/layouts/shared.d.ts +0 -65
- package/dist/layouts/shared.d.ts.map +0 -1
- package/dist/page-client.d.ts +0 -28
- package/dist/page-client.d.ts.map +0 -1
- package/dist/page-client.js +0 -150
- package/dist/page.server.d.ts +0 -13
- package/dist/page.server.d.ts.map +0 -1
- package/dist/page.server.js +0 -36
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { TOCItemType } from 'fumadocs-core/
|
|
1
|
+
import type { TOCItemType } from 'fumadocs-core/toc';
|
|
2
2
|
import { Collapsible } from './ui/collapsible.js';
|
|
3
|
-
import { ComponentProps } from 'react';
|
|
3
|
+
import type { ComponentProps } from 'react';
|
|
4
4
|
export interface InlineTocProps extends ComponentProps<typeof Collapsible> {
|
|
5
5
|
items: TOCItemType[];
|
|
6
6
|
}
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"inline-toc.d.ts","sourceRoot":"","sources":["../../src/components/inline-toc.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { ChevronDown } from '
|
|
3
|
+
import { ChevronDown } from '../icons.js';
|
|
4
4
|
import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from './ui/collapsible.js';
|
|
5
5
|
import { cn } from '../utils/cn.js';
|
|
6
6
|
export function InlineTOC({ items, ...props }) {
|
|
@@ -11,7 +11,7 @@ export function LanguageToggle(props) {
|
|
|
11
11
|
return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { "aria-label": context.text.chooseLanguage, ...props, className: cn(buttonVariants({
|
|
12
12
|
color: 'ghost',
|
|
13
13
|
className: 'gap-1.5 p-1.5',
|
|
14
|
-
}), props.className), children: props.children }), _jsxs(PopoverContent, { className: "flex flex-col overflow-hidden p-0", children: [_jsx("p", { className: "mb-1 p-2 text-xs font-medium text-fd-muted-foreground", children: context.text.chooseLanguage }), context.locales.map((item) => (_jsx("button", { type: "button", className: cn('p-2 text-start text-sm', item.locale === context.locale
|
|
14
|
+
}), props.className), children: props.children }), _jsxs(PopoverContent, { className: "flex flex-col overflow-x-hidden p-0", children: [_jsx("p", { className: "mb-1 p-2 text-xs font-medium text-fd-muted-foreground", children: context.text.chooseLanguage }), context.locales.map((item) => (_jsx("button", { type: "button", className: cn('p-2 text-start text-sm', item.locale === context.locale
|
|
15
15
|
? 'bg-fd-primary/10 font-medium text-fd-primary'
|
|
16
16
|
: 'hover:bg-fd-accent hover:text-fd-accent-foreground'), onClick: () => {
|
|
17
17
|
context.onChange?.(item.locale);
|
|
@@ -1,20 +1,10 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
url: string;
|
|
7
|
-
icon?: ReactNode;
|
|
8
|
-
title: ReactNode;
|
|
9
|
-
description?: ReactNode;
|
|
10
|
-
/**
|
|
11
|
-
* Detect from a list of urls
|
|
12
|
-
*/
|
|
13
|
-
urls?: Set<string>;
|
|
14
|
-
props?: HTMLAttributes<HTMLElement>;
|
|
1
|
+
import { type ComponentProps, type ReactNode } from 'react';
|
|
2
|
+
import type { SidebarTab } from '../../utils/get-sidebar-tabs.js';
|
|
3
|
+
export interface Option extends SidebarTab {
|
|
4
|
+
props?: ComponentProps<'a'>;
|
|
15
5
|
}
|
|
16
6
|
export declare function RootToggle({ options, placeholder, ...props }: {
|
|
17
7
|
placeholder?: ReactNode;
|
|
18
8
|
options: Option[];
|
|
19
|
-
} &
|
|
9
|
+
} & ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
|
|
20
10
|
//# sourceMappingURL=root-toggle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root-toggle.d.ts","sourceRoot":"","sources":["../../../src/components/layout/root-toggle.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"root-toggle.d.ts","sourceRoot":"","sources":["../../../src/components/layout/root-toggle.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAO/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,WAAW,MAAO,SAAQ,UAAU;IACxC,KAAK,CAAC,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;CAC7B;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,GAAG,KAAK,EACT,EAAE;IACD,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,cAAc,CAAC,QAAQ,CAAC,2CAkF3B"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { ChevronsUpDown } from '
|
|
3
|
+
import { Check, ChevronsUpDown } from '../../icons.js';
|
|
4
4
|
import { useMemo, useState } from 'react';
|
|
5
5
|
import Link from 'fumadocs-core/link';
|
|
6
6
|
import { usePathname } from 'fumadocs-core/framework';
|
|
7
7
|
import { cn } from '../../utils/cn.js';
|
|
8
|
-
import {
|
|
8
|
+
import { isTabActive } from '../../utils/is-active.js';
|
|
9
9
|
import { useSidebar } from '../../contexts/sidebar.js';
|
|
10
10
|
import { Popover, PopoverContent, PopoverTrigger } from '../ui/popover.js';
|
|
11
11
|
export function RootToggle({ options, placeholder, ...props }) {
|
|
@@ -13,19 +13,17 @@ export function RootToggle({ options, placeholder, ...props }) {
|
|
|
13
13
|
const { closeOnRedirect } = useSidebar();
|
|
14
14
|
const pathname = usePathname();
|
|
15
15
|
const selected = useMemo(() => {
|
|
16
|
-
return options.findLast((item) => item
|
|
17
|
-
? item.urls.has(pathname.endsWith('/') ? pathname.slice(0, -1) : pathname)
|
|
18
|
-
: isActive(item.url, pathname, true));
|
|
16
|
+
return options.findLast((item) => isTabActive(item, pathname));
|
|
19
17
|
}, [options, pathname]);
|
|
20
18
|
const onClick = () => {
|
|
21
19
|
closeOnRedirect.current = false;
|
|
22
20
|
setOpen(false);
|
|
23
21
|
};
|
|
24
|
-
const item = selected ? _jsx(
|
|
25
|
-
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [item
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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-[13px] 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:mt-1 md:mb-auto md:size-5 empty:hidden", children: item.icon }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium", children: item.title }), _jsx("p", { className: "text-[13px] text-fd-muted-foreground empty:hidden", children: item.description })] }), _jsx(Check, { className: cn('shrink-0 ms-auto size-3.5 text-fd-primary', !isActive && 'invisible') })] }, item.url));
|
|
28
|
+
}) })] }));
|
|
31
29
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ComponentProps } from 'react';
|
|
2
2
|
import { type ButtonProps } from '../../components/ui/button.js';
|
|
3
|
-
|
|
3
|
+
interface SearchToggleProps extends Omit<ComponentProps<'button'>, 'color'>, ButtonProps {
|
|
4
4
|
hideIfDisabled?: boolean;
|
|
5
|
-
}
|
|
6
|
-
export declare function
|
|
5
|
+
}
|
|
6
|
+
export declare function SearchToggle({ hideIfDisabled, size, color, ...props }: SearchToggleProps): import("react/jsx-runtime").JSX.Element | null;
|
|
7
|
+
export declare function LargeSearchToggle({ hideIfDisabled, ...props }: ComponentProps<'button'> & {
|
|
7
8
|
hideIfDisabled?: boolean;
|
|
8
9
|
}): import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
export {};
|
|
9
11
|
//# sourceMappingURL=search-toggle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-toggle.d.ts","sourceRoot":"","sources":["../../../src/components/layout/search-toggle.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"search-toggle.d.ts","sourceRoot":"","sources":["../../../src/components/layout/search-toggle.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAK5C,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAE1E,UAAU,iBACR,SAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,EAC7C,WAAW;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,EAC3B,cAAc,EACd,IAAgB,EAChB,KAAe,EACf,GAAG,KAAK,EACT,EAAE,iBAAiB,kDAuBnB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,kDA6BA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { Search } from '../../icons.js';
|
|
4
4
|
import { useSearchContext } from '../../contexts/search.js';
|
|
5
5
|
import { useI18n } from '../../contexts/i18n.js';
|
|
6
6
|
import { cn } from '../../utils/cn.js';
|
|
7
7
|
import { buttonVariants } from '../../components/ui/button.js';
|
|
8
|
-
export function SearchToggle({ hideIfDisabled, size = 'icon', color = 'ghost', ...props }) {
|
|
8
|
+
export function SearchToggle({ hideIfDisabled, size = 'icon-sm', color = 'ghost', ...props }) {
|
|
9
9
|
const { setOpenSearch, enabled } = useSearchContext();
|
|
10
10
|
if (hideIfDisabled && !enabled)
|
|
11
11
|
return null;
|
|
@@ -14,14 +14,14 @@ export function SearchToggle({ hideIfDisabled, size = 'icon', color = 'ghost', .
|
|
|
14
14
|
color,
|
|
15
15
|
}), props.className), "data-search": "", "aria-label": "Open Search", onClick: () => {
|
|
16
16
|
setOpenSearch(true);
|
|
17
|
-
}, children: _jsx(
|
|
17
|
+
}, children: _jsx(Search, {}) }));
|
|
18
18
|
}
|
|
19
19
|
export function LargeSearchToggle({ hideIfDisabled, ...props }) {
|
|
20
20
|
const { enabled, hotKey, setOpenSearch } = useSearchContext();
|
|
21
21
|
const { text } = useI18n();
|
|
22
22
|
if (hideIfDisabled && !enabled)
|
|
23
23
|
return null;
|
|
24
|
-
return (_jsxs("button", { type: "button", "data-search-full": "", ...props, className: cn('inline-flex items-center gap-2 rounded-
|
|
24
|
+
return (_jsxs("button", { type: "button", "data-search-full": "", ...props, className: cn('inline-flex items-center gap-2 rounded-lg border bg-fd-secondary/50 p-1.5 ps-2 text-sm text-fd-muted-foreground transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground', props.className), onClick: () => {
|
|
25
25
|
setOpenSearch(true);
|
|
26
|
-
}, children: [_jsx(
|
|
26
|
+
}, children: [_jsx(Search, { className: "size-4" }), text.search, _jsx("div", { className: "ms-auto inline-flex gap-0.5", children: hotKey.map((k, i) => (_jsx("kbd", { className: "rounded-md border bg-fd-background px-1.5", children: k.display }, i))) })] }));
|
|
27
27
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type ComponentProps, type FC, type ReactNode } from 'react';
|
|
2
2
|
import { type LinkProps } from 'fumadocs-core/link';
|
|
3
3
|
import { type ScrollAreaProps } from '@radix-ui/react-scroll-area';
|
|
4
4
|
import type { CollapsibleContentProps, CollapsibleTriggerProps } from '@radix-ui/react-collapsible';
|
|
5
|
-
import type
|
|
6
|
-
export interface SidebarProps
|
|
5
|
+
import type * as PageTree from 'fumadocs-core/page-tree';
|
|
6
|
+
export interface SidebarProps {
|
|
7
7
|
/**
|
|
8
8
|
* Open folders by default if their level is lower or equal to a specific level
|
|
9
9
|
* (Starting from 1)
|
|
@@ -17,25 +17,33 @@ export interface SidebarProps extends HTMLAttributes<HTMLElement> {
|
|
|
17
17
|
* @defaultValue true
|
|
18
18
|
*/
|
|
19
19
|
prefetch?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Children to render
|
|
22
|
+
*/
|
|
23
|
+
Content: ReactNode;
|
|
24
|
+
/**
|
|
25
|
+
* Alternative children for mobile
|
|
26
|
+
*/
|
|
27
|
+
Mobile?: ReactNode;
|
|
20
28
|
}
|
|
21
|
-
export declare function
|
|
22
|
-
export declare function
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export declare function
|
|
26
|
-
export declare function SidebarFooter(props: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
export declare function Sidebar({ defaultOpenLevel, prefetch, Mobile, Content, }: SidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export declare function SidebarContent(props: ComponentProps<'aside'>): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export declare function SidebarContentMobile({ className, children, ...props }: ComponentProps<'aside'>): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export declare function SidebarHeader(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
export declare function SidebarFooter(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
27
34
|
export declare function SidebarViewport(props: ScrollAreaProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
-
export declare function SidebarSeparator(props:
|
|
35
|
+
export declare function SidebarSeparator(props: ComponentProps<'p'>): import("react/jsx-runtime").JSX.Element;
|
|
29
36
|
export declare function SidebarItem({ icon, ...props }: LinkProps & {
|
|
30
37
|
icon?: ReactNode;
|
|
31
38
|
}): import("react/jsx-runtime").JSX.Element;
|
|
32
|
-
export declare function SidebarFolder({ defaultOpen, ...props }:
|
|
39
|
+
export declare function SidebarFolder({ defaultOpen, ...props }: ComponentProps<'div'> & {
|
|
33
40
|
defaultOpen?: boolean;
|
|
34
41
|
}): import("react/jsx-runtime").JSX.Element;
|
|
35
|
-
export declare function SidebarFolderTrigger(props: CollapsibleTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
42
|
+
export declare function SidebarFolderTrigger({ className, ...props }: CollapsibleTriggerProps): import("react/jsx-runtime").JSX.Element;
|
|
36
43
|
export declare function SidebarFolderLink(props: LinkProps): import("react/jsx-runtime").JSX.Element;
|
|
37
44
|
export declare function SidebarFolderContent(props: CollapsibleContentProps): import("react/jsx-runtime").JSX.Element;
|
|
38
|
-
export declare function
|
|
45
|
+
export declare function SidebarTrigger({ children, ...props }: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
export declare function SidebarCollapseTrigger(props: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
|
|
39
47
|
export interface SidebarComponents {
|
|
40
48
|
Item: FC<{
|
|
41
49
|
item: PageTree.Item;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/sidebar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/sidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,EAAE,EAEP,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AACf,OAAa,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAU1D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,KAAK,EACV,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AAKzD,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,OAAO,EAAE,SAAS,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AA2BD,wBAAgB,OAAO,CAAC,EACtB,gBAAoB,EACpB,QAAe,EACf,MAAM,EACN,OAAO,GACR,EAAE,YAAY,2CAed;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,2CAiE5D;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,CAAC,2CA+BzB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CASzD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CASzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,2CAiBrD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,2CAY1D;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,SAAS,GAAG;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,2CAiBA;AAED,wBAAgB,aAAa,CAAC,EAC5B,WAAmB,EACnB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,2CAgBA;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,GAAG,KAAK,EACT,EAAE,uBAAuB,2CAezB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,2CAiCjD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,uBAAuB,2CAkClE;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAY1B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAgBrE;AAgBD,MAAM,WAAW,iBAAiB;IAChC,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,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAA;KAAE,CAAC,CAAC;IAC1E,SAAS,EAAE,EAAE,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAA;KAAE,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACzC,2CAuDA"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { ChevronDown, ExternalLink } from '
|
|
4
|
-
import * as Base from 'fumadocs-core/sidebar';
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronDown, ExternalLink } from '../../icons.js';
|
|
5
4
|
import { usePathname } from 'fumadocs-core/framework';
|
|
6
5
|
import { createContext, Fragment, useContext, useMemo, useRef, useState, } from 'react';
|
|
7
6
|
import Link from 'fumadocs-core/link';
|
|
@@ -13,7 +12,9 @@ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '../../comp
|
|
|
13
12
|
import { useSidebar } from '../../contexts/sidebar.js';
|
|
14
13
|
import { cva } from 'class-variance-authority';
|
|
15
14
|
import { useTreeContext, useTreePath } from '../../contexts/tree.js';
|
|
16
|
-
|
|
15
|
+
import { useMediaQuery } from 'fumadocs-core/utils/use-media-query';
|
|
16
|
+
import { Presence } from '@radix-ui/react-presence';
|
|
17
|
+
const itemVariants = cva('relative flex flex-row items-center gap-2 rounded-lg p-2 ps-(--sidebar-item-offset) text-start text-fd-muted-foreground [overflow-wrap:anywhere] [&_svg]:size-4 [&_svg]:shrink-0', {
|
|
17
18
|
variants: {
|
|
18
19
|
active: {
|
|
19
20
|
true: 'bg-fd-primary/10 text-fd-primary',
|
|
@@ -23,7 +24,18 @@ const itemVariants = cva('relative flex flex-row items-center gap-2 rounded-md p
|
|
|
23
24
|
});
|
|
24
25
|
const Context = createContext(null);
|
|
25
26
|
const FolderContext = createContext(null);
|
|
26
|
-
export function
|
|
27
|
+
export function Sidebar({ defaultOpenLevel = 0, prefetch = true, Mobile, Content, }) {
|
|
28
|
+
const isMobile = useMediaQuery('(width < 768px)') ?? false;
|
|
29
|
+
const context = useMemo(() => {
|
|
30
|
+
return {
|
|
31
|
+
defaultOpenLevel,
|
|
32
|
+
prefetch,
|
|
33
|
+
level: 1,
|
|
34
|
+
};
|
|
35
|
+
}, [defaultOpenLevel, prefetch]);
|
|
36
|
+
return (_jsx(Context.Provider, { value: context, children: isMobile && Mobile != null ? Mobile : Content }));
|
|
37
|
+
}
|
|
38
|
+
export function SidebarContent(props) {
|
|
27
39
|
const { collapsed } = useSidebar();
|
|
28
40
|
const [hover, setHover] = useState(false);
|
|
29
41
|
const timerRef = useRef(0);
|
|
@@ -32,7 +44,20 @@ export function CollapsibleSidebar(props) {
|
|
|
32
44
|
setHover(false);
|
|
33
45
|
closeTimeRef.current = Date.now() + 150;
|
|
34
46
|
});
|
|
35
|
-
return (_jsx(
|
|
47
|
+
return (_jsx("aside", { id: "nd-sidebar", ...props, "data-collapsed": collapsed, className: cn('fixed left-0 rtl:left-auto rtl:right-(--removed-body-scroll-bar-size,0) flex flex-col items-end top-(--fd-sidebar-top) bottom-(--fd-sidebar-margin) z-20 bg-fd-card text-sm border-e transition-[top,opacity,translate,width] duration-200 max-md:hidden *:w-(--fd-sidebar-width)', collapsed && [
|
|
48
|
+
'rounded-xl border translate-x-(--fd-sidebar-offset) rtl:-translate-x-(--fd-sidebar-offset)',
|
|
49
|
+
hover ? 'z-50 shadow-lg' : 'opacity-0',
|
|
50
|
+
], props.className), style: {
|
|
51
|
+
...props.style,
|
|
52
|
+
'--fd-sidebar-offset': hover
|
|
53
|
+
? 'calc(var(--spacing) * 2)'
|
|
54
|
+
: 'calc(16px - 100%)',
|
|
55
|
+
'--fd-sidebar-margin': collapsed ? '0.5rem' : '0px',
|
|
56
|
+
'--fd-sidebar-top': `calc(var(--fd-banner-height) + var(--fd-nav-height) + var(--fd-sidebar-margin))`,
|
|
57
|
+
width: collapsed
|
|
58
|
+
? 'var(--fd-sidebar-width)'
|
|
59
|
+
: 'calc(var(--spacing) + var(--fd-sidebar-width) + var(--fd-layout-offset))',
|
|
60
|
+
}, onPointerEnter: (e) => {
|
|
36
61
|
if (!collapsed ||
|
|
37
62
|
e.pointerType === 'touch' ||
|
|
38
63
|
closeTimeRef.current > Date.now())
|
|
@@ -49,52 +74,33 @@ export function CollapsibleSidebar(props) {
|
|
|
49
74
|
}, Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100
|
|
50
75
|
? 0
|
|
51
76
|
: 500);
|
|
52
|
-
},
|
|
53
|
-
'md:-me-(--fd-sidebar-width) md:-translate-x-(--fd-sidebar-offset) rtl:md:translate-x-(--fd-sidebar-offset)', collapsed && hover && 'z-50 md:translate-x-0', collapsed && !hover && 'md:opacity-0', props.className), style: {
|
|
54
|
-
'--fd-sidebar-offset': 'calc(var(--fd-sidebar-width) - 6px)',
|
|
55
|
-
...props.style,
|
|
56
|
-
} }));
|
|
77
|
+
}, children: props.children }));
|
|
57
78
|
}
|
|
58
|
-
export function
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
prefetch,
|
|
63
|
-
level: 1,
|
|
64
|
-
};
|
|
65
|
-
}, [defaultOpenLevel, prefetch]);
|
|
66
|
-
return (_jsx(Context.Provider, { value: context, children: _jsx(Base.SidebarList, { id: "nd-sidebar", removeScrollOn: "(width < 768px)" // md
|
|
67
|
-
, ...props, className: cn('fixed top-[calc(var(--fd-banner-height)+var(--fd-nav-height))] z-20 bg-fd-card text-sm md:sticky md:h-(--fd-sidebar-height)', 'max-md:inset-x-0 max-md:bottom-0 max-md:bg-fd-background/80 max-md:text-[15px] max-md:backdrop-blur-lg max-md:data-[open=false]:invisible', props.className), style: {
|
|
68
|
-
...props.style,
|
|
69
|
-
'--fd-sidebar-height': 'calc(100dvh - var(--fd-banner-height) - var(--fd-nav-height))',
|
|
70
|
-
}, children: _jsx("div", { ...inner, className: cn('flex size-full max-w-full flex-col pt-2 md:ms-auto md:w-(--fd-sidebar-width) md:border-e md:pt-4', inner?.className), children: props.children }) }) }));
|
|
79
|
+
export function SidebarContentMobile({ className, children, ...props }) {
|
|
80
|
+
const { open, setOpen } = useSidebar();
|
|
81
|
+
const state = open ? 'open' : 'closed';
|
|
82
|
+
return (_jsxs(_Fragment, { children: [_jsx(Presence, { present: open, children: _jsx("div", { "data-state": state, className: "fixed z-40 inset-0 backdrop-blur-xs data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out", onClick: () => setOpen(false) }) }), _jsx(Presence, { present: open, children: ({ present }) => (_jsx("aside", { id: "nd-sidebar-mobile", ...props, "data-state": state, className: cn('fixed text-[15px] flex flex-col shadow-lg border-s end-0 inset-y-0 w-[85%] max-w-[380px] z-40 bg-fd-background data-[state=open]:animate-fd-sidebar-in data-[state=closed]:animate-fd-sidebar-out', !present && 'invisible', className), children: children })) })] }));
|
|
71
83
|
}
|
|
72
84
|
export function SidebarHeader(props) {
|
|
73
|
-
return (_jsx("div", { ...props, className: cn('flex flex-col gap-
|
|
85
|
+
return (_jsx("div", { ...props, className: cn('flex flex-col gap-3 p-4 pb-2', props.className), children: props.children }));
|
|
74
86
|
}
|
|
75
87
|
export function SidebarFooter(props) {
|
|
76
|
-
return (_jsx("div", { ...props, className: cn('flex flex-col border-t
|
|
88
|
+
return (_jsx("div", { ...props, className: cn('flex flex-col border-t p-4 pt-2', props.className), children: props.children }));
|
|
77
89
|
}
|
|
78
90
|
export function SidebarViewport(props) {
|
|
79
|
-
return (_jsx(ScrollArea, { ...props, className: cn('h-full', props.className), children: _jsx(ScrollViewport, { className: "p-4", style: {
|
|
80
|
-
|
|
91
|
+
return (_jsx(ScrollArea, { ...props, className: cn('h-full', props.className), children: _jsx(ScrollViewport, { className: "p-4 overscroll-contain", style: {
|
|
92
|
+
'--sidebar-item-offset': 'calc(var(--spacing) * 2)',
|
|
93
|
+
maskImage: 'linear-gradient(to bottom, transparent, white 12px, white calc(100% - 12px), transparent)',
|
|
81
94
|
}, children: props.children }) }));
|
|
82
95
|
}
|
|
83
96
|
export function SidebarSeparator(props) {
|
|
84
|
-
|
|
85
|
-
return (_jsx("p", { ...props, className: cn('inline-flex items-center gap-2 mb-2 px-2 text-sm font-medium [&_svg]:size-4 [&_svg]:shrink-0', props.className), style: {
|
|
86
|
-
paddingInlineStart: getOffset(level),
|
|
87
|
-
...props.style,
|
|
88
|
-
}, children: props.children }));
|
|
97
|
+
return (_jsx("p", { ...props, className: cn('inline-flex items-center gap-2 mb-1.5 px-2 ps-(--sidebar-item-offset) empty:mb-0 [&_svg]:size-4 [&_svg]:shrink-0', props.className), children: props.children }));
|
|
89
98
|
}
|
|
90
99
|
export function SidebarItem({ icon, ...props }) {
|
|
91
100
|
const pathname = usePathname();
|
|
92
101
|
const active = props.href !== undefined && isActive(props.href, pathname, false);
|
|
93
|
-
const { prefetch
|
|
94
|
-
return (_jsxs(Link, { ...props, "data-active": active, className: cn(itemVariants({ active }), props.className), prefetch: prefetch,
|
|
95
|
-
paddingInlineStart: getOffset(level),
|
|
96
|
-
...props.style,
|
|
97
|
-
}, children: [_jsx(Border, { level: level, active: active }), icon ?? (props.external ? _jsx(ExternalLink, {}) : null), props.children] }));
|
|
102
|
+
const { prefetch } = useInternalContext();
|
|
103
|
+
return (_jsxs(Link, { ...props, "data-active": active, className: cn(itemVariants({ active }), props.className), prefetch: prefetch, children: [icon ?? (props.external ? _jsx(ExternalLink, {}) : null), props.children] }));
|
|
98
104
|
}
|
|
99
105
|
export function SidebarFolder({ defaultOpen = false, ...props }) {
|
|
100
106
|
const [open, setOpen] = useState(defaultOpen);
|
|
@@ -104,38 +110,42 @@ export function SidebarFolder({ defaultOpen = false, ...props }) {
|
|
|
104
110
|
});
|
|
105
111
|
return (_jsx(Collapsible, { open: open, onOpenChange: setOpen, ...props, children: _jsx(FolderContext.Provider, { value: useMemo(() => ({ open, setOpen }), [open]), children: props.children }) }));
|
|
106
112
|
}
|
|
107
|
-
export function SidebarFolderTrigger(props) {
|
|
108
|
-
const { level } = useInternalContext();
|
|
113
|
+
export function SidebarFolderTrigger({ className, ...props }) {
|
|
109
114
|
const { open } = useFolderContext();
|
|
110
|
-
return (_jsxs(CollapsibleTrigger, {
|
|
111
|
-
paddingInlineStart: getOffset(level),
|
|
112
|
-
...props.style,
|
|
113
|
-
}, children: [_jsx(Border, { level: level }), props.children, _jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') })] }));
|
|
115
|
+
return (_jsxs(CollapsibleTrigger, { className: cn(itemVariants({ active: false }), 'w-full', className), ...props, children: [props.children, _jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') })] }));
|
|
114
116
|
}
|
|
115
117
|
export function SidebarFolderLink(props) {
|
|
116
118
|
const { open, setOpen } = useFolderContext();
|
|
117
|
-
const { prefetch
|
|
119
|
+
const { prefetch } = useInternalContext();
|
|
118
120
|
const pathname = usePathname();
|
|
119
121
|
const active = props.href !== undefined && isActive(props.href, pathname, false);
|
|
120
122
|
return (_jsxs(Link, { ...props, "data-active": active, className: cn(itemVariants({ active }), 'w-full', props.className), onClick: (e) => {
|
|
121
|
-
if (e.target
|
|
122
|
-
|
|
123
|
+
if (e.target instanceof Element &&
|
|
124
|
+
e.target.matches('[data-icon], [data-icon] *')) {
|
|
125
|
+
setOpen(!open);
|
|
123
126
|
e.preventDefault();
|
|
124
127
|
}
|
|
125
128
|
else {
|
|
126
|
-
setOpen(
|
|
129
|
+
setOpen(active ? !open : true);
|
|
127
130
|
}
|
|
128
|
-
}, prefetch: prefetch,
|
|
129
|
-
paddingInlineStart: getOffset(level),
|
|
130
|
-
...props.style,
|
|
131
|
-
}, children: [_jsx(Border, { level: level, active: active }), props.children, _jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') })] }));
|
|
131
|
+
}, prefetch: prefetch, children: [props.children, _jsx(ChevronDown, { "data-icon": true, className: cn('ms-auto transition-transform', !open && '-rotate-90') })] }));
|
|
132
132
|
}
|
|
133
133
|
export function SidebarFolderContent(props) {
|
|
134
|
-
const ctx = useInternalContext();
|
|
135
|
-
return (_jsx(CollapsibleContent, { ...props, className: cn('relative',
|
|
134
|
+
const { level, ...ctx } = useInternalContext();
|
|
135
|
+
return (_jsx(CollapsibleContent, { ...props, className: cn('relative', level === 1 && [
|
|
136
|
+
"before:content-[''] before:absolute before:w-px before:inset-y-1 before:bg-fd-border before:start-2.5",
|
|
137
|
+
"**:data-[active=true]:before:content-[''] **:data-[active=true]:before:bg-fd-primary **:data-[active=true]:before:absolute **:data-[active=true]:before:w-px **:data-[active=true]:before:inset-y-2.5 **:data-[active=true]:before:start-2.5",
|
|
138
|
+
], props.className), style: {
|
|
139
|
+
'--sidebar-item-offset': `calc(var(--spacing) * ${(level + 1) * 3})`,
|
|
140
|
+
...props.style,
|
|
141
|
+
}, children: _jsx(Context.Provider, { value: useMemo(() => ({
|
|
136
142
|
...ctx,
|
|
137
|
-
level:
|
|
138
|
-
}), [ctx]), children:
|
|
143
|
+
level: level + 1,
|
|
144
|
+
}), [ctx, level]), children: props.children }) }));
|
|
145
|
+
}
|
|
146
|
+
export function SidebarTrigger({ children, ...props }) {
|
|
147
|
+
const { setOpen } = useSidebar();
|
|
148
|
+
return (_jsx("button", { ...props, "aria-label": "Open Sidebar", onClick: () => setOpen((prev) => !prev), children: children }));
|
|
139
149
|
}
|
|
140
150
|
export function SidebarCollapseTrigger(props) {
|
|
141
151
|
const { collapsed, setCollapsed } = useSidebar();
|
|
@@ -167,7 +177,7 @@ export function SidebarPageTree(props) {
|
|
|
167
177
|
if (item.type === 'separator') {
|
|
168
178
|
if (Separator)
|
|
169
179
|
return _jsx(Separator, { item: item }, i);
|
|
170
|
-
return (_jsxs(SidebarSeparator, { className: cn(i !== 0 && 'mt-
|
|
180
|
+
return (_jsxs(SidebarSeparator, { className: cn(i !== 0 && 'mt-6'), children: [item.icon, item.name] }, i));
|
|
171
181
|
}
|
|
172
182
|
if (item.type === 'folder') {
|
|
173
183
|
const children = renderSidebarList(item.children, level + 1);
|
|
@@ -188,11 +198,3 @@ function PageTreeFolder({ item, ...props }) {
|
|
|
188
198
|
const path = useTreePath();
|
|
189
199
|
return (_jsxs(SidebarFolder, { defaultOpen: (item.defaultOpen ?? defaultOpenLevel >= level) || path.includes(item), children: [item.index ? (_jsxs(SidebarFolderLink, { href: item.index.url, external: item.index.external, ...props, children: [item.icon, item.name] })) : (_jsxs(SidebarFolderTrigger, { ...props, children: [item.icon, item.name] })), _jsx(SidebarFolderContent, { children: props.children })] }));
|
|
190
200
|
}
|
|
191
|
-
function getOffset(level) {
|
|
192
|
-
return `calc(var(--spacing) * ${(level > 1 ? level : 0) * 2 + 2})`;
|
|
193
|
-
}
|
|
194
|
-
function Border({ level, active }) {
|
|
195
|
-
if (level <= 1)
|
|
196
|
-
return null;
|
|
197
|
-
return (_jsx("div", { className: cn('absolute w-px inset-y-2 z-[2] start-3', active && 'bg-fd-primary') }));
|
|
198
|
-
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { cva } from 'class-variance-authority';
|
|
4
|
-
import { Moon, Sun, Airplay } from '
|
|
4
|
+
import { Moon, Sun, Airplay } from '../../icons.js';
|
|
5
5
|
import { useTheme } from 'next-themes';
|
|
6
6
|
import { useLayoutEffect, useState } from 'react';
|
|
7
7
|
import { cn } from '../../utils/cn.js';
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type
|
|
2
|
-
export default function ClerkTOCItems({
|
|
3
|
-
items: TOCItemType[];
|
|
4
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
import { type ComponentProps } from 'react';
|
|
2
|
+
export default function ClerkTOCItems({ ref, className, ...props }: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
5
3
|
//# sourceMappingURL=toc-clerk.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toc-clerk.d.ts","sourceRoot":"","sources":["../../../src/components/layout/toc-clerk.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"toc-clerk.d.ts","sourceRoot":"","sources":["../../../src/components/layout/toc-clerk.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAA+B,MAAM,OAAO,CAAC;AAOzE,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EACpC,GAAG,EACH,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,2CAsGvB"}
|
|
@@ -4,9 +4,13 @@ import * as Primitive from 'fumadocs-core/toc';
|
|
|
4
4
|
import { useEffect, useRef, useState } from 'react';
|
|
5
5
|
import { cn } from '../../utils/cn.js';
|
|
6
6
|
import { TocThumb } from '../../components/layout/toc-thumb.js';
|
|
7
|
-
import {
|
|
8
|
-
|
|
7
|
+
import { useTOCItems } from '../../components/layout/toc.js';
|
|
8
|
+
import { mergeRefs } from '../../utils/merge-refs.js';
|
|
9
|
+
import { useI18n } from '../../contexts/i18n.js';
|
|
10
|
+
export default function ClerkTOCItems({ ref, className, ...props }) {
|
|
9
11
|
const containerRef = useRef(null);
|
|
12
|
+
const items = useTOCItems();
|
|
13
|
+
const { text } = useI18n();
|
|
10
14
|
const [svg, setSvg] = useState();
|
|
11
15
|
useEffect(() => {
|
|
12
16
|
if (!containerRef.current)
|
|
@@ -44,14 +48,14 @@ export default function ClerkTOCItems({ items }) {
|
|
|
44
48
|
};
|
|
45
49
|
}, [items]);
|
|
46
50
|
if (items.length === 0)
|
|
47
|
-
return _jsx(
|
|
51
|
+
return (_jsx("div", { className: "rounded-lg border bg-fd-card p-3 text-xs text-fd-muted-foreground", children: text.tocNoHeadings }));
|
|
48
52
|
return (_jsxs(_Fragment, { children: [svg ? (_jsx("div", { className: "absolute start-0 top-0 rtl:-scale-x-100", style: {
|
|
49
53
|
width: svg.width,
|
|
50
54
|
height: svg.height,
|
|
51
55
|
maskImage: `url("data:image/svg+xml,${
|
|
52
56
|
// Inline SVG
|
|
53
57
|
encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svg.width} ${svg.height}"><path d="${svg.path}" stroke="black" stroke-width="1" fill="none" /></svg>`)}")`,
|
|
54
|
-
}, children: _jsx(TocThumb, { containerRef: containerRef, className: "mt-(--fd-top) h-(--fd-height) bg-fd-primary transition-all" }) })) : null, _jsx("div", { className:
|
|
58
|
+
}, children: _jsx(TocThumb, { containerRef: containerRef, className: "mt-(--fd-top) h-(--fd-height) bg-fd-primary transition-all" }) })) : null, _jsx("div", { ref: mergeRefs(containerRef, ref), className: cn('flex flex-col', className), ...props, children: items.map((item, i) => (_jsx(TOCItem, { item: item, upper: items[i - 1]?.depth, lower: items[i + 1]?.depth }, item.url))) })] }));
|
|
55
59
|
}
|
|
56
60
|
function getItemOffset(depth) {
|
|
57
61
|
if (depth <= 2)
|
|
@@ -67,7 +71,7 @@ function TOCItem({ item, upper = item.depth, lower = item.depth, }) {
|
|
|
67
71
|
const offset = getLineOffset(item.depth), upperOffset = getLineOffset(upper), lowerOffset = getLineOffset(lower);
|
|
68
72
|
return (_jsxs(Primitive.TOCItem, { href: item.url, style: {
|
|
69
73
|
paddingInlineStart: getItemOffset(item.depth),
|
|
70
|
-
}, className: "prose relative py-1.5 text-sm text-fd-muted-foreground transition-colors [overflow-wrap:anywhere] first:pt-0 last:pb-0 data-[active=true]:text-fd-primary", children: [offset !== upperOffset ? (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", className: "absolute -top-1.5 start-0 size-4 rtl:-scale-x-100", children: _jsx("line", { x1: upperOffset, y1: "0", x2: offset, y2: "12", className: "stroke-fd-foreground/10", strokeWidth: "1" }) })) : null, _jsx("div", { className: cn('absolute inset-y-0 w-px bg-fd-foreground/10', offset !== upperOffset && 'top-1.5', offset !== lowerOffset && 'bottom-1.5'), style: {
|
|
74
|
+
}, className: "prose relative py-1.5 text-sm text-fd-muted-foreground hover:text-fd-accent-foreground transition-colors [overflow-wrap:anywhere] first:pt-0 last:pb-0 data-[active=true]:text-fd-primary", children: [offset !== upperOffset ? (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", className: "absolute -top-1.5 start-0 size-4 rtl:-scale-x-100", children: _jsx("line", { x1: upperOffset, y1: "0", x2: offset, y2: "12", className: "stroke-fd-foreground/10", strokeWidth: "1" }) })) : null, _jsx("div", { className: cn('absolute inset-y-0 w-px bg-fd-foreground/10', offset !== upperOffset && 'top-1.5', offset !== lowerOffset && 'bottom-1.5'), style: {
|
|
71
75
|
insetInlineStart: offset,
|
|
72
76
|
} }), item.title] }));
|
|
73
77
|
}
|
|
@@ -1,23 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { type ComponentProps
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
header?: ReactNode;
|
|
9
|
-
/**
|
|
10
|
-
* Custom content in TOC container, after the main TOC
|
|
11
|
-
*/
|
|
12
|
-
footer?: ReactNode;
|
|
13
|
-
children: ReactNode;
|
|
14
|
-
}
|
|
15
|
-
export declare function Toc(props: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
|
|
16
|
-
export declare function TocItemsEmpty(): import("react/jsx-runtime").JSX.Element;
|
|
17
|
-
export declare function TOCScrollArea({ isMenu, ...props }: ComponentProps<typeof ScrollArea> & {
|
|
18
|
-
isMenu?: boolean;
|
|
19
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
20
|
-
export declare function TOCItems({ items }: {
|
|
21
|
-
items: TOCItemType[];
|
|
22
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
import * as Primitive from 'fumadocs-core/toc';
|
|
2
|
+
import { type ComponentProps } from 'react';
|
|
3
|
+
export declare function useTOCItems(): Primitive.TOCItemType[];
|
|
4
|
+
export declare function TOCProvider({ toc, children, ...props }: ComponentProps<typeof Primitive.AnchorProvider>): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare function TOCScrollArea({ ref, className, ...props }: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export declare function TOCItems({ ref, className, ...props }: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
|
|
23
7
|
//# sourceMappingURL=toc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../../src/components/layout/toc.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../../src/components/layout/toc.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,KAAK,cAAc,EAAqC,MAAM,OAAO,CAAC;AAQ/E,wBAAgB,WAAW,IAAI,SAAS,CAAC,WAAW,EAAE,CAErD;AAED,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,SAAS,CAAC,cAAc,CAAC,2CAQjD;AAED,wBAAgB,aAAa,CAAC,EAC5B,GAAG,EACH,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,2CAiBvB;AAED,wBAAgB,QAAQ,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,2CAgC3E"}
|