fumadocs-ui 15.6.6 → 15.6.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
@@ -23,19 +23,22 @@
23
23
  }
24
24
 
25
25
  &[data-line-numbers] code .twoslash-meta-line {
26
- @apply ml-7;
26
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
27
27
  }
28
28
 
29
29
  &[data-line-numbers] code .line {
30
- width: calc(100% - 7 * var(--spacing));
31
30
  counter-increment: line;
32
- padding-left: calc(var(--padding-left) - var(--spacing));
33
- @apply ml-7;
31
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
34
32
 
35
33
  &::after {
36
34
  position: absolute;
37
35
  content: counter(line);
38
- @apply top-0 -left-5 text-fd-muted-foreground/60;
36
+ color: color-mix(
37
+ in oklab,
38
+ var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%,
39
+ transparent
40
+ );
41
+ @apply top-0 left-4;
39
42
  }
40
43
  }
41
44
 
@@ -46,6 +49,7 @@
46
49
 
47
50
  code .diff.remove {
48
51
  opacity: 0.7;
52
+ --fd-counter-color: var(--color-fd-diff-remove-symbol);
49
53
  @apply bg-fd-diff-remove;
50
54
  }
51
55
 
@@ -55,6 +59,7 @@
55
59
  }
56
60
 
57
61
  code .diff.add {
62
+ --fd-counter-color: var(--color-fd-diff-add-symbol);
58
63
  @apply bg-fd-diff-add;
59
64
  }
60
65
 
@@ -63,11 +68,12 @@
63
68
  @apply text-fd-diff-add-symbol;
64
69
  }
65
70
 
66
- .highlighted {
71
+ code .highlighted {
72
+ --fd-counter-color: var(--color-fd-primary);
67
73
  @apply bg-fd-primary/10;
68
74
  }
69
75
 
70
- .highlighted-word {
76
+ code .highlighted-word {
71
77
  padding: 1px;
72
78
  @apply border -my-px border-fd-primary/30 bg-fd-primary/10 rounded-md font-medium;
73
79
  }
@@ -3,7 +3,7 @@ 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
5
  import type { PageTree } from 'fumadocs-core/server';
6
- export interface SidebarProps extends ComponentProps<'aside'> {
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)
@@ -18,13 +18,17 @@ export interface SidebarProps extends ComponentProps<'aside'> {
18
18
  */
19
19
  prefetch?: boolean;
20
20
  /**
21
- * Support collapsing the sidebar on desktop mode
22
- *
23
- * @defaultValue true
21
+ * Children to render
22
+ */
23
+ Content: ReactNode;
24
+ /**
25
+ * Alternative children for mobile
24
26
  */
25
- collapsible?: boolean;
27
+ Mobile?: ReactNode;
26
28
  }
27
- export declare function Sidebar({ defaultOpenLevel, prefetch, collapsible, ...props }: SidebarProps): 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;
28
32
  export declare function SidebarHeader(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
29
33
  export declare function SidebarFooter(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
30
34
  export declare function SidebarViewport(props: ScrollAreaProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
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,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMrD,MAAM,WAAW,YAAa,SAAQ,cAAc,CAAC,OAAO,CAAC;IAC3D;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA2BD,wBAAgB,OAAO,CAAC,EACtB,gBAAoB,EACpB,QAAe,EACf,WAAkB,EAClB,GAAG,KAAK,EACT,EAAE,YAAY,2CA4Hd;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,2CAoClE;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
+ {"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,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAKrD,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,2CAoE5D;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,2CAoClE;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,6 +1,6 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { ChevronDown, ExternalLink, X } from '../../icons.js';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ChevronDown, ExternalLink } from '../../icons.js';
4
4
  import { usePathname } from 'fumadocs-core/framework';
5
5
  import { createContext, Fragment, useContext, useMemo, useRef, useState, } from 'react';
6
6
  import Link from 'fumadocs-core/link';
@@ -14,7 +14,6 @@ import { cva } from 'class-variance-authority';
14
14
  import { useTreeContext, useTreePath } from '../../contexts/tree.js';
15
15
  import { useMediaQuery } from 'fumadocs-core/utils/use-media-query';
16
16
  import { Presence } from '@radix-ui/react-presence';
17
- import { buttonVariants } from '../../components/ui/button.js';
18
17
  const itemVariants = cva('relative flex flex-row items-center gap-2 rounded-xl p-2 ps-(--sidebar-item-offset) text-start text-fd-muted-foreground [overflow-wrap:anywhere] [&_svg]:size-4 [&_svg]:shrink-0', {
19
18
  variants: {
20
19
  active: {
@@ -25,8 +24,8 @@ const itemVariants = cva('relative flex flex-row items-center gap-2 rounded-xl p
25
24
  });
26
25
  const Context = createContext(null);
27
26
  const FolderContext = createContext(null);
28
- export function Sidebar({ defaultOpenLevel = 0, prefetch = true, collapsible = true, ...props }) {
29
- const { open, setOpen, collapsed } = useSidebar();
27
+ export function Sidebar({ defaultOpenLevel = 0, prefetch = true, Mobile, Content, }) {
28
+ const isMobile = useMediaQuery('(width < 768px)') ?? false;
30
29
  const context = useMemo(() => {
31
30
  return {
32
31
  defaultOpenLevel,
@@ -34,26 +33,20 @@ export function Sidebar({ defaultOpenLevel = 0, prefetch = true, collapsible = t
34
33
  level: 1,
35
34
  };
36
35
  }, [defaultOpenLevel, prefetch]);
36
+ return (_jsx(Context.Provider, { value: context, children: isMobile && Mobile != null ? Mobile : Content }));
37
+ }
38
+ export function SidebarContent(props) {
39
+ const { collapsed } = useSidebar();
37
40
  const [hover, setHover] = useState(false);
38
41
  const timerRef = useRef(0);
39
42
  const closeTimeRef = useRef(0);
40
- // md
41
- const isMobile = useMediaQuery('(width < 768px)') ?? false;
42
43
  useOnChange(collapsed, () => {
43
44
  setHover(false);
44
45
  closeTimeRef.current = Date.now() + 150;
45
46
  });
46
- if (isMobile) {
47
- const state = open ? 'open' : 'closed';
48
- return (_jsxs(Context.Provider, { value: context, 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 }) => (_jsxs("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', props.className), children: [_jsx("button", { onClick: () => setOpen(false), className: cn(buttonVariants({
49
- color: 'ghost',
50
- size: 'icon-sm',
51
- className: 'mt-3 mb-1 ms-auto me-4 text-fd-muted-foreground',
52
- })), children: _jsx(X, {}) }), props.children] })) })] }));
53
- }
54
47
  return (_jsx("aside", { id: "nd-sidebar", ...props, "data-collapsed": collapsed, className: cn('fixed start-0 flex flex-col items-end top-(--fd-sidebar-top) bottom-(--fd-sidebar-margin) z-20 bg-fd-card text-sm border-e max-md:hidden *:w-(--fd-sidebar-width)', collapsed && [
55
48
  'rounded-xl border translate-x-(--fd-sidebar-offset) rtl:-translate-x-(--fd-sidebar-offset)',
56
- hover ? 'z-50 shadow-lg' : 'opacity-0 ',
49
+ hover ? 'z-50 shadow-lg' : 'opacity-0',
57
50
  ], props.className), style: {
58
51
  transition: ['top', 'opacity', 'translate', 'width']
59
52
  .map((v) => `${v} ease 250ms`)
@@ -68,15 +61,14 @@ export function Sidebar({ defaultOpenLevel = 0, prefetch = true, collapsible = t
68
61
  ? 'var(--fd-sidebar-width)'
69
62
  : 'calc(var(--fd-sidebar-width) + var(--fd-layout-offset))',
70
63
  }, onPointerEnter: (e) => {
71
- if (!collapsible ||
72
- !collapsed ||
64
+ if (!collapsed ||
73
65
  e.pointerType === 'touch' ||
74
66
  closeTimeRef.current > Date.now())
75
67
  return;
76
68
  window.clearTimeout(timerRef.current);
77
69
  setHover(true);
78
70
  }, onPointerLeave: (e) => {
79
- if (!collapsible || !collapsed || e.pointerType === 'touch')
71
+ if (!collapsed || e.pointerType === 'touch')
80
72
  return;
81
73
  window.clearTimeout(timerRef.current);
82
74
  timerRef.current = window.setTimeout(() => {
@@ -85,10 +77,15 @@ export function Sidebar({ defaultOpenLevel = 0, prefetch = true, collapsible = t
85
77
  }, Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100
86
78
  ? 0
87
79
  : 500);
88
- }, children: _jsx(Context.Provider, { value: context, children: props.children }) }));
80
+ }, children: props.children }));
81
+ }
82
+ export function SidebarContentMobile({ className, children, ...props }) {
83
+ const { open, setOpen } = useSidebar();
84
+ const state = open ? 'open' : 'closed';
85
+ 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 })) })] }));
89
86
  }
