fumadocs-ui 15.3.3 → 15.4.0

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 (40) hide show
  1. package/css/preset.css +19 -0
  2. package/css/vitepress.css +1 -4
  3. package/dist/components/dialog/search-algolia.d.ts +2 -3
  4. package/dist/components/dialog/search-algolia.d.ts.map +1 -1
  5. package/dist/components/dialog/search-algolia.js +1 -2
  6. package/dist/components/dialog/search.d.ts.map +1 -1
  7. package/dist/components/dialog/search.js +0 -3
  8. package/dist/components/dynamic-codeblock.d.ts.map +1 -1
  9. package/dist/components/dynamic-codeblock.js +17 -10
  10. package/dist/components/layout/root-toggle.js +1 -1
  11. package/dist/components/layout/search-toggle.d.ts.map +1 -1
  12. package/dist/components/layout/search-toggle.js +4 -4
  13. package/dist/components/layout/sidebar.d.ts.map +1 -1
  14. package/dist/components/layout/sidebar.js +21 -18
  15. package/dist/components/tabs.d.ts.map +1 -1
  16. package/dist/components/tabs.js +1 -1
  17. package/dist/components/ui/hide-if-empty.d.ts.map +1 -1
  18. package/dist/components/ui/hide-if-empty.js +7 -20
  19. package/dist/components/ui/navigation-menu.js +2 -2
  20. package/dist/layouts/docs-client.js +5 -5
  21. package/dist/layouts/docs.d.ts +0 -1
  22. package/dist/layouts/docs.d.ts.map +1 -1
  23. package/dist/layouts/docs.js +5 -6
  24. package/dist/layouts/home/menu.d.ts.map +1 -1
  25. package/dist/layouts/home/menu.js +2 -5
  26. package/dist/layouts/home/navbar.js +1 -1
  27. package/dist/layouts/home.d.ts.map +1 -1
  28. package/dist/layouts/home.js +6 -1
  29. package/dist/layouts/notebook-client.d.ts +1 -1
  30. package/dist/layouts/notebook-client.d.ts.map +1 -1
  31. package/dist/layouts/notebook-client.js +6 -5
  32. package/dist/layouts/notebook.d.ts.map +1 -1
  33. package/dist/layouts/notebook.js +10 -10
  34. package/dist/mdx.server.d.ts.map +1 -1
  35. package/dist/mdx.server.js +4 -1
  36. package/dist/page-client.d.ts +4 -4
  37. package/dist/page-client.d.ts.map +1 -1
  38. package/dist/page-client.js +1 -1
  39. package/dist/style.css +93 -57
  40. package/package.json +13 -13
package/css/preset.css CHANGED
@@ -40,6 +40,9 @@
40
40
  --animate-fd-enterFromLeft: fd-enterFromLeft 250ms ease;
41
41
  --animate-fd-enterFromRight: fd-enterFromRight 250ms ease;
42
42
 
43
+ --animate-fd-sidebar-in: fd-sidebar-in 250ms ease;
44
+ --animate-fd-sidebar-out: fd-sidebar-out 250ms ease;
45
+
43
46
  --animate-fd-exitToLeft: fd-exitToLeft 250ms ease;
44
47
  --animate-fd-exitToRight: fd-exitToRight 250ms ease;
45
48
 
@@ -187,6 +190,18 @@
187
190
  }
188
191
  }
189
192
 
193
+ @keyframes fd-sidebar-in {
194
+ from {
195
+ transform: translateX(-100%);
196
+ }
197
+ }
198
+
199
+ @keyframes fd-sidebar-out {
200
+ to {
201
+ transform: translateX(-100%);
202
+ }
203
+ }
204
+
190
205
  @keyframes fd-nav-menu-in {
191
206
  from {
192
207
  opacity: 0;
@@ -243,6 +258,10 @@
243
258
  &::-webkit-scrollbar-track {
244
259
  background: transparent;
245
260
  }
261
+
262
+ &::-webkit-scrollbar-corner {
263
+ display: none;
264
+ }
246
265
  }
247
266
 
248
267
  @utility fd-steps {
package/css/vitepress.css CHANGED
@@ -63,16 +63,13 @@
63
63
 
64
64
  #nd-sidebar {
65
65
  background-color: hsl(240, 6%, 97%);
66
+ border-color: transparent;
66
67
  }
67
68
 
68
69
  .dark #nd-sidebar {
69
70
  background-color: hsl(240, 4%, 9%);
70
71
  }
71
72
 
72
- #nd-sidebar > div {
73
- border-color: transparent;
74
- }
75
-
76
73
  button[data-search-full] {
77
74
  background-color: var(--color-fd-background);
78
75
  }
@@ -2,8 +2,7 @@ import { type AlgoliaOptions } from 'fumadocs-core/search/client';
2
2
  import { type ReactNode } from 'react';
3
3
  import { type SharedProps, type TagItem } from './search.js';
