fumadocs-ui 15.2.6 → 15.2.7

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/css/shiki.css CHANGED
@@ -1,8 +1,8 @@
1
- .fd-codeblock code span {
1
+ .shiki code span {
2
2
  color: var(--shiki-light);
3
3
  }
4
4
 
5
- .dark .fd-codeblock code span {
5
+ .dark .shiki code span {
6
6
  color: var(--shiki-dark);
7
7
  }
8
8
 
@@ -11,37 +11,37 @@
11
11
  font-size: 13px;
12
12
  }
13
13
 
14
- .fd-codeblock code .diff.remove {
14
+ .shiki code .diff.remove {
15
15
  background-color: var(--fd-diff-remove-color);
16
16
  opacity: 0.7;
17
17
  }
18
18
 
19
- .fd-codeblock code .diff::before {
19
+ .shiki code .diff::before {
20
20
  position: absolute;
21
21
  left: 6px;
22
22
  }
23
23
 
24
- .fd-codeblock code .diff.remove::before {
24
+ .shiki code .diff.remove::before {
25
25
  content: '-';
26
26
  color: var(--fd-diff-remove-symbol-color);
27
27
  }
28
28
 
29
- .fd-codeblock code .diff.add {
29
+ .shiki code .diff.add {
30
30
  background-color: var(--fd-diff-add-color);
31
31
  }
32
32
 
33
- .fd-codeblock code .diff.add::before {
33
+ .shiki code .diff.add::before {
34
34
  content: '+';
35
35
  color: var(--fd-diff-add-symbol-color);
36
36
  }
37
37
 
38
- .fd-codeblock code .diff {
38
+ .shiki code .diff {
39
39
  margin: 0 -16px;
40
40
  padding: 0 16px;
41
41
  position: relative;
42
42
  }
43
43
 
44
- .fd-codeblock .highlighted {
44
+ .shiki .highlighted {
45
45
  margin: 0 -16px;
46
46
  padding: 0 16px;
47
47
  background-color: color-mix(
@@ -51,7 +51,7 @@
51
51
  );
52
52
  }
53
53
 
54
- .fd-codeblock .highlighted-word {
54
+ .shiki .highlighted-word {
55
55
  padding: 1px 2px;
56
56
  margin: -1px -3px;
57
57
  border: 1px solid
@@ -14,7 +14,7 @@ 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(SearchIcon, {}) }));
17
+ }, children: _jsx(SearchIcon, { className: "p-px" }) }));
18
18
  }
19
19
  export function LargeSearchToggle({ hideIfDisabled, ...props }) {
20
20
  const { enabled, hotKey, setOpenSearch } = useSearchContext();
@@ -1,8 +1,6 @@
1
1
  import type { TOCItemType } from 'fumadocs-core/server';
2
2
  import { type ComponentProps, type HTMLAttributes, type ReactNode } from 'react';
3
3
  import { ScrollArea } from '../ui/scroll-area.js';
4
- import type { PopoverContentProps, PopoverTriggerProps } from '@radix-ui/react-popover';
5
- import { Collapsible } from '../../components/ui/collapsible.js';
6
4
  export interface TOCProps {
7
5
  /**
8
6
  * Custom content in TOC container, before the main TOC
@@ -22,13 +20,4 @@ export declare function TOCScrollArea({ isMenu, ...props }: ComponentProps<typeo
22
20
  export declare function TOCItems({ items }: {
23
21
  items: TOCItemType[];
24
22
  }): import("react/jsx-runtime").JSX.Element;
25
- type MakeRequired<T, K extends keyof T> = T & {
26
- [P in K]-?: T[P];
27
- };
28
- export declare function TocPopover({ open, onOpenChange, ref: _ref, ...props }: MakeRequired<ComponentProps<typeof Collapsible>, 'open' | 'onOpenChange'>): import("react/jsx-runtime").JSX.Element;
29
- export declare function TocPopoverTrigger({ items, ...props }: PopoverTriggerProps & {
30
- items: TOCItemType[];
31
- }): import("react/jsx-runtime").JSX.Element;
32
- export declare function TocPopoverContent(props: PopoverContentProps): import("react/jsx-runtime").JSX.Element;
33
- export {};
34
23
  //# 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,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAIf,MAAM,OAAO,CAAC;AAIf,OAAO,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,WAAW,EAGZ,MAAM,6BAA6B,CAAC;AAErC,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CAyBxD;AAED,wBAAgB,aAAa,4CAQ5B;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,UAAU,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,2CAqB1D;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,2CAqB3D;AAkBD,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG;KAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AASnE,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,YAAY,EACZ,GAAG,EAAE,IAAI,EACT,GAAG,KAAK,EACT,EAAE,YAAY,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC,2CAgB3E;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,GAAG,KAAK,EACT,EAAE,mBAAmB,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,2CAmChD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,2CAU3D"}
1
+ {"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../../src/components/layout/toc.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAIf,OAAO,EAAE,UAAU,EAAkB,MAAM,mBAAmB,CAAC;AAG/D,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CAyBxD;AAED,wBAAgB,aAAa,4CAQ5B;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,UAAU,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,2CAsB1D;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,2CAqB3D"}
@@ -1,14 +1,12 @@
1
1
  'use client';
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import * as Primitive from 'fumadocs-core/toc';
4
- import { createContext, use, useMemo, useRef, } from 'react';
4
+ import { useRef, } from 'react';
5
5
  import { cn } from '../../utils/cn.js';
6
6
  import { useI18n } from '../../contexts/i18n.js';
7
7
  import { TocThumb } from '../../components/layout/toc-thumb.js';
8
8
  import { ScrollArea, ScrollViewport } from '../ui/scroll-area.js';
9
- import { ChevronRight, Text } from 'lucide-react';
10
9
  import { usePageStyles } from '../../contexts/layout.js';
11
- import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '../../components/ui/collapsible.js';
12
10
  export function Toc(props) {
13
11
  const { toc } = usePageStyles();
14
12
  return (_jsx("div", { id: "nd-toc", ...props, className: cn('sticky top-[calc(var(--fd-banner-height)+var(--fd-nav-height))] h-(--fd-toc-height) pb-2 pt-12', toc, props.className), style: {
@@ -22,34 +20,15 @@ export function TocItemsEmpty() {
22
20
  }
23
21
  export function TOCScrollArea({ isMenu, ...props }) {
24
22
  const viewRef = useRef(null);
25
- return (_jsx(ScrollArea, { ...props, className: cn('flex flex-col ps-px', props.className), children: _jsx(Primitive.ScrollProvider, { containerRef: viewRef, children: _jsx(ScrollViewport, { className: cn('relative min-h-0 text-sm', isMenu && 'mt-2 mb-4 mx-4 md:mx-6'), ref: viewRef, children: props.children }) }) }));
23
+ return (_jsx(ScrollArea, { ...props, className: cn('flex flex-col ps-px', props.className), children: _jsx(ScrollViewport, { ref: viewRef, className: cn('min-h-0 text-sm', isMenu &&
24
+ '[mask-image:linear-gradient(to_bottom,transparent,white_16px,white_calc(100%-16px),transparent)] px-4 md:px-6 py-2'), children: _jsx(Primitive.ScrollProvider, { containerRef: viewRef, children: props.children }) }) }));
26
25
  }
27
26
  export function TOCItems({ items }) {
28
27
  const containerRef = useRef(null);
29
28
  if (items.length === 0)
30
29
  return _jsx(TocItemsEmpty, {});
31
- return (_jsxs(_Fragment, { children: [_jsx(TocThumb, { containerRef: containerRef, className: "absolute start-0 mt-(--fd-top) h-(--fd-height) w-px bg-fd-primary transition-all" }), _jsx("div", { ref: containerRef, className: "flex flex-col border-s border-fd-foreground/10", children: items.map((item) => (_jsx(TOCItem, { item: item }, item.url))) })] }));
30
+ return (_jsxs("div", { className: "relative", children: [_jsx(TocThumb, { containerRef: containerRef, className: "absolute start-0 mt-(--fd-top) h-(--fd-height) w-px bg-fd-primary transition-all" }), _jsx("div", { ref: containerRef, className: "flex flex-col border-s border-fd-foreground/10", children: items.map((item) => (_jsx(TOCItem, { item: item }, item.url))) })] }));
32
31
  }
33
32
  function TOCItem({ item }) {
34
33
  return (_jsx(Primitive.TOCItem, { href: item.url, className: cn('prose 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', item.depth <= 2 && 'ps-3', item.depth === 3 && 'ps-6', item.depth >= 4 && 'ps-8'), children: item.title }));
35
34
  }
36
- const Context = createContext(null);
37
- const TocProvider = Context.Provider || Context;
38
- export function TocPopover({ open, onOpenChange, ref: _ref, ...props }) {
39
- return (_jsx(Collapsible, { open: open, onOpenChange: onOpenChange, ...props, children: _jsx(TocProvider, { value: useMemo(() => ({
40
- open,
41
- setOpen: onOpenChange,
42
- }), [onOpenChange, open]), children: props.children }) }));
43
- }
44
- export function TocPopoverTrigger({ items, ...props }) {
45
- const { text } = useI18n();
46
- const { open } = use(Context);
47
- const active = Primitive.useActiveAnchor();
48
- const current = useMemo(() => {
49
- return items.find((item) => active === item.url.slice(1))?.title;
50
- }, [items, active]);
51
- return (_jsxs(CollapsibleTrigger, { ...props, className: cn('inline-flex items-center text-sm gap-2 text-nowrap px-4 py-2.5 text-start md:px-6 focus-visible:outline-none', props.className), children: [_jsx(Text, { className: "size-4 shrink-0" }), text.toc, _jsx(ChevronRight, { className: cn('size-4 shrink-0 text-fd-muted-foreground transition-all', !current && 'opacity-0', open ? 'rotate-90' : '-ms-1.5') }), _jsx("span", { className: cn('truncate text-fd-muted-foreground transition-opacity -ms-1.5', (!current || open) && 'opacity-0'), children: current })] }));
52
- }
53
- export function TocPopoverContent(props) {
54
- return (_jsx(CollapsibleContent, { "data-toc-popover": "", className: "flex flex-col max-h-[50vh]", ...props, children: props.children }));
55
- }
@@ -16,12 +16,6 @@ export interface SidebarOptions extends SidebarProps {
16
16
  tabs?: Option[] | GetSidebarTabsOptions | false;
17
17
  banner?: ReactNode;
18
18
  footer?: ReactNode;
19
- /**
20
- * Hide search trigger. You can also disable search for the entire site from `<RootProvider />`.
21
- *
22
- * @defaultValue false
23
- */
24
- hideSearch?: boolean;
25
19
  }
26
20
  export declare function SidebarLinkItem({ item, ...props }: {
27
21
  item: LinkItemType;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/layouts/docs/shared.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,KAAK,iBAAiB,EAMtB,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,eAAe;;CAE3B,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAExC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,qBAAqB,GAAG,KAAK,CAAC;IAEhD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,GAAG,KAAK,EACT,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAmCA;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,EAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI,wBASpB"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/layouts/docs/shared.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,KAAK,iBAAiB,EAMtB,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,eAAe;;CAE3B,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAExC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,qBAAqB,GAAG,KAAK,CAAC;IAEhD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,GAAG,KAAK,EACT,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAmCA;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,cAAc,CAAC,MAAM,CAAC,EAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI,wBASpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"docs-client.d.ts","sourceRoot":"","sources":["../../src/layouts/docs-client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AASvE,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,2CAiBxD;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,2CAkB/C;AAED,wBAAgB,kBAAkB,wDAoBjC"}
1
+ {"version":3,"file":"docs-client.d.ts","sourceRoot":"","sources":["../../src/layouts/docs-client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AASvE,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,2CAiBxD;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,2CAkB/C;AAED,wBAAgB,kBAAkB,wDAyBjC"}
@@ -11,7 +11,7 @@ import { SearchToggle } from '../components/layout/search-toggle.js';
11
11
  export function Navbar(props) {
12
12
  const { open } = useSidebar();
13
13
  const { isTransparent } = useNav();
14
- return (_jsx("header", { id: "nd-subnav", ...props, className: cn('sticky top-(--fd-banner-height) z-30 flex h-14 flex-row items-center border-b border-fd-foreground/10 px-4 backdrop-blur-lg transition-colors', (!isTransparent || open) && 'bg-fd-background/80', props.className), children: props.children }));
14
+ return (_jsx("header", { id: "nd-subnav", ...props, className: cn('sticky top-(--fd-banner-height) z-30 flex h-14 items-center px-4 border-b border-fd-foreground/10 transition-colors backdrop-blur-sm md:px-6', (!isTransparent || open) && 'bg-fd-background/80', props.className), children: props.children }));
15
15
  }
16
16
  export function NavbarSidebarTrigger(props) {
17
17
  const { open } = useSidebar();
@@ -24,7 +24,9 @@ export function CollapsibleControl() {
24
24
  const { collapsed } = useSidebar();
25
25
  if (!collapsed)
26
26
  return;
27
- return (_jsxs("div", { className: "fixed flex flex-row items-center animate-fd-fade-in rounded-xl p-0.5 border bg-fd-muted text-fd-muted-foreground z-10 top-12 shadow-md max-md:hidden xl:top-4 xl:start-4 max-xl:end-4", children: [_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
27
+ return (_jsxs("div", { className: "fixed flex flex-row animate-fd-fade-in rounded-xl p-0.5 border bg-fd-muted text-fd-muted-foreground z-10 xl:start-4 max-xl:end-4", style: {
28
+ top: 'calc(var(--fd-banner-height) + var(--fd-tocnav-height) + var(--spacing) * 4)',
29
+ }, children: [_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
28
30
  color: 'ghost',
29
31
  size: 'icon-sm',
30
32
  }), 'rounded-lg'), children: _jsx(SidebarIcon, {}) }), _jsx(SearchToggle, { size: "icon-sm", className: "rounded-lg" })] }));
@@ -15,9 +15,8 @@ export interface DocsLayoutProps extends BaseLayoutProps {
15
15
  */
16
16
  containerProps?: HTMLAttributes<HTMLDivElement>;
17
17
  }
18
- export declare function DocsLayout({ nav: { enabled: navEnabled, component: navReplace, transparentMode, ...nav }, themeSwitch, sidebar, i18n, children, ...props }: DocsLayoutProps): ReactNode;
19
- export declare function DocsLayoutSidebar({ collapsible, components, tabs: tabOptions, hideSearch, tree, nav, links, footer, banner, ...props }: Partial<SidebarOptions> & {
20
- tree: PageTree.Root;
18
+ export declare function DocsLayout({ nav: { transparentMode, ...nav }, searchToggle, disableThemeSwitch, themeSwitch, sidebar: { tabs: tabOptions, ...sidebar }, i18n, children, ...props }: DocsLayoutProps): ReactNode;
19
+ export declare function DocsLayoutSidebar({ collapsible, components, nav, links, footer, banner, ...props }: Omit<SidebarOptions, 'tabs'> & {
21
20
  links?: LinkItemType[];
22
21
  nav?: ReactNode;
23
22
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/layouts/docs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AAcrE,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAClB,MAAM,EACN,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAQ/B,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IAEpB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;QAClC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,CAAC;IAEF;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EAAE,EACH,OAAO,EAAE,UAAiB,EAC1B,SAAS,EAAE,UAAU,EACrB,eAAe,EACf,GAAG,GAAG,EACF,EACN,WAAW,EACX,OAAY,EACZ,IAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,GAAG,SAAS,CAkF7B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,WAAkB,EAClB,UAAU,EACV,IAAI,EAAE,UAAU,EAChB,UAAU,EACV,IAAI,EACJ,GAAG,EACH,KAAU,EACV,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;IAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB,2CAwDA;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAW,EACX,KAAU,GACX,EAAE;IACD,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;CAC9C,kDAiCA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/layouts/docs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AAcrE,OAAO,EACL,KAAK,YAAY,EAEjB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAClB,MAAM,EACN,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAO/B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAQ/B,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IAEpB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG;QAClC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,CAAC;IAEF;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,EACzB,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,GAAG,EAAO,EACrC,YAAY,EACZ,kBAA0B,EAC1B,WAA8C,EAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,EAAO,EAC9C,IAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,GAAG,SAAS,CAoG7B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,WAAkB,EAClB,UAAU,EACV,GAAG,EACH,KAAU,EACV,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG;IAChC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB,2CA2CA;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAW,EACX,KAAU,GACX,EAAE;IACD,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;CAC9C,kDAiCA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
@@ -4,7 +4,7 @@ import { Languages, SidebarIcon } from 'lucide-react';
4
4
  import { cn } from '../utils/cn.js';
5
5
  import { buttonVariants } from '../components/ui/button.js';
6
6
  import { CollapsibleSidebar, Sidebar, SidebarFooter, SidebarHeader, SidebarCollapseTrigger, SidebarViewport, SidebarPageTree, } from '../components/layout/sidebar.js';
7
- import { replaceOrDefault } from '../layouts/shared.js';
7
+ import { slot, slots } from '../layouts/shared.js';
8
8
  import { BaseLinkItem, } from '../layouts/links.js';
9
9
  import { RootToggle } from '../components/layout/root-toggle.js';
10
10
  import { getLinks } from './shared.js';
@@ -16,27 +16,27 @@ import { LargeSearchToggle, SearchToggle, } from '../components/layout/search-to
16
16
  import { getSidebarTabsFromOptions, layoutVariables, SidebarLinkItem, } from '../layouts/docs/shared.js';
17
17
  import { StylesProvider, NavProvider, } from '../contexts/layout.js';
18
18
  import Link from 'fumadocs-core/link';
19
- export function DocsLayout({ nav: { enabled: navEnabled = true, component: navReplace, transparentMode, ...nav } = {}, themeSwitch, sidebar = {}, i18n = false, children, ...props }) {
19
+ export function DocsLayout({ nav: { transparentMode, ...nav } = {}, searchToggle, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, sidebar: { tabs: tabOptions, ...sidebar } = {}, i18n = false, children, ...props }) {
20
+ const tabs = useMemo(() => getSidebarTabsFromOptions(tabOptions, props.tree) ?? [], [tabOptions, props.tree]);
20
21
  const links = getLinks(props.links ?? [], props.githubUrl);
21
- const variables = cn('[--fd-tocnav-height:36px] md:[--fd-sidebar-width:268px] lg:[--fd-sidebar-width:286px] xl:[--fd-toc-width:286px] xl:[--fd-tocnav-height:0px]', !navReplace && navEnabled
22
+ const variables = cn('[--fd-tocnav-height:36px] md:[--fd-sidebar-width:268px] lg:[--fd-sidebar-width:286px] xl:[--fd-toc-width:286px] xl:[--fd-tocnav-height:0px]', !nav.component && nav.enabled !== false
22
23
  ? '[--fd-nav-height:calc(var(--spacing)*14)] md:[--fd-nav-height:0px]'
23
24
  : undefined);
24
25
  const pageStyles = {
25
26
  tocNav: cn('xl:hidden'),
26
27
  toc: cn('max-xl:hidden'),
27
28
  };
28
- return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsxs(NavProvider, { transparentMode: transparentMode, children: [replaceOrDefault({ enabled: navEnabled, component: navReplace }, _jsxs(Navbar, { className: "md:hidden", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-semibold", children: nav.title }), _jsx("div", { className: "flex flex-1 flex-row items-center gap-1", children: nav.children }), _jsx(SearchToggle, { hideIfDisabled: true }), _jsx(NavbarSidebarTrigger, { className: "-me-2 md:hidden" })] }), nav), _jsxs("main", { id: "nd-docs-layout", ...props.containerProps, className: cn('flex flex-1 flex-row pe-(--fd-layout-offset)', variables, props.containerProps?.className), style: {
29
+ return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsxs(NavProvider, { transparentMode: transparentMode, children: [slot(nav, _jsxs(Navbar, { className: "md:hidden", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-semibold", children: nav.title }), _jsx("div", { className: "flex flex-1 flex-row items-center gap-1", children: nav.children }), slots('sm', searchToggle, _jsx(SearchToggle, { hideIfDisabled: true })), _jsx(NavbarSidebarTrigger, { className: "-me-2 md:hidden" })] })), _jsxs("main", { id: "nd-docs-layout", ...props.containerProps, className: cn('flex flex-1 flex-row pe-(--fd-layout-offset)', variables, props.containerProps?.className), style: {
29
30
  ...layoutVariables,
30
31
  ...props.containerProps?.style,
31
- }, children: [replaceOrDefault(sidebar, _jsx(DocsLayoutSidebar, { tree: props.tree, ...sidebar, links: links, nav: _jsxs(_Fragment, { children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex text-[15px] items-center gap-2.5 font-medium", children: nav.title }), nav.children] }), footer: _jsxs(_Fragment, { children: [_jsx(DocsLayoutSidebarFooter, { links: links.filter((item) => item.type === 'icon'), i18n: i18n, themeSwitch: themeSwitch }), sidebar.footer] }) })), _jsx(StylesProvider, { ...pageStyles, children: children })] })] }) }));
32
+ }, children: [slot(sidebar, _jsx(DocsLayoutSidebar, { ...sidebar, links: links, nav: _jsxs(_Fragment, { children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex text-[15px] items-center gap-2.5 font-medium", children: nav.title }), nav.children] }), banner: _jsxs(_Fragment, { children: [tabs.length > 0 ? (_jsx(RootToggle, { options: tabs, className: "-mx-2" })) : null, slots('lg', searchToggle, _jsx(LargeSearchToggle, { hideIfDisabled: true, className: "rounded-lg max-md:hidden" })), sidebar.banner] }), footer: _jsxs(_Fragment, { children: [_jsx(DocsLayoutSidebarFooter, { links: links.filter((item) => item.type === 'icon'), i18n: i18n, themeSwitch: themeSwitch }), sidebar.footer] }) })), _jsx(StylesProvider, { ...pageStyles, children: children })] })] }) }));
32
33
  }
33
- export function DocsLayoutSidebar({ collapsible = true, components, tabs: tabOptions, hideSearch, tree, nav, links = [], footer, banner, ...props }) {
34
- const tabs = useMemo(() => getSidebarTabsFromOptions(tabOptions, tree) ?? [], [tabOptions, tree]);
34
+ export function DocsLayoutSidebar({ collapsible = true, components, nav, links = [], footer, banner, ...props }) {
35
35
  const Aside = collapsible ? CollapsibleSidebar : Sidebar;
36
36
  return (_jsxs(_Fragment, { children: [collapsible ? _jsx(CollapsibleControl, {}) : null, _jsxs(Aside, { ...props, className: cn('md:ps-(--fd-layout-offset)', props.className), children: [_jsxs(SidebarHeader, { children: [_jsxs("div", { className: "flex flex-row pt-1 max-md:hidden", children: [nav, collapsible && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
37
37
  color: 'ghost',
38
38
  size: 'icon-sm',
39
- }), 'ms-auto mb-auto text-fd-muted-foreground max-md:hidden'), children: _jsx(SidebarIcon, {}) }))] }), banner, tabs.length > 0 ? (_jsx(RootToggle, { options: tabs, className: "-mx-2" })) : null, !hideSearch ? (_jsx(LargeSearchToggle, { hideIfDisabled: true, className: "rounded-lg max-md:hidden" })) : null] }), _jsxs(SidebarViewport, { children: [_jsx("div", { className: "mb-4 empty:hidden", children: links
39
+ }), 'ms-auto mb-auto text-fd-muted-foreground max-md:hidden'), children: _jsx(SidebarIcon, {}) }))] }), banner] }), _jsxs(SidebarViewport, { children: [_jsx("div", { className: "mb-4 empty:hidden", children: links
40
40
  .filter((v) => v.type !== 'icon')
41
41
  .map((item, i) => (_jsx(SidebarLinkItem, { item: item }, i))) }), _jsx(SidebarPageTree, { components: components })] }), _jsx(SidebarFooter, { children: footer })] })] }));
42
42
  }
@@ -44,7 +44,7 @@ export function DocsLayoutSidebarFooter({ i18n, themeSwitch, links = [], }) {
44
44
  // empty footer items
45
45
  if (links.length === 0 && !i18n && themeSwitch?.enabled === false)
46
46
  return null;
47
- return (_jsxs("div", { className: "flex flex-row items-center", children: [links.map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon', color: 'ghost' }), 'text-fd-muted-foreground md:[&_svg]:size-4.5'), "aria-label": item.label, children: item.icon }, i))), _jsx("div", { role: "separator", className: "flex-1" }), i18n ? (_jsxs(LanguageToggle, { className: "me-1.5", children: [_jsx(Languages, { className: "size-4.5" }), _jsx(LanguageToggleText, { className: "md:hidden" })] })) : null, replaceOrDefault(themeSwitch, _jsx(ThemeToggle, { className: "p-0", mode: themeSwitch?.mode }))] }));
47
+ return (_jsxs("div", { className: "flex flex-row items-center", children: [links.map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon', color: 'ghost' }), 'text-fd-muted-foreground md:[&_svg]:size-4.5'), "aria-label": item.label, children: item.icon }, i))), _jsx("div", { role: "separator", className: "flex-1" }), i18n ? (_jsxs(LanguageToggle, { className: "me-1.5", children: [_jsx(Languages, { className: "size-4.5" }), _jsx(LanguageToggleText, { className: "md:hidden" })] })) : null, slot(themeSwitch, _jsx(ThemeToggle, { className: "p-0", mode: themeSwitch?.mode }))] }));
48
48
  }
49
49
  export { CollapsibleControl, Navbar, NavbarSidebarTrigger };
50
50
  export { getSidebarTabsFromOptions } from './docs/shared.js';
@@ -1,7 +1,7 @@
1
1
  import { type HTMLAttributes } from 'react';
2
2
  import { type NavOptions } from '../layouts/shared.js';
3
3
  import { type BaseLayoutProps } from './shared.js';
4
- export interface HomeLayoutProps extends BaseLayoutProps, HTMLAttributes<HTMLElement> {
4
+ export interface HomeLayoutProps extends BaseLayoutProps {
5
5
  nav?: Partial<NavOptions & {
6
6
  /**
7
7
  * Open mobile menu when hovering the trigger
@@ -9,5 +9,6 @@ export interface HomeLayoutProps extends BaseLayoutProps, HTMLAttributes<HTMLEle
9
9
  enableHoverToOpen?: boolean;
10
10
  }>;
11
11
  }
12
- export declare function HomeLayout(props: HomeLayoutProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function HomeLayout(props: HomeLayoutProps & HTMLAttributes<HTMLElement>): import("react/jsx-runtime").JSX.Element;
13
+ export declare function Header({ nav, i18n, links, githubUrl, themeSwitch, searchToggle, }: HomeLayoutProps): import("react/jsx-runtime").JSX.Element;
13
14
  //# sourceMappingURL=home.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/layouts/home.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AA6B1D,MAAM,WAAW,eACf,SAAQ,eAAe,EACrB,cAAc,CAAC,WAAW,CAAC;IAC7B,GAAG,CAAC,EAAE,OAAO,CACX,UAAU,GAAG;QACX;;WAEG;QACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CACF,CAAC;CACH;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CA2BhD"}
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/layouts/home.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAY,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AA6B1D,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,GAAG,CAAC,EAAE,OAAO,CACX,UAAU,GAAG;QACX;;WAEG;QACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CACF,CAAC;CACH;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,eAAe,GAAG,cAAc,CAAC,WAAW,CAAC,2CAmCrD;AAED,wBAAgB,MAAM,CAAC,EACrB,GAAQ,EACR,IAAY,EACZ,KAAK,EACL,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,eAAe,2CA8FjB"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { Fragment } from 'react';
3
- import { replaceOrDefault } from '../layouts/shared.js';
2
+ import { Fragment, useMemo } from 'react';
3
+ import { slot, slots } from '../layouts/shared.js';
4
4
  import { cn } from '../utils/cn.js';
5
5
  import { getLinks } from './shared.js';
6
6
  import { NavProvider } from '../contexts/layout.js';
@@ -12,20 +12,18 @@ import { ChevronDown, Languages } from 'lucide-react';
12
12
  import Link from 'fumadocs-core/link';
13
13
  import { Menu, MenuContent, MenuLinkItem, MenuTrigger, } from '../layouts/home/menu.js';
14
14
  export function HomeLayout(props) {
15
- const { nav, links, githubUrl, i18n: _i18n, themeSwitch: _themeSwitch, disableThemeSwitch: _disableThemeSwitch, ...rest } = props;
16
- const finalLinks = getLinks(links, githubUrl);
17
- return (_jsx(NavProvider, { transparentMode: nav?.transparentMode, children: _jsxs("main", { id: "nd-home-layout", ...rest, className: cn('flex flex-1 flex-col pt-14', rest.className), children: [replaceOrDefault(nav, _jsx(Header, { finalLinks: finalLinks, ...props }), {
18
- items: finalLinks,
19
- }), props.children] }) }));
15
+ const { nav, links, githubUrl, i18n, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, searchToggle, ...rest } = props;
16
+ return (_jsx(NavProvider, { transparentMode: nav?.transparentMode, children: _jsxs("main", { id: "nd-home-layout", ...rest, className: cn('flex flex-1 flex-col pt-14', rest.className), children: [slot(nav, _jsx(Header, { links: links, nav: nav, themeSwitch: themeSwitch, searchToggle: searchToggle, i18n: i18n, githubUrl: githubUrl })), props.children] }) }));
20
17
  }
21
- function Header({ nav: { enableSearch = true, ...nav } = {}, i18n = false, finalLinks, themeSwitch, }) {
18
+ export function Header({ nav = {}, i18n = false, links, githubUrl, themeSwitch, searchToggle, }) {
19
+ const finalLinks = useMemo(() => getLinks(links, githubUrl), [links, githubUrl]);
22
20
  const navItems = finalLinks.filter((item) => ['nav', 'all'].includes(item.on ?? 'all'));
23
21
  const menuItems = finalLinks.filter((item) => ['menu', 'all'].includes(item.on ?? 'all'));
24
22
  return (_jsxs(Navbar, { children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-semibold", children: nav.title }), nav.children, _jsx("ul", { className: "flex flex-row items-center gap-2 px-6 max-sm:hidden", children: navItems
25
23
  .filter((item) => !isSecondary(item))
26
- .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm" }, i))) }), _jsxs("div", { className: "flex flex-row items-center justify-end gap-1.5 flex-1", children: [enableSearch ? (_jsxs(_Fragment, { children: [_jsx(SearchToggle, { className: "lg:hidden", hideIfDisabled: true }), _jsx(LargeSearchToggle, { className: "w-full max-w-[240px] max-lg:hidden", hideIfDisabled: true })] })) : null, replaceOrDefault(themeSwitch, _jsx(ThemeToggle, { className: "max-lg:hidden", mode: themeSwitch?.mode })), i18n ? (_jsx(LanguageToggle, { className: "max-lg:hidden", children: _jsx(Languages, { className: "size-5" }) })) : null] }), _jsxs("ul", { className: "flex flex-row items-center", children: [navItems.filter(isSecondary).map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "-me-1.5 max-lg:hidden" }, i))), _jsxs(Menu, { className: "lg:hidden", children: [_jsx(MenuTrigger, { "aria-label": "Toggle Menu", className: "group -me-2", enableHover: nav.enableHoverToOpen, children: _jsx(ChevronDown, { className: "size-3 transition-transform duration-300 group-data-[state=open]:rotate-180" }) }), _jsxs(MenuContent, { className: "sm:flex-row sm:items-center sm:justify-end", children: [menuItems
24
+ .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm" }, i))) }), _jsxs("div", { className: "flex flex-row items-center justify-end gap-1.5 flex-1", children: [slots('sm', searchToggle, _jsx(SearchToggle, { className: "lg:hidden", hideIfDisabled: true })), slots('lg', searchToggle, _jsx(LargeSearchToggle, { className: "w-full max-w-[240px] max-lg:hidden", hideIfDisabled: true })), slot(themeSwitch, _jsx(ThemeToggle, { className: "max-lg:hidden", mode: themeSwitch?.mode })), i18n ? (_jsx(LanguageToggle, { className: "max-lg:hidden", children: _jsx(Languages, { className: "size-5" }) })) : null] }), _jsxs("ul", { className: "flex flex-row items-center", children: [navItems.filter(isSecondary).map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "-me-1.5 max-lg:hidden" }, i))), _jsxs(Menu, { className: "lg:hidden", children: [_jsx(MenuTrigger, { "aria-label": "Toggle Menu", className: "group -me-2", enableHover: nav.enableHoverToOpen, children: _jsx(ChevronDown, { className: "size-3 transition-transform duration-300 group-data-[state=open]:rotate-180" }) }), _jsxs(MenuContent, { className: "sm:flex-row sm:items-center sm:justify-end", children: [menuItems
27
25
  .filter((item) => !isSecondary(item))
28
- .map((item, i) => (_jsx(MenuLinkItem, { item: item, className: "sm:hidden" }, i))), _jsxs("div", { className: "-ms-1.5 flex flex-row items-center gap-1.5 max-sm:mt-2", children: [menuItems.filter(isSecondary).map((item, i) => (_jsx(MenuLinkItem, { item: item, className: "-me-1.5" }, i))), _jsx("div", { role: "separator", className: "flex-1" }), i18n ? (_jsxs(LanguageToggle, { children: [_jsx(Languages, { className: "size-5" }), _jsx(LanguageToggleText, {}), _jsx(ChevronDown, { className: "size-3 text-fd-muted-foreground" })] })) : null, replaceOrDefault(themeSwitch, _jsx(ThemeToggle, { mode: themeSwitch?.mode }))] })] })] })] })] }));
26
+ .map((item, i) => (_jsx(MenuLinkItem, { item: item, className: "sm:hidden" }, i))), _jsxs("div", { className: "-ms-1.5 flex flex-row items-center gap-1.5 max-sm:mt-2", children: [menuItems.filter(isSecondary).map((item, i) => (_jsx(MenuLinkItem, { item: item, className: "-me-1.5" }, i))), _jsx("div", { role: "separator", className: "flex-1" }), i18n ? (_jsxs(LanguageToggle, { children: [_jsx(Languages, { className: "size-5" }), _jsx(LanguageToggleText, {}), _jsx(ChevronDown, { className: "size-3 text-fd-muted-foreground" })] })) : null, slot(themeSwitch, _jsx(ThemeToggle, { mode: themeSwitch?.mode }))] })] })] })] })] }));
29
27
  }
30
28
  function NavbarLinkItem({ item, ...props }) {
31
29
  if (item.type === 'custom')
@@ -12,7 +12,7 @@ import { isActive } from '../utils/is-active.js';
12
12
  export function Navbar({ mode, ...props }) {
13
13
  const { open, collapsed } = useSidebar();
14
14
  const { isTransparent } = useNav();
15
- return (_jsx("header", { id: "nd-subnav", ...props, className: cn('fixed inset-x-0 top-(--fd-banner-height) z-10 px-(--fd-layout-offset) backdrop-blur-lg transition-colors', (!isTransparent || open) && 'bg-fd-background/80', mode === 'auto' &&
15
+ return (_jsx("header", { id: "nd-subnav", ...props, className: cn('fixed inset-x-0 top-(--fd-banner-height) z-10 px-(--fd-layout-offset) backdrop-blur-sm transition-colors', (!isTransparent || open) && 'bg-fd-background/80', mode === 'auto' &&
16
16
  !collapsed &&
17
17
  'ps-[calc(var(--fd-layout-offset)+var(--fd-sidebar-width))]', props.className), children: props.children }));
18
18
  }
@@ -12,6 +12,6 @@ export interface DocsLayoutProps extends BaseLayoutProps {
12
12
  sidebar?: Omit<Partial<SidebarOptions>, 'component' | 'enabled'>;
13
13
  containerProps?: HTMLAttributes<HTMLDivElement>;
14
14
  }
15
- export declare function DocsLayout({ tabMode, nav: { transparentMode, ...nav }, sidebar: { collapsible: sidebarCollapsible, tabs: tabOptions, banner: sidebarBanner, footer: sidebarFooter, components: sidebarComponents, ...sidebar }, i18n, themeSwitch, ...props }: DocsLayoutProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function DocsLayout({ tabMode, nav: { transparentMode, ...nav }, sidebar: { collapsible: sidebarCollapsible, tabs: tabOptions, banner: sidebarBanner, footer: sidebarFooter, components: sidebarComponents, ...sidebar }, i18n, disableThemeSwitch, themeSwitch, searchToggle, ...props }: DocsLayoutProps): import("react/jsx-runtime").JSX.Element;
16
16
  export { Navbar, NavbarSidebarTrigger };
17
17
  //# sourceMappingURL=notebook.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/layouts/notebook.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AAC/D,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAC;AA0B1B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAGL,MAAM,EACN,oBAAoB,EAErB,MAAM,mBAAmB,CAAC;AAS3B,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAE/B,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG;QAC7B,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;KACvB,CAAC;IAEF,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;IAEjE,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAmB,EACnB,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,GAAG,EAAO,EACrC,OAAO,EAAE,EACP,WAAW,EAAE,kBAAyB,EACtC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,iBAAiB,EAC7B,GAAG,OAAO,EACN,EACN,IAAY,EACZ,WAAW,EACX,GAAG,KAAK,EACT,EAAE,eAAe,2CAqIjB;AAiLD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/layouts/notebook.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAA2B,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAE,KAAK,eAAe,EAAyB,MAAM,kBAAkB,CAAC;AAsB/E,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAGL,MAAM,EACN,oBAAoB,EAErB,MAAM,mBAAmB,CAAC;AAa3B,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAE/B,GAAG,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG;QAC7B,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;KACvB,CAAC;IAEF,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC,CAAC;IAEjE,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAmB,EACnB,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,GAAG,EAAO,EACrC,OAAO,EAAE,EACP,WAAW,EAAE,kBAAyB,EACtC,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,iBAAiB,EAC7B,GAAG,OAAO,EACN,EACN,IAAY,EACZ,kBAA0B,EAC1B,WAA8C,EAC9C,YAAY,EACZ,GAAG,KAAK,EACT,EAAE,eAAe,2CAmJjB;AAqLD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC"}
@@ -1,9 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Fragment, useMemo } from 'react';
3
- import { getLinks, replaceOrDefault, } from '../layouts/shared.js';
3
+ import { getLinks, slot, slots } from '../layouts/shared.js';
4
4
  import { CollapsibleSidebar, Sidebar, SidebarCollapseTrigger, SidebarFooter, SidebarHeader, SidebarViewport, SidebarPageTree, } from '../components/layout/sidebar.js';
5
5
  import { TreeContextProvider } from '../contexts/tree.js';
6
- import { LargeSearchToggle, SearchToggle, } from '../components/layout/search-toggle.js';
7
6
  import { cn } from '../utils/cn.js';
8
7
  import { buttonVariants } from '../components/ui/button.js';
9
8
  import { ChevronDown, Languages, SidebarIcon } from 'lucide-react';
@@ -16,7 +15,8 @@ import { LayoutTab, LayoutTabs, Navbar, NavbarSidebarTrigger, SidebarLayoutTab,
16
15
  import { StylesProvider, NavProvider, } from '../contexts/layout.js';
17
16
  import { RootToggle } from '../components/layout/root-toggle.js';
18
17
  import Link from 'fumadocs-core/link';
19
- export function DocsLayout({ tabMode = 'sidebar', nav: { transparentMode, ...nav } = {}, sidebar: { collapsible: sidebarCollapsible = true, tabs: tabOptions, banner: sidebarBanner, footer: sidebarFooter, components: sidebarComponents, ...sidebar } = {}, i18n = false, themeSwitch, ...props }) {
18
+ import { LargeSearchToggle, SearchToggle, } from '../components/layout/search-toggle.js';
19
+ export function DocsLayout({ tabMode = 'sidebar', nav: { transparentMode, ...nav } = {}, sidebar: { collapsible: sidebarCollapsible = true, tabs: tabOptions, banner: sidebarBanner, footer: sidebarFooter, components: sidebarComponents, ...sidebar } = {}, i18n = false, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, searchToggle, ...props }) {
20
20
  const navMode = nav.mode ?? 'auto';
21
21
  const links = getLinks(props.links ?? [], props.githubUrl);
22
22
  const tabs = useMemo(() => getSidebarTabsFromOptions(tabOptions, props.tree) ?? [], [tabOptions, props.tree]);
@@ -38,18 +38,17 @@ export function DocsLayout({ tabMode = 'sidebar', nav: { transparentMode, ...nav
38
38
  color: 'ghost',
39
39
  size: 'icon-sm',
40
40
  }), 'text-fd-muted-foreground mb-auto'), children: _jsx(SidebarIcon, {}) })] })), nav.children, sidebarBanner, tabMode === 'sidebar' && tabs.length > 0 ? (_jsx(RootToggle, { options: tabs, className: "-mx-2" })) : null] }), _jsxs(SidebarViewport, { children: [tabMode === 'navbar' &&
41
- tabs.map((tab, i) => (_jsx(SidebarLayoutTab, { item: tab, className: cn('lg:hidden', i === tabs.length - 1 && 'mb-4') }, tab.url))), links.map((item, i) => (_jsx(SidebarLinkItem, { item: item, className: cn('lg:hidden', i === links.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { components: sidebarComponents })] }), _jsxs(SidebarFooter, { className: cn('flex flex-row items-center', !sidebarFooter && 'md:hidden'), children: [i18n ? (_jsx(LanguageToggle, { className: "me-auto md:hidden", children: _jsx(Languages, { className: "size-5 text-fd-muted-foreground" }) })) : null, replaceOrDefault(themeSwitch, _jsx(ThemeToggle, { className: "md:hidden", mode: themeSwitch?.mode ?? 'light-dark-system' })), sidebarFooter] })] }), _jsx(DocsNavbar, { nav: nav, links: links, i18n: i18n, sidebarCollapsible: sidebarCollapsible, tabs: tabMode == 'navbar' ? tabs : [] }), _jsx(StylesProvider, { ...pageStyles, children: props.children })] }) }) }));
41
+ tabs.map((tab, i) => (_jsx(SidebarLayoutTab, { item: tab, className: cn('lg:hidden', i === tabs.length - 1 && 'mb-4') }, tab.url))), links.map((item, i) => (_jsx(SidebarLinkItem, { item: item, className: cn('lg:hidden', i === links.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { components: sidebarComponents })] }), _jsxs(SidebarFooter, { className: cn('flex flex-row items-center', !sidebarFooter && 'md:hidden'), children: [i18n ? (_jsx(LanguageToggle, { className: "me-auto md:hidden", children: _jsx(Languages, { className: "size-5 text-fd-muted-foreground" }) })) : null, slot(themeSwitch, _jsx(ThemeToggle, { className: "md:hidden", mode: themeSwitch?.mode ?? 'light-dark-system' })), sidebarFooter] })] }), _jsx(DocsNavbar, { mode: nav.mode, nav: _jsx(Link, { href: nav.url ?? '/', className: cn('inline-flex items-center gap-2.5 font-semibold', navMode === 'auto' && 'md:hidden'), children: nav.title }), links: links, i18n: i18n, sidebarCollapsible: sidebarCollapsible, searchToggle: searchToggle, tabs: tabMode == 'navbar' ? tabs : [], children: nav.children }), _jsx(StylesProvider, { ...pageStyles, children: props.children })] }) }) }));
42
42
  }
43
- function DocsNavbar({ sidebarCollapsible, links, themeSwitch, nav = {}, i18n, tabs, }) {
44
- const navMode = nav.mode ?? 'auto';
43
+ function DocsNavbar({ mode: navMode = 'auto', nav, sidebarCollapsible = false, links, themeSwitch, searchToggle, i18n = false, tabs, children, }) {
45
44
  return (_jsxs(Navbar, { mode: navMode, children: [_jsxs("div", { className: cn('flex flex-row border-b border-fd-foreground/10 px-4 h-14', navMode === 'auto' && 'md:px-6'), children: [_jsxs("div", { className: cn('flex flex-row items-center', navMode === 'top' && 'flex-1 pe-4'), children: [sidebarCollapsible && navMode === 'auto' ? (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
46
45
  color: 'ghost',
47
46
  size: 'icon-sm',
48
- }), 'text-fd-muted-foreground -ms-1.5 me-2 data-[collapsed=false]:hidden max-md:hidden'), children: _jsx(SidebarIcon, {}) })) : null, _jsx(Link, { href: nav.url ?? '/', className: cn('inline-flex items-center gap-2.5 font-semibold', navMode === 'auto' && 'md:hidden'), children: nav.title })] }), _jsx(LargeSearchToggle, { hideIfDisabled: true, className: cn('w-full my-auto rounded-xl max-md:hidden', navMode === 'top' ? 'max-w-sm px-2' : 'max-w-[240px]') }), _jsxs("div", { className: "flex flex-1 flex-row items-center justify-end", children: [_jsx("div", { className: "flex flex-row items-center gap-6 px-4 empty:hidden max-lg:hidden", children: links
47
+ }), 'text-fd-muted-foreground -ms-1.5 me-2 data-[collapsed=false]:hidden max-md:hidden'), children: _jsx(SidebarIcon, {}) })) : null, nav] }), slots('lg', searchToggle, _jsx(LargeSearchToggle, { hideIfDisabled: true, className: cn('w-full my-auto rounded-xl max-md:hidden', navMode === 'top' ? 'max-w-sm px-2' : 'max-w-[240px]') })), _jsxs("div", { className: "flex flex-1 flex-row items-center justify-end", children: [_jsx("div", { className: "flex flex-row items-center gap-6 px-4 empty:hidden max-lg:hidden", children: links
49
48
  .filter((item) => item.type !== 'icon')
50
- .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground" }, i))) }), nav.children, _jsx(SearchToggle, { hideIfDisabled: true, className: "md:hidden" }), _jsx(NavbarSidebarTrigger, { className: "md:hidden" }), links
49
+ .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground" }, i))) }), children, slots('sm', searchToggle, _jsx(SearchToggle, { hideIfDisabled: true, className: "md:hidden" })), _jsx(NavbarSidebarTrigger, { className: "md:hidden" }), links
51
50
  .filter((item) => item.type === 'icon')
52
- .map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon-sm', color: 'ghost' }), 'text-fd-muted-foreground max-lg:hidden'), "aria-label": item.label, children: item.icon }, i))), i18n ? (_jsx(LanguageToggle, { className: "max-md:hidden", children: _jsx(Languages, { className: "size-4.5 text-fd-muted-foreground" }) })) : null, replaceOrDefault(themeSwitch, _jsx(ThemeToggle, { className: "ms-2 max-md:hidden", mode: themeSwitch?.mode ?? 'light-dark-system' })), sidebarCollapsible && navMode === 'top' ? (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
51
+ .map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon-sm', color: 'ghost' }), 'text-fd-muted-foreground max-lg:hidden'), "aria-label": item.label, children: item.icon }, i))), i18n ? (_jsx(LanguageToggle, { className: "max-md:hidden", children: _jsx(Languages, { className: "size-4.5 text-fd-muted-foreground" }) })) : null, slot(themeSwitch, _jsx(ThemeToggle, { className: "ms-2 max-md:hidden", mode: themeSwitch?.mode ?? 'light-dark-system' })), sidebarCollapsible && navMode === 'top' ? (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
53
52
  color: 'secondary',
54
53
  size: 'icon-sm',
55
54
  }), 'ms-2 text-fd-muted-foreground rounded-full max-md:hidden'), children: _jsx(SidebarIcon, {}) })) : null] })] }), tabs.length > 0 ? (_jsx(LayoutTabs, { className: "px-6 border-b border-fd-foreground/10 h-10 max-lg:hidden", children: tabs.map((tab) => (_jsx(LayoutTab, { ...tab }, tab.url))) })) : null] }));
@@ -11,12 +11,6 @@ export interface NavOptions extends NavProviderProps {
11
11
  * @defaultValue '/'
12
12
  */
13
13
  url?: string;
14
- /**
15
- * Show/hide search toggle
16
- *
17
- * Note: Enable/disable search from root provider instead
18
- */
19
- enableSearch?: boolean;
20
14
  children?: ReactNode;
21
15
  }
22
16
  export interface BaseLayoutProps {
@@ -25,6 +19,13 @@ export interface BaseLayoutProps {
25
19
  component?: ReactNode;
26
20
  mode?: 'light-dark' | 'light-dark-system';
27
21
  };
22
+ searchToggle?: Partial<{
23
+ enabled: boolean;
24
+ components: Partial<{
25
+ sm: ReactNode;
26
+ lg: ReactNode;
27
+ }>;
28
+ }>;
28
29
  /**
29
30
  * Remove theme switcher component
30
31
  *
@@ -53,8 +54,12 @@ export { type LinkItemType };
53
54
  * Get Links Items with shortcuts
54
55
  */
55
56
  export declare function getLinks(links?: LinkItemType[], githubUrl?: string): LinkItemType[];
56
- export declare function replaceOrDefault(obj: {
57
+ export declare function slot(obj: {
57
58
  enabled?: boolean;
58
59
  component?: ReactNode;
59
60
  } | undefined, def: ReactNode, customComponentProps?: object, disabled?: ReactNode): ReactNode;
61
+ export declare function slots<Comp extends Record<string, ReactNode>>(variant: keyof Comp, obj: {
62
+ enabled?: boolean;
63
+ components?: Comp;
64
+ } | undefined, def: ReactNode): ReactNode;
60
65
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/layouts/shared.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE,YAAY,GAAG,mBAAmB,CAAC;KAC3C,CAAC;IAEF;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC;AAE7B;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,GAAE,YAAY,EAAO,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,YAAY,EAAE,CAqBhB;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EACC;IACE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACD,SAAS,EACb,GAAG,EAAE,SAAS,EACd,oBAAoB,CAAC,EAAE,MAAM,EAC7B,QAAQ,CAAC,EAAE,SAAS,GACnB,SAAS,CAMX"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/layouts/shared.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IAClD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,IAAI,CAAC,EAAE,YAAY,GAAG,mBAAmB,CAAC;KAC3C,CAAC;IAEF,YAAY,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;YAClB,EAAE,EAAE,SAAS,CAAC;YACd,EAAE,EAAE,SAAS,CAAC;SACf,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAE5B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,OAAO,EAAE,KAAK,YAAY,EAAE,CAAC;AAE7B;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,GAAE,YAAY,EAAO,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,YAAY,EAAE,CAqBhB;AAED,wBAAgB,IAAI,CAClB,GAAG,EACC;IACE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACD,SAAS,EACb,GAAG,EAAE,SAAS,EACd,oBAAoB,CAAC,EAAE,MAAM,EAC7B,QAAQ,CAAC,EAAE,SAAS,GACnB,SAAS,CAMX;AAED,wBAAgB,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1D,OAAO,EAAE,MAAM,IAAI,EACnB,GAAG,EACC;IACE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,IAAI,CAAC;CACnB,GACD,SAAS,EACb,GAAG,EAAE,SAAS,GACb,SAAS,CAMX"}
@@ -19,10 +19,17 @@ export function getLinks(links = [], githubUrl) {
19
19
  ];
20
20
  return result;
21
21
  }
22
- export function replaceOrDefault(obj, def, customComponentProps, disabled) {
22
+ export function slot(obj, def, customComponentProps, disabled) {
23
23
  if (obj?.enabled === false)
24
24
  return disabled;
25
25
  if (obj?.component !== undefined)
26
26
  return _jsx(Slot, { ...customComponentProps, children: obj.component });
27
27
  return def;
28
28
  }
29
+ export function slots(variant, obj, def) {
30
+ if (obj?.enabled === false)
31
+ return;
32
+ if (obj?.components?.[variant] !== undefined)
33
+ return _jsx(Slot, { children: obj.components[variant] });
34
+ return def;
35
+ }
@@ -1,7 +1,11 @@
1
- import { type HTMLAttributes } from 'react';
2
- import type { PageTree } from 'fumadocs-core/server';
1
+ import { type ComponentProps, type HTMLAttributes } from 'react';
2
+ import type { PageTree, TOCItemType } from 'fumadocs-core/server';
3
3
  import { type BreadcrumbOptions } from 'fumadocs-core/breadcrumb';
4
- export declare function TocPopoverHeader(props: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
4
+ export declare function TocPopoverTrigger({ items, ...props }: ComponentProps<'button'> & {
5
+ items: TOCItemType[];
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ export declare function TocPopoverContent(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function TocPopover(props: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
5
9
  export declare function PageBody(props: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
6
10
  export declare function PageArticle(props: HTMLAttributes<HTMLElement>): import("react/jsx-runtime").JSX.Element;
7
11
  export declare function LastUpdate(props: {
@@ -1 +1 @@
1
- {"version":3,"file":"page-client.d.ts","sourceRoot":"","sources":["../src/page-client.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EAKpB,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAMlC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CA8CrE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CAY7D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,2CAe7D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,2CAc/C;AAED,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC;AAChE,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb,CAAC;CACH;AAyBD,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,2CA+B5C;AA8BD,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,kDAsClD"}
1
+ {"version":3,"file":"page-client.d.ts","sourceRoot":"","sources":["../src/page-client.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,2CAoDrD;AA4DD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAU7D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CA0D/D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CAY7D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,2CAe7D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,2CAc/C;AAED,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC;AAChE,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb,CAAC;CACH;AAyBD,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,2CA+B5C;AA8BD,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,kDAsClD"}
@@ -1,19 +1,54 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Fragment, useEffect, useMemo, useRef, useState, } from 'react';
4
- import { ChevronLeft, ChevronRight } from 'lucide-react';
4
+ import { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react';
5
5
  import Link from 'fumadocs-core/link';
6
6
  import { cn } from './utils/cn.js';
7
7
  import { useI18n } from './contexts/i18n.js';
8
8
  import { useTreeContext, useTreePath } from './contexts/tree.js';
9
9
  import { useSidebar } from './contexts/sidebar.js';
10
- import { usePathname } from 'fumadocs-core/framework';
10
+ import { createContext, usePathname } from 'fumadocs-core/framework';
11
11
  import { getBreadcrumbItemsFromPath, } from 'fumadocs-core/breadcrumb';
12
- import { usePageStyles, useNav } from './contexts/layout.js';
12
+ import { useNav, usePageStyles } from './contexts/layout.js';
13
13
  import { isActive } from './utils/is-active.js';
14
- import { TocPopover } from './components/layout/toc.js';
15
14
  import { useEffectEvent } from 'fumadocs-core/utils/use-effect-event';
16
- export function TocPopoverHeader(props) {
15
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from './components/ui/collapsible.js';
16
+ import * as Primitive from 'fumadocs-core/toc';
17
+ const TocPopoverContext = createContext('TocPopoverContext');
18
+ export function TocPopoverTrigger({ items, ...props }) {
19
+ const { text } = useI18n();
20
+ const { open } = TocPopoverContext.use();
21
+ const active = Primitive.useActiveAnchor();
22
+ const selected = useMemo(() => items.findIndex((item) => active === item.url.slice(1)), [items, active]);
23
+ const path = useTreePath().at(-1);
24
+ const showCurrent = selected !== -1 && !open;
25
+ return (_jsxs(CollapsibleTrigger, { ...props, className: cn('flex flex-row items-center text-sm text-fd-muted-foreground gap-2.5 px-4 py-2.5 text-start focus-visible:outline-none [&_svg]:shrink-0 [&_svg]:size-4 md:px-6', props.className), children: [_jsx(ProgressCircle, { value: (selected + 1) / items.length, max: 1, className: cn(open && 'text-fd-primary') }), _jsxs("span", { className: cn('grid flex-1 *:row-start-1 *:col-start-1', open && 'text-fd-foreground'), children: [_jsx("span", { className: cn('truncate transition-all', showCurrent && 'opacity-0 -translate-y-full pointer-events-none'), children: path?.name ?? text.toc }), _jsx("span", { className: cn('truncate transition-all', !showCurrent && 'opacity-0 translate-y-full pointer-events-none'), children: items[selected]?.title })] }), _jsx(ChevronDown, { className: cn('transition-transform', open && 'rotate-180') })] }));
26
+ }
27
+ function clamp(input, min, max) {
28
+ if (input < min)
29
+ return min;
30
+ if (input > max)
31
+ return max;
32
+ return input;
33
+ }
34
+ function ProgressCircle({ value, strokeWidth = 2, size = 24, min = 0, max = 100, ...restSvgProps }) {
35
+ const normalizedValue = clamp(value, min, max);
36
+ const radius = (size - strokeWidth) / 2;
37
+ const circumference = 2 * Math.PI * radius;
38
+ const progress = (normalizedValue / max) * circumference;
39
+ const circleProps = {
40
+ cx: size / 2,
41
+ cy: size / 2,
42
+ r: radius,
43
+ fill: 'none',
44
+ strokeWidth,
45
+ };
46
+ return (_jsxs("svg", { role: "progressbar", viewBox: `0 0 ${size} ${size}`, "aria-valuenow": normalizedValue, "aria-valuemin": min, "aria-valuemax": max, ...restSvgProps, children: [_jsx("circle", { ...circleProps, className: "stroke-current/25" }), _jsx("circle", { ...circleProps, stroke: "currentColor", strokeDasharray: circumference, strokeDashoffset: circumference - progress, strokeLinecap: "round", transform: `rotate(-90 ${size / 2} ${size / 2})`, className: "transition-all" })] }));
47
+ }
48
+ export function TocPopoverContent(props) {
49
+ return (_jsx(CollapsibleContent, { "data-toc-popover": "", ...props, className: cn('flex flex-col max-h-[50vh]', props.className), children: props.children }));
50
+ }
51
+ export function TocPopover(props) {
17
52
  const ref = useRef(null);
18
53
  const [open, setOpen] = useState(false);
19
54
  const sidebar = useSidebar();
@@ -31,9 +66,13 @@ export function TocPopoverHeader(props) {
31
66
  window.removeEventListener('click', onClick);
32
67
  };
33
68
  }, [onClick]);
34
- return (_jsx("div", { className: cn('sticky overflow-visible z-10', tocNav, props.className), style: {
69
+ return (_jsx("div", { ...props, className: cn('sticky overflow-visible z-10', tocNav, props.className), style: {
70
+ ...props.style,
35
71
  top: 'calc(var(--fd-banner-height) + var(--fd-nav-height))',
36
- }, children: _jsx(TocPopover, { open: open, onOpenChange: setOpen, asChild: true, children: _jsx("header", { ref: ref, id: "nd-tocnav", ...props, className: cn('border-b border-fd-foreground/10 backdrop-blur-md transition-colors', (!isTransparent || open) && 'bg-fd-background/80', open && 'shadow-lg', sidebar.open && 'max-md:hidden'), children: props.children }) }) }));
72
+ }, children: _jsx(TocPopoverContext.Provider, { value: useMemo(() => ({
73
+ open,
74
+ setOpen,
75
+ }), [setOpen, open]), children: _jsx(Collapsible, { open: open, onOpenChange: setOpen, asChild: true, children: _jsx("header", { ref: ref, id: "nd-tocnav", ...props, className: cn('border-b border-fd-foreground/10 backdrop-blur-sm transition-colors', (!isTransparent || open) && 'bg-fd-background/80', open && 'shadow-lg', sidebar.open && 'max-md:hidden'), children: props.children }) }) }) }));
37
76
  }
38
77
  export function PageBody(props) {
39
78
  const { page } = usePageStyles();
@@ -41,7 +80,7 @@ export function PageBody(props) {
41
80
  }
42
81
  export function PageArticle(props) {
43
82
  const { article } = usePageStyles();
44
- return (_jsx("article", { ...props, className: cn('flex w-full flex-1 flex-col gap-6 px-4 pt-8 md:px-6 md:pt-12 xl:px-12 xl:mx-auto', article, props.className), children: props.children }));
83
+ return (_jsx("article", { ...props, className: cn('flex w-full flex-1 flex-col gap-6 px-4 md:px-6 pt-8 md:pt-12 xl:px-12 xl:mx-auto', article, props.className), children: props.children }));
45
84
  }
46
85
  export function LastUpdate(props) {
47
86
  const { text } = useI18n();
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,KAAK,oBAAoB,EAEzB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,mBAAmB,EAAkB,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAEL,KAAK,WAAW,EAIhB,KAAK,eAAe,EAGrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAKL,KAAK,QAAQ,EAEd,MAAM,yBAAyB,CAAC;AAMjC,KAAK,qBAAqB,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAAC,GAC/D,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC5B,CAAC;AAEJ,KAAK,4BAA4B,GAAG,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AAE1E,UAAU,mBACR,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,iBAAkB,SAAQ,eAAe;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,aAAc,SAAQ,WAAW;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,eAAe,CAAC;IAEtB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,cAAc,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAE9D;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAExC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAEhC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,UAAU,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAEpC,SAAS,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACtC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,EACvB,GAAQ,EACR,IAAY,EACZ,qBAAqB,EAAE,EACrB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,GAAG,iBAAiB,EAChB,EACN,cAAc,EAAE,EACd,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,EACrB,GAAG,UAAU,EACT,EACN,GAAG,KAAK,EACT,EAAE,aAAa,2CAkGf;AA+BD;;GAEG;AACH,eAAO,MAAM,QAAQ,2HAOnB,CAAC;AAIH,eAAO,MAAM,eAAe,uIAgB1B,CAAC;AAIH,eAAO,MAAM,SAAS,mIAapB,CAAC;AAIH;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAM5E"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,KAAK,oBAAoB,EAEzB,KAAK,cAAc,EACnB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,mBAAmB,EAAkB,MAAM,mBAAmB,CAAC;AAG7E,OAAO,EAEL,KAAK,WAAW,EAIhB,KAAK,eAAe,EAKrB,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,yBAAyB,CAAC;AAMjC,KAAK,qBAAqB,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,UAAU,CAAC,GAC/D,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC5B,CAAC;AAEJ,KAAK,4BAA4B,GAAG,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AAE1E,UAAU,mBACR,SAAQ,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,iBAAkB,SAAQ,eAAe;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;IAErB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,aAAc,SAAQ,WAAW;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,eAAe,CAAC;IAEtB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,cAAc,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IAE9D;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAExC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAEhC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,UAAU,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAEpC,SAAS,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IACtC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,QAAQ,CAAC,EACvB,GAAQ,EACR,IAAY,EACZ,qBAAqB,EAAE,EACrB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,iBAAiB,EAC5B,GAAG,iBAAiB,EAChB,EACN,cAAc,EAAE,EACd,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,UAAU,EACrB,GAAG,UAAU,EACT,EACN,GAAG,KAAK,EACT,EAAE,aAAa,2CA4Ff;AA+BD;;GAEG;AACH,eAAO,MAAM,QAAQ,2HAOnB,CAAC;AAIH,eAAO,MAAM,eAAe,uIAgB1B,CAAC;AAIH,eAAO,MAAM,SAAS,mIAapB,CAAC;AAIH;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,GAAG,SAAS,CAM5E"}
package/dist/page.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { forwardRef, } from 'react';
3
3
  import { AnchorProvider } from 'fumadocs-core/toc';
4
- import { replaceOrDefault } from './layouts/shared.js';
4
+ import { slot } from './layouts/shared.js';
5
5
  import { cn } from './utils/cn.js';
6
- import { Footer, LastUpdate, TocPopoverHeader, Breadcrumb, PageBody, PageArticle, } from './page-client.js';
7
- import { Toc, TOCItems, TocPopoverTrigger, TocPopoverContent, TOCScrollArea, } from './components/layout/toc.js';
6
+ import { Footer, LastUpdate, TocPopover, Breadcrumb, PageBody, PageArticle, TocPopoverTrigger, TocPopoverContent, } from './page-client.js';
7
+ import { Toc, TOCItems, TOCScrollArea, } from './components/layout/toc.js';
8
8
  import { buttonVariants } from './components/ui/button.js';
9
9
  import { Edit, Text } from 'lucide-react';
10
10
  import { I18nLabel } from './contexts/i18n.js';
@@ -21,10 +21,10 @@ export function DocsPage({ toc = [], full = false, tableOfContentPopover: { enab
21
21
  return (_jsxs(AnchorProvider, { toc: toc, single: tocOptions.single, children: [_jsxs(PageBody, { ...props.container, className: cn(props.container?.className), style: {
22
22
  '--fd-tocnav-height': !tocPopoverEnabled ? '0px' : undefined,
23
23
  ...props.container?.style,
24
- }, children: [replaceOrDefault({ enabled: tocPopoverEnabled, component: tocPopoverReplace }, _jsxs(TocPopoverHeader, { className: "h-10", children: [_jsx(TocPopoverTrigger, { className: "w-full", items: toc }), _jsxs(TocPopoverContent, { children: [tocPopoverOptions.header, _jsx(TOCScrollArea, { isMenu: true, children: tocPopoverOptions.style === 'clerk' ? (_jsx(ClerkTOCItems, { items: toc })) : (_jsx(TOCItems, { items: toc })) }), tocPopoverOptions.footer] })] }), {
24
+ }, children: [slot({ enabled: tocPopoverEnabled, component: tocPopoverReplace }, _jsxs(TocPopover, { className: "h-10", children: [_jsx(TocPopoverTrigger, { className: "w-full", items: toc }), _jsxs(TocPopoverContent, { children: [tocPopoverOptions.header, _jsx(TOCScrollArea, { isMenu: true, children: tocPopoverOptions.style === 'clerk' ? (_jsx(ClerkTOCItems, { items: toc })) : (_jsx(TOCItems, { items: toc })) }), tocPopoverOptions.footer] })] }), {
25
25
  items: toc,
26
26
  ...tocPopoverOptions,
27
- }), _jsxs(PageArticle, { ...props.article, className: cn(full || !tocEnabled ? 'max-w-[1120px]' : 'max-w-[860px]', props.article?.className), children: [replaceOrDefault(props.breadcrumb, _jsx(Breadcrumb, { ...props.breadcrumb })), props.children, _jsx("div", { role: "none", className: "flex-1" }), _jsxs("div", { className: "flex flex-row flex-wrap items-center justify-between gap-4 empty:hidden", children: [props.editOnGithub ? (_jsx(EditOnGitHub, { ...props.editOnGithub })) : null, props.lastUpdate ? (_jsx(LastUpdate, { date: new Date(props.lastUpdate) })) : null] }), replaceOrDefault(props.footer, _jsx(Footer, { items: props.footer?.items }))] })] }), replaceOrDefault({ enabled: tocEnabled, component: tocReplace }, _jsxs(Toc, { children: [tocOptions.header, _jsxs("h3", { className: "inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground", children: [_jsx(Text, { className: "size-4" }), _jsx(I18nLabel, { label: "toc" })] }), _jsx(TOCScrollArea, { children: tocOptions.style === 'clerk' ? (_jsx(ClerkTOCItems, { items: toc })) : (_jsx(TOCItems, { items: toc })) }), tocOptions.footer] }), {
27
+ }), _jsxs(PageArticle, { ...props.article, className: cn(full || !tocEnabled ? 'max-w-[1120px]' : 'max-w-[860px]', props.article?.className), children: [slot(props.breadcrumb, _jsx(Breadcrumb, { ...props.breadcrumb })), props.children, _jsx("div", { role: "none", className: "flex-1" }), _jsxs("div", { className: "flex flex-row flex-wrap items-center justify-between gap-4 empty:hidden", children: [props.editOnGithub ? (_jsx(EditOnGitHub, { ...props.editOnGithub })) : null, props.lastUpdate ? (_jsx(LastUpdate, { date: new Date(props.lastUpdate) })) : null] }), slot(props.footer, _jsx(Footer, { items: props.footer?.items }))] })] }), slot({ enabled: tocEnabled, component: tocReplace }, _jsxs(Toc, { children: [tocOptions.header, _jsxs("h3", { className: "inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground", children: [_jsx(Text, { className: "size-4" }), _jsx(I18nLabel, { label: "toc" })] }), _jsx(TOCScrollArea, { children: tocOptions.style === 'clerk' ? (_jsx(ClerkTOCItems, { items: toc })) : (_jsx(TOCItems, { items: toc })) }), tocOptions.footer] }), {
28
28
  items: toc,
29
29
  ...tocOptions,
30
30
  })] }));
package/dist/style.css CHANGED
@@ -231,6 +231,9 @@
231
231
  .\@container {
232
232
  container-type: inline-size;
233
233
  }
234
+ .pointer-events-none {
235
+ pointer-events: none;
236
+ }
234
237
  .collapse {
235
238
  visibility: collapse;
236
239
  }
@@ -316,9 +319,6 @@
316
319
  .top-2 {
317
320
  top: calc(var(--spacing) * 2);
318
321
  }
319
- .top-12 {
320
- top: calc(var(--spacing) * 12);
321
- }
322
322
  .top-14 {
323
323
  top: calc(var(--spacing) * 14);
324
324
  }
@@ -389,9 +389,6 @@
389
389
  .-mx-2 {
390
390
  margin-inline: calc(var(--spacing) * -2);
391
391
  }
392
- .mx-4 {
393
- margin-inline: calc(var(--spacing) * 4);
394
- }
395
392
  .\!my-0 {
396
393
  margin-block: calc(var(--spacing) * 0) !important;
397
394
  }
@@ -814,9 +811,6 @@
814
811
  .mt-\(--fd-top\) {
815
812
  margin-top: var(--fd-top);
816
813
  }
817
- .mt-2 {
818
- margin-top: calc(var(--spacing) * 2);
819
- }
820
814
  .mt-6 {
821
815
  margin-top: calc(var(--spacing) * 6);
822
816
  }
@@ -1030,6 +1024,14 @@
1030
1024
  --tw-translate-y: calc(calc(1/2 * 100%) * -1);
1031
1025
  translate: var(--tw-translate-x) var(--tw-translate-y);
1032
1026
  }
1027
+ .-translate-y-full {
1028
+ --tw-translate-y: -100%;
1029
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1030
+ }
1031
+ .translate-y-full {
1032
+ --tw-translate-y: 100%;
1033
+ translate: var(--tw-translate-x) var(--tw-translate-y);
1034
+ }
1033
1035
  .scale-0 {
1034
1036
  --tw-scale-x: 0%;
1035
1037
  --tw-scale-y: 0%;
@@ -1039,8 +1041,8 @@
1039
1041
  .-rotate-90 {
1040
1042
  rotate: calc(90deg * -1);
1041
1043
  }
1042
- .rotate-90 {
1043
- rotate: 90deg;
1044
+ .rotate-180 {
1045
+ rotate: 180deg;
1044
1046
  }
1045
1047
  .transform {
1046
1048
  transform: var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y);
@@ -1280,6 +1282,9 @@
1280
1282
  .bg-transparent {
1281
1283
  background-color: transparent;
1282
1284
  }
1285
+ .\[mask-image\:linear-gradient\(to_bottom\,transparent\,white_16px\,white_calc\(100\%-16px\)\,transparent\)\] {
1286
+ mask-image: linear-gradient(to bottom,transparent,white 16px,white calc(100% - 16px),transparent);
1287
+ }
1283
1288
  .fill-blue-500 {
1284
1289
  fill: var(--color-blue-500);
1285
1290
  }
@@ -1289,6 +1294,12 @@
1289
1294
  .fill-red-500 {
1290
1295
  fill: var(--color-red-500);
1291
1296
  }
1297
+ .stroke-current\/25 {
1298
+ stroke: currentcolor;
1299
+ @supports (color: color-mix(in lab, red, red)) {
1300
+ stroke: color-mix(in oklab, currentcolor 25%, transparent);
1301
+ }
1302
+ }
1292
1303
  .stroke-fd-foreground\/10 {
1293
1304
  stroke: color-mix(in srgb, hsl(0, 0%, 3.9%) 10%, transparent);
1294
1305
  @supports (color: color-mix(in lab, red, red)) {
@@ -1316,6 +1327,9 @@
1316
1327
  .p-4 {
1317
1328
  padding: calc(var(--spacing) * 4);
1318
1329
  }
1330
+ .p-px {
1331
+ padding: 1px;
1332
+ }
1319
1333
  .px-\(--fd-layout-offset\) {
1320
1334
  padding-inline: var(--fd-layout-offset);
1321
1335
  }
@@ -1601,6 +1615,16 @@
1601
1615
  .\[--fd-tocnav-height\:36px\] {
1602
1616
  --fd-tocnav-height: 36px;
1603
1617
  }
1618
+ .\*\:col-start-1 {
1619
+ :is(& > *) {
1620
+ grid-column-start: 1;
1621
+ }
1622
+ }
1623
+ .\*\:row-start-1 {
1624
+ :is(& > *) {
1625
+ grid-row-start: 1;
1626
+ }
1627
+ }
1604
1628
  .group-hover\:opacity-100 {
1605
1629
  &:is(:where(.group):hover *) {
1606
1630
  @media (hover: hover) {
@@ -1970,11 +1994,6 @@
1970
1994
  position: sticky;
1971
1995
  }
1972
1996
  }
1973
- .md\:mx-6 {
1974
- @media (width >= 48rem) {
1975
- margin-inline: calc(var(--spacing) * 6);
1976
- }
1977
- }
1978
1997
  .md\:mx-auto {
1979
1998
  @media (width >= 48rem) {
1980
1999
  margin-inline: auto;
@@ -2166,11 +2185,6 @@
2166
2185
  inset-inline-start: calc(var(--spacing) * 4);
2167
2186
  }
2168
2187
  }
2169
- .xl\:top-4 {
2170
- @media (width >= 80rem) {
2171
- top: calc(var(--spacing) * 4);
2172
- }
2173
- }
2174
2188
  .xl\:mx-auto {
2175
2189
  @media (width >= 80rem) {
2176
2190
  margin-inline: auto;
@@ -2313,41 +2327,41 @@
2313
2327
  --color-fd-secondary: hsl(0, 0%, 18%);
2314
2328
  --color-fd-muted-foreground: hsl(0, 0%, 72%);
2315
2329
  }
2316
- .fd-codeblock code span {
2330
+ .shiki code span {
2317
2331
  color: var(--shiki-light);
2318
2332
  }
2319
- .dark .fd-codeblock code span {
2333
+ .dark .shiki code span {
2320
2334
  color: var(--shiki-dark);
2321
2335
  }
2322
2336
  .fd-codeblock pre > * {
2323
2337
  display: grid;
2324
2338
  font-size: 13px;
2325
2339
  }
2326
- .fd-codeblock code .diff.remove {
2340
+ .shiki code .diff.remove {
2327
2341
  background-color: var(--fd-diff-remove-color);
2328
2342
  opacity: 0.7;
2329
2343
  }
2330
- .fd-codeblock code .diff::before {
2344
+ .shiki code .diff::before {
2331
2345
  position: absolute;
2332
2346
  left: 6px;
2333
2347
  }
2334
- .fd-codeblock code .diff.remove::before {
2348
+ .shiki code .diff.remove::before {
2335
2349
  content: '-';
2336
2350
  color: var(--fd-diff-remove-symbol-color);
2337
2351
  }
2338
- .fd-codeblock code .diff.add {
2352
+ .shiki code .diff.add {
2339
2353
  background-color: var(--fd-diff-add-color);
2340
2354
  }
2341
- .fd-codeblock code .diff.add::before {
2355
+ .shiki code .diff.add::before {
2342
2356
  content: '+';
2343
2357
  color: var(--fd-diff-add-symbol-color);
2344
2358
  }
2345
- .fd-codeblock code .diff {
2359
+ .shiki code .diff {
2346
2360
  margin: 0 -16px;
2347
2361
  padding: 0 16px;
2348
2362
  position: relative;
2349
2363
  }
2350
- .fd-codeblock .highlighted {
2364
+ .shiki .highlighted {
2351
2365
  margin: 0 -16px;
2352
2366
  padding: 0 16px;
2353
2367
  background-color: color-mix( in oklab, hsl(0, 0%, 9%) 10%, transparent );
@@ -2355,7 +2369,7 @@
2355
2369
  background-color: color-mix( in oklab, var(--color-fd-primary) 10%, transparent );
2356
2370
  }
2357
2371
  }
2358
- .fd-codeblock .highlighted-word {
2372
+ .shiki .highlighted-word {
2359
2373
  padding: 1px 2px;
2360
2374
  margin: -1px -3px;
2361
2375
  border: 1px solid color-mix(in srgb, hsl(0, 0%, 9%) 50%, transparent);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fumadocs-ui",
3
- "version": "15.2.6",
3
+ "version": "15.2.7",
4
4
  "description": "The framework for building a documentation website in Next.js",
5
5
  "keywords": [
6
6
  "NextJs",
@@ -68,15 +68,15 @@
68
68
  "css/*"
69
69
  ],
70
70
  "dependencies": {
71
- "@radix-ui/react-accordion": "^1.2.3",
72
- "@radix-ui/react-collapsible": "^1.1.3",
73
- "@radix-ui/react-dialog": "^1.1.6",
74
- "@radix-ui/react-direction": "^1.1.0",
75
- "@radix-ui/react-navigation-menu": "^1.2.5",
76
- "@radix-ui/react-popover": "^1.1.6",
77
- "@radix-ui/react-scroll-area": "^1.2.3",
78
- "@radix-ui/react-slot": "^1.1.2",
79
- "@radix-ui/react-tabs": "^1.1.3",
71
+ "@radix-ui/react-accordion": "^1.2.4",
72
+ "@radix-ui/react-collapsible": "^1.1.4",
73
+ "@radix-ui/react-dialog": "^1.1.7",
74
+ "@radix-ui/react-direction": "^1.1.1",
75
+ "@radix-ui/react-navigation-menu": "^1.2.6",
76
+ "@radix-ui/react-popover": "^1.1.7",
77
+ "@radix-ui/react-scroll-area": "^1.2.4",
78
+ "@radix-ui/react-slot": "^1.2.0",
79
+ "@radix-ui/react-tabs": "^1.1.4",
80
80
  "class-variance-authority": "^0.7.1",
81
81
  "lodash.merge": "^4.6.2",
82
82
  "lucide-react": "^0.487.0",
@@ -84,20 +84,20 @@
84
84
  "postcss-selector-parser": "^7.1.0",
85
85
  "react-medium-image-zoom": "^5.2.14",
86
86
  "tailwind-merge": "^3.2.0",
87
- "fumadocs-core": "15.2.6"
87
+ "fumadocs-core": "15.2.7"
88
88
  },
89
89
  "devDependencies": {
90
- "@next/eslint-plugin-next": "^15.2.4",
90
+ "@next/eslint-plugin-next": "^15.3.0",
91
91
  "@tailwindcss/cli": "^4.1.3",
92
92
  "@types/lodash.merge": "^4.6.9",
93
93
  "@types/react": "^19.1.0",
94
- "@types/react-dom": "^19.1.1",
95
- "next": "15.2.4",
94
+ "@types/react-dom": "^19.1.2",
95
+ "next": "15.3.0",
96
96
  "tailwindcss": "^4.1.3",
97
- "tsc-alias": "^1.8.13",
97
+ "tsc-alias": "^1.8.15",
98
98
  "@fumadocs/cli": "0.1.1",
99
99
  "eslint-config-custom": "0.0.0",
100
- "fumadocs-core": "15.2.6",
100
+ "fumadocs-core": "15.2.7",
101
101
  "tsconfig": "0.0.0"
102
102
  },
103
103
  "peerDependencies": {