90
87
  export function SidebarHeader(props) {
91
- return (_jsx("div", { ...props, className: cn('flex flex-col gap-3 px-4 pb-2 md:pt-4', props.className), children: props.children }));
88
+ return (_jsx("div", { ...props, className: cn('flex flex-col gap-3 p-4 pb-2', props.className), children: props.children }));
92
89
  }
93
90
  export function SidebarFooter(props) {
94
91
  return (_jsx("div", { ...props, className: cn('flex flex-col border-t px-4 py-3', props.className), children: props.children }));
@@ -4,7 +4,7 @@ import type { PageTree } from 'fumadocs-core/server';
4
4
  import type { ReactNode } from 'react';
5
5
  import type { Option } from '../../components/layout/root-toggle.js';
6
6
  import { type GetSidebarTabsOptions } from '../../utils/get-sidebar-tabs.js';
7
- export interface SidebarOptions extends SidebarProps {
7
+ export interface SidebarOptions extends Pick<SidebarProps, 'defaultOpenLevel' | 'prefetch'> {
8
8
  components?: Partial<SidebarComponents>;
9
9
  /**
10
10
  * Root Toggle options
@@ -12,6 +12,12 @@ export interface SidebarOptions extends SidebarProps {
12
12
  tabs?: Option[] | GetSidebarTabsOptions | false;
13
13
  banner?: ReactNode;
14
14
  footer?: ReactNode;
15
+ /**
16
+ * Support collapsing the sidebar on desktop mode
17
+ *
18
+ * @defaultValue true
19
+ */
20
+ collapsible?: boolean;
15
21
  }
16
22
  export declare function SidebarLinkItem({ item, ...props }: {
17
23
  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,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,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
+ {"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,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,UAAU,CAAC;IAC3D,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,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;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,6 +1,6 @@
1
1
  import { type ComponentProps } from 'react';
2
2
  export declare function Navbar(props: ComponentProps<'header'>): import("react/jsx-runtime").JSX.Element;
3
3
  export declare function LayoutBody(props: ComponentProps<'main'>): import("react/jsx-runtime").JSX.Element;
4
- export declare function NavbarSidebarTrigger({ className, ...props }: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
4
+ export declare function SidebarTrigger({ children, ...props }: ComponentProps<'button'>): import("react/jsx-runtime").JSX.Element;
5
5
  export declare function CollapsibleControl(): import("react/jsx-runtime").JSX.Element;
6
6
  //# sourceMappingURL=docs-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"docs-client.d.ts","sourceRoot":"","sources":["../../src/layouts/docs-client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAQ5C,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAgBrD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,2CAqBvD;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAmB1B;AAED,wBAAgB,kBAAkB,4CA2BjC"}
1
+ {"version":3,"file":"docs-client.d.ts","sourceRoot":"","sources":["../../src/layouts/docs-client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAQ5C,wBAAgB,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAgBrD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,MAAM,CAAC,2CAqBvD;AAED,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,2CAY1B;AAED,wBAAgB,kBAAkB,4CA2BjC"}
@@ -9,7 +9,7 @@ import { SidebarCollapseTrigger } from '../components/layout/sidebar.js';
9
9
  import { SearchToggle } from '../components/layout/search-toggle.js';
10
10
  export function Navbar(props) {
11
11
  const { isTransparent } = useNav();
12
- return (_jsx("header", { id: "nd-subnav", ...props, className: cn('fixed top-(--fd-banner-height) inset-x-0 z-30 flex items-center px-4 border-b transition-colors backdrop-blur-sm', !isTransparent && 'bg-fd-background/80', props.className), children: props.children }));
12
+ return (_jsx("header", { id: "nd-subnav", ...props, className: cn('fixed top-(--fd-banner-height) inset-x-0 z-30 flex items-center ps-4 pe-2.5 border-b transition-colors backdrop-blur-sm', !isTransparent && 'bg-fd-background/80', props.className), children: props.children }));
13
13
  }
14
14
  export function LayoutBody(props) {
15
15
  const { collapsed } = useSidebar();
@@ -20,13 +20,9 @@ export function LayoutBody(props) {
20
20
  : 'var(--fd-sidebar-width)',
21
21
  }, children: props.children }));
22
22
  }
23
- export function NavbarSidebarTrigger({ className, ...props }) {
23
+ export function SidebarTrigger({ children, ...props }) {
24
24
  const { setOpen } = useSidebar();
25
- return (_jsx("button", { ...props, "aria-label": "Open Sidebar", className: cn(buttonVariants({
26
- color: 'ghost',
27
- size: 'icon-sm',
28
- className,
29
- })), onClick: () => setOpen((prev) => !prev), children: _jsx(SidebarIcon, {}) }));
25
+ return (_jsx("button", { ...props, "aria-label": "Open Sidebar", onClick: () => setOpen((prev) => !prev), children: children }));
30
26
  }
31
27
  export function CollapsibleControl() {
32
28
  const { collapsed } = useSidebar();
@@ -1,12 +1,12 @@
1
1
  import type { PageTree } from 'fumadocs-core/server';
2
- import { type HTMLAttributes, type ReactNode } from 'react';
2
+ import { type ComponentProps, type HTMLAttributes, type ReactNode } from 'react';
3
3
  import { type LinkItemType } from '../layouts/links.js';
4
4
  import { type BaseLayoutProps } from './shared.js';
5
- import { CollapsibleControl, Navbar, NavbarSidebarTrigger } from '../layouts/docs-client.js';
5
+ import { CollapsibleControl, Navbar, SidebarTrigger } from '../layouts/docs-client.js';
6
6
  import { type SidebarOptions } from '../layouts/docs/shared.js';
7
7
  export interface DocsLayoutProps extends BaseLayoutProps {
8
8
  tree: PageTree.Root;
9
- sidebar?: Partial<SidebarOptions> & {
9
+ sidebar?: SidebarOptions & ComponentProps<'aside'> & {
10
10
  enabled?: boolean;
11
11
  component?: ReactNode;
12
12
  };
@@ -15,6 +15,6 @@ export interface DocsLayoutProps extends BaseLayoutProps {
15
15
  */
16
16
  containerProps?: HTMLAttributes<HTMLDivElement>;
17
17
  }
18
- export declare function DocsLayout({ nav: { transparentMode, ...nav }, sidebar: { tabs: sidebarTabs, footer: sidebarFooter, banner: sidebarBanner, enabled: sidebarEnabled, collapsible: sidebarCollapsible, component: sidebarComponent, components: sidebarComponents, ...sidebarProps }, searchToggle, disableThemeSwitch, themeSwitch, i18n, children, ...props }: DocsLayoutProps): import("react/jsx-runtime").JSX.Element;
19
- export { CollapsibleControl, Navbar, NavbarSidebarTrigger, type LinkItemType };
18
+ export declare function DocsLayout({ nav: { transparentMode, ...nav }, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled, ...sidebarProps }, searchToggle, disableThemeSwitch, themeSwitch, i18n, children, ...props }: DocsLayoutProps): import("react/jsx-runtime").JSX.Element;
19
+ export { CollapsibleControl, Navbar, SidebarTrigger, type LinkItemType };
20
20
  //# sourceMappingURL=docs.d.ts.map
@@ -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,cAAc,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAYrE,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAElB,MAAM,EACN,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAS/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,OAAO,EAAE,EACP,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,cAAqB,EAC9B,WAAW,EAAE,kBAAyB,EACtC,SAAS,EAAE,gBAAgB,EAC3B,UAAU,EAAE,iBAAiB,EAC7B,GAAG,YAAY,EACX,EACN,YAAiB,EACjB,kBAA0B,EAC1B,WAA8C,EAC9C,IAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,2CAuIjB;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,YAAY,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,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAcf,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAElB,MAAM,EACN,cAAc,EACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAS/B,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IAEpB,OAAO,CAAC,EAAE,cAAc,GACtB,cAAc,CAAC,OAAO,CAAC,GAAG;QACxB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,SAAS,CAAC;KACvB,CAAC;IAEJ;;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,OAAO,EAAE,EACP,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,cAAqB,EAC9B,GAAG,YAAY,EACX,EACN,YAAiB,EACjB,kBAA0B,EAC1B,WAA8C,EAC9C,IAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,2CA4NjB;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,CAAC"}
@@ -1,14 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useMemo } from 'react';
2
+ import { useMemo, } from 'react';
3
3
  import { Languages, Sidebar as SidebarIcon } from '../icons.js';
4
4
  import { cn } from '../utils/cn.js';
5
5
  import { buttonVariants } from '../components/ui/button.js';
6
- import { Sidebar, SidebarCollapseTrigger, SidebarFooter, SidebarHeader, SidebarPageTree, SidebarViewport, } from '../components/layout/sidebar.js';
7
- import { BaseLinkItem } from '../layouts/links.js';
6
+ import { Sidebar, SidebarCollapseTrigger, SidebarContent, SidebarContentMobile, SidebarFooter, SidebarHeader, SidebarPageTree, SidebarViewport, } from '../components/layout/sidebar.js';
7
+ import { BaseLinkItem, } from '../layouts/links.js';
8
8
  import { RootToggle } from '../components/layout/root-toggle.js';
9
9
  import { getLinks } from './shared.js';
10
10
  import { LanguageToggle, LanguageToggleText, } from '../components/layout/language-toggle.js';
11
- import { CollapsibleControl, LayoutBody, Navbar, NavbarSidebarTrigger, } from '../layouts/docs-client.js';
11
+ import { CollapsibleControl, LayoutBody, Navbar, SidebarTrigger, } from '../layouts/docs-client.js';
12
12
  import { TreeContextProvider } from '../contexts/tree.js';
13
13
  import { ThemeToggle } from '../components/layout/theme-toggle.js';
14
14
  import { getSidebarTabsFromOptions, SidebarLinkItem, } from '../layouts/docs/shared.js';
@@ -16,26 +16,46 @@ import { NavProvider } from '../contexts/layout.js';
16
16
  import Link from 'fumadocs-core/link';
17
17
  import { LargeSearchToggle, SearchToggle, } from '../components/layout/search-toggle.js';
18
18
  import { HideIfEmpty } from 'fumadocs-core/hide-if-empty';
19
- export function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { tabs: sidebarTabs, footer: sidebarFooter, banner: sidebarBanner, enabled: sidebarEnabled = true, collapsible: sidebarCollapsible = true, component: sidebarComponent, components: sidebarComponents, ...sidebarProps } = {}, searchToggle = {}, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, i18n = false, children, ...props }) {
19
+ export function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled = true, ...sidebarProps } = {}, searchToggle = {}, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, i18n = false, children, ...props }) {
20
20
  const tabs = useMemo(() => getSidebarTabsFromOptions(sidebarTabs, props.tree) ?? [], [sidebarTabs, props.tree]);
21
21
  const links = getLinks(props.links ?? [], props.githubUrl);
22
22
  const variables = cn(sidebarEnabled &&
23
23
  'md:[--fd-sidebar-width:268px] lg:[--fd-sidebar-width:286px]', 'xl:[--fd-toc-width:286px]', !nav.component && nav.enabled !== false
24
24
  ? '[--fd-nav-height:56px] md:[--fd-nav-height:0px]'
25
25
  : undefined);
26
- const sidebar = sidebarComponent ?? (_jsxs(_Fragment, { children: [sidebarCollapsible && _jsx(CollapsibleControl, {}), _jsxs(Sidebar, { ...sidebarProps, collapsible: sidebarCollapsible, children: [_jsx(HideIfEmpty, { children: _jsxs(SidebarHeader, { className: "data-[empty=true]:hidden", children: [_jsxs("div", { className: "flex max-md:hidden", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex text-[15px] items-center gap-2.5 font-medium me-auto", children: nav.title }), nav.children, sidebarCollapsible && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
27
- color: 'ghost',
28
- size: 'icon-sm',
29
- className: 'mb-auto text-fd-muted-foreground max-md:hidden',
30
- })), children: _jsx(SidebarIcon, {}) }))] }), searchToggle.enabled !== false &&
31
- (searchToggle.components?.lg ?? (_jsx(LargeSearchToggle, { hideIfDisabled: true, className: "max-md:hidden" }))), tabs.length > 0 && _jsx(RootToggle, { options: tabs }), sidebarBanner] }) }), _jsxs(SidebarViewport, { children: [links
32
- .filter((v) => v.type !== 'icon')
33
- .map((item, i, list) => (_jsx(SidebarLinkItem, { item: item, className: cn(i === list.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { components: sidebarComponents })] }), _jsx(HideIfEmpty, { children: _jsxs(SidebarFooter, { className: "data-[empty=true]:hidden", children: [_jsxs("div", { className: "flex items-center justify-end empty:hidden", children: [links
34
- .filter((item) => item.type === 'icon')
35
- .map((item, i, arr) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon', color: 'ghost' }), 'text-fd-muted-foreground md:[&_svg]:size-4.5', i === arr.length - 1 && 'me-auto'), "aria-label": item.label, children: item.icon }, i))), i18n ? (_jsxs(LanguageToggle, { className: "me-1.5", children: [_jsx(Languages, { className: "size-4.5" }), _jsx(LanguageToggleText, { className: "md:hidden" })] })) : null, themeSwitch.enabled !== false &&
36
- (themeSwitch.component ?? (_jsx(ThemeToggle, { className: "p-0", mode: themeSwitch.mode })))] }), sidebarFooter] }) })] })] }));
26
+ function sidebar() {
27
+ const { footer, banner, collapsible = true, component, components, defaultOpenLevel, prefetch, ...rest } = sidebarProps;
28
+ if (component)
29
+ return component;
30
+ const iconLinks = links.filter((item) => item.type === 'icon');
31
+ const viewport = (_jsxs(SidebarViewport, { children: [links
32
+ .filter((v) => v.type !== 'icon')
33
+ .map((item, i, list) => (_jsx(SidebarLinkItem, { item: item, className: cn(i === list.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { components: components })] }));
34
+ const mobile = (_jsxs(SidebarContentMobile, { ...rest, children: [_jsxs(HideIfEmpty, { as: SidebarHeader, children: [_jsxs("div", { className: "flex text-fd-muted-foreground items-center justify-end empty:hidden", children: [iconLinks.map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({
35
+ size: 'icon-sm',
36
+ color: 'ghost',
37
+ className: 'p-2',
38
+ }), i === iconLinks.length - 1 && 'me-auto'), "aria-label": item.label, children: item.icon }, i))), i18n ? (_jsxs(LanguageToggle, { children: [_jsx(Languages, { className: "size-4.5" }), _jsx(LanguageToggleText, {})] })) : null, themeSwitch.enabled !== false &&
39
+ (themeSwitch.component ?? (_jsx(ThemeToggle, { className: "p-0 ms-1.5", mode: themeSwitch.mode }))), _jsx(SidebarTrigger, { className: cn(buttonVariants({
40
+ color: 'ghost',
41
+ size: 'icon-sm',
42
+ className: 'p-2 ms-1.5',
43
+ })), children: _jsx(SidebarIcon, {}) })] }), tabs.length > 0 && _jsx(RootToggle, { options: tabs }), banner] }), viewport, _jsx(SidebarFooter, { className: "empty:hidden", children: footer })] }));
44
+ const content = (_jsxs(SidebarContent, { ...rest, children: [_jsxs(SidebarHeader, { children: [_jsxs("div", { className: "flex", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex text-[15px] items-center gap-2.5 font-medium me-auto", children: nav.title }), nav.children, collapsible && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
45
+ color: 'ghost',
46
+ size: 'icon-sm',
47
+ className: 'mb-auto text-fd-muted-foreground',
48
+ })), children: _jsx(SidebarIcon, {}) }))] }), searchToggle.enabled !== false &&
49
+ (searchToggle.components?.lg ?? (_jsx(LargeSearchToggle, { hideIfDisabled: true }))), tabs.length > 0 && _jsx(RootToggle, { options: tabs }), banner] }), viewport, _jsxs(HideIfEmpty, { as: SidebarFooter, children: [_jsxs("div", { className: "flex text-fd-muted-foreground items-center justify-end empty:hidden", children: [iconLinks.map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon-sm', color: 'ghost' }), i === iconLinks.length - 1 && 'me-auto'), "aria-label": item.label, children: item.icon }, i))), i18n ? (_jsx(LanguageToggle, { children: _jsx(Languages, { className: "size-4.5" }) })) : null, themeSwitch.enabled !== false &&
50
+ (themeSwitch.component ?? (_jsx(ThemeToggle, { className: "p-0 ms-1.5", mode: themeSwitch.mode })))] }), footer] })] }));
51
+ return (_jsx(Sidebar, { defaultOpenLevel: defaultOpenLevel, prefetch: prefetch, Mobile: mobile, Content: _jsxs(_Fragment, { children: [collapsible && _jsx(CollapsibleControl, {}), content] }) }));
52
+ }
37
53
  return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsxs(NavProvider, { transparentMode: transparentMode, children: [nav.enabled !== false &&
38
- (nav.component ?? (_jsxs(Navbar, { className: "h-14 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-1", children: nav.children }), searchToggle?.enabled !== false &&
39
- (searchToggle.components?.sm ?? (_jsx(SearchToggle, { className: "p-2", hideIfDisabled: true }))), sidebarEnabled && (_jsx(NavbarSidebarTrigger, { className: "p-2 -me-1.5 md:hidden" }))] }))), _jsxs(LayoutBody, { ...props.containerProps, className: cn(variables, props.containerProps?.className), children: [sidebarEnabled && sidebar, children] })] }) }));
54
+ (nav.component ?? (_jsxs(Navbar, { className: "h-14 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-1", children: nav.children }), searchToggle.enabled !== false &&
55
+ (searchToggle.components?.sm ?? (_jsx(SearchToggle, { className: "p-2", hideIfDisabled: true }))), sidebarEnabled && (_jsx(SidebarTrigger, { className: cn(buttonVariants({
56
+ color: 'ghost',
57
+ size: 'icon-sm',
58
+ className: 'p-2',
59
+ })), children: _jsx(SidebarIcon, {}) }))] }))), _jsxs(LayoutBody, { ...props.containerProps, className: cn(variables, props.containerProps?.className), children: [sidebarEnabled && sidebar(), children] })] }) }));
40
60
  }
