fumadocs-ui 15.8.5 → 16.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/css/black.css +2 -0
  2. package/css/catppuccin.css +2 -0
  3. package/css/default.css +33 -0
  4. package/css/dusk.css +2 -0
  5. package/css/neutral.css +3 -0
  6. package/css/ocean.css +2 -0
  7. package/css/preset.css +5 -18
  8. package/css/purple.css +2 -0
  9. package/css/shadcn.css +2 -0
  10. package/css/vitepress.css +2 -0
  11. package/dist/components/codeblock.d.ts.map +1 -1
  12. package/dist/components/codeblock.js +0 -1
  13. package/dist/components/dialog/search.js +1 -1
  14. package/dist/components/dynamic-codeblock.d.ts.map +1 -1
  15. package/dist/components/dynamic-codeblock.js +7 -6
  16. package/dist/components/layout/language-toggle.js +1 -1
  17. package/dist/components/layout/root-toggle.js +1 -1
  18. package/dist/components/ui/popover.js +1 -1
  19. package/dist/i18n.d.ts +0 -1
  20. package/dist/i18n.d.ts.map +1 -1
  21. package/dist/i18n.js +0 -1
  22. package/dist/layouts/docs/index.d.ts +1 -1
  23. package/dist/layouts/docs/index.d.ts.map +1 -1
  24. package/dist/layouts/docs/index.js +6 -6
  25. package/dist/layouts/docs/page-client.js +1 -1
  26. package/dist/layouts/docs/page.d.ts.map +1 -1
  27. package/dist/layouts/docs/page.js +1 -1
  28. package/dist/layouts/notebook/index.js +1 -1
  29. package/dist/page.d.ts +0 -7
  30. package/dist/page.d.ts.map +1 -1
  31. package/dist/page.js +1 -1
  32. package/dist/provider/index.d.ts +5 -1
  33. package/dist/provider/index.d.ts.map +1 -1
  34. package/dist/provider/index.js +6 -2
  35. package/dist/style.css +115 -46
  36. package/package.json +17 -17
  37. package/dist/contexts/legacy-i18n.d.ts +0 -11
  38. package/dist/contexts/legacy-i18n.d.ts.map +0 -1
  39. package/dist/contexts/legacy-i18n.js +0 -36
  40. package/dist/page.server.d.ts +0 -13
  41. package/dist/page.server.d.ts.map +0 -1
  42. package/dist/page.server.js +0 -37
package/css/black.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-background: hsl(0, 0%, 98%);
3
5
  --color-fd-foreground: hsl(0, 0%, 3.9%);
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-popover: hsl(220, 22%, 92%);
3
5
  --color-fd-popover-foreground: hsl(234, 16%, 35%);
@@ -0,0 +1,33 @@
1
+ /**
2
+ The default theme of Fumadocs
3
+ */
4
+ @theme {
5
+ --color-fd-background: transparent;
6
+ --color-fd-foreground: transparent;
7
+ --color-fd-muted: transparent;
8
+ --color-fd-muted-foreground: transparent;
9
+ --color-fd-popover: transparent;
10
+ --color-fd-popover-foreground: transparent;
11
+ --color-fd-card: transparent;
12
+ --color-fd-card-foreground: transparent;
13
+ --color-fd-border: transparent;
14
+ --color-fd-primary: transparent;
15
+ --color-fd-primary-foreground: transparent;
16
+ --color-fd-secondary: transparent;
17
+ --color-fd-secondary-foreground: transparent;
18
+ --color-fd-accent: transparent;
19
+ --color-fd-accent-foreground: transparent;
20
+ --color-fd-ring: transparent;
21
+ --color-fd-overlay: transparent;
22
+ }
23
+
24
+ @theme static {
25
+ --color-fd-info: oklch(62.3% 0.214 259.815);
26
+ --color-fd-warning: oklch(76.9% 0.188 70.08);
27
+ --color-fd-error: oklch(63.7% 0.237 25.331);
28
+ --color-fd-success: oklch(72.3% 0.219 149.579);
29
+ --color-fd-diff-remove: rgba(200, 10, 100, 0.12);
30
+ --color-fd-diff-remove-symbol: rgb(230, 10, 100);
31
+ --color-fd-diff-add: rgba(14, 180, 100, 0.1);
32
+ --color-fd-diff-add-symbol: rgb(10, 200, 100);
33
+ }
package/css/dusk.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-background: hsl(250, 20%, 92%);
3
5
  --color-fd-primary: hsl(340, 40%, 48%);
package/css/neutral.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-background: hsl(0, 0%, 96%);
3
5
  --color-fd-foreground: hsl(0, 0%, 3.9%);
@@ -34,6 +36,7 @@
34
36
  --color-fd-accent: hsla(0, 0%, 40.9%, 30%);
35
37
  --color-fd-accent-foreground: hsl(0, 0%, 90%);
36
38
  --color-fd-ring: hsl(0, 0%, 54.9%);
39
+ --color-fd-overlay: hsla(0, 0%, 0%, 0.2);
37
40
  }
38
41
 
39
42
  .dark #nd-sidebar {
package/css/ocean.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-background: hsl(0, 0%, 98%);
3
5
  --color-fd-foreground: hsl(0, 0%, 3.9%);
package/css/preset.css CHANGED
@@ -3,13 +3,6 @@
3
3
  @source '../dist/**/*.js';
4
4
  @plugin '../dist/theme/typography/index.js';
5
5
 
6
- @theme static {
7
- --color-fd-info: oklch(62.3% 0.214 259.815);
8
- --color-fd-warning: oklch(76.9% 0.188 70.08);
9
- --color-fd-error: oklch(63.7% 0.237 25.331);
10
- --color-fd-success: oklch(72.3% 0.219 149.579);
11
- }
12
-
13
6
  [dir='rtl'] {
14
7
  --fd-sidebar-mobile-offset: -100%;
15
8
  }
@@ -20,24 +13,18 @@
20
13
  --fd-page-width: 1200px;
21
14
  --fd-sidebar-width: 0px;
22
15
  --fd-toc-width: 0px;
23
- --fd-layout-width: 100vw;
16
+ --fd-layout-width: 1600px;
24
17
  --fd-banner-height: 0px;
25
18
  --fd-nav-height: 0px;
26
19
  --fd-tocnav-height: 0px;
27
-
28
- --color-fd-diff-remove: rgba(200, 10, 100, 0.12);
29
- --color-fd-diff-remove-symbol: rgb(230, 10, 100);
30
- --color-fd-diff-add: rgba(14, 180, 100, 0.1);
31
- --color-fd-diff-add-symbol: rgb(10, 200, 100);
32
-
33
20
  --animate-fd-fade-in: fd-fade-in 300ms ease;
34
21
  --animate-fd-fade-out: fd-fade-out 300ms ease;
35
22
 
36
23
  --animate-fd-dialog-in: fd-dialog-in 300ms cubic-bezier(0.16, 1, 0.3, 1);
37
24
  --animate-fd-dialog-out: fd-dialog-out 300ms cubic-bezier(0.16, 1, 0.3, 1);
38
25
 
39
- --animate-fd-popover-in: fd-popover-in 130ms ease;
40
- --animate-fd-popover-out: fd-popover-out 130ms ease;
26
+ --animate-fd-popover-in: fd-popover-in 100ms ease;
27
+ --animate-fd-popover-out: fd-popover-out 100ms ease;
41
28
 
42
29
  --animate-fd-collapsible-down: fd-collapsible-down 150ms
43
30
  cubic-bezier(0.45, 0, 0.55, 1);
@@ -134,14 +121,14 @@
134
121
  @keyframes fd-popover-in {
135
122
  from {
136
123
  opacity: 0;
137
- transform: scale(0.7);
124
+ transform: scale(0.9);
138
125
  }
139
126
  }
140
127
 
141
128
  @keyframes fd-popover-out {
142
129
  to {
143
130
  opacity: 0;
144
- transform: scale(0.7);
131
+ transform: scale(0.9);
145
132
  }
146
133
  }
147
134
 
package/css/purple.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-background: hsl(256, 100%, 96%);
3
5
  --color-fd-primary: hsl(270, 100%, 52%);
package/css/shadcn.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-background: var(--background);
3
5
  --color-fd-foreground: var(--foreground);