4
4
  export interface AlgoliaSearchDialogProps extends SharedProps {
5
- index: AlgoliaOptions['index'];
6
- searchOptions?: Omit<AlgoliaOptions, 'index'>;
5
+ searchOptions: AlgoliaOptions;
7
6
  footer?: ReactNode;
8
7
  defaultTag?: string;
9
8
  tags?: TagItem[];
@@ -20,5 +19,5 @@ export interface AlgoliaSearchDialogProps extends SharedProps {
20
19
  */
21
20
  allowClear?: boolean;
22
21
  }
23
- export default function AlgoliaSearchDialog({ index, searchOptions, tags, defaultTag, showAlgolia, allowClear, ...props }: AlgoliaSearchDialogProps): ReactNode;
22
+ export default function AlgoliaSearchDialog({ searchOptions, tags, defaultTag, showAlgolia, allowClear, ...props }: AlgoliaSearchDialogProps): ReactNode;
24
23
  //# sourceMappingURL=search-algolia.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-algolia.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/search-algolia.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAEjD,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,OAAO,EAGb,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAC/B,aAAa,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,KAAK,EACL,aAAa,EACb,IAAI,EACJ,UAAU,EACV,WAAmB,EACnB,UAAkB,EAClB,GAAG,KAAK,EACT,EAAE,wBAAwB,GAAG,SAAS,CA0CtC"}
1
+ {"version":3,"file":"search-algolia.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/search-algolia.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAEpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAEjD,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,OAAO,EAGb,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,aAAa,EAAE,cAAc,CAAC;IAE9B,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IAEjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,EAC1C,aAAa,EACb,IAAI,EACJ,UAAU,EACV,WAAmB,EACnB,UAAkB,EAClB,GAAG,KAAK,EACT,EAAE,wBAAwB,GAAG,SAAS,CAyCtC"}
@@ -4,11 +4,10 @@ import { useDocsSearch, } from 'fumadocs-core/search/client';
4
4
  import { useState } from 'react';
5
5
  import { useOnChange } from 'fumadocs-core/utils/use-on-change';
6
6
  import { SearchDialog, TagsList, TagsListItem, } from './search.js';
7
- export default function AlgoliaSearchDialog({ index, searchOptions, tags, defaultTag, showAlgolia = false, allowClear = false, ...props }) {
7
+ export default function AlgoliaSearchDialog({ searchOptions, tags, defaultTag, showAlgolia = false, allowClear = false, ...props }) {
8
8
  const [tag, setTag] = useState(defaultTag);
9
9
  const { search, setSearch, query } = useDocsSearch({
10
10
  type: 'algolia',
11
- index,
12
11
  ...searchOptions,
13
12
  }, undefined, tag);
14
13
  useOnChange(defaultTag, (v) => {
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/search.tsx"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAWf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKzD,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEtD,KAAK,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtC;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,UAAU,iBAAkB,SAAQ,WAAW;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAEvC,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,KAAU,EACV,MAAM,EACN,cAAc,EACd,SAAS,EACT,GAAG,KAAK,EACT,EAAE,iBAAiB,2CA6DnB;AAoJD,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,WAAW,EACX,UAAkB,EAClB,GAAG,KAAK,EACT,EAAE,aAAa,2CAoBf;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,2CAmBA"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/components/dialog/search.tsx"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAKzD,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEtD,KAAK,iBAAiB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtC;;OAEG;IACH,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,UAAU,iBAAkB,SAAQ,WAAW;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC;IAEvC,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,KAAU,EACV,MAAM,EACN,cAAc,EACd,SAAS,EACT,GAAG,KAAK,EACT,EAAE,iBAAiB,2CA6DnB;AAkJD,MAAM,WAAW,aAAc,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC1D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAmBD,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,WAAW,EACX,UAAkB,EAClB,GAAG,KAAK,EACT,EAAE,aAAa,2CAoBf;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf,2CAmBA"}
@@ -4,7 +4,6 @@ import { FileText, Hash, LoaderCircle, Search as SearchIcon, Text, } from '../..
4
4
  import { useCallback, useEffect, useMemo, useState, } from 'react';
5
5
  import { useI18n } from '../../contexts/i18n.js';
6
6
  import { cn } from '../../utils/cn.js';
7
- import { useSidebar } from '../../contexts/sidebar.js';
8
7
  import { buttonVariants } from '../../components/ui/button.js';
9
8
  import { Dialog, DialogContent, DialogOverlay, DialogTitle, } from '@radix-ui/react-dialog';
10
9
  import { cva } from 'class-variance-authority';
@@ -35,14 +34,12 @@ const icons = {
35
34
  function SearchResults({ items, active = items.at(0)?.id, onActiveChange, onSelect, ...props }) {
36
35
  const { text } = useI18n();
37
36
  const router = useRouter();
38
- const sidebar = useSidebar();
39
37
  const onOpen = ({ external, url }) => {
40
38
  if (external)
41
39
  window.open(url, '_blank')?.focus();
42
40
  else
43
41
  router.push(url);
44
42
  onSelect?.(url);
45
- sidebar.setOpen(false);
46
43
  };
47
44
  const onKey = useEffectEvent((e) => {
48
45
  if (e.key === 'ArrowDown' || e.key == 'ArrowUp') {
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-codeblock.d.ts","sourceRoot":"","sources":["../../src/components/dynamic-codeblock.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAcjC,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,IAAI,EACJ,OAAO,GACR,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GAAG,sBAAsB,CAAC;CACzE,6BAUA"}
1
+ {"version":3,"file":"dynamic-codeblock.d.ts","sourceRoot":"","sources":["../../src/components/dynamic-codeblock.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAajC,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,IAAI,EACJ,OAAO,GACR,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GAAG,sBAAsB,CAAC;CACzE,6BA8BA"}
@@ -3,19 +3,26 @@ 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
- const components = {
7
- pre(props) {
8
- return (_jsx(CodeBlock, { ...props, className: cn('my-0', props.className), children: _jsx(Pre, { children: props.children }) }));
9
- },
10
- };
6
+ import { useMemo } from 'react';
7
+ function pre(props) {
8
+ return (_jsx(CodeBlock, { ...props, className: cn('my-0', props.className), children: _jsx(Pre, { children: props.children }) }));
9
+ }
11
10
  export function DynamicCodeBlock({ lang, code, options, }) {
11
+ const components = {
12
+ pre,
13
+ ...options?.components,
14
+ };
15
+ const loading = useMemo(() => {
16
+ const Pre = (components.pre ?? 'pre');
17
+ const Code = (components.code ?? 'code');
18
+ return (_jsx(Pre, { children: _jsx(Code, { children: code.split('\n').map((line, i) => (_jsx("span", { className: "line", children: line }, i))) }) }));
19
+ // eslint-disable-next-line -- initial value only
20
+ }, []);
12
21
  return useShiki(code, {
13
22
  lang,
14
- ...options,
15
- components: {
16
- ...components,
17
- ...options?.components,
18
- },
23
+ loading,
19
24
  withPrerenderScript: true,
25
+ ...options,
26
+ components,
20
27
  });
21
28
  }
@@ -22,7 +22,7 @@ export function RootToggle({ options, placeholder, ...props }) {
22
22
  setOpen(false);
23
23
  };
24
24
  const item = selected ? _jsx(Item, { ...selected }) : placeholder;
25
- return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [item ? (_jsxs(PopoverTrigger, { ...props, className: cn('flex items-center gap-2.5 rounded-lg pe-2 hover:text-fd-accent-foreground', props.className), children: [item, _jsx(ChevronsUpDown, { className: "size-4 text-fd-muted-foreground" })] })) : null, _jsx(PopoverContent, { className: "w-(--radix-popover-trigger-width) overflow-hidden p-0", children: options.map((item) => (_jsx(Link, { href: item.url, onClick: onClick, ...item.props, className: cn('flex w-full flex-row items-center gap-2 px-2 py-1.5', selected === item
25
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [item ? (_jsxs(PopoverTrigger, { ...props, className: cn('flex items-center gap-2 rounded-lg pe-2 hover:text-fd-accent-foreground', props.className), children: [item, _jsx(ChevronsUpDown, { className: "size-4 text-fd-muted-foreground" })] })) : null, _jsx(PopoverContent, { className: "w-(--radix-popover-trigger-width) overflow-hidden p-0", children: options.map((item) => (_jsx(Link, { href: item.url, onClick: onClick, ...item.props, className: cn('flex w-full flex-row items-center gap-2 px-2 py-1.5', selected === item
26
26
  ? 'bg-fd-accent text-fd-accent-foreground'
27
27
  : 'hover:bg-fd-accent/50', item.props?.className), children: _jsx(Item, { ...item }) }, item.url))) })] }));
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search-toggle.d.ts","sourceRoot":"","sources":["../../../src/components/layout/search-toggle.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAK5C,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAE1E,UAAU,iBACR,SAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,EAC7C,WAAW;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,EAC3B,cAAc,EACd,IAAa,EACb,KAAe,EACf,GAAG,KAAK,EACT,EAAE,iBAAiB,kDAuBnB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,kDA6BA"}
1
+ {"version":3,"file":"search-toggle.d.ts","sourceRoot":"","sources":["../../../src/components/layout/search-toggle.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAK5C,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAE1E,UAAU,iBACR,SAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,EAC7C,WAAW;IACb,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,YAAY,CAAC,EAC3B,cAAc,EACd,IAAgB,EAChB,KAAe,EACf,GAAG,KAAK,EACT,EAAE,iBAAiB,kDAuBnB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,cAAc,EACd,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,kDA6BA"}
@@ -5,7 +5,7 @@ import { useSearchContext } from '../../contexts/search.js';
5
5
  import { useI18n } from '../../contexts/i18n.js';
6
6
  import { cn } from '../../utils/cn.js';
7
7
  import { buttonVariants } from '../../components/ui/button.js';
8
- export function SearchToggle({ hideIfDisabled, size = 'icon', color = 'ghost', ...props }) {
8
+ export function SearchToggle({ hideIfDisabled, size = 'icon-sm', color = 'ghost', ...props }) {
9
9
  const { setOpenSearch, enabled } = useSearchContext();
10
10
  if (hideIfDisabled && !enabled)
11
11
  return null;
@@ -14,14 +14,14 @@ export function SearchToggle({ hideIfDisabled, size = 'icon', color = 'ghost', .
14
14
  color,
15
15
  }), props.className), "data-search": "", "aria-label": "Open Search", onClick: () => {
16
16
  setOpenSearch(true);
17
- }, children: _jsx(Search, { className: "p-px" }) }));
17
+ }, children: _jsx(Search, {}) }));
18
18
  }
19
19
  export function LargeSearchToggle({ hideIfDisabled, ...props }) {
20
20
  const { enabled, hotKey, setOpenSearch } = useSearchContext();
21
21
  const { text } = useI18n();
22
22
  if (hideIfDisabled && !enabled)
23
23
  return null;
24
- return (_jsxs("button", { type: "button", "data-search-full": "", ...props, className: cn('inline-flex items-center gap-2 rounded-full border bg-fd-secondary/50 p-1.5 text-sm text-fd-muted-foreground transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground', props.className), onClick: () => {
24
+ return (_jsxs("button", { type: "button", "data-search-full": "", ...props, className: cn('inline-flex items-center gap-2 rounded-lg border bg-fd-secondary/50 p-1.5 ps-2 text-sm text-fd-muted-foreground transition-colors hover:bg-fd-accent hover:text-fd-accent-foreground', props.className), onClick: () => {
25
25
  setOpenSearch(true);
26
- }, children: [_jsx(Search, { className: "ms-1 size-4" }), text.search, _jsx("div", { className: "ms-auto inline-flex gap-0.5", children: hotKey.map((k, i) => (_jsx("kbd", { className: "rounded-md border bg-fd-background px-1.5", children: k.display }, i))) })] }));
26
+ }, children: [_jsx(Search, { className: "size-4" }), text.search, _jsx("div", { className: "ms-auto inline-flex gap-0.5", children: hotKey.map((k, i) => (_jsx("kbd", { className: "rounded-md border bg-fd-background px-1.5", children: k.display }, i))) })] }));
27
27
  }
@@ -1 +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,EAGP,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,2CAkHd;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,2CAarD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,2CAkB1D;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,SAAS,GAAG;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,2CAsBA;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,2CAqBzB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,2CAsCjD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,uBAAuB,2CAqBlE;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;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,2CAgHd;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,2CAcrD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,GAAG,CAAC,2CAkB1D;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,SAAS,GAAG;IACb,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB,2CAsBA;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,2CAqBzB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,2CAsCjD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,uBAAuB,2CAqBlE;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,5 +1,5 @@
1
1
  'use client';
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { ChevronDown, ExternalLink } from '../../icons.js';
4
4
  import { usePathname } from 'fumadocs-core/framework';
5
5
  import { createContext, Fragment, useContext, useMemo, useRef, useState, } from 'react';
@@ -45,18 +45,21 @@ export function Sidebar({ defaultOpenLevel = 0, prefetch = true, collapsible = t
45
45
  });
46
46
  if (isMobile) {
47
47
  const state = open ? 'open' : 'closed';
48
- return (_jsxs(_Fragment, { children: [_jsx(Presence, { present: open, children: _jsx("div", { "data-state": state, className: "fixed z-40 inset-0 bg-black/30 backdrop-blur-sm data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out", onClick: () => setOpen(false) }) }), _jsx(Presence, { present: open, children: ({ present }) => (_jsx(RemoveScroll, { as: "aside", enabled: present, id: "nd-sidebar-mobile", ...props, "data-state": state, className: cn('fixed text-[15px] flex flex-col py-3 rounded-e-xl border-e start-0 inset-y-0 w-[85%] max-w-[380px] z-40 bg-fd-background data-[state=open]:animate-fd-enterFromLeft data-[state=closed]:animate-fd-exitToLeft', !present && 'invisible', props.className), children: _jsx(Context.Provider, { value: context, children: props.children }) })) })] }));
48
+ return (_jsxs(Context.Provider, { value: context, children: [_jsx(Presence, { present: open, children: _jsx("div", { "data-state": state, className: "fixed z-40 inset-0 bg-black/30 backdrop-blur-sm data-[state=open]:animate-fd-fade-in data-[state=closed]:animate-fd-fade-out", onClick: () => setOpen(false) }) }), _jsx(Presence, { present: open, children: ({ present }) => (_jsx(RemoveScroll, { as: "aside", enabled: present, id: "nd-sidebar-mobile", ...props, "data-state": state, className: cn('fixed text-[15px] flex flex-col py-2 rounded-e-2xl border-e start-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: props.children })) })] }));
49
49
  }
50
- return (_jsx("aside", { id: "nd-sidebar", ...props, "data-collapsed": collapsed, className: cn('sticky top-(--fd-sidebar-top) z-20 bg-fd-card text-sm h-(--fd-sidebar-height) max-md:hidden', collapsible && [
51
- 'transition-all',
52
- collapsed &&
53
- '-me-(--fd-sidebar-width) -translate-x-(--fd-sidebar-offset) rtl:translate-x-(--fd-sidebar-offset)',
54
- collapsed && hover && 'z-50 translate-x-0',
55
- collapsed && !hover && 'opacity-0',
50
+ return (_jsx("aside", { id: "nd-sidebar", ...props, "data-collapsed": collapsed, className: cn('sticky shrink-0 flex flex-col items-end top-(--fd-sidebar-top) z-20 bg-fd-card text-sm h-(--fd-sidebar-height) w-(--fd-sidebar-width) *:w-(--fd-sidebar-width) border-e max-md:hidden', collapsed && [
51
+ 'rounded-xl border',
52
+ hover
53
+ ? 'z-50 translate-x-2 shadow-lg'
54
+ : 'opacity-0 -translate-x-(--fd-sidebar-offset) rtl:translate-x-(--fd-sidebar-offset)',
56
55
  ], props.className), style: {
57
- '--fd-sidebar-offset': 'calc(var(--fd-sidebar-width) - 6px)',
58
- '--fd-sidebar-top': 'calc(var(--fd-banner-height) + var(--fd-nav-height))',
59
- '--fd-sidebar-height': 'calc(100dvh - var(--fd-banner-height) - var(--fd-nav-height))',
56
+ transition: ['top', 'opacity', 'margin', 'translate', 'width']
57
+ .map((v) => `${v} ease 200ms`)
58
+ .join(', '),
59
+ '--fd-sidebar-offset': 'calc(100% - 16px)',
60
+ '--fd-sidebar-margin': collapsed ? '0.5rem' : '0px',
61
+ '--fd-sidebar-top': `calc(var(--fd-banner-height) + var(--fd-nav-height) + var(--fd-sidebar-margin))`,
62
+ '--fd-sidebar-height': 'calc(100dvh - var(--fd-sidebar-top) - var(--fd-sidebar-margin))',
60
63
  ...props.style,
61
64
  }, onPointerEnter: (e) => {
62
65
  if (!collapsible ||
@@ -76,22 +79,22 @@ export function Sidebar({ defaultOpenLevel = 0, prefetch = true, collapsible = t
76
79
  }, Math.min(e.clientX, document.body.clientWidth - e.clientX) > 100
77
80
  ? 0
78
81
  : 500);
79
- }, children: _jsx("div", { className: "flex w-(--fd-sidebar-width) h-full max-w-full flex-col pt-1.5 ms-auto border-e", children: _jsx(Context.Provider, { value: context, children: props.children }) }) }));
82
+ }, children: _jsx(Context.Provider, { value: context, children: props.children }) }));
80
83
  }
81
84
  export function SidebarHeader(props) {
82
- return (_jsx("div", { ...props, className: cn('flex flex-col gap-3 px-4 py-2', props.className), children: props.children }));
85
+ return (_jsx("div", { ...props, className: cn('flex flex-col gap-3 p-4 pb-2', props.className), children: props.children }));
83
86
  }
84
87
  export function SidebarFooter(props) {
85
88
  return (_jsx("div", { ...props, className: cn('flex flex-col border-t px-4 py-3', props.className), children: props.children }));
86
89
  }
87
90
  export function SidebarViewport(props) {
88
91
  return (_jsx(ScrollArea, { ...props, className: cn('h-full', props.className), children: _jsx(ScrollViewport, { className: "p-4", style: {
89
- maskImage: 'linear-gradient(to bottom, transparent, white 12px)',
92
+ maskImage: 'linear-gradient(to bottom, transparent, white 12px, white calc(100% - 12px), transparent)',
90
93
  }, children: props.children }) }));
91
94
  }
92
95
  export function SidebarSeparator(props) {
93
96
  const { level } = useInternalContext();
94
- return (_jsx("p", { ...props, className: cn('inline-flex items-center gap-2 mb-2 px-2 font-medium empty:mb-0 [&_svg]:size-4 [&_svg]:shrink-0', props.className), style: {
97
+ return (_jsx("p", { ...props, className: cn('inline-flex items-center gap-2 mb-1.5 px-2 font-medium empty:mb-0 [&_svg]:size-4 [&_svg]:shrink-0', props.className), style: {
95
98
  paddingInlineStart: getOffset(level),
96
99
  ...props.style,
97
100
  }, children: props.children }));
@@ -145,7 +148,7 @@ export function SidebarFolderContent(props) {
145
148
  return (_jsx(CollapsibleContent, { ...props, className: cn('relative', props.className), children: _jsxs(Context.Provider, { value: useMemo(() => ({
146
149
  ...ctx,
147
150
  level: ctx.level + 1,
148
- }), [ctx]), children: [ctx.level === 1 && (_jsx("div", { className: "absolute w-px inset-y-0 bg-fd-border start-3" })), props.children] }) }));
151
+ }), [ctx]), children: [ctx.level === 1 && (_jsx("div", { className: "absolute w-px inset-y-1 bg-fd-border start-2.5" })), props.children] }) }));
149
152
  }
150
153
  export function SidebarCollapseTrigger(props) {
151
154
  const { collapsed, setCollapsed } = useSidebar();
@@ -199,10 +202,10 @@ function PageTreeFolder({ item, ...props }) {
199
202
  return (_jsxs(SidebarFolder, { defaultOpen: (item.defaultOpen ?? defaultOpenLevel >= level) || path.includes(item), children: [item.index ? (_jsxs(SidebarFolderLink, { href: item.index.url, external: item.index.external, ...props, children: [item.icon, item.name] })) : (_jsxs(SidebarFolderTrigger, { ...props, children: [item.icon, item.name] })), _jsx(SidebarFolderContent, { children: props.children })] }));
200
203
  }
201
204
  function getOffset(level) {
202
- return `calc(var(--spacing) * ${level > 1 ? (level - 1) * 3 + 3 : 2})`;
205
+ return `calc(var(--spacing) * ${level > 1 ? level * 3 : 2})`;
203
206
  }
204
207
  function Border({ level, active }) {
205
208
  if (level <= 1)
206
209
  return null;
207
- return (_jsx("div", { className: cn('absolute w-px inset-y-3 z-[2] start-3 md:inset-y-2', active && 'bg-fd-primary') }));
210
+ return (_jsx("div", { className: cn('absolute w-px inset-y-3 z-[2] start-2.5 md:inset-y-2', active && 'bg-fd-primary') }));
208
211
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,IAAI,SAAS,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAuBf,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAcD,eAAO,MAAM,QAAQ,sMAAqB,CAAC;AAC3C,eAAO,MAAM,WAAW,+MAAwB,CAAC;AAEjD,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,KAAK,EACL,OAAe,EACf,KAAK,EACL,YAAgB,EAChB,YAAoB,EACpB,YAAmE,EACnE,GAAG,KAAK,EACT,EAAE,SAAS,2CAmFX;AAED,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG;IACvD;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,QAAQ,2CAgBhD;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,2CAmB3E"}
1
+ {"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/components/tabs.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,IAAI,SAAS,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAuBf,MAAM,WAAW,SAAU,SAAQ,SAAS;IAC1C;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAcD,eAAO,MAAM,QAAQ,sMAAqB,CAAC;AAC3C,eAAO,MAAM,WAAW,+MAAwB,CAAC;AAEjD,wBAAgB,IAAI,CAAC,EACnB,OAAO,EACP,KAAK,EACL,OAAe,EACf,KAAK,EACL,YAAgB,EAChB,YAAoB,EACpB,YAAmE,EACnE,GAAG,KAAK,EACT,EAAE,SAAS,2CAmFX;AAED,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG;IACvD;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,EAAE,QAAQ,2CAgBhD;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,2CAoB3E"}
@@ -91,7 +91,7 @@ export function TabsContent({ value, className, ...props }) {
91
91
  if (props.id) {
92
92
  valueToIdMap.set(value, props.id);
93
93
  }
94
- return (_jsx(Primitive.TabsContent, { value: value, className: cn('prose-no-margin [&>figure:only-child]:-m-4 [&>figure:only-child]:border-none', className), ...props, children: props.children }));
94
+ return (_jsx(Primitive.TabsContent, { value: value, forceMount: true, className: cn('prose-no-margin data-[state=inactive]:hidden [&>figure:only-child]:-m-4 [&>figure:only-child]:border-none', className), ...props, children: props.children }));
95
95
  }
96
96
  /**
97
97
  * Inspired by Headless UI.
@@ -1 +1 @@
1
- {"version":3,"file":"hide-if-empty.d.ts","sourceRoot":"","sources":["../../../src/components/ui/hide-if-empty.tsx"],"names":[],"mappings":"AAoCA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAyCtE"}
1
+ {"version":3,"file":"hide-if-empty.d.ts","sourceRoot":"","sources":["../../../src/components/ui/hide-if-empty.tsx"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAiDtE"}
@@ -2,21 +2,6 @@
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Slot } from '@radix-ui/react-slot';
4
4
  import { useEffect, useId, useRef, useState } from 'react';
5
- const init = `function isEmpty(node) {
6
- for (let i = 0; i < node.childNodes.length; i++) {
7
- const child = node.childNodes.item(i);
8
- if (child.nodeType === Node.TEXT_NODE) {
9
- return false
10
- } else if (
11
- child.nodeType === Node.ELEMENT_NODE &&
12
- window.getComputedStyle(child).display !== 'none'
13
- ) {
14
- return false
15
- }
16
- }
17
-
18
- return true;
19
- }`;
20
5
  function isEmpty(node) {
21
6
  for (let i = 0; i < node.childNodes.length; i++) {
22
7
  const child = node.childNodes.item(i);
@@ -54,11 +39,13 @@ export function HideIfEmpty({ children }) {
54
39
  observer.disconnect();
55
40
  };
56
41
  }, []);
57
- const inject = `
58
- ${init}
59
- const element = document.querySelector('[data-hide-if-empty="${id}"]')
42
+ const inject = `{${isEmpty.toString()}
43
+
44
+ const element = document.querySelector('[data-fdid="${id}"]')
60
45
  if (element) {
61
46
  element.setAttribute('data-empty', String(isEmpty(element)))
62
- }`;
63
- return (_jsxs(_Fragment, { children: [empty === undefined && _jsx("script", { children: `{ ${inject} }` }), _jsx(Slot, { ref: ref, "data-hide-if-empty": id, "data-empty": empty, className: "data-[empty=true]:hidden", children: children })] }));
47
+ }}`;
48
+ return (_jsxs(_Fragment, { children: [_jsx(Slot, { ref: ref, "data-fdid": id, "data-empty": empty, className: "data-[empty=true]:hidden", suppressHydrationWarning: true, children: children }), empty === undefined && (_jsx("script", { suppressHydrationWarning: true, dangerouslySetInnerHTML: {
49
+ __html: inject,
50
+ } }))] }));
64
51
  }
@@ -9,9 +9,9 @@ const NavigationMenuItem = React.forwardRef(({ className, children, ...props },
9
9
  NavigationMenuItem.displayName = Primitive.NavigationMenuItem.displayName;
10
10
  const NavigationMenuTrigger = React.forwardRef(({ className, children, ...props }, ref) => (_jsx(Primitive.Trigger, { ref: ref, className: cn('data-[state=open]:bg-fd-accent/50', className), ...props, children: children })));
11
11
  NavigationMenuTrigger.displayName = Primitive.Trigger.displayName;
12
- const NavigationMenuContent = React.forwardRef(({ className, ...props }, ref) => (_jsx(Primitive.Content, { ref: ref, className: cn('absolute inset-x-0 top-0 data-[motion=from-end]:animate-fd-enterFromRight data-[motion=from-start]:animate-fd-enterFromLeft data-[motion=to-end]:animate-fd-exitToRight data-[motion=to-start]:animate-fd-exitToLeft', className), ...props })));
12
+ const NavigationMenuContent = React.forwardRef(({ className, ...props }, ref) => (_jsx(Primitive.Content, { ref: ref, className: cn('absolute inset-x-0 top-0 overflow-auto fd-scroll-container max-h-[80svh] data-[motion=from-end]:animate-fd-enterFromRight data-[motion=from-start]:animate-fd-enterFromLeft data-[motion=to-end]:animate-fd-exitToRight data-[motion=to-start]:animate-fd-exitToLeft', className), ...props })));
13
13
  NavigationMenuContent.displayName = Primitive.Content.displayName;
14
14
  const NavigationMenuLink = Primitive.Link;
15
- const NavigationMenuViewport = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: "flex w-full justify-center", children: _jsx(Primitive.Viewport, { ...props, className: cn('relative h-(--radix-navigation-menu-viewport-height) max-h-[80svh] w-full origin-[top_center] overflow-auto [scrollbar-width:none] text-fd-popover-foreground transition-[width,height] duration-300 data-[state=closed]:animate-fd-nav-menu-out data-[state=open]:animate-fd-nav-menu-in', className) }) })));
15
+ const NavigationMenuViewport = React.forwardRef(({ className, ...props }, ref) => (_jsx("div", { ref: ref, className: "flex w-full justify-center", children: _jsx(Primitive.Viewport, { ...props, className: cn('relative h-(--radix-navigation-menu-viewport-height) w-full origin-[top_center] overflow-hidden transition-[width,height] duration-300 data-[state=closed]:animate-fd-nav-menu-out data-[state=open]:animate-fd-nav-menu-in', className) }) })));
16
16
  NavigationMenuViewport.displayName = Primitive.Viewport.displayName;
17
17
  export { NavigationMenu, NavigationMenuList, NavigationMenuItem, NavigationMenuContent, NavigationMenuTrigger, NavigationMenuLink, NavigationMenuViewport, };
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Menu, Sidebar as SidebarIcon } from '../icons.js';
3
+ import { Sidebar as SidebarIcon } from '../icons.js';
4
4
  import { cn } from '../utils/cn.js';
5
5
  import { buttonVariants } from '../components/ui/button.js';
6
6
  import { useSidebar } from '../contexts/sidebar.js';
@@ -10,15 +10,15 @@ import { SearchToggle } from '../components/layout/search-toggle.js';
10
10
  export function Navbar(props) {
11
11
  const { open } = useSidebar();
12
12
  const { isTransparent } = useNav();
13
- return (_jsx("header", { id: "nd-subnav", ...props, className: cn('sticky top-(--fd-banner-height) z-30 flex h-14 items-center px-4 border-b transition-colors backdrop-blur-sm md:px-6', (!isTransparent || open) && 'bg-fd-background/80', props.className), children: props.children }));
13
+ return (_jsx("header", { id: "nd-subnav", ...props, className: cn('sticky top-(--fd-banner-height) z-30 flex items-center px-4 border-b transition-colors backdrop-blur-sm', (!isTransparent || open) && 'bg-fd-background/80', props.className), children: props.children }));
14
14
  }
15
15
  export function NavbarSidebarTrigger({ className, ...props }) {
16
16
  const { setOpen } = useSidebar();
17
17
  return (_jsx("button", { ...props, "aria-label": "Open Sidebar", className: cn(buttonVariants({
18
18
  color: 'ghost',
19
- size: 'icon',
19
+ size: 'icon-sm',
20
20
  className,
21
- })), onClick: () => setOpen((prev) => !prev), children: _jsx(Menu, {}) }));
21
+ })), onClick: () => setOpen((prev) => !prev), children: _jsx(SidebarIcon, {}) }));
22
22
  }
23
23
  export function CollapsibleControl() {
24
24
  const { collapsed } = useSidebar();
@@ -30,5 +30,5 @@ export function CollapsibleControl() {
30
30
  color: 'ghost',
31
31
  size: 'icon-sm',
32
32
  className: 'rounded-lg',
33
- })), children: _jsx(SidebarIcon, {}) }), _jsx(SearchToggle, { size: "icon-sm", className: "rounded-lg", hideIfDisabled: true })] }));
33
+ })), children: _jsx(SidebarIcon, {}) }), _jsx(SearchToggle, { className: "rounded-lg", hideIfDisabled: true })] }));
34
34
  }
@@ -26,5 +26,4 @@ export declare function DocsLayoutSidebarFooter({ i18n, themeSwitch, links, }: {
26
26
  themeSwitch?: DocsLayoutProps['themeSwitch'];
27
27
  }): import("react/jsx-runtime").JSX.Element;
28
28
  export { CollapsibleControl, Navbar, NavbarSidebarTrigger, type LinkItemType };
29
- export { getSidebarTabsFromOptions } from './docs/shared.js';
30
29
  //# 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;AAarE,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAClB,MAAM,EACN,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAa/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,OAAY,EACZ,YAAY,EACZ,kBAA0B,EAC1B,WAA8C,EAC9C,IAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,GAAG,SAAS,CAkG7B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,WAAkB,EAClB,UAAU,EACV,GAAG,EACH,KAAU,EACV,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG;IAChC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB,2CAgDA;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAW,EACX,KAAU,GACX,EAAE;IACD,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;CAC9C,2CAgCA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/layouts/docs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAarE,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AAK1D,OAAO,EACL,kBAAkB,EAClB,MAAM,EACN,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAa/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,OAAY,EACZ,YAAY,EACZ,kBAA0B,EAC1B,WAA8C,EAC9C,IAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,GAAG,SAAS,CAoG7B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,WAAkB,EAClB,UAAU,EACV,GAAG,EACH,KAAU,EACV,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,GAAG;IAChC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB,2CAmDA;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,EACJ,WAAW,EACX,KAAU,GACX,EAAE;IACD,IAAI,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC;CAC9C,2CAgCA;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,EAAE,oBAAoB,EAAE,KAAK,YAAY,EAAE,CAAC"}
@@ -21,22 +21,22 @@ export function DocsLayout({ nav: { transparentMode, ...nav } = {}, sidebar = {}
21
21
  const tabs = useMemo(() => getSidebarTabsFromOptions(sidebar.tabs, props.tree) ?? [], [sidebar.tabs, props.tree]);
22
22
  const links = getLinks(props.links ?? [], props.githubUrl);
23
23
  const variables = cn('[--fd-tocnav-height:36px] md:[--fd-sidebar-width:268px] lg:[--fd-sidebar-width:286px] xl:[--fd-toc-width:286px] xl:[--fd-tocnav-height:0px]', !nav.component && nav.enabled !== false
24
- ? '[--fd-nav-height:calc(var(--spacing)*14)] md:[--fd-nav-height:0px]'
24
+ ? '[--fd-nav-height:56px] md:[--fd-nav-height:0px]'
25
25
  : undefined);
26
26
  const pageStyles = {
27
27
  tocNav: cn('xl:hidden'),
28
28
  toc: cn('max-xl:hidden'),
29
29
  };
30
- return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsxs(NavProvider, { transparentMode: transparentMode, children: [slot(nav, _jsxs(Navbar, { className: "md:hidden", children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-semibold", children: nav.title }), _jsx("div", { className: "flex flex-1 flex-row items-center gap-1", children: nav.children }), slots('sm', searchToggle, _jsx(SearchToggle, { hideIfDisabled: true })), _jsx(NavbarSidebarTrigger, { className: "-me-2 md:hidden" })] })), _jsxs("main", { id: "nd-docs-layout", ...props.containerProps, className: cn('flex flex-1 flex-row pe-(--fd-layout-offset)', variables, props.containerProps?.className), style: {
30
+ return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsxs(NavProvider, { transparentMode: transparentMode, children: [slot(nav, _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 }), slots('sm', searchToggle, _jsx(SearchToggle, { className: "p-2", hideIfDisabled: true })), _jsx(NavbarSidebarTrigger, { className: "p-2 -me-1.5 md:hidden" })] })), _jsxs("main", { id: "nd-docs-layout", ...props.containerProps, className: cn('flex flex-1 flex-row pe-(--fd-layout-offset)', variables, props.containerProps?.className), style: {
31
31
  ...layoutVariables,
32
32
  ...props.containerProps?.style,
33
- }, children: [slot(sidebar, _jsx(DocsLayoutSidebar, { ...omit(sidebar, 'enabled', 'component', 'tabs'), links: links, nav: _jsxs(_Fragment, { children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex text-[15px] items-center gap-2.5 font-medium", children: nav.title }), nav.children] }), banner: _jsxs(_Fragment, { children: [tabs.length > 0 ? _jsx(RootToggle, { options: tabs }) : null, slots('lg', searchToggle, _jsx(LargeSearchToggle, { hideIfDisabled: true, className: "rounded-lg max-md:hidden" })), sidebar.banner] }), footer: _jsxs(_Fragment, { children: [_jsx(DocsLayoutSidebarFooter, { links: links.filter((item) => item.type === 'icon'), i18n: i18n, themeSwitch: themeSwitch }), sidebar.footer] }) })), _jsx(StylesProvider, { ...pageStyles, children: children })] })] }) }));
33
+ }, children: [slot(sidebar, _jsx(DocsLayoutSidebar, { ...omit(sidebar, 'enabled', 'component', 'tabs'), links: links, nav: _jsxs(_Fragment, { children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex text-[15px] items-center gap-2.5 font-medium", children: nav.title }), nav.children] }), banner: _jsxs(_Fragment, { children: [tabs.length > 0 ? _jsx(RootToggle, { options: tabs }) : null, slots('lg', searchToggle, _jsx(LargeSearchToggle, { hideIfDisabled: true, className: "max-md:hidden" })), sidebar.banner] }), footer: _jsxs(_Fragment, { children: [_jsx(DocsLayoutSidebarFooter, { links: links.filter((item) => item.type === 'icon'), i18n: i18n, themeSwitch: themeSwitch }), sidebar.footer] }) })), _jsx(StylesProvider, { ...pageStyles, children: children })] })] }) }));
34
34
  }
35
35
  export function DocsLayoutSidebar({ collapsible = true, components, nav, links = [], footer, banner, ...props }) {
36
- return (_jsxs(_Fragment, { children: [collapsible ? _jsx(CollapsibleControl, {}) : null, _jsxs(Sidebar, { ...props, collapsible: collapsible, className: cn('md:ps-(--fd-layout-offset)', props.className), children: [_jsx(HideIfEmpty, { children: _jsxs(SidebarHeader, { children: [_jsxs("div", { className: "flex py-1.5 max-md:hidden", children: [nav, collapsible && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
36
+ return (_jsxs(_Fragment, { children: [collapsible ? _jsx(CollapsibleControl, {}) : null, _jsxs(Sidebar, { ...props, collapsible: collapsible, className: cn('data-[collapsed=false]:w-[calc(var(--fd-sidebar-width)+var(--fd-layout-offset))] data-[collapsed=true]:me-[calc(var(--fd-layout-offset)-var(--fd-sidebar-width))]', props.className), children: [_jsx(HideIfEmpty, { children: _jsxs(SidebarHeader, { children: [_jsxs("div", { className: "flex max-md:hidden", children: [nav, collapsible && (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
37
37
  color: 'ghost',
38
38
  size: 'icon-sm',
39
- }), 'ms-auto mb-auto -my-1.5 text-fd-muted-foreground max-md:hidden'), children: _jsx(SidebarIcon, {}) }))] }), banner] }) }), _jsxs(SidebarViewport, { children: [links
39
+ }), 'ms-auto mb-auto text-fd-muted-foreground max-md:hidden'), children: _jsx(SidebarIcon, {}) }))] }), banner] }) }), _jsxs(SidebarViewport, { children: [links
40
40
  .filter((v) => v.type !== 'icon')
41
41
  .map((item, i, list) => (_jsx(SidebarLinkItem, { item: item, className: cn(i === list.length - 1 && 'mb-4') }, i))), _jsx(SidebarPageTree, { components: components })] }), _jsx(HideIfEmpty, { children: _jsx(SidebarFooter, { children: footer }) })] })] }));
42
42
  }
@@ -44,4 +44,3 @@ export function DocsLayoutSidebarFooter({ i18n, themeSwitch, links = [], }) {
44
44
  return (_jsx(HideIfEmpty, { children: _jsxs("div", { className: "flex items-center justify-end", children: [_jsx("div", { className: "flex items-center flex-1 empty:hidden", children: links.map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon', color: 'ghost' }), 'text-fd-muted-foreground md:[&_svg]:size-4.5'), "aria-label": item.label, children: item.icon }, i))) }), i18n ? (_jsxs(LanguageToggle, { className: "me-1.5", children: [_jsx(Languages, { className: "size-4.5" }), _jsx(LanguageToggleText, { className: "md:hidden" })] })) : null, slot(themeSwitch, _jsx(ThemeToggle, { className: "p-0", mode: themeSwitch?.mode }))] }) }));
45
45
  }
46
46
  export { CollapsibleControl, Navbar, NavbarSidebarTrigger };
47
- export { getSidebarTabsFromOptions } from './docs/shared.js';
@@ -1 +1 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../src/layouts/home/menu.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EACL,qBAAqB,EAGrB,qBAAqB,EACtB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAqBtD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,GAAG,KAAK,EACT,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CA6CA;AAED,eAAO,MAAM,IAAI,yNAAqB,CAAC;AAEvC,wBAAgB,WAAW,CAAC,EAC1B,WAAmB,EACnB,GAAG,KAAK,EACT,EAAE,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,GAAG;IAC1D;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,2CAgBA;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,2CAU9D"}
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../src/layouts/home/menu.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EACL,qBAAqB,EAGrB,qBAAqB,EACtB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,OAAO,CAAC;AAqBtD,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,GAAG,KAAK,EACT,EAAE;IACD,IAAI,EAAE,YAAY,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CA6CA;AAED,eAAO,MAAM,IAAI,yNAAqB,CAAC;AAEvC,wBAAgB,WAAW,CAAC,EAC1B,WAAmB,EACnB,GAAG,KAAK,EACT,EAAE,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,GAAG;IAC1D;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,2CASA;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,wBAAwB,CAAC,OAAO,qBAAqB,CAAC,2CAU9D"}
@@ -35,11 +35,8 @@ export function MenuLinkItem({ item, ...props }) {
35
35
  }
36
36
  export const Menu = NavigationMenuItem;
37
37
  export function MenuTrigger({ enableHover = false, ...props }) {
38
- return (_jsx(NavigationMenuTrigger, { ...props, onPointerMove: enableHover ? undefined : (e) => e.preventDefault(), className: cn(buttonVariants({
39
- size: 'icon',
40
- color: 'ghost',
41
- }), props.className), children: props.children }));
38
+ return (_jsx(NavigationMenuTrigger, { ...props, onPointerMove: enableHover ? undefined : (e) => e.preventDefault(), children: props.children }));
42
39
  }
43
40
  export function MenuContent(props) {
44
- return (_jsx(NavigationMenuContent, { ...props, className: cn('flex flex-col px-4 pb-4', props.className), children: props.children }));
41
+ return (_jsx(NavigationMenuContent, { ...props, className: cn('flex flex-col p-4', props.className), children: props.children }));
45
42
  }
@@ -16,7 +16,7 @@ export function Navbar(props) {
16
16
  width: 'calc(100% - var(--fd-padding,0px) - var(--removed-body-scroll-bar-size,0px))',
17
17
  left: 'calc(50% - var(--removed-body-scroll-bar-size,0px) / 2)',
18
18
  ...props.style,
19
- }, children: [_jsx(NavigationMenuList, { className: "flex h-14 w-full items-center px-4 lg:h-12", asChild: true, children: _jsx("nav", { children: props.children }) }), _jsx(NavigationMenuViewport, {})] }) }));
19
+ }, children: [_jsx(NavigationMenuList, { className: "flex h-14 w-full items-center px-4 lg:h-12", asChild: true, children: _jsx("nav", { children: props.children }) }), _jsx(NavigationMenuViewport, { className: "text-fd-popover-foreground" })] }) }));
20
20
  }
21
21
  export const NavbarMenu = NavigationMenuItem;
22
22
  export function NavbarMenuContent(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/layouts/home.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AA6B1D,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,GAAG,CAAC,EAAE,OAAO,CACX,UAAU,GAAG;QACX;;WAEG;QACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CACF,CAAC;CACH;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,eAAe,GAAG,cAAc,CAAC,WAAW,CAAC,2CAmCrD;AAED,wBAAgB,MAAM,CAAC,EACrB,GAAQ,EACR,IAAY,EACZ,KAAK,EACL,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,eAAe,2CA8FjB"}
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../src/layouts/home.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,KAAK,eAAe,EAAY,MAAM,UAAU,CAAC;AA8B1D,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,GAAG,CAAC,EAAE,OAAO,CACX,UAAU,GAAG;QACX;;WAEG;QACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,CACF,CAAC;CACH;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,eAAe,GAAG,cAAc,CAAC,WAAW,CAAC,2CAmCrD;AAED,wBAAgB,MAAM,CAAC,EACrB,GAAQ,EACR,IAAY,EACZ,KAAK,EACL,SAAS,EACT,WAAW,EACX,YAAY,GACb,EAAE,eAAe,2CAoGjB"}
@@ -11,6 +11,7 @@ import { LanguageToggle, LanguageToggleText, } from '../components/layout/langua
11
11
  import { ChevronDown, Languages } from '../icons.js';
12
12
  import Link from 'fumadocs-core/link';
13
13
  import { Menu, MenuContent, MenuLinkItem, MenuTrigger, } from '../layouts/home/menu.js';
14
+ import { buttonVariants } from '../components/ui/button.js';
14
15
  export function HomeLayout(props) {
15
16
  const { nav, links, githubUrl, i18n, disableThemeSwitch = false, themeSwitch = { enabled: !disableThemeSwitch }, searchToggle, ...rest } = props;
16
17
  return (_jsx(NavProvider, { transparentMode: nav?.transparentMode, children: _jsxs("main", { id: "nd-home-layout", ...rest, className: cn('flex flex-1 flex-col pt-14', rest.className), children: [slot(nav, _jsx(Header, { links: links, nav: nav, themeSwitch: themeSwitch, searchToggle: searchToggle, i18n: i18n, githubUrl: githubUrl })), props.children] }) }));
@@ -21,7 +22,11 @@ export function Header({ nav = {}, i18n = false, links, githubUrl, themeSwitch,
21
22
  const menuItems = finalLinks.filter((item) => ['menu', 'all'].includes(item.on ?? 'all'));
22
23
  return (_jsxs(Navbar, { children: [_jsx(Link, { href: nav.url ?? '/', className: "inline-flex items-center gap-2.5 font-semibold", children: nav.title }), nav.children, _jsx("ul", { className: "flex flex-row items-center gap-2 px-6 max-sm:hidden", children: navItems
23
24
  .filter((item) => !isSecondary(item))
24
- .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm" }, i))) }), _jsxs("div", { className: "flex flex-row items-center justify-end gap-1.5 flex-1", children: [slots('sm', searchToggle, _jsx(SearchToggle, { className: "lg:hidden", hideIfDisabled: true })), slots('lg', searchToggle, _jsx(LargeSearchToggle, { className: "w-full max-w-[240px] max-lg:hidden", hideIfDisabled: true })), slot(themeSwitch, _jsx(ThemeToggle, { className: "max-lg:hidden", mode: themeSwitch?.mode })), i18n ? (_jsx(LanguageToggle, { className: "max-lg:hidden", children: _jsx(Languages, { className: "size-5" }) })) : null] }), _jsxs("ul", { className: "flex flex-row items-center", children: [navItems.filter(isSecondary).map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "-me-1.5 max-lg:hidden" }, i))), _jsxs(Menu, { className: "lg:hidden", children: [_jsx(MenuTrigger, { "aria-label": "Toggle Menu", className: "group -me-2", enableHover: nav.enableHoverToOpen, children: _jsx(ChevronDown, { className: "size-3 transition-transform duration-300 group-data-[state=open]:rotate-180" }) }), _jsxs(MenuContent, { className: "sm:flex-row sm:items-center sm:justify-end", children: [menuItems
25
+ .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm" }, i))) }), _jsxs("div", { className: "flex flex-row items-center justify-end gap-1.5 flex-1", children: [slots('sm', searchToggle, _jsx(SearchToggle, { className: "p-2 lg:hidden", hideIfDisabled: true })), slots('lg', searchToggle, _jsx(LargeSearchToggle, { className: "w-full rounded-full ps-2.5 max-w-[240px] max-lg:hidden", hideIfDisabled: true })), slot(themeSwitch, _jsx(ThemeToggle, { className: "max-lg:hidden", mode: themeSwitch?.mode })), i18n ? (_jsx(LanguageToggle, { className: "max-lg:hidden", children: _jsx(Languages, { className: "size-5" }) })) : null] }), _jsxs("ul", { className: "flex flex-row items-center", children: [navItems.filter(isSecondary).map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "-me-1.5 max-lg:hidden" }, i))), _jsxs(Menu, { className: "lg:hidden", children: [_jsx(MenuTrigger, { "aria-label": "Toggle Menu", className: cn(buttonVariants({
26
+ size: 'icon',
27
+ color: 'ghost',
28
+ className: 'group -me-1.5',
29
+ })), enableHover: nav.enableHoverToOpen, children: _jsx(ChevronDown, { className: "!size-5.5 transition-transform duration-300 group-data-[state=open]:rotate-180" }) }), _jsxs(MenuContent, { className: "sm:flex-row sm:items-center sm:justify-end", children: [menuItems
25
30
  .filter((item) => !isSecondary(item))
26
31
  .map((item, i) => (_jsx(MenuLinkItem, { item: item, className: "sm:hidden" }, i))), _jsxs("div", { className: "-ms-1.5 flex flex-row items-center gap-1.5 max-sm:mt-2", children: [menuItems.filter(isSecondary).map((item, i) => (_jsx(MenuLinkItem, { item: item, className: "-me-1.5" }, i))), _jsx("div", { role: "separator", className: "flex-1" }), i18n ? (_jsxs(LanguageToggle, { children: [_jsx(Languages, { className: "size-5" }), _jsx(LanguageToggleText, {}), _jsx(ChevronDown, { className: "size-3 text-fd-muted-foreground" })] })) : null, slot(themeSwitch, _jsx(ThemeToggle, { mode: themeSwitch?.mode }))] })] })] })] })] }));
27
32
  }
@@ -3,7 +3,7 @@ import type { Option } from '../components/layout/root-toggle.js';
3
3
  export declare function Navbar({ mode, ...props }: HTMLAttributes<HTMLElement> & {
4
4
  mode: 'top' | 'auto';
5
5
  }): import("react/jsx-runtime").JSX.Element;
6
- export declare function NavbarSidebarTrigger(props: ButtonHTMLAttributes<HTMLButtonElement>): import("react/jsx-runtime").JSX.Element;
6
+ export declare function NavbarSidebarTrigger({ className, ...props }: ButtonHTMLAttributes<HTMLButtonElement>): import("react/jsx-runtime").JSX.Element;
7
7
  export declare function LayoutTabs(props: HTMLAttributes<HTMLElement>): import("react/jsx-runtime").JSX.Element;
8
8
  export declare function LayoutTab(item: Option): import("react/jsx-runtime").JSX.Element;
9
9
  //# sourceMappingURL=notebook-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notebook-client.d.ts","sourceRoot":"","sources":["../../src/layouts/notebook-client.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAQvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAE9D,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;IAAE,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,2CAoBxD;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,2CAmB/C;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,2CAY5D;AAUD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,2CAkBrC"}
1
+ {"version":3,"file":"notebook-client.d.ts","sourceRoot":"","sources":["../../src/layouts/notebook-client.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAQvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAE9D,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,WAAW,CAAC,GAAG;IAAE,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,2CAoBxD;AAED,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,GAAG,KAAK,EACT,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,2CAkBzC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,2CAY5D;AAUD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,2CAkBrC"}
@@ -4,23 +4,24 @@ import { cn } from '../utils/cn.js';
4
4
  import { useSidebar } from '../contexts/sidebar.js';
5
5
  import { useNav } from '../contexts/layout.js';
6
6
  import { buttonVariants } from '../components/ui/button.js';
7
- import { Menu } from '../icons.js';
7
+ import { Sidebar as SidebarIcon } from '../icons.js';
8
8
  import Link from 'fumadocs-core/link';
9
9
  import { usePathname } from 'fumadocs-core/framework';
10
10
  import { isActive } from '../utils/is-active.js';
11
11
  export function Navbar({ mode, ...props }) {
12
12
  const { open, collapsed } = useSidebar();
13
13
  const { isTransparent } = useNav();
14
- return (_jsx("header", { id: "nd-subnav", ...props, className: cn('fixed inset-x-0 top-(--fd-banner-height) z-10 px-(--fd-layout-offset) backdrop-blur-sm transition-colors', (!isTransparent || open) && 'bg-fd-background/80', mode === 'auto' &&
14
+ return (_jsx("header", { id: "nd-subnav", ...props, className: cn('fixed flex flex-col inset-x-0 top-(--fd-banner-height) z-10 px-(--fd-layout-offset) h-(--fd-nav-height) backdrop-blur-sm transition-colors', (!isTransparent || open) && 'bg-fd-background/80', mode === 'auto' &&
15
15
  !collapsed &&
16
16
  'ps-[calc(var(--fd-layout-offset)+var(--fd-sidebar-width))]', props.className), children: props.children }));
17
17
  }
18
- export function NavbarSidebarTrigger(props) {
18
+ export function NavbarSidebarTrigger({ className, ...props }) {
19
19
  const { setOpen } = useSidebar();
20
20
  return (_jsx("button", { ...props, className: cn(buttonVariants({
21
21
  color: 'ghost',
22
- size: 'icon',
23
- }), props.className), onClick: () => setOpen((prev) => !prev), children: _jsx(Menu, {}) }));
22
+ size: 'icon-sm',
23
+ className,
24
+ })), onClick: () => setOpen((prev) => !prev), children: _jsx(SidebarIcon, {}) }));
24
25
  }
25
26
  export function LayoutTabs(props) {
26
27
  return (_jsx("div", { ...props, className: cn('flex flex-row items-end gap-6 overflow-auto', props.className), children: props.children }));
@@ -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,EAAyB,MAAM,kBAAkB,CAAC;AAqB/E,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAGL,MAAM,EACN,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAc3B,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,2CAmKhD;AAoLD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"notebook.d.ts","sourceRoot":"","sources":["../../src/layouts/notebook.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAW,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,KAAK,eAAe,EAAyB,MAAM,kBAAkB,CAAC;AAqB/E,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAGL,MAAM,EACN,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAc3B,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,2CAiKhD;AAsLD,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC"}
@@ -22,25 +22,23 @@ export function DocsLayout(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
- const variables = cn('[--fd-nav-height:calc(var(--spacing)*14)] [--fd-tocnav-height:36px] md:[--fd-sidebar-width:286px] xl:[--fd-toc-width:286px] xl:[--fd-tocnav-height:0px]', tabs.length > 0 &&
26
- tabMode === 'navbar' &&
27
- 'lg:[--fd-nav-height:calc(var(--spacing)*24)]');
25
+ const variables = cn('[--fd-nav-height:56px] [--fd-tocnav-height:36px] md:[--fd-sidebar-width:286px] md:[--fd-nav-height:64px] xl:[--fd-toc-width:286px] xl:[--fd-tocnav-height:0px]', tabs.length > 0 && tabMode === 'navbar' && 'lg:[--fd-nav-height:104px]');
28
26
  const pageStyles = {
29
27
  tocNav: cn('xl:hidden'),
30
28
  toc: cn('max-xl:hidden'),
31
29
  page: cn('mt-(--fd-nav-height)'),
32
30
  };
33
- const sidebarHeader = navMode === 'auto' && (_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({
31
+ 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({
34
32
  color: 'ghost',
35
33
  size: 'icon-sm',
36
- className: 'mb-auto text-fd-muted-foreground',
34
+ className: 'mt-px mb-auto text-fd-muted-foreground',
37
35
  })), children: _jsx(SidebarIcon, {}) }))] }));
38
36
  return (_jsx(TreeContextProvider, { tree: props.tree, children: _jsx(NavProvider, { transparentMode: transparentMode, children: _jsxs("main", { id: "nd-docs-layout", ...props.containerProps, className: cn('flex w-full flex-1 flex-row pe-(--fd-layout-offset)', variables, props.containerProps?.className), style: {
39
37
  ...layoutVariables,
40
38
  ...props.containerProps?.style,
41
- }, children: [_jsxs(Sidebar, { ...sidebar, className: cn('md:ps-(--fd-layout-offset)', navMode === 'top'
39
+ }, children: [_jsxs(Sidebar, { ...sidebar, className: cn('data-[collapsed=false]:w-[calc(var(--fd-sidebar-width)+var(--fd-layout-offset))] data-[collapsed=true]:me-[calc(var(--fd-layout-offset)-var(--fd-sidebar-width))]', navMode === 'top'
42
40
  ? 'md:bg-transparent'
43
- : 'md:[--fd-nav-height:0px]', sidebar.className), children: [_jsx(HideIfEmpty, { children: _jsxs(SidebarHeader, { children: [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
41
+ : 'md:[--fd-nav-height:0px]', sidebar.className), children: [_jsx(HideIfEmpty, { children: _jsxs(SidebarHeader, { 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
44
42
  .filter((item) => item.type !== 'icon')
45
43
  .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", children: [_jsx("div", { className: "flex items-center flex-1 empty:hidden lg:hidden", children: links
46
44
  .filter((item) => item.type === 'icon')
@@ -54,12 +52,14 @@ function DocsNavbar({ links, tabs, ...props }) {
54
52
  const navMode = props.nav?.mode ?? 'auto';
55
53
  const sidebarCollapsible = props.sidebar?.collapsible ?? true;
56
54
  const nav = (_jsx(Link, { href: props.nav?.url ?? '/', className: cn('inline-flex items-center gap-2.5 font-semibold empty:hidden', navMode === 'auto' && 'md:hidden'), children: props.nav?.title }));
57
- return (_jsxs(Navbar, { mode: navMode, children: [_jsxs("div", { className: cn('flex flex-row border-b px-4 h-14', navMode === 'auto' && 'md:px-6'), children: [_jsxs("div", { className: cn('flex flex-row items-center', navMode === 'top' && 'flex-1 pe-4'), children: [sidebarCollapsible && navMode === 'auto' ? (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
55
+ return (_jsxs(Navbar, { mode: navMode, children: [_jsxs("div", { className: cn('flex border-b px-4 flex-1', navMode === 'auto' && 'md:px-6'), children: [_jsxs("div", { className: cn('flex flex-row items-center', navMode === 'top' && 'flex-1 pe-4'), children: [sidebarCollapsible && navMode === 'auto' ? (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
58
56
  color: 'ghost',
59
57
  size: 'icon-sm',
60
- }), 'text-fd-muted-foreground -ms-1.5 me-2 data-[collapsed=false]:hidden max-md:hidden'), children: _jsx(SidebarIcon, {}) })) : null, nav] }), slots('lg', props.searchToggle, _jsx(LargeSearchToggle, { hideIfDisabled: true, className: cn('w-full my-auto rounded-xl max-md:hidden', navMode === 'top' ? 'max-w-sm px-2' : 'max-w-[240px]') })), _jsxs("div", { className: "flex flex-1 flex-row items-center justify-end", children: [_jsx("div", { className: "flex flex-row items-center gap-6 px-4 empty:hidden max-lg:hidden", children: links
58
+ }), 'text-fd-muted-foreground -ms-1.5 me-2 data-[collapsed=false]:hidden max-md:hidden'), children: _jsx(SidebarIcon, {}) })) : null, nav] }), slots('lg', props.searchToggle, _jsx(LargeSearchToggle, { hideIfDisabled: true, className: cn('w-full my-auto max-md:hidden', navMode === 'top'
59
+ ? 'rounded-xl max-w-sm ps-2.5'
60
+ : 'max-w-[240px]') })), _jsxs("div", { className: "flex flex-1 flex-row items-center justify-end", children: [_jsx("div", { className: "flex flex-row items-center gap-6 px-4 empty:hidden max-lg:hidden", children: links
61
61
  .filter((item) => item.type !== 'icon')
62
- .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground" }, i))) }), props.nav?.children, slots('sm', props.searchToggle, _jsx(SearchToggle, { hideIfDisabled: true, className: "md:hidden" })), _jsx(NavbarSidebarTrigger, { className: "-me-1.5 md:hidden" }), links
62
+ .map((item, i) => (_jsx(NavbarLinkItem, { item: item, className: "text-sm text-fd-muted-foreground transition-colors hover:text-fd-accent-foreground" }, i))) }), props.nav?.children, slots('sm', props.searchToggle, _jsx(SearchToggle, { hideIfDisabled: true, className: "p-2 md:hidden" })), _jsx(NavbarSidebarTrigger, { className: "p-2 -me-1.5 md:hidden" }), links
63
63
  .filter((item) => item.type === 'icon')
64
64
  .map((item, i) => (_jsx(BaseLinkItem, { item: item, className: cn(buttonVariants({ size: 'icon-sm', color: 'ghost' }), 'text-fd-muted-foreground max-lg:hidden'), "aria-label": item.label, children: item.icon }, i))), props.i18n ? (_jsx(LanguageToggle, { className: "max-md:hidden", children: _jsx(Languages, { className: "size-4.5 text-fd-muted-foreground" }) })) : null, slot(props.themeSwitch, _jsx(ThemeToggle, { className: "ms-2 max-md:hidden", mode: props.themeSwitch?.mode ?? 'light-dark-system' })), sidebarCollapsible && navMode === 'top' ? (_jsx(SidebarCollapseTrigger, { className: cn(buttonVariants({
65
65
  color: 'secondary',
@@ -1 +1 @@
1
- {"version":3,"file":"mdx.server.d.ts","sourceRoot":"","sources":["../src/mdx.server.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,oBAAoB,MAAM,OAAO,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,EAClC,IAAI,EAAE,IAAI,EACV,YAAY,GAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAA0B,GAC7D,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAezB;AAED,OAAO,EAAE,oBAAoB,IAAI,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"mdx.server.d.ts","sourceRoot":"","sources":["../src/mdx.server.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,oBAAoB,MAAM,OAAO,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,CAAC,YAAY,CAAC,EAClC,IAAI,EAAE,IAAI,EACV,YAAY,GAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAA0B,GAC7D,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAkBzB;AAED,OAAO,EAAE,oBAAoB,IAAI,OAAO,EAAE,CAAC"}
@@ -11,7 +11,10 @@ export function createRelativeLink(source, page, OverrideLink = defaultMdxCompon
11
11
  return async function RelativeLink({ href, ...props }) {
12
12
  // resolve relative href
13
13
  if (href && href.startsWith('.')) {
14
- const target = source.getPageByHref(href, { dir: page.file.dirname });
14
+ const target = source.getPageByHref(href, {
15
+ dir: page.file.dirname,
16
+ language: page.locale,
17
+ });
15
18
  if (target) {
16
19
  href = target.hash
17
20
  ? `${target.page.url}#${target.hash}`
@@ -1,13 +1,13 @@
1
- import { type ComponentProps, type HTMLAttributes } from 'react';
1
+ import { type ComponentProps } from 'react';
2
2
  import type { PageTree, TOCItemType } from 'fumadocs-core/server';
3
3
  import { type BreadcrumbOptions } from 'fumadocs-core/breadcrumb';
4
4
  export declare function TocPopoverTrigger({ items, ...props }: ComponentProps<'button'> & {
5
5
  items: TOCItemType[];
6
6
  }): import("react/jsx-runtime").JSX.Element;
7
7
  export declare function TocPopoverContent(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
8
- export declare function TocPopover(props: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
9
- export declare function PageBody(props: HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
10
- export declare function PageArticle(props: HTMLAttributes<HTMLElement>): import("react/jsx-runtime").JSX.Element;
8
+ export declare function TocPopover(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
9
+ export declare function PageBody(props: ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
10
+ export declare function PageArticle(props: ComponentProps<'article'>): import("react/jsx-runtime").JSX.Element;
11
11
  export declare function LastUpdate(props: {
12
12
  date: Date;
13
13
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"page-client.d.ts","sourceRoot":"","sources":["../src/page-client.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAEnB,KAAK,cAAc,EAKpB,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,2CAgDrD;AA4DD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAU7D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CAwD/D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,cAAc,CAAC,2CAY7D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,2CAe7D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,2CAc/C;AAED,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC;AAChE,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb,CAAC;CACH;AAyBD,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,2CA+B5C;AA8BD,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,kDAsClD"}
1
+ {"version":3,"file":"page-client.d.ts","sourceRoot":"","sources":["../src/page-client.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAMpB,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EACL,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,GAAG,KAAK,EACT,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAA;CAAE,2CAgDrD;AA4DD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAU7D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAwDtD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAYpD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,2CAe3D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,2CAc/C;AAED,KAAK,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,KAAK,CAAC,CAAC;AAChE,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,IAAI,CAAC;QAChB,IAAI,CAAC,EAAE,IAAI,CAAC;KACb,CAAC;CACH;AAyBD,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,2CA+B5C;AA8BD,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAEhD,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,kDAsClD"}
@@ -21,7 +21,7 @@ export function TocPopoverTrigger({ items, ...props }) {
21
21
  const selected = useMemo(() => items.findIndex((item) => active === item.url.slice(1)), [items, active]);
22
22
  const path = useTreePath().at(-1);
23
23
  const showItem = selected !== -1 && !open;
24
- return (_jsxs(CollapsibleTrigger, { ...props, className: cn('flex flex-row items-center text-sm text-fd-muted-foreground gap-2.5 px-4 py-2.5 text-start focus-visible:outline-none [&_svg]:shrink-0 [&_svg]:size-4 md:px-6', props.className), children: [_jsx(ProgressCircle, { value: (selected + 1) / items.length, max: 1, className: cn(open && 'text-fd-primary') }), _jsxs("span", { className: "grid flex-1 *:my-auto *:row-start-1 *:col-start-1", children: [_jsx("span", { className: cn('truncate transition-all', open && 'text-fd-foreground', showItem && 'opacity-0 -translate-y-full pointer-events-none'), children: path?.name ?? text.toc }), _jsx("span", { className: cn('truncate transition-all', !showItem && 'opacity-0 translate-y-full pointer-events-none'), children: items[selected]?.title })] }), _jsx(ChevronDown, { className: cn('transition-transform', open && 'rotate-180') })] }));
24
+ return (_jsxs(CollapsibleTrigger, { ...props, className: cn('flex flex-row items-center text-sm text-fd-muted-foreground gap-2.5 px-4 py-2.5 text-start focus-visible:outline-none [&_svg]:shrink-0 [&_svg]:size-4 md:px-6', props.className), children: [_jsx(ProgressCircle, { value: (selected + 1) / items.length, max: 1, className: cn(open && 'text-fd-primary') }), _jsxs("span", { className: "grid flex-1 *:my-auto *:row-start-1 *:col-start-1", children: [_jsx("span", { className: cn('truncate transition-all', open && 'text-fd-foreground', showItem && 'opacity-0 -translate-y-full pointer-events-none'), children: path?.name ?? text.toc }), _jsx("span", { className: cn('truncate transition-all', !showItem && 'opacity-0 translate-y-full pointer-events-none'), children: items[selected]?.title })] }), _jsx(ChevronDown, { className: cn('transition-transform mx-0.5', open && 'rotate-180') })] }));
25
25
  }
26
26
  function clamp(input, min, max) {
27
27
  if (input < min)
package/dist/style.css CHANGED
@@ -82,6 +82,8 @@
82
82
  --animate-fd-nav-menu-out: fd-nav-menu-out 200ms ease;
83
83
  --animate-fd-enterFromLeft: fd-enterFromLeft 250ms ease;
84
84
  --animate-fd-enterFromRight: fd-enterFromRight 250ms ease;
85
+ --animate-fd-sidebar-in: fd-sidebar-in 250ms ease;
86
+ --animate-fd-sidebar-out: fd-sidebar-out 250ms ease;
85
87
  --animate-fd-exitToLeft: fd-exitToLeft 250ms ease;
86
88
  --animate-fd-exitToRight: fd-exitToRight 250ms ease;
87
89
  }
@@ -303,14 +305,17 @@
303
305
  .inset-y-0 {
304
306
  inset-block: calc(var(--spacing) * 0);
305
307
  }
308
+ .inset-y-1 {
309
+ inset-block: calc(var(--spacing) * 1);
310
+ }
306
311
  .inset-y-3 {
307
312
  inset-block: calc(var(--spacing) * 3);
308
313
  }
309
314
  .start-0 {
310
315
  inset-inline-start: calc(var(--spacing) * 0);
311
316
  }
312
- .start-3 {
313
- inset-inline-start: calc(var(--spacing) * 3);
317
+ .start-2\.5 {
318
+ inset-inline-start: calc(var(--spacing) * 2.5);
314
319
  }
315
320
  .end-2 {
316
321
  inset-inline-end: calc(var(--spacing) * 2);
@@ -409,12 +414,12 @@
409
414
  .-mx-1 {
410
415
  margin-inline: calc(var(--spacing) * -1);
411
416
  }
417
+ .mx-0\.5 {
418
+ margin-inline: calc(var(--spacing) * 0.5);
419
+ }
412
420
  .\!my-0 {
413
421
  margin-block: calc(var(--spacing) * 0) !important;
414
422
  }
415
- .-my-1\.5 {
416
- margin-block: calc(var(--spacing) * -1.5);
417
- }
418
423
  .my-0 {
419
424
  margin-block: calc(var(--spacing) * 0);
420
425
  }
@@ -430,9 +435,6 @@
430
435
  .-ms-1\.5 {
431
436
  margin-inline-start: calc(var(--spacing) * -1.5);
432
437
  }
433
- .ms-1 {
434
- margin-inline-start: calc(var(--spacing) * 1);
435
- }
436
438
  .ms-2 {
437
439
  margin-inline-start: calc(var(--spacing) * 2);
438
440
  }
@@ -442,9 +444,6 @@
442
444
  .ms-px {
443
445
  margin-inline-start: 1px;
444
446
  }
445
- .-me-\(--fd-sidebar-width\) {
446
- margin-inline-end: calc(var(--fd-sidebar-width) * -1);
447
- }
448
447
  .-me-1\.5 {
449
448
  margin-inline-end: calc(var(--spacing) * -1.5);
450
449
  }
@@ -844,12 +843,18 @@
844
843
  .mt-auto {
845
844
  margin-top: auto;
846
845
  }
846
+ .mt-px {
847
+ margin-top: 1px;
848
+ }
847
849
  .mr-auto {
848
850
  margin-right: auto;
849
851
  }
850
852
  .mb-1 {
851
853
  margin-bottom: calc(var(--spacing) * 1);
852
854
  }
855
+ .mb-1\.5 {
856
+ margin-bottom: calc(var(--spacing) * 1.5);
857
+ }
853
858
  .mb-2 {
854
859
  margin-bottom: calc(var(--spacing) * 2);
855
860
  }
@@ -865,6 +870,22 @@
865
870
  .box-content {
866
871
  box-sizing: content-box;
867
872
  }
873
+ .fd-scroll-container {
874
+ &::-webkit-scrollbar {
875
+ width: 5px;
876
+ height: 5px;
877
+ }
878
+ &::-webkit-scrollbar-thumb {
879
+ border-radius: 5px;
880
+ background: var(--color-fd-border);
881
+ }
882
+ &::-webkit-scrollbar-track {
883
+ background: transparent;
884
+ }
885
+ &::-webkit-scrollbar-corner {
886
+ display: none;
887
+ }
888
+ }
868
889
  .block {
869
890
  display: block;
870
891
  }
@@ -886,18 +907,9 @@
886
907
  .table {
887
908
  display: table;
888
909
  }
889
- .fd-scroll-container {
890
- &::-webkit-scrollbar {
891
- width: 5px;
892
- height: 5px;
893
- }
894
- &::-webkit-scrollbar-thumb {
895
- border-radius: 5px;
896
- background: var(--color-fd-border);
897
- }
898
- &::-webkit-scrollbar-track {
899
- background: transparent;
900
- }
910
+ .\!size-5\.5 {
911
+ width: calc(var(--spacing) * 5.5) !important;
912
+ height: calc(var(--spacing) * 5.5) !important;
901
913
  }
902
914
  .size-3 {
903
915
  width: calc(var(--spacing) * 3);
@@ -930,6 +942,9 @@
930
942
  .h-\(--fd-height\) {
931
943
  height: var(--fd-height);
932
944
  }
945
+ .h-\(--fd-nav-height\) {
946
+ height: var(--fd-nav-height);
947
+ }
933
948
  .h-\(--fd-sidebar-height\) {
934
949
  height: var(--fd-sidebar-height);
935
950
  }
@@ -1079,8 +1094,8 @@
1079
1094
  --tw-translate-x: calc(calc(1/2 * 100%) * -1);
1080
1095
  translate: var(--tw-translate-x) var(--tw-translate-y);
1081
1096
  }
1082
- .translate-x-0 {
1083
- --tw-translate-x: calc(var(--spacing) * 0);
1097
+ .translate-x-2 {
1098
+ --tw-translate-x: calc(var(--spacing) * 2);
1084
1099
  translate: var(--tw-translate-x) var(--tw-translate-y);
1085
1100
  }
1086
1101
  .-translate-y-1\/2 {
@@ -1234,9 +1249,9 @@
1234
1249
  .rounded-xl {
1235
1250
  border-radius: var(--radius-xl);
1236
1251
  }
1237
- .rounded-e-xl {
1238
- border-start-end-radius: var(--radius-xl);
1239
- border-end-end-radius: var(--radius-xl);
1252
+ .rounded-e-2xl {
1253
+ border-start-end-radius: var(--radius-2xl);
1254
+ border-end-end-radius: var(--radius-2xl);
1240
1255
  }
1241
1256
  .border {
1242
1257
  border-style: var(--tw-border-style);
@@ -1410,9 +1425,6 @@
1410
1425
  .p-4 {
1411
1426
  padding: calc(var(--spacing) * 4);
1412
1427
  }
1413
- .p-px {
1414
- padding: 1px;
1415
- }
1416
1428
  .px-\(--fd-layout-offset\) {
1417
1429
  padding-inline: var(--fd-layout-offset);
1418
1430
  }
@@ -1461,6 +1473,9 @@
1461
1473
  .ps-2 {
1462
1474
  padding-inline-start: calc(var(--spacing) * 2);
1463
1475
  }
1476
+ .ps-2\.5 {
1477
+ padding-inline-start: calc(var(--spacing) * 2.5);
1478
+ }
1464
1479
  .ps-3 {
1465
1480
  padding-inline-start: calc(var(--spacing) * 3);
1466
1481
  }
@@ -1485,9 +1500,6 @@
1485
1500
  .pt-0 {
1486
1501
  padding-top: calc(var(--spacing) * 0);
1487
1502
  }
1488
- .pt-1\.5 {
1489
- padding-top: calc(var(--spacing) * 1.5);
1490
- }
1491
1503
  .pt-8 {
1492
1504
  padding-top: calc(var(--spacing) * 8);
1493
1505
  }
@@ -1500,9 +1512,6 @@
1500
1512
  .pb-2 {
1501
1513
  padding-bottom: calc(var(--spacing) * 2);
1502
1514
  }
1503
- .pb-4 {
1504
- padding-bottom: calc(var(--spacing) * 4);
1505
- }
1506
1515
  .pb-6 {
1507
1516
  padding-bottom: calc(var(--spacing) * 6);
1508
1517
  }
@@ -1705,9 +1714,6 @@
1705
1714
  .\[--fd-nav-height\:56px\] {
1706
1715
  --fd-nav-height: 56px;
1707
1716
  }
1708
- .\[--fd-nav-height\:calc\(var\(--spacing\)\*14\)\] {
1709
- --fd-nav-height: calc(var(--spacing) * 14);
1710
- }
1711
1717
  .\[--fd-tocnav-height\:36px\] {
1712
1718
  --fd-tocnav-height: 36px;
1713
1719
  }
@@ -1734,6 +1740,11 @@
1734
1740
  display: flex;
1735
1741
  }
1736
1742
  }
1743
+ .\*\:w-\(--fd-sidebar-width\) {
1744
+ :is(& > *) {
1745
+ width: var(--fd-sidebar-width);
1746
+ }
1747
+ }
1737
1748
  .\*\:flex-col {
1738
1749
  :is(& > *) {
1739
1750
  flex-direction: column;
@@ -1908,6 +1919,16 @@
1908
1919
  display: none;
1909
1920
  }
1910
1921
  }
1922
+ .data-\[collapsed\=false\]\:w-\[calc\(var\(--fd-sidebar-width\)\+var\(--fd-layout-offset\)\)\] {
1923
+ &[data-collapsed="false"] {
1924
+ width: calc(var(--fd-sidebar-width) + var(--fd-layout-offset));
1925
+ }
1926
+ }
1927
+ .data-\[collapsed\=true\]\:me-\[calc\(var\(--fd-layout-offset\)-var\(--fd-sidebar-width\)\)\] {
1928
+ &[data-collapsed="true"] {
1929
+ margin-inline-end: calc(var(--fd-layout-offset) - var(--fd-sidebar-width));
1930
+ }
1931
+ }
1911
1932
  .data-\[empty\=true\]\:hidden {
1912
1933
  &[data-empty="true"] {
1913
1934
  display: none;
@@ -1958,11 +1979,6 @@
1958
1979
  animation: var(--animate-fd-dialog-out);
1959
1980
  }
1960
1981
  }
1961
- .data-\[state\=closed\]\:animate-fd-exitToLeft {
1962
- &[data-state="closed"] {
1963
- animation: var(--animate-fd-exitToLeft);
1964
- }
1965
- }
1966
1982
  .data-\[state\=closed\]\:animate-fd-fade-out {
1967
1983
  &[data-state="closed"] {
1968
1984
  animation: var(--animate-fd-fade-out);
@@ -1978,11 +1994,21 @@
1978
1994
  animation: var(--animate-fd-popover-out);
1979
1995
  }
1980
1996
  }
1997
+ .data-\[state\=closed\]\:animate-fd-sidebar-out {
1998
+ &[data-state="closed"] {
1999
+ animation: var(--animate-fd-sidebar-out);
2000
+ }
2001
+ }
1981
2002
  .data-\[state\=hidden\]\:animate-fd-fade-out {
1982
2003
  &[data-state="hidden"] {
1983
2004
  animation: var(--animate-fd-fade-out);
1984
2005
  }
1985
2006
  }
2007
+ .data-\[state\=inactive\]\:hidden {
2008
+ &[data-state="inactive"] {
2009
+ display: none;
2010
+ }
2011
+ }
1986
2012
  .data-\[state\=open\]\:animate-fd-accordion-down {
1987
2013
  &[data-state="open"] {
1988
2014
  animation: var(--animate-fd-accordion-down);
@@ -1998,11 +2024,6 @@
1998
2024
  animation: var(--animate-fd-dialog-in);
1999
2025
  }
2000
2026
  }
2001
- .data-\[state\=open\]\:animate-fd-enterFromLeft {
2002
- &[data-state="open"] {
2003
- animation: var(--animate-fd-enterFromLeft);
2004
- }
2005
- }
2006
2027
  .data-\[state\=open\]\:animate-fd-fade-in {
2007
2028
  &[data-state="open"] {
2008
2029
  animation: var(--animate-fd-fade-in);
@@ -2018,6 +2039,11 @@
2018
2039
  animation: var(--animate-fd-popover-in);
2019
2040
  }
2020
2041
  }
2042
+ .data-\[state\=open\]\:animate-fd-sidebar-in {
2043
+ &[data-state="open"] {
2044
+ animation: var(--animate-fd-sidebar-in);
2045
+ }
2046
+ }
2021
2047
  .data-\[state\=open\]\:bg-fd-accent\/50 {
2022
2048
  &[data-state="open"] {
2023
2049
  background-color: color-mix(in srgb, hsl(0, 0%, 90.1%) 50%, transparent);
@@ -2146,11 +2172,6 @@
2146
2172
  padding-block: calc(var(--spacing) * 1.5);
2147
2173
  }
2148
2174
  }
2149
- .md\:ps-\(--fd-layout-offset\) {
2150
- @media (width >= 48rem) {
2151
- padding-inline-start: var(--fd-layout-offset);
2152
- }
2153
- }
2154
2175
  .md\:pt-12 {
2155
2176
  @media (width >= 48rem) {
2156
2177
  padding-top: calc(var(--spacing) * 12);
@@ -2173,6 +2194,11 @@
2173
2194
  --fd-nav-height: 0px;
2174
2195
  }
2175
2196
  }
2197
+ .md\:\[--fd-nav-height\:64px\] {
2198
+ @media (width >= 48rem) {
2199
+ --fd-nav-height: 64px;
2200
+ }
2201
+ }
2176
2202
  .md\:\[--fd-sidebar-width\:268px\] {
2177
2203
  @media (width >= 48rem) {
2178
2204
  --fd-sidebar-width: 268px;
@@ -2224,9 +2250,9 @@
2224
2250
  border-width: 1px;
2225
2251
  }
2226
2252
  }
2227
- .lg\:\[--fd-nav-height\:calc\(var\(--spacing\)\*24\)\] {
2253
+ .lg\:\[--fd-nav-height\:104px\] {
2228
2254
  @media (width >= 64rem) {
2229
- --fd-nav-height: calc(var(--spacing) * 24);
2255
+ --fd-nav-height: 104px;
2230
2256
  }
2231
2257
  }
2232
2258
  .lg\:\[--fd-padding\:1rem\] {
@@ -2851,6 +2877,16 @@
2851
2877
  transform: translateX(-200px);
2852
2878
  }
2853
2879
  }
2880
+ @keyframes fd-sidebar-in {
2881
+ from {
2882
+ transform: translateX(-100%);
2883
+ }
2884
+ }
2885
+ @keyframes fd-sidebar-out {
2886
+ to {
2887
+ transform: translateX(-100%);
2888
+ }
2889
+ }
2854
2890
  @keyframes fd-nav-menu-in {
2855
2891
  from {
2856
2892
  opacity: 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fumadocs-ui",
3
- "version": "15.3.3",
3
+ "version": "15.4.0",
4
4
  "description": "The framework for building a documentation website in Next.js",
5
5
  "keywords": [
6
6
  "NextJs",
@@ -72,16 +72,16 @@
72
72
  "css/*"
73
73
  ],
74
74
  "dependencies": {
75
- "@radix-ui/react-accordion": "^1.2.10",
76
- "@radix-ui/react-collapsible": "^1.1.10",
77
- "@radix-ui/react-dialog": "^1.1.13",
75
+ "@radix-ui/react-accordion": "^1.2.11",
76
+ "@radix-ui/react-collapsible": "^1.1.11",
77
+ "@radix-ui/react-dialog": "^1.1.14",
78
78
  "@radix-ui/react-direction": "^1.1.1",
79
- "@radix-ui/react-navigation-menu": "^1.2.12",
80
- "@radix-ui/react-popover": "^1.1.13",
79
+ "@radix-ui/react-navigation-menu": "^1.2.13",
80
+ "@radix-ui/react-popover": "^1.1.14",
81
81
  "@radix-ui/react-presence": "^1.1.4",
82
- "@radix-ui/react-scroll-area": "^1.2.8",
83
- "@radix-ui/react-slot": "^1.2.2",
84
- "@radix-ui/react-tabs": "^1.1.11",
82
+ "@radix-ui/react-scroll-area": "^1.2.9",
83
+ "@radix-ui/react-slot": "^1.2.3",
84
+ "@radix-ui/react-tabs": "^1.1.12",
85
85
  "class-variance-authority": "^0.7.1",
86
86
  "lodash.merge": "^4.6.2",
87
87
  "next-themes": "^0.4.6",
@@ -89,20 +89,20 @@
89
89
  "react-medium-image-zoom": "^5.2.14",
90
90
  "react-remove-scroll": "^2.6.3",
91
91
  "tailwind-merge": "^3.3.0",
92
- "fumadocs-core": "15.3.3"
92
+ "fumadocs-core": "15.4.0"
93
93
  },
94
94
  "devDependencies": {
95
95
  "@next/eslint-plugin-next": "^15.3.2",
96
96
  "@tailwindcss/cli": "^4.1.7",
97
97
  "@types/lodash.merge": "^4.6.9",
98
- "@types/react": "^19.1.4",
98
+ "@types/react": "^19.1.5",
99
99
  "@types/react-dom": "^19.1.5",
100
100
  "next": "15.3.2",
101
101
  "tailwindcss": "^4.1.7",
102
102
  "tsc-alias": "^1.8.16",
103
- "@fumadocs/cli": "0.1.1",
103
+ "@fumadocs/cli": "0.2.0",
104
104
  "eslint-config-custom": "0.0.0",
105
- "fumadocs-core": "15.3.3",
105
+ "fumadocs-core": "15.4.0",
106
106
  "tsconfig": "0.0.0"
107
107
  },
108
108
  "peerDependencies": {