41
- export { CollapsibleControl, Navbar, NavbarSidebarTrigger };
61
+ export { CollapsibleControl, Navbar, SidebarTrigger };
@@ -1,4 +1,4 @@
1
- import { type HTMLAttributes } from 'react';
1
+ import { type ComponentProps, type HTMLAttributes } from 'react';
2
2
  import { type BaseLayoutProps } from '../layouts/shared.js';
3
3
  import { type SidebarOptions } from '../layouts/docs/shared.js';
4
4
  import type { PageTree } from 'fumadocs-core/server';
@@ -9,7 +9,7 @@ export interface DocsLayoutProps extends BaseLayoutProps {
9
9
  nav?: BaseLayoutProps['nav'] & {
10
10
  mode?: 'top' | 'auto';
11
11
  };
12
- sidebar?: Partial<SidebarOptions>;
12
+ sidebar?: SidebarOptions & ComponentProps<'aside'>;
13
13
  containerProps?: HTMLAttributes<HTMLDivElement>;
14
14
  }
15
15
  export declare function DocsLayout(props: DocsLayoutProps): import("react/jsx-runtime").JSX.Element;
@@ -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,EAAE,KAAK,eAAe,EAAY,MAAM,kBAAkB,CAAC;AAqBlE,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAGL,MAAM,EACN,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAU3B,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,OAAO,CAAC,cAAc,CAAC,CAAC;IAElC,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAiJhD;AAiMD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/layouts/notebook.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAEpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,kBAAkB,CAAC;AAuBlE,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAGL,MAAM,EACN,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAU3B,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,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEnD,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAqMhD;AAiMD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC"}
@@ -1,7 +1,7 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Fragment, useMemo } from 'react';
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Fragment, useMemo, } from 'react';
3
3
  import { getLinks } from '../layouts/shared.js';