package/css/vitepress.css CHANGED
@@ -1,3 +1,5 @@
1
+ @import './default.css';
2
+
1
3
  @theme {
2
4
  --color-fd-muted: hsl(0, 0%, 96.1%);
3
5
  --color-fd-popover: hsl(0, 0%, 100%);
@@ -1 +1 @@
1
- {"version":3,"file":"codeblock.d.ts","sourceRoot":"","sources":["../../src/components/codeblock.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAIf,OAAO,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,WAAW,EACZ,MAAM,4BAA4B,CAAC;AAGpC,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAC9D;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,aAAa,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IAE5C;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,KAAK,SAAS,CAAC;CAC9E;AAOD,wBAAgB,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAS/C;AAED,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,KAAK,EACL,SAAgB,EAChB,cAAsB,EACtB,IAAI,EACJ,aAAkB,EAClB,QAAQ,EACR,OAEC,EACD,GAAG,KAAK,EACT,EAAE,cAAc,2CAkEhB;AA0CD,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,2CA2B3E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,2CAYvE;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,WAAW,CAAC,2CAapC;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,WAAW,CAAC,2CAErE"}
1
+ {"version":3,"file":"codeblock.d.ts","sourceRoot":"","sources":["../../src/components/codeblock.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAIf,OAAO,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,WAAW,EACZ,MAAM,4BAA4B,CAAC;AAGpC,MAAM,WAAW,cAAe,SAAQ,cAAc,CAAC,QAAQ,CAAC;IAC9D;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,CAAC;IAEjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,aAAa,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC;IAE5C;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,KAAK,SAAS,CAAC;CAC9E;AAOD,wBAAgB,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAS/C;AAED,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,KAAK,EACL,SAAgB,EAChB,cAAsB,EACtB,IAAI,EACJ,aAAkB,EAClB,QAAQ,EACR,OAEC,EACD,GAAG,KAAK,EACT,EAAE,cAAc,2CAkEhB;AA0CD,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,IAAI,CAAC,2CA2B3E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,QAAQ,CAAC,2CAYvE;AAED,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,OAAO,WAAW,CAAC,2CAapC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,OAAO,WAAW,CAAC,2CAErE"}
@@ -63,7 +63,6 @@ export function CodeBlockTabsList(props) {
63
63
  export function CodeBlockTabsTrigger({ children, ...props }) {
64
64
  return (_jsxs(TabsTrigger, { ...props, className: cn('relative group inline-flex text-sm font-medium text-nowrap items-center transition-colors gap-2 px-2 py-1.5 hover:text-fd-accent-foreground data-[state=active]:text-fd-primary [&_svg]:size-3.5', props.className), children: [_jsx("div", { className: "absolute inset-x-2 bottom-0 h-px group-data-[state=active]:bg-fd-primary" }), children] }));
65
65
  }
66
- // TODO: currently Vite RSC plugin has problem with `asChild` due to children is automatically wrapped in <Fragment />, maybe revisit this in future
67
66
  export function CodeBlockTab(props) {
68
67
  return _jsx(TabsContent, { ...props });
69
68
  }
@@ -46,7 +46,7 @@ export function SearchDialogFooter(props) {
46
46
  return (_jsx("div", { ...props, className: cn('bg-fd-secondary/50 p-3 empty:hidden', props.className) }));
47
47
  }
48
48
  export function SearchDialogOverlay(props) {
49
- return (_jsx(DialogOverlay, { ...props, className: cn('fixed inset-0 z-50 backdrop-blur-xs data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out', props.className) }));
49
+ return (_jsx(DialogOverlay, { ...props, className: cn('fixed inset-0 z-50 backdrop-blur-xs bg-fd-overlay data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out', props.className) }));
50
50
  }
51
51
  export function SearchDialogContent({ children, ...props }) {
52
52
  const { text } = useI18n();
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-codeblock.d.ts","sourceRoot":"","sources":["../../src/components/dynamic-codeblock.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,cAAc,EAAO,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAEV,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAWjC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GAAG,sBAAsB,CAAC;CACzE;AAkBD,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,cAAqB,GACtB,EAAE,qBAAqB,2CAuBvB"}
1
+ {"version":3,"file":"dynamic-codeblock.d.ts","sourceRoot":"","sources":["../../src/components/dynamic-codeblock.tsx"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,cAAc,EAAO,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAEV,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAajC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GAAG,sBAAsB,CAAC;CACzE;AAkBD,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,OAAO,EACP,cAAqB,GACtB,EAAE,qBAAqB,2CAgCvB"}
@@ -3,13 +3,14 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { CodeBlock, Pre } from '../components/codeblock.js';
4
4
  import { useShiki } from 'fumadocs-core/highlight/client';
5
5
  import { cn } from '../utils/cn.js';
6
- import { createContext, Suspense, use, } from 'react';
6
+ import { createContext, Suspense, use, useDeferredValue, useId, } from 'react';
7
7
  const PropsContext = createContext(undefined);
8
8
  function DefaultPre(props) {
9
9
  const extraProps = use(PropsContext);
10
10
  return (_jsx(CodeBlock, { ...props, ...extraProps, className: cn('my-0', props.className, extraProps?.className), children: _jsx(Pre, { children: props.children }) }));
11
11
  }
12
12
  export function DynamicCodeBlock({ lang, code, codeblock, options, wrapInSuspense = true, }) {
13
+ const id = useId();
13
14
  const shikiOptions = {
14
15
  lang,
15
16
  ...options,
@@ -18,15 +19,15 @@ export function DynamicCodeBlock({ lang, code, codeblock, options, wrapInSuspens
18
19
  ...options?.components,
19
20
  },
20
21
  };
21
- let children = _jsx(Internal, { code: code, options: shikiOptions });
22
+ const children = (_jsx(PropsContext, { value: codeblock, children: _jsx(Internal, { id: id, ...useDeferredValue({ code, options: shikiOptions }) }) }));
22
23
  if (wrapInSuspense)
23
- children = (_jsx(Suspense, { fallback: _jsx(Placeholder, { code: code, components: shikiOptions.components }), children: children }));
24
- return _jsx(PropsContext, { value: codeblock, children: children });
24
+ return (_jsx(Suspense, { fallback: _jsx(Placeholder, { code: code, components: shikiOptions.components }), children: children }));
25
+ return children;
25
26
  }
26
27
  function Placeholder({ code, components = {}, }) {
27
28
  const { pre: Pre = 'pre', code: Code = 'code' } = components;
28
29
  return (_jsx(Pre, { children: _jsx(Code, { children: code.split('\n').map((line, i) => (_jsx("span", { className: "line", children: line }, i))) }) }));
29
30
  }
30
- function Internal({ code, options, }) {
31
- return useShiki(code, options);
31
+ function Internal({ id, code, options, }) {
32
+ return useShiki(code, options, [id, options.lang, code]);
32
33
  }
@@ -11,7 +11,7 @@ export function LanguageToggle(props) {
11
11
  return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { "aria-label": context.text.chooseLanguage, ...props, className: cn(buttonVariants({
12
12
  color: 'ghost',
13
13
  className: 'gap-1.5 p-1.5',
14
- }), props.className), children: props.children }), _jsxs(PopoverContent, { className: "flex flex-col overflow-hidden p-0", children: [_jsx("p", { className: "mb-1 p-2 text-xs font-medium text-fd-muted-foreground", children: context.text.chooseLanguage }), context.locales.map((item) => (_jsx("button", { type: "button", className: cn('p-2 text-start text-sm', item.locale === context.locale
14
+ }), props.className), children: props.children }), _jsxs(PopoverContent, { className: "flex flex-col overflow-x-hidden p-0", children: [_jsx("p", { className: "mb-1 p-2 text-xs font-medium text-fd-muted-foreground", children: context.text.chooseLanguage }), context.locales.map((item) => (_jsx("button", { type: "button", className: cn('p-2 text-start text-sm', item.locale === context.locale
15
15
  ? 'bg-fd-primary/10 font-medium text-fd-primary'
16
16
  : 'hover:bg-fd-accent hover:text-fd-accent-foreground'), onClick: () => {
17
17
  context.onChange?.(item.locale);
@@ -20,7 +20,7 @@ export function RootToggle({ options, placeholder, ...props }) {
20
20
  setOpen(false);
21
21
  };
22
22
  const item = selected ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "size-9 shrink-0 md:size-5", children: selected.icon }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium", children: selected.title }), _jsx("p", { className: "text-[13px] text-fd-muted-foreground empty:hidden md:hidden", children: selected.description })] })] })) : (placeholder);
23
- return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [item && (_jsxs(PopoverTrigger, { ...props, className: cn('flex items-center gap-2 rounded-lg p-2 border bg-fd-secondary/50 text-start text-fd-secondary-foreground transition-colors hover:bg-fd-accent data-[state=open]:bg-fd-accent data-[state=open]:text-fd-accent-foreground', props.className), children: [item, _jsx(ChevronsUpDown, { className: "shrink-0 ms-auto size-4 text-fd-muted-foreground" })] })), _jsx(PopoverContent, { className: "flex flex-col gap-1 w-(--radix-popover-trigger-width) overflow-hidden p-1", children: options.map((item) => {
23
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [item && (_jsxs(PopoverTrigger, { ...props, className: cn('flex items-center gap-2 rounded-lg p-2 border bg-fd-secondary/50 text-start text-fd-secondary-foreground transition-colors hover:bg-fd-accent data-[state=open]:bg-fd-accent data-[state=open]:text-fd-accent-foreground', props.className), children: [item, _jsx(ChevronsUpDown, { className: "shrink-0 ms-auto size-4 text-fd-muted-foreground" })] })), _jsx(PopoverContent, { className: "flex flex-col gap-1 w-(--radix-popover-trigger-width) p-1 fd-scroll-container", children: options.map((item) => {
24
24
  const isActive = selected && item.url === selected.url;
25
25
  if (!isActive && item.unlisted)
26
26
  return;
@@ -5,7 +5,7 @@ import * as React from 'react';
5
5
  import { cn } from '../../utils/cn.js';
6
6
  const Popover = PopoverPrimitive.Root;
7
7
  const PopoverTrigger = PopoverPrimitive.Trigger;
8
- const PopoverContent = React.forwardRef(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { ref: ref, align: align, sideOffset: sideOffset, side: "bottom", className: cn('z-50 origin-(--radix-popover-content-transform-origin) min-w-[240px] max-w-[98vw] rounded-xl border bg-fd-popover/60 backdrop-blur-lg p-2 text-sm text-fd-popover-foreground shadow-lg focus-visible:outline-none data-[state=closed]:animate-fd-popover-out data-[state=open]:animate-fd-popover-in', className), ...props }) })));
8
+ const PopoverContent = React.forwardRef(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Content, { ref: ref, align: align, sideOffset: sideOffset, side: "bottom", className: cn('z-50 origin-(--radix-popover-content-transform-origin) overflow-y-auto max-h-(--radix-popover-content-available-height) min-w-[240px] max-w-[98vw] rounded-xl border bg-fd-popover/60 backdrop-blur-lg p-2 text-sm text-fd-popover-foreground shadow-lg focus-visible:outline-none data-[state=closed]:animate-fd-popover-out data-[state=open]:animate-fd-popover-in', className), ...props }) })));
9
9
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
10
10
  const PopoverClose = PopoverPrimitive.PopoverClose;
11
11
  export { Popover, PopoverTrigger, PopoverContent, PopoverClose };
package/dist/i18n.d.ts CHANGED
@@ -3,7 +3,6 @@ import type { I18nProviderProps } from './provider/base.js';
3
3
  import type { I18nConfig } from 'fumadocs-core/i18n';
4
4
  export type { I18nProviderProps, Translations };
5
5
  export { defaultTranslations } from './contexts/i18n.js';
6
- export { I18nProvider } from './contexts/legacy-i18n.js';
7
6
  export declare function defineI18nUI<Languages extends string>(config: I18nConfig<Languages>, options: {
8
7
  translations: {
9
8
  [K in Languages]?: Partial<Translations> & {
@@ -1 +1 @@
1
- {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,wBAAgB,YAAY,CAAC,SAAS,SAAS,MAAM,EACnD,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,EAC7B,OAAO,EAAE;IACP,YAAY,EAAE;SACX,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE;KACpE,CAAC;CACH;sBAKkB,MAAM,GAA4B,iBAAiB;EAWvE"}
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,wBAAgB,YAAY,CAAC,SAAS,SAAS,MAAM,EACnD,MAAM,EAAE,UAAU,CAAC,SAAS,CAAC,EAC7B,OAAO,EAAE;IACP,YAAY,EAAE;SACX,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE;KACpE,CAAC;CACH;sBAKkB,MAAM,GAA4B,iBAAiB;EAWvE"}
package/dist/i18n.js CHANGED
@@ -1,5 +1,4 @@
1
1
  export { defaultTranslations } from './contexts/i18n.js';
2
- export { I18nProvider } from './contexts/legacy-i18n.js';
3
2
  export function defineI18nUI(config, options) {
4
3
  const { translations } = options;
5
4
  return {
@@ -31,6 +31,6 @@ interface SidebarOptions extends ComponentProps<'aside'>, Pick<SidebarProps, 'de
31
31
  */
32
32
  collapsible?: boolean;
33
33
  }
34
- export declare function DocsLayout({ nav: { transparentMode, ...nav }, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled, ...sidebarProps }, searchToggle, themeSwitch, tabMode, i18n, children, ...props }: DocsLayoutProps): import("react/jsx-runtime").JSX.Element;
34
+ export declare function DocsLayout({ nav: { transparentMode, ...nav }, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled, ...sidebarProps }, searchToggle, themeSwitch, tabMode, i18n, children, tree, ...props }: DocsLayoutProps): import("react/jsx-runtime").JSX.Element;
35
35
  export { CollapsibleControl, Navbar, SidebarTrigger, type LinkItemType };
36
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layouts/docs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAIf,OAAO,EAGL,KAAK,iBAAiB,EAWtB,KAAK,YAAY,EACjB,cAAc,EAEf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EACL,kBAAkB,EAGlB,MAAM,EACP,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IAEpB,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAEzB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,UAAU,cACR,SAAQ,cAAc,CAAC,OAAO,CAAC,EAC7B,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,UAAU,CAAC;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,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,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;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,WAAgB,EAChB,OAAgB,EAChB,IAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,2CA+OjB;AA6CD,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/layouts/docs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AAIf,OAAO,EAGL,KAAK,iBAAiB,EAWtB,KAAK,YAAY,EACjB,cAAc,EAEf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,MAAM,EAAc,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,KAAK,eAAe,EAGpB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EACL,kBAAkB,EAGlB,MAAM,EACP,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC;IAEpB,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAEzB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,UAAU,cACR,SAAQ,cAAc,CAAC,OAAO,CAAC,EAC7B,IAAI,CAAC,YAAY,EAAE,kBAAkB,GAAG,UAAU,CAAC;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,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,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;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,WAAgB,EAChB,OAAgB,EAChB,IAAY,EACZ,QAAQ,EACR,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,eAAe,2CA+OjB;AA6CD,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,CAAC"}
@@ -14,19 +14,19 @@ import { NavProvider } from '../../contexts/layout.js';
14
14
  import Link from 'fumadocs-core/link';
15
15
  import { LargeSearchToggle, SearchToggle, } from '../../components/layout/search-toggle.js';
16
16
  import { getSidebarTabs, } from '../../utils/get-sidebar-tabs.js';
17
- export function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled = true, ...sidebarProps } = {}, searchToggle = {}, themeSwitch = {}, tabMode = 'auto', i18n = false, children, ...props }) {
17
+ export function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { tabs: sidebarTabs, enabled: sidebarEnabled = true, ...sidebarProps } = {}, searchToggle = {}, themeSwitch = {}, tabMode = 'auto', i18n = false, children, tree, ...props }) {
18
18
  const tabs = useMemo(() => {
19
19
  if (Array.isArray(sidebarTabs)) {
20
20
  return sidebarTabs;
21
21
  }
22
22
  if (typeof sidebarTabs === 'object') {
23
- return getSidebarTabs(props.tree, sidebarTabs);
23
+ return getSidebarTabs(tree, sidebarTabs);
24
24
  }
25
25
  if (sidebarTabs !== false) {
26
- return getSidebarTabs(props.tree);
26
+ return getSidebarTabs(tree);
27
27
  }
28
28
  return [];
29
- }, [sidebarTabs, props.tree]);
29
+ }, [tree, sidebarTabs]);
30
30
  const links = getLinks(props.links ?? [], props.githubUrl);
31
31
  const sidebarVariables = cn('md:[--fd-sidebar-width:268px] lg:[--fd-sidebar-width:286px]');
32
32
  function sidebar() {
@@ -59,13 +59,13 @@ export function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar: { t
59
59
  (themeSwitch.component ?? (_jsx(ThemeToggle, { className: "ms-auto p-0", mode: themeSwitch.mode })))] }), footer] }))] }));
60
60
  return (_jsx(Sidebar, { defaultOpenLevel: defaultOpenLevel, prefetch: prefetch, Mobile: mobile, Content: _jsxs(_Fragment, { children: [collapsible && _jsx(CollapsibleControl, {}), content] }) }));
61
61
  }
62
- return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsxs(NavProvider, { transparentMode: transparentMode, children: [nav.enabled !== false &&
62
+ return (_jsx(TreeContextProvider, { tree: tree, children: _jsxs(NavProvider, { transparentMode: transparentMode, children: [nav.enabled !== false &&
63
63
  (nav.component ?? (_jsxs(Navbar, { className: "h-(--fd-nav-height) on-root:[--fd-nav-height:56px] md:on-root:[--fd-nav-height:0px] 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 &&
64
64
  (searchToggle.components?.sm ?? (_jsx(SearchToggle, { className: "p-2", hideIfDisabled: true }))), sidebarEnabled && (_jsx(SidebarTrigger, { className: cn(buttonVariants({
65
65
  color: 'ghost',
66
66
  size: 'icon-sm',
67
67
  className: 'p-2',
68
- })), children: _jsx(SidebarIcon, {}) }))] }))), _jsxs(LayoutBody, { ...props.containerProps, className: cn('md:[&_#nd-page_article]:pt-12 xl:[--fd-toc-width:286px] xl:[&_#nd-page_article]:px-8', sidebarEnabled && sidebarVariables, props.containerProps?.className), children: [sidebarEnabled && sidebar(), tabMode === 'top' && tabs.length > 0 && (_jsx(LayoutTabs, { options: tabs, className: "sticky top-[calc(var(--fd-nav-height)+var(--fd-tocnav-height))] z-10 bg-fd-background border-b px-6 pt-3 xl:px-8 max-md:hidden" })), children] })] }) }));
68
+ })), children: _jsx(SidebarIcon, {}) }))] }))), _jsxs(LayoutBody, { ...props.containerProps, className: cn('md:[&_#nd-page_article]:pt-12 xl:[&_#nd-page_article]:px-8', sidebarEnabled && sidebarVariables, props.containerProps?.className), children: [sidebarEnabled && sidebar(), tabMode === 'top' && tabs.length > 0 && (_jsx(LayoutTabs, { options: tabs, className: "sticky top-[calc(var(--fd-nav-height)+var(--fd-tocnav-height))] z-10 bg-fd-background border-b px-6 pt-3 xl:px-8 max-md:hidden" })), children] })] }) }));
69
69
  }