4
- import { Sidebar, SidebarCollapseTrigger, SidebarFooter, SidebarHeader, SidebarPageTree, SidebarViewport, } from '../components/layout/sidebar.js';
4
+ import { Sidebar, SidebarCollapseTrigger, SidebarContent, SidebarContentMobile, SidebarFooter, SidebarHeader, SidebarPageTree, SidebarViewport, } from '../components/layout/sidebar.js';
5
5
  import { TreeContextProvider } from '../contexts/tree.js';
6
6
  import { cn } from '../utils/cn.js';
7
7
  import { buttonVariants } from '../components/ui/button.js';
@@ -18,28 +18,38 @@ import Link from 'fumadocs-core/link';
18
18
  import { LargeSearchToggle, SearchToggle, } from '../components/layout/search-toggle.js';
19
19
  import { HideIfEmpty } from 'fumadocs-core/hide-if-empty';
20
20
  export function DocsLayout(props) {
21
- const { tabMode = 'sidebar', nav: { transparentMode, ...nav } = {}, sidebar: { tabs: tabOptions, banner: sidebarBanner, footer: sidebarFooter, components: sidebarComponents, ...sidebar } = {}, i18n = false, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, } = props;
21
+ const { tabMode = 'sidebar', nav: { transparentMode, ...nav } = {}, sidebar: { tabs: tabOptions, ...sidebarProps } = {}, i18n = false, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, } = props;
22
22
  const navMode = nav.mode ?? 'auto';
23
23
  const links = getLinks(props.links ?? [], props.githubUrl);
24
24
  const tabs = useMemo(() => getSidebarTabsFromOptions(tabOptions, props.tree) ?? [], [tabOptions, props.tree]);
25
25
  const variables = cn('[--fd-nav-height:56px] md:[--fd-sidebar-width:286px] md:[--fd-nav-height:64px] xl:[--fd-toc-width:286px]', tabs.length > 0 && tabMode === 'navbar' && 'lg:[--fd-nav-height:104px]');
26
- const sidebarHeader = (_jsxs("div", { className: "flex justify-between max-md:hidden", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-medium", children: nav.title }), (sidebar.collapsible ?? true) && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
27
- color: 'ghost',
28
- size: 'icon-sm',
29
- className: 'mt-px mb-auto text-fd-muted-foreground',
30
- })), children: _jsx(SidebarIcon, {}) }))] }));
31
- return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsx(NavProvider, { transparentMode: transparentMode, children: _jsxs(LayoutBody, { ...props.containerProps, className: cn(variables, props.containerProps?.className), children: [_jsxs(Sidebar, { ...sidebar, className: cn(navMode === 'top'
32
- ? 'border-e-0 md:bg-transparent'
33
- : 'md:[--fd-nav-height:0px]', sidebar.className), children: [_jsx(HideIfEmpty, { children: _jsxs(SidebarHeader, { className: "data-[empty=true]:hidden", children: [navMode === 'auto' && sidebarHeader, nav.children, sidebarBanner, tabMode === 'sidebar' && tabs.length > 0 ? (_jsx(RootToggle, { className: "mb-2", options: tabs })) : null, tabMode === 'navbar' && tabs.length > 0 && (_jsx(RootToggle, { options: tabs, className: "lg:hidden" }))] }) }), _jsxs(SidebarViewport, { children: [links
34
- .filter((item) => item.type !== 'icon')
35
- .map((item, i) => (_jsx(SidebarLinkItem, { item: item, className: cn('lg:hidden', i === links.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { components: sidebarComponents })] }), _jsx(HideIfEmpty, { children: _jsxs(SidebarFooter, { className: "flex flex-row items-center justify-end data-[empty=true]:hidden", children: [_jsx("div", { className: "flex items-center flex-1 empty:hidden lg:hidden", children: links
36
- .filter((item) => item.type === 'icon')
37
- .map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({
38
- size: 'icon-sm',
39
- color: 'ghost',
40
- className: 'text-fd-muted-foreground',
41
- })), "aria-label": item.label, children: item.icon }, i))) }), i18n ? (_jsx(LanguageToggle, { className: "me-auto md:hidden", children: _jsx(Languages, { className: "size-4.5 text-fd-muted-foreground" }) })) : null, themeSwitch.enabled !== false &&
42
- (themeSwitch.component ?? (_jsx(ThemeToggle, { className: "md:hidden", mode: themeSwitch?.mode ?? 'light-dark-system' }))), sidebarFooter] }) })] }), _jsx(DocsNavbar, { ...props, links: links, tabs: tabMode == 'navbar' ? tabs : [] }), props.children] }) }) }));
26
+ function sidebar() {
27
+ const { banner, footer, components, collapsible = true, prefetch, defaultOpenLevel, ...rest } = sidebarProps;
28
+ const iconLinks = links.filter((item) => item.type === 'icon');
29
+ const rootToggle = (_jsxs(_Fragment, { children: [tabMode === 'sidebar' && tabs.length > 0 && (_jsx(RootToggle, { className: "mb-2", options: tabs })), tabMode === 'navbar' && tabs.length > 0 && (_jsx(RootToggle, { options: tabs, className: "lg:hidden" }))] }));
30
+ const sidebarNav = (_jsxs("div", { className: "flex justify-between", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-medium", children: nav.title }), collapsible && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
31
+ color: 'ghost',
32
+ size: 'icon-sm',
33
+ className: 'mt-px mb-auto text-fd-muted-foreground',
34
+ })), children: _jsx(SidebarIcon, {}) }))] }));
35
+ const viewport = (_jsxs(SidebarViewport, { children: [links
36
+ .filter((item) => item.type !== 'icon')
37
+ .map((item, i, arr) => (_jsx(SidebarLinkItem, { item: item, className: cn('lg:hidden', i === arr.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { components: components })] }));
38
+ const content = (_jsxs(SidebarContent, { ...rest, className: cn(navMode === 'top'
39
+ ? 'border-e-0 bg-transparent'
40
+ : '[--fd-nav-height:0px]', rest.className), children: [_jsxs(HideIfEmpty, { as: SidebarHeader, children: [navMode === 'auto' && sidebarNav, nav.children, banner, rootToggle] }), viewport, _jsxs(HideIfEmpty, { as: SidebarFooter, className: "flex flex-row text-fd-muted-foreground items-center", children: [iconLinks.map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({
41
+ size: 'icon-sm',
42
+ color: 'ghost',
43
+ className: 'lg:hidden',
44
+ })), "aria-label": item.label, children: item.icon }, i))), footer] })] }));
45
+ const mobile = (_jsxs(SidebarContentMobile, { ...rest, children: [_jsxs(HideIfEmpty, { as: SidebarHeader, children: [banner, rootToggle] }), viewport, _jsxs(HideIfEmpty, { as: SidebarFooter, className: "flex flex-row items-center justify-end", children: [iconLinks.map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({
46
+ size: 'icon-sm',
47
+ color: 'ghost',
48
+ }), 'text-fd-muted-foreground lg:hidden', i === iconLinks.length - 1 && 'me-auto'), "aria-label": item.label, children: item.icon }, i))), i18n ? (_jsx(LanguageToggle, { children: _jsx(Languages, { className: "size-4.5 text-fd-muted-foreground" }) })) : null, themeSwitch.enabled !== false &&
49
+ (themeSwitch.component ?? (_jsx(ThemeToggle, { mode: themeSwitch.mode ?? 'light-dark-system' }))), footer] })] }));
50
+ return (_jsx(Sidebar, { defaultOpenLevel: defaultOpenLevel, prefetch: prefetch, Content: content, Mobile: mobile }));
51
+ }
52
+ return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsx(NavProvider, { transparentMode: transparentMode, children: _jsxs(LayoutBody, { ...props.containerProps, className: cn(variables, props.containerProps?.className), children: [sidebar(), _jsx(DocsNavbar, { ...props, links: links, tabs: tabMode == 'navbar' ? tabs : [] }), props.children] }) }) }));
43
53
  }