70
70
  function SidebarLinkItem({ item, ...props }) {
71
71
  if (item.type === 'menu')
@@ -149,7 +149,7 @@ export function PageBreadcrumb({ includeRoot, includeSeparator, includePage, ...
149
149
  export function PageTOC(props) {
150
150
  const { collapsed } = useSidebar();
151
151
  const offset = collapsed ? '0px' : 'var(--fd-layout-offset)';
152
- return (_jsx("div", { id: "nd-toc", ...props, className: cn('fixed bottom-0 pt-12 pb-2 pr-(--removed-body-scroll-bar-size,0) max-xl:hidden', props.className), style: {
152
+ return (_jsx("div", { id: "nd-toc", ...props, className: cn('fixed bottom-0 pt-12 pb-2 pr-(--removed-body-scroll-bar-size,0) xl:on-root:[--fd-toc-width:286px] max-xl:hidden', props.className), style: {
153
153
  ...props.style,
154
154
  top: 'calc(var(--fd-banner-height) + var(--fd-nav-height))',
155
155
  insetInlineEnd: `max(${offset}, calc(50vw - var(--fd-sidebar-width)/2 - var(--fd-page-width)/2))`,
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../src/layouts/docs/page.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,cAAc,EACd,UAAU,EACV,cAAc,EACd,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,2CAavD;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,2CAM1D;AAED,wBAAgB,mBAAmB,CAAC,EAClC,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,2CAM1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,2CAY3D;AAED,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,KAAK,CAAC;IACtD,GAAG,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;CACrD;AAED,wBAAgB,QAAQ,CAAC,EAAE,GAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,2CAgBtE;AAED,OAAO,EACL,cAAc,EACd,UAAU,EACV,cAAc,EACd,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,CAAC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../src/layouts/docs/page.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,cAAc,EACd,UAAU,EACV,cAAc,EACd,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,2CAcvD;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,2CAM1D;AAED,wBAAgB,mBAAmB,CAAC,EAClC,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,2CAM1D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,2CAY3D;AAED,MAAM,WAAW,SAAU,SAAQ,cAAc,CAAC,KAAK,CAAC;IACtD,GAAG,CAAC,EAAE,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;CACrD;AAED,wBAAgB,QAAQ,CAAC,EAAE,GAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,SAAS,2CAgBtE;AAED,OAAO,EACL,cAAc,EACd,UAAU,EACV,cAAc,EACd,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,CAAC"}
@@ -6,7 +6,7 @@ import { Text } from '../../icons.js';
6
6
  import { I18nLabel } from '../../contexts/i18n.js';
7
7
  import ClerkTOCItems from '../../components/layout/toc-clerk.js';
8
8
  export function PageTOCTitle(props) {
9
- return (_jsxs("h3", { ...props, className: cn('inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground', props.className), children: [_jsx(Text, { className: "size-4" }), _jsx(I18nLabel, { label: "toc" })] }));
9
+ return (_jsxs("h3", { id: "toc-title", ...props, className: cn('inline-flex items-center gap-1.5 text-sm text-fd-muted-foreground', props.className), children: [_jsx(Text, { className: "size-4" }), _jsx(I18nLabel, { label: "toc" })] }));
10
10
  }
11
11
  export function PageTOCItems({ variant = 'normal', ...props }) {
12
12
  return (_jsx(TOCScrollArea, { ...props, children: variant === 'clerk' ? _jsx(ClerkTOCItems, {}) : _jsx(TOCItems, {}) }));
@@ -66,7 +66,7 @@ export function DocsLayout(props) {
66
66
  (themeSwitch.component ?? (_jsx(ThemeToggle, { mode: themeSwitch.mode ?? 'light-dark-system' })))] })] }));
67
67
  return (_jsx(Sidebar, { defaultOpenLevel: defaultOpenLevel, prefetch: prefetch, Content: content, Mobile: mobile }));
68
68
  }
69
- return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsx(NavProvider, { transparentMode: transparentMode, children: _jsxs(LayoutBody, { ...props.containerProps, className: cn('md:[--fd-sidebar-width:286px] xl:[--fd-toc-width:286px]', props.containerProps?.className), children: [sidebar(), _jsx(DocsNavbar, { ...props, links: links, tabs: tabMode == 'navbar' ? tabs : [] }), props.children] }) }) }));
69
+ return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsx(NavProvider, { transparentMode: transparentMode, children: _jsxs(LayoutBody, { ...props.containerProps, className: cn('md:[--fd-sidebar-width:286px]', props.containerProps?.className), children: [sidebar(), _jsx(DocsNavbar, { ...props, links: links, tabs: tabMode == 'navbar' ? tabs : [] }), props.children] }) }) }));
70
70
  }