44
54
  function DocsNavbar({ links, tabs, searchToggle = {}, themeSwitch = {}, ...props }) {
45
55
  const navMode = props.nav?.mode ?? 'auto';
package/dist/style.css CHANGED
@@ -455,6 +455,9 @@
455
455
  .-ms-1\.5 {
456
456
  margin-inline-start: calc(var(--spacing) * -1.5);
457
457
  }
458
+ .ms-1\.5 {
459
+ margin-inline-start: calc(var(--spacing) * 1.5);
460
+ }
458
461
  .ms-2 {
459
462
  margin-inline-start: calc(var(--spacing) * 2);
460
463
  }
@@ -470,15 +473,9 @@
470
473
  .-me-1\.5 {
471
474
  margin-inline-end: calc(var(--spacing) * -1.5);
472
475
  }
473
- .me-1\.5 {
474
- margin-inline-end: calc(var(--spacing) * 1.5);
475
- }
476
476
  .me-2 {
477
477
  margin-inline-end: calc(var(--spacing) * 2);
478
478
  }
479
- .me-4 {
480
- margin-inline-end: calc(var(--spacing) * 4);
481
- }
482
479
  .me-auto {
483
480
  margin-inline-end: auto;
484
481
  }
@@ -857,9 +854,6 @@
857
854
  .mt-\(--fd-top\) {
858
855
  margin-top: var(--fd-top);
859
856
  }
860
- .mt-3 {
861
- margin-top: calc(var(--spacing) * 3);
862
- }
863
857
  .mt-6 {
864
858
  margin-top: calc(var(--spacing) * 6);
865
859
  }
@@ -1475,6 +1469,9 @@
1475
1469
  .ps-3 {
1476
1470
  padding-inline-start: calc(var(--spacing) * 3);
1477
1471
  }
1472
+ .ps-4 {
1473
+ padding-inline-start: calc(var(--spacing) * 4);
1474
+ }
1478
1475
  .ps-6 {
1479
1476
  padding-inline-start: calc(var(--spacing) * 6);
1480
1477
  }
@@ -1484,6 +1481,9 @@
1484
1481
  .ps-\[calc\(var\(--fd-layout-offset\)\+var\(--fd-sidebar-width\)\)\] {
1485
1482
  padding-inline-start: calc(var(--fd-layout-offset) + var(--fd-sidebar-width));
1486
1483
  }
1484
+ .pe-2\.5 {
1485
+ padding-inline-end: calc(var(--spacing) * 2.5);
1486
+ }
1487
1487
  .pe-4 {
1488
1488
  padding-inline-end: calc(var(--spacing) * 4);
1489
1489
  }
@@ -1741,6 +1741,9 @@
1741
1741
  -webkit-user-select: none;
1742
1742
  user-select: none;
1743
1743
  }
1744
+ .\[--fd-nav-height\:0px\] {
1745
+ --fd-nav-height: 0px;
1746
+ }
1744
1747
  .\[--fd-nav-height\:56px\] {
1745
1748
  --fd-nav-height: 56px;
1746
1749
  }
@@ -2042,11 +2045,6 @@
2042
2045
  display: none;
2043
2046
  }
2044
2047
  }
2045
- .data-\[empty\=true\]\:hidden {
2046
- &[data-empty="true"] {
2047
- display: none;
2048
- }
2049
- }
2050
2048
  .\*\:data-\[empty\=true\]\:border-b-0 {
2051
2049
  :is(& > *) {
2052
2050
  &[data-empty="true"] {
@@ -2344,21 +2342,11 @@
2344
2342
  grid-template-columns: repeat(2, minmax(0, 1fr));
2345
2343
  }
2346
2344
  }
2347
- .md\:bg-transparent {
2348
- @media (width >= 48rem) {
2349
- background-color: transparent;
2350
- }
2351
- }
2352
2345
  .md\:px-6 {
2353
2346
  @media (width >= 48rem) {
2354
2347
  padding-inline: calc(var(--spacing) * 6);
2355
2348
  }
2356
2349
  }
2357
- .md\:pt-4 {
2358
- @media (width >= 48rem) {
2359
- padding-top: calc(var(--spacing) * 4);
2360
- }
2361
- }
2362
2350
  .md\:\[--fd-nav-height\:0px\] {
2363
2351
  @media (width >= 48rem) {
2364
2352
  --fd-nav-height: 0px;
@@ -2496,14 +2484,6 @@
2496
2484
  flex-shrink: 0;
2497
2485
  }
2498
2486
  }
2499
- .md\:\[\&_svg\]\:size-4\.5 {
2500
- @media (width >= 48rem) {
2501
- & svg {
2502
- width: calc(var(--spacing) * 4.5);
2503
- height: calc(var(--spacing) * 4.5);
2504
- }
2505
- }
2506
- }
2507
2487
  .\[\&\>figure\:only-child\]\:-m-4 {
2508
2488
  &>figure:only-child {
2509
2489
  margin: calc(var(--spacing) * -4);
@@ -2559,22 +2539,20 @@
2559
2539
  filter: blur(0);
2560
2540
  }
2561
2541
  &[data-line-numbers] code .twoslash-meta-line {
2562
- margin-left: calc(var(--spacing) * 7);
2542
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
2563
2543
  }
2564
2544
  &[data-line-numbers] code .line {
2565
- width: calc(100% - 7 * var(--spacing));
2566
2545
  counter-increment: line;
2567
- padding-left: calc(var(--padding-left) - var(--spacing));
2568
- margin-left: calc(var(--spacing) * 7);
2546
+ padding-left: calc(var(--padding-left) + 7 * var(--spacing));
2569
2547
  &::after {
2570
2548
  position: absolute;
2571
2549
  content: counter(line);
2572
- top: calc(var(--spacing) * 0);
2573
- left: calc(var(--spacing) * -5);
2574
- color: color-mix(in srgb, hsl(0, 0%, 45.1%) 60%, transparent);
2550
+ color: var(--fd-counter-color, hsl(0, 0%, 45.1%));
2575
2551
  @supports (color: color-mix(in lab, red, red)) {
2576
- color: color-mix(in oklab, var(--color-fd-muted-foreground) 60%, transparent);
2552
+ color: color-mix( in oklab, var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%, transparent );
2577
2553
  }
2554
+ top: calc(var(--spacing) * 0);
2555
+ left: calc(var(--spacing) * 4);
2578
2556
  }
2579
2557
  }
2580
2558
  code .diff::before {
@@ -2583,6 +2561,7 @@
2583
2561
  }
2584
2562
  code .diff.remove {
2585
2563
  opacity: 0.7;
2564
+ --fd-counter-color: var(--color-fd-diff-remove-symbol);
2586
2565
  background-color: var(--color-fd-diff-remove);
2587
2566
  }
2588
2567
  code .diff.remove::before {
@@ -2590,19 +2569,21 @@
2590
2569
  color: var(--color-fd-diff-remove-symbol);
2591
2570
  }
2592
2571
  code .diff.add {
2572
+ --fd-counter-color: var(--color-fd-diff-add-symbol);
2593
2573
  background-color: var(--color-fd-diff-add);
2594
2574
  }
2595
2575
  code .diff.add::before {
2596
2576
  content: '+';
2597
2577
  color: var(--color-fd-diff-add-symbol);
2598
2578
  }
2599
- .highlighted {
2579
+ code .highlighted {
2580
+ --fd-counter-color: var(--color-fd-primary);
2600
2581
  background-color: color-mix(in srgb, hsl(0, 0%, 9%) 10%, transparent);
2601
2582
  @supports (color: color-mix(in lab, red, red)) {
2602
2583
  background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
2603
2584
  }
2604
2585
  }
2605
- .highlighted-word {
2586
+ code .highlighted-word {
2606
2587
  padding: 1px;
2607
2588
  margin-block: -1px;
2608
2589
  border-radius: var(--radius-md);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fumadocs-ui",
3
- "version": "15.6.6",
3
+ "version": "15.6.7",
4
4
  "description": "The framework for building a documentation website in Next.js",
5
5
  "keywords": [
6
6
  "NextJs",
@@ -89,7 +89,7 @@
89
89
  "react-medium-image-zoom": "^5.3.0",
90
90
  "scroll-into-view-if-needed": "^3.1.0",
91
91
  "tailwind-merge": "^3.3.1",
92
- "fumadocs-core": "15.6.6"
92
+ "fumadocs-core": "15.6.7"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@next/eslint-plugin-next": "^15.4.4",
@@ -102,7 +102,7 @@
102
102
  "tsc-alias": "^1.8.16",
103
103
  "@fumadocs/cli": "0.2.1",
104
104
  "eslint-config-custom": "0.0.0",
105
- "fumadocs-core": "15.6.6",
105
+ "fumadocs-core": "15.6.7",
106
106
  "tsconfig": "0.0.0"
107
107
  },
108
108
  "peerDependencies": {