71
71
  function DocsNavbar({ links, tabs, sidebar: { collapsible: sidebarCollapsible = true } = {}, searchToggle = {}, themeSwitch = {}, nav = {}, i18n, }) {
72
72
  const navMode = nav.mode ?? 'auto';
package/dist/page.d.ts CHANGED
@@ -18,13 +18,6 @@ interface EditOnGitHubOptions extends Omit<ComponentProps<'a'>, 'href' | 'childr
18
18
  interface BreadcrumbOptions extends BreadcrumbProps {
19
19
  enabled: boolean;
20
20
  component: ReactNode;
21
- /**
22
- * Show the full path to the current page
23
- *
24
- * @defaultValue false
25
- * @deprecated use `includePage` instead
26
- */
27
- full?: boolean;
28
21
  }
29
22
  interface FooterOptions extends FooterProps {
30
23
  enabled: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.tsx"],"names":[],"mappings":"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"}
package/dist/page.js CHANGED
@@ -19,7 +19,7 @@ export function DocsPage({ editOnGithub, breadcrumb: { enabled: breadcrumbEnable
19
19
  toc,
20
20
  single: tocOptions.single,
21
21
  }
22
- : false, ...container, className: cn(!tocEnabled && '[--fd-toc-width:0px]', container?.className), children: [tocPopoverEnabled &&
22
+ : false, ...container, children: [tocPopoverEnabled &&
23
23
  (tocPopover ?? (_jsxs(PageTOCPopover, { children: [_jsx(PageTOCPopoverTrigger, {}), _jsxs(PageTOCPopoverContent, { children: [tocPopoverOptions.header, _jsx(PageTOCPopoverItems, { variant: tocPopoverOptions.style }), tocPopoverOptions.footer] })] }))), _jsxs(PageArticle, { ...article, children: [breadcrumbEnabled &&
24
24
  (breadcrumb ?? _jsx(PageBreadcrumb, { ...breadcrumbProps })), children, _jsxs("div", { className: "flex flex-row flex-wrap items-center justify-between gap-4 empty:hidden", children: [editOnGithub && (_jsx(EditOnGitHub, { href: `https://github.com/${editOnGithub.owner}/${editOnGithub.repo}/blob/${editOnGithub.sha}/${editOnGithub.path.startsWith('/') ? editOnGithub.path.slice(1) : editOnGithub.path}` })), lastUpdate && _jsx(PageLastUpdate, { date: new Date(lastUpdate) })] }), footer.enabled !== false &&
25
25
  (footer.component ?? _jsx(PageFooter, { items: footer.items }))] }), tocEnabled &&
@@ -1,4 +1,8 @@
1
- export { RootProvider } from './next.js';
1
+ export {
2
+ /**
3
+ * @deprecated Import from `fumadocs-ui/provider/next` instead.
4
+ */
5
+ RootProvider, } from './next.js';
2
6
  export { useI18n, I18nLabel } from '../contexts/i18n.js';
3
7
  export { SearchProvider, SearchOnly, useSearchContext, type SearchProviderProps, } from '../contexts/search.js';
4
8
  export { SidebarProvider, useSidebar } from '../contexts/sidebar.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,MAAM,EACN,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/provider/index.tsx"],"names":[],"mappings":"AAMA,OAAO;AACL;;GAEG;AACH,YAAY,GACb,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,KAAK,mBAAmB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EACL,WAAW,EACX,cAAc,EACd,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,MAAM,EACN,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,cAAc,EACd,aAAa,GACd,MAAM,mBAAmB,CAAC"}
@@ -1,6 +1,10 @@
1
1
  'use client';
2
- // TODO: remove this, recommend `fumadocs-ui/provider/next` instead.
3
- export { RootProvider } from './next.js';
2
+ console.warn('`fumadocs-ui/provider` export will be removed on v17, you can import from `fumadocs-ui/provider/next` instead.');
3
+ export {
4
+ /**
5
+ * @deprecated Import from `fumadocs-ui/provider/next` instead.
6
+ */
7
+ RootProvider, } from './next.js';
4
8
  export { useI18n, I18nLabel } from '../contexts/i18n.js';
5
9
  export { SearchProvider, SearchOnly, useSearchContext, } from '../contexts/search.js';
6
10
  export { SidebarProvider, useSidebar } from '../contexts/sidebar.js';
package/dist/style.css CHANGED
@@ -1,4 +1,4 @@
1
- /*! tailwindcss v4.1.14 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.1.15 | MIT License | https://tailwindcss.com */
2
2
  @layer properties;
3
3
  @layer theme, base, components, utilities;
4
4
  @layer theme {
@@ -51,29 +51,30 @@
51
51
  --color-fd-accent: hsla(0, 0%, 82%, 50%);
52
52
  --color-fd-accent-foreground: hsl(0, 0%, 9%);
53
53
  --color-fd-ring: hsl(0, 0%, 63.9%);
54
+ --color-fd-overlay: transparent;
54
55
  --color-fd-info: oklch(62.3% 0.214 259.815);
55
56
  --color-fd-warning: oklch(76.9% 0.188 70.08);
56
57
  --color-fd-error: oklch(63.7% 0.237 25.331);
57
58
  --color-fd-success: oklch(72.3% 0.219 149.579);
59
+ --color-fd-diff-remove: rgba(200, 10, 100, 0.12);
60
+ --color-fd-diff-remove-symbol: rgb(230, 10, 100);
61
+ --color-fd-diff-add: rgba(14, 180, 100, 0.1);
62
+ --color-fd-diff-add-symbol: rgb(10, 200, 100);
58
63
  --fd-sidebar-mobile-offset: 100%;
59
64
  --spacing-fd-container: 1400px;
60
65
  --fd-page-width: 1200px;
61
66
  --fd-sidebar-width: 0px;
62
67
  --fd-toc-width: 0px;
63
- --fd-layout-width: 100vw;
68
+ --fd-layout-width: 1600px;
64
69
  --fd-banner-height: 0px;
65
70
  --fd-nav-height: 0px;
66
71
  --fd-tocnav-height: 0px;
67
- --color-fd-diff-remove: rgba(200, 10, 100, 0.12);
68
- --color-fd-diff-remove-symbol: rgb(230, 10, 100);
69
- --color-fd-diff-add: rgba(14, 180, 100, 0.1);
70
- --color-fd-diff-add-symbol: rgb(10, 200, 100);
71
72
  --animate-fd-fade-in: fd-fade-in 300ms ease;
72
73
  --animate-fd-fade-out: fd-fade-out 300ms ease;
73
74
  --animate-fd-dialog-in: fd-dialog-in 300ms cubic-bezier(0.16, 1, 0.3, 1);
74
75
  --animate-fd-dialog-out: fd-dialog-out 300ms cubic-bezier(0.16, 1, 0.3, 1);
75
- --animate-fd-popover-in: fd-popover-in 130ms ease;
76
- --animate-fd-popover-out: fd-popover-out 130ms ease;
76
+ --animate-fd-popover-in: fd-popover-in 100ms ease;
77
+ --animate-fd-popover-out: fd-popover-out 100ms ease;
77
78
  --animate-fd-collapsible-down: fd-collapsible-down 150ms
78
79
  cubic-bezier(0.45, 0, 0.55, 1);
79
80
  --animate-fd-collapsible-up: fd-collapsible-up 150ms
@@ -199,7 +200,9 @@
199
200
  ::placeholder {
200
201
  color: currentcolor;
201
202
  @supports (color: color-mix(in lab, red, red)) {
202
- color: color-mix(in oklab, currentcolor 50%, transparent);
203
+ & {
204
+ color: color-mix(in oklab, currentcolor 50%, transparent);
205
+ }
203
206
  }
204
207
  }
205
208
  }
@@ -800,7 +803,9 @@
800
803
  }
801
804
  --tw-prose-body: color-mix(in srgb, hsl(0, 0%, 3.9%) 90%, transparent);
802
805
  @supports (color: color-mix(in lab, red, red)) {
803
- --tw-prose-body: color-mix(in oklab, var(--color-fd-foreground) 90%, transparent);
806
+ & {
807
+ --tw-prose-body: color-mix(in oklab, var(--color-fd-foreground) 90%, transparent);
808
+ }
804
809
  }
805
810
  --tw-prose-headings: var(--color-fd-foreground);
806
811
  --tw-prose-lead: var(--color-fd-foreground);
@@ -818,7 +823,9 @@
818
823
  --tw-prose-kbd: var(--color-fd-foreground);
819
824
  --tw-prose-kbd-shadows: color-mix(in srgb, hsl(0, 0%, 9%) 50%, transparent);
820
825
  @supports (color: color-mix(in lab, red, red)) {
821
- --tw-prose-kbd-shadows: color-mix(in oklab, var(--color-fd-primary) 50%, transparent);
826
+ & {
827
+ --tw-prose-kbd-shadows: color-mix(in oklab, var(--color-fd-primary) 50%, transparent);
828
+ }
822
829
  }
823
830
  :where(.prose > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) {
824
831
  margin-top: 0;
@@ -915,6 +922,9 @@
915
922
  .block {
916
923
  display: block;
917
924
  }
925
+ .contents {
926
+ display: contents;
927
+ }
918
928
  .flex {
919
929
  display: flex;
920
930
  }
@@ -1008,6 +1018,9 @@
1008
1018
  .h-px {
1009
1019
  height: 1px;
1010
1020
  }
1021
+ .max-h-\(--radix-popover-content-available-height\) {
1022
+ max-height: var(--radix-popover-content-available-height);
1023
+ }
1011
1024
  .max-h-\[50vh\] {
1012
1025
  max-height: 50vh;
1013
1026
  }
@@ -1248,6 +1261,9 @@
1248
1261
  .overflow-x-auto {
1249
1262
  overflow-x: auto;
1250
1263
  }
1264
+ .overflow-x-hidden {
1265
+ overflow-x: hidden;
1266
+ }
1251
1267
  .overflow-y-auto {
1252
1268
  overflow-y: auto;
1253
1269
  }
@@ -1310,7 +1326,9 @@
1310
1326
  .border-fd-foreground\/10 {
1311
1327
  border-color: color-mix(in srgb, hsl(0, 0%, 3.9%) 10%, transparent);
1312
1328
  @supports (color: color-mix(in lab, red, red)) {
1313
- border-color: color-mix(in oklab, var(--color-fd-foreground) 10%, transparent);
1329
+ & {
1330
+ border-color: color-mix(in oklab, var(--color-fd-foreground) 10%, transparent);
1331
+ }
1314
1332
  }
1315
1333
  }
1316
1334
  .border-fd-primary {
@@ -1322,7 +1340,9 @@
1322
1340
  .bg-\(--callout-color\)\/50 {
1323
1341
  background-color: var(--callout-color);
1324
1342
  @supports (color: color-mix(in lab, red, red)) {
1325
- background-color: color-mix(in oklab, var(--callout-color) 50%, transparent);
1343
+ & {
1344
+ background-color: color-mix(in oklab, var(--callout-color) 50%, transparent);
1345
+ }
1326
1346
  }
1327
1347
  }
1328
1348
  .bg-\(--shiki-light-bg\) {
@@ -1337,7 +1357,9 @@
1337
1357
  .bg-fd-background\/80 {
1338
1358
  background-color: color-mix(in srgb, hsl(0, 0%, 96%) 80%, transparent);
1339
1359
  @supports (color: color-mix(in lab, red, red)) {
1340
- background-color: color-mix(in oklab, var(--color-fd-background) 80%, transparent);
1360
+ & {
1361
+ background-color: color-mix(in oklab, var(--color-fd-background) 80%, transparent);
1362
+ }
1341
1363
  }
1342
1364
  }
1343
1365
  .bg-fd-border {
@@ -1349,19 +1371,26 @@
1349
1371
  .bg-fd-foreground\/10 {
1350
1372
  background-color: color-mix(in srgb, hsl(0, 0%, 3.9%) 10%, transparent);
1351
1373
  @supports (color: color-mix(in lab, red, red)) {
1352
- background-color: color-mix(in oklab, var(--color-fd-foreground) 10%, transparent);
1374
+ & {
1375
+ background-color: color-mix(in oklab, var(--color-fd-foreground) 10%, transparent);
1376
+ }
1353
1377
  }
1354
1378
  }
1355
1379
  .bg-fd-muted {
1356
1380
  background-color: var(--color-fd-muted);
1357
1381
  }
1382
+ .bg-fd-overlay {
1383
+ background-color: var(--color-fd-overlay);
1384
+ }
1358
1385
  .bg-fd-popover {
1359
1386
  background-color: var(--color-fd-popover);
1360
1387
  }
1361
1388
  .bg-fd-popover\/60 {
1362
1389
  background-color: color-mix(in srgb, hsl(0, 0%, 98%) 60%, transparent);
1363
1390
  @supports (color: color-mix(in lab, red, red)) {
1364
- background-color: color-mix(in oklab, var(--color-fd-popover) 60%, transparent);
1391
+ & {
1392
+ background-color: color-mix(in oklab, var(--color-fd-popover) 60%, transparent);
1393
+ }
1365
1394
  }
1366
1395
  }
1367
1396
  .bg-fd-primary {
@@ -1370,7 +1399,9 @@
1370
1399
  .bg-fd-primary\/10 {
1371
1400
  background-color: color-mix(in srgb, hsl(0, 0%, 9%) 10%, transparent);
1372
1401
  @supports (color: color-mix(in lab, red, red)) {
1373
- background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
1402
+ & {
1403
+ background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
1404
+ }
1374
1405
  }
1375
1406
  }
1376
1407
  .bg-fd-secondary {
@@ -1379,7 +1410,9 @@
1379
1410
  .bg-fd-secondary\/50 {
1380
1411
  background-color: color-mix(in srgb, hsl(0, 0%, 93.1%) 50%, transparent);
1381
1412
  @supports (color: color-mix(in lab, red, red)) {
1382
- background-color: color-mix(in oklab, var(--color-fd-secondary) 50%, transparent);
1413
+ & {
1414
+ background-color: color-mix(in oklab, var(--color-fd-secondary) 50%, transparent);
1415
+ }
1383
1416
  }
1384
1417
  }
1385
1418
  .bg-transparent {
@@ -1394,13 +1427,17 @@
1394
1427
  .stroke-current\/25 {
1395
1428
  stroke: currentcolor;
1396
1429
  @supports (color: color-mix(in lab, red, red)) {
1397
- stroke: color-mix(in oklab, currentcolor 25%, transparent);
1430
+ & {
1431
+ stroke: color-mix(in oklab, currentcolor 25%, transparent);
1432
+ }
1398
1433
  }
1399
1434
  }
1400
1435
  .stroke-fd-foreground\/10 {
1401
1436
  stroke: color-mix(in srgb, hsl(0, 0%, 3.9%) 10%, transparent);
1402
1437
  @supports (color: color-mix(in lab, red, red)) {
1403
- stroke: color-mix(in oklab, var(--color-fd-foreground) 10%, transparent);
1438
+ & {
1439
+ stroke: color-mix(in oklab, var(--color-fd-foreground) 10%, transparent);
1440
+ }
1404
1441
  }
1405
1442
  }
1406
1443
  .p-0 {
@@ -1622,7 +1659,9 @@
1622
1659
  .text-fd-foreground\/80 {
1623
1660
  color: color-mix(in srgb, hsl(0, 0%, 3.9%) 80%, transparent);
1624
1661
  @supports (color: color-mix(in lab, red, red)) {
1625
- color: color-mix(in oklab, var(--color-fd-foreground) 80%, transparent);
1662
+ & {
1663
+ color: color-mix(in oklab, var(--color-fd-foreground) 80%, transparent);
1664
+ }
1626
1665
  }
1627
1666
  }
1628
1667
  .text-fd-muted-foreground {
@@ -1631,7 +1670,9 @@
1631
1670
  .text-fd-muted-foreground\/50 {
1632
1671
  color: color-mix(in srgb, hsl(0, 0%, 45.1%) 50%, transparent);
1633
1672
  @supports (color: color-mix(in lab, red, red)) {
1634
- color: color-mix(in oklab, var(--color-fd-muted-foreground) 50%, transparent);
1673
+ & {
1674
+ color: color-mix(in oklab, var(--color-fd-muted-foreground) 50%, transparent);
1675
+ }
1635
1676
  }
1636
1677
  }
1637
1678
  .text-fd-popover-foreground {
@@ -1640,7 +1681,9 @@
1640
1681
  .text-fd-popover-foreground\/80 {
1641
1682
  color: color-mix(in srgb, hsl(0, 0%, 15.1%) 80%, transparent);
1642
1683
  @supports (color: color-mix(in lab, red, red)) {
1643
- color: color-mix(in oklab, var(--color-fd-popover-foreground) 80%, transparent);
1684
+ & {
1685
+ color: color-mix(in oklab, var(--color-fd-popover-foreground) 80%, transparent);
1686
+ }
1644
1687
  }
1645
1688
  }
1646
1689
  .text-fd-primary {
@@ -1652,7 +1695,9 @@
1652
1695
  .text-fd-primary\/50 {
1653
1696
  color: color-mix(in srgb, hsl(0, 0%, 9%) 50%, transparent);
1654
1697
  @supports (color: color-mix(in lab, red, red)) {
1655
- color: color-mix(in oklab, var(--color-fd-primary) 50%, transparent);
1698
+ & {
1699
+ color: color-mix(in oklab, var(--color-fd-primary) 50%, transparent);
1700
+ }
1656
1701
  }
1657
1702
  }
1658
1703
  .text-fd-secondary-foreground {
@@ -1689,7 +1734,9 @@
1689
1734
  .shadow-black\/50 {
1690
1735
  --tw-shadow-color: color-mix(in srgb, #000 50%, transparent);
1691
1736
  @supports (color: color-mix(in lab, red, red)) {
1692
- --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-black) 50%, transparent) var(--tw-shadow-alpha), transparent);
1737
+ & {
1738
+ --tw-shadow-color: color-mix(in oklab, color-mix(in oklab, var(--color-black) 50%, transparent) var(--tw-shadow-alpha), transparent);
1739
+ }
1693
1740
  }
1694
1741
  }
1695
1742
  .outline {
@@ -1789,9 +1836,6 @@
1789
1836
  .\[--fd-nav-height\:56px\] {
1790
1837
  --fd-nav-height: 56px;
1791
1838
  }
1792
- .\[--fd-toc-width\:0px\] {
1793
- --fd-toc-width: 0px;
1794
- }
1795
1839
  .\[scrollbar-width\:none\] {
1796
1840
  scrollbar-width: none;
1797
1841
  }
@@ -1960,7 +2004,9 @@
1960
2004
  @media (hover: hover) {
1961
2005
  background-color: color-mix(in srgb, hsla(0, 0%, 82%, 50%) 50%, transparent);
1962
2006
  @supports (color: color-mix(in lab, red, red)) {
1963
- background-color: color-mix(in oklab, var(--color-fd-accent) 50%, transparent);
2007
+ & {
2008
+ background-color: color-mix(in oklab, var(--color-fd-accent) 50%, transparent);
2009
+ }
1964
2010
  }
1965
2011
  }
1966
2012
  }
@@ -1970,7 +2016,9 @@
1970
2016
  @media (hover: hover) {
1971
2017
  background-color: color-mix(in srgb, hsla(0, 0%, 82%, 50%) 80%, transparent);
1972
2018
  @supports (color: color-mix(in lab, red, red)) {
1973
- background-color: color-mix(in oklab, var(--color-fd-accent) 80%, transparent);
2019
+ & {
2020
+ background-color: color-mix(in oklab, var(--color-fd-accent) 80%, transparent);
2021
+ }
1974
2022
  }
1975
2023
  }
1976
2024
  }
@@ -1980,7 +2028,9 @@
1980
2028
  @media (hover: hover) {
1981
2029
  background-color: color-mix(in srgb, hsl(0, 0%, 9%) 80%, transparent);
1982
2030
  @supports (color: color-mix(in lab, red, red)) {
1983
- background-color: color-mix(in oklab, var(--color-fd-primary) 80%, transparent);
2031
+ & {
2032
+ background-color: color-mix(in oklab, var(--color-fd-primary) 80%, transparent);
2033
+ }
1984
2034
  }
1985
2035
  }
1986
2036
  }
@@ -1997,7 +2047,9 @@
1997
2047
  @media (hover: hover) {
1998
2048
  color: color-mix(in srgb, hsl(0, 0%, 9%) 80%, transparent);
1999
2049
  @supports (color: color-mix(in lab, red, red)) {
2000
- color: color-mix(in oklab, var(--color-fd-accent-foreground) 80%, transparent);
2050
+ & {
2051
+ color: color-mix(in oklab, var(--color-fd-accent-foreground) 80%, transparent);
2052
+ }
2001
2053
  }
2002
2054
  }
2003
2055
  }
@@ -2007,7 +2059,9 @@
2007
2059
  @media (hover: hover) {
2008
2060
  color: color-mix(in srgb, hsl(0, 0%, 15.1%) 50%, transparent);
2009
2061
  @supports (color: color-mix(in lab, red, red)) {
2010
- color: color-mix(in oklab, var(--color-fd-popover-foreground) 50%, transparent);
2062
+ & {
2063
+ color: color-mix(in oklab, var(--color-fd-popover-foreground) 50%, transparent);
2064
+ }
2011
2065
  }
2012
2066
  }
2013
2067
  }
@@ -2279,7 +2333,9 @@
2279
2333
  &[data-state="open"] {
2280
2334
  background-color: color-mix(in srgb, hsla(0, 0%, 82%, 50%) 50%, transparent);
2281
2335
  @supports (color: color-mix(in lab, red, red)) {
2282
- background-color: color-mix(in oklab, var(--color-fd-accent) 50%, transparent);
2336
+ & {
2337
+ background-color: color-mix(in oklab, var(--color-fd-accent) 50%, transparent);
2338
+ }
2283
2339
  }
2284
2340
  }
2285
2341
  }
@@ -2519,11 +2575,6 @@
2519
2575
  padding-inline: calc(var(--spacing) * 8);
2520
2576
  }
2521
2577
  }
2522
- .xl\:\[--fd-toc-width\:286px\] {
2523
- @media (width >= 80rem) {
2524
- --fd-toc-width: 286px;
2525
- }
2526
- }
2527
2578
  .\@max-xl\:hidden {
2528
2579
  @container (width < 36rem) {
2529
2580
  display: none;
@@ -2599,6 +2650,13 @@
2599
2650
  }
2600
2651
  }
2601
2652
  }
2653
+ .xl\:on-root\:\[--fd-toc-width\:286px\] {
2654
+ @media (width >= 80rem) {
2655
+ :root:has(&) {
2656
+ --fd-toc-width: 286px;
2657
+ }
2658
+ }
2659
+ }
2602
2660
  .md\:\[\&_\#nd-page_article\]\:pt-12 {
2603
2661
  @media (width >= 48rem) {
2604
2662
  & #nd-page article {
@@ -2677,6 +2735,7 @@
2677
2735
  --color-fd-accent: hsla(0, 0%, 40.9%, 30%);
2678
2736
  --color-fd-accent-foreground: hsl(0, 0%, 90%);
2679
2737
  --color-fd-ring: hsl(0, 0%, 54.9%);
2738
+ --color-fd-overlay: hsla(0, 0%, 0%, 0.2);
2680
2739
  }
2681
2740
  .dark #nd-sidebar {
2682
2741
  --color-fd-muted: hsl(0, 0%, 16%);
@@ -2723,7 +2782,9 @@
2723
2782
  content: counter(line);
2724
2783
  color: var(--fd-counter-color, hsl(0, 0%, 45.1%));
2725
2784
  @supports (color: color-mix(in lab, red, red)) {
2726
- color: color-mix( in oklab, var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%, transparent );
2785
+ & {
2786
+ color: color-mix( in oklab, var(--fd-counter-color, var(--color-fd-muted-foreground)) 60%, transparent );
2787
+ }
2727
2788
  }
2728
2789
  top: calc(var(--spacing) * 0);
2729
2790
  left: calc(var(--spacing) * 4);
@@ -2756,11 +2817,15 @@
2756
2817
  border-left-width: 2px;
2757
2818
  border-color: color-mix(in srgb, hsl(0, 0%, 9%) 50%, transparent);
2758
2819
  @supports (color: color-mix(in lab, red, red)) {
2759
- border-color: color-mix(in oklab, var(--color-fd-primary) 50%, transparent);
2820
+ & {
2821
+ border-color: color-mix(in oklab, var(--color-fd-primary) 50%, transparent);
2822
+ }
2760
2823
  }
2761
2824
  background-color: color-mix(in srgb, hsl(0, 0%, 9%) 10%, transparent);
2762
2825
  @supports (color: color-mix(in lab, red, red)) {
2763
- background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
2826
+ & {
2827
+ background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
2828
+ }
2764
2829
  }
2765
2830
  }
2766
2831
  .highlighted-word& {
@@ -2771,11 +2836,15 @@
2771
2836
  border-width: 1px;
2772
2837
  border-color: color-mix(in srgb, hsl(0, 0%, 9%) 30%, transparent);
2773
2838
  @supports (color: color-mix(in lab, red, red)) {
2774
- border-color: color-mix(in oklab, var(--color-fd-primary) 30%, transparent);
2839
+ & {
2840
+ border-color: color-mix(in oklab, var(--color-fd-primary) 30%, transparent);
2841
+ }
2775
2842
  }
2776
2843
  background-color: color-mix(in srgb, hsl(0, 0%, 9%) 10%, transparent);
2777
2844
  @supports (color: color-mix(in lab, red, red)) {
2778
- background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
2845
+ & {
2846
+ background-color: color-mix(in oklab, var(--color-fd-primary) 10%, transparent);
2847
+ }
2779
2848
  }
2780
2849
  --tw-font-weight: var(--font-weight-medium);
2781
2850
  font-weight: var(--font-weight-medium);
@@ -3112,13 +3181,13 @@
3112
3181
  @keyframes fd-popover-in {
3113
3182
  from {
3114
3183
  opacity: 0;
3115
- transform: scale(0.7);
3184
+ transform: scale(0.9);
3116
3185
  }
3117
3186
  }
3118
3187
  @keyframes fd-popover-out {
3119
3188
  to {
3120
3189
  opacity: 0;
3121
- transform: scale(0.7);
3190
+ transform: scale(0.9);
3122
3191
  }
3123
3192
  }
3124
3193
  @keyframes fd-fade-in {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fumadocs-ui",
3
- "version": "15.8.5",
3
+ "version": "16.0.1",
4
4
  "description": "The framework for building a documentation website in Next.js",
5
5
  "keywords": [
6
6
  "NextJs",
@@ -61,9 +61,9 @@
61
61
  "types": "./dist/layouts/shared/index.d.ts"
62
62
  },
63
63
  "./page": {
64
- "node": "./dist/page.server.js",
64
+ "node": "./dist/page.js",
65
65
  "import": "./dist/page.js",
66
- "types": "./dist/page.server.d.ts"
66
+ "types": "./dist/page.d.ts"
67
67
  },
68
68
  "./provider": {
69
69
  "import": "./dist/provider/index.js",
@@ -121,28 +121,28 @@
121
121
  "react-medium-image-zoom": "^5.4.0",
122
122
  "scroll-into-view-if-needed": "^3.1.0",
123
123
  "tailwind-merge": "^3.3.1",
124
- "fumadocs-core": "15.8.5"
124
+ "fumadocs-core": "16.0.1"
125
125
  },
126
126
  "devDependencies": {
127
- "@next/eslint-plugin-next": "^15.5.4",
128
- "@tailwindcss/cli": "^4.1.14",
127
+ "@next/eslint-plugin-next": "16.0.0",
128
+ "@tailwindcss/cli": "^4.1.15",
129
129
  "@types/lodash.merge": "^4.6.9",
130
- "@types/react": "^19.2.0",
131
- "@types/react-dom": "^19.2.0",
132
- "next": "15.5.4",
133
- "tailwindcss": "^4.1.14",
130
+ "@types/react": "^19.2.2",
131
+ "@types/react-dom": "^19.2.2",
132
+ "next": "16.0.0",
133
+ "tailwindcss": "^4.1.15",
134
134
  "tsc-alias": "^1.8.16",
135
+ "@fumadocs/cli": "1.0.3",
135
136
  "eslint-config-custom": "0.0.0",
136
- "tsconfig": "0.0.0",
137
- "fumadocs-core": "15.8.5",
138
- "@fumadocs/cli": "1.0.2"
137
+ "fumadocs-core": "16.0.1",
138
+ "tsconfig": "0.0.0"
139
139
  },
140
140
  "peerDependencies": {
141
141
  "@types/react": "*",
142
- "next": "14.x.x || 15.x.x",
143
- "react": "18.x.x || 19.x.x",
144
- "react-dom": "18.x.x || 19.x.x",
145
- "tailwindcss": "^3.4.14 || ^4.0.0"
142
+ "next": "16.x.x",
143
+ "react": "^19.2.0",
144
+ "react-dom": "^19.2.0",
145
+ "tailwindcss": "^4.0.0"
146
146
  },
147
147
  "peerDependenciesMeta": {
148
148
  "next": {
@@ -1,11 +0,0 @@
1
- import type { I18nProviderProps } from '../provider/base.js';
2
- /**
3
- * @deprecated legacy I18n Provider, use `<RootProvider i18n={...} />` instead
4
- */
5
- export declare function I18nProvider({ locales, locale, onChange: _onChange, onLocaleChange, ...props }: I18nProviderProps & {
6
- /**
7
- * @deprecated use `onLocaleChange` instead
8
- */
9
- onChange?: I18nProviderProps['onLocaleChange'];
10
- }): import("react/jsx-runtime").JSX.Element;
11
- //# sourceMappingURL=legacy-i18n.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacy-i18n.d.ts","sourceRoot":"","sources":["../../src/contexts/legacy-i18n.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAKzD;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAC3B,OAAY,EACZ,MAAM,EACN,QAAQ,EAAE,SAAS,EACnB,cAA0B,EAC1B,GAAG,KAAK,EACT,EAAE,iBAAiB,GAAG;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;CAChD,2CAuCA"}
@@ -1,36 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import { usePathname, useRouter } from 'fumadocs-core/framework';
4
- import { useMemo, useRef } from 'react';
5
- import { defaultTranslations, I18nContext } from '../contexts/i18n.js';
6
- /**
7
- * @deprecated legacy I18n Provider, use `<RootProvider i18n={...} />` instead
8
- */
9
- export function I18nProvider({ locales = [], locale, onChange: _onChange, onLocaleChange = _onChange, ...props }) {
10
- const router = useRouter();
11
- const pathname = usePathname();
12
- const onChange = onLocaleChange ??
13
- ((value) => {
14
- const segments = pathname.split('/').filter((v) => v.length > 0);
15
- // If locale prefix hidden
16
- if (segments[0] !== locale) {
17
- segments.unshift(value);
18
- }
19
- else {
20
- segments[0] = value;
21
- }
22
- router.push(`/${segments.join('/')}`);
23
- router.refresh();
24
- });
25
- const onChangeRef = useRef(onChange);
26
- onChangeRef.current = onChange;
27
- return (_jsx(I18nContext.Provider, { value: useMemo(() => ({
28
- locale,
29
- locales,
30
- text: {
31
- ...defaultTranslations,
32
- ...props.translations,
33
- },
34
- onChange: (v) => onChangeRef.current(v),
35
- }), [locale, locales, props.translations]), children: props.children }));
36
- }
@@ -1,13 +0,0 @@
1
- import type { HTMLAttributes } from 'react';
2
- import type { LoaderConfig, LoaderOutput, Page } from 'fumadocs-core/source';
3
- import { type Root } from 'fumadocs-core/page-tree';
4
- /**
5
- * @deprecated use https://fumadocs.dev/docs/ui/markdown#further-reading-section instead
6
- */
7
- export declare function DocsCategory({ page, from, tree: forcedTree, ...props }: HTMLAttributes<HTMLDivElement> & {
8
- page: Page;
9
- from: LoaderOutput<LoaderConfig>;
10
- tree?: Root;
11
- }): import("react/jsx-runtime").JSX.Element | null;
12
- export * from './page.js';
13
- //# sourceMappingURL=page.server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page.server.d.ts","sourceRoot":"","sources":["../src/page.server.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAoB,KAAK,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAItE;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EACJ,IAAI,EAAE,UAAU,EAChB,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG;IAClC,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,kDA+CA;AAED,cAAc,QAAQ,CAAC"}
@@ -1,37 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { getPageTreePeers } from 'fumadocs-core/page-tree';
3
- import { Card, Cards } from './components/card.js';
4
- import * as path from 'node:path';
5
- /**
6
- * @deprecated use https://fumadocs.dev/docs/ui/markdown#further-reading-section instead
7
- */
8
- export function DocsCategory({ page, from, tree: forcedTree, ...props }) {
9
- let tree;
10
- if (forcedTree) {
11
- tree = forcedTree;
12
- }
13
- else if (from._i18n) {
14
- const locale = page.locale ?? from._i18n.defaultLanguage;
15
- tree = from.pageTree[locale];
16
- }
17
- else {
18
- tree = from.pageTree;
19
- }
20
- let items = getPageTreePeers(tree, page.url);
21
- if (items.length === 0) {
22
- const pages = from.getPages(page.locale);
23
- items = pages
24
- .filter((item) => path.dirname(item.path) === path.dirname(page.path) &&
25
- item.path !== page.path)
26
- .map((page) => ({
27
- type: 'page',
28
- name: page.data.title,
29
- description: page.data.description,
30
- url: page.url,
31
- }));
32
- }
33
- if (items.length === 0)
34
- return null;
35
- return (_jsx(Cards, { ...props, children: items.map((item) => (_jsx(Card, { title: item.name, description: item.description, href: item.url }, item.url))) }));
36
- }
37
- export * from './page.js';